Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

problemas con Find

Estas en el tema de problemas con Find en el foro de Visual Basic clásico en Foros del Web. Tengo el siguiente codigo: Código: busqueda = Trim$(doc.Text) With Adodc2.Recordset .MoveFirst .Find "DNI LIKE '" + busqueda + "'" .Find "Cod_Carrera LIKE '" + cod.Caption ...
  #1 (permalink)  
Antiguo 01/11/2008, 04:58
 
Fecha de Ingreso: mayo-2008
Mensajes: 47
Antigüedad: 16 años
Puntos: 0
problemas con Find

Tengo el siguiente codigo:

Código:
busqueda = Trim$(doc.Text)

With Adodc2.Recordset
    .MoveFirst
    .Find "DNI LIKE '" + busqueda + "'"
    .Find "Cod_Carrera LIKE '" + cod.Caption + "'"
    .Find "Año_Inscripcion LIKE #Year(Date)#"

    If .EOF Then
        txtsql = "INSERT INTO Alumnos_Carreras (DNI,Cod_Carrera,Año_Inscripcion) " _
               & " VALUES ('" & doc.Text & "', '" & cod.Caption & "', #" & Date & "#) "
        con.Execute (txtsql)
    Else
        MsgBox "Ya esta Inscripto"
    txtsql = "UPDATE Alumnos_Carreras SET"
    End If
End With

Adodc2.Refresh
Bien, yo en un formulario de visual traigo desde otras tablas algunos datos como el DNI, Nombre, Apellido, Codigo de Carrera y le digo (con el codigo que puse arriba) que grabe en otra tabla los datos DNI, Codigo de carrera, y el año pero que primero se fije (haga una busqueda) en esta nueva tabla para que no grabe dos registros iguales. El problema me lo tira en el tercer Find evidentemente hay algo mal con las fechas, pero no se que, para que grabe la fecha le digo que tome la del sistema y en le Find quiero que compare el año.
Espero haber sido claro.

Saludos y gracias.
  #2 (permalink)  
Antiguo 01/11/2008, 09:31
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: problemas con Find

Cita:
Iniciado por okan Ver Mensaje
Tengo el siguiente codigo:

....

Bien, yo en un formulario de visual traigo desde otras tablas algunos datos como el DNI, Nombre, Apellido, Codigo de Carrera y le digo (con el codigo que puse arriba) que grabe en otra tabla los datos DNI, Codigo de carrera, y el año pero que primero se fije (haga una busqueda) en esta nueva tabla para que no grabe dos registros iguales. El problema me lo tira en el tercer Find evidentemente hay algo mal con las fechas, pero no se que, para que grabe la fecha le digo que tome la del sistema y en le Find quiero que compare el año.
Espero haber sido claro.
Bueno, según ese código estás llamando tres veces al método Find y éste no es concatenable, quiero decir que únicamente se activaría el tercero.

Yo lo haría de otra forma: Creando un recordset con la condición de los tres campos, si existen los tres devolverá un registro y so no existen no devolverá ninguno, por ahí lo puedes controlar.

Código:
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    With rs
        .ActiveConnection = [TuCadenaDeConexion] ' la misma de Adodc2 
        .CursorType = adOpenStatic
        .CursorLocation = adUseClient
        .Open "SELECT * FROM LaTabla WHERE DNI = '" & busqueda & "' AND Cod_Carrera = '" & cod.Caption & "' And [Año_inscipcion] = " & Year(Date)
    End With
    If rs.RecordCount > 0 Then
        ' ya existe un registro con los tres datos buscados
        MsgBox "Ya está inscrito"
        ' instruccion/es
    Else
    '.. aquí el INSERT INTO
    
    End If
Nota: El campo Año_inscripcion lo debes encerrar entre corchetes [] ya que la eñe para el lenguaje sql es un carácter extraño.

  #3 (permalink)  
Antiguo 01/11/2008, 13:57
 
