単位換算の設定も踏まえて、品目マスタに結びついてる数量単位のリストを作るダイナミックバリデーションは、iDemiereに既に備わっていますが、SELECT文が多重にネストされており、見直しする価値があるのではないかと思っています。
そこで、テスト的に、別のロジックで同じ機能を持つダイナミックバリデーションを作成しました。
C_UOM Product Options(iDempiere標準のダイナミックバリデーション)
(
EXISTS (
/* UOM is a default UOM and no product selected */
SELECT *
FROM C_UOM uu
WHERE C_UOM.C_UOM_ID=uu.C_UOM_ID AND IsActive ='Y' AND IsDefault='Y' AND @M_Product_ID@=0
)
OR EXISTS (
/* UOM is the products UOM */
SELECT *
FROM M_Product p
WHERE C_UOM.C_UOM_ID=p.C_UOM_ID AND @M_Product_ID@=p.M_Product_ID
)
OR EXISTS (
/* For the products UOM there is a conversion that is explicitly bound to the product */
SELECT *
FROM M_Product p INNER JOIN C_UOM_Conversion c ON (p.C_UOM_ID=c.C_UOM_ID AND p.M_PRODUCT_ID=c.M_Product_ID AND c.IsActive ='Y' )
WHERE C_UOM.C_UOM_ID=c.C_UOM_TO_ID AND @M_Product_ID@=p.M_Product_ID
)
OR EXISTS (
/* For the products UOM there is a conversion that is not bound to any product explicitly */
SELECT *
FROM M_Product p INNER JOIN C_UOM_Conversion c ON (p.C_UOM_ID=c.C_UOM_ID AND c.M_Product_ID IS NULL AND c.IsActive ='Y' )
WHERE C_UOM.C_UOM_ID=c.C_UOM_TO_ID AND @M_Product_ID@=p.M_Product_ID
))
JP UOM List belong to select product(JPiereに追加したダイナミックバリデーション)
C_UOM.C_UOM_ID IN
(
SELECT p.C_UOM_ID AS C_UOM_ID
FROM M_Product p
INNER JOIN C_UOM u ON (p.C_UOM_ID = u.C_UOM_ID)
WHERE p.M_Product_ID = @M_Product_ID@
UNION
SELECT c.C_UOM_To_ID AS C_UOM_ID
FROM C_UOM_Conversion c
INNER JOIN C_UOM u2 ON (c.C_UOM_To_ID = u2.C_UOM_ID)
WHERE c.M_Product_ID = @M_Product_ID@
)
※このダイナミックバリデーションはC_UOM_IDの初期値に、DDL定義で100を設定しておく想定です。