Mudar statu de um Produto via StoredProcedure

Firebird

15/10/2003

Na procedure que estou querendo criar eu preciso mudar o campo status de um produto(Tabela), tipo ´Não vencido´ para ´Vencido´. Na tabela produto existe um campo status do produto e tenho de verificar se esse produto já passou de 6 meses e se o status está ´Não vencido´ eu mudo para vencido. Como faço esse StoredProcedure de update?


Naonob

Naonob

Curtidas 0

Respostas

Afarias

Afarias

15/10/2003

Não sei se entendi bem (ficou meio enrrolado em q tabela está o q -- vou entender q é uma tabela só de produto?!?!) -- acho q seria algo como::


create procedure verifica_validade as
begin
update produtos ser status = ´vencido´
where (current_date - data_cadastro) > 180;
// 180dias = 6meses * 30dias
end^


se vc não quizer usar algo aproximado como 180 ou 183 para os 6 meses ... vc pode fazer contas mais apuradas ou usar uma UDF


T+


GOSTEI 0
Naonob

Naonob

15/10/2003

Obrigado por tirar a duvida afarias.
Bem para tirar a duvida era assim, tenho uma tabela serviço, itens_servico e produto. Tenho que mudar o status(campo) do produto que tenho de verificar sempre a data da emissao do serviço, que seria a data do serviço. E ve se ja passaram 6 meses e se tiver passado 6 meses e o status do produto ainda estiver ´Não vencido´ mudar para ´vencido´. Com sua ajuda tenho de acrescentar um codição, certo!
Obrigado!


GOSTEI 0
Afarias

Afarias

15/10/2003

hum?! vc fez uma pergunta?? não entendi... :?


T+


GOSTEI 0
Naonob

Naonob

15/10/2003

Bem não sou muito bom em fazer perguntas.
Caro afarias gostaria de pedir de novo a pergunta melhor.
Servico(Num_Servico,Dt_Emissao,TotalPreco)
Itens_Servico(Num_servico,Cod_Produto,Qtd,SubTotal)
Produto(Cod_Produto,Desc_Produto,Status,Pr_unit)
Tenho essas 3 tabelas relacionadas e quero fazer uma procedure que busca todos os serviços realizados(Dt_Emissao) que já passaram 6 meses da data de hoje e depois varrer mudando os status desses produtos que estão ´Não vencido´ para ´Vencido´. Como faço isso afarias? Ou Amigos do forum...

T+


GOSTEI 0
Afarias

Afarias

15/10/2003

uma forma é a seguinte::

create procedure verifica_validade as
declare variable cod_pro integer;
declare variable max_dt date;
begin
for select i.cod_produto, max(s.dt_emissao) from servico s
inner join itens_servico i on (i.num_servico = s.num_servico)
group by i.cod_produto having current_date - max(s.dt_emissao) > 180
into :cod_pro, :max_dt do
update produto set status = ´vencido´ where cod_produto = :cod_pro;
end^


existem algumas outras formas de fazer, inclusive com 1 update apenas (sem precisar do SP) ... mas ai vc vai vendo...


T+


GOSTEI 0
Naonob

Naonob

15/10/2003

Obrigado afarias pelas dicas que estão quebrando um galhão. Eu fiz um teste usando o select e buscava como eu quero. Ai quando resolvi inserir a procedure no banco deu certo. A procedure foi criada mas na hora de executar não deu certo. Fala que ´Arithmetic overflow or division by zero has occurred. arithmetic exception, numeric overflow, or string truncation.´ Engraçado que no editor normal sem update a consulta traz, mas na procedure que ele teria de trazer as dados e mudar o estado do campo, da erro...Por favor se vc saber o que é isso.
Ah...Obrigado pela ajuda com especialização que deu certo, e desculpe por ser meio leigo nisso...


GOSTEI 0
Afarias

Afarias

15/10/2003

este erro é fogo!! ele pode ocorrer por diversos problemas, a citar::

1 - o character set definido na conexão ´não bate´ com o definido no banco de dados (ou em algum campo q vc está acessando)

2 - vc quer jogar (ou tem) um valor string com caracteres não aceitos pelo character set do seu banco (alguns char sets não aceitam acentos por exemplo)

3 - alguma operação (´matemática´) foi ilegal -- como divisão por zero!! ou o resultado da operação está fora do permitido para aquele tipo de dados.


dê uma olhada com cuidado q vc acha o erro -- veja se não pode ser alguma data_venc. nula por ex. dê também uma verificada nas operações q está fazendo para não haver possibilidade de divisões por zero ou resultados incompatíveis com o tipo de dados.


T+


GOSTEI 0
Naonob

Naonob

15/10/2003

afarias com mais calma e sua observação descobri e resolvi o meu problema. Obrigado pela sua mãozinha. Seus conhecimentos me ajudaram muito...

T+


GOSTEI 0
POSTAR