Facturacion

21/10/2010 - 22:47 por kes | Informe spam
Hola,
Estoy haciendo una base de datos de facturación, que tiene un
funcionamiento de los distintos modelos que se describen en el foro.
Así, la estructura de la base de datos es la siguiente:
- Una tabla CLIENTES con un ID_CLIENTE
- Una tabla FACTURAS con un un N_FACTURA, F_FACTURA y ID_CLIENTE
- Una tabla PEDIDOS con una FECHA, N_FACTURA, ID_CLIENTE, DETALLE,
CANTIDAD, PRECIO, IMPORTE

La operativa es ir introduciendo los pedidos según se van entrando,
pero no se indica en ningún momento el nº de factura, ya que no se
conoce en ese momento. La tabla de clientes también se va alimentando
a medida que entran pedidos.

El tema está en que el procedimiento que he pensado para facturar es
un formulario en el que se selecciona el cliente, se genera un número
de factura, y se indica una fecha de factura, y una fecha de
referencia, de forma que lo que se pretende es que en un subformulario
se muestren todos los pedidos de ese cliente con una fecha anterior a
la fecha de referencia introducida en el formulario. En dicho
subformulario se muestran la fecha del pedido, el detalle, la
cantidad, precio e importe, y en el pie del subformulario se muestra
el total de importe, con el iva y el sumatorio de ambos.

Tengo dos grandes temas que no sé como hacerlos:
1. Me gustaría poder realizar este filtro de datos teniendo en cuenta
el campo de fecha de referencia.
2. Como poner un botón para actualizar el campo N_FACTURA de la tabla
PEDIDOS desde el propio formulario, en función de la información que
se ha cargado.

¿A alguien se le ocurre el cómo?

Muchas gracias

Preguntas similare

Leer las respuestas

#1 José Mª Fueyo
22/10/2010 - 13:02 | Informe spam
Hola
Para filtrar los pedidos pendientes de facturar, basta con que busques
aquellos pedidos que tengan su campo N_FACTURA a nulo.
Podrías crear una tabla que contenga la información necesaria por
cliente y pedido, pendiente de facturar, más un campo tipo si/no que
indicará sí se quiere facturar el pedido o no (así puedes crear
asignar un pedido a una factura u a otra). En el momento en que
cargues tu formulario de facturación, borra todos los registros que
hubiera y agrega los nuevos registros de aquellos pedidos con
N_FACTURA nulo.
Crea un fomulario con los datos de ésta tabla. Este formulario será a
su vez subformulario de otro. Borra el origen de datos de éste
formulario, y configúralo para que no permita agregar.
Crea otro formulario, sin origen de datos, y agregale un combo con el
ID de cliente y su nombre, y un control subformulario.
En el evento click del combo, escribe un código que primero, haga una
sentencia SELECT de todos los campos de la tabla auxiliar que hemos
creado antes usando como criterio el ID de cliente, configuramos a
contiguación el control subformulario estableciendo su propiedad
SourceObject al nombre del formulario con los datos de pedido, y
finalmente la propiedad RecordSource de éste último formulario a la
sentecia SQL que has creado previamente
Algo así a

Dim sSQL As String
sSQL = "select * from MisPedidosCliente " & _
"where IdCliente='" & Me.cbxClientes.Column(0) & "';"
Me.ctlSubDatos.SourceObject = "frmSubDatosPedidos"
Me.ctlSubDatos.Form.RecordSource = sSQL
Me.ctlSubDatos.Form.Refresh

Esto te permitirá filtrar los datos de pedidos por cada cliente
seleccionado en el combo.
Y para facturarlos, usa la propiedad de recordsetclone del
subformulario. Por ejemplo, éste código te revisaría todos los pedidos
del cliente seleccionado, y te diría sí están marcados para facturar o
no. Genera previamente un valor de N_FACTURA y actualiza cada pedido
con dicho valor.

Dim rs As DAO.Recordset
Set rs = Me.ctlSubDatos.Form.RecordsetClone
Do Until rs.EOF
MsgBox "ID Pedido: " & rs.Fields("IdPedido") & ". A facturar:
" & rs.Fields("Facturar")
rs.MoveNext
Loop
Set rs = Nothing

Espero te sirva.

Salu2
José Mª Fueyo
[MS MVP Access]
Respuesta Responder a este mensaje
#2 kes
22/10/2010 - 13:33 | Informe spam
On 22 oct, 13:02, José Mª Fueyo wrote:
Hola
Para filtrar los pedidos pendientes de facturar, basta con que busques
aquellos pedidos que tengan su campo N_FACTURA a nulo.
Podrías crear una tabla que contenga la información necesaria por
cliente y pedido, pendiente de facturar, más un campo tipo si/no que
indicará sí se quiere facturar el pedido o no (así puedes crear
asignar un pedido a una factura u a otra). En el momento en que
cargues tu formulario de facturación, borra todos los registros que
hubiera y agrega los nuevos registros de aquellos pedidos con
N_FACTURA nulo.
Crea un fomulario con los datos de ésta tabla. Este formulario será a
su vez subformulario de otro. Borra el origen de datos de éste
formulario, y configúralo para que no permita agregar.
Crea otro formulario, sin origen de datos, y agregale un combo con el
ID de cliente y su nombre, y un control subformulario.
En el evento click del combo, escribe un código que primero, haga una
sentencia SELECT de todos los campos de la tabla auxiliar que hemos
creado antes usando como criterio el ID de cliente, configuramos a
contiguación el control subformulario estableciendo su propiedad
SourceObject al nombre del formulario con los datos de pedido, y
finalmente la propiedad RecordSource de éste último formulario a la
sentecia SQL que has creado previamente
Algo así a

    Dim sSQL As String
    sSQL = "select * from MisPedidosCliente " & _
           "where IdCliente='" & Me.cbxClientes.Column(0) & "';"
    Me.ctlSubDatos.SourceObject = "frmSubDatosPedidos"
    Me.ctlSubDatos.Form.RecordSource = sSQL
    Me.ctlSubDatos.Form.Refresh

Esto te permitirá filtrar los datos de pedidos por cada cliente
seleccionado en el combo.
Y para facturarlos, usa la propiedad de recordsetclone del
subformulario. Por ejemplo, éste código te revisaría todos los pedidos
del cliente seleccionado, y te diría sí están marcados para facturar o
no. Genera previamente un valor de N_FACTURA y actualiza cada pedido
con dicho valor.

    Dim rs As DAO.Recordset
    Set rs = Me.ctlSubDatos.Form.RecordsetClone
    Do Until rs.EOF
        MsgBox "ID Pedido: " & rs.Fields("IdPedido") & ". A facturar:
" & rs.Fields("Facturar")
        rs.MoveNext
    Loop
    Set rs = Nothing

Espero te sirva.

Salu2
José Mª Fueyo
[MS MVP Access]



Muchas gracias José Mª,
Lo voy a probar a ver qué tal.
La parte primera creo que no me hará falta porque ahora ya estaba
cargando en el subformulario los registros que coincidían en ambas
tablas filtrando porque fueran del mismo cliente y que el campo
N_FACTURA esté en blanco, pero la verdad es que la forma en que me lo
propones la veo correcta también.
Seguramente me va a costar un poco la parte del RecordsetClone, ya que
no lo he probado nunca, pero... ¡¡¡¡siempre hay una primera vez!!!!

¡¡¡¡¡Muchas gracias de nuevo, y manos a la obra!!!!!!

kes
Respuesta Responder a este mensaje
#3 kes
24/10/2010 - 20:50 | Informe spam
On 22 oct, 13:33, kes wrote:
On 22 oct, 13:02, José Mª Fueyo wrote:





> Hola
> Para filtrar los pedidos pendientes de facturar, basta con que busques
> aquellos pedidos que tengan su campo N_FACTURA a nulo.
> Podrías crear una tabla que contenga la información necesaria por
> cliente y pedido, pendiente de facturar, más un campo tipo si/no que
> indicará sí se quiere facturar el pedido o no (así puedes crear
> asignar un pedido a una factura u a otra). En el momento en que
> cargues tu formulario de facturación, borra todos los registros que
> hubiera y agrega los nuevos registros de aquellos pedidos con
> N_FACTURA nulo.
> Crea un fomulario con los datos de ésta tabla. Este formulario será a
> su vez subformulario de otro. Borra el origen de datos de éste
> formulario, y configúralo para que no permita agregar.
> Crea otro formulario, sin origen de datos, y agregale un combo con el
> ID de cliente y su nombre, y un control subformulario.
> En el evento click del combo, escribe un código que primero, haga una
> sentencia SELECT de todos los campos de la tabla auxiliar que hemos
> creado antes usando como criterio el ID de cliente, configuramos a
> contiguación el control subformulario estableciendo su propiedad
> SourceObject al nombre del formulario con los datos de pedido, y
> finalmente la propiedad RecordSource de éste último formulario a la
> sentecia SQL que has creado previamente
> Algo así a

>     Dim sSQL As String
>     sSQL = "select * from MisPedidosCliente " & _
>            "where IdCliente='" & Me.cbxClientes.Column(0) & "';"
>     Me.ctlSubDatos.SourceObject = "frmSubDatosPedidos"
>     Me.ctlSubDatos.Form.RecordSource = sSQL
>     Me.ctlSubDatos.Form.Refresh

> Esto te permitirá filtrar los datos de pedidos por cada cliente
> seleccionado en el combo.
> Y para facturarlos, usa la propiedad de recordsetclone del
> subformulario. Por ejemplo, éste código te revisaría todos los pedidos
> del cliente seleccionado, y te diría sí están marcados para facturar o
> no. Genera previamente un valor de N_FACTURA y actualiza cada pedido
> con dicho valor.

>     Dim rs As DAO.Recordset
>     Set rs = Me.ctlSubDatos.Form.RecordsetClone
>     Do Until rs.EOF
>         MsgBox "ID Pedido: " & rs.Fields("IdPedido") & ". A facturar:
> " & rs.Fields("Facturar")
>         rs.MoveNext
>     Loop
>     Set rs = Nothing

> Espero te sirva.

> Salu2
> José Mª Fueyo
> [MS MVP Access]

Muchas gracias José Mª,
Lo voy a probar a ver qué tal.
La parte primera creo que no me hará falta porque ahora ya estaba
cargando en el subformulario los registros que coincidían en ambas
tablas filtrando porque fueran del mismo cliente y que el campo
N_FACTURA esté en blanco, pero la verdad es que la forma en que me lo
propones la veo correcta también.
Seguramente me va a costar un poco la parte del RecordsetClone, ya que
no lo he probado nunca, pero... ¡¡¡¡siempre hay una primera vez!!!!

¡¡¡¡¡Muchas gracias de nuevo, y manos a la obra!!!!!!

kes



Hola Jose Mª,
Hay algo que no estoy haciendo bien. Ya tengo el formulario montado de
forma que al seleccionar un cliente me aparecen todos sus servicios
pendientes de facturar.
Así, he creado un botón al que le he asociado el siguiente código en
el evento clik

Private Sub facturar_Click()
Dim rs As DAO.Recordset
Set rs = Me.Subformulario_Detalle_Factura.Form.RecordsetClone
Do Until rs.EOF
MsgBox "Nº de factura: " & rs.Fields("n_factura") & ". A
facturar: "" & rs.Fields("n_factura")
rs.MoveNext
Loop
Set rs = Nothing

End sub

Pero no me valida la línea MsgBox "Nº de factura: " &
rs.Fields("n_factura") & ". A facturar: "" & rs.Fields("n_factura") y
tampoco entiendo que este código me vaya a actualizar el campo
n_factura del subformulario, que es precisamente lo que estoy
buscando.

¿Qué hago mal? ¿O estoy entendiendo algo mal?

Muchas gracias y un saludo

kes
Respuesta Responder a este mensaje
#4 kes
26/10/2010 - 09:02 | Informe spam
On 24 oct, 20:50, kes wrote:
On 22 oct, 13:33, kes wrote:





> On 22 oct, 13:02, José Mª Fueyo wrote:

> > Hola
> > Para filtrar los pedidos pendientes de facturar, basta con que busques
> > aquellos pedidos que tengan su campo N_FACTURA a nulo.
> > Podrías crear una tabla que contenga la información necesaria por
> > cliente y pedido, pendiente de facturar, más un campo tipo si/no que
> > indicará sí se quiere facturar el pedido o no (así puedes crear
> > asignar un pedido a una factura u a otra). En el momento en que
> > cargues tu formulario de facturación, borra todos los registros que
> > hubiera y agrega los nuevos registros de aquellos pedidos con
> > N_FACTURA nulo.
> > Crea un fomulario con los datos de ésta tabla. Este formulario será a
> > su vez subformulario de otro. Borra el origen de datos de éste
> > formulario, y configúralo para que no permita agregar.
> > Crea otro formulario, sin origen de datos, y agregale un combo con el
> > ID de cliente y su nombre, y un control subformulario.
> > En el evento click del combo, escribe un código que primero, haga una
> > sentencia SELECT de todos los campos de la tabla auxiliar que hemos
> > creado antes usando como criterio el ID de cliente, configuramos a
> > contiguación el control subformulario estableciendo su propiedad
> > SourceObject al nombre del formulario con los datos de pedido, y
> > finalmente la propiedad RecordSource de éste último formulario a la
> > sentecia SQL que has creado previamente
> > Algo así a

> >     Dim sSQL As String
> >     sSQL = "select * from MisPedidosCliente " & _
> >            "where IdCliente='" & Me.cbxClientes.Column(0) & "';"
> >     Me.ctlSubDatos.SourceObject = "frmSubDatosPedidos"
> >     Me.ctlSubDatos.Form.RecordSource = sSQL
> >     Me.ctlSubDatos.Form.Refresh

> > Esto te permitirá filtrar los datos de pedidos por cada cliente
> > seleccionado en el combo.
> > Y para facturarlos, usa la propiedad de recordsetclone del
> > subformulario. Por ejemplo, éste código te revisaría todos los pedidos
> > del cliente seleccionado, y te diría sí están marcados para facturar o
> > no. Genera previamente un valor de N_FACTURA y actualiza cada pedido
> > con dicho valor.

> >     Dim rs As DAO.Recordset
> >     Set rs = Me.ctlSubDatos.Form.RecordsetClone
> >     Do Until rs.EOF
> >         MsgBox "ID Pedido: " & rs.Fields("IdPedido") & ". A facturar:
> > " & rs.Fields("Facturar")
> >         rs.MoveNext
> >     Loop
> >     Set rs = Nothing

> > Espero te sirva.

> > Salu2
> > José Mª Fueyo
> > [MS MVP Access]

> Muchas gracias José Mª,
> Lo voy a probar a ver qué tal.
> La parte primera creo que no me hará falta porque ahora ya estaba
> cargando en el subformulario los registros que coincidían en ambas
> tablas filtrando porque fueran del mismo cliente y que el campo
> N_FACTURA esté en blanco, pero la verdad es que la forma en que me lo
> propones la veo correcta también.
> Seguramente me va a costar un poco la parte del RecordsetClone, ya que
> no lo he probado nunca, pero... ¡¡¡¡siempre hay una primera vez!!!!

> ¡¡¡¡¡Muchas gracias de nuevo, y manos a la obra!!!!!!

> kes

Hola Jose Mª,
Hay algo que no estoy haciendo bien. Ya tengo el formulario montado de
forma que al seleccionar un cliente me aparecen todos sus servicios
pendientes de facturar.
Así, he creado un botón al que le he asociado el siguiente código en
el evento clik

Private Sub facturar_Click()
 Dim rs As DAO.Recordset
   Set rs = Me.Subformulario_Detalle_Factura.Form.RecordsetClone
   Do Until rs.EOF
       MsgBox "Nº de factura: " & rs.Fields("n_factura") & ". A
facturar: "" & rs.Fields("n_factura")
       rs.MoveNext
   Loop
   Set rs = Nothing

End sub

Pero no me valida la línea MsgBox "Nº de factura: " &
rs.Fields("n_factura") & ". A facturar: "" & rs.Fields("n_factura") y
tampoco entiendo que este código me vaya a actualizar el campo
n_factura del subformulario, que es precisamente lo que estoy
buscando.

¿Qué hago mal? ¿O estoy entendiendo algo mal?

Muchas gracias y un saludo

kes



Estoy probando otra opción, pero no me acaba de funcionar bien, ya que
he conseguido que me actualice el origen de datos del subformulario,
pero no de la forma que quería. Supongo que debo ajustar la SQL para
que funcione bien, pero no sé si le estoy pasando bien los parámetros
que estarán en el formulario.
El código que he puesto es el siguiente:

Private Sub cmd_guardafactura_Click()
Dim actualiza_n_factura As String

actualiza_n_factura = "UPDATE (Servicios INNER JOIN Clientes ON
Servicios.Cliente = Clientes.id_cliente_agrup) LEFT JOIN Facturas ON
Clientes.id_cliente_agrup = Facturas.Cliente SET Servicios.Cerrado -1, Servicios.n_factura = [Facturas].[n_factura] WHERE
(((Servicios.Cerrado) = 0) AND ((Servicios.n_factura) Is Null) AND
((Clientes.id_cliente_agrup)=[forms].[Factura].[Cliente]));"

DoCmd.RunSQL (actualiza_n_factura)
End Sub

¿Voy por el buen camino?

Muchas gracias

kes
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida