Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Vagabondis

Store Procedure, loop que processa vetor de dados!

Recommended Posts

Galera,

 

Estou sem saber como fazer na Store Procedure um loop que processaria um vetor de informações passado via atributo?

 

É como se fosse um for each do ASP, mas queria fazer em SQL no caso e não tou sabendo ainda como fazer. Vou montar um exemplo de tabelas e como seria no ASP:

 

Imagem Postada

Acho que essas tabelas acima estão bem simples e exemplificam o que eu preciso fazer em SQL. Eu poderia fazer um for each em asp que executaria várias vezes uma Store Procedure, mas o que eu ostria é o inverso: uma SP que receba o vetor com os dados e ela execute um loop processando esses dados.

 

No ASP (perdoem-me os erros, não tive tempo de rever se cometi algum erro):

 

for each valor in vetor_produtos

con.execute("call sp_movimento_itens "&id_movimento&","&valor&"")

next

 

O que eu quero:

 

con.execute("call sp_movimento_itens "&id_movimento&","&vetor_produtos&"")

 

Como eu vou processar este vetor_produtos lá na minha sp_movimento_itens? Ficou claro a minha dúvida? http://forum.imasters.com.br/public/style_emoticons/default/natal_w00t.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valews pela atenção, mas aquele artigo não serve não. Ele trata muito mais de cursores que são usados em selects e lá mesmo ele fala que consome muito recurso.

 

Eu preciso pegar um vetor de dados que é passado como atributo de uma Store Procedure e processar cada valor dele executando um determinado comando SQL. Não sei como processar cada valor de um ARRAY no SQL. Estou pesquisando sobre e torcendo para alguém me dê uma dica!

 

http://forum.imasters.com.br/public/style_emoticons/default/natal_tongue.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim ele trata de cursores e da 3 alternativas para evitar seu uso...

 

naum entendi o que precisa, se você puder coloca parte do código ai pra ver se conseguimos ajuda-lo...

 

de qualquer forma, boa sorte

http://forum.imasters.com.br/public/style_emoticons/default/natal_wink.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu estou terminando a Store Procedure que eu falei anteriormente, vou postá-la aqui a fim de ajudar alguém:

 

Primeira Procedure:

 

CREATE procedure sp_movimento_entrada

@login_id integer,

@movimento_tipo_id integer,

@responsavel_id integer,

@setor_id integer,

@ret integer,

@num_nf varchar(10),

@maq_des_pat varchar(5),

@movimento_itens varchar(255)

as

begin

declare @dat datetime

declare @novo_id integer

declare @pos_item integer

declare @pos_valor integer

declare @produto_id integer

declare @qtde integer

declare @num_pat varchar(5)

declare @lista_itens varchar(255)

declare @item varchar(60)

declare @valor varchar(10)

--Pega a data atual

set @dat=getdate()

--Salva o Movimento, tabela tb_movimento

insert into tb_movimento

(login_id,movimento_tipo_id,responsavel_id,setor_id,num_nf,maq_des_pat,dat)

values

(@login_id,@movimento_tipo_id,@responsavel_id,@setor_id,@num_nf,@maq_des_pat,@da

t)

--Pega a PK do movimento que acabou de ser salvo

set @novo_id=@@identity

--Processamento do vetor de dados dos Ítens de Movimento. Cada ìtem é separado por ';' e seus valores são separados por ','

if @movimento_itens<>''

begin

set @lista_itens=ltrim(rtrim(@movimento_itens))+';'

--Atualizando a posição do primeiro separador dos ítens do movimento

set @pos_item=charindex(';',@movimento_itens,1)

while @pos_item>0

begin

--Processando o primeiro valor do ítem

set @item=left(@lista_itens,@pos_item-1)+','

set @pos_valor=charindex(',',@item,1)

set @produto_id=left(@item,@pos_valor-1)

--Processando o segundo valor do ítem

set @item=right(@item,len(@item)-@pos_item)

set @pos_valor=charindex(',',@item,1)

set @qtde=left(@item,@pos_valor-1)

--Processando o terceiro valor do ítem

set @item=right(@item,len(@item)-@pos_item)

set @pos_valor=charindex(',',@item,1)

set @num_pat=left(@item,@pos_valor-1)

--Atualizando a quantidade do produto

execute @ret=atualiza_qtde_produto @produto_id,1,@qtde

if @ret=0

begin

--Salvando o ítem do movimento

insert into tb_movimento_itens

(movimento_id,produto_id,qtde,num_pat)

values

(@novo_id,@produto_id,@qtde,''+@num_pat+'')

end

 

--Descartando o item processado da lista geral dos ítens do movimento

set @lista_itens=right(@lista_itens,len(@lista_itens)-@pos_item)

--Atualizando a posição do próximo separador dos ítens do movimento

set @pos_item=charindex(';',@lista_itens,1)

end

end

end

GO

 

Segunda Procedure:

 

CREATE procedure sp_atualiza_qtde_produto

@produto_id integer,

@operacao integer,

@qtde integer,

@ret integer output

as

begin

declare @@qtde integer

if @produto_id>0 and @qtde>0

begin

--Operação de subtrair a quantidade do produto

if @operacao=0

begin

declare rs cursor for

select qtde from produto where produto_id=@produto_id

open rs

fetch next from rs into @@qtde

close rs

deallocate rs

 

if @qtde<=@@qtde

begin

update produto set qtde=qtde-@qtde where produto_id=@produto_id

return(0)

end

else

begin

return(1)

end

end

--Operação de somar a quantidade do produto

else if @operacao=1

begin

update produto set qtde=qtde+@qtde where produto_id=@produto_id

return(0)

end

end

end

GO

 

Só para exemplificar, eu estou passando um vetor de dados (como falei várias vezes no post anterior) com a seguinte estrutura:

 

item_valor_1,item_valor_2,item_valor_3;...;item_valor_n,item_valor_n,item_valor_

n

 

O atributo @movimento_itens é o meu vetor de dados que contén os ítens do movimento. Nele o ';' separa cata item do movimento e a ',' separa o valor de cada propriedade do ítem, no meu caso elas são código do produto (@produto_id), quantidade (@qtde) e o número do patrimônio (@num_pat). Utilizando um loop while e a lógica de guardar a posição do ';', da ',' e utilizando as funções left e right eu vou processando cada item no meu vetor de dados da esquerda para a direita e descartando o que foi processado dele.

 

A segunda procedure faz a atualização da quantidade do produto, retornando se foi concluída com sucesso ou não para a primeira procedure que a chamou.

 

Valews!

:natalhappy:

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.