Merge articolato L’argomento è risolto

Non è propriamente un programma di BI, ma nelle sue versioni più recenti anche Excel può fare grandi cose!

Moderatore: Utilizzo_prof_Excel

Rispondi

AntonioP
Messaggi: 79 | Topic creati
Iscritto il: gio 30 lug 2020, 13:18
Ringraziato: 10 volte
Contatta:

Merge articolato

Messaggio 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.
Allegati
MERGE articolato.xlsx
(12.29 KiB) Scaricato 120 volte



Autore del topic
AntonioP
Messaggi: 79 | Topic creati
Iscritto il: gio 30 lug 2020, 13:18
Ringraziato: 10 volte
Contatta:

Merge articolato

Messaggio 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
Avatar utente

Andrea90
Messaggi: 2255 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 672 volte
Contatta:

Merge articolato

Messaggio 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
Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link
Avatar utente

Enrico Galli
Messaggi: 890 | Topic creati
Iscritto il: dom 28 giu 2020, 19:03
Luogo: San Giovanni in Persiceto (BO)
Ringraziato: 325 volte
Contatta:

Merge articolato

Messaggio 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"
Allegati
MERGE articolato.xlsx
(21.83 KiB) Scaricato 124 volte
Enrico Galli
Link utili: I nostri tutorial | Come inserire: Immagini - Codice - Risolto
Se il forum ti è stato utile, considera di supportarlo con una libera donazione
Rispondi