Evitar duplicados en tabla hija

Hola,

Me esta doliendo la cabeza de no poder finalizar esta validacion.
Previamente busque y lei varios posts sobre el tema, pero no doy con la solucion.

https://www.googlecloudcommunity.com/gc/Tips-Tricks/How-to-Prevent-Duplicate-Records/m-p/322114#M2030

Tengo una tabla INVENTARIO - Columna [PART NUMBER] KEY, donde se almacenan los productos.
Luego una tabla VENTAS
[ID_DETALLE] Type Text - Key
[ID_VENTAS] Type Text - Label

Y tabla hija DETALLE_VENTAS
[ID_DETALLE] Type Text - Key
[ID_VENTAS] REF A Tabla Ventas
[PART NUMBER] REF A Tabla INVENTARIO

en la columna [PART NUMBER] Tabla DETALLE_VENTAS / Valid if:

NOT(IN([_THIS],SELECT(DETALLE_VENTAS[PART NUMBER], [ID_DETALLE] <> [_THISROW].[ID_DETALLE])))

intente con otras columnas y tampoco funciona, no me deja pasar productos que nunca se ingresaron.

Luego, tengo que anidarlo con esta formula en Valid IF

IF( ISBLANK([CATEGORIA]),
    ORDERBY( INVENTARIO[PART NUMBER], [CANTIDAD], true ),
    ORDERBY( FILTER("INVENTARIO", [CATEGORIA] = [_ThisRow].[CATEGORIA]), [CANTIDAD], true )
  )

Alguna orientacion, ayuda?
muchas gracias

Alguna ayuda?

alguien q aporte algo?

Te ayudo pero tengo dudas de lo que quieres lograr
Puedes traducirme lo que quieres lograr con tu fórmula

y a que te refieres con anidarlo ?

te voy a dejar un spoiler de lo que creo que puede ser parte de la solución…
INTERSECT(LIST([PART NUMBER]),DETALLE_VENTAS[PART NUMBER])

Gracias @Kabulino

NOT(IN([_THIS],SELECT(DETALLE_VENTAS[PART NUMBER], [ID_DETALLE] <> [_THISROW].[ID_DETALLE])))

Lo que quiero hacer con esta formula es no permitir que se ingresen Part Numbers o productos que ya fueron ingresados (duplicados). Pero no funciona.

te voy a dejar un spoiler de lo que creo que puede ser parte de la solución…> INTERSECT(LIST([PART NUMBER]),DETALLE_VENTAS[PART NUMBER])

Agregué tu formula en VALID IF de la columna [PART NUMBER] tabla DETALLE_VENTAS donde se ingresan los productos pero me muestra la lista vacia.
[PART NUMBER] type REF a Tabla INVENTARIO (donde se almacenan los productos)


y a que te refieres con anidarlo ?

Me refiero a unir las 2 formulas en VALID IF, por un lado esta formula que no funciona:

NOT(IN([_THIS],SELECT(DETALLE_VENTAS[PART NUMBER], [ID_DETALLE] <> [_THISROW].[ID_DETALLE])))

y esta otra:

IF( ISBLANK([CATEGORIA]),
    ORDERBY( INVENTARIO[PART NUMBER], [CANTIDAD], true ),
    ORDERBY( FILTER("INVENTARIO", [CATEGORIA] = [_ThisRow].[CATEGORIA]), [CANTIDAD], true )
  )

dices que [PART NUMBER] es el key de tu tabla inventario, generas esa llave con la fórmula UNIQUEID()? y cuál es su label?
Si usas UNIQUEID() teóricamente el ID siempre va a ser único.
tu fórmula tiene que basarse en el Label de inventario (Producto?).

La fórmula que te dí te regresa los elementos en común de las 2 listas, tendrias que meterla en un ISBLANK() para que sea una evaluación.

Piensa en usar la sección de Suggested values.

y cuando te pido capturas de pantalla de las tablas en appsheet me refiero a algo así.

Gracias @Kabulino

[PART NUMBER] es el KEY de la tabla INVENTARIO pero no es UNIQUEID()
El LABEL es una columna virtual [PART_PRODUCT] type text

CONCATENATE([PART NUMBER], " “,”•“,” ",[PRODUCTO])

Con la finalidad de que me muestre el Part Number y Producto completo en la lista para que sea mas facil la busqueda.

Intente con estas 2 formulas y no funcionan

NOT(IN([_THIS],SELECT(INVENTARIO[PART_PRODUCT], [PART NUMBER] <> [_THISROW].[PART NUMBER])))

ISBLANK(INTERSECT(LIST([PART NUMBER]),INVENTARIO[PART_PRODUCT]))

no quieres que se ingresen duplicados con respecto a tu tabla ventas o a tu tabla inventario?

Valid if

NOT(IN([_THISROW].[PART NUMBER],INVENTARIO[PART NUMBER]))

Suggested values

IF( ISBLANK([CATEGORIA]),
    ORDERBY( INVENTARIO[PART NUMBER], [CANTIDAD], true ),
    ORDERBY( FILTER("INVENTARIO", [CATEGORIA] = [_ThisRow].[CATEGORIA]), [CANTIDAD], true )
  )

Prueba esto y me comentas que errores o deficiencias le encuentras

Gracias @Kabulino

No quiero que ingresen duplicados con respecto a la tabla hija DETALLE_VENTAS.

Intenté con esa formula y toma cualquier producto como duplicado.

NOT(IN([_THISROW].[PART NUMBER],INVENTARIO[PART NUMBER]))

Lo mismo con esta formula, cambiando de tabla

NOT(IN([_THISROW].[PART NUMBER],DETALLE_VENTAS[PART NUMBER]))

Sino se puede ingresar el mismo producto, como muestra la imagen. Es lo que quiero evitar

ok, ya te estoy entendiendo
Pienso que es una mala praxis el tener una llave (key) que no tenga de valor inicial UNIQUEID() pero no sé, supongo que existen casos en los que está justificado según la funcionalidad a lograr. Suponiendo que en tu caso te estás asegurando de que sean valores únicos (los que tu quieras pero que no se repitan) y analizando tus capturas de pantalla creo que quizá algo de esto te funcione

En caso de que estés agregando a detalle ventas y no quieras duplicados con la tabla detalle ventas

NOT(IN([PRODUCTO],DETALLE_VENTAS[PRODUCTO]))

En caso de que estés agregando a detalle ventas y no quieras duplicados con especificamente los registros de detalle ventas que pertenezcan o estén referenciados a la misma venta…

NOT(IN([PRODUCTO],[ID_VENTAS].[Related DETALLE_VENTASs][PRODUCTO]))

Gracias @Kabulino

La columna [PART NUMBER] Key de la tabla INVENTARIO no es UNIQUEID() porque ingreso directamente el PART NUMBER y el sistema me informa cuando se quiere ingresar un Part Number Duplicado.

En caso de que estés agregando a detalle ventas y no quieras duplicados con la tabla detalle ventas> > > NOT(IN([PRODUCTO],DETALLE_VENTAS[PRODUCTO]))> > > En caso de que estés agregando a detalle ventas y no quieras duplicados con especificamente los registros de detalle ventas que pertenezcan o estén referenciados a la misma venta…> > > NOT(IN([PRODUCTO],[ID_VENTAS].[Related DETALLE_VENTASs][PRODUCTO]))>

Seria el 2do caso, productos de la misma venta no esten duplicados.
Pero la formula me arroja el siguiente error:

Error in expression ‘[ID_VENTAS].[Related DETALLE_VENTASs][PRODUCTO]’ : Unable to find column ‘Related DETALLE_VENTASs][PRODUCTO’

Verifica el nombre de tus columnas yo estoy suponiendo que ese es el nombre de la columna en tu tabla ventas

No entiendo la sintaxis y logica de la formula.
La columna es [PART NUMBER] , no [PRODUCTO]
Aun asi, modificando por [PART NUMBER] da error.

NOT(IN([PRODUCTO],[ID_VENTAS].[Related DETALLE_VENTASs][PRODUCTO]))

El problema no es la parte de

[ID_VENTAS].[Related DETALLE_VENTASs]

da error cuando le agregas la columna [PRODUCTO] al final, ya que tiene 3 columnas juntas, no le falta o sobra algo?

La columna que estoy editando en VALID IF, [PART NUMBER] ya se encuentra en la tabla DETALLE_VENTAS

te adjunto una imagen de la tabla VENTAS.

perdón, es verdad

Para que funcionara asi tendrias que hacer una columna virtual en tu tabla ventas con la fórmula

[Related DETALLE_VENTASs][PRODUCTO]

y el valid if quedaría

NOT(IN([PRODUCTO],[ID_VENTAS].[Nueva columna virtual]))

Si no te hace sentido con [PRODUCTO] reemplazarlo con [PART NUMBER]

Siiiiiiii!!! ahora funciona!! :grin:
Mil gracias! @Kabulino

Lo ultimo, si tienes ganas y tiempo, ya te moleste bastante.

Hay alguna forma de fusionar estas 2 formulas en Valid If:

NOT(IN([PART NUMBER],[ID_VENTAS].[PART_DETALLEVENTAS]))
IF( ISBLANK([CATEGORIA]),
    ORDERBY( INVENTARIO[PART NUMBER], [CANTIDAD], true ),
    ORDERBY( FILTER("INVENTARIO", [CATEGORIA] = [_ThisRow].[CATEGORIA]), [CANTIDAD], true )
  )

Funciona bien dejando la ultima formula en Suggested values, pero funciona mucho mejor en Valid If, ya que cuando elijo una categoria de la lista para filtrar productos, no me borra el producto seleccionado, lo sigue dejando seleccionado.
Solo necesito fusionarlas, si es que se puede en Valid If

Gracias!

Prueba con

AND(NOT(IN([PART NUMBER],[ID_VENTAS].[PART_DETALLEVENTAS])),
IF( ISBLANK([CATEGORIA]),
ORDERBY( INVENTARIO[PART NUMBER], [CANTIDAD], true ),
ORDERBY( FILTER("INVENTARIO", [CATEGORIA] = [_ThisRow].[CATEGORIA]), [CANTIDAD], true )
)

Gracias @Kabulino
Le agregué el parentesis al final que faltaba pero me tira este error.

Condition AND(NOT(IN([PART NUMBER],[ID_VENTAS].[PART_DETALLEVENTAS])), IF(ISBLANK([CATEGORIA]),ORDERBY(INVENTARIO[PART NUMBER],[CANTIDAD],“true”),ORDERBY(SELECT(INVENTARIO[PART NUMBER],([CATEGORIA] = [_ThisRow].[CATEGORIA])),[CANTIDAD],“true”))) has an invalid structure: subexpressions must be Yes/No condition

AND(
NOT(IN([PART NUMBER],[ID_VENTAS].[PART_DETALLEVENTAS])),
IF( 
ISBLANK([CATEGORIA]),
ORDERBY( INVENTARIO[PART NUMBER], [CANTIDAD], true ),
ORDERBY( FILTER("INVENTARIO", [CATEGORIA] = [_ThisRow].[CATEGORIA]), [CANTIDAD], true )
))
IF(ISBLANK([CATEGORIA]),
AND(NOT(IN([PART NUMBER],[ID_VENTAS].[PART_DETALLEVENTAS])),ORDERBY( INVENTARIO[PART NUMBER], [CANTIDAD], true )),
AND(NOT(IN([PART NUMBER],[ID_VENTAS].[PART_DETALLEVENTAS])),ORDERBY( FILTER("INVENTARIO", [CATEGORIA] = [_ThisRow].[CATEGORIA]), [CANTIDAD], true ))
)

A ver si esta te sirve

Me tira el mismo error

A mi me da la impresión que no necesitas ninguna de estas fórmulas, lo que realmente necesitas es arreglar la estructura de tu base de datos para no tener estas complicaciones
sin embargo prueba esta y me dices si te funciona

IFS(
AND(NOT(IN([PART NUMBER],[ID_VENTAS].[PART_DETALLEVENTAS])),ISBLANK([CATEGORIA])),
ORDERBY( INVENTARIO[PART NUMBER], [CANTIDAD], true),
AND(NOT(IN([PART NUMBER],[ID_VENTAS].[PART_DETALLEVENTAS])),ISNOTBLANK([CATEGORIA])),
ORDERBY( FILTER("INVENTARIO", [CATEGORIA] = [_ThisRow].[CATEGORIA],), [CANTIDAD], true))