Dudas sobre Facturación

Hola me lamo Silvina y tengo un problema por solucionar, espero que ustedes me puedan ayudar. Les cuento estoy realizando mi primer programita para un comercio, lo estoy realizando desde Access con código de Visual Basic.
El primer inconveniente que me surgió es: realice un formulario que se usaría para facturar donde tengo los campos cliente, número de factura, subtotal, porcentaje IVA, total y demás, y un subformulario donde están los campos de detalle del artículo a vender.
La pregunta es la siguiente: necesito que el número de factura aparezca automáticamente y correlativamente cada vez que se va a realizar una nueva factura, la idea es que el usuario coloque en un campo de este formulario o de otro desde que número quiere empezar a facturar. Como tomo ese valor para que lo muestre en un campo de la factura automáticamente y lo mantenga para la próxima factura aumentando un número (ej.: primer factura nº de comprobante 00001, siguiente factura nº de comprobante 00002).
La otra incógnita es: al eliminar una factura es necesario que se reponga el stock vendido en forma automática. El formulario que se usa para facturar esta relacionado con otro llamado artículos, donde también se maneja el stock que sale y entra, (o sea en una factura se vendieron 2 artículos si esa factura se elimina como establezco mediante código que reponga los 2 artículos al formulario artículos, no nos olvidemos que el detalle de artículos esta en un subformulario).
Espero que me halla explicado bien.
Desde ya les doy las gracias tan solo por leer el mail.
Respuesta
1
Supongo que estás utilizando Access para programar aunque el código sea Visual_basic.
Los contadores hay dos formas de utilizarlos, uno es guardar en un campo de una tabla (contadores) en qué próximo número tocará hacer la factura, cliente, proveedor, acreedor...
Y otro es cada vez que se añade una factura mirar con una consulta cual es el último número y sumarle uno, que es el sistema que yo utilizo puesto que si se borra una factura automáticamente se reasigna el contador.
Supongamos que tienes una tabla con el próximo número.
Tendrías una función:
Public Function AsignaNumero() as long
Dim Bd as database,Rsconta as recordset
' Abrimos la base de datos por código
set bd=dbengine.workspaces(0).opendatabase(Basededatos)
' Abrimos la tabla Contadores
Set RsConta=bd.openrecordset("Contador")
' Asignamos el contador a la función:
Asignanumero=RsConta!ProximoNumeroFactura
' Incrementamos el contador
rsconta.edit
rsconta!ProximoNumeroFactura=rsconta!ProximoNumeroFactura+1
rsconta.update
end function
En la función anterior Contador es el nombre de una tabla de contadores que tiene un campo llamado ProximoNumeroFactura.
El problema de esto es que si borras una factura, tienes que ver si era la última y restar uno al campo Proximonumero... de la tabla contador.
Con el Otro Sistema
Public Sub AsignaNumero() as Long
Dim Bd as database,Rsconta as recordset
' Abrimos la base de datos por código
set bd=dbengine.workspaces(0).opendatabase(Basededatos)
' Averiguamos el último número asignado
set Rsconta=bd.openrecordset("Select Max(NumeroFactura) as Maximo from Facturas")
' Cogemos el máximo y le sumamos 1
AsignaNumero=rsconta!Maximo+1
end function
' Tenemos una tabla Facturas con un campo NumeroFactura, averiguamos cual es el mas alto y le sumamos uno, si se borrara una factura cambia el máximo y los números siempre son correlativos.
De cualquiera de las dos formas, en el evento BeforeInsert del formulario de facturas pones
NumFactura=AsignaNumero()
Donde NumFactura será un cuadro de texto que como origen de control tendrá el campo NumeroFactura de la tabla Facturas
CONTROL DE STOCKS
Primero te cuento un poco los problemas que te vas a encontrar.
Supón que el usuario hace una factura nuevaen la que vende un tornillo y tú das de baja ese tornillo en el almacén. Hasta ahora bien.
Pero supón ahora que el usuario se ha confundido y en vez de un tornillo son tres, entra a modificar la factura.
Tú no tendrías que dar de baja tres tornillos, sino dos ya que uno lo diste de baja antes.
El más difícil todavía, supón que no era un tornillo, sino tres tuercas, tendrías que dar de alta el tornillo y dar de baja tres tuercas.
¿Solución a esto? Yo lo hago así.
Cuando el usuario entra a modificar la factura, yo de cara al stock anulo la factura, es decir, vuelvo a dar de alta todos los artículos que había en la factura. Cuando el usuario graba la factura doy de baja en el stock sus artículos, si lo piensas un poco verás que en todos los casos funciona bien.
¿Cómo se hace esto por código?
Tienes una tabla artículos con los campos referencia y Stock.
Tienes una Tabla conceptos_factura con los campos referencia y unidades vendidas, y un campo número de factura.
Public Sub RestaStockFactura(NumeroFactura as long)
' Por parámetro pasamos el número de factura que hay que dar de baja en el almacén.
Dim Bd as Database, RsConceptos as Recordset,RsAlmacen as recordset
'Abrimos Bd....
' Abrimos Conceptos de esa factura
set RsConceptos=bd.openrecordset("Select * from ConceptosFactura where NumeroFactura=" & NumeroFactura)
if Rsconceptos.recordcount>0 then
rsconceptos.movefirst
set rsalmacen=bd.openrecordset("almacen")
rsalmacen.index="Referencia"
while not rsConceptos.eof
rsalmacen.seek"=",Rsconceptos!referencia
if not rsalmacen.nomatch then
rsalmacen.edit
rsalmacen!stock=rsalmacen!stock-rsconceptos!unidades
rsalmacen.update
Endif
rsconceptos.movenext
wend
Endif
end function
' Sería algo así como
Abrimos una consulta con los conceptos de esa factura
Si la factura tiene algún concepto, abrimos almacen y le indicamos que vamos a buscar por referencia
Recorremos todos los conceptos y para concepto buscamos en almacen por referencia, si encontramos la referencia en almacen editamos el registro, le restamos al campo stock las unidades vendidas y guardamos los cambios.
Para que esto funcione tienes que tener una función restaalmacen y otra sumaalmacen y en el caso de ventas llamar a suma almacen al modificar una factura y restaalmacen al salir de ella (puedes hacerlo por ejemplo en los eventos al entrar y al salir del control subformulario)
Bueno espero que te sirva. Si tienes dudas me cuentas

2 respuestas más de otros expertos

Respuesta
1
Si el usuario posee un formato de factura que contiene su numero, entonces deberá ser ingresado por el mismo, sino deberás autogenerarlo en el momento que guardas la factura (en este momento). Las facturas se anulan usa un flag NO se eliminan físicamente.
Código:
dim NumFactAnterior as string
dim ceros as string
dim longitud as long
NumFactAnterior=campo tabla
' Calculalongitud de nuevo numero
longitud=
len(trim(clng(NumFactAnterior)+1))
'establece cantidad de ceros que preceden
ceros=string("0",<longitud campo tabla> - longitud)
'asigna nuevo numero
nuevonumero=ceros+trim(clng(NumFactAnterior)+1)
' intente hacerlo lo mas simple posible pero hay otras maneras de hacerlo ahorrando codigo
Hola de nuevo:
No me queda claro donde se inserta este código, disculpa mi ignorancia y te agradezco por ayudarme a resolver este problema. Ya que estamos te deseo MUY FELICES FIESTAS!
En el momento que el usuario presiona guardar debes generar la factura (si el programa es multiusuario)
Si solo lo vas utilizar en una maquina, entonces en el momento de cargar el formulario calculas el nuevo numero de la factura y lo muestras.
Por ejemplo, si tu programa es multiusuario, imaginate 2 terminales que quieren una factura, hasta que se ingresan los datos el otro terminal ya grabo la factura cuando tu quieras grabar violaras la integridad referencial, por eso en multiusuario debes generar el numero de factura exactamente en el momento que se guarda la factura (botón guardar)sino es multiusuario entonces antes de mostrar el formulario calculas el nuevo numero y lo muestras en pantalla.
Feliz año nuevo
No te preocupes, pregunta nomas, más bien disculpa la lentitud...
Respuesta
1
Escribime a [email protected] y vemos como te mando el procedimiento

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas