Instanciar n veces un formulario factura que contiene un subformulario factdetalle.

Es interesante cuanto conocimiento hay por acá.

Hoy requiero de vuestra colaboración para poder instanciar un Formulario llamado Factura el cual contiene un subformulario llamado FactDetalle.

El hecho es que aveces requiero en mi negocio hacer una factura, y mientas estamos en eso, el cliente se antoja de otro producto y por tanto deja la caja va y toma su otro producto, me gustaría aquí, poder dejar esa factura abierta y poder generar otra factura al cliente que sigue en la cola, y cuando el cliente uno regrese, retomar la factura de el que ya esta iniciada...

2 Respuestas

Respuesta

Para este caso no creo que se pueda clonar el formulario porque tiene un subformulario. Le cuento como lo hago:

Observe que tengo un botón "Postergar Factura" y otro "Continuar factura" (se puede hacer en uno solo cambiando el texto y color). Si hago clic en postergar factura obtengo el siguiente mensaje:

Hago clic en Si y obtengo:

Con esto queda listo el formulario para hacer otra venta, si inicio otra venta y no se ha completado y hago clic en "Continuar factura", obtengo el siguiente mensaje:

PASOS

Utilizo 3 tablas temporales, así :

1 para el detalle de la factura

1 para guardar temporalmente el encabezado

1 para guardar temporalmente los artículos del detalle.

PROCESO

Para guardar la factura temporalmente hago:

- Copio la información del encabezado en la tabla temporal encabezado, lo hago con INSERT INTO..

- Copio todos los registros de la tabla detalle a la tabla temporal detalle, igualmente con INSERT INTO...

- Retiro los datos de las tablas encabezado y detalle, hago un requey

- Para continuar con la factura tomo el contenido de los campos de la tabla temporal encabezado y lleno el encabezado. Lo hago con DAO, por ejemplo:

Set rs = db.OpenRecordset("tblTemCabeceraFactura")
Me.opcTipo = rs!mopctipo
Me.FechaEntrega = rs!mfechaentrega
Me.cboVenta = rs!mcboventa
Me.cboFormaPago = rs!mcboformapago
Me.cboEmpleado = rs!mcboempleado

Después hago un INSERT INTO ... a la tabla inicial de la factura desde la tabla temporal del detalle de la factura. Algo como:

DoCmd.RunSQL "DELETE FROM tblTemArticulosFactura"
DoCmd.RunSQL "INSERT INTO tblTemArticulosFactura SELECT tblPosrtergaArticulosFactura.* FROM tblPosrtergaArticulosFactura;"
DoCmd. RunSQL "DELETE FROM tblPosrtergaArticulosFactura"
DoCmd. RunSQL "DELETE FROM tblTemCabeceraFactura"

Esto permite trabajar sin problemas en un entorno multiusuario (lo hago con PostgreSQL), pero todo lo manejo desde Access.

Bueno puede que existan más opciones, serán bien recibidas.

Una reflexión:

1. ¿Qué pasa si el cliente vuelve y no sigue la compra, es decir, la cancela?. En este caso con formularios dependientes YA está registrada la compra.

2. ¿Qué pasa con el número de factura?. Está perdiendo un número consecutivo, lo cual es grave porque en algunos casos la numeración la asigna la Dirección de impuestos.

3. ¿Qué pasa si tengo 2 o más puntos de venta y se aplaza una venta en 2 puntos o más?. El primero que continúe registrando una venta podría tomar la última factura que no corresponde al punto de venta. Esto podría solucionarse registrando también el nombre del punto de venta.

4. ¿Se puede aplazar más de una venta?

Respuesta

Sería interesante que definieras cuando das por terminada una factura. Si cuando le cobras, o...

Por ejemplo, supongamos que tengo la tabla Ventas a la que le he añadido un campo Cobrada(si/no), que además me serviría para saber si alguna me ha quedado sin cobrar. Tengo un formulario Ventas con un subformulario Detalleventa

Según dices, el cliente va a buscar otra cosa y mientras voy a atender a otro u otros. Pulso el botón Cliente Nuevo y se va a un registro nuevo

Relleno los datos de este cliente y como supongo que le has cobrado, marco la casilla cobrada( aunque no sería necesario dependiendo de la forma de cobro)

Y al pulsar el botón Volver a factura pendiente, se vuelve al registro en que la venta no había finalizado, para que le pueda seguir añadiendo productos.

El código del evento Al hacer clic del botón Cliente Nuevo( aunque podrías perfectamente hacerlo con los botones de desplazamiento) es

DoCmd. GoToRecord,, acNewRec

Y el código del evento Al hacer clic del botón Volver a... es

Private Sub Comando50_Click()
Me.RecordSource = "select * from ventas where idcliente=dlast(""idcliente"",""ventas"",""cobrada=0"")"
End Sub

Es decir, que te busca el último registro en que Cobrada no esté marcada

Y como formulario y subformulario están relacionados.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas