[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