Autor Téma: UPDATE OR INSERT INTO - návratová hodnota  (Přečteno 874 krát)

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2690
  • Karma: 25
    • Verze Delphi: XE7 professional
UPDATE OR INSERT INTO - návratová hodnota
« kdy: 05-11-2016, 12:42:42 »
Chcem sa zbaviť SP, tak to skúšam. V návode sa píše, že to je podporované v DSQL
Kód: Delphi [Vybrat]
  1. procedure TfrmMainFormFOC.btnProofingFormsClick(Sender: TObject);
  2. var
  3.   cmd: TFDCommand;
  4. begin
  5.   cmd := oDBControl.CreateCmd(Self);
  6.   cmd.CommandText.Text := 'UPDATE OR INSERT INTO LANDLORD_FLAT'+
  7.     ' (IDLANDLORD_FLAT, FKFOCS, FKLANDLORD, FKFLAT, DATEFROM, DATETO, ISACTIVE)'+
  8.     ' VALUES (0, 1776, 1831, 1918, :DATEFROM, :DATETO, 1)'+
  9.     ' MATCHING (IDLANDLORD_FLAT)'+
  10. //    ' RETURNING REC_ID INTO :ID';
  11.     ' RETURNING IDLANDLORD_FLAT INTO :ID';
  12.   cmd.ParamByName('DATEFROM').AsDate := EncodeDate(2016, 11, 11);
  13.   cmd.ParamByName('DATETO').Value := null;
  14.   cmd.Transaction.StartTransaction;
  15.   try
  16.     cmd.Execute();
  17.     cmd.Transaction.Commit;
  18.     Caution(IntToStr(cmd.ParamByName('ID').AsInteger));
  19.   except on E: EFDDBEngineException do
  20.     Caution('Chyba !!!')
  21.   end;
  22. end;
  23.  
Dostávam chybu
Project JasotSVB.exe raised exception class EIBNativeException with message '[FireDAC][Phys][FB]Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 207
?'.

Na znaku 207 písmeno "O" z IDLANDLORD_FLAT

Pri použití verzie s REC_ID
Na znaku 198 posledné písmeno "G" z RETURNING

V tých chybách nevidím žiadnu logiku/súvis. Bez časti RETURNING to ide bezchybne.
« Poslední změna: 05-11-2016, 12:46:05 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1711
  • Karma: 70
    • Verze Delphi: D2007, XE3, DX10
Re:UPDATE OR INSERT INTO - návratová hodnota
« Odpověď #1 kdy: 05-11-2016, 14:32:03 »
[...]
Na znaku 207 písmeno "O" z IDLANDLORD_FLAT
Pri použití verzie s REC_ID
Na znaku 198 posledné písmeno "G" z RETURNING
[...]
Pravda, s reportovanim chyb se FB moc nepredved, nicmene s ohledem na rozdil delek IDLANDLORD_FLAT a REC_ID bych usuzoval, ze mu vadi INTO, mj. proto, ze v dokumentaci (napr. http://www.firebirdsql.org/refdocs/langrefupd25-update-or-insert.html) pisou "The “INTO <variables>” subclause is only available in PSQL."

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2690
  • Karma: 25
    • Verze Delphi: XE7 professional
Re:UPDATE OR INSERT INTO - návratová hodnota
« Odpověď #2 kdy: 05-11-2016, 14:40:32 »
K tomu INTO (v časti returning) sa ani nedostane. Keď ho vyhodím, tak chyba pretrváva a hláška sa nezmení.
Jaj, až teraz som to pochopil. Na vrátenie hodnôt môžem zabudnúť :'(
« Poslední změna: 05-11-2016, 14:42:10 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2690
  • Karma: 25
    • Verze Delphi: XE7 professional
Re:UPDATE OR INSERT INTO - návratová hodnota
« Odpověď #3 kdy: 05-11-2016, 14:48:04 »
Takže predsa to ide
Kód: [Vybrat]
    ' RETURNING IDLANDLORD_FLAT';
  cmd.Params[0].AsInteger;
Lenže tam mám nezmyselnú hodnotu. Idem to študovať.
Ten Params[0] je nezmysel. Je to vstupný parameter.
« Poslední změna: 05-11-2016, 15:11:09 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2690
  • Karma: 25
    • Verze Delphi: XE7 professional
Re:UPDATE OR INSERT INTO - návratová hodnota
« Odpověď #4 kdy: 05-11-2016, 15:10:03 »
Takto to zbehne
Kód: [Vybrat]
    ' RETURNING cast(IDLANDLORD_FLAT as integer)';
Ale neviem sa dostať k tej hodnote!
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2690
  • Karma: 25
    • Verze Delphi: XE7 professional
Re:UPDATE OR INSERT INTO - návratová hodnota
« Odpověď #5 kdy: 05-11-2016, 16:00:59 »
Tak to vyzerá, že musím ostať pri SP.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1257
  • Karma: 28
    • Pepak.net
Re:UPDATE OR INSERT INTO - návratová hodnota
« Odpověď #6 kdy: 05-11-2016, 16:22:55 »
Stačilo by, kdybys ten svůj SQL dotaz prováděl v rámci Query a ne Command.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1711
  • Karma: 70
    • Verze Delphi: D2007, XE3, DX10
Re:UPDATE OR INSERT INTO - návratová hodnota
« Odpověď #7 kdy: 05-11-2016, 16:26:14 »
Ale neviem sa dostať k tej hodnote!
Musis s tim zachaset jako s SQL prikazem, ktery vraci result set tj. jako se selectem:
Kód: Delphi [Vybrat]
  1.  
  2. ...
  3. q.Open;
  4. try
  5.   if q.Eof then
  6.     result := INVALID_ID_VALUE;
  7.   else
  8.     result := q.Fields[0].AsInteger;
  9.   //result := q.Fields.FieldByName(....).AsInteger;
  10. finally
  11.   q.Close;
  12. end;
  13. ...
  14.  
  15.  

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2690
  • Karma: 25
    • Verze Delphi: XE7 professional
Re:UPDATE OR INSERT INTO - návratová hodnota
« Odpověď #8 kdy: 05-11-2016, 19:35:36 »
S query a Fields to funguje.
Citace
Stačilo by, kdybys ten svůj SQL dotaz prováděl v rámci Query a ne Command.
To som skúšal, len návratovú hodnotu som sa snažil získať cez Params.
pf1957 mal pravdu s tým, že sa mám vykašľať na TFDCommad ;)
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

 

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: