Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 67265 Skopiuj do schowka Obejście zapętlania zapytania PQ
Autor Wiadomość
Bill Szysz 
Excel Expert


Wersja: Win Office 365
Pomógł: 880 razy
Posty: 3556
Wysłany: 26-02-2020, 22:48   

fuse, jeśli zrozumiale opiszesz w jaki sposób otrzymujesz "ilość surowca" w zadaniu 2 i 3 to pewnie coś się wymyśli. Z pewnością jednak nie będzie to już tak szybkie, jak to co wcześniej proponowaliśmy z Niedźwiadkami.
Kiedyś tam (chyba ze dwa albo trzy lata temu) dołożyłem swoje trzy grosze przy budowie pewnej funkcji (koleżanka z niemiec ją robiła) więc może udałoby się ją w Twoich przypadkach zastosować.
rek-ami się na razie nie zajmuj....to już ( w takim zastosowaniu w jakim zrobił to kolega) wyższa szkoła jazdy. Najpierw dobrze ogarnij podstawowe rzeczy a na te rek-i przyjdzie czas (np wtedy gdy będziesz potrafił odróżnić jeden "_" od drugiego "_" w tym samym kroku (podpowiem, że każdy z nich może być czymś zupełnie innym) ;-)

Edit: Teraz ściągnąłem Twój ostatni plik. Opisałeś tam w jaki sposób mają przebiegać obliczenia. Jedna sposób obliczania nie zgadza się z wynikami jakie przedstawiasz. Przykład Margaryna dla WG masz wpisaną w tabelce ilość surowca 0,25 a z obliczeń wychodzi ~0,2042 (0,35 * 0,7/1,2)
Wyjaśnisz te rozbieżności?
_________________
Zlecenia, konsultacje, doradztwo i szkolenia z Power Query, Power BI i Excela - Raporty, Analizy, Projekty
Pozdrawiam, były szbill62 aktualnie Bill Szysz
ID posta: 382560 Skopiuj do schowka
 
 
DwaNiedźwiedzie 
Excel Expert



Pomógł: 248 razy
Posty: 625
Wysłany: 27-02-2020, 04:22   

Mam podobne wątpliwości jak Bill, coś mi się te liczby nie zgadzają - aczkolwiek zadanie jest na tyle ciekawym wyzwaniem, że spróbowałem :) Pewnie coś można by zrobić wydajniej, ale na tę chwilę sprawdź, czy koncepcja działa:
Kod:
let
    Źródło = Excel.CurrentWorkbook(){[Name="TabelkaPoczątkowa_v3"]}[Content],
    #"Zmieniono typ" = Table.TransformColumnTypes(Źródło,{{"Surowiec", type text}, {"Ilość surowca", type number}, {"Proces", type text}, {"Produkt", type text}, {"Ilość produktu", type number}}),
    #"Przefiltrowano produkty" = Table.SelectRows(#"Zmieniono typ", each Text.StartsWith([Produkt], "WG")),
    #"Usunięto inne kolumny" = Table.SelectColumns(#"Przefiltrowano produkty",{"Produkt", "Ilość produktu"}),
    #"Usunięto duplikaty1" = Table.Distinct(#"Usunięto inne kolumny", {"Produkt"}),
    surowce = List.Buffer(List.Distinct(#"Zmieniono typ"[Produkt])),
    skład = Table.SelectRows(#"Zmieniono typ", each not List.Contains(surowce, _[Surowiec])),
    #"Przefiltrowano wiersze" = Table.Buffer(Table.SelectRows(#"Zmieniono typ", each List.Contains(surowce, [Surowiec]))),
    #"Dodano kolumnę składników" = Table.AddColumn(#"Usunięto duplikaty1", "składniki", (rek) => List.Generate(() => [tb=null, Surowiec=rek[Produkt], mnożnik=1, ilość=rek[Ilość produktu]], each try [ilość] is number otherwise false, (rek2) => [tb=Table.SelectRows(#"Przefiltrowano wiersze", each [Produkt]=rek2[Surowiec]){0}, Surowiec=tb[Surowiec], mnożnik=rek2[ilość]/tb[Ilość produktu], ilość=tb[Ilość surowca]], each Record.RemoveFields(_, {"tb","ilość"}))),
    #"Rozwinięty element składniki" = Table.ExpandListColumn(#"Dodano kolumnę składników", "składniki"),
    #"Rozwinięty element składniki1" = Table.ExpandRecordColumn(#"Rozwinięty element składniki", "składniki", {"Surowiec", "mnożnik"}, {"składnik", "mnożnik"}),
    #"Scalone podskładniki" = Table.NestedJoin(#"Rozwinięty element składniki1",{"składnik"},skład,{"Produkt"},"podskładniki",JoinKind.LeftOuter),
    #"Rozwinięty element podskładniki" = Table.ExpandTableColumn(#"Scalone podskładniki", "podskładniki", {"Proces", "Surowiec", "Ilość surowca"}, {"Proces", "Surowiec", "ilość"}),
    #"Dodano kolumnę mnożnik" = Table.AddColumn(#"Rozwinięty element podskładniki", "Ilość surowca", each [mnożnik]*[ilość]),
    #"Dodano kolumnę ilość WG" = Table.AddColumn(#"Dodano kolumnę mnożnik", "Ilość surowca na sztukę wyrobu", each [Ilość surowca]/[Ilość produktu]),
    kolejność = #table({"lp","proces"}, {{1,"Rozpuszczanie"},{2,"Mieszanie I"},{3,"Mieszanie II"},{4,"Mieszanie III"},{5,"Wyrastanie"},{6,"Dzielenie"},{7,"Pakowanie"}}),
    #"Scalone zapytania" = Table.NestedJoin(#"Dodano kolumnę ilość WG",{"Proces"},kolejność,{"proces"},"kolejność",JoinKind.LeftOuter),
    #"Rozwinięty element kolejność" = Table.ExpandTableColumn(#"Scalone zapytania", "kolejność", {"lp"}, {"lp"}),
    #"Posortowano wiersze" = Table.Sort(#"Rozwinięty element kolejność",{{"Produkt", Order.Ascending}, {"lp", Order.Ascending}, {"Proces", Order.Ascending}, {"Surowiec", Order.Ascending}}),
    #"Usunięto kolumny" = Table.RemoveColumns(#"Posortowano wiersze",{"składnik", "mnożnik", "ilość", "lp"}),
    #"Zmieniono typ1" = Table.TransformColumnTypes(#"Usunięto kolumny",{{"Ilość surowca", type number}, {"Ilość surowca na sztukę wyrobu", type number}})
in
    #"Zmieniono typ1"

Odnośnie "reków": wydaje mi się, że nie są takie straszne, jak Bill straszy :) Generalnie są trzy metody wprowadzania funkcji:
Kod:
each _=1
(_) => _=1
(rek) => rek=1

W pierwszych dwóch podkreślnik jest lokalnym odpowiednikiem zmiennej, która zawiera przetwarzany element (np. w funkcji Table.SelectRows(tabela, each _[kolumna]=1) lub jej odpowiedniku Table.SelectRows(tabela, (_) => _[kolumna]=1), choć to akurat trochę średnie przykłady, bo tu podkreślniki - oprócz tego w nawiasie - nie są wymagane, ale ideę chyba rozumiesz). Problem powstaje, gdy chcemy zagnieździć funkcje (tak jak w powyższej kwerendzie w kroku #"Dodano kolumnę składników" użyłem Table.AddColumn, wewnątrz której uruchamiam List.Generate, która wewnątrz ma jeszcze Table.SelectRows) i gdzieś w środku potrzebujemy sięgnąć po wartości z którejś zewnętrznej funkcji lub z poprzedniej iteracji pętli. Zwróć uwagę na ten fragment (to jest dokładnie to, o czym Bill pisał wcześniej):
Kod:
[tb=Table.SelectRows(#"Przefiltrowano wiersze", each [Produkt]=rek2[Surowiec]){0}, Surowiec=tb[Surowiec], mnożnik=rek2[ilość]/tb[Ilość produktu], ilość=tb[Ilość surowca]]

Tworzę tu rekord ("[]"), którego pierwszy element tb zawiera pierwszy wiersz("{0}") przefiltrowanej tabeli z poprzedniego kroku kwerendy - i tu już posiłkuję się zmienną rek2, która zawiera produkt nadrzędny z poprzedniego przebiegu (a w pierwszym wartość "WG"). Następnie do tworzonego rekordu dodaję produkt podrzędny z tej odfiltrowanej tabeli, a następnie znów odnoszę się do poprzedniej iteracji i pobieram z niej ilość, którą dzielę przez bieżącą wartość z tabeli uzyskując mnożnik. Na końcu nadpisuję ilość nową wartością, żeby użyć jej w następnym przebiegu. Teoretycznie brzmi zawile, w praktyce sprowadza się do czegoś w stylu:
Kod:
produkt = "WG"
mnożnik = 1
ilość = 8

pętla:
    tb = odfiltruj produkt w tabeli
    produkt = tb[surowiec]
    mnożnik = ilość / tb[ilość]
    ilość = tb[ilość]
GoTo pętla

Lub, cytując klasyka:
Kod:
[Wsad = JakaśObliczonaWartośćNpNaPodstawieTabeliCzyListy, Wynik1 = Wsad/[Pole z wiersza], Wynik2 = Wynik1*CośTam]
ID posta: 382563 Skopiuj do schowka
 
 
Bill Szysz 
Excel Expert


Wersja: Win Office 365
Pomógł: 880 razy
Posty: 3556
Wysłany: 28-02-2020, 00:11   

dziś nie mogę się rozpisywać więc tylko pliczek ode mnie z (dość niechlujnym) rozwiązaniem.
Komentarz jutro albo pojutrze.
Niedźwiadki :cool1 (choć chyba jeszcze M1 powinno mieć inny niż 1 mnożnik) :roll:
Tak czy inaczej :beer (czyli DwaPiwka) :mrgreen:

Składniki wyrobu - z_użyciem_PQUDF.xlsx
Pobierz Plik ściągnięto 17 raz(y) 44.1 KB

_________________
Zlecenia, konsultacje, doradztwo i szkolenia z Power Query, Power BI i Excela - Raporty, Analizy, Projekty
Pozdrawiam, były szbill62 aktualnie Bill Szysz
ID posta: 382655 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe