Fórum Execute Statement.... #49082
31/01/2005
0
Mensagem de erro quando executo a prodedure:
Unsucessful execution caused by an unavaible resource.
Variable type (position 0) in EXECUTE STATEMENT ´select cod_produto,descricao, emb1_lig_cod_unidade, ´ INTO does not match return
Ai vai ela:
CREATE PROCEDURE REL_EXTRATO_PRODUTO (
PEMPRESA BIGINT,
PFILIAL BIGINT,
PCLASSE_NIVEL1 BIGINT,
PCLASSE_NIVEL2 BIGINT,
PCLASSE_NIVEL3 BIGINT,
PCLASSE_NIVEL4 BIGINT,
PPRODUTO_INICIAL BIGINT,
PPRODUTO_FINAL BIGINT,
PDATA_INICIAL DATE,
PDATA_FINAL DATE,
PTIPO_DOCUMENTO VARCHAR(25),
PORDEM_DE_SAIDA VARCHAR(20))
RETURNS (
IEMPRESA BIGINT,
IFILIAL BIGINT,
IPRODUTO BIGINT,
VRAZAOSOCIALEMPRESA VARCHAR(40),
VDESCRICAOPRODUTO VARCHAR(35),
VSERIEITENS VARCHAR(4),
VDESCRICAOEMBALAGEM VARCHAR(20),
VMESANOREFERENCIA VARCHAR(30),
DDATAMOVIMENTOITENS DATE,
IFORNECITENS BIGINT,
INUMNFITENS BIGINT,
IEMBALAGEMITENS BIGINT,
ICODOPERACAOITENS BIGINT,
NQTDEITENS FLOAT,
NCUSTOMEDIOITENS FLOAT,
NESTOQINICIALITENS FLOAT,
NESTOQINICIALESTOQ FLOAT,
NESTOQATUALESTOQ FLOAT,
NVLRESTOQINICIALESTOQPORITEM FLOAT,
NVLRESTOQINICIALESTOQTOTAL FLOAT,
NVLRESTOQATUALESTOQTOTAL FLOAT,
NCUSTOMEDIOESTOQ FLOAT,
IEMBUTILIZADA INTEGER,
NQTDEEMBUTILIZADA FLOAT)
AS
DECLARE VARIABLE IEMB1 BIGINT;
DECLARE VARIABLE NQTDEEMB1 FLOAT;
DECLARE VARIABLE IEMB2 BIGINT;
DECLARE VARIABLE NQTDEEMB2 FLOAT;
DECLARE VARIABLE IEMB3 BIGINT;
DECLARE VARIABLE NQTDEEMB3 FLOAT;
DECLARE VARIABLE IEMB4 BIGINT;
DECLARE VARIABLE NQTDEEMB4 FLOAT;
DECLARE VARIABLE NQTDESAIDAESTOQUE FLOAT;
DECLARE VARIABLE VMESREFERENCIA VARCHAR(30);
DECLARE VARIABLE XSQL VARCHAR(700);
DECLARE VARIABLE BCLASSE1 BIGINT;
DECLARE VARIABLE BCLASSE2 BIGINT;
DECLARE VARIABLE BCLASSE3 BIGINT;
DECLARE VARIABLE BCLASSE4 BIGINT;
BEGIN
BCLASSE1 =0;
Bclasse2 =0;
Bclasse3 =0;
Bclasse4 =0;
iProduto =0 ;
vdescricaoproduto=´´;
iemb1 =0 ;
nqtdeemb1 =0 ;
iemb2 =0 ;
nqtdeemb2 =0 ;
iemb3 =0 ;
nqtdeemb3 =0 ;
iemb4 =0 ;
nqtdeemb4 =0 ;
XSQL=´SELECT cod_produto,descricao,emb1_lig_cod_unidade,emb1_quantidade,
emb2_lig_cod_unidade,emb2_quantidade,emb3_lig_cod_unidade,emb3_quantidade,
emb4_lig_cod_unidade,emb4_quantidade FROM produto WHERE LIG_COD_EMPRESA = ´;
XSQL= XSQL || :Pempresa || ´ AND LIG_COD_FILIAL = ´ || :pfilial ;
if (PCLASSE_NIVEL1 > 0) then
XSQL = XSQL || ´ AND emb1_lig_cod_unidade = ´ || :pclasse_nivel1 ;
if (PCLASSE_NIVEL2 > 0) then
XSQL = XSQL || ´ and emb2_lig_cod_unidade = ´ || :pclasse_nivel2 ;
if (PCLASSE_NIVEL3 > 0) then
XSQL = XSQL || ´ and emb3_lig_cod_unidade = ´ || :pclasse_nivel3 ;
if (PCLASSE_NIVEL4 > 0) then
XSQL = XSQL || ´ and emb4_lig_cod_unidade = ´ || :pclasse_nivel4 ;
if (PPRODUTO_INICIAL > 0) then
XSQL = XSQL || ´ and cod_produto BETWEEN ´ || :pproduto_inicial ||
´ AND ´ || :pproduto_final ;
execute statement XSQL
INTO :iProduto,:vdescricaoproduto,:iemb1,:nqtdeemb1,:iemb2,
:nqtdeemb2,:iemb3,:nqtdeemb3,:iemb4,:nqtdeemb4 ;
BEGIN
IEMPRESA = 0;
IFILIAL = 0;
VRAZAOSOCIALEMPRESA = ´´;
VSERIEITENS = ´´;
VDESCRICAOEMBALAGEM = ´´;
VMESANOREFERENCIA = ´´;
DDATAMOVIMENTOITENS = null;
IFORNECITENS = 0;
INUMNFITENS = 0;
IEMBALAGEMITENS = 0;
ICODOPERACAOITENS = 0;
NQTDEITENS = 0;
NCUSTOMEDIOITENS = 0;
NESTOQINICIALITENS = 0;
NESTOQINICIALESTOQ = 0;
NESTOQATUALESTOQ = 0;
NVLRESTOQINICIALESTOQPORITEM = 0;
NVLRESTOQINICIALESTOQTOTAL = 0;
NVLRESTOQATUALESTOQTOTAL = 0;
NCUSTOMEDIOESTOQ = 0;
IEMBUTILIZADA = 0;
NQTDEEMBUTILIZADA = 0;
SELECT estoq.estoque_inicial, estoq.valor_estoque_inicial,estoq.custo_medio,
estoq.estoque_atual
FROM produto_quantidade estoq
WHERE (estoq.lig_cod_empresa = :pempresa AND
estoq.lig_cod_filial = :pfilial AND
estoq.lig_cod_produto = :iproduto)
INTO :nestoqinicialESTOQ,:nvlrestoqinicialESTOQporitem,ncustomedioESTOQ,nestoqatualESTOQ ;
IF (nestoqinicialESTOQ IS NULL) THEN
nestoqinicialESTOQ = 0;
IF (nvlrestoqinicialESTOQporitem IS NULL) THEN
nvlrestoqinicialESTOQporitem = 0;
IF (ncustomedioESTOQ IS NULL) THEN
ncustomedioESTOQ = 0;
IF (nestoqatualESTOQ IS NULL) THEN
nestoqatualESTOQ = 0;
FOR
SELECT itensnf.data_movimentacao,itensnf.lig_cod_clifornec,itensnf.lig_num_nf,
itensnf.serie,itensnf.lig_cod_operacao,
itensnf.lig_cod_unidade_medida,itensnf.quantidade,itensnf.valor_custo_medio
FROM nota_fiscal_itens itensnf
WHERE (itensnf.lig_cod_empresa = :pempresa AND
itensnf.lig_cod_filial = :pfilial AND
itensnf.lig_cod_produto = :iproduto AND
itensnf.data_movimentacao BETWEEN :pdata_inicial AND :pdata_final)
INTO:ddatamovimentoITENS,ifornecITENS,inumnfITENS,vserieITENS,icodoperacaoITENS,
iembalagemITENS,nqtdeITENS,ncustomedioITENS
DO
BEGIN
select descricao
from unidade_medida unm
where unm.codigo = :iembalagemITENS
into :vdescricaoembalagem ;
If (IembalagemITENS = 1) then
BEGIN
IEMBUTILIZADA = nqtdeemb1;
NQTDEEMBUTILIZADA = nqtdeITENS;
NQTDESAIDAESTOQUE = nqtdeemb1 * nqtdeITENS;
END
else
If (IembalagemITENS = 2) then
BEGIN
IEMBUTILIZADA = nqtdeemb2;
NQTDEEMBUTILIZADA = nqtdeITENS;
NQTDESAIDAESTOQUE = nqtdeemb2 * nqtdeITENS;
END
else
If (IembalagemITENS = 3) then
BEGIN
IEMBUTILIZADA = nqtdeemb3;
NQTDEEMBUTILIZADA = nqtdeITENS;
NQTDESAIDAESTOQUE = nqtdeemb3 * nqtdeITENS;
END
else
If (IembalagemITENS = 4) then
BEGIN
IEMBUTILIZADA = nqtdeemb4;
NQTDEEMBUTILIZADA = nqtdeITENS;
NQTDESAIDAESTOQUE = nqtdeemb4 * nqtdeITENS;
END
END
select razao_social
from empresas
where
cod_empresa = :Pempresa and
cod_filial = :Pfilial
into :VRAZAOSOCIALEMPRESA;
Iempresa=:pempresa;
Ifilial =:pfilial;
/******************* MES DE REFERÊNCIA **********************/
IF (Extract(month from PDATA_INICIAL ) = 1) then
Vmesreferencia = ´JANEIRO´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 2) then
Vmesreferencia = ´FEVEREIRO´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 3) then
Vmesreferencia = ´MARÇO´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 4) then
Vmesreferencia = ´ABRIL´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 5) then
Vmesreferencia = ´MAIO´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 6) then
Vmesreferencia = ´JUNHO´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 7) then
Vmesreferencia = ´JULHO´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 8) then
Vmesreferencia = ´AGOSTO´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 9) then
Vmesreferencia = ´SETEMBRO´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 10) then
Vmesreferencia = ´OUTUBRO´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 11) then
Vmesreferencia = ´NOVEMBRO´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 12) then
Vmesreferencia = ´DEZEMBRO´ ;
Vmesanoreferencia = vmesreferencia || ´/´ || Extract(year from PDATA_INICIAL );
nvlrestoqinicialESTOQtotal = (nestoqinicialESTOQ * nvlrestoqinicialESTOQporitem );
nvlrestoqatualESTOQtotal = (ncustomedioESTOQ * nestoqatualESTOQ);
SUSPEND;
END
END
Quem tiver alguma dica agradeço de antemão...., já troquei os parametros de entrada de INTEGER para BIGINT, já fiz vários testes e nao encontrei.....
Rogério
Unsucessful execution caused by an unavaible resource.
Variable type (position 0) in EXECUTE STATEMENT ´select cod_produto,descricao, emb1_lig_cod_unidade, ´ INTO does not match return
Ai vai ela:
CREATE PROCEDURE REL_EXTRATO_PRODUTO (
PEMPRESA BIGINT,
PFILIAL BIGINT,
PCLASSE_NIVEL1 BIGINT,
PCLASSE_NIVEL2 BIGINT,
PCLASSE_NIVEL3 BIGINT,
PCLASSE_NIVEL4 BIGINT,
PPRODUTO_INICIAL BIGINT,
PPRODUTO_FINAL BIGINT,
PDATA_INICIAL DATE,
PDATA_FINAL DATE,
PTIPO_DOCUMENTO VARCHAR(25),
PORDEM_DE_SAIDA VARCHAR(20))
RETURNS (
IEMPRESA BIGINT,
IFILIAL BIGINT,
IPRODUTO BIGINT,
VRAZAOSOCIALEMPRESA VARCHAR(40),
VDESCRICAOPRODUTO VARCHAR(35),
VSERIEITENS VARCHAR(4),
VDESCRICAOEMBALAGEM VARCHAR(20),
VMESANOREFERENCIA VARCHAR(30),
DDATAMOVIMENTOITENS DATE,
IFORNECITENS BIGINT,
INUMNFITENS BIGINT,
IEMBALAGEMITENS BIGINT,
ICODOPERACAOITENS BIGINT,
NQTDEITENS FLOAT,
NCUSTOMEDIOITENS FLOAT,
NESTOQINICIALITENS FLOAT,
NESTOQINICIALESTOQ FLOAT,
NESTOQATUALESTOQ FLOAT,
NVLRESTOQINICIALESTOQPORITEM FLOAT,
NVLRESTOQINICIALESTOQTOTAL FLOAT,
NVLRESTOQATUALESTOQTOTAL FLOAT,
NCUSTOMEDIOESTOQ FLOAT,
IEMBUTILIZADA INTEGER,
NQTDEEMBUTILIZADA FLOAT)
AS
DECLARE VARIABLE IEMB1 BIGINT;
DECLARE VARIABLE NQTDEEMB1 FLOAT;
DECLARE VARIABLE IEMB2 BIGINT;
DECLARE VARIABLE NQTDEEMB2 FLOAT;
DECLARE VARIABLE IEMB3 BIGINT;
DECLARE VARIABLE NQTDEEMB3 FLOAT;
DECLARE VARIABLE IEMB4 BIGINT;
DECLARE VARIABLE NQTDEEMB4 FLOAT;
DECLARE VARIABLE NQTDESAIDAESTOQUE FLOAT;
DECLARE VARIABLE VMESREFERENCIA VARCHAR(30);
DECLARE VARIABLE XSQL VARCHAR(700);
DECLARE VARIABLE BCLASSE1 BIGINT;
DECLARE VARIABLE BCLASSE2 BIGINT;
DECLARE VARIABLE BCLASSE3 BIGINT;
DECLARE VARIABLE BCLASSE4 BIGINT;
BEGIN
BCLASSE1 =0;
Bclasse2 =0;
Bclasse3 =0;
Bclasse4 =0;
iProduto =0 ;
vdescricaoproduto=´´;
iemb1 =0 ;
nqtdeemb1 =0 ;
iemb2 =0 ;
nqtdeemb2 =0 ;
iemb3 =0 ;
nqtdeemb3 =0 ;
iemb4 =0 ;
nqtdeemb4 =0 ;
XSQL=´SELECT cod_produto,descricao,emb1_lig_cod_unidade,emb1_quantidade,
emb2_lig_cod_unidade,emb2_quantidade,emb3_lig_cod_unidade,emb3_quantidade,
emb4_lig_cod_unidade,emb4_quantidade FROM produto WHERE LIG_COD_EMPRESA = ´;
XSQL= XSQL || :Pempresa || ´ AND LIG_COD_FILIAL = ´ || :pfilial ;
if (PCLASSE_NIVEL1 > 0) then
XSQL = XSQL || ´ AND emb1_lig_cod_unidade = ´ || :pclasse_nivel1 ;
if (PCLASSE_NIVEL2 > 0) then
XSQL = XSQL || ´ and emb2_lig_cod_unidade = ´ || :pclasse_nivel2 ;
if (PCLASSE_NIVEL3 > 0) then
XSQL = XSQL || ´ and emb3_lig_cod_unidade = ´ || :pclasse_nivel3 ;
if (PCLASSE_NIVEL4 > 0) then
XSQL = XSQL || ´ and emb4_lig_cod_unidade = ´ || :pclasse_nivel4 ;
if (PPRODUTO_INICIAL > 0) then
XSQL = XSQL || ´ and cod_produto BETWEEN ´ || :pproduto_inicial ||
´ AND ´ || :pproduto_final ;
execute statement XSQL
INTO :iProduto,:vdescricaoproduto,:iemb1,:nqtdeemb1,:iemb2,
:nqtdeemb2,:iemb3,:nqtdeemb3,:iemb4,:nqtdeemb4 ;
BEGIN
IEMPRESA = 0;
IFILIAL = 0;
VRAZAOSOCIALEMPRESA = ´´;
VSERIEITENS = ´´;
VDESCRICAOEMBALAGEM = ´´;
VMESANOREFERENCIA = ´´;
DDATAMOVIMENTOITENS = null;
IFORNECITENS = 0;
INUMNFITENS = 0;
IEMBALAGEMITENS = 0;
ICODOPERACAOITENS = 0;
NQTDEITENS = 0;
NCUSTOMEDIOITENS = 0;
NESTOQINICIALITENS = 0;
NESTOQINICIALESTOQ = 0;
NESTOQATUALESTOQ = 0;
NVLRESTOQINICIALESTOQPORITEM = 0;
NVLRESTOQINICIALESTOQTOTAL = 0;
NVLRESTOQATUALESTOQTOTAL = 0;
NCUSTOMEDIOESTOQ = 0;
IEMBUTILIZADA = 0;
NQTDEEMBUTILIZADA = 0;
SELECT estoq.estoque_inicial, estoq.valor_estoque_inicial,estoq.custo_medio,
estoq.estoque_atual
FROM produto_quantidade estoq
WHERE (estoq.lig_cod_empresa = :pempresa AND
estoq.lig_cod_filial = :pfilial AND
estoq.lig_cod_produto = :iproduto)
INTO :nestoqinicialESTOQ,:nvlrestoqinicialESTOQporitem,ncustomedioESTOQ,nestoqatualESTOQ ;
IF (nestoqinicialESTOQ IS NULL) THEN
nestoqinicialESTOQ = 0;
IF (nvlrestoqinicialESTOQporitem IS NULL) THEN
nvlrestoqinicialESTOQporitem = 0;
IF (ncustomedioESTOQ IS NULL) THEN
ncustomedioESTOQ = 0;
IF (nestoqatualESTOQ IS NULL) THEN
nestoqatualESTOQ = 0;
FOR
SELECT itensnf.data_movimentacao,itensnf.lig_cod_clifornec,itensnf.lig_num_nf,
itensnf.serie,itensnf.lig_cod_operacao,
itensnf.lig_cod_unidade_medida,itensnf.quantidade,itensnf.valor_custo_medio
FROM nota_fiscal_itens itensnf
WHERE (itensnf.lig_cod_empresa = :pempresa AND
itensnf.lig_cod_filial = :pfilial AND
itensnf.lig_cod_produto = :iproduto AND
itensnf.data_movimentacao BETWEEN :pdata_inicial AND :pdata_final)
INTO:ddatamovimentoITENS,ifornecITENS,inumnfITENS,vserieITENS,icodoperacaoITENS,
iembalagemITENS,nqtdeITENS,ncustomedioITENS
DO
BEGIN
select descricao
from unidade_medida unm
where unm.codigo = :iembalagemITENS
into :vdescricaoembalagem ;
If (IembalagemITENS = 1) then
BEGIN
IEMBUTILIZADA = nqtdeemb1;
NQTDEEMBUTILIZADA = nqtdeITENS;
NQTDESAIDAESTOQUE = nqtdeemb1 * nqtdeITENS;
END
else
If (IembalagemITENS = 2) then
BEGIN
IEMBUTILIZADA = nqtdeemb2;
NQTDEEMBUTILIZADA = nqtdeITENS;
NQTDESAIDAESTOQUE = nqtdeemb2 * nqtdeITENS;
END
else
If (IembalagemITENS = 3) then
BEGIN
IEMBUTILIZADA = nqtdeemb3;
NQTDEEMBUTILIZADA = nqtdeITENS;
NQTDESAIDAESTOQUE = nqtdeemb3 * nqtdeITENS;
END
else
If (IembalagemITENS = 4) then
BEGIN
IEMBUTILIZADA = nqtdeemb4;
NQTDEEMBUTILIZADA = nqtdeITENS;
NQTDESAIDAESTOQUE = nqtdeemb4 * nqtdeITENS;
END
END
select razao_social
from empresas
where
cod_empresa = :Pempresa and
cod_filial = :Pfilial
into :VRAZAOSOCIALEMPRESA;
Iempresa=:pempresa;
Ifilial =:pfilial;
/******************* MES DE REFERÊNCIA **********************/
IF (Extract(month from PDATA_INICIAL ) = 1) then
Vmesreferencia = ´JANEIRO´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 2) then
Vmesreferencia = ´FEVEREIRO´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 3) then
Vmesreferencia = ´MARÇO´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 4) then
Vmesreferencia = ´ABRIL´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 5) then
Vmesreferencia = ´MAIO´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 6) then
Vmesreferencia = ´JUNHO´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 7) then
Vmesreferencia = ´JULHO´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 8) then
Vmesreferencia = ´AGOSTO´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 9) then
Vmesreferencia = ´SETEMBRO´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 10) then
Vmesreferencia = ´OUTUBRO´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 11) then
Vmesreferencia = ´NOVEMBRO´ ;
ELSE
IF (Extract(month from PDATA_INICIAL ) = 12) then
Vmesreferencia = ´DEZEMBRO´ ;
Vmesanoreferencia = vmesreferencia || ´/´ || Extract(year from PDATA_INICIAL );
nvlrestoqinicialESTOQtotal = (nestoqinicialESTOQ * nvlrestoqinicialESTOQporitem );
nvlrestoqatualESTOQtotal = (ncustomedioESTOQ * nestoqatualESTOQ);
SUSPEND;
END
END
Quem tiver alguma dica agradeço de antemão...., já troquei os parametros de entrada de INTEGER para BIGINT, já fiz vários testes e nao encontrei.....
Rogério
Wrquessada
Curtir tópico
+ 0
Responder
Posts
01/02/2005
Fsflorencio
Olá.
As variáveis de retorno são do mesmo tipo e tamanho dos campos do seu select?
Outra coisa. Tenho o costume de ao concatenar os parâmetros fazer um CAST antes, tipo:
XSQL= XSQL || cast( :Pempresa as varchar(10) ) || ´ AND LIG_COD_FILIAL = ´ || cast( :pfilial as varchar(10) );
já tive problemas com alguns tipos de dados, não sei se com campo inteiro vc teria problemas.
Se mesmo assim o problema permanecer, faça o seguinte:
coloque o parâmetro xsql como parâmetro de retorno, comente o que tiver executando com /**/ (não tire o suspend) para ver como está ficando o script dinâmico. A partir daí vc vai ter uma idéia do que está acontecendo.
As variáveis de retorno são do mesmo tipo e tamanho dos campos do seu select?
Outra coisa. Tenho o costume de ao concatenar os parâmetros fazer um CAST antes, tipo:
XSQL= XSQL || cast( :Pempresa as varchar(10) ) || ´ AND LIG_COD_FILIAL = ´ || cast( :pfilial as varchar(10) );
já tive problemas com alguns tipos de dados, não sei se com campo inteiro vc teria problemas.
Se mesmo assim o problema permanecer, faça o seguinte:
coloque o parâmetro xsql como parâmetro de retorno, comente o que tiver executando com /**/ (não tire o suspend) para ver como está ficando o script dinâmico. A partir daí vc vai ter uma idéia do que está acontecendo.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)