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

Buscar Mediante dos Tablas

Estas en el tema de Buscar Mediante dos Tablas en el foro de Visual Basic clásico en Foros del Web. Hola que Tal, tengo vb 6.0 y access 2003, mi pregunta es si alguien sabe alguna sentencia para hacer busqueda por dos tablas lo que ...
  #1 (permalink)  
Antiguo 10/11/2008, 16:05
 
Fecha de Ingreso: noviembre-2006
Mensajes: 227
Antigüedad: 17 años, 6 meses
Puntos: 6
Buscar Mediante dos Tablas

Hola que Tal, tengo vb 6.0 y access 2003, mi pregunta es si alguien sabe alguna sentencia para hacer busqueda por dos tablas lo que pretendo es lo siguiente:

tengo una tabla donde estan toda una lista de trabajadores llamada Empleados y otra tabla que se llama Asistencias.

A traves de un lector de codigo de barras el personal llega y verifica su asistencia estas se agregan o guardan en la tabla asistencias. posteriormente se ve un listado o reporte a travez de dos condiciones una es por fecha y la otra por departamento. hasta aqui no tengo ningun problema ya que el programa lo esta haciendo muy bien, mi verdadero problema radica en que ahora me estan pidiendo un reporte donde solo se vean los que no asistieron con el mismo tipo de condicion de busqueda por fecha o por departamento. se me ocurre que atraves del codigo del trabajador busque en la tabla asistencia y haga lo comparación con Empleado si no lo encuentra en asistencia pues es obvio que no asistio.

pero no se como hacerlo. alguien podria ayudarme por favor, les estaria muy agradecido. por lo pronto agradesco sus comentarios y sugerencias.
  #2 (permalink)  
Antiguo 10/11/2008, 18:28
 
Fecha de Ingreso: noviembre-2008
Mensajes: 38
Antigüedad: 15 años, 5 meses
Puntos: 0
Sonrisa Respuesta: Buscar Mediante dos Tablas

Cita:
Iniciado por SalomonSab Ver Mensaje
Hola que Tal, tengo vb 6.0 y access 2003, mi pregunta es si alguien sabe alguna sentencia para hacer busqueda por dos tablas lo que pretendo es lo siguiente:

tengo una tabla donde estan toda una lista de trabajadores llamada Empleados y otra tabla que se llama Asistencias.

A traves de un lector de codigo de barras el personal llega y verifica su asistencia estas se agregan o guardan en la tabla asistencias. posteriormente se ve un listado o reporte a travez de dos condiciones una es por fecha y la otra por departamento. hasta aqui no tengo ningun problema ya que el programa lo esta haciendo muy bien, mi verdadero problema radica en que ahora me estan pidiendo un reporte donde solo se vean los que no asistieron con el mismo tipo de condicion de busqueda por fecha o por departamento. se me ocurre que atraves del codigo del trabajador busque en la tabla asistencia y haga lo comparación con Empleado si no lo encuentra en asistencia pues es obvio que no asistio.

pero no se como hacerlo. alguien podria ayudarme por favor, les estaria muy agradecido. por lo pronto agradesco sus comentarios y sugerencias.

Hola, una posible solucion seria una arreglo o tabla de los dias de trabajo, posteriormente deberas filtrar por cada fecha y comparar que codigo de empleado no ha ingresado, generando una tabla de inasitencia como la de asistencia de esta forma podras realizar el nuevo reporte. espero se entienda la idea. Suerte.
  #3 (permalink)  
Antiguo 10/11/2008, 22:15
 
Fecha de Ingreso: noviembre-2006
Mensajes: 227
Antigüedad: 17 años, 6 meses
Puntos: 6
Respuesta: Buscar Mediante dos Tablas

no comprendi del todo, como haria la consulta ese es mi gran problema que tengo en este momento no se como estructurar esa consulta.
  #4 (permalink)  
Antiguo 12/11/2008, 19:15
 
Fecha de Ingreso: noviembre-2008
Mensajes: 38
Antigüedad: 15 años, 5 meses
Puntos: 0
De acuerdo Respuesta: Buscar Mediante dos Tablas

AQUI ENVIO UN POCO MAS DE AYUDA

Esto colocarlo en un modulo bas
Option Explicit
Public cnn As New ADODB.Connection
Public RS As New ADODB.Recordset
Public rsS As New ADODB.Recordset
Public RS1 As New ADODB.Recordset

Código para conectar a tu archivo en acces que contiene las tablas
Public Sub IniciarConexion()
With cnn
.CursorLocation = adUseClient
.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
App.Path & "\Informe.mdb" & ";Persist Security Info=False"
End With
End Sub




Este código que se debe realizar antes de la impresión del informe, realizando nose una llamada a un forms para cagar fechasDesde y Fechas Hasta

.
.
.' aca cargamos en rs todos los empleados de nuestra tabla.
If RS.State = adStateOpen Then
RS.Close
End If
sql = "SELECT * FROM tabladeEmpleados "
RS.Open sql, cnn, adOpenStatic, adLockOptimistic
.
.
.

.' aca cargamos en rs1 a todos los empleados que asistieron en un determinado periodo de mes
If RS1.State = adStateOpen Then
RS1.Close
End If
sql = "SELECT * FROM tabladeasistencia where fecha > = ' " & txtFECHADESDE & " ' and fecha <= ' " & _
txtFECHAHASTA & "' "
RS1.Open sql, cnn, adOpenStatic, adLockOptimistic
.
.

.' debería el operador ingresar desde que fecha y hasta que fecha se debe controlar, supongamos que las ingreso en las variable FechasDesde y FechasHasta con formato "dd/mm/yyyy", donde deberas controlar que la FechaHasta es mayor o igual a FechasDESDE, también tendrías una tabla que se llame inasistencia con los mismos campos que la de asistencia (id, codigodelEmpleado, Dia,departamento) supongamos ya que no conozco la estructura de la tabla asistencia.





'esto seria en un boton donde ya esten ingresadas las fechas
Dim i, fecha1, ASISTIO ' FECHA1 CONTENDRA LA FECHA PARA RECORRERLAS A TODAS, LO UNICO QUE NO DISTINGUE LOS DIAS QUE NO TRABAJAN POR EJEMPLO SABADOS Y DOMINGOS
' LA FORMA DE SOLUCIONAR SERIA COLOCAR UN CONTROL DE LOS DIAS QUE NO SE TRABAJAN

fecha1 = FechasDesde
For i = 0 To (FechasHasta - FechasDesde)

' ACA DEBES REALIZAR UNA FUNCION PARA BORRAR TABLA DE INASISTENCIA
If FUNCION_Control_FECHA_que_NO_TRABAJAMOS(fecha1) Then ' SI LA FUNCION ES TRUE SIGUE SINO CONTUNA CON LA PROXIMA FECHA
If RS.RecordCount > 0 Then
RS.MoveFirst
' recorre el recordset PARA COMPARAR SI EL EMPLEDO X SE ENCUENTRA EN LA TABLA SERIA SUPONGAMOS (ID, CODIGOEMP,NOMBEMP, DEPEMPL)
While Not RS.EOF
ASISTIO = False
If RS1.RecordCount > 0 Then
RS1.MoveFirst
While Not RS1.EOF
' SUPONGAMOS QUE LA TABLA DE ASISTENCIA ES(id, codigodelEmpleado, DiaASIS,departamento)
If RS1!.CODIGODELEMPLEADO = RS!CODIGOEMP Then
ASISTIO = True
End If
RS1.MoveNext
Wend
End If
If Not ASISTIO Then
' SUPONGAMOS QUE LA TABLA DE INASISTENCIA ES(id, codigodelEmpleado, DiaASIS,departamento) 'CON EL ID EN LA TABLA AUTOMATICO, ACA CARGAMOS LOS DATOS DE LOS QUE NO HAN ASITIDO A TRABAJAR
cnn.Execute "INSERT INTO TABLADEINASISTENCIA " & "(codigodelEmpleado, DiaASIS,departamento) VALUES('" & _
RS!CODIGOEMP & "','" & _
fecha1 & "','" & _
RS!DEPEMPL & "')"
rsS.Open sql, cnn, adOpenStatic, adLockOptimistic
End If
RS.MoveNext
Wend
End If
fecha1 = fecha1 + 1
End If
Next i


cualquier cosa avisame....

Última edición por AlexisLAG; 13/11/2008 a las 05:24
  #5 (permalink)  
Antiguo 14/11/2008, 15:55
 
Fecha de Ingreso: noviembre-2006
Mensajes: 227
Antigüedad: 17 años, 6 meses
Puntos: 6
Respuesta: Buscar Mediante dos Tablas

Gracias AlexisLAG por tu codigo y tu ayuda te agradezco mucho, voy a probar tu codigo y despues les cuento como me ha ido.

por lo pronto gracias. y Dios te bendiga
  #6 (permalink)  
Antiguo 18/11/2008, 10:19
 
Fecha de Ingreso: noviembre-2006
Mensajes: 227
Antigüedad: 17 años, 6 meses
Puntos: 6
Respuesta: Buscar Mediante dos Tablas

Mira hice una SubConsulta Asi:
Código:
rs.Open "SELECT * FROM Principal A WHERE NOT EXISTS(SELECT * FROM Asistencias B WHERE B.NumEmpleado = A.Clave ORDER BY B.NumEmpleado)", cnn, adOpenStatic, adLockOptimistic
Y efectivamente me muestra solo los datos que no estan en la Tabla Asistencias pero ahora tengo que hace la busqueda por Fecha es decir los que se encuentran en Asistencia de X y Y Fecha y me muestre esos registros.

no se si me explique si no ya me lo diran
  #7 (permalink)  
Antiguo 21/11/2008, 09:44
 
Fecha de Ingreso: noviembre-2006
Mensajes: 227
Antigüedad: 17 años, 6 meses
Puntos: 6
Respuesta: Buscar Mediante dos Tablas

Estoy Usando esta consulta:

Código:
rs.Open "SELECT * FROM Principal WHERE EXISTS (SELECT * FROM Asistencias WHERE NumEmpleado = Principal.Clave AND FechaReunion " & _
             "BETWEEN #" & Format(TxtFechaIni, "mm/dd/yyyy") & "# " & _
             "AND #" & Format(TxtFechaFin, "mm/dd/yyyy") & "# " & _
             "ORDER BY Clave)", cnn, adOpenStatic, adLockOptimistic
Que es lo que hace:
1.- una comparación entre dos tablas una llamada Principal y la Otra Asistencia.
2.- Me muestra los registros de Principal que no estan en Asistencias.
3.- Lo que no logro hacer es que me haga la consulta de acuerdo a las condiciones de Fecha
4.- Los campos que tengo en las Tablas son Estos.

PRINCIPAL:
- Clave
- Nombre
- Categoria
- Departamento
- Categoria

ASISTENCIAS:
- NumEmpleado
- NombreEmpleado
- CategoriaEmpleado
- DeptoEmpleado
- FechaReunion

La tabla PRINCIPAL se encuentran todo el padron del personal y en la Tabla Asistencias solo aquellos que asisten a laborar de acuerdo a la fecha.

lo que pretendo es que me muestre todos aquellos que no asistieron es decir si esta en tabla Asistencias es que si asistio si no se encuentra entonces que me lo muestre hasta aqui no tengo problemas porque si me lo muestra con la consulta que estoy colocando pero mi problema es a la hora de hacer la consulta por medio de fechas.

Alguien tiene mas experiencias con consultas y subconsultas ho existe otra forma de hacerlo estoy habierto a cualquier sugerencia por favor necesito su ayuda.

cualquier aporte o sugerencia estare muy agradecido.
  #8 (permalink)  
Antiguo 21/11/2008, 10:12
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: Buscar Mediante dos Tablas

Cita:
Iniciado por SalomonSab Ver Mensaje
Estoy Usando esta consulta:

Código:
rs.Open "SELECT * FROM Principal WHERE EXISTS (SELECT * FROM Asistencias WHERE NumEmpleado = Principal.Clave AND FechaReunion " & _
             "BETWEEN #" & Format(TxtFechaIni, "mm/dd/yyyy") & "# " & _
             "AND #" & Format(TxtFechaFin, "mm/dd/yyyy") & "# " & _
             "ORDER BY Clave)", cnn, adOpenStatic, adLockOptimistic
Que es lo que hace:
1.- una comparación entre dos tablas una llamada Principal y la Otra Asistencia.
2.- Me muestra los registros de Principal que no estan en Asistencias.
3.- Lo que no logro hacer es que me haga la consulta de acuerdo a las condiciones de Fecha
4.- Los campos que tengo en las Tablas son Estos.

PRINCIPAL:
- Clave
- Nombre
- Categoria
- Departamento
- Categoria

ASISTENCIAS:
- NumEmpleado
- NombreEmpleado
- CategoriaEmpleado
- DeptoEmpleado
- FechaReunion

La tabla PRINCIPAL se encuentran todo el padron del personal y en la Tabla Asistencias solo aquellos que asisten a laborar de acuerdo a la fecha.

lo que pretendo es que me muestre todos aquellos que no asistieron es decir si esta en tabla Asistencias es que si asistio si no se encuentra entonces que me lo muestre hasta aqui no tengo problemas porque si me lo muestra con la consulta que estoy colocando pero mi problema es a la hora de hacer la consulta por medio de fechas.

Alguien tiene mas experiencias con consultas y subconsultas ho existe otra forma de hacerlo estoy habierto a cualquier sugerencia por favor necesito su ayuda.

cualquier aporte o sugerencia estare muy agradecido.
Prueba cambiando el predicado EXISTS por 'NOT IN'

SELECT * FROM Principal WHERE NOT IN (SELECT * FROM....

  #9 (permalink)  
Antiguo 21/11/2008, 10:34
 
Fecha de Ingreso: noviembre-2006
Mensajes: 227
Antigüedad: 17 años, 6 meses
Puntos: 6
Respuesta: Buscar Mediante dos Tablas

Avellaneda Gracias, pero me sale este Error:
  #10 (permalink)  
Antiguo 21/11/2008, 11:15
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: Buscar Mediante dos Tablas

Cita:
Iniciado por SalomonSab Ver Mensaje
Avellaneda Gracias, pero me sale este Error:
A ver, vamos a poner la sentencia así:

"SELECT * FROM Principal WHERE Clave NOT IN (SELECT NumEmpleado FROM Asistencias WHERE FechaReunion " & _
"BETWEEN #" & Format(TxtFechaIni, "mm/dd/yyyy") & "# " & _
"AND #" & Format(TxtFechaFin, "mm/dd/yyyy") & "#"


  #11 (permalink)  
Antiguo 21/11/2008, 11:30
 
Fecha de Ingreso: noviembre-2006
Mensajes: 227
Antigüedad: 17 años, 6 meses
Puntos: 6
Respuesta: Buscar Mediante dos Tablas

Gracias Avellaneda, si hace la busqueda y me coloca los registros pero si coloca una fecha que no existe en la tabla asistencia de cualquier forma me muestra todo el padron de la tabla Principal cuando deberia decirme que no encontro ningun registro. este es todo mi codigo.

Código:
Private Sub CmdBuscarInasistencia_Click()
Dim Fila As Integer, I As Integer

    If Not (IsDate(TxtFechaIni.Value) And IsDate(TxtFechaFin.Value)) Then
         MsgBox " Una de las Fechas esta Equivocada por favor Verifica ", vbInformation, "Información al Usuario..."
         Exit Sub
    ElseIf CDate(TxtFechaIni.Value) > CDate(TxtFechaFin.Value) Then
        MsgBox " La Fecha INICIO no debe ser superior a la FINAL, por favor verifica bien los datos...", vbInformation, "Información al Usuario..."
         Exit Sub
    End If
           
    If rs.State = 1 Then rs.Close
     
     rs.Open "SELECT * FROM Principal WHERE Clave NOT IN (SELECT NumEmpleado FROM Asistencias WHERE FechaReunion " & _
             "BETWEEN #" & Format(TxtFechaIni, "mm/dd/yyyy") & "# " & _
             "AND #" & Format(TxtFechaFin, "mm/dd/yyyy") & "# " & _
             ") ORDER BY Clave", cnn, adOpenStatic, adLockOptimistic
    
             
        If rs.RecordCount = 0 Then
            MsgBox "No se encontraron registros Probablemente todo el personal si acudio a su reunión", vbInformation, "Departamento No Encontradas..."
            CmdImprimedepto.Enabled = False
            MsHAsistencias.Visible = False
            Else
                MsHAsistencias.Visible = True
                Call HistorialInAsistencias(MsHAsistencias)
                TextTotalReg.Text = rs.RecordCount
                CmdImprimir.Enabled = True
        End If
        
End Sub
y Gracias por tu ayuda.
  #12 (permalink)  
Antiguo 21/11/2008, 15:42
 
Fecha de Ingreso: noviembre-2006
Mensajes: 227
Antigüedad: 17 años, 6 meses
Puntos: 6
Respuesta: Buscar Mediante dos Tablas

O Existe algun otro metodo para hacer este tipo de referencia. si alguien sabe por favor necesito sus valiosa ayuda.

Estoy Atorado en esto es lo unico que me falta para concluir mi programa.
  #13 (permalink)  
Antiguo 23/11/2008, 04:26
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: Buscar Mediante dos Tablas

Cita:
Iniciado por SalomonSab Ver Mensaje
Gracias Avellaneda, si hace la busqueda y me coloca los registros pero si coloca una fecha que no existe en la tabla asistencia de cualquier forma me muestra todo el padron de la tabla Principal cuando deberia decirme que no encontro ningun registro. este es todo mi codigo.

...

y Gracias por tu ayuda.
Hola, puedes hacer primero un conteo en la tabla 'Asistencias' para comprobar si existen registros entre las fechas indicadas:


Código:
rs.Open "SELECT Count(*) AS Registros FROM Asistencias WHERE FechaReunion " & _
        "BETWEEN #" & Format(TxtFechaIni, "mm/dd/yyyy") & "# " & _
        "AND #" & Format(TxtFechaFin, "mm/dd/yyyy") & "#", cnn, adOpenStatic, adLockOptimistic

If rs!Registros = 0 Then
    MsgBox "En las fechas indicadas no hubo reunión"
    rs.Close
    Exit Sub
End If
rs.Close

' mostrar los datos de los que no asistieron
rs.Open "SELECT * FROM Principal WHERE Clave NOT IN (SELECT NumEmpleado FROM Asistencias " & _
"WHERE FechaReunion BETWEEN #" & Format(TxtFechaIni, "mm/dd/yyyy") & "# AND #" & _
Format(TxtFechaFin, "mm/dd/yyyy") & "#) ORDER BY Clave", cnn, adOpenStatic, adLockOptimistic
  
If rs.RecordCount = 0 Then
    MsgBox "Todo el personal asistió a la reunión."
    ''''''
    ''''''
Else
    ''''''
    ''''''
End If
  #14 (permalink)  
Antiguo 24/11/2008, 08:16
 
Fecha de Ingreso: noviembre-2006
Mensajes: 227
Antigüedad: 17 años, 6 meses
Puntos: 6
Respuesta: Buscar Mediante dos Tablas

Excelente Avellaneda ahora si me funciona lo que queria, mil GRACIAS no sabes del apuro que me has sacado te agradezco infinitamente. y de nuevo GRACIAS
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 14:01.