RES: [firebase-br] Alguém pode me dar uma mão c/ FOR Execute Statement
Ton
hevertonc em hotmail.com
Seg Jan 2 16:00:27 -03 2006
Olá...
Pelo que entendi de sua procedure, vc está usando Execute Statement só
por causa da linha do produtor, é isso mesmo?
Se for, vc nem precisa usar isso o execute statement, faz assim que
funciona e resolve o seu problema:
SELECT RL.LEI_PRODUTOR,
P.PRO_NOME,
P.PRO_CNPJCPF,
P.PRO_COTALITRO,
P.PRO_COTAPERC,
P.PRO_BONIFICAVLR,
P.PRO_BONIFICAPERC,
P.PRO_TANQUE,
P.PRO_TAXATANQUE,
P.PRO_FRETEVALOR,
P.PRO_FRETEPERC,
RL.LEI_LINHA,
L.LIN_CARRETEIRO,
L.LIN_PAGAFRETE,
SUM(RL.LEI_BOM),
SUM(RL.LEI_ACIDO
FROM RECLEITE RL LEFT
JOIN PRODUTORES P
ON (P.PRO_CODIGO = RL.LEI_PRODUTOR) LEFT
JOIN LINHAS L
ON (L.LIN_CODIGO = RL.LEI_LINHA)
WHERE EXTRACT (MONTH FROM RL.LEI_DATA) = :MES
AND EXTRACT (YEAR FROM RL.LEI_DATA) = :ANO
/* Esta linha verifica se o produtor é igual ao parâmetro ou o parâmetro é
nulo, caso o parâmetro seja nulo, ele trás todos os produtores */
>> AND (RL.LEI_PRODUTOR = :PRODUTOR OR :PRODUTOR IS NULL) <<
GROUP BY RL.LEI_PRODUTOR,
P.PRO_NOME,
P.PRO_CNPJCPF,
P.PRO_COTALITRO,
P.PRO_COTAPERC,
P.PRO_BONIFICAVLR,
P.PRO_BONIFICAPERC,
P.PRO_TANQUE,
P.PRO_TAXATANQUE,
P.PRO_FRETEVALOR,
P.PRO_FRETEPERC,
RL.LEI_LINHA,
L.LIN_CARRETEIRO,
L.LIN_PAGAFRETE
ORDER BY L.LIN_CARRETEIRO,
P.PRO_NOME';
INTO :LEI_PRODUTOR,
:PRO_NOME,
:PRO_CNPJCPF,
:PRO_COTALITRO,
:PRO_COTAPERC,
:PRO_BONIFICAVLR,
:PRO_BONIFICAPERC,
:PRO_TANQUE,
:PRO_TAXATANQUE,
:PRO_FRETEVALOR,
:PRO_FRETEPERC,
:LEI_LINHA,
:LIN_CARRETEIRO,
:LIN_PAGAFRETE,
:LEI_BOM,
:LEI_ACIDO
Isso fica bem simples e funciona bem legal.
Abraços...
Ton
Analista de Sistemas
DotCom Informática
"A informação não é um produto,
mas sim a matéria prima." (Ton)
-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de José Filho (UOL)
Enviada em: segunda-feira, 2 de janeiro de 2006 15:09
Para: FireBase
Assunto: [firebase-br] Alguém pode me dar uma mão c/ FOR Execute Statement
Boa tarde, amigos!
Comecei a desenvolver SP's há alguns meses e há algumas semanas SQL's
dinâmicos c/ o FOR EXECUTE STATEMENT. Só tem um probleminha... Quando eu vou
incluir os campos no componente ClientDataSet, depois de ligados todos os
componentes, no Delphi é gerado o seguinte erro: Invalid argument in EXECUTE
STATEMENT - cannot convert to string. Segue anexo o código DDL da SP. No
livro Firebird Essencial do Cantu e nas Notas da Versão 1.5 de 08/02/2004
diz que não é possível trabalhar com parâmetros em SQL's dinâmicos. Seria
esse o meu problema? Então, por que no IBExpert a SP
é executada normalmente?
[ ]'s
José Filho
Barra do Garças-MT
Obs.: Uso Firebird 1.5, Delphi 7 e o trio SQLDataSet + DataSetProvider +
ClientDataSet
****************************************************************************
********
SET TERM ^ ;
CREATE PROCEDURE EXTRATOLEITE (
PRODUTOR INTEGER,
MES SMALLINT,
ANO SMALLINT)
RETURNS (
LEI_PRODUTOR INTEGER,
PRO_NOME VARCHAR(40),
PRO_CNPJCPF VARCHAR(18),
PRO_COTALITRO DECIMAL(15,2),
PRO_COTAPERC DECIMAL(3,2),
PRO_BONIFICAVLR DECIMAL(15,2),
PRO_BONIFICAPERC DECIMAL(3,2),
PRO_TANQUE INTEGER,
PRO_TAXATANQUE DECIMAL(15,2),
PRO_FRETEVALOR DECIMAL(15,2),
PRO_FRETEPERC DECIMAL(3,2),
LEI_LINHA INTEGER,
LIN_CARRETEIRO VARCHAR(40),
LIN_PAGAFRETE VARCHAR(5),
LEI_BOM DECIMAL(15,2),
LEI_ACIDO DECIMAL(15,2),
REQ_TOTAL DECIMAL(15,2),
PED_TOTAL DECIMAL(15,2),
PRE_VLRBOMCOTA DECIMAL(15,2),
PRE_VLRBOMEXTRA DECIMAL(15,2),
PRE_VLRACIDO DECIMAL(15,2),
FUNRURAL DECIMAL(3,2))
AS
DECLARE VARIABLE CODSQL VARCHAR(1030) CHARACTER SET WIN1252;
BEGIN
CODSQL = 'SELECT RL.LEI_PRODUTOR, P.PRO_NOME, P.PRO_CNPJCPF,
P.PRO_COTALITRO,
P.PRO_COTAPERC, P.PRO_BONIFICAVLR, P.PRO_BONIFICAPERC,
P.PRO_TANQUE,
P.PRO_TAXATANQUE, P.PRO_FRETEVALOR, P.PRO_FRETEPERC,
RL.LEI_LINHA,
L.LIN_CARRETEIRO, L.LIN_PAGAFRETE, SUM(RL.LEI_BOM),
SUM(RL.LEI_ACIDO)
FROM RECLEITE RL
LEFT JOIN PRODUTORES P
ON (P.PRO_CODIGO = RL.LEI_PRODUTOR)
LEFT JOIN LINHAS L
ON (L.LIN_CODIGO = RL.LEI_LINHA)
WHERE (EXTRACT (MONTH FROM RL.LEI_DATA) = ' || :MES || ')
AND (EXTRACT (YEAR FROM RL.LEI_DATA) = ' || :ANO || ')';
IF (PRODUTOR IS NOT NULL) THEN
BEGIN
CODSQL = CODSQL || 'AND (RL.LEI_PRODUTOR = ' || :PRODUTOR || ')';
END
CODSQL = CODSQL || 'GROUP BY RL.LEI_PRODUTOR, P.PRO_NOME, P.PRO_CNPJCPF,
P.PRO_COTALITRO,
P.PRO_COTAPERC, P.PRO_BONIFICAVLR, P.PRO_BONIFICAPERC,
P.PRO_TANQUE,
P.PRO_TAXATANQUE, P.PRO_FRETEVALOR, P.PRO_FRETEPERC,
RL.LEI_LINHA,
L.LIN_CARRETEIRO, L.LIN_PAGAFRETE
ORDER BY L.LIN_CARRETEIRO, P.PRO_NOME';
FOR EXECUTE STATEMENT
CODSQL
INTO :LEI_PRODUTOR, :PRO_NOME, :PRO_CNPJCPF, :PRO_COTALITRO,
:PRO_COTAPERC,
:PRO_BONIFICAVLR, :PRO_BONIFICAPERC, :PRO_TANQUE, :PRO_TAXATANQUE,
:PRO_FRETEVALOR, :PRO_FRETEPERC, :LEI_LINHA, :LIN_CARRETEIRO,
:LIN_PAGAFRETE,
:LEI_BOM, :LEI_ACIDO
DO
BEGIN
SELECT COALESCE(SUM(R.REQ_TOTAL),0) FROM REQUISICOES R
WHERE (R.REQ_PRODUTOR = :LEI_PRODUTOR)
AND (R.REQ_LINHA = :LEI_LINHA)
AND (R.REQ_DATAPAGTO IS NULL)
AND (EXTRACT (MONTH FROM R.REQ_DATA) = :MES)
AND (EXTRACT (YEAR FROM R.REQ_DATA) = :ANO)
INTO :REQ_TOTAL;
SELECT COALESCE(SUM(PD.PED_TOTAL),0) FROM PEDIDOS PD
WHERE (PD.PED_CLIENTEPROD = :LEI_PRODUTOR)
AND (PD.PED_TIPO = 'P')
AND (PD.PED_LINHA = :LEI_LINHA)
AND (PD.PED_DATAPAGTO IS NULL)
AND (EXTRACT (MONTH FROM PD.PED_DATA) = :MES)
AND (EXTRACT (YEAR FROM PD.PED_DATA) = :ANO)
INTO :PED_TOTAL;
SELECT COALESCE(PL.PRE_VLRBOMCOTA,0),
COALESCE(PL.PRE_VLRBOMEXTRA,0),
COALESCE(PL.PRE_VLRACIDO,0) FROM PRECOLEITE PL
WHERE (PL.PRE_MES = :MES)
AND (PL.PRE_ANO = :ANO)
INTO :PRE_VLRBOMCOTA, :PRE_VLRBOMEXTRA, :PRE_VLRACIDO;
SELECT P.FUNRURAL FROM PARAM P
INTO :FUNRURAL;
SUSPEND;
END
END^
SET TERM ; ^
GRANT SELECT ON REQUISICOES TO PROCEDURE EXTRATOLEITE;
GRANT SELECT ON PEDIDOS TO PROCEDURE EXTRATOLEITE;
GRANT SELECT ON PRECOLEITE TO PROCEDURE EXTRATOLEITE;
GRANT SELECT ON PARAM TO PROCEDURE EXTRATOLEITE;
GRANT EXECUTE ON PROCEDURE EXTRATOLEITE TO SYSDBA;
---
avast! Antivirus: Outbound message clean.
Virus Database (VPS): 0601-0, 02/01/2006
Tested on: 2/1/2006 14:08:33
avast! - copyright (c) 1988-2005 ALWIL Software.
http://www.avast.com
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa
Mais detalhes sobre a lista de discussão lista