Fecha de Ingreso: mayo-2008
Mensajes: 47
Antigüedad: 16 años
Puntos: 0
Respuesta: problemas con Find

Primero gracias Avellaneda por responderme. Si al ver tu codigo me di cuenta que era mas sencillo hacer el selec en lugar del find, ahora el probleba que me tira es con el activeConnection, no me reconoce el origen de los datos y el controlador. Uso DSN como conexion, el codigo me quedo asi:

Código:
Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    With rs
        .ActiveConnection = "DSN = escuela"  ' aca tira el error
        .CursorType = adOpenStatic
        .CursorLocation = adUseClient
        .Open "SELECT * FROM LaTabla WHERE DNI = '" & doc.Text & "' AND Cod_Carrera = '" & cod.Caption & "' And Fecha_inscipcion = " & Year(Date)
    End With
    If rs.RecordCount > 0 Then
        MsgBox "Ya está inscrito"
    Else
    txtsql = "INSERT INTO Alumnos_Carreras (DNI,Cod_Carrera,Fecha_Inscripcion) " _
               & " VALUES ('" & doc.Text & "', '" & cod.Caption & "', #" & Date & "#) "
        con.Execute (txtsql)
    End If
Le cambie el nombre al campo Año_Inscripcion por Fecha_Inscripcion.
  #4 (permalink)  
Antiguo 02/11/2008, 03:52
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: problemas con Find

Cita:
Iniciado por okan Ver Mensaje
Primero gracias Avellaneda por responderme. Si al ver tu codigo me di cuenta que era mas sencillo hacer el selec en lugar del find, ahora el probleba que me tira es con el activeConnection, no me reconoce el origen de los datos y el controlador. Uso DSN como conexion, el codigo me quedo asi:

.ActiveConnection = "DSN = escuela" ' aca tira el error

Le cambie el nombre al campo Año_Inscripcion por Fecha_Inscripcion.
Hola okan, mira no te aconsejo hacer la conexión a traves de un DSN, al instalar el programa en otra máquina, vas a tener problemas.

Puedes conectar directamente el recordset a la base de datos así:

.ActiveConnection = "Provider=Microsoft.jet.OLEDB.4.0;Data Source=" & App.Path & "\LaBD.mdb"

En este caso suponemos que la BD se encuentra en el mismo directorio de la aplicación, si no es así, pon la ruta completa.

  #5 (permalink)  
Antiguo 02/11/2008, 17:13
 
Fecha de Ingreso: mayo-2008
Mensajes: 47
Antigüedad: 16 años
Puntos: 0
Respuesta: problemas con Find

okey solucionado el tema de la conexion pero sigo sin poder lograr que no grabe un registro si ya existe uno igual en la tabla. Es decir yo quiero que antes de grabar se fije si no se repite el registro, pero me lo graba igual y me quedan dos registros iguales. La tabla tiene cuatro campos (matricula, dni,codigo y fecha) la matricula es autonumerica. La matricula nunca será igual pero puede haber mismos dni, codigos y distintos años y asi mas combinaciones. El problema es que el recordcount nunca encuentra todo igual, por eso sigue adelante y graba de nuevo un registro identico al existente.

Código:
Private Sub grabar_Click()

busqueda = Trim$(doc.Text)
Set rs = New ADODB.Recordset
    With rs
        .ActiveConnection = "Provider=Microsoft.jet.OLEDB.4.0;Data Source=" & App.Path & "\Escuela.mdb"
        .CursorType = adOpenStatic
        .CursorLocation = adUseClient
        .Open "SELECT DNI,Cod_Carrera,Fecha_Inscripcion FROM Alumnos_Carreras WHERE DNI = '" & busqueda & "' " _
                 & "AND Cod_Carrera = '" & cod.Caption & "' " _
                 & "AND Fecha_Inscripcion = " & Year(Date)
    End With
    If rs.RecordCount > 0 Then
         MsgBox "Ya está inscripto"
    Else
         txtsql = "INSERT INTO Alumnos_Carreras (DNI,Cod_Carrera,Fecha_Inscripcion) " _
               & " VALUES ('" & doc.Text & "', '" & cod.Caption & "', #" & Date & "#) "
        con.Execute (txtsql)
        txtsql = "UPDATE Alumnos_Carreras SET"
    End If
Adodc2.Refresh
End Sub
  #6 (permalink)  
Antiguo 02/11/2008, 17:50
 
Fecha de Ingreso: enero-2008
Ubicación: Lima - Perú
Mensajes: 1.127
Antigüedad: 16 años, 3 meses
Puntos: 10
Respuesta: problemas con Find

Cita:
Iniciado por okan Ver Mensaje
La matricula nunca será igual pero puede haber mismos dni, codigos y distintos años y asi mas combinaciones. El problema es que el recordcount nunca encuentra todo igual, por eso sigue adelante y graba de nuevo un registro identico al existente.
Tio si dices que pueden haber mismos dni, codigos y distintos años entonces por que compruebas estos campos sin nunca seran unicos y siempre habran de repetirse???
Debes comprobar con el campo matricula que me parece seria la clave primaria
y a que te refieres con que se graban campos iguales, si dices que el campo matricula es autonumerico, es decir el campo matricula nunca se repetira por lo tanto nunca habra una fila identica a otra
  #7 (permalink)  
Antiguo 03/11/2008, 02:27
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: problemas con Find

Cita:
Iniciado por okan Ver Mensaje
okey solucionado el tema de la conexion pero sigo sin poder lograr que no grabe un registro si ya existe uno igual en la tabla. Es decir yo quiero que antes de grabar se fije si no se repite el registro, pero me lo graba igual y me quedan dos registros iguales. La tabla tiene cuatro campos (matricula, dni,codigo y fecha) la matricula es autonumerica. La matricula nunca será igual pero puede haber mismos dni, codigos y distintos años y asi mas combinaciones. El problema es que el recordcount nunca encuentra todo igual, por eso sigue adelante y graba de nuevo un registro identico al existente.
Mete la consulta SELECT en una variable String y comprueba en el debug los datos, que cada uno coincida con lo grabado en los campos de la tabla .
La consulta tal y como está, no contiene error alguno.

  #8 (permalink)  
Antiguo 03/11/2008, 17:28
 
Fecha de Ingreso: mayo-2008
Mensajes: 47
Antigüedad: 16 años
Puntos: 0
Respuesta: problemas con Find

Bueno he logrado solucionar el problema. Muchas gracias Avellaneda por la ayuda. Finalmente he tenido que crear un campo nuevo en la tabla y guardar alli los demas registros concatenados y realizar un SELECT sobre es campo para luego meter en un Do While Loop un contador ya que por alguna razon que desconozco no me reconocia el RecordCount. Asi quedo el código SOLUCIONADO.

Código:
Private Sub grabar_Click()
  conc = Trim$(concate.Caption)
  txtsql = "SELECT Alumnos_Carreras.prueba FROM Alumnos_Carreras " _
            & "WHERE prueba = '" & conc & "' "
  Set rs = con.Execute(txtsql)
   conta = 0
Do While Not rs.EOF()
    conta = conta + 1
    rs.MoveNext
    Loop
    If conta > 0 Then
         MsgBox "Ya está Inscripto"
    Else
    If rs.EOF = True Then
         txtsql = "INSERT INTO Alumnos_Carreras (DNI,Cod_Carrera,Fecha_Inscripcion,prueba) " _
               & " VALUES ('" & doc.Text & "', '" & cod.Caption & "', #" & Date & "#, '" & concate.Caption & "') "
        con.Execute (txtsql)
        txtsql = "UPDATE Alumnos_Carreras SET"
    End If
    End If
Adodc2.Refresh
End Sub
Muchas Gracias por la ayuda.

Okan
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:33.