[firebase-br] Procedure não atualiza

Rlinus rmsrlinus em gmail.com
Qui Ago 19 10:45:36 -03 2010


  Olá a todos,
Eu tinha uma procedure na minha tabela de pedido, essa procedure era só 
para o metodo insert, porém eu pensei, se tiver a necessidade de alterar 
um pedido essa procedure não vai servir.. pq ela vai adicionar um novo 
em vez de atualiza-lo..

Sendo assim criei uma procedure de insert/update, só que na minha 
procedure eu preciso do retorno da chave primaria... acho que do jeito 
que fiz está certo vou postar o código...

só que neste caso eu não sei como trata-la no delphi... vou postar o 
código de como estava tratando a outra procedure de insert...

Ajudem ai pessoal...

Código da procedure de insert/update:

SET TERM ^ ;

CREATE OR ALTER PROCEDURE PEDIDO_IU (
     ped_cod integer,
     func_cod integer,
     ped_data date,
     ped_total numeric(15,2),
     forn_cod integer)
returns (
     pedcod integer)
as
begin
   if (exists(select ped_cod from pedido where (ped_cod = :ped_cod))) then
     update pedido
     set func_cod = :func_cod,
         ped_data = :ped_data,
         ped_total = :ped_total,
         forn_cod = :forn_cod
     where (ped_cod = :ped_cod);
   else
     insert into pedido (
         ped_cod,
         func_cod,
         ped_data,
         ped_total,
         forn_cod)
     values (
         NEXT VALUE FOR SEQ_PEDIDO_ID,
         :func_cod,
         :ped_data,
         :ped_total,
         :forn_cod)
         RETURNING PED_COD INTO :PEDCOD;
end^

SET TERM ; ^

GRANT SELECT,INSERT,UPDATE ON PEDIDO TO PROCEDURE PEDIDO_IU;

GRANT EXECUTE ON PROCEDURE PEDIDO_IU TO SYSDBA;


codigo de como é tratado no delphi:

procedure TDMPrincipal.InsertPedido;
var
   idPed: Integer;
begin
   // verifica se escolheu produtos
   if cdsPedidoItem.IsEmpty then
   raise Exception.Create('É necessário escolher os produtos!');


     idPed:= 0;
     Start;
   // Adiciona o pedido
   try
     with spPedido do
     begin
       Params[0].AsInteger:= cdsPedidoFUNC_COD.AsInteger;
       Params[1].AsDate:= cdsPedidoPED_DATA.AsDateTime;
       Params[2].AsBCD:= cdsPedidoPED_TOTAL.AsCurrency;
       Params[3].AsInteger:= cdsPedidoFORN_COD.AsInteger;
       ExecProc;
       Commit;
       idPed:= Params[4].AsInteger;
     end;
   Except
     Rollback;
   end;

   // Adiciona os items
   try
     Start;
     cdsPedidoItem.First;
     while not cdsPedidoItem.Eof do
     begin
       with spPedidoItem do
       begin
         Params[0].AsInteger:= idPed;
         Params[1].AsInteger:= cdsPedidoItemPROD_COD.AsInteger;
         Params[2].AsInteger:= cdsPedidoItemQUANTIDADE.AsInteger;
         Params[3].AsBCD:= cdsPedidoItemVALOR.AsCurrency;
         ExecProc;
       end;
       cdsPedidoItem.Next;
     end;
     Commit;
   Except
     DeletePedido(idPed);
     Rollback;
   end;
end;



Mais detalhes sobre a lista de discussão lista