Consulta de actualización.

Recientemente un experto me dejó una instrucción con la cual podía actualizar en determinados registros que estén entre un periodo de fechas una campo llamado numfactura y ademas ese registro lo marca para no volver a actualizarle en veces posteriores, funciona muy bien, lo dejo aquí para que veas, pero me ha surgido una duda.
UPDATE factura SET factura.NumFactura = Nz(DMax("NumFactura","factura"),0)+1, Reserva.FacturaCreada = Yes
WHERE (((factura.NumFactura) Is Null) And ((factura.cliente)="Uxue") And ((factura.FacturarRemesa)=Yes) And ((factura.Fechaalbaran) Between Formularios!frmVentas!DesdeFecha And Formularios!frmVentas!HastaFecha));
Como hago para poner en los registros que me pone el numero de factura que me ponga también la fecha del sistema que tenga ese día.
La respuesta fue:
UPDATE factura SET factura.NumFactura = Nz(DMax("NumFactura","factura"),0)+1, Reserva.FacturaCreada = Yes, fecFactura= Date()
WHERE (((factura.NumFactura) Is Null) And ((Reserva.cliente)="Uxue") And ((factura.FacturarRemesa)=Yes) And ((factura.Fechaalbaran) Between Formularios!frmVentas!DesdeFecha And Formularios!frmVentas!HastaFecha));
Y me va perfecto, pero tengo un campo de una tabla que esta vinculada a factura y que se llama detallefactura, el cual contiene un campo fechapedido.
¿Puedo hacer el mismo efecto sustituyendo el campo FecFactura por el campo fechapedido que esta en otra tabla diferente a de factura, o sea, detallefactura?

1 respuesta

