Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: ka0s en 23 Agosto 2009, 02:55 am



Título: Duda Visual Basic + Access
Publicado por: ka0s en 23 Agosto 2009, 02:55 am
Buenas gente:
Los molesto por lo siguiente. Estoy haciendo un login en VB y quiero que cuando ingrese un usuario y contraseña (que ya estan almacenadas en la base de datos creada en access) me lleve a otro formulario.

Por ahora lo único que tengo es la conexión a la base, pero lo que no tengo ni la más palida idea, es como hacer el IF que diga que si es igual al ID y al PASSWORD entonces muestre el otro formulario.

Código:
Private Sub Form_Load()
Dim cnn As ADODB.Connection
Dim sql As String
Dim rs As ADODB.Recordset
Dim ubicacion_base As String
' Crear la conexión
Set cnn = CreateObject("adodb.connection")
cnn.Errors.Clear
cnn.CursorLocation = adUseClient
ubicacion_base = App.Path & "\bdgym.mdb"
cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ubicacion_base & ";Persist Security Info=False"
cnn.Open ' abre la conexión
sql = "select * from usuarios"
Set rs = New ADODB.Recordset 'genera la conexion
rs.Open sql, cnn 'accede a la bd

Les dejo el código que tengo y espero que me peudan dar una mano.

Saludos!


Título: Re: Duda Visual Basic + Access
Publicado por: MCKSys Argentina en 23 Agosto 2009, 03:01 am
Hola!

Quizas lo que te convenga es usar la consulta que haces para averiguar si el usuario y la contraseña son válidos.

Por ej:

SELECT * FROM USUARIOS WHERE ((USUARIO = 'PEPE') AND (CLAVE = '123456'))

De esta forma, haces que el motor de bases de datos resuelva el tema por ti. Si devuelve algo, es porque el usuario y la clave existen.

Los dos valores (usuario y clave) son los que ingresa el usuario que quiere ingresar.

Saludos!




Título: Re: Duda Visual Basic + Access
Publicado por: seba123neo en 23 Agosto 2009, 03:11 am
Buenas gente:
Los molesto por lo siguiente. Estoy haciendo un login en VB y quiero que cuando ingrese un usuario y contraseña (que ya estan almacenadas en la base de datos creada en access) me lleve a otro formulario.

Por ahora lo único que tengo es la conexión a la base, pero lo que no tengo ni la más palida idea, es como hacer el IF que diga que si es igual al ID y al PASSWORD entonces muestre el otro formulario.

Código:
Private Sub Form_Load()
Dim cnn As ADODB.Connection
Dim sql As String
Dim rs As ADODB.Recordset
Dim ubicacion_base As String
' Crear la conexión
Set cnn = CreateObject("adodb.connection")
cnn.Errors.Clear
cnn.CursorLocation = adUseClient
ubicacion_base = App.Path & "\bdgym.mdb"
cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ubicacion_base & ";Persist Security Info=False"
cnn.Open ' abre la conexión
sql = "select * from usuarios"
Set rs = New ADODB.Recordset 'genera la conexion
rs.Open sql, cnn 'accede a la bd

Les dejo el código que tengo y espero que me peudan dar una mano.

Saludos!

por favor cambia ese codigo, no podes estar creando la conexion con un objeto asi, saca el CreateObject ese...si ya la tenes declarada a la conexion...no es recomendable declarar la conexion en el load del formulario , usa un modulo y ponelo en el Main...busca por ahi codigos de ADO y fijate como lo hacen asi lo adaptas.y es muy basica la pregunta diria yo , aparte hace no muhcos post atras ya preguntaron lo mismo y se resolvio el tema...buscalo.

saludos.


Título: Re: Duda Visual Basic + Access
Publicado por: ka0s en 23 Agosto 2009, 03:24 am
Oks, ahora voy a tratar de modificarlo y buscar lo que me dijiste.
Recién estoy empezando en esto de base de datos. Busqué muchas guías pero ninguna que encontré me servía.

Voy a buscar lo que me dijiste,
cualquier cosa que sea útil diganmela por favor.

Muchas gracias!


Título: Re: Duda Visual Basic + Access
Publicado por: ka0s en 23 Agosto 2009, 05:26 am
La verdad seba123neo que no encontré cual era el que me dijiste.
Si me pudieras orientar o decirme que parte del código modificar sería útil.

Como asi también algun manual donde explique de 0 el manejo de base de datos ADO, pasandole consultas SQL sencillas como para lo que quiero hacer. Un LOGIN.

Desde ya muchas gracias

Saludos!


Título: Re: Duda Visual Basic + Access
Publicado por: SRVAM en 23 Agosto 2009, 12:26 pm
hola ka0s, mira, lo que seba te dice es que para abrir la base de datos, uses un modulo.bas y ahi te creas una funcion donde abres la base de datos.
luego en el form load o en el initialize haces la llamada a esa funcion, cuando introduzcas los datos de nomrbe de usuario y contraseña, haces un findfirst al nombre de usuario y si lo encuentra compruebas la contraseña, si la condicion es verdadera entonces cierras el formulario de login y haces un formx.show del formulario que quieras abrir ahora

saludos


Título: Re: Duda Visual Basic + Access
Publicado por: jack06 en 23 Agosto 2009, 12:34 pm
http://www.megaupload.com/?d=9QSOU62Y


Título: Re: Duda Visual Basic + Access
Publicado por: cassiani en 23 Agosto 2009, 13:34 pm
La verdad seba123neo que no encontré cual era el que me dijiste.
Si me pudieras orientar o decirme que parte del código modificar sería útil.

Como asi también algun manual donde explique de 0 el manejo de base de datos ADO, pasandole consultas SQL sencillas como para lo que quiero hacer. Un LOGIN.

Desde ya muchas gracias

Saludos!

y donde buscaste? acá han consultado eso cantidades de veces...
Citar
*http://www.elguille.info/vb/ejemplos/ADO_sin_datacontrol.htm

Citar
*http://foro.elhacker.net/programacion_vb/condicional_para_elegir_formulario_con_bd-t263791.0.html;msg1286482#msg1286482


Título: Re: Duda Visual Basic + Access
Publicado por: ka0s en 23 Agosto 2009, 17:14 pm
cΔssiΔnі si digo que busqué, busqué.... Encontré varios del Guille y de recursosvisualbasic pero no los entendía o no salía lo que quería hacer.

Jack06, muchas gracias!!
Era algo asi lo que buscaba.

Mil gracias a todos

Saludos!


Título: Re: Duda Visual Basic + Access
Publicado por: ka0s en 24 Agosto 2009, 17:25 pm
Buenas...
Vuelvo a molestar de nuevo por acá para no abrir un tema nuevo, ya que tiene que ver con lo mismo. VB y ACCESS.

Mi problema ahora es que ya pude hacer el login, pero quiero que cuando pase ese login, me lleve a otro form y en una grilla mostrar los valores que figuren en la tabla creada en ACCESS.

Tengo 2 formularios. FRMLOGIN y FORM1 (donde se encuentra la grilla)
Un módulo: Donde genero la conexión.

Pongo los sources para que me indiquen por favor que es lo que hago mal, ya que lo que pongo O ESTA MAL y me dice algo asi como que se requiere un objeto, o que esta abierto, o que esta cerrado, como también arroja a veces un ERROR donde dice que la memoria no se puede "read" y se muere mi VB.


MODULO
Código
  1. Public CN As ADODB.Connection 'Variable para la conexion a la BDD
  2.  
  3. Sub Conectar()
  4.    Dim RST As New ADODB.Recordset
  5.    Set CN = New ADODB.Connection
  6.    Set RST = New ADODB.Recordset
  7.  
  8.    With CN
  9.        .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
  10.                            App.Path & "\bdgym.mdb" & ";Persist Security Info=False"
  11.        .CursorLocation = adUseClient
  12.        .Open
  13.    End With
  14. End Sub

FRMLOGIN
Código
  1. Dim RST As New ADODB.Recordset '\\ -- Variable de Tipo Recordset.
  2.  
  3. Private Sub cmdborrar_Click()
  4. txtusuario.Text = ""
  5. txtpassword.Text = ""
  6. End Sub
  7.  
  8. Private Sub cmdlogin_Click()
  9. '-------------LOGIN DE USUARIO-------------
  10. 'Busca en la tabla si existe el usuario.
  11. RST.Find "id ='" & Trim(txtusuario.Text) & "'"
  12. 'Si no existe
  13. If RST.EOF Then
  14.    MsgBox "No existe el usuario indicado", vbExclamation, "ERROR"
  15. Else
  16. 'Si existe, verifica los passwords y si es correcto nos lleva al formulario Principal
  17.    If RST!Password = Trim(txtpassword.Text) Then
  18.        Unload frmlogin
  19.        Load Form1
  20.        Form1.Show
  21.    Else
  22.        'Sino, muestra mensaje de error
  23.        MsgBox "Clave incorrecta", vbExclamation, "ERROR"
  24.    End If
  25. End If
  26. End Sub
  27.  
  28. Private Sub Form_Load()
  29. Call GeneraConexion
  30.  
  31. End Sub
  32.  
  33. Sub GeneraConexion()
  34.    Set RST = New Recordset
  35.    Call Conectar
  36.    RST.CursorLocation = adUseClient
  37.    RST.Open ("SELECT * FROM Usuarios ORDER BY id"), CN, adOpenKeyset, adLockOptimistic
  38. End Sub
  39.  
  40.  

FORM1
Código
  1. Private Sub reload()
  2. Set rst = New ADODB.Recordset
  3. rst.Open sql, CN
  4. Set grilla.Recordset = rs
  5. grilla.Refresh
  6. End Sub
  7.  
  8. Private Sub Form_Load()
  9. sql = "select * from socios order by id"
  10. Call reload
  11. End Sub

Tengo ya creadas las 2 tablas en access, como dije el login lo pasa perfectamente.
Pero después no me muestra en la grilla la tabla SOCIOS.

Muchas gracias!

PD: Dejo una imágen del mensaje de error que hace que muera el VB

(http://img2.imageshack.us/img2/1236/erroruti.png)

Ahora si, Saludos!


Título: Re: Duda Visual Basic + Access
Publicado por: jack06 en 24 Agosto 2009, 19:43 pm
a uhmm por lo visto creo k estas cometiendo dos posibles problemas

1.- Si te fijas que en el modulo estas poniendo la conexion a la BDD, eh en el form1 no lo estas llamando, entonces el el form load ponle Call Conectar.

2.- Y si te fijas en ese Sub Reload estas declarando una nueva conexion y fijate k stas poniendo RST y fijate que tu estas poniendo asi Set grilla.Recordset = rs, te comistes la t  :xD

FORM1
Código
  1. Private Sub reload()
  2. Set rst = New ADODB.Recordset
  3. rst.Open sql, CN
  4. Set grilla.Recordset = rst '<----------Te falto la T
  5. grilla.Refresh
  6. End Sub
  7.  
  8. Private Sub Form_Load()
  9. Call Conectar '<--------- Te Falto esa
  10. sql = "select * from socios order by id"
  11. Call reload
  12. End Sub

weno creo que esos dos era el problema cualkier cosa avisa Salu2  :¬¬


Título: Re: Duda Visual Basic + Access
Publicado por: cassiani en 24 Agosto 2009, 19:46 pm
ah bueno, lo que pasa por no hacer uso del "option explicit" ...... pero ellos creen que es broma xDD


Título: Re: Duda Visual Basic + Access
Publicado por: ka0s en 24 Agosto 2009, 21:39 pm
a uhmm por lo visto creo k estas cometiendo dos posibles problemas

1.- Si te fijas que en el modulo estas poniendo la conexion a la BDD, eh en el form1 no lo estas llamando, entonces el el form load ponle Call Conectar.

2.- Y si te fijas en ese Sub Reload estas declarando una nueva conexion y fijate k stas poniendo RST y fijate que tu estas poniendo asi Set grilla.Recordset = rs, te comistes la t  :xD

FORM1
Código
  1. Private Sub reload()
  2. Set rst = New ADODB.Recordset
  3. rst.Open sql, CN
  4. Set grilla.Recordset = rst '<----------Te falto la T
  5. grilla.Refresh
  6. End Sub
  7.  
  8. Private Sub Form_Load()
  9. Call Conectar '<--------- Te Falto esa
  10. sql = "select * from socios order by id"
  11. Call reload
  12. End Sub

weno creo que esos dos era el problema cualkier cosa avisa Salu2  :¬¬


Es verdad, no me di cuenta de eso.
Arreglé como me dijiste pero seguía teniendo problemas.
El error que arrojaba ahora es:

"Runtime error '3001': Argumentos incorrectos, fuera del intervalo permitido o en conflicto con otros"

Le dí depurar y la línea que marcaba con error es la siguiente:

Código
  1. Private Sub reload()
  2. Set RST = New ADODB.Recordset
  3. RST.Open sql, CN 'ESTA LINEA ARROJABA EL ERROR!!
  4. Set grilla.Recordset = RST
  5. grilla.Refresh
  6. End Sub
  7.  
  8. Private Sub Form_Load()
  9. Call Conectar
  10. sql = "Select * from socios order by id"
  11. Call reload
  12. End Sub
  13.  
y lo que hice fue borrar la variable SQL del form_load y poner el comando directamente, y ahí si funciono y cargó la grilla completamente, así:

Código
  1. Private Sub reload()
  2. Set RST = New ADODB.Recordset
  3. RST.Open "select * from socios order by id", CN '-->LO MODIFIQUE DIRECTAMENTE
  4. Set grilla.Recordset = RST '
  5. grilla.Refresh
  6. End Sub
  7.  
  8. Private Sub Form_Load()
  9. Call Conectar
  10. 'ACA ESTABA LA VARIABLE Y LA QUITÉ!
  11. Call reload
  12. End Sub
  13.  
  14.  


Alguien sabe porque era ese error ya que estamos?

Desde ya muchas gracias a todos por la ayuda, me lo solucionaron perfectamente!

Saludos!


Título: Re: Duda Visual Basic + Access
Publicado por: cassiani en 24 Agosto 2009, 22:32 pm
declaraste "sql" en algun lado? es una variable local o global? insisto con lo del option explicit, nunca le estas pasando parámetros a tu rutina.

lo puedes pasar como parametro:
Citar
Private Sub Form_Load()
Call Conectar
sql = "Select * from socios order by id"
Call reload(sql) <--
End Sub

Private Sub reload(Byval sql as string) <--
Set RST = New ADODB.Recordset
RST.Open sql, CN
Set grilla.Recordset = RST '
grilla.Refresh
End Sub

o declarandolo como global dentro del formulario
Citar
dim sql as string <--
Private Sub Form_Load()
Call Conectar
sql = "Select * from socios order by id"
Call reload()
End Sub

Private Sub reload()
Set RST = New ADODB.Recordset
RST.Open sql, CN
Set grilla.Recordset = RST '
grilla.Refresh
End Sub

saludos!!


Título: Re: Duda Visual Basic + Access
Publicado por: ka0s en 24 Agosto 2009, 23:23 pm
Ahora sí, no molesto más por ahora.
Muchas gracias cΔssiΔnі !!


Título: Re: Duda Visual Basic + Access
Publicado por: ka0s en 26 Agosto 2009, 20:42 pm
Gente sigo escribiendo en este post para no abrir otros al pedo.
Mi duda es la siguiente:
Tengo en la grilla ya cargada varios datos, y cuando marco un campo de la grilla o sea seleccionarlo y después ir al BOTON BORRAR, lo que se me borra a mi es el REGISTRO QUE ESTA ARRIBA DE TODO y no el que seleccione.

¿Porque puede ser esto?

Les muestro el source:

Código
  1. Private Sub grilla_Click()
  2. 'Si la grilla esta vacia
  3. If RST.EOF = True Then
  4. 'Muestra mensaje
  5.    MsgBox "La grilla está vacia", vbInformation, "Información"
  6. Else
  7. 'Sino, Almacena el valor del registro
  8. borrarregistro = RST!Id
  9. End If
  10. End Sub

Y acá pongo el BOTON BORRAR:

Código
  1. Private Sub cmdborrar_Click()
  2. 'Borra el registro seleccionado
  3. cn.Execute ("DELETE FROM socios where id= ") & borrarregistro, cn
  4. 'Llama a la función LOAD para que cargue la grilla nuevamente.
  5. 'Por lo tanto SE ACTUALIZA.
  6. Call Form_Load
  7. End Sub

O sea supuestamente el código está bien, pero PROBÉ PONIENDO
msgbox rst!id cuando clickeaba y lo que me figuraba siempre era el VALOR DE ID DEL PRIMERO DE TODOS de la grilla Y NO EL QUE MARCABA  :-\

Espero que me hayan entendido, sino trato de ser más claro.

Muchas gracias!


Título: Re: Duda Visual Basic + Access
Publicado por: ssccaann43 © en 26 Agosto 2009, 22:04 pm
Código
  1. Private Sub cmdborrar_Click()'Borra el registro seleccionado
  2. <->cn.Execute ("DELETE FROM socios where id= ") & borrarregistro, cn
  3. 'Llama a la funcion LOAD para que cargue la grilla nuevamente.
  4. 'Por lo tanto SE ACTUALIZA.
  5. Call Form_Load
  6. End Sub
  7.  

Coloca un punto de Interrupción allí <-> y verifica que valor tiene borrarregistro.

Por otro lado, te recomiendo que en vez de borrarregistro, indiques el index donde te encuentras posicionado en la grilla.

Por ejemplo usando un listview sería. ListView1.SelectedItem.Text


Título: Re: Duda Visual Basic + Access
Publicado por: MCKSys Argentina en 26 Agosto 2009, 22:09 pm
Código
  1. Private Sub cmdborrar_Click()'Borra el registro seleccionado
  2. <->cn.Execute ("DELETE FROM socios where id= ") & borrarregistro, cn
  3. 'Llama a la funcion LOAD para que cargue la grilla nuevamente.
  4. 'Por lo tanto SE ACTUALIZA.
  5. Call Form_Load
  6. End Sub
  7.  

El error esta en la SQL (falta el "*"). Deberia ser:

cn.Execute ("DELETE * FROM socios where id= ") & borrarregistro, cn

Saludos!


Título: Re: Duda Visual Basic + Access
Publicado por: ssccaann43 © en 26 Agosto 2009, 22:12 pm
Amigo, deberías hacer un cursito de Querys.

La instrucción DELETE no lleva "*", solo si el motor de BD es Access lo permite. Pero no se usa ya que no le dices en el query si deseas eliminar solo unos campos o todo, no tienes la potestad para hacerlo, con esa instrucción eliminas todo el registro. Espero haberme hecho entender. Y no lo tomes a mal, pero leete un manual de BD. Hay Querys que podrían soprenderte.


Título: Re: Duda Visual Basic + Access
Publicado por: MCKSys Argentina en 26 Agosto 2009, 22:19 pm
OK, pero sólo porque tú lo dices...




Título: Re: Duda Visual Basic + Access
Publicado por: ka0s en 27 Agosto 2009, 00:22 am
Código
  1. Private Sub cmdborrar_Click()'Borra el registro seleccionado
  2. <->cn.Execute ("DELETE FROM socios where id= ") & borrarregistro, cn
  3. 'Llama a la funcion LOAD para que cargue la grilla nuevamente.
  4. 'Por lo tanto SE ACTUALIZA.
  5. Call Form_Load
  6. End Sub
  7.  

Coloca un punto de Interrupción allí <-> y verifica que valor tiene borrarregistro.

Por otro lado, te recomiendo que en vez de borrarregistro, indiques el index donde te encuentras posicionado en la grilla.

Por ejemplo usando un listview sería. ListView1.SelectedItem.Text

Traté de hacer esto haciendo GRILLA.OBJECT que es lo que seleccionaría lo que marcás, pero me di cuenta que si selecciono un nombre, o una edad tiraba error. Ya que no pertenece al ID.

O sea cuando marcaba de la tabla un ID, funcionaba perfectamente, pero yo quiero que de la grilla, cuando marques cualquier campo y le des a BORRAR, te borre todo.

Por eso lo estaba haciendo con ID.

:S

Alguna otra opción? Igualmente muchas gracias!


Título: Re: Duda Visual Basic + Access
Publicado por: ssccaann43 © en 27 Agosto 2009, 00:31 am
Pues debes ubicar el ID de lo que seleccionas. y luego de ubicarlo ejecutar la consulta.


Título: Re: Duda Visual Basic + Access
Publicado por: ka0s en 27 Agosto 2009, 04:59 am
Pues debes ubicar el ID de lo que seleccionas. y luego de ubicarlo ejecutar la consulta.

Creo que no me comprendiste. Voy a tratar de ser más claro:

En la grilla, seleccione el CAMPO que seleccione quiero que al darle BORRAR, se borre.

Pero que pasa? Al hacer lo que hice antes RST.OBJECT solamente funciona el codigo del DELETE cuando clickeo en ID.

Pero si clickeo en Nombre, edad, etc... TOMA EL NOMBRE, pero el DELETE no funciona y tira error ya que este funciona solo con ID.

Tendría que haber otra forma.
Yo tenía entendido que creando una variable y poniendo en el evento click de la grilla:

variable = RST!ID

y después en el DELETE usar esa VARIABLE, pero no funcionó como explique más atrás. :(

Espero que haya quedado más claro.
Gracias igualmente ssccaann43


Título: Re: Duda Visual Basic + Access
Publicado por: seba123neo en 27 Agosto 2009, 05:13 am
ovbio, pues tenes que tomar el ID de la columna seleccionada, pero en la columna donde esta el ID del registro...eso de hacer Call Form_Load no es nada bueno, mejor create una funcion que te carge todos los datos en el listview y llamas siempre que quieras actualizar a esa funcion. tambein al listview ponele la propiedad FullRowSelect = True asi te selecciona toda la fila y no el primer item.

saludos.


Título: Re: Duda Visual Basic + Access
Publicado por: ka0s en 27 Agosto 2009, 05:33 am
ovbio, pues tenes que tomar el ID de la columna seleccionada, pero en la columna donde esta el ID del registro...eso de hacer Call Form_Load no es nada bueno, mejor create una funcion que te carge todos los datos en el listview y llamas siempre que quieras actualizar a esa funcion. tambein al listview ponele la propiedad FullRowSelect = True asi te selecciona toda la fila y no el primer item.

saludos.

seba123neo, yo estoy usando MSFLEXGRID.
Igualmente busqué alguna propiedad parecida a lo que vos comentabas y encontré
SelectionMode = FlexSelectionByRow, entonces al poner eso me marca toda la fila
y ahora SI FUNCIONA EL PRIMER CODIGO DE TODO QUE HABÍA PUESTO.

Ya que al marcar toda la fila lo que me toma es el ID. Y quedó solucionado!! :D

Muchas gracias seba, comentando otra cosa, me ayudaste a solucionar esto.
Gracias a los demás igualmente.

Saludos!

PD: Seguiré poniendo las dudas que me sigan surgiendo por acá. Está bien? O empiezo a crear nuevos?


Título: Re: Duda Visual Basic + Access
Publicado por: ssccaann43 © en 27 Agosto 2009, 15:44 pm
Eso depende de la duda. Y si te explicaste bien, quien no comprendió fuiste tú. De igual manera estamos a la orden. Pero si te surge una duda nueva, has un nuevo post.