clausula Returning Firebird

Delphi

29/12/2010

B. dia a todos   tenho um sql de insert em um IbQuery e apos executa-la gostaria de pegar o valor retornado, visto que o firebird tem essa facilidade, rem relação ao campo autoincremento.   Sql = insert into customer (customer) values ('Carlos') returning cust_no; Apos o IbQuery.ExeSql; gostaria de pegar o valor do campo cust_no   Tentei IbQuery.FieldByName('cust_no').asinteger mas nao deu.   Quem puder me auxiliar agradeço.   Att.   Alexandre  
Ale.sjrp

Ale.sjrp

Curtidas 0

Respostas

Ricardo Araujo

Ricardo Araujo

29/12/2010

caro colega 

estava vendo a documentação do firebird encontrei isto da uma olhada.

CREATE PROCEDURE SEARCH_ACTOR(NAME VARCHAR(50))RETURNS (TITLE VARCHAR(50),ACTOR VARCHAR(50),PRICE NUMERIC(18,2))ASDeclare variable i integer;Declare variable SQL varchar(1000);BEGINi=10;Sql = 'select first '|| :i ||' TITLE,ACTOR,PRICE from productwhere actor containing '''||name||''''FORexecute statement :sqlINTO :TITLE,:ACTOR,:PRICEDOBEGINif (price>30) then price=30;SUSPEND;ENDEND
só não sei se ai ajuda.rbbarretorbbarreto@hotmail.com


GOSTEI 0
Ale.sjrp

Ale.sjrp

29/12/2010

nao ajuda, realmente preciso pegar o resultado na IbQuery
GOSTEI 0
João Sobrinho

João Sobrinho

29/12/2010

Colega, tente assim:   IbQuery.Open;  
GOSTEI 0
Ricardo Araujo

Ricardo Araujo

29/12/2010

estão faz assim, vai fica um pouco grande o sql mas vale apena.


Exemplo :

var
  lcRetorno : string;
begin 

IbQuery.close;
IBQuery1.sql.Clear;
IbQuery.sql.Add('INSERT INTO CLIENTE ');
IbQuery.sql.Add('(NOME, ENDERECO, BAIRRO, CIDADE)');
IbQuery.sql.Add('VALUES');
IbQuery.sql.Add('(:NOME, :ENDERECO, :BAIRRO, :CIDADE)');

IbQuery.ParabyName('NOME').AsString := FNome;
IbQuery.ParabyName('ENDERECO').AsString := FEndereco;
IbQuery.ParabyName('BAIRRO').AsString := FBairro;
IbQuery.ParabyName('CIDADE').AsString := FCidade;

IBQuery1.ExecSQL;



// agora vou monta o sql para pegar o último código.
// você também pode montar um metodo que retorna os codigo de todas a tabelas.

IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select max(cd_cod) from CD_CLIENTE');
IBQuery1.Open;
 
lcRetorno := IntToStr( IBQuery1.FieldByName('MAX').AsInteger);

espero ter ajudado
rbbarreto
rbbarreto@hotmail.com
GOSTEI 0
Ale.sjrp

Ale.sjrp

29/12/2010

com a condição max ja utilizo, queria algo mais especifico, visto que o banco de dados firebird disponibiliza essa funcao no proprio bd para retornar o valor do post em um campo autoincremento.   Nessa cláusula Max(campo) devemos tomar um cuidado em relação a sistemas que operam em rede visto que pode ocorrer insert em um curto espaço de tempo (entre duas maquinas efetuando no mesmo cadastro).
GOSTEI 0
Julio Develis

Julio Develis

29/12/2010

  O IBQuery não fornece suporte para essa funcionalidade. Use o Zeos que funciona;
GOSTEI 0
Filipe Sousa

Filipe Sousa

29/12/2010


  Segundo as regras definidas do firebird para instruções de insert, a cláusula "returning" não está disponível em ESQL (Embedded SQL, ou melhor instruções SQL escritas através de uma linguagem de programação), que é o seu caso.
Como solução, você terá que criar uma PSQL, ou uma procedure com um parâmetro de saída.
GOSTEI 0
POSTAR