[firebase-br] FOR EXECUTE STATEMENT - ERRO

bvrenato BVRENATO em click21.com.br
Dom Out 25 02:48:28 -03 2009


Boa noite a todos!

Estou implementando a procedure abaixo no Firebird 2.1 + Delphi 7 + DbExpress,
mas está ocorrendo um erro (invalid argument in EXECUTE STATEMENT - cannot
convert to string) na aplicação.

Este erro ocorre na linha:
pWHERE = '(DOS.TDOS_DTREGISTRO BETWEEN ''' || DATAINICIAL ||''' AND '''||
DATAFINAL ||''')';
Ou na linha onde implemento o ORDER BY (concatenando parametros).

Implementei as variáveis DATANICIAL e DATAFINAL para converter o formato da
data.
Já usei CAST nos parametros DATAINICIAL e DATAFINAL;
Já utilizei os parametros de entrada (iDTINICIO e IDTTERMINO);

Nada funcionou....


Eu tentei um WHERE do tipo:
pWHERE = '(DOS.TDOS_CODCLIENTE = ' || 1 || ')';
E funciolu correto.

Será que alguém poderia dar uma criticada no código abaixo?


Grato,

Renato



CREATE PROCEDURE SP_CSTA_PROCESSO (
    icliente integer,
    isubcliente integer,
    iocorrencia integer,
    iparametro integer,
    iordenacao integer,
    idtinicio date,
    idttermino date)
returns (
...
)
as
declare variable pselect varchar(1000);
declare variable pfrom varchar(1000);
declare variable pwhere varchar(1000);
declare variable porderby varchar(1000);
declare variable totdiasparados integer;
declare variable tempoliberacao integer;
declare variable datainicial char(10);
declare variable datafinal char(10);
declare variable parametro smallint;
BEGIN

  -- >>>>> CONVERSÃO DO FORMATO DA DATA INICIAL E DATA FINAL

  DATAINICIAL = SUBSTRING(CAST(:iDTINICIO AS VARCHAR(10)) FROM 9 FOR 2)||'.'||
                SUBSTRING(CAST(:iDTINICIO AS VARCHAR(10)) FROM 6 FOR 2)||'.'||
                SUBSTRING(CAST(:iDTINICIO AS VARCHAR(10)) FROM 1 FOR 4);
  DATAFINAL   = SUBSTRING(CAST(:iDTTERMINO AS VARCHAR(10)) FROM 9 FOR 2)||'.'||
                SUBSTRING(CAST(:iDTTERMINO AS VARCHAR(10)) FROM 6 FOR 2)||'.'||
                SUBSTRING(CAST(:iDTTERMINO AS VARCHAR(10)) FROM 1 FOR 4);


  -- >>>>> CONSTRUÇÃO DA CLÁUSULA SELECT

  pSELECT ='SELECT DOS.TDOS_DOSSIE, DOS.TDOS_PROCESSOCLIENTE,  DOS.TDOS_DI,
DOS.TDOS_CONHECIMENTO, DOS.TDOS_DTREGISTRO, ' ||
                  'DOS.TDOS_DTDISTRIBUICAO, DOS.TDOS_DTDESEMBARACO,
DOS.TDOS_DTCI, DOS.TDOS_DTEXONERACAO, DOS.TDOS_DTAVERMELHADO, ' ||
                  'DOS.TDOS_DTLANCAMENTO, FIS.TFIS_NOME, ARM.TARM_ARMAZEM,
PMT.TPMT_PARAMETRO, CLI.TCLI_RSOCIAL, SCL.TSCL_RSOCIAL ';

  -- >>>>> CONSTRUÇÃO DA CLÁUSULA FROM

  pFROM =  'FROM CPA_TDOSSIE DOS ' ||
                'JOIN CPA_TFISCAL         FIS ON FIS.TFIS_CODIGO =
DOS.TFIS_CODIGO ' ||
                'JOIN CPA_TARMAZEM        ARM ON ARM.TARM_CODIGO =
DOS.TARM_CODIGO ' ||
                'JOIN CPA_TPARAMETRIZACAO PMT ON PMT.TPMT_CODIGO =
DOS.TPMT_CODIGO ' ||
                'JOIN CPA_TSUBCLIENTE     SCL ON SCL.TSCL_CODIGO =
DOS.TSCL_CODIGO ' ||
                'JOIN CPA_TCLIENTE        CLI ON CLI.TCLI_CODIGO =
SCL.TCLI_CODIGO ';


  -- >>>>> CONSTRUÇÃO DA CLÁUSULA WHERE

  -- TIPO DE OCORRÊNCIA

  pWHERE = '(DOS.TDOS_DTREGISTRO BETWEEN ''' || DATAINICIAL ||''' AND '''||
DATAFINAL ||''')';

  pWHERE = ' WHERE ' || pWHERE ;



  -- >>>>> CONSTRUÇÃO DA CLÁUSULA ORDER BY

--  IF (:iORDENACAO = 0) THEN  --CLIENTE, SUBCLIENTE E DATA DO REGISTRO
--       pORDERBY =  'CLI.TCLI_RSOCIAL,SCL.TSCL_RSOCIAL,DOS.TDOS_DTREGISTRO';


--  pORDERBY = ' ORDER BY ' || pORDERBY;


  pSELECT   =  pSELECT || pFROM || pWHERE ;

   FOR EXECUTE STATEMENT  pSELECT
   INTO
...
___________________________________________________________________________________
Para fazer uma ligação DDD pra perto ou pra longe, faz um 21. A Embratel tem
tarifas muito baratas esperando por você. Aproveite!





Mais detalhes sobre a lista de discussão lista