Respuesta
1
Para poder actualizar otra tabla es necesario definir la relación entre las dos tablas, mediante un campo llave, suponiendo que tu campo llave es IdFactura la consulta seria más o menos así:
UPDATE factura INNER JOIN DetalleFactura on Factura.IdFactura = DetalleFactura.IdFactura SET factura.NumFactura = Nz(DMax("NumFactura","factura"),0)+1, Reserva.FacturaCreada = Yes, fecFactura= Date(), DetalleFactura.FechaPedido=Date()
WHERE (((factura.NumFactura) Is Null) And ((Reserva.cliente)="Uxue") And ((factura.FacturarRemesa)=Yes) And ((factura.Fechaalbaran) Between Formularios!frmVentas!DesdeFecha And Formularios!frmVentas!HastaFecha));
Lo siento algo no me va bien y creo que es porque no me explicado bien.
Con la primera respuesta que me diste y que es la siguiente:
UPDATE factura SET factura.NumFactura = Nz(DMax("NumFactura","factura"),0)+1, factura.FacturaCreada = Yes, fecFactura= Date()
WHERE (((factura.NumFactura) Is Null) And ((factura.cliente)="Uxue") And ((factura.FacturarRemesa)=Yes) And ((factura.Fechaalbaran) Between Formularios!frmVentas!DesdeFecha And Formularios!frmVentas!HastaFecha));
Va todo perfecto, porque lo que consigo en ella es que desde el formulario ventas (frmventas) al introducir un rango de fechas (desde - hasta) asigno un numero de factura a los albaranes que pertenecen al mismo cliente dentro de un periodo de tiempo.
Mi objetivo ahora es conseguir lo mismo pero en vez de filtrar del campo fechaalbaran de la tabla factura desde el campo FechaPedido que esta en la tabla DetallePedido como te comente por segunda vez. Las dos tablas las tengo relacionadas con un idfactura como me comentas.
Disculpa que me explicara antes tan mal y gracias por tu paciencia.
Nada que disculpar, porque también en necesario definir la relación y se realiza de la misma manera, entonces la consulta quedaría +/- así:
UPDATE factura INNER JOIN DetalleFactura on Factura.IdFactura = DetalleFactura.IdFactura SET factura.NumFactura = Nz(DMax("NumFactura","factura"),0)+1, Reserva.FacturaCreada = Yes, fecFactura= Date()
WHERE (((factura.NumFactura) Is Null) And ((Reserva.cliente)="Uxue") And ((factura.FacturarRemesa)=Yes) And ((DetalleFactura.FechaPedido) Between Formularios!frmVentas!DesdeFecha And Formularios!frmVentas!HastaFecha));
Perfecto.
Mi ultima duda.
Para que todo esto se ejecute tengo en un formulario dos campos fecha (que quiero estén asociado al campo Fechapedido de la tabla DetallePedido y tengo un botón al cual al hacer click me ejecuta este código que te paso pero me da error, ¿podrías decirme algo?
CurrentDb.Execute "UPDATE factura SET factura.NumFactura = " & varContador & ", factura.FacturaCreada = Yes,FechaFac = Date() WHERE (((factura.NumFactura) Is Null) AND ((factura.NomComer)='" & rst("NomComer") & "' )AND ((factura.FacturarRemesa)=Yes) AND ((factura.FechaAlbaran) Between # " & Forms("frmVentas").Controls("DesdeFecha") & " # And # " & Forms("frmVentas").Controls("HastaFecha") & " # ))"
Hay una parte del código que no esta si la necesitas te la puedo pasar también.
Muchas gracias de nuevo por toda la ayuda que estas prestando.
Saludos.
Primero habría que saber que tipo de error, sin embargo puedo decirte algo, hay unos espacios entre los caracteres ##, el para metro que esta pasando es # 28/04/2009 # y debería ser #28/04/2009#, esos espacios convierten a al fecha en un String
algo más, el campo fecha para pasarlo como parámetro en un consulta debe tener el formato mm/dd/aaaa, por lo que en la consulta deberías aplicar un format, +/- así:
...Between #" & Format(Forms("frmVentas").Controls("DesdeFecha"),"MM/DD/YYYY") & "# And ...
Lo mismo para la fecha hasta.
Hola de nuevo... después de hacer varias pruebas no consigo que funcione.
Voy a hacer un nuevo intento cambiando el enfoque actual. Hasta ahora e intentado
aprender pero no quiero acaparar tu tiempo pues creo que se lo debes dedicar a más personas como yo.
Así, voy a hacerte un planteamiento simplificado no sin antes agradecerte de nuevo tu tiempo, paciencia, etc...
El planteamineto es el siguiente:
Tengamos 2 tablas:
Tabla ventas con los campos siguientes:
albaran, cliente, fechaalbaran, facturacreada, fecha, numerofactura y facturaremesa.
Tabla detalleventas:
albaran, producto, unidades,fechaentrega.
Con ellas tengo 2 consultas:
qryCrearFac con la consulta siguiente:
UPDATE tbVentas SET tbVentas.NumFactura = Nz(DMax("NumFactura","tbVentas"),0)+1, tbVentas.FacturaCreada = Yes
WHERE (((tbVentas.NumFactura) Is Null) And ((tbVentas.Cliente)="Uxue") And ((tbVentas.FacturarRemesa)=Yes) And ((tbVentas.Fecha) Between Formularios!frmVentas!DesdeFecha And Formularios!frmVentas!HastaFecha));
qryverificarAlbaranes con la consulta siguiente:SELECT tbVentas.NumFactura, tbVentas.FacturaCreada, tbVentas.Cliente, tbVentas.FacturarRemesa
FROM tbVentas
WHERE (((tbVentas.Fecha) Between Formularios!frmVentas!DesdeFecha And Formularios!frmVentas!HastaFecha))
GROUP BY tbVentas.NumFactura, tbVentas.FacturaCreada, tbVentas.Cliente, tbVentas.FacturarRemesa
HAVING (((tbVentas.NumFactura) Is Null) AND ((tbVentas.FacturarRemesa)=Yes));
también hay un formulario que contiene 2 campos independientes en los que introduzco
Desde fecha
Hasta fecha
Quiero que esos campos actúen sobre la fechaentrega de la tabla detalleventas
Y para terminar un botón de comando en el cual con el evento al hacer click tiene el procedimiento:
Private Sub Comando21_Click()
'Nos pregunta si deseamos crear factura, SI continua el codigo, No se detiene
Dim resp As Integer
resp = MsgBox("¿Vas a crear las facturas, deseas continuar?", vbYesNo + vbQuestion, "ATENCION")
If resp = vbYes Then
'Esta recordset con la consulta(sacada de qryVerificarAlbaranes) muestra si hay clientes con albaranes pendientes de facturar
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("SELECT tbVentas.NumFactura, tbVentas.FacturaCreada, tbVentas.Cliente, tbVentas.FacturarRemesa FROM tbVentas WHERE (((tbVentas.Fecha) Between # " & Forms("frmVentas").Controls("DesdeFecha") & " # And # " & Forms("frmVentas").Controls("HastaFecha") & " # ))GROUP BY tbVentas.NumFactura, tbVentas.FacturaCreada, tbVentas.Cliente, tbVentas.FacturarRemesa HAVING (((tbVentas.NumFactura) Is Null)AND((tbVentas.FacturarRemesa)=Yes))")
'Aqui verificamos si la consulta del recordset anterior tiene registros.
If rst.RecordCount = 0 Then  ' Si no hay registros nos avisa de que no hay nada que facturar
MsgBox "No hay nada que facturar"
Else
While rst.EOF = False    'Abre el bucle, mientras sea False se ejecuta???Cuando en el recordset no hay registros sera True y saldra del bucle??
'MsgBox " " & rst("Cliente") & " "  'Esto es para probar que clientes va facturando, ira saltando de 1 en 1
Dim varContador    'En esta variable ponemos el DMax ya que en la consulta parece que da error
varContador = Nz(DMax("NumFactura", "tbVentas"), 0) + 1
'Esta es la consulta de actualizacion(sacada de qryCrearFAC) que nos pone el NumFactura y facturado en True
CurrentDb.Execute "UPDATE tbVentas SET tbVentas.NumFactura = " & varContador & ", tbVentas.FacturaCreada = Yes WHERE (((tbVentas.NumFactura) Is Null) AND ((tbVentas.Cliente)='" & rst("Cliente") & "' )AND ((tbVentas.FacturarRemesa)=Yes) AND ((tbVentas.Fecha) Between # " & Forms("frmVentas").Controls("DesdeFecha") & " # And # " & Forms("frmVentas").Controls("HastaFecha") & " # ))"
'Aqui tambien podria ir la consulta co set wuarnig False, true
rst.MoveNext
Wend
rst.Close
Set rst = Nothing
MsgBox "Las facturas se han creado."
End If
End If
End Sub
Mi necesidad es la de que al generar la factura como lo hace hasta, pero en vez de consultando la fechaalbaran de la tabla ventas, lo haga sobre
el campo fechaentrega de la tabla detalleventas, ya que necesito facturar sobre la entrega de material.
Muchísimas gracias de nuevo por todo.
Saludos.
Disculpa pero me perdí en el problema, me gustaría saber, si es posible, cual es la instrucción que no esta funcionando, que error te da, o en cual de las consultas necesitas remplazar el campo que dices
Hola de nuevo.
Las consultas me funcionan, ok. El problema ahora lo tengo en estas dos instrucciones que deben actuar en el evento onclick de un botón de comando de un formulario después de escribir un rango de fechas correspondiente al campo fechaentrega de la tabla detalleventas (desde, hasta)
Instrucción 1ª:
Set rst = CurrentDb.OpenRecordset("SELECT tbVentas.NumFactura, tbVentas.FacturaCreada, tbVentas.Cliente, tbVentas.FacturarRemesa FROM tbVentas WHERE (((tbVentas.Fecha) Between # " & Forms("frmVentas").Controls("DesdeFecha") & " # And # " & Forms("frmVentas").Controls("HastaFecha") & " # ))GROUP BY tbVentas.NumFactura, tbVentas.FacturaCreada, tbVentas.Cliente, tbVentas.FacturarRemesa HAVING (((tbVentas.NumFactura) Is Null)AND((tbVentas.FacturarRemesa)=Yes))")
Instruccion 2ª
'Esta es la consulta de actualizacion(sacada de qryCrearFAC) que nos pone el NumFactura y facturado en True
CurrentDb.Execute "UPDATE tbVentas SET tbVentas.NumFactura = " & varContador & ", tbVentas.FacturaCreada = Yes WHERE (((tbVentas.NumFactura) Is Null) AND ((tbVentas.Cliente)='" & rst("Cliente") & "' )AND ((tbVentas.FacturarRemesa)=Yes) AND ((tbVentas.Fecha) Between # " & Forms("frmVentas").Controls("DesdeFecha") & " # And # " & Forms("frmVentas").Controls("HastaFecha") & " # ))"
Muchas gracias.
En el Caso de la Primera instrucción para que la consulta de fechas las realizae sobre la fecha de entrega de la tabla detalleventas y suponiendo que la relación entre las dos tablas es el campo IdVentas, la instrucción debe quedar algo así:
Set rst = CurrentDb.OpenRecordset("SELECT tbVentas.NumFactura, tbVentas.FacturaCreada, tbVentas.Cliente, tbVentas.FacturarRemesa FROM tbVentas INNER JOIN detalleventas on tvVentas.IdVentas = DetalleVentas.IdVentas WHERE (((DetalleVentas.Fechaentrega) Between # " & Forms("frmVentas").Controls("DesdeFecha") & " # And # " & Forms("frmVentas").Controls("HastaFecha") & " # ))GROUP BY tbVentas.NumFactura, tbVentas.FacturaCreada, tbVentas.Cliente, tbVentas.FacturarRemesa HAVING (((tbVentas.NumFactura) Is Null)AND((tbVentas.FacturarRemesa)=Yes))")
algo similar para la 2º instruccion:
CurrentDb.Execute "UPDATE tbVentas INNER JOIN detalleventas on tvVentas.IdVentas = DetalleVentas.IdVentas SET tbVentas.NumFactura = " & varContador & ", tbVentas.FacturaCreada = Yes WHERE (((tbVentas.NumFactura) Is Null) AND ((tbVentas.Cliente)='" & rst("Cliente") & "' )AND ((tbVentas.FacturarRemesa)=Yes) AND ((DetalleVentas.Fechaentrega) Between # " & Forms("frmVentas").Controls("DesdeFecha") & " # And # " & Forms("frmVentas").Controls("HastaFecha") & " # ))"
Hola de nuevo.
La ultima respuesta ha sido perfecta... Muchas gracias... De verdad.
Me va todo perfecto. Solo que me ha surgido una pega.
Cuando relleno el formulario "albaran" relleno un campo que es precio y ademas tiene de subformulario "detalle de albarán". Si relleno más de una fila en subformulario "detallle de albarán", como el importe lo tengo en albarán al combinar ambos campos en un informe, me repite la fila en la factura y me la suma 2 veces el campo importe. ¿Puedo decirle a un informe de alguna manera que si un existe un valor duplicado en un campo concreto que ignore alguno de ellos? ¿O qué muestre solo uno de los valores repetidos? Yo he visto una pcion donde en las consultas se puede estable una propiedad que es valores únicos (si/no) pero no me funciona.
Alguna idea.
Muchas gracias por hacerme más liviano todos estos problemas.
Un saludo..
Tendrías que usar una consulta de datos agregados, y tendrías que definir los campos por los cuales agrupar y de los otros si necetitas el primer, máximo u otro valor agregado.
Otra forma es, en el reporte agrupar por algún criterio, mostrar estos datos agrupados y ocultar los detalles, así no los duplicados no se verán.
Hola...
Sobre tu último aporte, creo que voy a trabajar sobre el reporte, me parece que puede ser más fácil que con las consultas visto lo que me ha costado solucionar mi ultima pega, aunque esto puedo tomármelo con más tranquilidad.
De cualquier forma quería finalizar la batería de preguntas que te he venido consultando, no sin antes agradecerte nuevamente tu inestimable ayuda. Te estoy altamente agradecido.
Muchas gracias por todo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas