Cómo vincular dos consultas para obtener un reporte

Tengo una BD con dos tablas para compras y dos para pagos y quiero hacer un reporte con las facturas pagadas, pero necesito detalles que están en la tabla compras_detalle, la cual esta vinculada a la tabla pagos_detalle a través del campo nro_factura, pero cuando uno las tablas en una sola consulta, me da el error de que no coincide el tipo en la expresión y si quito la relación entre ambas tablas me deja correr la consulta pero no me da el resultado que quiero pues solo quiero ver las facturas pagadas y sin la relación entre las tablas me las muestra todas

1 respuesta

Respuesta

Sin saber como son las tablas, es difícil decirte algo concreto, pero no necesitas relacionar como tal las tablas, puedes usar las funciones Dlookup, Dcount, o Dsum. Por ejemplo

TextoX(del formulario Pagos)=dlookup("Producto","compras","nro_factura=" & me.nro-factura & "")

TotalPago=Dsum("importe","detalleCompra","nro_factura=" & me.nro-factura & "")

Etc.

No entiendo bien la explicación, el asunto es que quiero hacer una consulta que tenga datos de la tabla compras y de la tabla pagos para poder saber cuales son las facturas pendientes de pago, y estas tablas se relacionan a través del campo Nr_Factura, pero cuando hago la consulta me da el error que dice "no coincide el tipo en la expresión"

Sigo diciendo que al no saber como tienes construida la base es difícil dar una opinión concreta. Por ejemplo, si tengo una tabla Compras, donde puedes ver que hay un campo Pagada(Sí/No)

También tengo una tabla DetalleCompra, y con ambas hago un formulario y subformulario.

También tengo una tabla Pagos(prácticamente igual a la anterior) con otra tabla DetallePagos(muy parecida a la DetalleCompra) y con ambas hago un formulario con subformulario

El combinado sólo me muestra las facturas que no están pagadas. Si elijo una, en este caso la 222

Si pulso el botón pagar, lo que hace es "marcarme" como pagada esa factura en la tabla Compras, de forma que si me voy al siguiente registro, ya no me aparece la 222

El código del botón y del evento Después de actualizar del combinado

Private Sub Comando17_Click()
DoCmd.RunCommand acCmdSaveRecord
DoCmd.SetWarnings False
DoCmd.RunSQL "update compras set pagada=-1 where numfactura='" & Me.NumFactura & "'"
End Sub
Private Sub NumFactura_AfterUpdate()
IdProveedor = DLookup("idproveedor", "compras", "numfactura='" & Me.NumFactura & "'")
Importe = DLookup("importe", "compras", "numfactura='" & Me.NumFactura & "'")
TipoIVA = DLookup("tipoiva", "compras", "numfactura='" & Me.NumFactura & "'")
ImporteIVA = DLookup("importeiva", "compras", "numfactura='" & Me.NumFactura & "'")
TotalFactura = DLookup("totalfactura", "compras", "numfactura='" & Me.NumFactura & "'")
Me!DetallePago.Form.RecordSource = "select * from detallecompra where numfactura='" & Me.NumFactura & "'"
End Sub

Y el origen de la fila en el combinado es

SELECT Compras.NumFactura FROM Compras GROUP BY Compras.NumFactura, Compras.Pagada HAVING (((Compras.Pagada)=False));

Hola, esa idea está muy buena, pero tiene el inconveniente de que hay facturas que no se pagan completas y creo que ya no me funcionaria porque en el ejemplo que me pones se supone que se paga la factura completa, mis tablas tienen más o menos esa estructura, una tabla Compras y una Compras_Detalle, al igual que una tabla Pagos y una Pagos_Detalle, y lo que quiero lograr es comparar las facturas que están en la tabla Compras con las que están en la tabla Pagos a través de una consulta, ambas tablas tienen el campo Nro_Factura y a través de ese campo hago la relación en la consulta, pero me da el error que decía en el mensaje anterior, es como decir, esto es lo que compré, de esto pagué tanto y me queda por pagar la diferencia. Aquí te mando fotos con las tablas que quiero utilizar en la consulta. Gracias por tu tiempo.
Saludos

Te sigo diciendo que al no saber como trabajas me tengo que imaginar las cosas. Por ejemplo, vamos a suponer que tengo una tabla Compras y otra Detalle Compras como explicaba arriba.

Si tengo el numero de factura que por definición tiene que ser único e irrepetible(no puede haber dos facturas con el mismo número), ¿para qué necesito más?. Si yo sé tu Documento Nacional de identidad, si voy Al registro Civil, puedo saber donde vives, si tienes hijos etc. Si voy a la Jefatura de Tráfico puedo saber cuántos vehículos, modelos, etc que tienes. Si voy al banco, puedo saber cuantas cuentas tienes, etc. Pues esto es lo mismo, si en una tabla tengo el Num Factura, en las demás puedo sacar los datos que quiera.

Normalmente el "centro de operaciones" es un formulario al que he llamado Principal

En ese combinado me aparecen las facturas que no están totalmente pagadas. Si elijo la 222

Se abre el formulario Pagos(con origen en la tabla Compras, ya que lo que tengo que ir pagando es una Compra). En el subformulario anoto la fecha, lo que pago y en Pendiente me pone la cantidad que me queda por pagar de esa factura.

Cuando Pendiente sea 0, te marca como pagada, en la tabla Compras, esa factura y ya no aparece más como impagada.

¿Qué en un determinado momento quiero saber lo que me falta por pagar de una factura? En el formulario Principal, en el combinado de abajo, elijo una, en este caso la 222, ya que no he rellenado más,

Y cuando la elijo

Que quiero saber cuanto llevo pagado de una factura sin tener que abrir el formulario Pagos, le pongo un combinado como el anterior, etc, etc.

Y con los datos, tal como están, puedes hacer los informes que quieras, compras por mes, entre fechas, pagos por mes, etc, etc.

El código del formulario Principal es

Private Sub ElegirFactura_AfterUpdate()
DoCmd.OpenForm "pagos", , , "numfactura='" & Me.ElegirFactura & "'", , acDialog
End Sub
Private Sub Pendiente_AfterUpdate()
Dim c As Currency
c = DLast("pendiente", "detallepagos", "numfactura='" & Me.Pendiente & "'")
MsgBox "A esta factura aún le queda por pagar " & c & " eurazos", vbOKOnly, "Puedes pagar cuando quieras"
End Sub

Y el código del subformulario DetallePagos es

Private Sub Pagado_AfterUpdate()
DoCmd.RunCommand acCmdSaveRecord
Pendiente = DLookup("totalfactura", "compras", "numfactura='" & Me.NumFactura & "'") - DSum("pagado", "DetallePagos", "numfactura='" & Me.NumFactura & "'")
If Pendiente = 0 Then
DoCmd.RunSQL "update compras set pagada=true where numfactura='" & Me.NumFactura & "'"
End If
Pendiente.SetFocus
End Sub

Vale, te agradezco la idea y el tiempo que me dedicas, pero con esa propuesta tendría que cambiar muchas cosas que ya tengo diseñadas y que funcionan, si estas de acuerdo, mándame una dirección de correo para mandarte la BD completa y veas como está estructurada y así quizás me puedas ayudar a mejorar otras cosas. Saludos y muchas gracias por tu tiempo.

Mi correo es [email protected]

Si la mandas, en el asunto del mensaje pon tu alias Yosvanis, ya que si no sé quien me escribe ni los abro.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas