Validar columna ENUM segun productos tabla hija

Hola,

Tengo un problema que no puedo resolver.
Tengo una tabla VENTAS donde se ingresan los datos del cliente y una tabla hija DETALLE_VENTAS donde se ingresan todos los productos de cada cliente.

En la tabla VENTAS, hay una columna llamada [VERIFICADO] type ENUM - SI / NO.
Lo que hace esta columna es que cada vez que un empleado ingresa una entrada en la tabla VENTAS y DETALLE_VENTAS, la columna [VERIFICADO] permita operar con cada entrada (usar actions, pdf, etc).

La condiciones son las siguientes:

Si los productos de la tabla DETALLE_VENTAS contienen las palabras "Laptop" , "Monitor" , "Teclados"
La columna [VERIFICADO] de la tabla VENTAS sea NO , de lo contrario sea SI

Captura de pantalla 2023-07-21 a la(s) 23.06.40.png

En Initial Value coloque la siguiente Formula:

IF ( 
IN([Related DETALLE_VENTASs][PRODUCTO], LIST ( "Laptop","Monitor", "Teclados")), "NO", "SI")

Pero no obtengo el resultado deseado con esa formula. Alguna ayuda?

Gracias.

 

 

0 15 411
15 REPLIES 15

JSO
Silver 2
Silver 2

No puede funcionar:

[Related DETALLE_VENTASs][PRODUCTO] devuelve una lista con los productos de cada linea de venta.

La expresion IN(text, List)  lo que hace es buscar un texto entre los elementos de una lista.

Algo que podrรญa funcionar es:

IF(

   OR(

      IN("Laptop", [Related DETALLE_VENTASs][PRODUCTO]),

      IN("Monitor", [Related DETALLE_VENTASs][PRODUCTO]),

      IN("Teclados", [Related DETALLE_VENTASs][PRODUCTO])

      )

,"NO,"SI")

Tambien creo que la expresion debe ir en FORMULA y no en Initial Value.

Gracias @JSO 

Me da error la formula en App Formula de la columna [VERIFICADO]

Expression 'IF( OR( IN("Laptop", [Related DETALLE_VENTASs][PRODUCTO]), IN("Monitor", [Related DETALLE_VENTASs][PRODUCTO]), IN("Teclados", [Related DETALLE_VENTASs][PRODUCTO]) ) ,"NO,"SI")' was unable to be parsed: Unterminated string.

IF(
  FIND("laptop", LOWER([Related DETALLE_VENTASs][PRODUCTO])) +
  FIND("monitor", LOWER([Related DETALLE_VENTASs][PRODUCTO])) +
  FIND("teclados", LOWER([Related DETALLE_VENTASs][PRODUCTO])) > 0,
  "No", "Sรญ"
)

 

En esto tengo mis dudas. FIND(text,text) se aplica para buscar un texto en otro y [Related DETALLE_VENTASs][PRODUCTO] es una lista.

FIND(lowered_textLOWER(List))

  • FIND() es sensible al caso. 
  • LOWER() convierte una Lista en Texto

Creo que LOWER() lo que hace es convertir texto a minusculas.

Las funciones de procesamiento de texto, si su input no es de tipo Text, lo convierten primero en texto. 

LOWER(5.0 * 6)

๐Ÿ˜ฑ 

Indeed!
And I see that the list is also converted into a text with its chained elements.
AppSheet surprises me more every day.

๐Ÿคฃ

Gracias @Joseph_Seddik 

Toma bien la formula en App Formula de la columna [VERIFICADO], pero cuando ingreso cualquier producto que contenga "laptop", "monitor" o "teclados", siempre queda seteado en SI.
Deberia cada vez que se ingresa alguno de estos productos, setearse en NO.

Por otro lado, encontre un problema de logica.
Lo que necesito es que si el producto es "laptop", "monitor" "teclados" no coloque ni SI ni NO, podria ser una opcion PAUSA o nada.
Donde luego por medio de un ACTION una persona controlador manual lo coloque en SI.

Los demas productos que no contienen estos nombres, se habilitan directamente (SI) sin necesitar intervencion de una persona controlador manual, por ejemplo un mouse.

Deberia hacer una formula a la inversa, ejemplo:

IFS (
    OR (
    NOT(CONTAINS([Related DETALLE_VENTASs][PRODUCTO], "laptop")), "SI",

    NOT(CONTAINS([Related DETALLE_VENTASs][PRODUCTO], "monitor")), "SI",
    NOT(CONTAINS([Related DETALLE_VENTASs][PRODUCTO], "teclados")), "SI",
))


Espero haber explicado bien la necesidad
Gracias!

Yo harรญa una separaciรณn entre una columna que uso como estado "calculado" y otra que el usuario podrรญa editar. 

Por lo tanto crearรญa una columna virtual, con exactamente la misma App formula en mi รบltima respuesta, y la llamarรญa por ejemplo "ยฟNecesita Verificaciรณn?"

Otra columna se llamarรก p.e. "Verificaciรณn", de tipo Enum con los valores: "Pendiente, Aceptada, Rechazada", se mostrarรก al usuario รบnicamente si la columna virtual tiene el valor "Sรญ", y tendrรก su Initial value "Pendiente".

Espero que esto te pueda ayudar.

 

Gracias @Joseph_Seddik 

Cree la columna real [VERIFICACION] del tipo ENUM (PENDIENTE, ACEPTADA, RECHAZADA) con el Initial Value en PENDIENTE.

Eso genera que cada entrada que se ingresa en la Tabla VENTAS quede seteada en PENDIENTE, la idea es que quede seteada segun el producto (Laptop, Monitor, Teclados) necesito que no elija ninguna opcion.

Ahora el problema es la columna virtual, no entiendo que relacion tiene con la otra columna. Al usuario no se le pregunta si necesita verificacion, el sistema debe elegir automaticamente segun este criterio:

-Si el producto ingresado en DETALLE_VENTAS contiene "Laptop" - NADA (sin seleccion)

-Si el producto ingresado en DETALLE_VENTAS contiene "Monitor" - NADA (sin seleccion)

-Si el producto ingresado en DETALLE_VENTAS contiene "Mouse" - ACEPTADA.

Tendria un problema logico si cada vez que se ingresa (Laptop, monitor, teclados) lo marque en la casilla RECHAZADA, ya que luego esos productos que se verifican manualmente, se utiliza un ACTION que coloca la columna [VERIFICACION] en ACEPTADA (SI).

Captura de pantalla 2023-07-22 a la(s) 22.31.41.png

La idea es mostrar dos campos al usuario:

  1. "ยฟNecesita Verificaciรณn?", virtual, se actualiza con cada entrada, y muestra "Sรญ" รบnicamente en el caso que una entrada tenga una de las palabras definidas. 
        
  2. "Estado de Verificaciรณn", normal, รฉste es el campo que el usuario serรก capaz de actualizar. Con el parรกmetro "Show?', este campo y el botรณn de acciรณn relacionado serรกn ocultados y se mostrarรกn รบnicamente en el caso que el campo anterior (el virtual) tenga el valor "Sรญ". Su estado inicial serรก "Pendiente" y el usuario podrรก cambiarlo a "Aceptada" o "Rechazada". Por otro lado, en el caso que no se necesite verificaciรณn (p.e "ratรณn"), este campo no serรก necesario en la vista.

 

Entrada contiene ยฟNecesita Verificaciรณn? Estado de Verificaciรณn
Monitor Sรญ Pendiente
Mouse No  
Laptop Sรญ Aceptada
Teclado Sรญ Rechazada
Cable No   
Auriculares No  
Disco Duro Sรญ Pendiente

 

Muchas Gracias @Joseph_Seddik 

Hay un problema con la formula en la columna virtual [NECESITA VERIFICACION] de la tabla VENTAS.

Captura de pantalla 2023-07-23 a la(s) 15.15.14.pngCaptura de pantalla 2023-07-23 a la(s) 15.14.57.png

Cuando NO se ingresa ningun producto en [DETALLE_VENTAS] - Tabla hija de VENTAS, la columna virtual queda seteada en SI

Captura de pantalla 2023-07-23 a la(s) 15.16.19.png

Cuando ingreso un MOUSE (producto que deberia setearlo como NO) queda en SI

Captura de pantalla 2023-07-23 a la(s) 15.18.20.png

 

 


@marinocity wrote:

Cuando NO se ingresa ningun producto en [DETALLE_VENTAS] - Tabla hija de VENTAS, la columna virtual queda seteada en SI


Entonces, hay que aรฑadir este caso explรญcitamente en la fรณrmula de la columna "ยฟNecesita Verificaciรณn?".

IF( ISBLANK([Related DETALLE_VENTASs][PRODUCTO]), "No",
  IF(

    FIND("laptop", LOWER([Related DETALLE_VENTASs][PRODUCTO])) +
    FIND("monitor", LOWER([Related DETALLE_VENTASs][PRODUCTO])) +
    FIND("teclado", LOWER([Related DETALLE_VENTASs][PRODUCTO])) > 0,
    "Sรญ", "No"
  )
)

O bien:

IF(
  FIND("laptop", LOWER([Related DETALLE_VENTASs][PRODUCTO])) +
  FIND("monitor", LOWER([Related DETALLE_VENTASs][PRODUCTO])) +
  FIND("teclado", LOWER([Related DETALLE_VENTASs][PRODUCTO])) = 0,
  "No", "Sรญ"
)


@marinocity wrote:

Cuando ingreso un MOUSE (producto que deberia setearlo como NO) queda en SI


Porque en tu expresiรณn has escrito las palabras claves en mayรบsculas. Debes escribirlas en minรบsculas como en mi ejemplo o cambiar LOWER() en UPPER()


@Joseph_Seddik wrote:
  • FIND() es sensible al caso. 

Gracias nuevamente @Joseph_Seddik 

La formula con UPPER o LOWER no funciona, la buena noticia es que con la siguiente formula la columna virtual [NECESITA VERIFICACION] funciona sin problemas:

IFS(
CONTAINS([Related DETALLE_VENTASs][PRODUCTO],"LAPTOP"),"SI",
CONTAINS([Related DETALLE_VENTASs][PRODUCTO],"MONITOR"),"SI",
CONTAINS([Related DETALLE_VENTASs][PRODUCTO],"TECLADO"),"SI",
NOT(CONTAINS([Related DETALLE_VENTASs][PRODUCTO],"LAPTOP")),"NO",
NOT(CONTAINS([Related DETALLE_VENTASs][PRODUCTO],"MONITOR")),"NO",
NOT(CONTAINS([Related DETALLE_VENTASs][PRODUCTO],"TECLADO")),"NO"
)

Lo que no entendi, disculpas del caso, es la 2da parte:

2."Estado de Verificaciรณn", normal, รฉste es el campo que el usuario serรก capaz de actualizar. Con el parรกmetro "Show?', este campo y el botรณn de acciรณn relacionado serรกn ocultados y se mostrarรกn รบnicamente en el caso que el campo anterior (el virtual) tenga el valor "Sรญ". Su estado inicial serรก "Pendiente" y el usuario podrรก cambiarlo a "Aceptada" o "Rechazada". Por otro lado, en el caso que no se necesite verificaciรณn (p.e "ratรณn"), este campo no serรก necesario en la vista.

La columna [VERIFICACION] type ENUM tiene 2 campos, PENDIENTE / ACEPTADA.
Initial Value  PENDIENTE
Show? [NECESITA VERIFICACION] = "SI"

Se crearon 2 ACTIONS en Behavior:

1- Verificado
Captura de pantalla 2023-07-23 a la(s) 18.24.28.png
Only if this condition is true:
AND (
IN(LOOKUP(USEREMAIL(), "USUARIOS", "EMAIL", "ROL"), { "ADMIN"}),
[NECESITA VERIFICACION]="SI",
[PROCESO]<>"ENTREGADO"
)

2- Pendiente
Captura de pantalla 2023-07-23 a la(s) 18.28.04.png
Only if this condition is true:
AND (
[NECESITA VERIFICACION]="NO",
[PROCESO]="PENDIENTE"
)

Muestra el action segun el resultado de la columna virtual, el problema logico que no puedo resolver es como hago para que presionando el boton o action VERIFICADO me cambie el valor a "NO" en la columna virtual y asi aparezca solo el action PENDIENTE que le permite al usuario seguir cambiando de procesos.
No me queda claro el rol de la columna normal [VERIFICACION], ya que la raiz de todo es la columna virtual que decide cuando mostrar el action.
Seguramente de algo no me estoy dando cuenta y no lo puedo resolver.

Disculpas nuevamente por la demora en la resolucion.

Top Labels in this Space