Formulario.

Tengo una lina en vb que me actualiza los datos de una tabla agrupándola por cliente y que es la siguiente:
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") & " # ))"
Es decir, me agrupa en función del intervalo introducido las facturas clientes si esta marcado el control FacturaRemesa que es un campo Si/No.
Yo quiero que me haga lo mismo pero sin agrupar por clientes. Es decir, cada registro quiero que tenga un numero que sea también consecutivo sin tener en cuenta el cliente.
¿Sabrías decirme como?
1

1 Respuesta

23.175 pts. Access. Monopuesto y multipuesto. Más de 13 años de...
Perdona, pero no te entiendo cuando dices que sin agrupar por clientes, que cada registro tenga un numero consecutivo sin tener el cuenta el cliente.
Puedes explicarlo mejor. Quizá con un ejemplo del resultado de la consulta que me pones aquí y de como te gustaría que saliera.
Disculpa si no explique bien...
Actualmente consigo que me introduzca los datos en una tabla de la siguiente manera:
Id Cliente             Fecha             FacturaCreada NumFactura FacturarRemesa FechaFactura
1  Pepe Lopez      27/05/2009           -1                      2                     -1
2  Juan Martinez   27/05/2009           -1                      1                     -1
3  Uxue Lolo         27/05/2009           -1                      3                     -1
4  Pepe Lopez      27/05/2009           -1                      2                     -1
5  Juan Martinez   27/05/2009           -1                      1                     -1
6  Uxue Lolo         27/05/2009           -1                      3                      -1
7  Juan Martinez  27/05/2009            -1                      1                     -1
8  Uxue Lolo        30/05/2009            -1                      3                      -1
Todo esto al pulsar un botón de comando y filtrando por dos campos de fecha....
Ahora lo que necesito es que al pulsar ese botón me continué colocando un Numero de Factura por registro y teniendo en cuenta el periodo de fecha introducido en dos campos fecha que tengo actualmente.
Si quieres te paso el codigo completo de lo que tengo.
El coidgo completo del boton es el siguiente te lo paso por si lo necesitas:
'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
Muchas gracias por tu interés.
Aparentemente está bien y debería hacerlo tal y como lo tienes.
Si como creo que entiendo no quieres que te agrupe por cliente, quítale la clausula GROUP BY de la consulta que realizas con rst. Es decir, ahora sacas con esa consulta tantos registros como registros cumplen tus condiciones y los agrupas por clientes. Deshaz esa agrupación para que te de tantos registros como lineas tienes que facturar. La consulta posterior de actualización parece que está bien y no te debería dar problemas.
Lo que no me gusta es que definas la variable contador dentro del buble While... Wend. Sácalo del bucle y dentro de él limítate a incrementarle el valor de uno. Prueba eso y dime qué errores te salen.
Buenos días experto...
El problema esta en que esto me lo paso en su día un experto y no donde ni como debo tocar para dejarlo bien.
Si es posible. ¿Me podrías poner las consultas como deben quedar?
Muchas gracias por todo.
Perdona pero dándole vueltas otra vez sigo sin entender.
Dices que: "me continué colocando un Numero de Factura por registro". Sin embargo, tu consulta ya hace eso, te coloca un numero en todos los registros que aun te quedan por facturar y te lo agrupa por clientes. En la tabla de arriba, A pepe Lopez le creas la factura 2 para todo lo que te quedaba pendiente de facturar.
Por lo tanto, ahora cual es el numero que quieres que te ponga. ¿Me pones un ejemplo en esa misma tabla, por favor, de como debería quedar al final?
Hola de nuevo experto.
Actualmente esta para que numere de esta manera como sabes
Id Cliente             Fecha             FacturaCreada NumFactura FacturarRemesa FechaFactura
1  Pepe Lopez      27/05/2009           -1                      2                     -1
2  Juan Martinez   27/05/2009           -1                      1                     -1
3  Uxue Lolo         27/05/2009           -1                      3                     -1
4  Pepe Lopez      27/05/2009           -1                      2                     -1
5  Juan Martinez   27/05/2009           -1                      1                     -1
6  Uxue Lolo         27/05/2009           -1                      3                      -1
7  Juan Martinez  27/05/2009            -1                      1                     -1
8  Uxue Lolo        30/05/2009            -1                      3                      -1
Y yo quiero que sea de este otro modo:
Id Cliente             Fecha             FacturaCreada NumFactura FacturarRemesa FechaFactura
1  Pepe Lopez      27/05/2009           -1                      1                     -1
2  Juan Martinez   27/05/2009           -1                      2                     -1
3  Uxue Lolo         27/05/2009           -1                      3                     -1
4  Pepe Lopez      27/05/2009           -1                      4                     -1
5  Juan Martinez   27/05/2009           -1                      5                     -1
6  Uxue Lolo         27/05/2009           -1                      6                      -1
7  Juan Martinez  27/05/2009            -1                      7                     -1
8  Uxue Lolo        30/05/2009            -1                      8                      -1
Quiero que cada registro (para que me entiendas, fila) tenga un numero de factura.
Muchas gracias de nuevo y disculpa si no me explico muy bien.
Un saludo.
Ok. Ya lo entendí.
Substituye tu código por este:
If MsgBox("¿Vas a crear las facturas, deseas continuar?", vbYesNo + vbQuestion, "ATENCION") = vbYes Then
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("SELECT tbVentas.NumFactura, tbVentas.FacturaCreada, tbVentas.FacturarRemesa " & _
    "FROM tbVentas " & _
    "WHERE (((tbVentas.Fecha) Between # " & Forms("frmVentas").Controls("DesdeFecha") & " # And # " & Forms("frmVentas").Controls("HastaFecha") & " # )) AND (((tbVentas.NumFactura) Is Null) AND ((tbVentas.FacturarRemesa)=Yes));")
If rst.RecordCount = 0 Then
    MsgBox "No hay nada que facturar"
Else
    Dim varContador
    varContador = Nz(DMax("NumFactura", "tbVentas"), 0) + 1
    While rst.EOF = False
        rst.NumFactura = varContador
        rst.Update
        varContador = varContador + 1
        rst.MoveNext
    Wend
    rst.Close
    Set rst = Nothing
    MsgBox "Las facturas se han creado."
End If
End If
End Sub
Hola de nuevo.
Al pulsar sobre el botón de comando me aparece una ventana con error que dice lo siguiente:
Error de compilación: No se encontró el método o el dato miembro
Y en la ventana Visual Basic aparece marcada la linea:
rst.NumFactura = varContador
Y no continua trabajando.
¿Sabrías por qué sale ese error?
Disculpa las molestias.
El trozo en cuestión sería:
Rst. Edit
rst!NumFactura = varContador
rst.Update
Añade la primera linea y modifica el punto por la exclamación. Perdona las molestias.
Muchas gracias... Funciona perfecto.
Una ultima pregunta...
¿Es posible que me añada también la fecha del día?
Muchas gracias de nuevo por todo.
Si. Claro. Entonces sería:
Rst. Edit
rst!NumFactura = varContador
rst!Fecha=Date()
rst.Update
Hola de nuevo experto...
Al poner las lineas nuevas me abre una ventana de visual basic y se marca la linea
rst! Fecha=Date()
De color amarillo y ademas los paréntesis desaparecen solos.
¿Sabrías por qué?
Muchas gracias por todo tu interés y disculpa todas las molestias que te estoy causando.
Perdona, es sin paréntesis.
Te pone eso porque en la consulta no seleccionamos el campo fecha.
Cambia la instrucción por esto:
Set rst = CurrentDb.OpenRecordset("SELECT tbVentas.NumFactura, tbVentas.Fecha, tbVentas.FacturaCreada, tbVentas.FacturarRemesa " & _
    "FROM tbVentas " & _
    "WHERE (((tbVentas.Fecha) Between # " & Forms("frmVentas").Controls("DesdeFecha") & " # And # " & Forms("frmVentas").Controls("HastaFecha") & " # )) AND (((tbVentas.NumFactura) Is Null) AND ((tbVentas.FacturarRemesa)=Yes));")
El resto igual.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas