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

Offline František

  • Plnoletý
  • ***
  • Příspěvků: 247
  • Karma: 2
    • Verze Delphi: XE5, 10.1 starter (BDS2006, XE)
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ů: 1270
  • 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

  • Plnoletý
  • ***
  • Příspěvků: 247
  • Karma: 2
    • Verze Delphi: XE5, 10.1 starter (BDS2006, XE)
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ů: 1270
  • 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

  • Plnoletý
  • ***
  • Příspěvků: 247
  • Karma: 2
    • Verze Delphi: XE5, 10.1 starter (BDS2006, XE)
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ů: 1270
  • 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ů: 2738
  • Karma: 26
    • 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

  • Plnoletý
  • ***
  • Příspěvků: 247
  • Karma: 2
    • Verze Delphi: XE5, 10.1 starter (BDS2006, XE)
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ů: 1270
  • 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ů: 2738
  • Karma: 26
    • 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ů: 1751
  • Karma: 77
    • 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

  • Plnoletý
  • ***
  • Příspěvků: 247
  • Karma: 2
    • Verze Delphi: XE5, 10.1 starter (BDS2006, XE)
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

  • Plnoletý
  • ***
  • Příspěvků: 247
  • Karma: 2
    • Verze Delphi: XE5, 10.1 starter (BDS2006, XE)
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ů: 1270
  • 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ů: 1751
  • Karma: 77
    • 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


 

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í:
Kolik je šest plus čtyři (slovem):