Autor Téma: Vo FDQuery nevidim vysledok procedury  (Přečteno 3186 krát)

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Vo FDQuery nevidim vysledok procedury
« kdy: 03-08-2016, 23:47:34 »
ma na firebirde proceduru, ktora mi vracia hodnotu (id noveho zaznamu), spustam ju cez fdquery ale vysledok nevidim (v sql manazery ano), ako to?

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1299
  • Karma: 28
    • Pepak.net
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #1 kdy: 04-08-2016, 08:07:00 »
Moje křišťálová koule říká, že to nejspíš děláš blbě. Detaily bohužel nejsem schopen vyvěštit, na to nemám dost zkušeností.

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #2 kdy: 04-08-2016, 08:20:23 »
do FDQuery.sql pridam cely text procedury, procedura sa vykona ale nevidim RETURNING values

procedura
Kód: [Vybrat]
CREATE PROCEDURE IS(
  ID INTEGER,
  text varchar(10)
RETURNS(
  IDA INTEGER)
AS
BEGIN
  INSERT INTO XXX(ID,text) VALUES (:ID,:text) returning id into :ida;
  SUSPEND;
end;


a query
Kód: [Vybrat]
EXECUTE PROCEDURE IS (null,'BBBB')

vysledok ocakavam

Kód: [Vybrat]
query.fields[0].AsInteger
« Poslední změna: 04-08-2016, 08:49:59 od František »

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1299
  • Karma: 28
    • Pepak.net
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #3 kdy: 04-08-2016, 08:36:33 »
1) EXECUTE PROCEDURE samo o sobě výsledky zahazuje. Pokud chceš, aby něco vrátilo, musíš použít RETURNING/RETURNING_VALUES. Jednodušší je použít SELECT * FROM jméno_procedury(parametry).

2) Vrácené hodnoty se vrací v resultsetu, tj. přistupuješ k tomu přes pole Fields. Params jsou parametry.

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #4 kdy: 04-08-2016, 08:49:42 »
mám tam fields, zle som to odpísal

a flamerobin mi vráti ID keď to spustím aj v tomto tvare


Offline pepak

  • Guru
  • *****
  • Příspěvků: 1299
  • Karma: 28
    • Pepak.net
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #5 kdy: 04-08-2016, 09:06:40 »
Tak se neptej, když nechceš slyšet odpověď.

A také je zvykem, když pokládám otázku na chybu v kódu, uvádět konkrétní chybující kód, ne si ho upravovat.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3001
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #6 kdy: 04-08-2016, 09:10:32 »
Citace
Tak se neptej, když nechceš slyšet odpověď.
Aj tak mu odpoviem :)
Mňa to tu naučili takto:
Kód: [Vybrat]
CREATE PROCEDURE RISER_FLAT_IU(
  IDRISER_FLAT TYPE OF COLUMN RISER_FLAT.IDRISER_FLAT,
  FKFOCS TYPE OF COLUMN RISER_FLAT.FKFOCS,
  FKFLATS TYPE OF COLUMN RISER_FLAT.FKFLATS,
  FKRISERS TYPE OF COLUMN RISER_FLAT.FKRISERS,
  ISRISER TYPE OF COLUMN RISER_FLAT.ISRISER)
RETURNS(
  NEWID INTEGER)
AS
BEGIN
  NEWID = 0;

  IF (EXISTS (SELECT IDRISER_FLAT
              FROM RISER_FLAT
              WHERE (IDRISER_FLAT = :IDRISER_FLAT))) THEN
    UPDATE RISER_FLAT
    SET ISRISER = :ISRISER
    WHERE (IDRISER_FLAT = :IDRISER_FLAT);
  ELSE
  BEGIN
    NEWID = GEN_ID(COMMON_ID, 1);  // Bezpečné získanie hodnoty.

    INSERT INTO RISER_FLAT (IDRISER_FLAT, FKFOCS, FKFLATS, FKRISERS, ISRISER)
    VALUES (:NEWID, :FKFOCS, :FKFLATS, :FKRISERS, :ISRISER);
  END

  SUSPEND;
END;
Všimni si spôsob získania hodnoty pre primárny kľúč. To bola dlhá debata.
Spôsob použitia
Kód: [Vybrat]
    FspRISER_FLAT_IU.ParamByName('IDRISER_FLAT').AsInteger := NodeData.iPKList[0];
    FspRISER_FLAT_IU.ParamByName('FKFOCS').AsInteger := oGlobalVar.IDFOCs;
    FspRISER_FLAT_IU.ParamByName('FKFLATS').AsInteger := NodeData.iPKList[2];
    FspRISER_FLAT_IU.ParamByName('FKRISERS').AsInteger := FHotDBBasic.DBBasic.PrimaryKey;
    FspRISER_FLAT_IU.ParamByName('ISRISER').AsBoolean := FlstChecked[I];

    try
      FspRISER_FLAT_IU.ExecProc;

      if FspRISER_FLAT_IU.ParamByName('NEWID').AsInteger <> 0 then
        NodeData.iPKList[0] := FspRISER_FLAT_IU.ParamByName('NEWID').AsInteger;  // TU !!!
    except
      on E: EDatabaseError do
        Fault(E.Message);
//        Fault(E.Message + sLineBreak + 'HelpContext '+ E.HelpContext);
    end;
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #7 kdy: 04-08-2016, 09:24:07 »
Tak se neptej, když nechceš slyšet odpověď.

jasné že chcem, ale nejde mi do hlavy, že prečo to flamerobin zobrazí ale v programe nie (mam tam aj zabudovaný svoj SQL manažér a ani v tom mi to nejde)

A také je zvykem, když pokládám otázku na chybu v kódu, uvádět konkrétní chybující kód, ne si ho upravovat.
skrátil som to na to podstatné, nebudem tu už vkladať 50kB nič nehovoriace litánie vid. http://forum.delphi.cz/index.php/topic,15317.0.html

alebo

Kód: [Vybrat]
CREATE PROCEDURE INSERTTOSKLAD(
  IDCENNIK "#CISLO",
  SKLAD "#TEXT_X_4",
  SKLADOM "#ANO1_NIE0",
  DATUM "#DATUM ACAS",
  TYP "#TEXT_1000",
  CENA2 "#CENA10-4",
  CENASTARA "#CENA10-4",
  POPIS "#TEXT_2000",
  ZARUKA "#CISLO_MALE",
  POZNAMKA "#TEXT__100",
  STAV "#CISLO_MALE",
  DATUMPRIPOJENIA "#DATUM ACAS",
  KS "#KS4-4",
  DOSTUPNOST "#TEXT___50",
  PARTNO "#TEXT___50",
  PARTNO2 "#TEXT___50",
  DPH "#CISLO_MALE",
  KODSKLADU "#TEXT___50",
  VYROBCA "#TEXT___50",
  CENA_AF "#CENA10-4",
  CENA_RF "#CENA10-4",
  DATUMSKLADOM "#DATUM ACAS",
  X_ZMENA "#DATUM ACAS",
  X_ZMENIL "#TEXT___20",
  IGNORE_CENA "#ANO1_NIE0",
  IGNORE_SKLADOM "#ANO1_NIE0",
  IDS "#ID",
  HMOTNOST "#KS4-4",
  EAN13 "#TEXT___20",
  WEB_VYROBCU "#TEXT__150",
  WEB_PRODUKTU "#TEXT_1000",
  WEB_PIC "#TEXT_1000",
  WEB_PIC_THUMB "#TEXT_1000",
  WEB_PIC_LARGE "#TEXT_1000",
  CENA_EU "#CENA10-4",
  ZMENA "#ANO1_NIE0",
  AUTOCONNECT "#CISLO_MALE")
RETURNS(
  ID INTEGER)
AS
DECLARE VARIABLE V_ID2 INTEGER;
BEGIN

 INSERT INTO sklad (
  IDCENNIK,
  SKLAD,
  SKLADOM ,
  DATUM ,
  TYP ,
  CENA2 ,
  CENASTARA ,
  POPIS ,
  ZARUKA ,
  POZNAMKA ,
  STAV ,
  DATUMPRIPOJENIA ,
  KS ,
  DOSTUPNOST ,
  PARTNO ,
  PARTNO2 ,
  DPH ,
  KODSKLADU ,
  VYROBCA ,
  CENA_AF ,
  CENA_RF ,
  DATUMSKLADOM ,
  X_ZMENA ,
  X_ZMENIL ,
  IGNORE_CENA ,
  IGNORE_SKLADOM ,
  IDS ,
  HMOTNOST ,
  EAN13 ,
  WEB_VYROBCU ,
  WEB_PRODUKTU ,
  WEB_PIC ,
  WEB_PIC_THUMB ,
  WEB_PIC_LARGE ,
  CENA_EU,
  ZMENA,
  AUTOCONNECT
 
  ) VALUES (
 
  :IDCENNIK ,
  :SKLAD ,
  :SKLADOM ,
  :DATUM ,
  :TYP ,
  :CENA2 ,
  :CENASTARA ,
  :POPIS ,
  :ZARUKA ,
  :POZNAMKA ,
  :STAV ,
  :DATUMPRIPOJENIA ,
  :KS ,
  :DOSTUPNOST ,
  :PARTNO ,
  :PARTNO2 ,
  :DPH ,
  :KODSKLADU ,
  :VYROBCA ,
  :CENA_AF ,
  :CENA_RF ,
  :DATUMSKLADOM ,
  :X_ZMENA ,
  :X_ZMENIL ,
  :IGNORE_CENA ,
  :IGNORE_SKLADOM ,
  :IDS ,
  :HMOTNOST ,
  :EAN13 ,
  :WEB_VYROBCU ,
  :WEB_PRODUKTU ,
  :WEB_PIC ,
  :WEB_PIC_THUMB ,
  :WEB_PIC_LARGE ,
  :CENA_EU ,
  :ZMENA,
  :AUTOCONNECT
  ) returning id into :id;

end;

Kód: [Vybrat]
EXECUTE PROCEDURE InsertToSklad (null,'HHHH',1,'03.08.2016','PremiumCord Izolační páska PVC 15/10 hnědá',5.2,0,'PremiumCord Izolační páska PVC 15/10 hnědá&&PVC ,13 mm x 15 mm x 10 m &&Technické parametry:  0,13 mm +- 0,02 mm  15 mm +- 1,0 mm  10 m +- 0,5 m  v tahu min. 150 N/10 mm  min. 125% . pevnost min. 40 kV/mm . pevnost po vlhku min. 35 kV/mm  plamenem <1 sec.  k oceli min. 1,8 N/10 mm  k podkladu 1,5 N/10 mm  při teplotě +10°C až +60°C  při teplotě +5°C až +60°C  normě ČSN EN 60454-3-1-2/F-PVC/60 &&[ENG] PVC Isolation Tape&&0.13mm x 0.15mm x 10m color',24,'PremiumCord Izolační páska PVC 15/10 hnědá',0,null,1,'82',' ',' ',21,'zvpep06','PremiumCord',0,0,'03.08.2016 23:26:07','03.08.2016 23:26:07','-MK-16-',0,0,4194,0,' ',' ',' ','http://www.hhhh.sk/img.asp?stiid=4194',' ',' ',0,1,0)
a z programu
Kód: [Vybrat]
work.sql.clear;
work.sql.add(predchadzajuca procedura ako string)
work.execSQL;
result := work.fields[0].AsInteger;

fígel je v tom, že riadok sa vloží (inzertne), parameter ID sa  vráti (šak flamerobin mi ho zobrazí) ale v programe ho nevidim - mam (inaccesible value)

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1299
  • Karma: 28
    • Pepak.net
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #8 kdy: 04-08-2016, 09:33:48 »
nejde mi do hlavy, že prečo to flamerobin zobrazí ale v programe nie (mam tam aj zabudovaný svoj SQL manažér a ani v tom mi to nejde)
Asi že FlameRobin ten dotaz zpracovává jinak než ty. Pokud tě to zajímá, tak si projdi zdrojáky FlameRobinu a jistě to najdeš. Pro samotnou otázku, jak to udělat, to není relevantní.

Citace
A také je zvykem, když pokládám otázku na chybu v kódu, uvádět konkrétní chybující kód, ne si ho upravovat.
skrátil som to na to podstatné, nebudem tu už vkladať 50kB nič nehovoriace litánie
No to samozřejmě, že budeš postovat jen minimální relevantní část kódu. Ale musíš si napřed ověřit, že ta část kódu skutečně vykazuje chování, o kterém tvrdíš, že s ním chceš pomoct.

Citace
ale v programe ho nevidim - mam (inaccesible value)
Aha. Takže ani nezkoušíš tu hodnotu načíst, jen se na ni díváš v Evaluate/Watch. Z toho vyplývá, že nevíš, jestli ti to program nenačte, jen hádáš. Tak začni tím, že si ověříš, co se skutečně děje.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3001
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #9 kdy: 04-08-2016, 09:38:48 »

Prvé čo ma zarazilo
Kód: [Vybrat]
EXECUTE PROCEDURE InsertToSklad (null,
Čo iné Ti má vrátiť fields[0] ak nie "null"
Kód: [Vybrat]
// Prvý výskyt
...
RETURNS(
  ID INTEGER)
...
// Druhé objavenie sa
) returning id into :id;
A teraz mi povedz akú hodnotu má to Tvoje ID? Žiadnu.
flamerobin nepoznám a tak neviem čo robí na pozadí.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1869
  • Karma: 92
    • Verze Delphi: D2007, XE3, DX10
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #10 kdy: 04-08-2016, 09:50:23 »
jasné že chcem, ale nejde mi do hlavy, že prečo to flamerobin zobrazí ale v programe nie (mam tam aj zabudovaný svoj SQL manažér a ani v tom mi to nejde)
Nejspis proto, ze ten, kdo programoval flamerobin neco o databazich vedel... A vedel to proto, ze si o nich neco precetl. Protoze jsi nam tady posledni dobou nazorne predvedl, ze o DB nevis zhola nic, tak bych ti doporucoval koupit si nejakou obecnou knihu o relacnich databazich, vypnout pocitac a precist si ji drive, nez pujdes neco prasit  >:(

Ostatne i v dokumentaci k FireDAC je odpoved na tvuj problem napsana doslova: http://docwiki.appmethod.com/appmethod/1.17/libraries/en/FireDAC.Comp.Client.TFDCustomQuery.ExecSQL

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #11 kdy: 04-08-2016, 10:15:09 »
flamerobin je SQL manažer, ako IBexpert...


tam mi moja DB procedúra dáva výsledok, tak prosím ťa neries DB čast, tá funguje..
problém mám v kóde

Protoze jsi nam tady posledni dobou nazorne predvedl, ze o DB nevis zhola nic, ....
ďakujem za vyznamenanie  :-\

Citace
Ostatne i v dokumentaci k FireDAC je odpoved na tvuj problem napsana doslova: http://docwiki.appmethod.com/appmethod/1.17/libraries/en/FireDAC.Comp.Client.TFDCustomQuery.ExecSQL
sory ale riešenie som tam nenašiel

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #12 kdy: 04-08-2016, 10:29:08 »
nejde mi do hlavy, že prečo to flamerobin zobrazí ale v programe nie (mam tam aj zabudovaný svoj SQL manažér a ani v tom mi to nejde)
Asi že FlameRobin ten dotaz zpracovává jinak než ty. Pokud tě to zajímá, tak si projdi zdrojáky FlameRobinu a jistě to najdeš. Pro samotnou otázku, jak to udělat, to není relevantní.
samozrejme, len som to udaval ako fakt, ze preocedura je ok, dava vysledok, len to neviem ziskat do programu ... to je cele

Citace
ale v programe ho nevidim - mam (inaccesible value)
Aha. Takže ani nezkoušíš tu hodnotu načíst, jen se na ni díváš v Evaluate/Watch. Z toho vyplývá, že nevíš, jestli ti to program nenačte, jen hádáš. Tak začni tím, že si ověříš, co se skutečně děje.

sak som napísal kód
Kód: [Vybrat]
work.sql.clear;
work.sql.add(predchadzajuca procedura ako string)
work.execSQL;
result := work.fields[0].AsInteger;
kde to používam, a keď to nejde, samozrejme sa pozrem do Evaluate/Watch ...

naozaj neviem o čo vám všetkým ide ... mám problém a snažím sa ho riešiť, a vy vsetci do mňa aký som hlúpy, ale to je jasné, keď sa pýtam na veci čo sú pre vás triviálne ... tak preto hľadám u vás - múdrych - radu a nie hodnotienie
« Poslední změna: 04-08-2016, 10:32:54 od František »

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1299
  • Karma: 28
    • Pepak.net
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #13 kdy: 04-08-2016, 10:36:32 »
Radu jsi sakra dostal v odpovědi číslo 3 (a v jiné podobě v odpovědi číslo 6). Hodnocení jsi začal dostávat až poté, co tu radu ignoruješ a furt si meleš svou.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1869
  • Karma: 92
    • Verze Delphi: D2007, XE3, DX10
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #14 kdy: 04-08-2016, 10:47:28 »
naozaj neviem o čo vám všetkým ide ... mám problém a snažím sa ho riešiť, a vy vsetci do mňa aký som hlúpy
Pokud si to pamatuju, tak nikdo nepsal, ze jsi hloupy... A o co nam jde? Ze z tebe mame delsi dobu pocit, ze jsi lajdak, kteremu je zatezko presne popsat poradne svuj problem a ktery se z naseho pohledu moc nesnazi svoje problemy resit a na svoje problemy chce plytvat nasim casem . Asi by neskodilo si precist klasiku, proc a nac jsou odborna diskusni fora a jak to v nich chodi http://www.root.cz/texty/jak-se-spravne-ptat/

Mas tam dve chyby:

1. na prvni ti odpovedel pepak, ze pokud chces dostat data ze SP, nesmis ji spoustet pomoci EXECUTE
2. na druhou mas odpoved v dokumentaci, kde pises, ze jsi nic nenasel. A to nevim, co si o tobe mam myslet  :o Hned na prvni obrazovce na 5. radku pisou:
For SELECT statements and other statements which return cursors, call Open instead of ExecSQL a ke konci textu to pro jistotu zopakuji jeste jednou:
Use ExecSQL to execute queries that do not return a cursor to data


Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3001
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #15 kdy: 04-08-2016, 10:48:47 »
Citace
naozaj neviem o čo vám všetkým ide ... mám problém a snažím sa ho riešiť, a vy vsetci do mňa aký som hlúpy, ale to je jasné, keď sa pýtam na veci čo sú pre vás triviálne ... tak preto hľadám u vás - múdrych - radu
Nikto nenapísal, že si hlúpy. Ale, že nemáš dostatočné vedomosti + patričné skúsenosti.
A ide nám o to, aby si sa zamyslel ako to funguje! Potom si uvedomíš čo robíš zle.

Ja som Ti poslal ukážku svojej SP aj s použitím + popis chýb, ktoré podľa mňa máš. Sú minimálne v uvedených textoch.

Pepak, pf1957 aj ja sme Ti nezávisle na sebe napísali , že flamerobin si to obslúži sám. Ak on vráti hodnotu, tak to neznamená, že to máš správne. Znie to čudne, ale bude to tak.

Teraz po lopate:
 - V Tvojej SP nikde nepriraďuješ hodnotu do ID !!! Máš tam dva výskyty ID. Musia byť minimálne TRI
 - Ak do parametra (fields[0]) vrazíš "hodnotu" null, tak Ti ju aj vráti. A fileds[0] je IDCiselnik.

Prečo to nie je v angličtine? Ja po anglicky neviem, ale slovenské slovo u mňa v DB ani v definíciách v delphi nenájdeš. Aj keď tam mám dosť často dobrú kravinu. Nie je nič výnimočné, že to aj 5 x premenujem.

PS: už som to raz písal. Máme jednu spoločnú vlastnosť. Nevieme správne napísať čo chceme ;D  + uverejňujeme časti kódu, ktoré len ostatných úplne zmätú (domotajú).
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #16 kdy: 04-08-2016, 10:56:31 »
áno priznávam sa, že sem tam niečo prehliadnem, ale mňa zarážalo to, že v manažéroch to išlo aj s EXECUTE PROCEDURES

Kód: [Vybrat]
SELECT id FROM procedureheuréka


PS. ďakujem, a nikto vám nie je vďačnejši ako ja

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3001
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #17 kdy: 04-08-2016, 11:17:33 »
Ešte jedna poznámka k SP. Máš tam DECLARE VARIABLE V_ID2 INTEGER; a V_ID2 sa už nikde neobjavuje. Vyhodiť. Predpokladám, že si uverejnil celý text SP.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #18 kdy: 04-08-2016, 11:36:06 »
Stanislav, ďakujem že si pozornejší ako ja, použil som to na test a potom vyhodil, išlo to .... to je tá moja nepozornosť

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #19 kdy: 04-08-2016, 12:03:25 »
For SELECT statements and other statements which return cursors, call Open instead of ExecSQL a ke konci textu to pro jistotu zopakuji jeste jednou:
Use ExecSQL to execute queries that do not return a cursor to data

tu je navine moja angličtina: zle som si preložil  " instead of "

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #20 kdy: 04-08-2016, 12:37:20 »
vyriešené, zostali len šrámy na duši

https://www.youtube.com/watch?v=hrEmcu3hYZo

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3001
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #21 kdy: 04-08-2016, 15:30:52 »
Ja sa celý čas neviem zmieriť s
Kód: [Vybrat]
SELECT id FROM procedureNa kieho čerta volať navyše nejaké SQL.Select, ktoré spustí celú lavínu udalostí, keď sa to dá priamo prečítať z SP.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1299
  • Karma: 28
    • Pepak.net
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #22 kdy: 04-08-2016, 17:14:51 »
Na kieho čerta volať navyše nejaké SQL.Select, ktoré spustí celú lavínu udalostí, keď sa to dá priamo prečítať z SP.
Kód: SQL [Vybrat]
  1. SELECT some_field, some_other_field
  2. FROM some_procedure(1,2,3,4,5)
  3. WHERE yet_another_field>=25
  4. ORDER BY still_another_field
Například. Šlo by to samozřejmě dále zkomplikovat JOINy, agregacemi atd. atd.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1299
  • Karma: 28
    • Pepak.net
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #23 kdy: 04-08-2016, 17:16:28 »
Nebo taky:
Kód: SQL [Vybrat]
  1. INSERT INTO sometable (field1, field2)
  2. SELECT field_a, field_b
  3. FROM some_procedure(3,1,4,1,5)

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #24 kdy: 04-08-2016, 17:22:41 »
Ja sa celý čas neviem zmieriť s
Kód: [Vybrat]
SELECT id FROM procedureNa kieho čerta volať navyše nejaké SQL.Select, ktoré spustí celú lavínu udalostí, keď sa to dá priamo prečítať z SP.
no neviem presne co myslis, ale tie zbytocnosti som videl v tvojom kode co si mi tu ukazoval

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3001
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #25 kdy: 04-08-2016, 19:34:42 »
Citace
no neviem presne co myslis, ale tie zbytocnosti som videl v tvojom kode co si mi tu ukazoval
Tak mi ich ukáž! :o  Ja o nich neviem. Zhrniem čo som tu dal.
V DB mám SP. Teraz ju maximálne zjednoduším
Kód: [Vybrat]
CREATE PROCEDURE RISER_FLAT_IU(
  IDRISER_FLAT TYPE OF COLUMN RISER_FLAT.IDRISER_FLAT)
RETURNS(
  NEWID INTEGER)
AS
BEGIN
  NEWID = GEN_ID(COMMON_ID, 1);  // 1
  INSERT INTO RISER_FLAT (IDRISER_FLAT, FKFOCS, FKFLATS, FKRISERS, ISRISER)
  VALUES (:NEWID, :FKFOCS, :FKFLATS, :FKRISERS, :ISRISER);
  SUSPEND;
END;
Pomocou generátora som získal Primary key a uložil do premennej, ktorú mi SP vráti!!! Zároveň som ju použil ako nový PK v novom zázname. Touto konštrukciou som prestal používať možnosť získať ID pomocou FireDAC.
V projekte mám:
Kód: [Vybrat]

  FspRISER_FLAT_IU := TFDStoredProc.Create(MyForm);  // 2
  FspRISER_FLAT_IU.StoredProcName := 'RISER_FLAT_IU';
  ....
  FspRISER_FLAT_IU.ParamByName('IDRISER_FLAT').AsInteger := NodeData.iPKList[0];

  try
    FspRISER_FLAT_IU.ExecProc;

    if FspRISER_FLAT_IU.ParamByName('NEWID').AsInteger <> 0 then  // 3
      NodeData.iPKList[0] := FspRISER_FLAT_IU.ParamByName('NEWID').AsInteger;  // 4
  except
    on E: EDatabaseError do
      Fault(E.Message);
  end;
Snáď je to teraz jasné. Ty si si mal urobiť takúto analýzu >:(
Ja nad niektorými odpoveďami hútam aj nejaký ten deň ;)

1 Bezpečné získanie hodnoty primárneho kľúča. Už mi ju nikto neukradne/nepoužije/neprepíše... Trvalo mi to dosť dlho kým som to pochopil a niektorí ľudia pri tom skoro stratili nervy.
2 Nech sa nestarám o jej likvidáciu - FreeAndNill(); To robím so všetkými komponentami vytváranými za behu.
3 To je z mojej strany vlastne zbytočná poistka navyše. Pre moju spokojnosť.
4 Získanie hodnoty, ktorú mi SP vracia. Tu som sa potrápil, lebo som nepredpokladal použitie ParamByName.

Na získanie ID sa dá použiť aj konštrukcia
Kód: [Vybrat]
 
FcmdConsumptionIns.CommandText.Add('INSERT INTO CONSUMPTIONS' +
  ' (IDCONSUPMTIONS, FKFOCS, FKLANDLORD_FLAT, FKMETERS, READING, STATE, INITIALSTATE)'+
  ' VALUES (GEN_ID(COMMON_ID, 1 ), :FKFOCS, :FKLANDLORD_FLAT, :FKMETERS, :READING, :STATE, 1)');
« Poslední změna: 04-08-2016, 19:40:19 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #26 kdy: 05-08-2016, 09:03:03 »
učili ma že databáza má byť napísaná tak, aby som aj manuálnym zápisom do nej neporušil integritu údajov
v tvojom prípade keď ten insert urobím bez procedúry, tak sa to stane, ale ak to máš ošetrené, nič som nepovedal

mne sa to ale aj tak viac pozdáva s trigerom a využitím RETURNING v INSERTE, ale toto je asi skôr otazka na FIREBIRD google group

mám databázu, kde mám použitý spôsob "Tree traversal" na uloženie stromu, a ktomu mám triger, že keď prepíšem jednu hodnou L, alebo R hoc aj ručne, ta sa mi presunie celá vetva, ak je to teda možné, ak nie nestane sa nič - nedovolí mu to prepísať

niečo o Tree traversal
https://www.zdrojak.cz/clanky/ukladame-hierarchicka-data-v-databazi-ii/



Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3001
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #27 kdy: 05-08-2016, 12:45:08 »
Citace
učili ma že databáza má byť napísaná tak, aby som aj manuálnym zápisom do nej neporušil integritu údajov
v tvojom prípade keď ten insert urobím bez procedúry, tak sa to stane,
Mňa to síce neučili, ale považujem to za základné pravidlo a snažím sa ho v plnej miere dodržať. Ale spustenie procedúry nepovažujem za manuálny zásah do DB. Ale pravidlo integrity musí dodržať.
Citace
mne sa to ale aj tak viac pozdáva s trigerom a využitím RETURNING v INSERTE, ale toto je asi skôr otazka na
Skôr otázka osobného vkusu či uprednostňovania nejakého postupu alebo už niečoho naučeného.
Citace
mám databázu, kde mám použitý spôsob "Tree traversal" na uloženie stromu
To nebolo spomenuté. Ten trigger je tam viac než žiadaný.
Od rána som nerobil nič iné, len čítal ten odkaz na Tree traversal. Nevedel som o tom. Bolo to zaujímavé čítanie, aj keď mňa sa to netýka. A snáď ani nebude :)  Ale aspoň viem načo je dobré (či kedy) ukladať strom do DB
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:Vo FDQuery nevidim vysledok procedury
« Odpověď #28 kdy: 05-08-2016, 14:22:17 »
čo sa týka záklednej témy tohoto príspevku, je už vyriešená, ale tak že som to nakoniec prepísal bez potreby vracania výsledku :), ale takto som spokojný , lebo bez tohoto by som na to neprisiel .... vsetyko potrebne si vyriesim vramci tej procedury

ten tree traversal bol len ako príklad, netýka sa tejto témy priamo

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: