Autor Téma: Zostavenie zloženého SQL textu  (Přečteno 1094 krát)

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1274
  • Karma: 51
    • Verze Delphi: 10.3
Re:Zostavenie zloženého SQL textu
« Odpověď #15 kdy: 06-10-2021, 17:28:08 »

Užívateľ si vyberie voľby pre tlačovú zostavu. Na základe týchto volieb, okrem iného, si zostavím SQL text. Postup je nasledovný:
  • zložím si jednotlivé časti - Select, From...
  • tieto časti zložím do výsledného textu
Tento spôsob mi dobre funguje pri jednoduchom SQL. Samozrejme nefunguje pre SQL s
  • WITH
  • subQuery
Ja mám problém ako na to. Moje otázky:
  • Existuje na to niečo jednoduché? Samozrejme zadarmo
  • Čo hľadať na internete? Kľúčové slová
  • Má niekto návod/návrh na riešenie?
Ďakujem.

Já to dělám tak, že mám napsanou kostru SQL (v nějakém tIbQuery, Ty bys to měl jinde, protože používáš jiné komponenty), ta kostra vypadá třeba takto:

Kód: Delphi [Vybrat]
  1. SELECT
  2.  a.Kod,
  3.  a.Pobocka,
  4.  a.Vypnout
  5. FROM Pobocky a
  6. WHERE (a.Vypnout='n') /*W*/ /**/

Když si pak uživatel nastaví např. hledaný text "x", sestavím si podmínku:
Kód: Delphi [Vybrat]
  1. Podminka:='';
  2. if (FiltrPobocka<>'')
  3.  then PridejPodminku(Podminka, 'a.Pobocka CONTAINING :FiltrPobocka');
  4.   // -> Podminka = '(a.Pobocka CONTAINING :FiltrPobocka)'
  5. if (FiltrZeme>0)
  6.  then PridejPodminku(Podminka, Format('a.Zeme=%d', [FiltrZeme]));
  7.   // -> Podminka = '(a.Pobocka CONTAINING :FiltrPobocka) and (a.Zeme=7)'
... podobně další filtry

Pak mám proceduru, která umí /*W*/ ....... /**/ nahradit zadaným textem:
Kód: Delphi [Vybrat]
  1. ZapisPodminku(qPobocky.SQL, Podminka, true {pridame k existujici podmince});

takže na konci toho SQL je:
Kód: Delphi [Vybrat]
  1. WHERE (a.Vypnout='n') /*W*/ and (a.Pobocka CONTAINING :FiltrPobocka) and (a.Zeme=7) /**/

Nastavím parametry:
Kód: Delphi [Vybrat]
  1. if (FiltrPobocka<>'')
  2.  then qPobocky.ParamByName('FiltrPobocka').AsString:=FiltrPobocka;
  3.  

/*W*/ a /**/ používám proto, že v SQL jsou to komentáře a ničemu nepřekážejí.
Podmínku zapisuju mezi ně, abych to mohl dělat opakovaně.
Texty, datum apod. předávám jako parametry, čísla tam dávám přímo, viz ukázka nahoře.

Tohle mi stačí na většinu požadavků, jen zřídka používám ještě další značky na nějaké další změny v tom SQL.
Píšu to jen z hlavy, tak tam jsou možná chybky.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3291
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Zostavenie zloženého SQL textu
« Odpověď #16 kdy: 06-10-2021, 17:38:39 »
Vždy mi totálne rozhádže formátovanie. Kašlem naň.
No proto to formatujeme rucne, aby kdyz se ten sestaveny prikaz dumpne do logu, aby byl perfektne citelny: v praxi to probihalo tak, ze v nejake SQL consoli to clovek napsal a odladil, pak prekopirovat do textoveho editoru a pomoci makra a regexu to preprasil do pascalu nebo zpet do SQL. To je delaval c MultiEditu. Ale ten v podstate prestal existovat a jeho 32bit verze fungovat na novejsich Windows, tak jsem to zacal pouzivat nejake ty Cmd komponenty na datamodulech, ale to kupodivu nezanechalo zadnou pametovou stopu, jak presne jsem to delal. Asi jadro v komponent, zbytek pridan v run-time klasicky.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6033
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:Zostavenie zloženého SQL textu
« Odpověď #17 kdy: 06-10-2021, 17:48:48 »
 :D :D :D ja som mal na mysli formátovanie na tomto fóre.
Poobzeral som sa po internete. SQLBuilder i StringBuilder - pri oboch to len komplikovalo situáciu. Z čitateľnej formy tam bola nečitateľná :(
To vandrovnik
Tvoj príklad je veľmi jednoduchý. Neviem si predstaviť implementáciu pre moju potrebu.
Ja som už rozhodnutý. Robím to len pre tých 15 formulárov. Všade inde mám SQL písané natvrdo. Z mojej strany je diskusia uzavretá.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline egroups

  • Nováček
  • *
  • Příspěvků: 44
  • Karma: 0
Re:Zostavenie zloženého SQL textu
« Odpověď #18 kdy: 07-10-2021, 08:08:01 »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6033
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:Zostavenie zloženého SQL textu
« Odpověď #19 kdy: 07-10-2021, 08:28:55 »
Na ten som narazil. Patrí do skupiny "nečitateľný kód". To tam kritizovali viacerí. Okrem toho mi nepridáva navyše žiadnu funkčnosť. Aspoň ja som ju nevidel.
Za odkaz ďakujem.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 236
  • Karma: 3
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Zostavenie zloženého SQL textu
« Odpověď #20 kdy: 07-10-2021, 10:30:18 »
Ale v SP? Aj keby som je podhodil tie hodnoty, tak neviem ako na to. Doteraz som nepoužil ani jedinú SP ;)  Vyhýbal som sa tomu. Úspešne.
O nic jsi neprisel :-) To vypada nejak takhle:

Někdy skládání dotazu neobejdeš, ale tam, kde to aspoň trošičku jde je dobré se tomu vyhnout.
Principem uložené procedury je to, že server ji má "předkompilovanou" optimalizovanou a tímto to prostě celé rozbiješ

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 236
  • Karma: 3
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Zostavenie zloženého SQL textu
« Odpověď #21 kdy: 07-10-2021, 10:42:01 »
Co místo tohoto udělat nějaké univerzální reportování?
kategorii, jméno, popis
10-12 volitelných parametrů, u kterých nadefinuješ popisek a datový typ
Pole pro SQL dotaz - ano, píšeš přímo SQL dotaz, i když tam mám i pokus o skládačku dotazu, který zvládne automaticky i napojovat tabulky přes referenční integrity
Parametry zadáváme v SQL dotazu jako :Param1 .. :ParamX
pro zadání se objeví pouze ty použité, před spuštěním SQL dotazu se pak nahradí tím, co uživatel zadal
Výstup pak grid s exportem třeba do XLS, DBF, CSV, případně k tomu doděláš předlohu pro nějaký report, který umí načítat externí předlohy.
Celá definice je jeden řádek v tabulce

Uživatel pak vidí treeview s kategoriemi, odklikne sestavu, zadá parametry a v gridu dostane výsledek.

Pak se s tím dá dělat spoustu věcí, můžeš jim poslat import hotového reportu (třeba i jako placenou službu).
Nejsi omezený žádným pevně daným formulářem se zadáváním.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3291
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Zostavenie zloženého SQL textu
« Odpověď #22 kdy: 07-10-2021, 10:44:56 »
Patrí do skupiny "nečitateľný kód".
No nevim, co jsi od toho cekal: nejaky aparat na urovni programovaciho jazyk ke generovani prikazu potrebujes, tj. kdyz chces pridat ... AND a=b, tak to musis umet nejak zapsat. A abys to nepsal porad rucne dokola, tak si spolecne operace muzes archaicky nastrkat do sad standalone funkci pro ruzne typy parametru aj. at jiz pretizene nebo ne, nebo z nich muzes udelat metody a pouzivat "cervi" kod, jak se to bezne pise.

Ale vzdy to bude znamenat, ze misto SQL se budes muset naucit, jak ty dotazy psat uplne jinak, cim mene pouzivany nastroj, tim hur.

A dokud se ti DB data nepromitaji do struktur programovaciho jazyk, jazyk nema primou podporu dotazovani a nepodporuje λ-expressions, nema anonymni typy, tak to bude vzdy kostrbatejsi nez nejkostrbatejsi. A pro cloveka, ktery se s tim nikdy nesetkal ev. v tom nema dostatecnou praxi, to bude vzdy necitelne. Snad si nemyslis, ze nejlepsi reseni v podobe LINQ je nejak snadno citelne ;-)

Ale ma to tu vyhodu, ze kdyz se LINQ naucis, tak ho muzes pouzivat proti jakekoli DB, XML atd. a navic, prekladac zahrne ty konstrukce do jazyka, takze kdyz se preklepnes, tak te na to hned upozorni a nemusis cekat, az ti to po spusteni vyfuci na chybu -> zrychluje a zlevnuje to vyvoj.




Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6033
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:Zostavenie zloženého SQL textu
« Odpověď #23 kdy: 07-10-2021, 12:04:42 »
To pf1957: tých vecí si som vedomý. Pre mňa to je aj tak s kanónom na vrabcov
To Fiala: Tvoje riešenie sa mi v základe páči. Ale pre mňa to je opäť kanón na vrabcov. Ja mám dokopy 15 formulárov, čo nie je veľa. Nepredpokladám, že nejaký pribudne.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline František

  • Guru
  • *****
  • Příspěvků: 704
  • Karma: 7
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Zostavenie zloženého SQL textu
« Odpověď #24 kdy: 12-10-2021, 17:52:18 »
inak SQLka som doteraz skladal aj ja, ale uz nebudem, vsetko cez params....
vyriesi to hlavne formatovanie datumu a destinnych ciarok ... (nocna mora)
a ziskas aj PERFORMANCE

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6033
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:Zostavenie zloženého SQL textu
« Odpověď #25 kdy: 12-10-2021, 18:51:18 »
Excellent
Rated 1 time
Parametre nemajú nič spoločné so skladaním SQL!
  • Používam ich od samého začiatku. Tu ma hneď usmernili.
  • Okrem toho som vedel, že je to aj ochrana proti útoku "injection".
  • Také SQL nie je problém použiť v slučke. Bez parametrov by to nešlo.

W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline martinnr

  • Plnoletý
  • ***
  • Příspěvků: 201
  • Karma: 2
    • Verze Delphi: 7,2009,XE7
Re:Zostavenie zloženého SQL textu
« Odpověď #26 kdy: 14-10-2021, 11:20:06 »
uspesne pouzivame jeden z SQL builder hotovych. link na stranku autora je nedostupny, tak mozno by som vedel posunut.
pouzitie je potom nasledovne...

Kód: Delphi [Vybrat]
  1. function CreateGridQuery: IQueryBuilder;
  2. begin
  3.   Result := TQueryBuilder.Create();
  4.   Result.Select('CUSTOMSOFFICE');
  5.   Result.Select('TIN');
  6.   Result.Select.From('C_ZARUKY');
  7.   Result.Where('VISIBLE > 0');
  8. end;
  9.  
  10. begin
  11. ...
  12.   SQLtext := CreateGridQuery.AsString; //-> vysledkom je riadny SQL retazec na zavolanie z databazy
  13. ...
  14. end;
  15.  

ta trieda ma potom funkcie ako OrderBy, Join, atd

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6033
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:Zostavenie zloženého SQL textu
« Odpověď #27 kdy: 14-10-2021, 11:28:53 »
Niečo také mi jen nanič. Ja si podľa volieb užívateľa potrebujem poskladať jednotlivé časti: Select, From, Where...
Čo som videl, tak s tým mi nepomôže žiaden SQL Builder. Tam sa už súkajú známe veci. To je to najmenej. To mám urobené.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3291
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Zostavenie zloženého SQL textu
« Odpověď #28 kdy: 14-10-2021, 12:23:10 »
Niečo také mi jen nanič. Ja si podľa volieb užívateľa potrebujem poskladať jednotlivé časti: Select, From, Where...
Čo som videl, tak s tým mi nepomôže žiaden SQL Builder. Tam sa už súkajú známe veci. To je to najmenej. To mám urobené.
Ano, uvazujes spravne - i v tech vyspelejsich dotazovacich jazykach bys to musel skladat na zaklade podminek, vetsinou v run-time, ale v pripade, ze bys mel varianty, z nichz nektere se napr. z duvodu bezpecnosti nesmi dostat jinam, tak i podmineneho prekladu.

Hledat/ucit se vyspely SQL builder melo smysl na zacatku projektu.

Offline egroups

  • Nováček
  • *
  • Příspěvků: 44
  • Karma: 0
Re:Zostavenie zloženého SQL textu
« Odpověď #29 kdy: 14-10-2021, 12:40:54 »
uspesne pouzivame jeden z SQL builder hotovych. link na stranku autora je nedostupny, tak mozno by som vedel posunut.
pouzitie je potom nasledovne...

Kód: Delphi [Vybrat]
  1. function CreateGridQuery: IQueryBuilder;
  2. begin
  3.   Result := TQueryBuilder.Create();
  4.   Result.Select('CUSTOMSOFFICE');
  5.   Result.Select('TIN');
  6.   Result.Select.From('C_ZARUKY');
  7.   Result.Where('VISIBLE > 0');
  8. end;
  9.  
  10. begin
  11. ...
  12.   SQLtext := CreateGridQuery.AsString; //-> vysledkom je riadny SQL retazec na zavolanie z databazy
  13. ...
  14. end;
  15.  

ta trieda ma potom funkcie ako OrderBy, Join, atd
To by mne zajímalo ze studijních důvodů.