Table and Report Structure

Hello AppSheet Community
I have a question about the structure I designed for my inventory app.

I have the following tables:

  1. productos
  2. entradas_encabezado
  3. entradas_detalle (linked to productos and entradas_encabezado)
  4. salidas_encabezado
  5. salidas_detalle (linked to productos and salidas_encabezado)
  6. The dependent or detail tables have calculated columns that return data from the parent table.

Questions:

  1. Is this a good table structure design?
  2. I need to combine or merge the list from the detail tables to create a Kardex report.
  3. Do you have an example of how to create filtered PDF reports?

I’ve included a link to a copy of my Google Sheet; feel free to make any changes you deem necessary.

COPY GOOGLE SHEET

Copia de Google Sheet

1 Like

It would be helpful to know what kind of items you would be tracking inventory for. I think what you have is a good start for a small in-house type Inventory app.

If I understand correctly your general intent is to have a table that manages the quantities for products, a set of tables that record the incoming inventory and another set recording the outgoing inventory.

I’m not sure what this means. Typically your incoming and outgoing Inventory tables are simply transactions to record basically the Date, item, number to adjust quantity and maybe some location info. I’m not sure what “calculated columns” you would have in these tables. I’m also not sure why you might need a parent and child.

3 Likes

WillowMobileSys
Thank you for your help.
I mentioned that I’m trying to create a Kardex-type report, but I wasn’t sure about the table structure because I don’t know how to join the incoming and outgoing transactions, since the tables are separate. I’ve watched AppSheet videos with inventory management, but almost all of them use only one or two tables.

When I said I have calculated columns in the detail or child tables, I meant virtual columns that reference the parent tables.

In another forum, someone suggested I combine two datasets into a single movement table using copy actions. I ended up doing this because I understand that incoming and outgoing transactions can’t be joined virtually. Is this correct?

Thank you for your time.

Hice esto:

  1. Hice columnas virtuales en las tablas detalle haciendo referencia a las columnas de tablas padre, a través de la columna de referencia ID_entrada.

  2. Hice una acción para copiar una línea en las tablas detalle (hijas)

    1. Data: add a new row to another table using values from this row

    2. Para que no se repita la acción use esta expresión:

      NOT(IN([ID_entrada_detalle], SELECT(movimientos[ID_entrada_detalle],TRUE)))
      
  3. Hice una acción para copiar un conjunto de líneas desde la tabla padre.

    1. Data: execute an action on a set of rows

    2. Seleccione las lines con esta expresión:

      1. FILTER("entradas_detalle", [ID_entrada] = [_THISROW].[ID_entrada])
        
      2. Hice referencia a la primera acción para que se ejecutara.

  4. Para que no se repita la acción anterior, hice una nueva acción para cambiar el estado de la entrada en la tabla padre, de Borrador a Recibido.

    1. Data: set the values of some columns in this row
  5. Hice una acción “Confirmar Recepción” para ejecutar todas las acciones anteriores:

    1. Grouped: execute a sequence of actions

    2. Acciones de referencia: Copiar Movimientos (que ejecuta la acción 1) y la acción de cambiar estado.

  6. Para ocultar las acciones que se ejecutan hago la expresión: [ID_entrada].[estado]<>"Recibido

Aqui copio el vinculo a google sheet:

Inventario

Gracias

1 Like

La estructura de tu base de datos te puede servir tal cual está para hacer el reporte que quieres.

No entiendo para que haces lo de las acciones que hacen referencia a la tabla padre. Más bien tendrías que tener columnas virtuales en las tablas padre que usaran sus respectivas columnas [Related tabla_hijas] en las formulas que necesitas

Puedes hacer que tu app haga algo similar a esto

Es la idea que tienes?

2 Likes

Hola @Kabulino

Siii esa es mi meta :saluting_face: , se ve muy bueno tu sistema :+1: quisiera llegar a tu nivel, no había visto el alcance de appsheet, pero siento que solo hay documentación y tutoriales para procesos simples, insuficiente para hacer algo profesional.

Te comento que comencé a probar appsheet hace años atrás, pero lo dejé por lo que te comenté antes y lo estoy retomando, lo que hice tal vez es complicado, pero es lo que encontré.

En total tengo 4 tablas que controlan los movimientos de los productos entradas_encabezado, entradas_detalle, salidas_encabezado y salidas_detalle.

Hice columnas virtuales en las tablas hijas haciendo referencia a las columnas de las tablas padre, de modo que me quedara una lista plana, porque en el foro appsheetespañol me sugirió hacer una copia de las transacciones (entradas, salidas y detalles) en una tabla “movimientos” debido a que en AppSheet no se puede unir virtualmente los registros de estas tablas, algo así como UNION SELECT en SQL.

Entonces tuve que hacer una acción en la tabla hija para copiar una sola línea, después en las tablas padre 3 acciones, una para que ejecutara una acción en un conjunto de datos, haciendo referencia a la acción que copia una sola línea en la tabla hija, 2da. acción para control del registro al cambiar el estado del registro a “CONFIRMADO” para evitar que el usuario pueda hacer cambios en la transacción, y la 3ra. acción para ejecutar un conjunto de acciones que detalle antes.

La pregunta es: ¿La estructura de las tablas está bien o debe agregar algo más? ¿Voy por buen camino? ¿Hay otra forma más fácil de hacerlo?

Gracias por tu tiempo y en español. :wink:

Solo para aclarar, ese no es mi sistema. Es un ejemplo que no tiene que ver con appsheet, sin embargo es posible hacer algo similar en appsheet (tengo una app que hace algo similar a lo del video).

Tu estructura de las tablas está bien (en mi opinión), aunque seguro hay más formas de estructurar la información y depende de lo que quieras lograr y que tan estricto o importante sea el manejo de la información.

Para poder responder a tus preguntas me hace falta comprender mejor lo que quieres lograr y para que necesitas esta funcionalidad.

Lo que entiendo es que las tablas encabezado funcionan para tener “agrupadas” las listas de entradas y salidas, como para decir… todas estas entradas pertenecen a este movimiento o registro, y asimismo con las salidas. Y el problema está en que quieres una forma de visualizar las transacciones ya sean entradas o salidas (las de tus tablas detalle) según fueron ocurriendo en un intervalo de tiempo especifico.

Si ese es el caso… se me ocurren varias formas de darle solución, pero la solución ideal solo la vas a encontrar tu, porque tiene que satisfacer tu necesidad.

A grandes rasgos y para darte una idea…
Puedes hacer una nueva tabla que contenga [Fecha_inicio] y [Fecha_final] o cómo en el video [desde] y [hasta] para crear una vista similar a esta

la idea es que esta tabla solo tiene un registro y es el que va a determinar las fechas de interés, luego tienes que generar Slices para tus tablas Entradas_detalle y Salidas_detalle, la formula filtro será similar a esta:

AND(DATE([fecha_registro])>=INDEX(Tu_nueva_tabla[Fecha_Inicio],1),DATE([fecha_registro])<=INDEX(Tu_nueva_tabla[Fecha_Final],1))

finalmente puedes hacer un dashboard que tenga las vistas de tipo tabla de tus Slices (Entradas_detalle y Salidas_detalle) y también la vista de detalle de tu nueva tabla en la que las fechas se pueden editar.
a esto le puedes sumar un botón para generar un informe en pdf con la información de tus tablas ya filtradas por las fechas.
La generación del pdf facilita muchas cosas ya que puedes llamar información de cualquier tabla de tu base de datos y las funciones que se aplican no comprometen la velocidad de sincronización de tu app (puedes usar tantos Select() como quieras)

yo se que esta respuesta no es la solución pero espero que te ayude un poco a dilucidar el panorama

2 Likes

Básicamente es tener unidas las transacciones de entradas y salidas en una sola vista tipo tabla, que se vean ordenadas por la fecha, como la imagen, y no separadas. Gracias por tu sugerencia, voy a intentarlo y te comparto el resultado.

Tu método con acciones para ir generando la tabla que quieres esta bien. También puedes hacer lo mismo pero con Bots.

Otra opción es tener solo una tabla de entradas y salidas (seria la fusión de tus tablas detalle) con una columna en la que se especifique si es entrada o salida (puedes usar esta columna para generar 2 Slices una para Entradas y otra para Salidas) esta opción si modifica la estructura de tu base de datos pero te ahorra las acciones y/o el uso de Bots