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

Consulta SQL

Estas en el tema de Consulta SQL en el foro de Visual Basic clásico en Foros del Web. hola amigos: es primera vez que quiero tratar de obtener datos simultaneamente de dos tablas tengo una db llamada Productos con dos tablas Ingresos y ...
  #1 (permalink)  
Antiguo 25/08/2008, 19:30
 
Fecha de Ingreso: agosto-2007
Mensajes: 8
Antigüedad: 16 años, 8 meses
Puntos: 0
Consulta SQL

hola amigos:

es primera vez que quiero tratar de obtener datos simultaneamente de dos tablas

tengo una db llamada Productos con dos tablas Ingresos y Precios

Ingresos tiene campos Id_ingreso auto incrementable, fecha, codigo, descripcion

Precios tiene campos Id_precio auto incrementable, Id_ingreso, PrecioDetalle, PrecioDocena

relacione el campo Id_ingreso en ambas tablas con integridad referencial, ahora

en ambas tablas he ingresado datos de esta forma:

Código:
    'Establecer ruta de conexión
    sBase = App.Path & "\" & "Productos.mdb"
    Tabla = "Ingresos"

    ' Crear los objetos
    Set cnn = New adodb.Connection
    Set rst = New adodb.Recordset

    
        cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & sBase
        s = "SELECT * FROM " & Tabla
        rst.Open s, cnn, adOpenDynamic, adLockOptimistic
    
                
        rst.AddNew
        rst!Id_ingreso = lbl_ID.Caption
        rst!Fecha = DTPicker1.Value
        rst!Codigo = Text1(0).Text
        rst!Descripcion = Text1(1).Text
        rst!Cantidad = Val(Text1(2).Text)
        rst!Cunitario = Val(Text1(3).Text)
        rst!Ctotal = Val(Text1(4).Text)
        rst.Update
        rst.Close
        cnn.Close
        Err = 0
        
        Set rst = Nothing
        Set cnn = Nothing
Código:
    'Establecer ruta de conexión
    sBase = App.Path & "\" & "Productos.mdb"
    Tabla = "Precios"

    ' Crear los objetos
    Set cnn = New adodb.Connection
    Set rst = New adodb.Recordset

    
        cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & sBase
        s = "SELECT * FROM " & Tabla
        rst.Open s, cnn, adOpenDynamic, adLockOptimistic
    
                
        rst.AddNew
        rst!Id_precio = lbl_IDprecio.Caption
        rst!Id_ingreso = Text1(0).Text
        rst!PrecioDetalle = Val(Text1(5).Text)
        rst!PrecioDocena = Val(Text1(6).Text)
        rst.Update
        rst.Close
        cnn.Close
        Err = 0
        
        Set rst = Nothing
        Set cnn = Nothing
hasta ahi puedo ingresar en forma correcta

pero ahora necesito hacer una consulta que me involucre a las dos tablas a travez de los cambos relacionados Id_ingreso.

y francamente No tengo idea de como hacerlo

los resultados los muestro en un listview asi

Código:
Private Sub cargar()
        
        'Establecer ruta de conexión
        sBase = App.Path & "\" & "Productos.mdb"
        Tabla = "Ingresos"

        ' Crear los objetos
        Set cnn = New adodb.Connection
        Set rst = New adodb.Recordset
        

        cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & sBase
        s = "SELECT * FROM " & Tabla & " "
        rst.Open s, cnn, adOpenDynamic, adLockOptimistic
    
        With rst
        
            If (.BOF Or .EOF) Then
                MsgBox "No existen registros en la db", vbCritical
                Exit Sub
            Else
        
                ListView1.ListItems.Clear
                .MoveFirst
            
                Do While Not .EOF
                
                    ListView1.ListItems.Add , , .Fields("Id_ingreso") & ""
                    ListView1.ListItems(ListView1.ListItems.Count).SubItems(1) = .Fields("Codigo") & ""
                    ListView1.ListItems(ListView1.ListItems.Count).SubItems(2) = .Fields("Descripcion") & ""
                    ListView1.ListItems(ListView1.ListItems.Count).SubItems(3) = .Fields("Cunitario") & ""
                    
                
                .MoveNext

                Loop
            End If
        End With
        
                   
                    rst.Close
                    cnn.Close
                    Err = 0

                    Set rst = Nothing
                    Set cnn = Nothing
                    
                    

End Sub
ahora lo que deseo hacer es que al clicar en un item

me relaciones las dos db a travez del campo Id_ingreso y me muestre los resultados de ambas tablas

Código:
For i = ListView1.ListItems.Count To 1 Step -1

    If ListView1.ListItems(i).Selected Then
y es aqui donde guateo, pues no se como conectar con las dos tablas ni como hacer la consulta simultanea
por favor les ruego me ayuden

muy agradecido de antemano

Bufalobill
  #2 (permalink)  
Antiguo 25/08/2008, 22:31
Avatar de dogduck  
Fecha de Ingreso: enero-2006
Ubicación: ¿Atlantida, Hesperides, Islas afortunadas?
Mensajes: 2.231
Antigüedad: 18 años, 4 meses
Puntos: 19
Respuesta: Consulta SQL

Para hacer una consulta de seleccion sobre 2 tablas, puedes hacer:

Tabla1 = "Precios"
Tabla2 = "Ingresos"
s = "SELECT * FROM " & Tabla1 & "," & Tabla2 & "WHERE Id_ingreso." & tabla1 & "=Id_ingreso." & Tabla2

Lo más correcto para consultar en varias tablas en transact-SQL seria con inner join, un ejemlo:

select p.nombre as Provincia , m.municipio as Municipio
from provincia as p inner join municipio as m
on p.codigoprovincia = m.codigoprovincia;

salu2
  #3 (permalink)  
Antiguo 26/08/2008, 10:57
 
Fecha de Ingreso: agosto-2007
Mensajes: 8
Antigüedad: 16 años, 8 meses
Puntos: 0
Respuesta: Consulta SQL

Hola perropato, gracias por tu respuesta, mira segui paso a paso tu ayuda y di con lo siguiente

Código:
' Crear los objetos
        Set cnn = New adodb.Connection
        Set rst = New adodb.Recordset
        
        cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & sBase
        
                     
        s = "SELECT * FROM " & Tabla & "," & Tabla2 & " WHERE " & Tabla2 & ".Id_ingreso= " & Tabla & ".Id_ingreso AND Codigo='" & ListView1.ListItems(i).SubItems(1) & "'"
        
        's = "SELECT p.Id_ingreso,Codigo as " & Tabla & " , m.Id_ingreso,PrecioDetalle as " & Tabla2 & " FROM " & Tabla & " as p INNER JOIN " & Tabla2 & " as m ON p.Id_ingreso=m.Id_ingreso;"

        rst.Open s, cnn, adOpenDynamic, adLockOptimistic
    
        With rst
        
            If (.BOF Or .EOF) Then
                MsgBox "No existen registros en la db", vbCritical
                Exit Sub
            Else
        
                .MoveFirst
            
                Do While Not .EOF
                
                    'Text1(0) = .Fields("Id_ingreso")
                    Text1(1) = .Fields("Codigo")
                    Text1(2) = .Fields("Descripcion")
                    Text1(3) = .Fields("Cantidad")
                    Text1(4) = .Fields("Cunitario")
                    lbl_IDprecio.Caption = .Fields("Id_precio")
Con le primera Select trabaja bien a media, ya que el primer campo que es el mas importante me dice ERROR 3265 no se reconoce el elemento de la coleccion que corresponde con el nombre o el ordinal pedido, sin embargo me muestra todo los demas campos de ambas tablas, solo no me muestra los ID_ingreso

y con la segunda select me da el mismo error para todos los campos

Por favor ayudame amigo,

te lo agradecere hasta el infinito y mas alla

Bufalobill
  #4 (permalink)  
Antiguo 26/08/2008, 11:32
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Respuesta: Consulta SQL

Hola!

Las dos tablas tienen un campo Id_Ingreso cada una, y si en la Select no le especificas cual de los dos quieres (aunque el valor sea el mismo en ambos), el gestor se hace un lío, y toma una decisión salomónica: no hay campo que valga.

En lugar de poner un sólo asterisco, especifica tantas tablas como tengas:

SELECT tabla1.*, tabla2.* FROM tabla1, tabla2 ...

Así, el gestor te devolverá dos campos diferentes: tabla1.Id_Ingreso y tabla2.Id_Ingreso. Puesto que los dos tienen el mismo valor, ya que los usas para unir las tablas, da igual el que utilices al explotar el recordset.

Por otra parte, te recomiendo que no definas los nombres de las tablas fuera de la cadena con la definición (s, en tu caso); sólo ralentizas la ejecución y es más complicado leer la instrucción SELECT.
__________________
wile sona li mute e sona
  #5 (permalink)  
Antiguo 26/08/2008, 11:49
Avatar de dogduck  
Fecha de Ingreso: enero-2006
Ubicación: ¿Atlantida, Hesperides, Islas afortunadas?
Mensajes: 2.231
Antigüedad: 18 años, 4 meses
Puntos: 19
Respuesta: Consulta SQL

Hay algo en la definicion de los nombres de los campos de tus tablas: 3265
Cita:
'Item not found in this collection' generally means the the field name you are referencing in you SQL statement doesn't exist in the table. Check to make sure you spelled the field name correctly.
Traduzco a grosso modo: Elemento no encontrado en esta coleccion, generalmente significa que el nombre del campo no existe en la tabla ... Revisa

Pero me da en la nariz que Txoco puede que tenga razón... cuentanos

salu2
  #6 (permalink)  
Antiguo 26/08/2008, 16:16
 
Fecha de Ingreso: agosto-2007
Mensajes: 8
Antigüedad: 16 años, 8 meses
Puntos: 0
Respuesta: Consulta SQL

No hay caso amigos, no me toma los campos Id_ingreso de ninguna de las dos tablas tampoco de esta forma

Código:
        s = "SELECT " & Tabla & ".*, " & Tabla2 & ".* FROM " & Tabla & ", " & Tabla2 & " WHERE " & Tabla2 & ".Id_ingreso= " & Tabla & ".Id_ingreso AND Codigo='" & ListView1.ListItems(i).SubItems(1) & "'"
lo curioso es que me toma todos los otros campos sin ningun problema

y trabajando con una sola tabla como esta al principio de este post trabaja impecable no logro ver el error, mientras mas veo menos veo

pleace help me!
  #7 (permalink)  
Antiguo 26/08/2008, 23:58
Avatar de dogduck  
Fecha de Ingreso: enero-2006
Ubicación: ¿Atlantida, Hesperides, Islas afortunadas?
Mensajes: 2.231
Antigüedad: 18 años, 4 meses
Puntos: 19
Respuesta: Consulta SQL

OK. Prueba con IS NOT NULL, a veces un campo con un valor null puede dar malas sorpresas:

s = "SELECT " & Tabla & ".*, " & Tabla2 & ".* FROM " & Tabla & ", " & Tabla2 & " WHERE " & Tabla & ".Id_ingreso IS NOT NULL AND " & Tabla2 & ".Id_ingreso IS NOT NULL AND " & Tabla2 & ".Id_ingreso= " & Tabla & ".Id_ingreso AND Codigo='" & ListView1.ListItems(i).SubItems(1) & "'"

¿Por cierto Codigo a que tabla pertenece?, ¿No seria mejor Tablan.Codigo?
Y revisa las tablas...
salu2
  #8 (permalink)  
Antiguo 27/08/2008, 05:11
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Respuesta: Consulta SQL

¿La línea que te causa el error es esta?:

Código:
Text1(0) = .Fields("Id_ingreso")
Tendrías que sustituírla por:

Código:
Text1(0) = .Fields("Tabla1.Id_ingreso")
o
Text1(0) = .Fields("Tabla2.Id_ingreso")
Para decirle cual de los dos "Id_ingreso" es el que tiene que manipular.
__________________
wile sona li mute e sona
  #9 (permalink)  
Antiguo 27/08/2008, 07:26
Avatar de dogduck  
Fecha de Ingreso: enero-2006
Ubicación: ¿Atlantida, Hesperides, Islas afortunadas?
Mensajes: 2.231
Antigüedad: 18 años, 4 meses
Puntos: 19
Respuesta: Consulta SQL

bien por Txoco.

salu2
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:15.