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

Dos consultas en dos bases diferentes.

Estas en el tema de Dos consultas en dos bases diferentes. en el foro de Visual Basic clásico en Foros del Web. Saludos amigos Trabajando con VB6/Access97, supongamos que tenemos dos bases: Base Ingresos y Base Gastos. En la primera, tenemos una consulta que resume los ingresos ...
  #1 (permalink)  
Antiguo 23/11/2005, 09:43
jorevale
Invitado
 
Mensajes: n/a
Puntos:
Dos consultas en dos bases diferentes.

Saludos amigos

Trabajando con VB6/Access97, supongamos que tenemos dos bases: Base Ingresos y Base Gastos. En la primera, tenemos una consulta que resume los ingresos por mes, de la siguiente forma:

Mes Ingresos
01 100.00
02 200.00
... ...
12 500.00

Y en la otra base de datos (Gastos), hay otra consulta relacionada con los gastos, que tiene una información similar.

Mes Gastos
01 34.00
02 58.00
... ...
12 37.00

Mi intención es sacar en VB el resultado por mes Resultado = Ingresos - Gastos. De forma tal de poder obtener el resultado siguiente (que según los datos del ejemplo sería:)

Mes Resultado
01 66.00
02 142.00
... ...
12 463.00

Me enrollo porque no sé como trabajar (mediante ADO) con dos consultas de dos bases diferentes.

Alguna idea?

Gracias
  #2 (permalink)  
Antiguo 23/11/2005, 11:15
Avatar de reel  
Fecha de Ingreso: febrero-2004
Ubicación: Managua, Nicaragua
Mensajes: 496
Antigüedad: 20 años, 3 meses
Puntos: 1
Tenes que tener una conexión por cada BD y un recordset por cada consulta.

Por medio de los recordaset puede manipular lo registros y hacer la operaciones necesarias y presetar los resultados en un MSFlexGrid

Eso sería a groso modo, porque no presentas un problema puntual. Si tienes problemas con los objetos conexión y recordset en el foro encontraras mucha información sobre ellos.

Saludes
__________________
Leer es Saber, REEL.
Mi Blog
  #3 (permalink)  
Antiguo 24/11/2005, 02:30
jorevale
Invitado
 
Mensajes: n/a
Puntos:
Pregunta Empleo ADO y DSNs

Vale, seré más explícito.

Tengo una BaseA que tiene una ConsultaA relacionada con los ingresos. Y tengo una BaseB que tiene una ConsultaB relacionada con los gastos. En ambos casos la información está agrupada por meses.

Por otro lado, en VB6, empleo ADO mediante DSN para obtener la información de Access. Y, empleando el control TrueDBGrid muestro esa información en una tabla, y en un gráfico con MSChart.

Tanto los ingresos como los gastos se muestran correctamente en VB, pero además me interesaría tener el *Resultado* desglozado por meses (ingresos menos gastos).

Mi problema surge de que las consultas se encuentran en dos bases diferentes, y no sé como puedo unir esa información en una sola consulta.

Me daría igual hacerlo en Access y luego verterlo hacia VB, que hacerlo directamente en VB, pero no tengo idea de como hacerlo...
  #4 (permalink)  
Antiguo 24/11/2005, 08:32
Avatar de reel  
Fecha de Ingreso: febrero-2004
Ubicación: Managua, Nicaragua
Mensajes: 496
Antigüedad: 20 años, 3 meses
Puntos: 1
Y porque no agregar como tabla vinculada la consulta de la base B en A así con una consulta desde acces generas lo que quieres.

Intentalo realmente no estoy seguro si se puede.

Saludes
__________________
Leer es Saber, REEL.
Mi Blog
  #5 (permalink)  
Antiguo 24/11/2005, 08:36
jorevale
Invitado
 
Mensajes: n/a
Puntos:
Si, se puede

Ya lo he probado reel, pero me dió unos resultados muy extraños. En realidad me daba resultados de millones de euros, cuando en realidad solo se trata de algunas decenas de miles.

De todas formas, estoy trabajando el código en Visual Basic, y ya casi lo tengo.

En cuanto lo haya terminado lo postearé aqui por si a alguien le hace falta luego.

Gracias, igualmente.

Salu2
  #6 (permalink)  
Antiguo 24/11/2005, 08:51
Avatar de reel  
Fecha de Ingreso: febrero-2004
Ubicación: Managua, Nicaragua
Mensajes: 496
Antigüedad: 20 años, 3 meses
Puntos: 1
Te recomiendo que leeas ese link a lo mejor te ayuda en algo.

http://www.forosdelweb.com/showthrea...163#post622163

Saludes
__________________
Leer es Saber, REEL.
Mi Blog
  #7 (permalink)  
Antiguo 24/11/2005, 09:30
jorevale
Invitado
 
Mensajes: n/a
Puntos:
Ya está

Hola amigos

Seguramente habrá una forma más fácil de hacer lo mismo, pero aquí os pongo la que he encontrado y me funciona.

Hay cuatro bases diferentes:
- Una de los ingresos actuales.
- Otra de los ingresos del histórico (meses anteriores al actual).
- Otra de los gastos.
- Otra de resultados.

He desistido de emplear DSNs.

Y el código es éste, por si a alguien le hace falta:

*****************

'Conexiones y Recordsets
Dim Conecta01 As New Connection
Dim Tabla01 As New Recordset
Dim Conecta02 As New Connection
Dim Tabla02 As New Recordset
Dim Conecta03 As New Connection
Dim Tabla03 As New Recordset
Dim Conecta04 As New Connection
Dim Tabla04 As New Recordset

Dim VAñoMes As String 'Año y Mes. Ejm: 0511
Dim VIngAct As Double 'Ingresos en Base Actual
Dim VIngHis As Double 'Ingresos en Base Histórico
Dim VIngTot As Double 'Para sumatoria de ingresos
Dim VGas As Double 'Gastos
Dim VGasTot As Double 'Para sumatoria de gastos
Dim VRes As Double 'Resultado
Dim VPeríodoVacío As Boolean 'Período Vacío

Private Sub cAUTI_Click()
'INGRESOS BASE ACTUAL:
Tabla01.MoveFirst
Do While Not Tabla01.EOF
If Tabla01!AML <> "" Then
VAñoMes = Tabla01!AML
VIngAct = Tabla01!TEMPRESA
Tabla04.MoveFirst
Do While Not Tabla04.EOF
If Tabla04!AÑOMES = VAñoMes Then
VIngTot = Tabla04!INGRESOS
VIngTot = VIngTot + VIngAct
Tabla04!INGRESOS = VIngTot
Tabla04.Update
Exit Do
Else
Tabla04.MoveNext
End If
Loop
' Tabla04.Close
Else
Tabla01.MoveNext
End If
If Tabla01.EOF = True Then
Exit Sub
Else
Tabla01.MoveNext
End If
Loop
End Sub

Private Sub cCLose_Click()
Tabla01.Close: Set Tabla01 = Nothing
Conecta04.Close: Set Conecta04 = Nothing
Conecta03.Close: Set Conecta03 = Nothing
Conecta02.Close: Set Conecta02 = Nothing
Conecta01.Close: Set Conecta01 = Nothing
End Sub

Private Sub cGASTO_Click()
'GASTOS:
Tabla03.MoveFirst
Do While Not Tabla03.EOF
If Tabla03!AML <> "" Then
VAñoMes = Tabla03!AML
VGas = Tabla03!IMPORTE
Tabla04.MoveFirst
Do While Not Tabla04.EOF
If Tabla04!AÑOMES = VAñoMes Then
VGasTot = Tabla04!GASTOS
VGasTot = VGasTot + VGas
Tabla04!GASTOS = VGasTot
Tabla04.Update
Exit Do
Else
Tabla04.MoveNext
End If
Loop
' Tabla04.Close
Else
Tabla03.MoveNext
End If
If Tabla03.EOF = True Then
Exit Sub
Else
Tabla03.MoveNext
End If
Loop
End Sub

Private Sub cHIST_Click()
'INGRESOS BASE HISTÓRICO:
Tabla02.MoveFirst
Do While Not Tabla02.EOF
If Tabla02!AML <> "" Then
VAñoMes = Tabla02!AML
VIngAct = Tabla02!TEMPRESA
Tabla04.MoveFirst
Do While Not Tabla04.EOF
If Tabla04!AÑOMES = VAñoMes Then
VIngTot = Tabla04!INGRESOS
VIngTot = VIngTot + VIngAct
Tabla04!INGRESOS = VIngTot
Tabla04.Update
Exit Do
Else
Tabla04.MoveNext
End If
Loop
' Tabla04.Close
Else
Tabla02.MoveNext
End If
If Tabla02.EOF = True Then
Exit Sub
Else
Tabla02.MoveNext
End If
Loop
End Sub

Private Sub cRESULTA_Click()
'INGRESOS BASE HISTÓRICO:
Tabla04.MoveFirst
Do While Not Tabla04.EOF
If Tabla04!AÑOMES <> "" Then
VIngTot = Tabla04!INGRESOS
VGasTot = Tabla04!GASTOS
VRes = VIngTot - VGasTot
Tabla04!RESULTA = VRes
Tabla04.Update
End If
Tabla04.MoveNext
Loop
End Sub

Private Sub Form_Load()
'En este procedimiento abro las conexiones
'Y ya de paso dejo a cero la base de los resultados (RES_AST)
'en todos sus registros, para que no se me duplique, por ahora.

