Pagina 1 di 1

Merge articolato

Inviato: mer 28 giu 2023, 12:26
da AntonioP
Ciao, sono di fronte ad un argomento totalmente nuovo.
Sul gestionale Dynamic 365 ho una tabella 'SCONTI' con informazioni che non riesco a riportare su una tabella dei fatti con un semplice merge.
Il classico merce mi permette di mettere in relazione più campi, ma in questo caso la questione è molto articolata, perchè la tabella SCONTI può contenere uno sconto abbinato al codice cliente/articolo oppure codice cliente/gruppo articoli oppure cliente/tutti gli articoli.
Ovviamente la condizione cliente/articolo è la più semplice, ma le altre due mi mettono in crisi.
Vi allegato un esempio.
Attendo i vostri preziosi suggerimenti e grazie in anticipo.

Merge articolato

Inviato: mer 28 giu 2023, 12:39
da AntonioP
Dimenticavo........ Altra complicazione: nella tabella SCONTO nella colonna Cod.Art nello stesso campo è possibile dichiarare un elenco di codici attraverso il carattere speciale "|" che sta per AND

Merge articolato

Inviato: mer 28 giu 2023, 12:42
da Andrea90
AntonioP ha scritto: mer 28 giu 2023, 12:39 il carattere speciale "|" che sta per AND
Di questo interessa il giusto, perché tanto una gestione come quella che hai indicato, ovvero Art1 | Art2 | Art3 non è gestibile, quindi devi scomporre quella riga in n righe tante quanti sono gli articoli elencati.

Per il resto puoi effettuare questo calcolo per step, perché non puoi risolverla con un solo Merge. Se il tuo livello massimo di dettaglio è CLIENTE - ART allora definisci una tabella con tutte le combinazioni possibili (o esistenti), ad esempio quel "Tutti gli articoli" per il cliente 200 lo espliciterai per ciascun articolo e non in un'unica riga.

Per le casistiche particolari che non riuscirai a gestire in questo modo dovrai prevedere uno step successivo che potrà essere un nuovo merge oppure una condizione if..then..else.

Andrea

Merge articolato

Inviato: mer 28 giu 2023, 14:34
da Enrico Galli
Ciao, propongo questa soluzione con codice M personalizzato, che funziona sull'esempio MA potrebbe non funzionare più se le condizioni si complicano (diciamo che la condizione base è che per ogni cliente ci sia solo una tipologia di sconto):

Codice: Seleziona tutto

// FATTI
let
    Origine = Excel.CurrentWorkbook(){[Name="FATTI"]}[Content],
    #"Modificato tipo" = Table.TransformColumnTypes(Origine,{{"Cliente", Int64.Type}, {"Cod.Art", Int64.Type}, {"Art", type text}, {"Gruppo Sconti", type text}, {"Vendite", Int64.Type}}),
    #"Merge di query eseguito" = Table.NestedJoin(#"Modificato tipo", {"Cliente"}, SCONTI, {"CLIENTE"}, "SCONTI", JoinKind.LeftOuter),
    #"Aggiunta colonna personalizzata" = Table.AddColumn(#"Merge di query eseguito", "sc", each 
if List.First([SCONTI][TIPO]) = "Tutti gli articoli" then List.First([SCONTI][PREMIO]) 
else if List.First([SCONTI][TIPO]) = "Gruppo Sconti" then List.First(Table.SelectRows([SCONTI], (x)=> x[CODICE] = [Gruppo Sconti])[PREMIO])
else if List.First([SCONTI][TIPO]) = "Art" then List.First(Table.SelectRows([SCONTI], (x)=> Number.From(x[CODICE]) = [Cod.Art])[PREMIO]) 
else null
),
    #"Rimosse colonne" = Table.RemoveColumns(#"Aggiunta colonna personalizzata",{"SCONTI"}),
    #"Modificato tipo1" = Table.TransformColumnTypes(#"Rimosse colonne",{{"sc", Percentage.Type}})
in
    #"Modificato tipo1"

// SCONTI
let
    Origine = Excel.CurrentWorkbook(){[Name="SCONTI"]}[Content],
    #"Modificato tipo" = Table.TransformColumnTypes(Origine,{{"CLIENTE", Int64.Type}, {"TIPO", type text}, {"CODICE", type any}, {"PREMIO", type number}}),
    #"Suddividi colonna in base al delimitatore" = Table.ExpandListColumn(Table.TransformColumns(Table.TransformColumnTypes(#"Modificato tipo", {{"CODICE", type text}}, "it-IT"), {{"CODICE", Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "CODICE"),
    #"Modificato tipo1" = Table.TransformColumnTypes(#"Suddividi colonna in base al delimitatore",{{"CODICE", type text}})
in
    #"Modificato tipo1"