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

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5959
  • Karma: 43
    • Verze Delphi: W10 + D11
Zostavenie zloženého SQL textu
« kdy: 06-10-2021, 12:44:09 »

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.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 431
  • Karma: 9
    • Verze Delphi: XE2
Re:Zostavenie zloženého SQL textu
« Odpověď #1 kdy: 06-10-2021, 12:50:42 »
Můžeš zkusit používat "VIEW" nebo "SELECT * FROM STORED PROCEDURE"

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5959
  • Karma: 43
    • Verze Delphi: W10 + D11
Re:Zostavenie zloženého SQL textu
« Odpověď #2 kdy: 06-10-2021, 12:59:42 »
Citace
Můžeš zkusit používat "VIEW" nebo "SELECT * FROM STORED PROCEDURE"
VIEW mi to nevyrieši. Nepozná parametre. K druhej možnosti sa ani neviem vyjadriť.
Ešte som zabudol na UNION
Uvádza jeden príklad:
Voľba názvu:
  • Skratka - 'FO.Short AS FOTitle'
  • Plný názov - 'FO.Title as FOTitle'
Tých možností je pre SELECT viac. Tak isto pre FROM, WHERE a ORDER BY.
Niektoré texty získavam dosť komplikovane.
« Poslední změna: 06-10-2021, 13:01:45 od Stanislav Hruška »
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3285
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Zostavenie zloženého SQL textu
« Odpověď #3 kdy: 06-10-2021, 16:15:19 »
Můžeš zkusit používat "VIEW" nebo "SELECT * FROM STORED PROCEDURE"
Ale to by pak musel sestavovat ten SQL na urovni impotentniho jazyka SQL uvnitr te SP.

Videl jsem to v praxi a udrzovat bych to nechtel  -to bude IMHO nejmene radove vetsi onanie, nez to sestavit v Delphi...

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 431
  • Karma: 9
    • Verze Delphi: XE2
Re:Zostavenie zloženého SQL textu
« Odpověď #4 kdy: 06-10-2021, 16:22:18 »
Můžeš zkusit používat "VIEW" nebo "SELECT * FROM STORED PROCEDURE"
Ale to by pak musel sestavovat ten SQL na urovni impotentniho jazyka SQL uvnitr te SP.

Videl jsem to v praxi a udrzovat bych to nechtel  -to bude IMHO nejmene radove vetsi onanie, nez to sestavit v Delphi...

Třeba  takto  ?
Kód: Delphi [Vybrat]
  1. Format(' SELECT * FROM VIEW_TABLE WHERE %s  ORDER BY %s',[ASqlWhere,ASql_Order]

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5959
  • Karma: 43
    • Verze Delphi: W10 + D11
Re:Zostavenie zloženého SQL textu
« Odpověď #5 kdy: 06-10-2021, 16:24:57 »
Urobil som analýzu a mám 39 (ten počet klesne) jednoduchých a 3 zložené SQL.
Najjednoduchšie bude ponechať tie 3 tak ako ich mám.
Riešiť budem tých 39. Tam to má zmysel.
Neviem ako by som to riešil v tej SP. V Delphi si načítam stav jednotlivých komponentov a podľa toho sa rozhodujem. 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.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5959
  • Karma: 43
    • Verze Delphi: W10 + D11
Re:Zostavenie zloženého SQL textu
« Odpověď #6 kdy: 06-10-2021, 16:27:03 »
Citace
Format(' SELECT * FROM VIEW_TABLE WHERE %s  ORDER BY %s',[ASqlWhere,ASql_Order]
A tie parametre získam kde?
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 431
  • Karma: 9
    • Verze Delphi: XE2
Re:Zostavenie zloženého SQL textu
« Odpověď #7 kdy: 06-10-2021, 16:31:43 »
Doteraz som nepoužil ani jedinú SP ;)  Vyhýbal som sa tomu. Úspešne.
Na 99 % takto vytvářených dotazu použiji  VIEW  a tam kde potřebuji vrátit  i nějaké výpočty  na základě podmínek které jsou známy až  v té SP
použiji SP.
Technicky vzato ji můžeš volat stejně jako ten VIEW ale otázkou je efektivita dotazu ...

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3285
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Zostavenie zloženého SQL textu
« Odpověď #8 kdy: 06-10-2021, 16:33:34 »
  • Existuje na to niečo jednoduché? Samozrejme zadarmo
Snad nejaky SQL builder napr. https://openhms.sourceforge.io/sqlbuilder/, ale buhvi, co to umi...

Citace
  • Čo hľadať na internete? Kľúčové slová
SQL run-time builder

Citace
  • Má niekto návod/návrh na riešenie?
Trend je jasny: pokud mozno SQL uplne vyfuckovat a pouzit LINQ nebo jOOQ apod., ale ani tam se nevyhnes nejakemu dynamickemu skladani

V Delphi jsme to vzdycky skladali v run-time, ale meli jsme nejakou vlastni vrstvu mezi Delphi a SQL a sadu utility funkci. V podstate jsme beznou logikou sestavovali SQL do seznam radku a do seznamu variantu jsme cpali k tomu hodnoty parametru. A pak jsme to predhodili nasi DB mezivrstve, ktera zajistila vykonani nad odpovidajici konektivitou a RDBMS. Ukazka
Kód: Delphi [Vybrat]
  1.   [...]
  2.   ASQLCmd.Add('where');
  3.   ASQLCmd.Add('  lnk.IDEXCHANGEORDER = exo.id and dp.idpackettype=:EXOUT and dp.idconvoy is not null');
  4.   ASQLCmd.Add(') dlv');
  5.   ASQLCmd.Add('outer apply (');
  6.   ASQLCmd.Add('  SELECT');
  7.   ASQLCmd.Add('    count(dp.IDPACKETTYPE) as inhibitedpacketcount');
  8.   ASQLCmd.Add('  from');
  9.   ASQLCmd.Add('    PACKET dp');
  10.   ASQLCmd.Add('  inner join EXCHANGEORDER_PACKET lnk');
  11.   ASQLCmd.Add('    on dp.Id=lnk.IDPACKET');
  12.   ASQLCmd.Add('where');
  13.   ASQLCmd.Add('  lnk.IDEXCHANGEORDER = exo.id and dp.idpackettype=:EXOUTINH');
  14.   ASQLCmd.Add(') inh');
  15.   ASQLCmd.Add('where (1=1)');
  16.   case AEditorMode of
  17.     TExEdOrderMode.FromCounting:
  18.       ;
  19.     TExEdOrderMode.FromRegister:
  20.       ASQLCmd.Add('  and exo.ICode is not null and exo.ICode<>''''');
  21.   else
  22.     raise ...
  23.   end;
  24.   [...]
  25.  
a pak treba
Kód: Delphi [Vybrat]
  1.   [...]
  2.   if ClientId >= 0 then
  3.   begin
  4.     ASQLCmd.Add('and exo.IDCLIENT = :IDCLIENT');
  5.     ASQLPar.AddVariant('IDCLIENT', ClientId);
  6.   end;
  7.  
  8.   if edBranchFilter.HasValue then
  9.   begin
  10.     ASQLCmd.Add('and exo.IDBRANCH = :IDBRANCH');
  11.     ASQLPar.AddVariant('IDBRANCH', EdBranchFilter.AsInteger);
  12.   end;
  13.  
  14.   AppendRealizationDateFilterWhereClause(ASQLCmd, ASQLPar);
  15.  
  16.   if edICode.HasValue then
  17.   begin
  18.     ASQLCmd.Add('and exo.Id = :ICODEPATTERN');
  19.     ASQLPar.AddVariant('ICODEPATTERN', edICode.AsInteger);
  20.   end;
  21.   [...]
  22.  


« Poslední změna: 06-10-2021, 16:52:39 od pf1957 »

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 431
  • Karma: 9
    • Verze Delphi: XE2
Re:Zostavenie zloženého SQL textu
« Odpověď #9 kdy: 06-10-2021, 16:33:56 »
Citace
Format(' SELECT * FROM VIEW_TABLE WHERE %s  ORDER BY %s',[ASqlWhere,ASql_Order]
A tie parametre získam kde?

Jake parametry máš na mysli ?

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3285
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Zostavenie zloženého SQL textu
« Odpověď #10 kdy: 06-10-2021, 16:42:23 »
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:

Kód: SQL [Vybrat]
  1. CREATE OR ALTER PROCEDURE GETUSERLOGVIEW (
  2.     SESSIONID INTEGER,
  3.     DATEFROM TIMESTAMP,
  4.     DATETO TIMESTAMP,
  5.     SOURCE INTEGER,
  6.     NAMEUSER VARCHAR(20),
  7.     SERIALNO VARCHAR(20),
  8.     WORKSTATION VARCHAR(20),
  9.     INEVENT INTEGER,
  10.     INERESULT INTEGER,
  11.     LANG VARCHAR(5))
  12. RETURNS (
  13.     EVENTDATE TIMESTAMP,
  14.     ENDESCRIPTION VARCHAR(80),
  15.     SKDESCRIPTION VARCHAR(80),
  16.     CZDESCRIPTION VARCHAR(80),
  17.     USERNAME VARCHAR(30) CHARACTER SET ASCII,
  18.     ESOURCE VARCHAR(30) CHARACTER SET ASCII,
  19.     ERESULT VARCHAR(20) CHARACTER SET ASCII,
  20.     WORKSTATIONIP VARCHAR(15) CHARACTER SET ASCII,
  21.     WORKSTATIONNAME VARCHAR(20) CHARACTER SET ASCII,
  22.     TCRIP VARCHAR(15) CHARACTER SET ASCII,
  23.     TCRSERIALNO VARCHAR(20) CHARACTER SET ASCII,
  24.     ERESULTID INTEGER,
  25.     EVENTNOTE VARCHAR(255),
  26.     EVENTID INTEGER)
  27. AS
  28. DECLARE variable STRSQL VARCHAR(1000);
  29. BEGIN
  30.   strsql = 'select u.eventdate,t.endescription, t.skdescription, t.czdescription,u.username,s.source, r.result,u.workstationip,
  31.            u.workstationname,u.tcrip,u.tcrserialno,u.result, u.eventnote, u.event from userlog u,
  32.            logeventresult r,logeventsource s,logeventtype t
  33.             where u.eventsource=s.id and u."EVENT"=t.id and u.result=r.id';
  34.   IF (NOT :datefrom IS NULL) THEN
  35.   BEGIN
  36.     strsql = strsql || ' AND u.eventdate>=''' || :datefrom || '''';
  37.   END
  38.   IF (NOT :dateto IS NULL) THEN
  39.   BEGIN
  40.     strsql = strsql || ' AND u.eventdate<=''' || :dateto || '''';
  41.   END
  42.   IF (NOT :SOURCE IS NULL) THEN
  43.   BEGIN
  44.     strsql = strsql || ' AND s.id=' || :SOURCE;
  45.   END
  46.   IF (NOT :nameuser IS NULL) THEN
  47.   BEGIN
  48.     strsql = strsql || ' AND u.username like ''' || :nameuser || '%''';
  49.   END
  50.   IF (NOT :serialno IS NULL) THEN
  51.   BEGIN
  52.     strsql = strsql || ' AND u.tcrserialno=''' || :serialno || '''';
  53.   END
  54.   IF (NOT :workstation IS NULL) THEN
  55.   BEGIN
  56.     strsql = strsql || ' AND u.workstationname=''' || :workstation || '''';
  57.   END
  58.   IF (NOT :inevent IS NULL) THEN
  59.   BEGIN
  60.     strsql = strsql || ' AND t.id=' || :inevent;
  61.   END
  62.   IF (NOT :ineresult IS NULL) THEN
  63.   BEGIN
  64.     strsql = strsql || ' AND r.id=' || :ineresult;
  65.   END
  66.   strsql = strsql || ' order by u.eventdate;';
  67.   FOR
  68.   EXECUTE statement :strsql
  69.   INTO :eventdate, :endescription, :skdescription, :czdescription, :username, :esource, :eresult, :workstationip,
  70.        :workstationname, :tcrip, :tcrserialno, :eresultid, :eventnote, :eventid
  71.   do
  72.     suspend;
  73. END^
  74.  


Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3285
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Zostavenie zloženého SQL textu
« Odpověď #11 kdy: 06-10-2021, 16:43:29 »
Jake parametry máš na mysli ?
No treba hodnoty filtru, pro ktere ma vytahnout z DB vysledek aj. viz priklady, co jsem posilal

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5959
  • Karma: 43
    • Verze Delphi: W10 + D11
Re:Zostavenie zloženého SQL textu
« Odpověď #12 kdy: 06-10-2021, 16:56:19 »

Citace
Jake parametry máš na mysli ?
Tie
Citace
ASqlWhere,ASql_Order
nie sú parametre? Lebo ja som si myslel, že sú.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 431
  • Karma: 9
    • Verze Delphi: XE2
Re:Zostavenie zloženého SQL textu
« Odpověď #13 kdy: 06-10-2021, 16:58:34 »
To jsou obycejne lokální promenné typu string do kterých si poskládáš "where" a  "order by" řetězec   


Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5959
  • Karma: 43
    • Verze Delphi: W10 + D11
Re:Zostavenie zloženého SQL textu
« Odpověď #14 kdy: 06-10-2021, 17:12:54 »
Nebudem si to komplikovať a pre jednu jednorazovú vec študovať niečo nové. Tie jednoduché aktualizujem na nový stav. Zložené nechám tak. Ešte uvediem spôsob, ako to robím.
Kód: Delphi [Vybrat]
  1.  
  2.   TPrintWithOption = class(TPrintBase)
  3.  
  4.     FTextAndParam: TTextAndParam;
  5.  
  6.     procedure CompleteText;
  7. procedure TPrintWithOption.CompleteText;
  8.  
  9. begin
  10.   FQryText := 'SELECT ' + FTextAndParam.Select + ' FROM ' + FTextAndParam.From;
  11. .
  12.   if FTextAndParam.Where <> '' then
  13.     FQryText := FQryText + ' WHERE '+ FTextAndParam.Where;
  14. ...
  15.   TTextAndParam = class  //  Jednotka na získanie čiastočných textov
  16.  
  17.     FSelectList: TStringList;
  18. procedure TTextAndParam.GetBasicSelect;
  19.  
  20. const
  21.   FocSelect = '04B.TITLE AS BTITLE, E.TITLEFULL AS ETITLEFULL, ';
  22. var
  23.   Text: string;
  24. begin
  25.   case FPrintType of
  26.     ptFlat: Text := FocSelect + 'F.FLATNUMBER';
  27.   else
  28.     Text := FocSelect + 'F.FLATNUMBER, O.FULLNAME AS OFULLNAME';
  29.   end;
  30.   FSelectList.Add(Text);
  31. end;
  32. ...
  33. //Po získaní všetkých string
  34. procedure TTextAndParam.SetSelect;
  35.  
  36.  
  37. var
  38.  I: Integer;
  39. begin
  40.   FSelectList.Sort;
  41. { TODO : Odstrihnúť číslo }
  42.   FSelect := FSelectList[0];
  43.   for I := 1 to FSelectList.Count - 1 do
  44.     FSelect := FSelect + ', ' + FSelectList[I];
  45. end;
  46. ...
  47.   CompleteText;
Vždy mi totálne rozhádže formátovanie. Kašlem naň.

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

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1258
  • 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ů: 3285
  • 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ů: 5959
  • Karma: 43
    • 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ů: 5959
  • Karma: 43
    • 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ů: 234
  • 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ů: 234
  • 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ů: 3285
  • 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ů: 5959
  • Karma: 43
    • 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ů: 5959
  • Karma: 43
    • 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ů: 200
  • 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ů: 5959
  • Karma: 43
    • 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ů: 3285
  • 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ů.

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ěď #30 kdy: 14-10-2021, 13:45:07 »
alebo EXECUTE STATEMENET v procedure

Kód: Delphi [Vybrat]
  1. execute statement  'select ' || TextField || ' from ' || TableName into :Chunk

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 431
  • Karma: 9
    • Verze Delphi: XE2
Re:Zostavenie zloženého SQL textu
« Odpověď #31 kdy: 14-10-2021, 16:40:19 »
To by mne zajímalo ze studijních důvodů.
V rámci studia si to můžeš naprogramovat i sám
Základní kostru objektu bych videl tak na 30 minut.

Kód: Delphi [Vybrat]
  1. TSqlStavebnik = class(TObject)
  2.  
  3. StlSelect:TstringList;
  4. StlOrderBy:TstringList;
  5. StlWhere:TstringList;
  6. StlGroupBy:TstringList;
  7. ASqlFrom:String
  8. ....
  9.  
  10.  
  11.  

Offline jikulis

  • Nováček
  • *
  • Příspěvků: 22
  • Karma: 0
    • Verze Delphi: 2010, XE3, Seattle, Sydney, Rio, Alexandria
Re:Zostavenie zloženého SQL textu
« Odpověď #32 kdy: 21-10-2021, 10:08:30 »
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.

S kanónem na vrabce? Použil jsem to několikrát.. jednoduché, snadno použitelné, prinicp pochopíš max. za hodinu.. řekl bych, že přesně tohle hledáš.