Application de business rules complexe

Home Forums Power BI Application de business rules complexe

Viewing 2 posts - 1 through 2 (of 2 total)
  • Author
    Posts
  • #161724
    24.marko
    Participant

    bonjour à tout le monde,

    voilà, je demande un peu d’aide car j’ai pb concernant l’application de business rules complexes.

    Par exemple, j’ai une table d’item (nommée Item, avec différentes caractéristiques) et je voudrai rechercher un élément nommé TARGET pour chacun de ces items dans une table Business_Rules.
    par exemple, la 1ere règle (nommé R1) est la suivante :

    
    BRH = null
    CAT = null
    DEPARTMENT = null
    SUB	= 0123456789
    LEFT(SUB;3) = null
    SUB_NAME = null
    ACCT = 000123456789123456USD
    IN(ACCT_NAME) = null
    TARGET = 3M // valeur à chercher
    ID_TARGET = R1 // id de valeur à chercher
    Number of criteria = 2 // nb de critères applicables pour cette règle
    Criteria List = SUB;ACCT; // liste des critères applicables pour cette règle
    TARGET_NUMBER = 3

    // target mais sans le M, stocké en INTEGER

    Donc, si j’ai un item qui à :

    SUB = 0123456789
    ACCT = 000123456789123456USD

    alors la règle R1 doit s’appliquer (en effet, les autres colonnes de l’item n’ont pas d’importance car dans la règle R1, seuls SUB et ACCT sont des critères, les autres valeurs étant nulles).

    J’ai une première version qui marche bien, mais très lourde à maintenir, sujette à des oublis… C’est un COALESCE sur une cascade de LOOKUPVALUE (Chaque LOOKUPVALUE va vérifier un liste de critère pré-défini) –> calculated column nommée ‘TARGET_EXPECTED_RESULT’

    j’ai tenté une autre approche

    find_BR_v3 = 
    VAR vTableBR = 
           CALCULATE(
            MAX(Business_Rules[TARGET]),
                FILTER(Business_Rules,
                Business_Rules[BRH] IN {[BRH],BLANK()} && 
                Business_Rules[CAT] IN {[CAT],BLANK()} && 
                Business_Rules[DEPARTMENT] IN {[DEPARTMENT],BLANK()} && 
                Business_Rules[SUB] IN {[SUB],BLANK()} && 
                Business_Rules[LEFT(SUB;3)] IN {LEFT([SUB],3),BLANK()} && 
                Business_Rules[SUB_NAME] IN {[SUB_NAME],BLANK()} && 
                Business_Rules[ACCT] IN {[ACCT],BLANK()} && 
                Business_Rules[IN(ACCT_NAME)] IN {[IN(ACCT_NAME)],BLANK()}
                )
           )
    
    RETURN 
    vTableBR

    sans succès le résultat est toujours le même pour chacun des items (et donc totalement faux).
    Un pb de row context/level ??

    il y a le PBIX attaché, avec mes tentatives

    Merci d’avance
    Marco

    Attachments:
    You must be logged in to view attached files.
    #161727
    24.marko
    Participant

    Hello,

    pb solved 🙂

    // In Items table
    TARGET =
    VAR itemBRH = Items[BRH]
    VAR itemCAT = Items[CAT]
    VAR itemDEPT = Items[DEPARTMENT]
    VAR itemSUB = Items[SUB]
    VAR itemSUBNAME = Items[SUB_NAME]
    VAR itemACCT = Items[ACCT]
    VAR itemACCTNAME = Items[ACCT_NAME]

    VAR Matches =
    FILTER (
    ADDCOLUMNS (
    ALL ( Business_Rules ), // ignore current filters on rules
    “__isMatch”,
    /* Treat blanks in rules as wildcards; otherwise require equality.
    Handle special columns LEFT(SUB;3) and IN(ACCT_NAME). */
    ( ISBLANK ( Business_Rules[BRH] ) || Business_Rules[BRH] = itemBRH ) &&
    ( ISBLANK ( Business_Rules[CAT] ) || Business_Rules[CAT] = itemCAT ) &&
    ( ISBLANK ( Business_Rules[DEPARTMENT] ) || Business_Rules[DEPARTMENT] = itemDEPT ) &&
    ( ISBLANK ( Business_Rules[SUB] ) || Business_Rules[SUB] = itemSUB ) &&
    ( ISBLANK ( Business_Rules[SUB_NAME] ) || Business_Rules[SUB_NAME] = itemSUBNAME ) &&
    ( ISBLANK ( Business_Rules[ACCT] ) || Business_Rules[ACCT] = itemACCT ) &&
    ( ISBLANK ( Business_Rules[LEFT(SUB;3)] ) || Business_Rules[LEFT(SUB;3)] = LEFT ( itemSUB, 3 ) ) &&
    ( ISBLANK ( Business_Rules[IN(ACCT_NAME)] ) || CONTAINSSTRING ( itemACCTNAME, Business_Rules[IN(ACCT_NAME)] ) )
    ),
    [__isMatch]
    )

    VAR BestRule =
    TOPN ( // pick the “best” rule
    1,
    Matches,
    Business_Rules[Number of criteria], DESC, // prefer more specific
    Business_Rules[TARGET_NUMBER], ASC // tiebreaker (your priority)
    )
    RETURN
    COALESCE ( MAXX ( BestRule, Business_Rules[TARGET] ), “unknown” )

Viewing 2 posts - 1 through 2 (of 2 total)
  • You must be logged in to reply to this topic.