Autor Téma: Query - změna SQL  (Přečteno 1483 krát)

Offline J_M

  • Nováček
  • *
  • Příspěvků: 28
  • Karma: 0
Query - změna SQL
« kdy: 14-09-2017, 21:39:58 »
Zdravím, lze nějak provést změnu v sql dotazu tak, aby se aplikovala, ale nedošlo k destrukci a novému vytvoření filedů v query? Tedy bez použití Close - Open.
Vlastně něco podobného, co se děje v detailu při použití master-detail propojení. I když tam se mění pouze hodnoty parametrů.
Samozřejmě sql dotaz nebude měnit počet, pořadí, ani typy atributů - pouze změna where.
Vytvoření fieldů předem nepřichází v úvahu.
Používám FireDac a nemám zdrojáky, abych to mohl prozkoumat uvnitř. Prosím tedy o radu, pokud by někdo věděl?
« Poslední změna: 14-09-2017, 22:04:18 od J_M »

96971

  • Host
Re:Query - změna SQL
« Odpověď #1 kdy: 14-09-2017, 22:50:43 »
Zdravím, lze nějak provést změnu v sql dotazu tak, aby se aplikovala, ale nedošlo k destrukci a novému vytvoření filedů v query? Tedy bez použití Close - Open.
Vlastně něco podobného, co se děje v detailu při použití master-detail propojení. I když tam se mění pouze hodnoty parametrů.
Samozřejmě sql dotaz nebude měnit počet, pořadí, ani typy atributů - pouze změna where.
Vytvoření fieldů předem nepřichází v úvahu.
Používám FireDac a nemám zdrojáky, abych to mohl prozkoumat uvnitř. Prosím tedy o radu, pokud by někdo věděl?

Co se deje mezi master-detail je zmena parametru. Zmena WHERE podminky vsak muze znamenat i neco vic.

Kazdy novy odeslany dotaz DBMS se bude znovu pripravovat na strane DBMS, o to bych se spis staral. Muzes ale filtrovat i na nizsi urovni jiz prenesenych dat nebo aplikovat tzv. rozsah. Mozna dokazu poradit, ale potrebuju vedet vic o te WHERE podmince nebo o co celkove jde "slovy prozaika".
« Poslední změna: 14-09-2017, 23:23:16 od 96971 »

Offline J_M

  • Nováček
  • *
  • Příspěvků: 28
  • Karma: 0
Re:Query - změna SQL
« Odpověď #2 kdy: 14-09-2017, 23:38:05 »
Kazdy odeslany dotaz DBMS se bude znovu pripravovat. Muzes ale filtrovat i na nizsi urovni jiz prenesenych dat nebo aplikovat tzv. rozsah. Dokazu poradit, ale potrebuju vedet vic o te WHERE podmince (nestaci trebas jen parametry?).

Nevadí mi že se každý dotaz znovu připraví. Snažím se o takový malý framework pro rychlé vytváření DB aplikací na SQlite bez častého opakování kódu a s minimem práce na formulářích.
Tzn. že nechci vytvářet statické fieldy, ani columns v dbgridech. Vše se bere z textového "předpisu" a vytváří za běhu. Součástí frameworku je i tvořič filtrů nad otevřeným query který pouze modifikuje where. Problém nastává, právě při použití dbgridu, kdy uživatel např. změní pořadí nebo šířky sloupců a následně použije filtr. Znovuotevření query způsobí reset tohoto nastavení.
Zatím to řeším tak, že před query.close uložím nastavení gridu a po query.open znovu načtu, což se mi příliš nelíbí.

96975

  • Host
Re:Query - změna SQL
« Odpověď #3 kdy: 15-09-2017, 14:26:09 »
[quote  link=topic=15814.msg96971#msg96971 date=1505422243]
Kazdy odeslany dotaz DBMS se bude znovu pripravovat. Muzes ale filtrovat i na nizsi urovni jiz prenesenych dat nebo aplikovat tzv. rozsah. Dokazu poradit, ale potrebuju vedet vic o te WHERE podmince (nestaci trebas jen parametry?).

Nevadí mi že se každý dotaz znovu připraví. Snažím se o takový malý framework pro rychlé vytváření DB aplikací na SQlite bez častého opakování kódu a s minimem práce na formulářích.
Tzn. že nechci vytvářet statické fieldy, ani columns v dbgridech. Vše se bere z textového "předpisu" a vytváří za běhu. Součástí frameworku je i tvořič filtrů nad otevřeným query který pouze modifikuje where. Problém nastává, právě při použití dbgridu, kdy uživatel např. změní pořadí nebo šířky sloupců a následně použije filtr. Znovuotevření query způsobí reset tohoto nastavení.
Zatím to řeším tak, že před query.close uložím nastavení gridu a po query.open znovu načtu, což se mi příliš nelíbí.
[/quote]

To se chystam vytvorit neco podobneho :) Nemam ale dost casu na to v klidu sednout.

U me vsak budou sloupce staticke. Uzivatel si pro ne bude moct nakonfigurovat barvy, format textu apod. Je to navic i prakticke protoze ne vsichni uzivatele chteji napr. videt vsechny sloupce a binding na model je s takovou vlastnosti jednoduchy.

Pokud staticke sloupce odmitas (i kdyz je vlastne chces) a musis dotaz nutne znovuotvirat, pak si tu konfiguraci zachovat musis. Stacit by melo odpojeni gridu od data source:

Kód: Delphi [Vybrat]
  1. DBGrid1.DataSource := nil;
  2. try
  3.   FDQuery.SQL.Text := '<New SQL>';
  4.   FDQuery.Open;
  5. finally
  6.   DBGrid1.DataSource := DataSource1;
  7. end;

FireDAC zkratka zahodi vse co o puvodnim dotazu znal (spolu s tim zaridi i vycisteni prilinkovanych komponent). Mozna by ti ale mohlo stacit pouzit parametry a refresh datasetu ale neznam detaily toho co ten filtr dela. Ani to zda mas vsechna data k zobrazeni na klientu (v takovem pripade by se dal aplikovat filtr lokalne).

Offline J_M

  • Nováček
  • *
  • Příspěvků: 28
  • Karma: 0
Re:Query - změna SQL
« Odpověď #4 kdy: 15-09-2017, 15:02:11 »
Tak bohužel odpojenim DataSource se Grid zresetuje. Použití parametrů taky není možné, při sestavování filtru lze použít libovolné sloupce a tím přestavit kompletně celý where.
Zatím se mi zdá, že ukládání a načítání konfigurace sloupců gridu nijak rychlost neovlivňuje, takže to nechám tak a vrátím se k tomu později.
Ale i tak díky za rady.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3534
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Query - změna SQL
« Odpověď #5 kdy: 15-09-2017, 15:12:46 »
Tak bohužel odpojenim DataSource se Grid zresetuje. Použití parametrů taky není možné, při sestavování filtru lze použít libovolné sloupce a tím přestavit kompletně celý where.
Zatím se mi zdá, že ukládání a načítání konfigurace sloupců gridu nijak rychlost neovlivňuje, takže to nechám tak a vrátím se k tomu později.
Ale i tak díky za rady.
Psal jsi, ze to delas pro SQLite, tak si napis vlastni DB vrstvu primo nad jeho API: ja to kdysi nekdy ve verzi 2.8 taky udelal, i kdyz jsem se tvaril navenek jako potomek TDatasetu - kdyz vhodne prekryjes chovani puvodniho datasetu, tak si to budes moct dost pravdepodobne uzpusobit svym potrebam.

Offline J_M

  • Nováček
  • *
  • Příspěvků: 28
  • Karma: 0
Re:Query - změna SQL
« Odpověď #6 kdy: 15-09-2017, 15:24:02 »
Ano, aktuálně používám SQlite, ale pokud se mi to podaří dotáhnout do nějakého uceleného stavu, rád bych potom zkusil i jiné DB. Takže cestou přepisování API se moc nechci vydávat.

96981

  • Host
Re:Query - změna SQL
« Odpověď #7 kdy: 15-09-2017, 15:30:01 »
Tak bohužel odpojenim DataSource se Grid zresetuje. Použití parametrů taky není možné, při sestavování filtru lze použít libovolné sloupce a tím přestavit kompletně celý where.
Zatím se mi zdá, že ukládání a načítání konfigurace sloupců gridu nijak rychlost neovlivňuje, takže to nechám tak a vrátím se k tomu později.
Ale i tak díky za rady.

Pravda. Mel jsem si to vyzkouset driv nez napsat nesmysl. Tohle by mohlo na zalohovani kolekce sloupcu stacit:

Kód: Delphi [Vybrat]
  1. var
  2.   Columns: TDBGridColumns;
  3. begin
  4.   Columns := TDBGridColumns.Create(DBGrid1, TColumn);
  5.   try
  6.     Columns.Assign(DBGrid1.Columns);
  7.     try
  8.       FDQuery1.Close;
  9.       FDQuery1.SQL.Text := '<New SQL>';
  10.       FDQuery1.Open;
  11.     finally
  12.       DBGrid1.Columns.Assign(Columns);
  13.     end;
  14.   finally
  15.     Columns.Free;
  16.   end;
  17. end;

Samozrejme tohle neudrzi filtr ani poradi (indexy) datasetu. Nicmene, tady bych asi lehce zaloboval ohledne persistentnich sloupcu. U me se pomoci nich resi binding na dataset a drzi se v nich konfigurace typu pravidel pro zobrazeni a formatu textu.
« Poslední změna: 15-09-2017, 16:04:06 od 96981 »