< návrat zpět
MS Excel
Téma: PowerQuery - zdroj SQL. trabl s funkcí
Zaslal/a Honza1239 18.2.2021 15:56
Ahoj,
potřebuji v PowerQuery použít jako zdroj SQL dotaz a v dotazu udělat "předfiltr" pomocí WHERE.
Potřebuji to ve dvou verzích jednou jde o sloupec typu Integer a podruhé o DateTime. Níže popisuji pouze variantu pro Inteager, u DateTime mi to píše stejný problém.
Pokusil jsem se to udělat takto:
Vytvořit funkci se stejným DATE type jako má daný sloupec a tu dosadit místo proměnné ve WHERE v SELECTU.
U "nadějnějších pokusů" to píše jen, že nemůže konvertovat VARCHAR value z funkce "hodnota" na typ Int. V ostatních případech to hlásí chybu syntaxe.
Nemáte s tím někdo zkušenosti?
Níže posílám ukázku Funkce, Zápisu zdroje a Chybovou hlášku.
Funkce:
= (XXA as number)=>
let
Zdroj = Excel.CurrentWorkbook(){[Name="Tabulka2"]}[Content],
#"Změněný typ" = Table.TransformColumnTypes(Zdroj,{{"Osobní číslo", Int64.Type}}),
#"Osobní číslo" = #"Změněný typ"{0}[Osobní číslo]
in
#"Osobní číslo"
Zdroj:
hodnota = Osobni_cislo_Rov(1),
Zdroj = Odbc.Query("……..část kodu která funguje…….Where personalnumber ="&" 'hodnota' "),
//zkoušel jsem to taky takto:
Where personalnumber ='&hodnota' ")
Píše to toto chybové hlášení:
DataSource.Error: ODBC: ERROR [22018] [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting the varchar value 'hodnota' to data type int.
Podrobnosti:
DataSourceKind=Odbc
DataSourcePath=dsn=10.234.134.120
OdbcErrors=[Table]
lubo(18.2.2021 22:13)#049903 1. skládáš sql dotaz, tj. textový řetězec.
2. když si dotaz (vhodně upravíš a) odkrokuješ, můžeš se podívat co serveru posíláš
3. Celý dotaz v jednom kuse obvykle neskládám, rozdělím si to na vhodné kousky. Např. základní select (to co funguje) a where ... zvlášť. Manupulace s různými výběry je pak jednodušší.
4. Nejspíš bych skládal něco jako
"where personalnumber = '" & hodnota & "' "
citovat
Honza1239(19.2.2021 9:08)#049905 Ahoj,
základní
select mi funguje,
Where také pokud tam místo funkce napíšu číslo.
Zkusil jsem zápis podle rady od @Lubo a chybová hláška se změnila na:
Expression.Error: Hodnotu null nemůžeme převést na typ Text.
Podrobnosti:
Value=
Type=[Type]
Ještě mě napadlo ve funkci změnit:
= (XXA as number)=>
na:
(XXA as text)=> --- jen se změní hláška na: Hodnotu 1 nemůžeme převést na typ Text (Value=1; Type=[Type])
pak jsem zkusil upravit funkci na:
(XXA)=> ---- i v tomto případě to hlásí chybu.
Není to něco známého s čím byste někdo uměl poradit?
citovat
lubo(19.2.2021 11:35)#049906 Z ukázek vůbec není jasné co děláš.
Pokud máš problém s tou anonymní funkcí, tak funkce se volá s parametrem XXA, který
a) musí být zadán
b) musí být číslo
c) nesmí být null
d) ve funkci není použit.
Nepředvedl jsi, jak funkci voláš.
K čemu to má sloužit víš jen ty sám.
citovat
Honza1239(19.2.2021 13:34)#049907 Pardon mě nenapadlo, že z těch kusů kódu, které sem dávám není poznat jak volám funkci:(.
Funkce se jmenuje "
Osobni_cislo_Rov"
Volám to zde na prvním řádku:
hodnota = Osobni_cislo_Rov(1),
Zdroj = Odbc.Query("……..část kodu která funguje…….Where personalnumber ='" & hodnota & "' ")citovat
lubo(19.2.2021 15:29)#049908 Vypadá to, že mícháš datové typy v power query a v SQL serveru a/nebo typ parametru funkce s typem vrácené hodnoty.
Dotaz na server je TEXT. Datový typ v sql databázi ovlivňuje syntaxi dotazu, tj. jestli osobní číslo je dotazu jako číslo nebo je obalené uvozovkami.
"hodnota" by v každém případě měla být textem.
Pokud je personalnumber v db číslo, pak něco takového:
Osobni_cislo_Rov = (XXA as number) =>
let
Zdroj = Excel.CurrentWorkbook(){[Name="Tabulka2"]}[Content],
#"Změněný typ" = Table.TransformColumnTypes(Zdroj,{{"Osobní číslo", Int64.Type}}),
OC = #"Změněný typ"{0}[Osobní číslo],
// Když se to převede na text tady, je to dál jednodušší,
// může se také případně ošetřit chybějící hodnota, ...
#"Osobní číslo" = Text.From(OC)
in
#"Osobní číslo",
hodnota = Osobni_cislo_Rov(1),
// co to v tomto kroku ukazuje - je do správně????
// tady se skládá text dotazu
where = "Where personalnumber = " & hodnota & " "
// co to vrací tady? - je to správně (hodnota, syntaxe sql dotazu)?
citovat