Access: ¿Qué campos debería tener la tabla de "transacciones" de una BD de facturación?

Estoy haciendo una BD de Facturación (para llevar las cosillas de autónomo) y al cambiar los datos de los clientes o el precio de los productos, lógicamente se me cambian los datos en las facturas anteriores. He estado buscando por el foro y recomendáis siempre hacer una tabla "intermedia" donde volcar los datos una vez hecha la factura, y así no se actualicen y cambien las facturas anteriores.
Es una solución ideal pero para llevarla a cabo me pierdo un poco. Porque he vuelto a empezar de 0 ya que me estaba liando. Entonces mi pregunta es:
En la tabla "transacciones" debería volcar todos los datos de cada factura para que así al modificar datos de cliente o de producto las facturas anteriores no variasen, ¿verdad? Porque si tiene que ir a buscar los datos a la tabla de origen esos datos estarían modificados y no es lo que busco.
Entonces ¿qué campos tiene que tener esta tabla? ¿Todos los campos de cliente que salgan en la factura + todos los campos de la tabla "facturas" que salgan en la factura? Y anexar los datos mediante evento o consulta supongo. ¿O es desde esta tabla de transacciones que al introducir los conceptos se graban después a la tabla de "facturación"?
Voy un poco (muy) perdida, porque estaba ya casi listo mi programa y al encontrarme con esto he empezado de 0 y me he desmotivado mucho.
Si me podeis echar un cable (o un manojo entero)

1 Respuesta

Respuesta
2

En mi opinión, no te haría falta crear una tabla intermedia, sino simplemente modificar un poco las que tenías en un principio.

Como desconozco lo que tenías hecho hasta ahora, te explico cómo lo haría yo:

1º/ Una tabla de clientes, con los datos de los clientes

2º/ Una tabla de productos, con los datos de los productos

3º/ Una tabla facturas, con los datos básicos de la factura: número de factura, fecha, cliente... Esta tabla iría enlazada con la del punto 1, y aquí, si quieres reflejar los datos actuales de tu cliente, puedes recurrir a la función DLookUp() y un poco de programación para traerlos de la tabla clientes. Así, si te cambia algún dato del cliente, como la dirección, no se te modificará en las facturas previas.

4º/ Una tabla DetalleFacturas, en la que irían los distintos conceptos de la factura (producto, unidades,...). Esta tabla iría vinculada con las tablas productos y facturas. En esta tabla, con la ayuda del DLookup() podrías buscar el precio registrado de cada producto y guardarlo en la tabla. ASí, como antes, aunque modifiques el precio en la tabla de productos, siempre te cogerá (y registrará) en el detalle el precio registrado en el momento de facturar.

Puedes ver un ejemplo explicado en este ejemplo que preparé para la web de Neckkito, página 6 en adelante: http://siliconproject.com.ar/neckkito/index.php/component/content/article/96-ejemplos-explicados/ejemplos-de-controles/279-cuadros-combinados 

El precio del detalle de la factura lo cojo de la tabla productos, pero si lo modifico en ésta, no cambian las facturas previas.

Un saludo.


Muchas gracias, he mirado de hacerlo pero me surgen dudas al respecto:

En principio tengo la BD configurada tal cual dices, lo único que en el formulario de facturación, he agregado los campos (dirección, NIF, etc) directamente de la tabla de clientes y mediante un campo combinado donde selecciono el nombre del cliente me busca toda esa información. Por eso me la cambia si modifico los datos del cliente.
Entonces tengo que crear esos mismos campos (dirección, NIF, etc) en la tabla de facturación para poder hacer un DBúsq() y que me las "autorellene" una vez introduzca el campo combinado? 

Correcto, creas los campos en la tabla de facturas (y en el formulario), y una vez que elijas el cliente en el cuadro combinado (te sirve como lo tienes hasta ahora), lo único que has de hacer es programar el evento "Después de actualizar" para que te busque los restantes datos del cliente en su tabla y los ponga en los correspondientes cuadros del formulario, que al ir asociados a los de la tabla, te quedan en la tabla de facturas aunque los cambies en la de clientes.

Es idéntico al planteamiento que hago en el ejemplo con el campo Precio en el detalle de la factura.

Lo siento, no me aclaro, y estoy bien encallada... He estado mirando y probando tu BD y no sé aplicar el DBúsq por mi cuenta... (Decirte que las búsquedas con código VBA no me sale nada tampoco, no sé si tengo algo mal configurado o es que el Access 2016 va distinto...) Las comunidades me salen pero el precio no lo sé ver bien.
Podrías decirme qué tendría que poner en Origen de control de "Adreça" (Dirección) de la tabla de FACTURES para que me busque ese dato en la Tabla de CLIENTS del campo con el mismo nombre? Lo siento parece que tengo 3 años, pero se me está encallando ésto y el desespero no me deja ver más allá.
Un millón de gracias.

Te explico cosas:

1º/ Si en un formulario (creado sobre una tabla o consulta) pones un cuadro de texto, y a ese cuadro de texto en su "Origen de control" le pones el nombre de un campo de la tabla/consulta, queda vinculado con esa tabla/consulta y podrás ver los valores ya almacenados, modificarlos, eliminarlos o añadir unos nuevos.

Si embargo, si como origen de control pones una expresión (=DBúsq(...), o =Fecha(), o =[Precio]*[Cantidad], o lo que sea), estás haciendo ese cuadro de texto "independiente" de la tabla/consulta, y el valor que muestre no se guardará en la tabla/consulta a no ser que lo hagas por medio de código o una macro.

Por tanto, y para responder a tu pregunta, si quieres guardar el valor de Adreça en la tabla FACTURES, el origen de control a de ser Adreça, y su valor lo tendrás que obtener vía código. (Más abajo te explico formas de hacerlo)

2º/ DBúsq(), al igual que el resto de funciones de dominio (DMáx(), DCont()...) y demás funciones, código y expresiones en general, tienen una notación específica para tratar los distintos tipos de dato:

  • Tipo texto: el valor que se le pasa tiene que ir entre comillas, por ejemplo:

DLookUp("Direccion","Clientes","Nombre='Pedro'")

  • Tipo numérico: el valor que se pasa va directamente. Ejemplo:

DLookUp("Direccion","Clientes","ID_Cliente=50")

  • Tipo fecha/hora: el valor tiene que ir entre almohadillas:

DLookUp("Nombre","Clientes","FechaAlta=#15/03/2017#")

Es lo mismo que si pones criterios en una consulta para filtrar los resultados.

Si en vez de pasarle un valor "fijo" como en los ejemplos anteriores le quieres pasar un valor "variable", que dependa de los datos del registro activo, la idea será la misma:

DLookUp("Direccion","Clientes","Nombre='" & [Nombre] & "'")

DLookUp("Direccion","Clientes","ID_Cliente=" & [ID_Cliente])

DLookUp("Nombre","Clientes","FechaAlta=#" & [FechaAlta] & "#")

3º/ ¿Cómo puedes traer los datos a FACTURES?  Pues tienes varias formas:

  • Si en tu formulario el campo "Empresa" lo tienes como un cuadro combinado, puedes modificar ese cuadro combinado (el "origen de la fila", "número de columnas" y "ancho de columna") para que te coja todos los campos que vas a necesitar y se vea solo el principal. Por ejemplo:

Origen de la fila: SELECT Empresa, Adreça, Localitat, Provincia FROM CLIENTS

Número de columnas: 4

Ancho de columna: 4cm;0cm;0cm;0cm;

Luego, en el evento "Después de actualizar" le generas este código:

Private Sub Empresa_After_Update()
Me.[Adreça]=Me.Empresa.Column(1)
Me.[Localitat]=Me.Empresa.Column(2)
Me.[Provincia]=Me.Empresa.Column(3)
End Sub

De esta forma, al elegir una empresa te pasa los datos y se guardan en la tabla FACTURES.

  • Otra forma, tanto si Empresa es un cuadro combinado con una única columna como si es un cuadro de texto, sería con DBúsq(), con el siguiente código:
Private Sub Empresa_AfterUpdate()
Me.[Adreça]=DLookUp("[Adreça]","CLIENTS","Empresa='" & Me.Empresa & "'")
Me.[Localitat]=DLookUp("[Localitat]","CLIENTS","Empresa='" & Me.Empresa & "'")
Me.[Provincia]=DLookUp("[Provincia]","CLIENTS","Empresa='" & Me.Empresa & "'")
End Sub

Y conseguirías lo mismo.

El único inconveniente que le veo que se pueda dar es que alguna de tus empresas tenga entre sus caracteres comillas simples (por ejemplo Editorial O'Reilly), con lo que te saltará un error. En ese caso tendrás que usar Replace() para lidiar con ella, por ejemplo:

Me.[Adreça]=DLookUp("[Adreça]","CLIENTS","Empresa='" & Replace(Me.Empresa,"'","''") & "'")

A ver si así te va saliendo.

De todas formas, comentarte que en la web de Neckkito hay varios ejemplos sobre cuadros combinados y formas de traer datos de otras tablas.

Un saludo.


Yo no sé si soy yo o mi mundo que está del revés... Y discúlpame porque sé que debo ser ya un autentico tostonazo...

De hecho he aparcado lo del DBúsq porque no hay manera. Y de la pagina de Neckkito he intentado hacer algo fácil: La autonumeración manual.
Pues... no me funciona tampoco. A lo que digo "pues miro la BD de ejemplo"... Me la bajo y la abro (con el Shift) y nanai, no me funciona ni esa. No sale nada en la autonumeración. Todo se abre bien y lo veo todo bien pero ese campo permanece en blanco.
Igual me pasa con tu ejemplo de Facturas que me dijiste: los campos de búsqueda generados por código no me aparecen. Y el Formulario de facturas el precio no sale ni puedo introducir nada... Porque puede ser? No será que mi Access es del 2016 no?
Esque no me sale ni con el "=[Nom producte].[Column](2)", ni con código, ni con DBúsq... Ni con DlookUp...
Antes usaba el Access 2007 y para hacerle un programilla a mi exmarido yo había modificado código VBA, traducido para que los recibos me saliesen en catalán, vamos que no me he dedicado a hacer 1 formulario solo... Que más o menos me defiendo lo justo pero bien. Pero chico... No hay manera! Tampoco busco hacer grandes cosas, y me está resultando imposible todo, pero lo raro es que no me salgan ni vuestras BD que en teoría van bien y a mi no O_o
Me rindo? Contrato a alguien para que me ayude? Plis... consejo...

Es muy raro lo que comentas de que no te funcione ni el ejemplo de Neckkito ni el mío, porque sí funcionan. ¿Tendrás la BD en una carpeta que no esté como ubicación de confianza? Es lo único que se me ocurre para que no te funcione...

Me las descargué y las puse en el escritorio... No creo que sea por eso, lo veo muy raro. En la de Facturas solo se combinaba la referencia del producto con el nombre (Harry Potter etc) pero el precio y demás estaba en blanco y no actualizaba nada ni me dejaba introducir.
En la del Autonumérico manual directamente no salia nada en el campo donde tendría que salir. Se ven en la tabla los 4 o 5 ejemplos de como al borrar uno el autonumérico había dado el correlativo directo, pero no funciona al introducir nuevos registros.
Ains... desespero...

Por defecto el escritorio no es ubicación de confianza, pero lo puedes configurar para que lo sea:

https://support.office.com/es-es/article/Agregar-quitar-o-cambiar-una-ubicaci%C3%B3n-de-confianza-para-sus-archivos-7ee1cdc2-483e-4cbb-bcb3-4e7c67147fb4 

Era eso!!!! Por dios! Gracias! Precisamente lo puse en el escritorio porque creía que era una ubicación de confianza... menudo desastre. 
Vuestro autonumérico manual me funciona y ya lo he podido aplicar en mi BD, ahora... con lo de copiar los datos en los campos de la tabla no hay manera... llevo toda la mañana peleándome y probando mil variaciones, y nada. O me da error o no sale nada. Ni con el DBúsq ni con campo combinado ir a buscar los datos por columnas. Tengo que probar mas y ver dónde fallo...
Mil gracias por todo, tienes una paciencia infinita, y por ser una melona y estar haciendo el canelo con lo de la ubicación de confianza lo estaba echando todo a perder.
Sigo buscando la manera de trasladar esos datos y que me los grabe... porque no hay manera :)
En cuanto acabe te mando un jamón!
:)

Yo te recomendaría que te leyeses con calma, de nuevo, el ejemplo de los cuadros combinados que te enlacé en mi primera respuesta, y al mismo tiempo, fueras recreando las BDs del ejemplo desde cero. Si consigues que te salgan, no debería ser difícil que luego lo adaptes a lo que tienes.

Y si ves que te atascas mucho, y me quieres hacer llegar una copia de tu BD, te lo miro yo.

Saludos!


Ya me ha salido! Ayy! No me lo creo! Como te puedo hacer llegar un jamón?! Muchas gracias, en serio, sin tu ayuda no lo habría podido hacer. :)

Con tus agradecimientos y el saber que lo has conseguido, me llega. El jamón para la próxima, jajaja.

Quedas invitada a pasarte por nuestro foro (http://nksvaccessolutions.com/Foro/), pues cada vez estoy menos por aquí.

Salu2! :)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas