Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Duda sobre procedimiento almacenado (https://www.clubdelphi.com/foros/showthread.php?t=7012)

Nuria 30-01-2004 10:25:34

Duda sobre procedimiento almacenado
 
Hola !

Tengo una pregunta sobre los procedimientos almacenados. Se puede mandar como parámetro la tabla de la cual vamos a sacar información.



Código:

set term ^;
create procedure proce(cod integer, tab char(10))
returns (timp decimal(12,2))
as
begin
  select sum(imp) from :tab
      where cod= :cod
    into :timp;
  suspend;
end ^
set term ;^

Según tengo entendido no se puede. :( . ¿Estoy equivocada o no?

Saludos!

kinobi 30-01-2004 10:38:43

Hola,

no puedes ... en InterBase (al menos hasta la versión 6. en superiores no lo sé) y en Firebird (versiones 1.0.x e inferiores), pero en Firebird 1.5 a tavés de EXECUTE STATEMENT creando dinámicamente la sentencia.

Sacado del registro de cambios de la versión 1.5:

* New EXECUTE VARCHAR statement (SF #446256).
Allow execution of dynamic SQL statements in SPs/triggers.
Syntax:
EXECUTE VARCHAR value;
Notes:
1. Available in PSQL only.
2. Currently cannot return values, so SELECT statements are not allowed.
3. Recursion level is limited to 50 (hardcoded).
Example:
EXECUTE VARCHAR my_var;
Contributor(s):
Alexander Peshkoff <peshkoff at hotmail.ru>


Aunque dice que no se permiten sentencias SELECT, en la Beta 4 fue mejorado:

* Improved EXECUTE STATEMENT.
Now it's possible to return values from the dynamic SQL.
Syntax:
EXECUTE STATEMENT <value> INTO <var_list>; (singleton form)
or
FOR EXECUTE STATEMENT <value> INTO <var_list> DO <stmt_list>;
Contributor(s):
Alexander Peshkoff <peshkoff at hotmail.ru>


En las notas de la versión 1.5 (en la traducción al Español colaboró el compañero de estos foros Marc Guillot-Seguramente él tenga la dirección de descarga, yo no la encuentro) tienes varios ejemplos de uso.

Saludos.

__cadetill 30-01-2004 11:07:13

Esto se trató en otro hilo donde tenía este interés y me respondió el amigo kinobi. Allí encontrarás un ejemplo de como hacerlo

http://www.clubdelphi.com/foros/show...CUTE+STATEMENT

Nuria 30-01-2004 11:59:18

Mil Gracias
 
Aclarada perfectamente mi duda.

Gracias Kinobi por ser tan claro en tus respuestas.


Cita:

Esto se trató en otro hilo donde tenía este interés y me respondió el amigo kinobi....
Se ve q hoy no tengo un día muy acertado, porque busqué por el foro, y no encontré (no buscaría bien :rolleyes: . ) Gracias Cadetill también me ha servido de ayuda.

Visto lo visto creo que voy a pasar de Interbase 6.0 a FireBird 1.5. Manejo los IB, pero ningún TIBTable, utilizo TIBDataSet y TIBQuery. No creo que tenga problemas con FireBird.

Saludos! :p

kinobi 30-01-2004 12:13:13

Hola,

Cita:

Empezado por Nuria
Visto lo visto creo que voy a pasar de Interbase 6.0 a FireBird 1.5. Manejo los IB, pero ningún TIBTable, utilizo TIBDataSet y TIBQuery. No creo que tenga problemas con FireBird.

no confíes en ello. IBX sólo dará soporte al API InterBase, pero no al de Firebird. De hecho es posible (no estoy seguro, ya que yo no he probado la combinación IBX+FB_1.5) que ya haya problemas.

Alternativas: dbExpress, IBO, FIBPlus

Saludos

Nuria 30-01-2004 12:45:26

Pues entonces.... :confused: no sé que haré, porque practicamente tengo terminada la aplicación con los IB e interbase 6.0. Creo que finalmente probaré con FireBird haber si me da algún problemilla.

Cita:

Originalmente publicado por Kinobi
Alternativas: dbExpress, IBO, FIBPlus
Y en adelante, probaré las Alternativas. Porque por lo que estoy viendo le puedo sacar más partido a FireBird que a Interbase.

Gracias. ;)

Saludos!

guillotmarc 30-01-2004 15:19:52

Hola

Aquí tienes la última versión de las comentadas Release Notes de Firebird 1.5, traducidas al castellano : http://www.ibphoenix.com/downloads/F...tesSpanish.pdf

Saludos.

Nuria 30-01-2004 17:59:13

Hola Guillotmac!

Muchas Gracias! ;) .

Voy a leerlas y así, a ver si ya, me decido por Interbase o por FireBird.

Saluditos!

aurafern 14-09-2004 19:26:39

Hola!

De nuevo yo.

Llevo dos dias tratando de que este procedimiento se ejecute correctamente. Y aunque ustedes no tienen la culpa de mi ignorancia en el tema :D , solicito urgente ayuda!! :eek:

Ya he mirado todos los foros que tienen que ver con el paso de parametros a procedimientos almacenados. Trabajo con delphi y Firebird 1.5 (que en la documentación ya dice que tiene solucionado el problema), sin embargo, compilo el siguiente procedimiento y no saca error, pero cuando lo llamo desde delphi pasándole los siguientes parámetros:

empresa= ' AND E.ID_EMPRESA =1 '
sucursal= ' AND E.ID_SUCURSAL=1 '
MODELO=4
NO_RANGO=4
PFECHA= 09/09/2004
PVENDEDOR=''
PZONA=''
pcuenta=''
PTERCERO=' AND E.ID_TERCERO=1 '

Arroja el error: General Sql error, Column unknown SEP

Código SQL [-]
create PROCEDURE CARTERA_PROVEEDORES_PROC
(
  EMPRESA VARCHAR(100),
  SUCURSAL VARCHAR(100),
  MODELO VARCHAR(15),
  NO_RANGOS INTEGER,
  PFECHA TIMESTAMP,
  PVENDEDOR VARCHAR(100),
  PZONA VARCHAR(100),
  PCUENTA VARCHAR(100),
  PTERCERO VARCHAR(100)
)
RETURNS
(
  ID_EMPRESA VARCHAR(2),
  ID_SUCURSAL VARCHAR(2),
  ID_TIPO VARCHAR(3),
  NUMERO INTEGER,
  CUOTA INTEGER,
  ID_TERCERO INTEGER,
  ID_SUCURSAL_TERCERO INTEGER,
  SALDO DOUBLE PRECISION,
  DESCRIP1 VARCHAR(30),
  DESCRIP2 VARCHAR(30),
  DESCRIP3 VARCHAR(30),
  RANGO1 DOUBLE PRECISION,
  RANGO2 DOUBLE PRECISION,
  RANGO3 DOUBLE PRECISION,
  FECHA_DOC TIMESTAMP,
  ID_AUXILIAR VARCHAR(12),
  VENCIMIENTO TIMESTAMP,
  DIAS DOUBLE PRECISION,
  RANGO4 DOUBLE PRECISION,
  DESCRIP4 VARCHAR(30),
  RANGO5 DOUBLE PRECISION,
  DESCRIP5 VARCHAR(30)
)
AS
DECLARE VARIABLE ID_MODELO varchar(15);
  DECLARE VARIABLE ID_RANGO integer;
  DECLARE VARIABLE ID_DESCRIPCION_RANGO varchar(10);
  DECLARE VARIABLE DESCRIPCION_RANGO varchar(50);
  DECLARE VARIABLE DESDE  integer;
  DECLARE VARIABLE HASTA  integer;
  DECLARE VARIABLE TIPO_RANGO varchar(10);
  DECLARE VARIABLE NUMERO_RANGOS integer;
  DECLARE VARIABLE TITULO  varchar(50);
  DECLARE VARIABLE Sql_INS VARCHAR(1024);
begin
FOR SELECT RANGO_REP_TERCERO_DET.ID_MODELO,
      RANGO_REP_TERCERO_DET.ID_RANGO,
      RANGO_REP_TERCERO_DET.ID_DESCRIPCION_RANGO,
      RANGO_REP_TERCERO_DET.DESCRIPCION_RANGO,
      RANGO_REP_TERCERO_DET.DESDE,
      RANGO_REP_TERCERO_DET.HASTA,
      RANGO_REP_TERCERO_DET.TIPO_RANGO,
      RANGO_REP_TERCERO.NUMERO_RANGOS,
      RANGO_REP_TERCERO.DESCRIPCION AS TITULO
from RANGO_REP_TERCERO_DET,RANGO_REP_TERCERO
where RANGO_REP_TERCERO_DET.ID_MODELO=RANGO_REP_TERCERO.ID_MODELO AND RANGO_REP_TERCERO.ID_MODELO=:modelo
INTO   :ID_MODELO,
      :Id_rango,
      :ID_DESCRIPCION_RANGO,
      :DESCRIPCION_RANGO,
      :DESDE,
      :HASTA,
      :TIPO_RANGO,
      :NUMERO_RANGOS,
      :TITULO
DO
BEGIN
FOR EXECUTE STATEMENT
'SELECT SUM(e.DEBITO-e.CREDITO) AS SALDO, e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE, e.numero_cruce, E.CUOTA_CRUCE,
d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO FROM CUENTAS_POR_TERCERO e , cuentas_por_tercero d
where e.ID_EMPRESA_CRUCE=d.ID_EMPRESA and e.ID_SUCURSAL_CRUCE=d.ID_SUCURSAL AND E.CUOTA_CRUCE=D.CUOTA
and e.ID_TIPO_DOC_CRUCE= d.id_tipo_doc and e.numero_cruce=d.numero ' ||:EMPRESA ||:SUCURSAL||
'and (' ||:pfecha || ' - d.vencimiento)>=' ||:desde ||' '|| 'and (' ||:pfecha|| ' - d.vencimiento)<='
||:hasta||' '||:ptercero ||
'GROUP BY e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE,
e.numero_cruce, E.CUOTA_CRUCE , d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO
having SUM(e.DEBITO-e.CREDITO)<>0'
into :saldo,:id_auxiliar,:id_empresa,:id_sucursal,:id_tipo,:numero,:cuota,:fecha_DOC,:vencimiento,:id_ter  cero,:id_sucursal_tercero
DO
   BEGIN
   dias = :pfecha - :vencimiento;
  suspend;
   END

 end
end


por favor ayudenme ya no se que hacer!

de antemano gracias

guillotmarc 14-09-2004 20:44:29

Hola.

Para finalizar el código SQL tienes que hacerlo con una cláusula [/sql] y no [\SQL].

Respecto al error que te está dando, está claro que el error lo tienes en la sentencia SQL que has construido dinamicamente. Revísala puesto que tiene que ser incorrecta.

NOTA: Para empezar, lo primero que veo es que en la cadena de la sentencia, las fechas no quedan delimitadas por comillas, y deberian estarlo.

Saludos.

aurafern 14-09-2004 21:13:36

ya he probado con las comillas en la fecha

Código SQL [-]
and ("' ||:pfecha || '" - d.vencimiento)>=' ||:desde ||' '|| 'and ("' ||:pfecha|| '" - d.vencimiento)<='

le estoy pasando la fecha que tiene el dataset desde Delphi

y produce el siguiente error

General sql error, column unknown '09-sep-2004' :confused:

guillotmarc 14-09-2004 21:33:26

Hola.

Las fechas, si las pasas como cadena tienen que estar con el formato mm/dd/yyyy

Saludos.

aurafern 14-09-2004 22:26:30

Disculpame la ignorancia pero yo escribo en Delphi:

Código Delphi [-]
query2.close;
query2.ParamByName('empresa').AsString:=' AND E.ID_EMPRESA=1 ';;
query2.ParamByName('sucursal').AsString:=' AND E.ID_SUCURSAL=1 ';
Query2.ParamByName('modelo').AsInteger:=4;
Query2.ParamByName('no_rango').AsInteger:=4;
query2.ParamByName('PFECHA').Asstring:=Formatdatetime('mm/dd/yyyy',mdFECHA.AsDateTime);
query2.ParamByName('PVENDEDOR').AsString:='';
query2.ParamByName('PZONA').AsString:='';
query2.ParamByName('PCUENTA').AsString:='';
query2.ParamByName('PTERCERO').AsString:=' AND E.ID_TERCERO=1 ';
query2.Open;

pfecha en el procedimiento timestamp
pfecha entre comillas

en delphi:
el parametro del query en delphi es date
y arroja:

column unknown 14-sep-2004

si

parametro pfecha en procedimiento varchar(20)
y el parametro pfecha en delphi date

column unknown 09/14/2004


y asi sucesivamente pruebo varias combinaciones y todas devuelven uno de estos dos mensajes

Disculpen la molestia!! ;)

guillotmarc 14-09-2004 22:54:46

Hola.

Prueba :

query2.ParamByName('PFECHA').Asstring := QuotedStr(Formatdatetime('mm/dd/yyyy',mdFECHA.AsDateTime));

Siendo el parámetro en el procedimiento varchar(20) y en Delphi string.

Saludos.

aurafern 15-09-2004 00:02:50

Hola!!

Persiste el error

guillotmarc 15-09-2004 11:48:41

Sigues teniendo un problema en la consulta que construyes dinamicamente. No es válida.

Saludos.

aurafern 15-09-2004 23:32:31

Bueno de todos modos muchas gracias por dedicar tiempo a los n problemas que se me presentan, en mi camino por el aprendizaje de delphi y Firebird

Después de dar muchas vueltas probando la alternativa de utilizar
EXECUTE STETEMENT. Y revisando con un compañero la sintaxis tanto en delphi como en firebird, no logramos hacer uso de esta característica que me ayudaría a solucionar muchos problemas.


Solucioné el problema utilizando like y pasando solo el valor del parametro

Código Delphi [-]
query2.close;
query2.ParamByName('empresa').AsString:='%';;
query2.ParamByName('sucursal').AsString:='%';
Query2.ParamByName('modelo').AsInteger:=4;
Query2.ParamByName('no_rango').AsInteger:=4;
query2.ParamByName('PFECHA').AsDateTime:=int(mdFECHA.AsDateTime);
query2.ParamByName('PVENDEDOR').AsString:='1';
query2.ParamByName('PZONA').AsString:='%';
query2.ParamByName('PCUENTA').AsString:='%';
query2.ParamByName('PTERCERO').AsString:='1';
query2.ParamByName('Psuc_TERCERO').AsString:='%';
query2.ParamByName('Psuc_VENDEDOR').AsString:='%';
query2.Open;


Código SQL [-]
FOR SELECT SUM(e.DEBITO-e.CREDITO) AS SALDO, e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE, e.numero_cruce, E.CUOTA_CRUCE,
d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR FROM CUENTAS_POR_TERCERO e , cuentas_por_tercero d
where e.ID_EMPRESA_CRUCE=d.ID_EMPRESA and e.ID_SUCURSAL_CRUCE=d.ID_SUCURSAL AND E.CUOTA_CRUCE=D.CUOTA
and e.ID_TIPO_DOC_CRUCE= d.id_tipo_doc and e.numero_cruce=d.numero  AND e.ID_EMPRESA like(:EMPRESA) AND E.ID_SUCURSAL like(:SUCURSAL)
and (:pfecha - d.vencimiento)>=:desde and (:pfecha - d.vencimiento)<=:hasta and e.id_tercero like(:ptercero) AND E.ID_VENDEDOR LIKE (:PVENDEDOR) AND E.ID_SUC_VENDEDOR LIKE (:PSUC_VENDEDOR)
and e.id_sucursal_tercero like (:psuc_tercero) and e.id_auxiliar like (:pcuenta)
GROUP BY e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE,
e.numero_cruce, E.CUOTA_CRUCE , d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR
having SUM(e.DEBITO-e.CREDITO)<>0
into :saldo,:id_auxiliar,:id_empresa,:id_sucursal,:id_tipo,:numero,:cuota,:fecha_DOC,:vencimiento,:id_ter  cero,:id_sucursal_tercero, :ID_VENDEDOR

Pero no sé que tan eficiente sea el like.

Saludos!!

guillotmarc 15-09-2004 23:45:21

Hola.

En mi opinión tu problema no tiene que ver con el comando EXECUTE STATEMENT.

El problema está en que no estas construyendo una sentencia SQL válida. Solucionarlo tendría que ser bastante sencillo.

Solo tienes que utilizar un depurador de procedimientos almacenados (hay varios disponibles pero solo conozco los comerciales, como el IB-Expert en la versión completa).

Depura tu procedimiento, hasta llegar al EXECUTE STATEMENT, y comprueba cual es la sentencia exacta que se va a lanzar (para ello quizá sea conveniente ponerla primero en una variable).

Una vez tengas la sentencia que se va a ejecutar, pruébala directamente en el IBConsole, IB-Expert, ... o tu herramienta favorita. Va a fallar, solo tienes que corregirla hasta conseguir que funcione correctamente.

Una vez funcione, ya solo tienes que modificar el procedimiento, para que construya la sentencia, en el formato probado.

NOTA: Si no consigues hacer funcionar la sentencia, indícanos cual es exactamente la sentencia que se lanza, y probaremos de ayudarte.

PD : Efectivamente, el Like no es muy eficiente.

Saludos.

aurafern 16-09-2004 20:08:44

Hola!

Ya estoy dudosa, acerca de si la brutalidad me esta invadiendo!!
Hice las pruebas que me aconsejaste (con IBadmin 4), pero nada.

Te envío la estructura de las tablas y el procedimiento que utilizo, por si los necesitas para probar

Código SQL [-]

/* Domain definitions */
CREATE DOMAIN TNATURALEZA AS VARCHAR(10)
   default "DEBITO"
   CHECK (value in ("DEBITO","CREDITO"));
CREATE DOMAIN TTIPO_TRANS AS CHAR(1)
   default "C"
   CHECK (value in ("S","C"));

/* Table: CUENTAS_POR_TERCERO, Owner: SYSDBA */

CREATE TABLE CUENTAS_POR_TERCERO 
(
  ID_CONTADOR   INTEGER NOT NULL,
  ID_EMPRESA   VARCHAR(2),
  ID_SUCURSAL   VARCHAR(2),
  ID_TIPO_DOC   VARCHAR(3),
  NUMERO   INTEGER,
  CUOTA   SMALLINT,
  ID_TERCERO   INTEGER,
  ID_SUCURSAL_TERCERO   SMALLINT,
  ID_AUXILIAR   VARCHAR(12),
  FECHA   TIMESTAMP,
  VENCIMIENTO   TIMESTAMP,
  ID_EMPRESA_CRUCE   VARCHAR(2),
  ID_SUCURSAL_CRUCE   VARCHAR(2),
  ID_TIPO_DOC_CRUCE   VARCHAR(3),
  NUMERO_CRUCE   INTEGER,
  ID_DEPARTAMENTO   VARCHAR(15),
  ID_CENTRO_COSTO   VARCHAR(15),
  ID_ACTIVIDAD   VARCHAR(15),
  DEBITO   DOUBLE PRECISION,
  CREDITO   DOUBLE PRECISION,
  BENEFICIARIO   INTEGER,
  ID_VENDEDOR   INTEGER,
  TIPO_TRANS   TTIPO_TRANS  default "C",
  NATURALEZA   TNATURALEZA  default "DEBITO",
  CUOTA_CRUCE   DOUBLE PRECISION,
  ID_BENEFICIARIO   INTEGER,
  BASE   DOUBLE PRECISION,
  ID_SUC_VENDEDOR   INTEGER,
 PRIMARY KEY (ID_CONTADOR)
);

/* Table: RANGO_REP_TERCERO, Owner: SYSDBA */

CREATE TABLE RANGO_REP_TERCERO 
(
  ID_MODELO   INTEGER NOT NULL,
  DESCRIPCION   VARCHAR(50),
  NUMERO_RANGOS   INTEGER,
CONSTRAINT PK_RANGO_REP_TERCERO PRIMARY KEY (ID_MODELO)
);

CREATE TABLE RANGO_REP_TERCERO_DET 
(
  ID_MODELO   INTEGER NOT NULL,
  ID_RANGO   INTEGER NOT NULL,
  ID_DESCRIPCION_RANGO   VARCHAR(10),
  DESCRIPCION_RANGO   VARCHAR(50),
  DESDE   INTEGER,
  HASTA   INTEGER,
  TIPO_RANGO   VARCHAR(10),
CONSTRAINT PK_RANGO_REP_TERCERO_DET PRIMARY KEY (ID_MODELO, ID_RANGO)
);

aurafern 16-09-2004 20:14:42

y el procedimiento
 
Código SQL [-]

CREATE PROCEDURE CARTERA_PROVEEDORES_PROC 
(
  EMPRESA VARCHAR(100),
  SUCURSAL VARCHAR(100),
  MODELO VARCHAR(15),
  NO_RANGOS INTEGER,
  PFECHA TIMESTAMP,
  PVENDEDOR VARCHAR(100),
  PZONA VARCHAR(100),
  PCUENTA VARCHAR(100),
  PTERCERO VARCHAR(100),
  PSUC_TERCERO VARCHAR(100),
  PSUC_VENDEDOR VARCHAR(100)
)
RETURNS
(
  ID_AUXILIAR VARCHAR(12),
  ID_EMPRESA VARCHAR(2),
  ID_SUCURSAL VARCHAR(2),
  ID_TIPO VARCHAR(3),
  NUMERO INTEGER,
  CUOTA INTEGER,
  ID_TERCERO INTEGER,
  ID_SUCURSAL_TERCERO INTEGER,
  NOMBRE_TERC VARCHAR(250),
  TELEFONO_TERC VARCHAR(30),
  SALDO DOUBLE PRECISION,
  FECHA_DOC TIMESTAMP,
  VENCIMIENTO TIMESTAMP,
  ID_VENDEDOR INTEGER,
  NOMBRE_VEND VARCHAR(250),
  DESCRIPCION VARCHAR(255),
  DIAS DOUBLE PRECISION,
  RANGO1 DOUBLE PRECISION,
  RANGO2 DOUBLE PRECISION,
  RANGO3 DOUBLE PRECISION,
  RANGO4 DOUBLE PRECISION,
  RANGO5 DOUBLE PRECISION,
  RANGO6 DOUBLE PRECISION,
  RANGO7 DOUBLE PRECISION,
)
AS
declare variable ID_MODELO varchar(15);
     declare variable ID_RANGO integer;
     declare variable ID_DESCRIPCION_RANGO varchar(10);
     declare variable DESCRIPCION_RANGO varchar(50);
     declare variable DESDE integer;
     declare variable HASTA integer;
     declare variable TIPO_RANGO varchar(10);
     declare variable NUMERO_RANGOS integer;
     declare variable TITULO varchar(50);
     declare variable Sql_INS VARCHAR(1024);
begin
FOR SELECT RANGO_REP_TERCERO_DET.ID_MODELO,
      RANGO_REP_TERCERO_DET.ID_RANGO,
      RANGO_REP_TERCERO_DET.ID_DESCRIPCION_RANGO,
      RANGO_REP_TERCERO_DET.DESCRIPCION_RANGO,
      RANGO_REP_TERCERO_DET.DESDE,
      RANGO_REP_TERCERO_DET.HASTA,
      RANGO_REP_TERCERO_DET.TIPO_RANGO,
      RANGO_REP_TERCERO.NUMERO_RANGOS,
      RANGO_REP_TERCERO.DESCRIPCION AS TITULO
from RANGO_REP_TERCERO_DET,RANGO_REP_TERCERO
where RANGO_REP_TERCERO_DET.ID_MODELO=RANGO_REP_TERCERO.ID_MODELO AND RANGO_REP_TERCERO.ID_MODELO=:modelo
INTO   :ID_MODELO, :Id_rango, :ID_DESCRIPCION_RANGO,:DESCRIPCION_RANGO,:DESDE,:HASTA,:TIPO_RANGO, :NUMERO_RANGOS,:TITULO
DO
BEGIN
 SALDO=0; RANGO1=0; RANGO2=0; RANGO3=0; RANGO4=0; RANGO5=0; RANGO6=0; RANGO7=0;
SQL_INS= 'SELECT SUM(e.DEBITO-e.CREDITO) AS SALDO, e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE, e.numero_cruce, E.CUOTA_CRUCE, ';
SQL_INS=SQL_INS ||' d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR FROM CUENTAS_POR_TERCERO e , cuentas_por_tercero d ';
SQL_INS=SQL_INS ||' where e.ID_EMPRESA_CRUCE=d.ID_EMPRESA and e.ID_SUCURSAL_CRUCE=d.ID_SUCURSAL AND E.CUOTA_CRUCE=D.CUOTA ';
SQL_INS=SQL_INS ||' and e.ID_TIPO_DOC_CRUCE= d.id_tipo_doc and e.numero_cruce=d.numero ' ||:EMPRESA ||:SUCURSAL;
SQL_INS=SQL_INS ||' and ( "'||:pfecha || '" - d.vencimiento)>= ' ||:desde || ' and ( "'||:pfecha || '" - d.vencimiento)<= ' ||:hasta;
SQL_INS=SQL_INS || :ptercero || :PVENDEDOR || :PSUC_VENDEDOR;
SQL_INS=SQL_INS || :psuc_tercero ||:pcuenta;
SQL_INS=SQL_INS ||' GROUP BY e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE, ';
SQL_INS=SQL_INS ||' e.numero_cruce, E.CUOTA_CRUCE , d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR ';
SQL_INS=SQL_INS ||' having SUM(e.DEBITO-e.CREDITO)<>0 ';
FOR EXECUTE STATEMENT SQL_INS
into :saldo,:id_auxiliar,:id_empresa,:id_sucursal,:id_tipo,:numero,:cuota,:fecha_DOC,:vencimiento,:id_ter  cero,:id_sucursal_tercero, :ID_VENDEDOR
DO
   BEGIN
   dias = :pfecha - :vencimiento;
       if (:ID_DESCRIPCION_RANGO='RANGO1') then
    begin
    rango1=:saldo;
    end
    else if (:ID_DESCRIPCION_RANGO='RANGO2') then
    begin
    rango2=:saldo;
    end
    else if (:ID_DESCRIPCION_RANGO='RANGO3') then
    begin
    rango3=:saldo;
    end
    else if (:ID_DESCRIPCION_RANGO='RANGO4') then
    begin
    rango4=:saldo;
    end
    else if (:ID_DESCRIPCION_RANGO='RANGO5') then
    begin
    rango5=:saldo;
    end
    else if (:ID_DESCRIPCION_RANGO='RANGO6') then
    begin
    rango6=:saldo;
    end
      else if (:ID_DESCRIPCION_RANGO='RANGO7') then
    begin
    rango7=:saldo;
    end
  suspend;
  SALDO=0; RANGO1=0; RANGO2=0; RANGO3=0; RANGO4=0; RANGO5=0; RANGO6=0; RANGO7=0;
  END
 end
end

guillotmarc 16-09-2004 21:51:57

Hola.

Sin el valor que se asignan a los parámetros del procedimiento, no se puede estimar como será la sentencia construída dinamicamente, y por tanto, porqué falla.

La verdad es que seria mucho más simple que nos pasaras directamente el valor de :SQL_INS, así como el mensaje de error que te sale actualmente. Puesto que aquí es donde debe buscarse el error.

Saludos.

aurafern 17-09-2004 16:40:05

Esta es la consulta:
Código SQL [-]
SELECT SUM(e.DEBITO-e.CREDITO) AS SALDO, e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE, e.numero_cruce, E.CUOTA_CRUCE,
d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR FROM CUENTAS_POR_TERCERO e , cuentas_por_tercero d
where e.ID_EMPRESA_CRUCE=d.ID_EMPRESA and e.ID_SUCURSAL_CRUCE=d.ID_SUCURSAL AND E.CUOTA_CRUCE=D.CUOTA
and e.ID_TIPO_DOC_CRUCE= d.id_tipo_doc and e.numero_cruce=d.numero  AND e.ID_EMPRESA = 1  AND E.ID_SUCURSAL=1
and e.id_tercero =1 AND E.ID_VENDEDOR=1 AND E.ID_SUC_VENDEDOR=1
and e.id_sucursal_tercero=1   and e.id_auxiliar =13050501  
and (09/16/2004 - d.vencimiento)>= 30 and (09/16/2004 - d.vencimiento)<= 90
GROUP BY e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE,
e.numero_cruce, E.CUOTA_CRUCE , d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR
having SUM(e.DEBITO-e.CREDITO)<>0
into :saldo,:id_auxiliar,:id_empresa,:id_sucursal,:id_tipo,:numero,:cuota,:fecha_DOC,:vencimiento,:id_ter  cero,:id_sucursal_tercero, :ID_VENDEDOR

los parametros son

Código Delphi [-]
query2.close;
if (mdId_empresa.asstring<>' ') then 
query2.ParamByName('empresa').AsString:=' AND E.ID_EMPRESA='+ mdId_empresa.asstring+ ' ';
if (mdId_sucursal.asstring<>' ') then
query2.ParamByName('sucursal').AsString:=' AND E.ID_SUCURSAL='+ mdId_sucursal.asstring+ ' ';
Query2.ParamByName('modelo').AsInteger:=4;
Query2.ParamByName('no_rango').AsInteger:=4;
query2.ParamByName('PFECHA').AsDate:= int(mdFECHA.AsDateTime);
if (SELECCIONAVENDE='SI') THEN
query2.ParamByName('PVENDEDOR').AsString:=' AND E.VENDEDOR= 1 ';
if (SELECCIONACUENTA='SI') THEN
query2.ParamByName('PCUENTA').AsString:= ' AND E.PCUENTA = 13050501 ';
if (SELECCIONATERC='SI') THEN
query2.ParamByName('PTERCERO').AsString:=' AND E.ID_TERCERO=1 ';
if (SELECCIONASUCTER='SI') THEN
query2.ParamByName('Psuc_TERCERO').AsString:=' AND E.ID_SUCURSAL_TERCERO=1 ';
if (SELECCIONASUCVEND='SI') THEN
query2.ParamByName('Psuc_VENDEDOR').AsString:=' AND E.ID_SUC_VENDEDOR=1 ';
query2.Open;


y sale el error : column unknown 09/16/2004 , cuando llamo al SP desde delphi.

lo que quiere decir que si solo se va a filtrar por rango de fechas y empresa
la consulta que daría de la siguiente manera

Código SQL [-]
SELECT SUM(e.DEBITO-e.CREDITO) AS SALDO, e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE, e.numero_cruce, E.CUOTA_CRUCE,
d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR FROM CUENTAS_POR_TERCERO e , cuentas_por_tercero d
where e.ID_EMPRESA_CRUCE=d.ID_EMPRESA and e.ID_SUCURSAL_CRUCE=d.ID_SUCURSAL AND E.CUOTA_CRUCE=D.CUOTA
and e.ID_TIPO_DOC_CRUCE= d.id_tipo_doc and e.numero_cruce=d.numero  AND e.ID_EMPRESA = 1 
and ( :pfecha - d.vencimiento)>= 30 and ( :pfecha - d.vencimiento)<= 90
GROUP BY e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE,
e.numero_cruce, E.CUOTA_CRUCE , d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR
having SUM(e.DEBITO-e.CREDITO)<>0
into :saldo,:id_auxiliar,:id_empresa,:id_sucursal,:id_tipo,:numero,:cuota,:fecha_DOC,:vencimiento,:id_ter  cero,:id_sucursal_tercero, :ID_VENDEDOR

Lo que se traduce en que solo quiero pasar los filtros (que aparecen coloreados en la primera consulta) sólo cuando sea necesario.

Muchas gracias por tu paciencia!!

guillotmarc 17-09-2004 18:03:44

Hola.

Lo primero que salta a la vista, es que tienes fechas sin delimitar. Es decir :

Código SQL [-]
and (09/16/2004 - d.vencimiento)>= 30 and (09/16/2004 - d.vencimiento)<= 90

Eso debería quedar en :

Código SQL [-]
and ('09/16/2004' - d.vencimiento)>= 30 and ('09/16/2004' - d.vencimiento)<= 90

Si aún no te funciona, haz explicitamente la conversión de cadena a fecha :

Código SQL [-]
and (cast('09/16/2004' as date) - d.vencimiento)>= 30 and (cast('09/16/2004' as date) - d.vencimiento)<= 90

Saludos.

guillotmarc 17-09-2004 18:10:15

NOTA: Antes de modificar el procedimiento almacenado, prueba directamente la sentencia SQL. Cuando consigas que funcione, entonces puedes modificar el procedimiento para que construya esa sentencia.

Saludos.

aurafern 18-09-2004 18:45:45

Nota: al parametro pfecha lo cambie de tipo y tamaño por varchar(100), para no mandarle solo la fecha, sino la cadena

' and ('09/09/2004' - d.vencimiento) '

La sentencia SQL así

Código SQL [-]
SELECT SUM(e.DEBITO-e.CREDITO) AS SALDO, e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE, e.numero_cruce, E.CUOTA_CRUCE,
d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR FROM CUENTAS_POR_TERCERO e , cuentas_por_tercero d
where e.ID_EMPRESA_CRUCE=d.ID_EMPRESA and e.ID_SUCURSAL_CRUCE=d.ID_SUCURSAL AND E.CUOTA_CRUCE=D.CUOTA
and e.ID_TIPO_DOC_CRUCE= d.id_tipo_doc and e.numero_cruce=d.numero  AND e.ID_EMPRESA = 1  AND E.ID_SUCURSAL=1
and e.id_tercero =1 AND E.ID_VENDEDOR=1 AND E.ID_SUC_VENDEDOR=1
and e.id_sucursal_tercero=1   and e.id_auxiliar =13050501
and ('09/09/2004' - d.vencimiento)>= 30 and ('09/09/2004' - d.vencimiento)<= 90
GROUP BY e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE,
e.numero_cruce, E.CUOTA_CRUCE , d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR
having SUM(e.DEBITO-e.CREDITO)<>0

funciona perfectamente

Si lo ejecuto paso a paso por el IBAdmin4, la cadena SQL_INS es exactamente igual a la consulta que muestro arriba, es decir, pienso que esta bien construida, pero arroja error al momento de llamar a la sentencia

Código SQL [-]
FOR EXECUTE STATEMENT SQL_INS
into :saldo,:id_auxiliar,:id_empresa,:id_sucursal,:id_tipo,:numero,:cuota,:fecha_DOC,:vencimiento,:id_ter  cero,:id_sucursal_tercero, :ID_VENDEDOR


Access Violation at address 007CCAA4 in module "IBAdmin.exe" .......

lo que pienso es que talvez este programa no soporta la instrucción.

pero
en el IBConsole hago el siguiente llamado

Código SQL [-]
SELECT * FROM cartera_proveedores_cadena(' ',' ',4,4,' and ('09/09/2004' - d.vencimiento) ',' ',' ',' ',' ',' ',' ')

Error:

ISC ERROR MESSAGE:
Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, char 62
09

Código SQL [-]

SELECT * FROM cartera_proveedores_cadena(" "," ",4,4," and ('09/09/2004' - d.vencimiento) "," "," "," "," "," "," ")

Error

ISC ERROR MESSAGE:
Dynamic SQL Error
expression evaluation not supported

Código SQL [-]

SELECT * FROM cartera_proveedores_cadena(" "," ",4,4," and (cast('09/09/2004' as date) - d.vencimiento) "," "," "," "," "," "," ")

ISC ERROR MESSAGE:
expression evaluation not supported

STATEMENT:
TIBOInternalDataset: "<TApplication>.frmMain.dlgWisql.<TIBOQuery>.<TIBOInternalDataset>."

quito lo del filtro de fechas y tambien funciona en el IBconsole

Código SQL [-]
SELECT SUM(e.DEBITO-e.CREDITO) AS SALDO, e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE, e.numero_cruce, E.CUOTA_CRUCE,
d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR FROM CUENTAS_POR_TERCERO e , cuentas_por_tercero d
where e.ID_EMPRESA_CRUCE=d.ID_EMPRESA and e.ID_SUCURSAL_CRUCE=d.ID_SUCURSAL AND E.CUOTA_CRUCE=D.CUOTA
and e.ID_TIPO_DOC_CRUCE= d.id_tipo_doc and e.numero_cruce=d.numero  AND e.ID_EMPRESA = 1  AND E.ID_SUCURSAL=1
and e.id_tercero =1 AND E.ID_VENDEDOR=1 AND E.ID_SUC_VENDEDOR=1
and e.id_sucursal_tercero=1   and e.id_auxiliar =13050501
GROUP BY e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE,
e.numero_cruce, E.CUOTA_CRUCE , d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR
having SUM(e.DEBITO-e.CREDITO)<>0

respectivamente construyo exactamente esta misma cadena en el SP y lo llamo desde el ibconsole


Código SQL [-]

SELECT * FROM cartera_proveedores_cadena(" "," ",4,4," and (cast('09/09/2004' as date) - d.vencimiento) "," "," "," "," "," "," ")

O

Código SQL [-]

SELECT * FROM cartera_proveedores_cadena(' ',' ',4,4,' and ('09/09/2004' - d.vencimiento) ',' ',' ',' ',' ',' ',' ')

y arroja
ISC ERROR MESSAGE:
Variable type (position 6) in EXECUTE STATEMENT 'SELECT SUM(e.DEBITO-e.CREDITO) AS SALDO, e.ID_AUXI' INTO does not match return

No he podido con esto!!

guillotmarc 18-09-2004 20:25:40

Hola.

Cita:

Empezado por aurafern
Nota: al parametro pfecha lo cambie de tipo y tamaño por varchar(100), para no mandarle solo la fecha, sino la cadena

' and ('09/09/2004' - d.vencimiento) '

La sentencia SQL así

Código SQL [-]
SELECT SUM(e.DEBITO-e.CREDITO) AS SALDO, e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE, e.numero_cruce, E.CUOTA_CRUCE,
d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR FROM CUENTAS_POR_TERCERO e , cuentas_por_tercero d
where e.ID_EMPRESA_CRUCE=d.ID_EMPRESA and e.ID_SUCURSAL_CRUCE=d.ID_SUCURSAL AND E.CUOTA_CRUCE=D.CUOTA
and e.ID_TIPO_DOC_CRUCE= d.id_tipo_doc and e.numero_cruce=d.numero AND e.ID_EMPRESA = 1 AND E.ID_SUCURSAL=1
and e.id_tercero =1 AND E.ID_VENDEDOR=1 AND E.ID_SUC_VENDEDOR=1
and e.id_sucursal_tercero=1 and e.id_auxiliar =13050501
and ('09/09/2004' - d.vencimiento)>= 30 and ('09/09/2004' - d.vencimiento)<= 90
GROUP BY e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE,
e.numero_cruce, E.CUOTA_CRUCE , d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR
having SUM(e.DEBITO-e.CREDITO)<>0

funciona perfectamente

Si lo ejecuto paso a paso por el IBAdmin4, la cadena SQL_INS es exactamente igual a la consulta que muestro arriba, es decir, pienso que esta bien construida, pero arroja error al momento de llamar a la sentencia

Código SQL [-]
FOR EXECUTE STATEMENT SQL_INS
into :saldo,:id_auxiliar,:id_empresa,:id_sucursal,:id_tipo,:numero,:cuota,:fecha_DOC,:vencimiento,:id_ter  cero,:id_sucursal_tercero, :ID_VENDEDOR


Access Violation at address 007CCAA4 in module "IBAdmin.exe" .......

lo que pienso es que talvez este programa no soporta la instrucción.

No lo sé, no conozco el IBAdmin. Mi preferido es el IB-Expert. Pruébalo hay una trial de 30 dias (después te puedes instalar la versión personal, que es gratuita, aunque te quedas sin depurador de procedimientos almacenados).

Cita:

Empezado por aurafern
pero
en el IBConsole hago el siguiente llamado

Código SQL [-]
SELECT * FROM cartera_proveedores_cadena(' ',' ',4,4,' and ('09/09/2004' - d.vencimiento) ',' ',' ',' ',' ',' ',' ')

Error:

ISC ERROR MESSAGE:
Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, char 62
09

Código SQL [-]
 
SELECT * FROM cartera_proveedores_cadena(" "," ",4,4," and ('09/09/2004' - d.vencimiento) "," "," "," "," "," "," ")

Error

ISC ERROR MESSAGE:
Dynamic SQL Error
expression evaluation not supported

Código SQL [-]
 
SELECT * FROM cartera_proveedores_cadena(" "," ",4,4," and (cast('09/09/2004' as date) - d.vencimiento) "," "," "," "," "," "," ")

ISC ERROR MESSAGE:
expression evaluation not supported

STATEMENT:
TIBOInternalDataset: "<TApplication>.frmMain.dlgWisql.<TIBOQuery>.<TIBOInternalDataset>."

El problema es que las cadenas con las fechas no se construyen adecuadamente. Para indicar que hay una comilla dentro de un literal de cadena, tienes que poner dos comillas (no confundir con una doble comilla).

Es decir :

Código SQL [-]
SELECT * FROM cartera_proveedores_cadena(' ',' ',4,4,' and (''09/09/2004'' - d.vencimiento) ',' ',' ',' ',' ',' ',' ')

Cita:

Empezado por aurafern
quito lo del filtro de fechas y tambien funciona en el IBconsole

Código SQL [-]
SELECT SUM(e.DEBITO-e.CREDITO) AS SALDO, e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE, e.numero_cruce, E.CUOTA_CRUCE,
d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR FROM CUENTAS_POR_TERCERO e , cuentas_por_tercero d
where e.ID_EMPRESA_CRUCE=d.ID_EMPRESA and e.ID_SUCURSAL_CRUCE=d.ID_SUCURSAL AND E.CUOTA_CRUCE=D.CUOTA
and e.ID_TIPO_DOC_CRUCE= d.id_tipo_doc and e.numero_cruce=d.numero AND e.ID_EMPRESA = 1 AND E.ID_SUCURSAL=1
and e.id_tercero =1 AND E.ID_VENDEDOR=1 AND E.ID_SUC_VENDEDOR=1
and e.id_sucursal_tercero=1 and e.id_auxiliar =13050501
GROUP BY e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE,
e.numero_cruce, E.CUOTA_CRUCE , d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR
having SUM(e.DEBITO-e.CREDITO)<>0

respectivamente construyo exactamente esta misma cadena en el SP y lo llamo desde el ibconsole


Código SQL [-]
 
SELECT * FROM cartera_proveedores_cadena(" "," ",4,4," and (cast('09/09/2004' as date) - d.vencimiento) "," "," "," "," "," "," ")

O

Código SQL [-]
 
SELECT * FROM cartera_proveedores_cadena(' ',' ',4,4,' and ('09/09/2004' - d.vencimiento) ',' ',' ',' ',' ',' ',' ')

y arroja
ISC ERROR MESSAGE:
Variable type (position 6) in EXECUTE STATEMENT 'SELECT SUM(e.DEBITO-e.CREDITO) AS SALDO, e.ID_AUXI' INTO does not match return

No he podido con esto!!

Este mensaje de error indica que alguno de los valores que devuelve la consulta no es del mismo tipo que las variables conde intentamos asignarlo. Verifica el tamaño de las cadenas, decimales, etc. ...

Ánimo, cada vez estas más cerca de lograr que funcione.

Saludos.

aurafern 21-09-2004 00:33:51

Tenias toda la razon en lo de los tipos de datos, estaba colocando en las variables del into una de tipo smallint y en la tabla estaba como double. Pero sigo sin resolver lo de la fecha.

Ahora: la variable pfecha la declaro como date

Código SQL [-]

 EMPRESA VARCHAR(100),
    SUCURSAL VARCHAR(100),
    MODELO VARCHAR(15),
    NO_RANGOS INTEGER,
    PFECHA DATE)

declare variable P_DATA_D VARCHAR(200);
declare variable P_DATA_H VARCHAR(200);

 P_DATA_D = ' AND (''' || cast(:PFECHA as varchar(20)) || ''' - D.VENCIMIENTO) >= ' ||:DESDE;
 P_DATA_H = ' AND (''' || cast(:PFECHA as varchar(20)) || ''' - D.VENCIMIENTO) >= ' ||:HASTA;

SQL_INS= 'SELECT SUM(e.DEBITO-e.CREDITO) AS SALDO, e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE, e.numero_cruce, ';
SQL_INS=SQL_INS ||' d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR FROM CUENTAS_POR_TERCERO e , cuentas_por_tercero d ';
SQL_INS=SQL_INS ||' where e.ID_EMPRESA_CRUCE=d.ID_EMPRESA and e.ID_SUCURSAL_CRUCE=d.ID_SUCURSAL AND E.CUOTA_CRUCE=D.CUOTA ';
SQL_INS=SQL_INS ||' and e.ID_TIPO_DOC_CRUCE= d.id_tipo_doc and e.numero_cruce=d.numero ' ||:EMPRESA ||:SUCURSAL;
SQL_INS=SQL_INS ||:p_DATA_D ||:P_DATA_H;
SQL_INS=SQL_INS ||' GROUP BY e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE, ';
SQL_INS=SQL_INS ||' e.numero_cruce, d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR ';
SQL_INS=SQL_INS ||' having SUM(e.DEBITO-e.CREDITO)<>0 ';
FOR EXECUTE STATEMENT SQL_INS
into :saldo,:id_auxiliar,:id_empresa,:id_sucursal,:id_tipo,:numero,:fecha_DOC,:vencimiento,:id_tercero,:i  d_sucursal_tercero, :ID_VENDEDOR
DO

lo ejecuto desde IB-Expert personal y sigue devolviendo el error

Unsuccessful execution caused by a system error that preclude
successful execution of subsequent statements
Dynamic SQL Error
expression evaluation not supported

le coloque los parametros asi

empresa and e.id_empresa=1
sucursal and e.id_sucursal=1
modelo 4
no_rango 4
pfecha 09/20/2004

entonces sigo sin entender...

En el ibAdmin como si lo puedo ejecutar paso a paso
observo que la cadena SQL_INS, se construye bien.

Código SQL [-]
SELECT SUM(e.DEBITO-e.CREDITO) AS SALDO, e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE,
e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE, e.numero_cruce, d.fecha, d.vencimiento,
e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR FROM CUENTAS_POR_TERCERO e ,cuentas_por_tercero d
 where e.ID_EMPRESA_CRUCE=d.ID_EMPRESA and e.ID_SUCURSAL_CRUCE=d.ID_SUCURSAL AND E.CUOTA_CRUCE=D.CUOTA
 and e.ID_TIPO_DOC_CRUCE= d.id_tipo_doc and e.numero_cruce=d.numero
 and e.id_empresa=1 and e.id_sucursal=1
  AND ('20-SEP-2004' - D.VENCIMIENTO) >= -9999 AND ('20-SEP-2004' - D.VENCIMIENTO) >= -30
  GROUP BY e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE, e.numero_cruce,
   d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR
   having SUM(e.DEBITO-e.CREDITO)<>0

voy al IBConsole pego esta cadena resultante de sql_ins y la ejecuto y funciona ....entonces no entiendo porque mientras está en el procedimiento almacenado no funciona.

Saludos.

Muchas gracias por el interes prestado!

guillotmarc 21-09-2004 14:16:07

Hola.

El caso es que este error suele aparecer cuando la base de datos está corrupta. Prueba a hacer un Backup y posterior Restore de la Base de Datos (con esto la vuelves a construir y te aseguras de que es totalmente coherente).

Otro problema que le veo, es que SUM(e.DEBITO-e.CREDITO) quizá no es del tipo que te esperas. Será mejor que hagas un CAST del resultado, es decir que lo sustituyas por cast(sum(e.DEBITO-e.CREDITO) as numeric(18,4)) (He puesto numeric(18,4) pero tienes que poner el tipo que utilizas en la variable que lo va a recoger).

Saludos.

aurafern 21-09-2004 17:48:25

Hice todo lo que me dijiste, pero nada que funciona lo de la fecha:

Si le quito el filtro de la fecha funciona el SP.

La cadena se construyó así:

Código SQL [-]
SELECT CAST(SUM(e.DEBITO-e.CREDITO) AS DOUBLE PRECISION) AS SALDO,
e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE,
e.numero_cruce, d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR
FROM CUENTAS_POR_TERCERO e , cuentas_por_tercero d where e.ID_EMPRESA_CRUCE=d.ID_EMPRESA
and e.ID_SUCURSAL_CRUCE=d.ID_SUCURSAL AND E.CUOTA_CRUCE=D.CUOTA and e.ID_TIPO_DOC_CRUCE=
 d.id_tipo_doc and e.numero_cruce=d.numero AND ('21-SEP-2004' - D.VENCIMIENTO) >= -9999 AND
  ('21-SEP-2004' - D.VENCIMIENTO) <= 9999 GROUP BY e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE,
  e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE, e.numero_cruce, d.fecha, d.vencimiento,e.id_tercero,
  e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR having SUM(e.DEBITO-e.CREDITO)<>0

y funciona la sql_ins construida. Pero en el procedimiento sigue sin funcionar,


Ahora, En el IBConsole:

Noté, que si tomo la consulta y copio de allí la parte que tiene que ver con pfecha.....

Código SQL [-]

 AND ('21-SEP-2004' - D.VENCIMIENTO) >= -9999 AND
  ('21-SEP-2004' - D.VENCIMIENTO) <= 9999


y la pego en le procedimiento en el lugar correspondiente aparece así

Código SQL [-]

 AND ('21-SEP-2004' - D.VENCIMIENTO) >= -9999 AND
  ('21-SEP-2004' - D.VENCIMIENTO) <= 9999

Lo que creo es que no arma bien la fecha, por eso me sale column unknown SEP, pero, la he cambiado de n modos para corregir este error y casi que de todos los modos que pruebo me arroja "General SQL error, expression evaluation not supported."

Creo que de pronto sigo pasando mal los parametros aunque ya he probado todas las combinaciones que he podido:

desde delphi vienen asi:
Código Delphi [-]
query2.close;
query2.ParamByName('empresa').AsString:=' AND E.ID_EMPRESA=1 ';
query2.ParamByName('sucursal').AsString:=' AND E.ID_SUCURSAL=1 ';
Query2.ParamByName('modelo').AsiNTEGER:=4;
Query2.ParamByName('no_rango').AsInteger:=4;
query2.ParamByName('PFECHA').AsDateTIME:= int(mdFECHA.AsDateTime);
query2.open;

y en el procedimiento aparecen asi:

Código SQL [-]
 EMPRESA VARCHAR(100),
  SUCURSAL VARCHAR(100),
  MODELO INTEGER,
  NO_RANGOS INTEGER,
  PFECHA TIMESTAMP

la consulta problema es:

Código SQL [-]
P_DATA_D = ' AND (''' || cast(:PFECHA as varchar(20)) || ''' - D.VENCIMIENTO) >= ' ||:DESDE;
 P_DATA_H = ' AND (''' || cast(:PFECHA as varchar(20)) || ''' - D.VENCIMIENTO) >= ' ||:HASTA;

SQL_INS= 'SELECT CAST(SUM(e.DEBITO-e.CREDITO) AS DOUBLE PRECISION) AS SALDO, e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE, e.numero_cruce, ';
SQL_INS=SQL_INS ||' d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR FROM CUENTAS_POR_TERCERO e , cuentas_por_tercero d ';
SQL_INS=SQL_INS ||' where e.ID_EMPRESA_CRUCE=d.ID_EMPRESA and e.ID_SUCURSAL_CRUCE=d.ID_SUCURSAL AND E.CUOTA_CRUCE=D.CUOTA ';
SQL_INS=SQL_INS ||' and e.ID_TIPO_DOC_CRUCE= d.id_tipo_doc and e.numero_cruce=d.numero ' ||:EMPRESA ||:SUCURSAL;
SQL_INS=SQL_INS ||:p_DATA_D ||:P_DATA_H;
SQL_INS=SQL_INS ||' GROUP BY e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE, ';
SQL_INS=SQL_INS ||' e.numero_cruce, d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR ';
SQL_INS=SQL_INS ||' having SUM(e.DEBITO-e.CREDITO)<>0 ';
FOR EXECUTE STATEMENT SQL_INS
into :saldo,:id_auxiliar,:id_empresa,:id_sucursal,:id_tipo,:numero,:fecha_DOC,:vencimiento,:id_tercero,:i  d_sucursal_tercero, :ID_VENDEDOR

Saludos!!

guillotmarc 21-09-2004 18:38:05

Hola

Cita:

Empezado por aurafern
Ahora, En el IBConsole:

Noté, que si tomo la consulta y copio de allí la parte que tiene que ver con pfecha.....

Código SQL [-]
 
AND ('21-SEP-2004' - D.VENCIMIENTO) >= -9999 AND
('21-SEP-2004' - D.VENCIMIENTO) <= 9999


y la pego en le procedimiento en el lugar correspondiente aparece así

Código SQL [-]
 
AND ('21-SEP-2004' - D.VENCIMIENTO) >= -9999 AND
('21-SEP-2004' - D.VENCIMIENTO) <= 9999

Lo que creo es que no arma bien la fecha, por eso me sale column unknown SEP, pero, la he cambiado de n modos para corregir este error y casi que de todos los modos que pruebo me arroja "General SQL error, expression evaluation not supported."

Hola, pensaba que esto ya lo teniamos superado. La fecha tiene que estar en formato '09/21/2004' y no '21-SEP-2004'.

Cita:

Empezado por aurafern
Creo que de pronto sigo pasando mal los parametros aunque ya he probado todas las combinaciones que he podido:

desde delphi vienen asi:
Código Delphi [-]
query2.ParamByName('PFECHA').AsDateTIME:= int(mdFECHA.AsDateTime);

y en el procedimiento aparecen asi:

Código SQL [-]
PFECHA TIMESTAMP

¿ Porqué no pasas la fecha, directamente como cadena ?. Con un parámetro varchar(10), y una asignación del tipo :

query2.ParamByName('PFECHA').AsString := FormatDateTime('mm/dd/yyyy', mdFECHA.AsDateTime);

Saludos.

aurafern 21-09-2004 21:35:53

Esa fue una de las formas como lo probe y me sale
"General SQL error, expression evaluation not supported."

Saludos!!

guillotmarc 22-09-2004 11:41:05

Hola.

Te aseguro de que esa es la forma de especificar una fecha en una cadena (puedes comprobarlo ejecutando una pequeña consulta directamente en el IBConsole).

El error te lo debería provocar algún otro problema en la sentencia.

Saludos.

aurafern 22-09-2004 18:06:21

Hola!

Te cuento que he probado dandole el siguiente valor a P_DATA_d

Código SQL [-]
P_DATA_D = ' AND (D.VENCIMIENTO <= ''' ||:PFECHA|| ''') ';

SQL_INS= 'SELECT CAST(SUM(e.DEBITO-e.CREDITO) AS DOUBLE PRECISION) AS SALDO, e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE, e.numero_cruce, ';
SQL_INS=SQL_INS ||' d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR FROM CUENTAS_POR_TERCERO_X e , cuentas_por_tercero_x d ';
SQL_INS=SQL_INS ||' where e.ID_EMPRESA_CRUCE=d.ID_EMPRESA and e.ID_SUCURSAL_CRUCE=d.ID_SUCURSAL AND E.CUOTA_CRUCE=D.CUOTA ';
SQL_INS=SQL_INS ||' and e.ID_TIPO_DOC_CRUCE= d.id_tipo_doc and e.numero_cruce=d.numero ' ||:EMPRESA ||:SUCURSAL;
SQL_INS=SQL_INS ||:p_DATA_D;
SQL_INS=SQL_INS ||' GROUP BY e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE, ';
SQL_INS=SQL_INS ||' e.numero_cruce, d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR ';
SQL_INS=SQL_INS ||' having SUM(e.DEBITO-e.CREDITO)<>0 ';
FOR EXECUTE STATEMENT SQL_INS
into :saldo,:id_auxiliar,:id_empresa,:id_sucursal,:id_tipo,:numero,:fecha_DOC,:vencimiento,:id_tercero,:i  d_sucursal_tercero, :ID_VENDEDOR
DO
   BEGIN
nhjghggg
 end

y funciona perfectamente pasandole los parametros asi
Código Delphi [-]
query6.ParamByName('PFECHA').AsDateTIME:= int(mdFECHA.AsDateTime);
o asi
Código Delphi [-]
query6.ParamByName('PFECHA').AsSTRING :=Formatdatetime('mm/dd/yyyy',mdFECHA.AsDateTime);

y pienso que la cadena de la fecha para colocarla en una consulta construida es que no funciona.. o sera que me equivoco?

si la consulta no es construida funciona perferct,

Código SQL [-]
FOR SELECT SUM(e.DEBITO-e.CREDITO) AS SALDO, e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE, e.numero_cruce, E.CUOTA_CRUCE,
d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR FROM CUENTAS_POR_TERCERO e , cuentas_por_tercero d
where e.ID_EMPRESA_CRUCE=d.ID_EMPRESA and e.ID_SUCURSAL_CRUCE=d.ID_SUCURSAL AND E.CUOTA_CRUCE=D.CUOTA
and e.ID_TIPO_DOC_CRUCE= d.id_tipo_doc and e.numero_cruce=d.numero  AND e.ID_EMPRESA =:EMPRESA AND E.ID_SUCURSAL =:SUCURSAL
and (:pfecha - d.vencimiento)>=:desde and (:pfecha - d.vencimiento)<=:hasta 
GROUP BY e.ID_AUXILIAR,e.ID_EMPRESA_CRUCE, e.ID_SUCURSAL_CRUCE,e.ID_TIPO_DOC_CRUCE,
e.numero_cruce, E.CUOTA_CRUCE , d.fecha, d.vencimiento,e.id_tercero,e.ID_SUCURSAL_TERCERO, E.ID_VENDEDOR
having SUM(e.DEBITO-e.CREDITO)<>0

pero si toca armarla, hay algo en la construccion de la cadena que resta las fechas que no la deja funcionar.

Ahora yo me pregunto: Porqué cuando la construya si funciona la comparación de las dos fechas y la resta no?


Saludos!!

aurafern 01-10-2004 21:09:11

Gracias por haberme tenido tanta paciencia!

El problema se resolvió teniendo en cuenta los valiosos consejos de Guillotmarc y a la colaboracion de Panta Llunel, quien me sugirio la siguiente instrucción

Código SQL [-]
P_DATA_D = ' AND ( D.VENCIMIENTO+' || cast(:desde as varchar(4)) || ') >= 
''' || cast(:PFECHA as varchar(10)) || '''' ; 
P_DATA_H = ' AND ( D.VENCIMIENTO+' || cast(:hasta as varchar(4)) || ') <= 
''' || cast(:PFECHA as varchar(10)) || '''' ;

Haciendo despejes en la desigualdad. Es decir, pasar el campo vencimiento al otro lado de la desigualdad.

Muchas gracias de nuevo.

Utilizando execute statement, me ahorraré mucho trabajo y lograré una mayor eficiencia en algunos problemas que tengo que resolver
:D Que descanso!! :o


La franja horaria es GMT +2. Ahora son las 00:56:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi