Formulación para registro de formulaciones de producto

Disculpa si soy un poco extenso pero quiero ponerte en contexto. La idea es tener una base de datos que me permita ingresar las formulaciones (composición) de varios productos. Un producto puede estar compuesto de varios recursos que a su vez están compuestos de varios insumos. Por ejemplo, la butifarra tiene recursos cárnicos (los insumos pueden ser carne de pollo, carne de res), recursos líquidos (agua, aceite) y recursos no cárnicos (almidón, condimentos). Necesito realizar un formulario que me permita seleccionar un producto (butifarra por ejemplo). Y permita en cada uno se sus recursos matricular los insumos.
Hasta el momento se me ocurre tener una tabla de productos (butifarra, carne de hamburguesa), otra tabla con los insumos (carne industrial, agua, arveja), una tabla de tipo de recursos (cárnico, no cárnico, liquido), relacionar las tablas de insumos y recursos para así en un maestro tener asociado cada insumo que matricule a un tipo de recurso.
Lo que no se es como manejar la composición, es decir quiero tener un formulario en el cual selecciones el producto (butifarra por ejemplo). En dicho formulario tener 3 botones o pestañas que me permitan matricular los recursos (cárnicos, líquidos y no cárnicos). Quiero que al darle clic o seleccionar la pestaña (me permita registrarle los insumos según su categoría), es decir cuando le de en recursos cárnicos poder matricular varios insumos. De igual manera para el liquido y el no cárnico. No se si he sido lo suficientemente claro ilustrandote lo que quiero. No se como relacionar las tablas o realizar el formulario para que me permita tener asociado a un producto varios recursos cárnicos, varios recursos líquidos y varios recursos no cárnicos.
De verdad espero puedas ayudarme puesto que me encuentro sumamente preocupado y el tiempo me apremia, espero me puedas dar alguna luz de esperanza. De antemano te agradezco cualquier ayuda que me puedas prestar.
Estaré atento a tu respuesta y de antemano agradezco inmensamente cualquier ayuda que me puedas prestar estoy sumamente perdido.

1 Respuesta

Respuesta
1
La verdad estos espacios deberían ser para dudas concretas, lo que pides es casi el desarrollo del proyecto. En todo caso, sin saber casi nada sobre temas alimentarios, te doy alguna idea que se me ocurre en base a tu explicación.
Así como dices deberías tener una tabla para los recursos en la que tengas también un campo insumos, otra tabla aparte para insumos y finalmente una tabla para productos con un campo productos, u campo de recursos y otro de insumos. Al hacer la tabla productos los campos resursos e insumos vinculalos a las respectivas tablas. De esta manera Access crea automáticamente las relaciones.
Lo del formulario es otra cosa. Lo que quieres hacer se puede hacer con controles tipo combobox basados en las tablas que correspondan a los datos que quieres seleccionar. Puedes hacer tantos controles como componentes pueda tener un producto. Ya en este caso, me comentarás dudas específicas según vayas avanzando.
Hola, muchas gracias por tu respuesta y poner interés, tienes toda la razón se me fue un poco la mano con la pregunta. Ya cree las tablas y las relacione. AL final cree una tabla de productos, una para los insumos, la de los recursos la dividí en 3 tablas (cárnicos, líquidos y no cárnicos), te cuento que hice esta división en ves de realizar una sola tabla por que necesitaba en el formulario tener 3 subformularios (1 por cada recurso). Ahora lo que hice fue realizar un formulario cuyo encabezado esta el producto final (butifarra por ejemplo). Este texbox lo puse como cuadro combinado para seleccionar entre uno de los productos. En este formulario inserte tres subformularios en vista hoja de datos correspondientes a las tablas recursos. El hecho de que estén en hoja de datos me permite matricular los insumos en cada uno de los recursos. (Espero haberte dado una idea concreta de en que voy). Quiero que este formulario me sirva para consulta o para modificar la formulación. Mi primera pregunta es la siguiente: ¿Como hago para poner una validación en el encabezado del formulario por si alguien quiere crear una nueva formulación de un producto que ya tiene creada una. Es decir quiero que a partir del formulario se pueda solo crear formulaciones de productos que no tienen ninguna, en caso de que digiten el código de un producto que ya tiene una creada, que lo que haga sea llevarme a esa formulación para simplemente modificarla. Espero no haberte abrumado mucho de nuevo, tengo muchas inquietudes y agradezco me colabores (de verdad lo necesito). Estoy atento a tu respuesto y de antemano agradezco tu prestancia.
Muy bien, buen trabajo. Lo que pides es más fácil.
En la tabla de productos te sugiero tener un campo con un autonumérico consecutivo que sea una especie de contador de la posición del registro. También te sugiero que dicho autonumérico no sea automático (ya que a veces dan saltos y eso haría fallar el siguiente paso). Si necesitas ayuda con esto me avisas. En este ejercicio supondré que a este campo le hemos llamado POSICIÓN.
En el evento "Al cambiar" de cuadro combinado colocas este código:
'Supondré que la tabla de productos se llama TbPRODUCTOS, que el formulario se llama FPRODUCTOS y el campo que busques sea el código de producto CODPRODUCTO y que sea tipo texto
Dim BBDD As Database
Dim TPRODUCTO As Recordset
Dim VbPRODUCTO As String
Dim VSEGUIR As Byte
VbPRODUCTO=CODPRODUCTO '(Suponiendo que este sea el nombre del cuadro combinado)
Set BBDD=CurrentDb
Set TPRODUCTO=BBDD.OpenRecordset("SELECT * FROM TbPRODUCTOS WHERE CODPRODUCTO = '" & VbPRODUCTO & "'")
If Not TPRODUCTO.EOF Then
      VSEGUIR= MsgBox ("ESTE PRODUCTO YA ESTÁ DADO DE ALTA",VbYesorNot,"SI DESEA MODIFICARLO PULSE <<SI>>")
      If VSEGUIR<>6 Then
            Exit Sub
      Else
           Me.Undo
           DoCmd.GoToRecord acDataForm, "FPRODUCTOS", acGoTo, TPRODUCTO!POSICION
      End If
End If
Ben día, de verdad te agradezco mucho tu respuesta. Aun no lo he ensayado, pero me pondré en ello. Ya había creado un campo autonumérico que lo llame id_mov (consecutivo de movimientos), pero te agradecería si pudieras ayudarme con el código para no usar el predeterminado (que es el que estoy utilizando actualmente). Te contare como me fue con el código. Te reitero mi agradecimiento
Lo primero que tienes que hacer para sustituir el autonumérico (o por lo menos como yo lo hago), es cambiar el campo Id o como se llame donde lleves ese registro a Número con formato Entero Largo.
En vista diseño de la tabla, en el apartado Valor Predeterminado le pones 0 (cero), y en Regla de Validación escribes >0. Esto lo hago para que ni por error del transcriptor de los datos se pueda dar de alta un registro sin este dato. En el texto para la regla de validación escribe algo como, "No se puede dar alta un registro con Id 0, presione <<ESC>> para continuar". Evidentemente, también habrá que seleccionar que es un valor Requerido y será un campo clave sin duplicados.
Luego, si no lo tienes, crea en el formulario asociado un botón de grabar registros o puedes escribir el código en el evento al perder el enfoque del último control que rellenes del formulario antes de cargar un nuevo registro. Si usas el botón de grabar será en el evento de Al hacer Click.
Suponiendo que en la tabla se llama Id_mov y en el formulario el control se llama CTRID (el cual debes dejar bloqueado por defecto), el código sería así:
Dim VREGISTRO As Integer
VREGISTRO=DMax("[Id_mov]","Nombredela tabla")
CTRID=VREGISTRO+1
Docmd. GoToRecord acDataForm, "FPRODUCTOS", acNewRec
Con eso será suficiente
Muchas gracias por tu ayuda experto. Estoy muy contento, con el código que me diste logre crear el campo autonumérico y además logre hacer una validación para que no me permita ingresar un código que ya existe. Pero lo que quiero es que cuando ese código exista, lo que haga es que me traiga los datos asociados al código en las tablas relacionadas. Es decir, que si el código que busque existe, tráigame los datos que hay en las tablas (que se vean en el formulario) y que me permita modificarlos (en caso de que así se desee), si no encuentra el código entonces arrojare un mensaje diciendo que debe registrar primero el producto en el maestro de productos. Recuerda que el formulario es de formulaciones de productos, entonces si busco el código de un producto, lo que pretendo es que el formulario me lleve a la formulación del producto previamente digitada y realizarle algún cambio si lo deseo (obviamente que el cambio quede registrado en las tablas). Si no lo encuentra que diga "debes registrar primero el producto para poder asociarle una formulación". Espero no abrumarte demasiado, te estoy agradecidismo por tu buena disposición y prestancia. Estoy atento a tu respuesta.
En el código que te coloqué en la respuesta anterior a la del autonumérico, está la forma de cargar el registro. Si te fijas te pregunta si quieres modificar el registro y si seleccionas que si, entonces te carga el registro completo en el formulario para modificarlo. Los campos que quieras modificar dependerán de los que tengas en el diseño de la tabla ed productos, que entiendo incluye la formulación del mismo.
No sé si ya probaste ese código.
Muy buenas no ches experto. El problema es que no pude utilizar tu código porque tuve problemas al crear el autonumérico por código. Logre crearlo en la tabla de encabezado pero tenia problemas con las tablas de detalle. Te haré un resumen. Tengo un formulario con un encabezado (tiene una tabla encabezado) y tres subformularios de detalle (tres tablas de detalle). Tengo asociado las tablas de detalle con el encabezado a través de una clave primaria id_mov. De tanto intentar, decidí no utilizar el autonumérico por código, si no que utilice el autonumérico que tiene access por defecto. Recuerdo que me habías dicho que el código que me sugeriste para validar podría tener fallos con el autonumérico de access porque este se salta a veces. Por tanto te pido encarecidamente me ayudes con mi nueva situación. Tengo un formulario de productos en el que matriculo los productos. Luego tengo otro de movimientos (en este es en el que tengo las relaciones de las que te hablaba). La idea con este formulario es que los usuarios le registren a cada producto una fomulacion (estos son los datos que se ingresan en los subfomularios). Quiero validar el caso en el que alguien vaya a matricular una formulación a un producto que no ha sido creado en el maestro. Quiero que si en el cuadro combinado seleccionan o digitan un código de un producto que ya tiene registros en el formulario de movimiento lo que haga es que me lleve a los registros que este tiene (para que los modifique o simplemente los consulte) (esto es como lo que hace uno cuando inserta el botón buscar en un formulario (el de los binoculares). Y finalmente si el código que se ingreso en el formulario de movimientos ya esta creado en el maestro de productos pero no tiene registro alguno en movimientos, que entonces me permita ingresarle los registros pertinentes. Se que he redundato un poco, pero quiero que tengas una idea clara de que es lo que quiero hacer. Disculpa mi intensidad pero de verdad estoy apuradisimo y eres la única persona que ha prestado algún interés en ayudarme. Estoy atento a tu respuesta. De antemano te lo agradezco inmensamente.
En el formulario de movimientos me comentas que tienes un campo donde eliges el producto y que según el Id, en los subformularios deben aparecer los datos que le corresponden de ese producto. Entiendo que la tabla productos tienes sólo los productos que has registrado, con formulación o sin ella, por lo que la búsqueda o consulta es saber si existe o no el producto en dicha tabla y si existe te dé la opción de editarlo o no. Si lo quieres editar entonces se posiciona (en el encabezado) en el registro que corresponde a ese producto y los subformularios te mostrarán los detalles. Si el producto no está dado de alta te dirá que antes debes darle de alta, pero eso lo haces en otro formulario de alta de productos.
El producto (en el encabezado) lo puedes elegir por medio de un cuadro combinado que se llame por ejemplo IdPRODUCTO.
En el evento "Al cambiar" de ese cuadro combinado colocas este código:
'Supondré que la tabla de productos se llama TbPRODUCTOS, que el formulario se llama FPRODUCTOS y supondré que IdPRODUCTO tiene datos tipo texto
Dim BBDD As Database
Dim TPRODUCTO As Recordset
Dim VbPRODUCTO As String
Dim VSEGUIR As Byte
VbPRODUCTO=IdPRODUCTO
Set BBDD=CurrentDb
Set TPRODUCTO=BBDD.OpenRecordset("SELECT * FROM TbPRODUCTOS WHERE CODPRODUCTO = '" & VbPRODUCTO & "'")
If Not TPRODUCTO.EOF Then
      VSEGUIR= MsgBox ("ESTE PRODUCTO YA ESTÁ DADO DE ALTA",VbYesorNot,"SI DESEA MODIFICARLO PULSE <<SI>>")
      If VSEGUIR<>6 Then
            MsgBox "DEBE REGISTRAR EL PRODUCTO Y LUEGO EDITARLO",,"PRODUCTO NO REGISTRADO"
            Exit Sub
      Else
           Me.Undo
           DoCmd.GoToRecord acDataForm, "FPRODUCTOS", acGoTo, TPRODUCTO!POSICION
      End If
End If
Buenas noches, muchas gracias por tu nueva respuesta. Entienda perfectamente tu código y ya lo puese a prueba. Efectivamente en mi formulario tengo un cuadro combinado de id producto y efectivamente tengo otro formulario para el maestro de productos. Al id producto le matriculo sus respectivas formulaciones en las 3 tablas de detalle. Utilizo tu código para verificar si el producto existe o no (ya me funciona el único inconveniente lo tuve con la expresión DoCmd.GoToRecord acDataForm, "FPRODUCTOS", acGoTo, TPRODUCTO! POSICIÓN, me presentaba un error. Opte por omitirla, simplemente cuando deshace el registro con me.undo ya no se me posiciona en ningún campo (pero no me importa ingresar a el con el mouse).
Creo que no me hice entender con la pregunta más grande que tengo así que intentare ser más claro. Supongamos que a un producto le he ingresado un registro ya en la tabla movimientos. Puedo acceder a este registro explorando entre los registros del formulario (con las flechas de registro anterior, primer registro etc). Lo que yo quiero es que si un usuario en una fecha posterior digita en el formulario de movimientos el código de dicho producto (al que ya antes le había hecho un registro). Inmediatamente se me muestre en el formulario ese registro ya hecho. (Osea el código que simula lo que hace el botón buscar (el de los binoculos)(que digamos uno lo aprieta, pone el criterio por el que va a buscar e inmediatamente el lo lleva al pantallazo del formulario para ver el registro por si quiere modificarlo).
Y mi segunda inquietud es la siguiente: Una vez hecho lo anterior, quisiera que el usuario pudiera modificar cualquier dato, menos el del código del producto (el mismo por el que busque). Quiero hacer esto para conservar la integridad de la información.
Espero haber sido un poco más claro esta vez, de verdad agradezco mucho tu paciencia y espero puedas ayudarme. Estoy atento a tu respuesta.
Lo primero es que la línea que eliminaste es la que hace justamente eso que quieres. La acción GoToRecord (ir al registro), posiciona el registro en donde le indiques, en el caso que puse de ejemplo el registro que buscaba es el que corresponde al número de orden que como ejemplo llamé POSICIÓN en la tabla TbPRODUCTOS. Si tu le has puesto otro nombre a este campo debes sustituir los que yo utilicé de ejemplo.
DoCmd. GoToRecord acDataForm, "FPRODUCTOS", acGoTo, TPRODUCTO!POSICION
Igual pasa con los nombres de formularios, campos y tablas.
Cámbialos y verás que funciona como quieres. Este código lo debes colocar en el evento "Al perder el enfoque" del campo del formulario donde escribes el código del producto.
Lo segundo, añade al código que te di antes al final, antes del End Sub.
nombredelccampocódigo.Locked=True
En las propiedades del campo del código en la ficha de Datos, en la línea de Bloqueado escribes NO, para que por defecto esté desbloqueado.
Experto, te agradezco inmensamente tu ayuda por fin pude lograr lo que quería. Tu disposición y paciencia han sido magnificas. Tengo otra inquietud para ti, pero abriré otro hilo porque no tiene que ver con esto. De nuevo mil gracias.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas