Fórum Store procedure #374379

31/08/2009

0

Pessoal boas... estou com o seguinte problema... no meu form de digitacao de pedidos disparo a sp abaixo para gerar o numero do pedido, isso e feito no momento da gravacao, porem se dois computadores gravarem os seus respectivos pedidos ao mesmo tempo me retorna um erro ( dizendo que esta retornando mais de uma linha quando deveria retornar apenas uma ), gostaria de auxilio para solucionar tal problema... agradeco desde ja

segue a sp

begin
if (exists(select data, sequencia from ped_sequencia where (data = :mdata))) then
begin
select sequencia from ped_sequencia where (data = :mdata) into msequencia;
i = gen_id(sequencia_pedido, -1*gen_id(sequencia_pedido,0));
i = gen_id(sequencia_pedido,msequencia);

update ped_sequencia
set sequencia = gen_id(sequencia_pedido,1)
where (data = :mdata);
end
else
begin
i = gen_id(sequencia_pedido, -1*gen_id(sequencia_pedido,0));
insert into ped_sequencia (
data,
sequencia)
values (
:Mdata,
gen_id(sequencia_pedido,1));
end
Select sequencia from ped_sequencia where (data = :mdata) into msequencia_out;
end


Ricardo54351060

Ricardo54351060

Responder

Posts

01/09/2009

Emerson Nascimento

você está fazendo o controle de numeração dos pedidos por data ????


explique melhor para que serve esta stored procedure, como você dá o número para o pedido através do programa, etc.

essa SP é disparada na gravação? pq você precisa comparar a data?

não seria somente pegar o resultado do generator (com a funcção gen_id)?


Responder

Gostei + 0

01/09/2009

Ricardo54351060

a sp serve para o seguinte, no sistema que trabalho diariamente a numeracao de pedido volta para 0 ou seja,
quando vou gravar o pedido se for o primeiro pedido do dia a sp abre a tabela que tem apenas a data e o numero do pedido como campo e grava a data do dia e o numero do pedido, se ja tiver pedido no dia a sp apenas incrementa 1 no total de pedidos do dia sendo assim a numeracao dos meus pedidos fica

ped - data
1 01/09/2009
2 01/09/2009
1 31/08/2009
2 31/08/2009
3 31/08/2009

ou seja todo dia eu tenho pedido numero 1, porem qdo disparo a sp de 2 terminais sai para o erro


Responder

Gostei + 0

01/09/2009

Emerson Nascimento

pra que serve a tabela ped_sequencia? é a própria tabela de pedidos?

pelo que você está mostrando essa SP é executada após a gravação, certo?

quais parâmetros são passados para a SP?

porque não usar um TRIGGER?


Responder

Gostei + 0

01/09/2009

Emerson Nascimento

pelo que eu pude entender, uando o pedido é gravado ele recebe um valor no campo sequencia, certo? de onde é obtido esse valor?


Responder

Gostei + 0

01/09/2009

Ricardo54351060

Funciona assim:

eh feito a digitacao do pedido ( em memoria )
ao apertar o botao para gravar é disparado a sp e esta faz o seguinte:
pesquisa uma tabela chamada ped_sequencia nesta tabela eu tenho um campo data e outro pedido, se a sp encontrar a data no qual esta sendo feito o pedido ela incrementa 1 no campo pedido e retona este valor para o delphi poder incluir como NUMERO DO PEDIDO e gravar a capa e o item do pedido ou seja
antes do pedido ser gravado ele recebe um valor devolvido pela sp que é o numero do pedido que vem da tabela ped_sequencia


Responder

Gostei + 0

01/09/2009

Emerson Nascimento

agora ficou claro.

veja essas duas formas:

sem generator:
begin
  if (not exists(select data from ped_sequencia where (data = :mdata))) then
    insert into ped_sequencia (data, sequencia)
    values (:Mdata, 0);

  select (sequencia+1) from ped_sequencia
  where (data = :mdata) into :msequencia_out;

  update ped_sequencia set sequencia = :msequencia_out
  where (data = :mdata);
end


com generator:
begin
  if (not exists(select data from ped_sequencia where (data = :mdata))) then
  begin
    insert into ped_sequencia (data, sequencia)
    values (:Mdata, 1);

    execute statement ´set generator sequencia_pedido to 0´;
  end

  msequencia_out = gen_id(sequencia_pedido, 1);

  -- no caso de optar pelo uso de generator (que é mais seguro)
  -- o update abaixo é totalmente desnecessário
  update ped_sequencia
  set sequencia = :msequencia_out
  where (data = :mdata);
end



Responder

Gostei + 0

01/09/2009

Ricardo54351060

ok.. obrigado amigo.. vou testar e posto aqui o resultado


Responder

Gostei + 0

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

Aceitar