Kleine Ursache, große Wirkung PQ-(Einsteiger-Fehler)

In einem Excel-Forum wurde hier eine Frage gestellt, die eigentlich recht ein­fach mit Excel zu lösen ist. Aber gemäß einem mein­er Leit­sätze „eigentlich ja heißt eigentlich nein“ zeigt sich hier, dass Pow­er Query in manchen Fällen doch ganz anders „denkt“ als Plain Excel. 😎 

Der Fragesteller (Tom) hat mit der Excel-Funk­tion TEILERGEBNIS() ja schon einen gewis­sen Erfolg erzielt. In Beitrag #2 hat Ralf ja schon darauf hingewiesen, dass die Ver­wen­dung ein­er „intel­li­gen­ten Tabelle“ (StrgT oder StrgL) zu deut­lich per­for­man­teren anderen Ergeb­nis­sen führen wer­den. Und anschließend im Menü Start | Tabel­lenen­twurf das Häkchen bei Ergeb­niszeile set­zen und wie von Zauber­hand wird die Gesamt­summe automa­tisch unter­halb der eingegebe­nen Dat­en berech­net.

Da es in vie­len Fällen sin­nvoll sein kön­nte, die Sum­men für jedes einzelne Pro­dukt zu berech­nen, bietet sich der Weg über eine Piv­ot­ta­belle an. (Ja ich weiß, dass der Fragesteller darauf keinen Wert legt.) Auch hier wird das Ergeb­nis kor­rekt berech­net. Die Spalte Name in den Bere­ich Zeilen ziehen und die Spalte mit den Preisen in den Bere­ich Werte ziehen. Schon haben Sie das kor­rek­te und dur­chaus über­sichtliche Ergeb­nis, welch­es sich (natür­lich) automa­tisch anpasst, wenn weit­ere Pro­duk­te in die „intel­li­gente Tabelle“ im Blatt Input eingegeben wer­den. 💡 

So weit, so gut. Aber was hat das alles mit der Über­schrift „Kleine Ursache, große Wirkung“ zu tun, bis­lang ist ja kein Fehler (bei kor­rek­ter Vorge­hensweise) aufge­treten? Nun ja, eigentlich habe ich diesen Beitrag für User geschrieben, welche das in Excel inte­gri­erte Tool Pow­er Query ver­wen­den. Und da wer­den sie recht rasch ihr „blaues Wun­der“ erleben …

let
    Quelle = Excel.CurrentWorkbook(){[Name="Input"]}[Content],
    #"Geänderter Typ" = Table.TransformColumnTypes(Quelle,{{"Name", type text}}),
    #"Zusammengeführte Abfragen" = Table.NestedJoin(#"Geänderter Typ", {"Name"}, Preise, {"Produkt"}, "Preise", JoinKind.LeftOuter),
    #"Erweiterte Preise" = Table.ExpandTableColumn(#"Zusammengeführte Abfragen", "Preise", {"Preis"}, {"Preis"})
in
    #"Erweiterte Preise"

Im ersten hierüber dargestell­ten M-Code habe ich die als Tabelle for­matierten Dat­en der bei­den Arbeits­blät­ter Tabelle1 und Input importiert. Danach mit „meinem“ PQ-Ver­weis (hier im Blog beschrieben) die bei­den Abfra­gen verknüpft und das Ergeb­nis ist zwar kor­rekt aber recht ernüchternd: alles null.

Wieso, warum, weshalb? Auch hier kann ich ganz klar auf die Über­schrift dieses Beitrags ver­weisen. Die schein­bar kleine Ursache ist, dass Pow­er Query ganz klar zwis­chen Klein- und Großschrei­bung unter­schei­det, fast alles ist „case sen­si­tive“. Und die Wirkung ist, dass kein einziger Ein­trag aus der Tabelle Input mit den Pro­duk­ten aus der im Tabel­len­blatt Tabelle1 iden­tisch ist; Honig ist für PQ nun ein­mal etwas ganz anderes als honig.

Anstatt eine Lösung mit „ver­schwurbel­ten“ M-Funk­tio­nen zu kreieren, gehe ich den wirk­lich user­fre­undlicheren Weg über jew­eils eine Hil­f­ss­palte, welche dann auch nach der Berech­nung wieder ent­fer­nt wer­den kann. Dieser M-Code zeigt auf, wie Sie in ähn­lich gelagerten Fällen trotz der unter­schiedlichen Groß- Klein­schrei­bung zu einem kor­rek­ten Ergeb­nis kom­men. Hier nun der entsprechende Code für Sie:

let
    Quelle = Excel.CurrentWorkbook(){[Name="Input"]}[Content],
    #"Geänderter Typ" = Table.TransformColumnTypes(Quelle,{{"Name", type text}}),
    #"Zusammengeführte Abfragen" = Table.NestedJoin(#"Geänderter Typ", {"Name"}, Preise, {"Produkt"}, "Preise", JoinKind.LeftOuter),
    #"Erweiterte Preise" = Table.ExpandTableColumn(#"Zusammengeführte Abfragen", "Preise", {"Preis"}, {"Preis"}),
    #"Hinzugefügte benutzerdefinierte Spalte" = Table.AddColumn(#"Erweiterte Preise", "lowerName", each Text.Lower([Name])),
    #"Zusammengeführte Abfragen1" = Table.NestedJoin(#"Hinzugefügte benutzerdefinierte Spalte", {"lowerName"}, Preise, {"lowerProdukt"}, "Preise", JoinKind.LeftOuter),
    #"Erweiterte Preise1" = Table.ExpandTableColumn(#"Zusammengeführte Abfragen1", "Preise", {"Preis"}, {"Preis.1"}),
    #"Geänderter Typ1" = Table.TransformColumnTypes(#"Erweiterte Preise1",{{"Preis.1", Currency.Type}}),
    #"Entfernte Spalten" = Table.RemoveColumns(#"Geänderter Typ1",{"Preis", "lowerName"})
in
    #"Entfernte Spalten"

Und hier, beim Stich­wort last but not least find­en Sie noch einen Hin­weis, wo und wie Sie Antworten auf eventuelle Fra­gen oder auch die aus­gear­beit­ete Datei bekom­men kön­nen. Grundle­gen­des zum The­ma M-Code lesen Sie hier im Blog nach.

Dieser Beitrag wurde unter Allgemein veröffentlicht. Setze ein Lesezeichen auf den Permalink.