< návrat zpět

MS Excel


Téma: PowerQuery - použití hodnoty z buňky jako param. rss

Zaslal/a 10.2.2021 23:54

Ahoj,
potřebuji použít hodnotu z buňky jako parametr pro filtrování jiné tabulky s tím, že pokud bude buňka prázdná, tak filtr zobrazí všechny hodnoty z daného sloupce.
První část umím, ale nedaří se mi napsat smysluplnou podmínku pro ošetření toho, aby v případě, že bude hodnota buňky null zobrazil filtr všechny hodnoty daného sloupce.
Pomůžete někdo?

Zaslat odpověď >

Strana:  1 2   další »
icon #049811
avatar
Namiesto obycajneho filtra v tvare cca takomto

= Table.SelectRows(#"NazovTabulkyVktorejFiltrujes", each [StlpecVktoromFiltrujes] = ParameterHodnotaBunky)

musis napisat nieco taketo:

= Table.SelectRows(#"NazovTabulkyVktorejFiltrujes",
each if ParameterHodnotaBunky = ""
then true
else ([StlpecVktoromFiltrujes] = ParameterHodnotaBunky))

dvojite uvodzovky v podmienke (prazdny retazec) mozno budes musiet nahradit za null, ale ta logika zostane rovnaka - filtruje sa v zavislosti na splneni podmienky, ktoru vytvoris pomocou if-then-elsecitovat
#049813
avatar
Nebo třeba


// nevím co se načte z buňky
par = if ParametrBunky = null or ParametrBunky = "" then true else ParametrBunky,
// v každém případě filtrujeme
xxx = Table.SelectRows(#"tabulka", each [sloupec] = par)


nebo


// nevím co se načte z buňky
par = if ParametrBunky = null or ParametrBunky = "" then true else ParametrBunky,

// Pokud nechceme filtrovat, tak vracíme původní tabulku
xxx = if ParametrBunky
then #"tabulka"
else Table.SelectRows(#"tabulka", each [sloupec] = par)
citovat
icon #049814
avatar
@ lubo - diky, to je urcite krajsie napisanecitovat
#049818
avatar
Já to kdysi taky řešil, ale jako začátečník v PQ jsem hledal postup "klikací". Bylo to přes pomocné sloupce v dotazu (na pozadí). Našel jsem ten testovací soubor, jen jsem ho trochu učesal a dávám to sem.
Příloha: xlsx49818_pq_filtr_param.xlsx (27kB, staženo 24x)
citovat
#049825
avatar
Ahoj,
moc děkuju za pomoc.
Když to udělám jak píše @AL tak mi to napíše, že se pokouším o cyklický dotaz.
Když to napíšu podle @lubo tak to vypadá, že jsem tam něco nezvládl správně vyplnit:(.
Mohli byste mi to prosím vyplnit na konkrétním příkladu:

Tabulka ve které chci filtrovat se jmenuje: Order
Tabulka s parametrem se jmenuje: Order_P
Sloupec tabulky Order, podle kterého chci filtrovat se jmenuje: Order Priority

@Dingo moc děkuju za jiný návrh řešení, rád na to kouknu, ale v tomto případě to bude úplně super, když by to šlo bez přidaných sloupců, potřebuji tam těch filtrů dát pak za sebou několik pro různé sloupce.citovat
#049827
avatar
Tak jsem si pro zajímavost zkoušel použít řešení od @All i @lubo, a dospěl jsem k závěru, že opravdu funguje jen druhý kód @lubo s tím, že se tam doplní "= true" >> jinak kód hodí chybu, že text.hodnotu nemůže převést na logickou (to v případě, že hodnota filtru není prázdná). Ostatní řešení nerespektují to, že při prázené hodnotě se nefiltruje - nezobrazují nic.
// nevím co se načte z buňky
par = if ParametrBunky = null or ParametrBunky = "" then true else ParametrBunky,
// Pokud nechceme filtrovat, tak vracíme původní tabulku
xxx = if ParametrBunky = true then #"tabulka" else Table.SelectRows(#"tabulka", each [sloupec] = par)
toto jde slušně použít i na víc sloupců, funguje to! Dám sem i soubor, ve kterém jsem to zapracoval >> vidím, že @hona se s tím nějak pere
Příloha: xlsx49827_pq_filtr_param2.xlsx (36kB, staženo 29x)
citovat
#049829
avatar
@Dingo
Dík za opravu, nechtělo se mi vymýšlet příklad ..., tak to bylo z hlavy.

Protože Hona se neobtěžuje poslat další informaci, tak jen pár poznámek:

Ošetření parametru na null případně prázdný řetězec je lepší provést při načtení parametru.

Pokud by se mělo testovat více hodnot v jednom sloupci, tak je nejspíš vhodné použít funkci List.Contains.

Pokud to má být filtr pro více sloupců, je samozřejmě možné zopakovat proceduru - vznikne něco...

Když potřebuju upravit víc sloupců v tabulce podle parametru, tak obvykle používám List.Accumulate (záleží na konkrétní potřebě).citovat
icon #049830
eLCHa
Jen pro inspiraci. Já používám pojmenovanou buňku (v tomto případě 'Soubor') a následně. Dotaz pojmenovaný Soubor:let
name = Excel.CurrentWorkbook(){[Name="Soubor"]}[Content],
value = name{0}[Column1]
in
value
V tomto případě je odkaz na soubor jehož cestu z názvem mám uloženu v buňce

Následně soubor načítám pomocíSource = Excel.Workbook(File.Contents(Soubor), null, true)citovat
icon #049831
avatar
@ Dingo
K mojmu "nefunkcnemu" rieseniu asi tolko. Pisal som, ze dvojite uvodzovky mozno bude nutne nahradit za null.

Ak je v tvojej prilohe ten Postup_dle_All inspirovany tym, co som pisal v prvej odpovedi, tak pri setupe, aky si pouzil, to query ma byt spravne napisane takto:

let
Zdroj = Excel.CurrentWorkbook(){[Name="Tab_zdroj"]}[Content],
#"Změněný typ" = Table.TransformColumnTypes(Zdroj,{{"hodnota", type number}, {"text", type text}, {"datum", type date}}),
Filtr1= Table.SelectRows(#"Změněný typ", each if Filtr_textu(1) = null then true else ([text] = Filtr_textu(1))),
Filtr2= Table.SelectRows(Filtr1, each if Filtr_hodnoty(1) = null then true else ([hodnota] = Filtr_hodnoty(1)))
in
Filtr2

Takto to funguje, aspon myslim..
Lubo tukol kliniec po hlavicke, tvorime to z vody, kedze nemame prilohu, na ktorej sa to da otestovat; predpokladam, ze clovek skusi nahradit "" za null sam, ked sem neda vlastnu prilohu, to, samozrejme, nebola vyhrada k tebe, ale k OP.citovat
#049833
avatar
pro All - ano, omlouvám se, funguje, nedostal jsem se k tomu "null" , a už vůbec nechápu, že to s tím pak funguje, ale je to tak. Celé si ukládám do svých postupů.citovat

Strana:  1 2   další »

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje