Fórum clausula Returning Firebird #393126

29/12/2010

0

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

Responder

Posts

29/12/2010

Ricardo Araujo

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


Responder

Gostei + 0

29/12/2010

Ale.sjrp

nao ajuda, realmente preciso pegar o resultado na IbQuery
Responder

Gostei + 0

29/12/2010

João Sobrinho

Colega, tente assim:   IbQuery.Open;  
Responder

Gostei + 0

30/12/2010

Ricardo Araujo

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
Responder

Gostei + 0

03/01/2011

Ale.sjrp

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).
Responder

Gostei + 0

04/05/2011

Julio Develis

  O IBQuery não fornece suporte para essa funcionalidade. Use o Zeos que funciona;
Responder

Gostei + 0

08/09/2011

Filipe Sousa


  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.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar