Como dar um update pegando o resultado de um select(execute block)

SQL

Firebird

09/06/2015

Pense no seguinte caso : tenho um cadastro de produto
Tabela :PRODUTO
Campos: SECCOD, GRPCOD, SGRCOD, PRONCM

e

Tabela SUBGRUPO
Campos: SECCOD, GRPCOD, SGRCOD, SGRNCM.

preciso que o comando pegue o valor do SGRNCM da tabela SUBGRUPO e atualize o PRONCM da tabela PRODUTO
Quando o SECCOD,GRPCOD, SGRCOD forem os mesmo da tabela produto.

Nisso ele alteraria todos os produtos com o ncm do campo SGRNCM... como faço?

Dei um select que foi:
select i.sgrncm,p.proncm from produto as p left join subgrupo as i on (p.seccod = i.seccod) and (p.grpcod = i.grpcod) and(p.sgrcod = i.sgrcod)

porém como faço para ele fazer o PRONCM assumir o SGRNCM?
Bruno Zanca

Bruno Zanca

Curtidas 0

Respostas

Marisiana Battistella

Marisiana Battistella

09/06/2015

Você terá que fazer isso em um procedimento e utilizar variáveis... FOR SELECT ... INTO ... DO
GOSTEI 0
Wilson Vieira

Wilson Vieira

09/06/2015

Boa tarde Bruno

O comando ficaria assim

update produto p set p.proncm = (select s.sgrncm from subgrupo s where s.seccod = p.seccod)
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

09/06/2015

Bruno, conseguistes evoluir?
GOSTEI 0
Bruno Zanca

Bruno Zanca

09/06/2015

EXECUTE BLOCK
RETURNS (sec1 char(2), grp1 char(3),sgr1 char(3), prncm1 VARCHAR(20),sgrcm2 VARCHAR(20),sec2 char(2), grp2 char(3),sgr2 char(3))
AS
BEGIN
FOR SELECT p.seccod, p.grpcod, p.sgrcod, p.proncm, i.sgrncm , i.seccod, i.grpcod, i.sgrcod FROM produto p left join subgrupo i on p.seccod = i.seccod into :sec1, :grp1, :sgr1, :prncm1, :sgrcm2 , :sec2, :grp2, :sgr2

DO
begin
update produto p set p.proncm = :sgrcm2 where ((:sec1 = :sec2) and (:grp1 = :grp2) and (:sgr1 = :sgr2)) ;
SUSPEND;
end
END


Tentei assim nao deu certo, ele nao trocou o ncm dos produtos de acordo com o ncm do subgrupo....usando essas condiçoes secao grupo e subgrupo iguais para pegar sgrncm
GOSTEI 0
Bruno Zanca

Bruno Zanca

09/06/2015

EXECUTE BLOCK
RETURNS (sec1 char(2), grp1 char(3),sgr1 char(3), prncm1 VARCHAR(20),sgrcm2 VARCHAR(20),sec2 char(2), grp2 char(3),sgr2 char(3))
AS
BEGIN
FOR SELECT p.seccod, p.grpcod, p.sgrcod, p.proncm, i.sgrncm , i.seccod, i.grpcod, i.sgrcod FROM produto p left join subgrupo i on p.seccod = i.seccod into :sec1, :grp1, :sgr1, :prncm1, :sgrcm2 , :sec2, :grp2, :sgr2

DO
begin
update produto p set p.proncm = :sgrcm2 where ((:sec1 = :sec2) and (:grp1 = :grp2) and (:sgr1 = :sgr2)) ;
SUSPEND;
end
END


Tentei assim nao deu certo, ele nao trocou o ncm dos produtos de acordo com o ncm do subgrupo....usando essas condiçoes secao grupo e subgrupo iguais para pegar sgrncm
GOSTEI 0
Bruno Zanca

Bruno Zanca

09/06/2015

EXECUTE BLOCK
RETURNS (sec1 char(2), grp1 char(3),sgr1 char(3), prncm1 VARCHAR(20),sgrcm2 VARCHAR(20),sec2 char(2), grp2 char(3),sgr2 char(3))
AS
BEGIN
FOR SELECT p.seccod, p.grpcod, p.sgrcod, p.proncm, i.sgrncm , i.seccod, i.grpcod, i.sgrcod FROM produto p left join subgrupo i on p.seccod = i.seccod into :sec1, :grp1, :sgr1, :prncm1, :sgrcm2 , :sec2, :grp2, :sgr2

DO
begin
update produto p set p.proncm = :sgrcm2 where ((:sec1 = :sec2) and (:grp1 = :grp2) and (:sgr1 = :sgr2)) ;
SUSPEND;
end
END


Tentei assim nao deu certo, ele nao trocou o ncm dos produtos de acordo com o ncm do subgrupo....usando essas condiçoes secao grupo e subgrupo iguais para pegar sgrncm
GOSTEI 0
POSTAR