'Primera conexión a la Base AUTI (Ingresos de la Base Actual)
cRutaBD01 = "Z:\AUTI\AST\"
vConnectString01 = "Driver={Microsoft Access Driver (*.mdb)};" & _
"Dbq=Z:\AUTI\AST\AUTI.mdb; DefaultDir=" & cRutaBD01 & ";" & _
"Uid=Admin;Pwd=esc;"
Conecta01.Open vConnectString01
Cadena01 = "SELECT ID_AVISO, AML, TEMPRESA FROM AVISOS order by ID_AVISO"

'Primera conexión a la Base HIST (Ingresos del Histórico)
cRutaBD02 = "Z:\AUTI\AST\"
vConnectString02 = "Driver={Microsoft Access Driver (*.mdb)};" & _
"Dbq=Z:\AUTI\AST\HIST.mdb; DefaultDir=" & cRutaBD01 & ";" & _
"Uid=Admin;Pwd=esc;"
Conecta02.Open vConnectString02
Cadena02 = "SELECT AML, TEMPRESA FROM AVISOS"

'Primera conexión a la Base GAS_AST (Gastos)
cRutaBD03 = "Z:\AUTI\AST\"
vConnectString03 = "Driver={Microsoft Access Driver (*.mdb)};" & _
"Dbq=Z:\AUTI\AST\GAS_AST.mdb; DefaultDir=" & cRutaBD01 & ";" & _
"Uid=Admin;Pwd=esc;"
Conecta03.Open vConnectString01
Cadena03 = "SELECT AML, IMPORTE FROM MAYOR"

'Primera conexión a la Base AST_RES (Resultados)
cRutaBD04 = "Z:\AUTI\AST\"
vConnectString04 = "Driver={Microsoft Access Driver (*.mdb)};" & _
"Dbq=Z:\AUTI\AST\RES_AST.mdb; DefaultDir=" & cRutaBD04 & ";" & _
"Uid=Admin;Pwd=esc;"
Conecta04.Open vConnectString04
Cadena04 = "SELECT * FROM RESULTA"

Tabla04.Open Cadena04, Conecta04, adOpenKeyset, adLockOptimistic
Tabla03.Open Cadena03, Conecta03, adOpenKeyset, adLockOptimistic
Tabla02.Open Cadena02, Conecta02, adOpenKeyset, adLockOptimistic
Tabla01.Open Cadena01, Conecta01, adOpenKeyset, adLockOptimistic

End Sub

Private Sub Form_Unload(Cancel As Integer)
Screen.MousePointer = vbDefault
End Sub

Private Sub datPrimaryRS_Error(ByVal ErrorNumber As Long, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, fCancelDisplay As Boolean)
'Aquí es donde puede colocar el código de control de errores
'Si desea pasar por alto los errores, marque como comentario la siguiente línea
'Si desea detectarlos, agregue código aquí para controlarlos
MsgBox "Data error event hit err:" & Description
End Sub

Private Sub datPrimaryRS_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
'Esto mostrará la posición de registro actual para este Recordset
datPrimaryRS.Caption = "Record: " & CStr(datPrimaryRS.Recordset.AbsolutePosition)
End Sub

Private Sub datPrimaryRS_WillChangeRecord(ByVal adReason As ADODB.EventReasonEnum, ByVal cRecords As Long, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
'Aquí se coloca el código de validación
'Se llama a este evento cuando ocurre la siguiente acción
Dim bCancel As Boolean

Select Case adReason
Case adRsnAddNew
Case adRsnClose
Case adRsnDelete
Case adRsnFirstChange
Case adRsnMove
Case adRsnRequery
Case adRsnResynch
Case adRsnUndoAddNew
Case adRsnUndoDelete
Case adRsnUndoUpdate
Case adRsnUpdate
End Select

If bCancel Then adStatus = adStatusCancel
End Sub

Private Sub cmdAdd_Click()
On Error GoTo AddErr
datPrimaryRS.Recordset.AddNew

Exit Sub
AddErr:
MsgBox Err.Description
End Sub

Private Sub cmdDelete_Click()
On Error GoTo DeleteErr
With datPrimaryRS.Recordset
.Delete
.MoveNext
If .EOF Then .MoveLast
End With
Exit Sub
DeleteErr:
MsgBox Err.Description
End Sub

Private Sub cmdRefresh_Click()
'Esto sólo es necesario en aplicaciones multiusuario
On Error GoTo RefreshErr
datPrimaryRS.Refresh
Exit Sub
RefreshErr:
MsgBox Err.Description
End Sub

Private Sub cmdUpdate_Click()
On Error GoTo UpdateErr

datPrimaryRS.Recordset.UpdateBatch adAffectAll
Exit Sub
UpdateErr:
MsgBox Err.Description
End Sub

Private Sub cmdClose_Click()
Unload Me
End Sub
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 06:59.