Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-09-2004
aurafern aurafern is offline
Miembro
 
Registrado: dic 2003
Posts: 34
Poder: 0
aurafern Va por buen camino
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 (fecha - d.vencimiento)>=:desde and (fecha - d.vencimiento)<=:hasta and e.id_tercero like(tercero) AND E.ID_VENDEDOR LIKE (:PVENDEDOR) AND E.ID_SUC_VENDEDOR LIKE (:PSUC_VENDEDOR)
and e.id_sucursal_tercero like (suc_tercero) and e.id_auxiliar like (cuenta)
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!!
Responder Con Cita
  #2  
Antiguo 15-09-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 26
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #3  
Antiguo 16-09-2004
aurafern aurafern is offline
Miembro
 
Registrado: dic 2003
Posts: 34
Poder: 0
aurafern Va por buen camino
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)
);
Responder Con Cita
  #4  
Antiguo 16-09-2004
aurafern aurafern is offline
Miembro
 
Registrado: dic 2003
Posts: 34
Poder: 0
aurafern Va por buen camino
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,ESCRIPCION_RANGO,ESDE,: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 ( "'||fecha || '" - d.vencimiento)>= ' ||:desde || ' and ( "'||fecha || '" - d.vencimiento)<= ' ||:hasta;
SQL_INS=SQL_INS || tercero || :PVENDEDOR || :PSUC_VENDEDOR;
SQL_INS=SQL_INS || suc_tercero ||cuenta;
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 = fecha - :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
Responder Con Cita
  #5  
Antiguo 16-09-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 26
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #6  
Antiguo 17-09-2004
aurafern aurafern is offline
Miembro
 
Registrado: dic 2003
Posts: 34
Poder: 0
aurafern Va por buen camino
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 ( fecha - d.vencimiento)>= 30 and ( fecha - 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!!

Última edición por aurafern fecha: 17-09-2004 a las 17:33:44.
Responder Con Cita
  #7  
Antiguo 17-09-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 26
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 18:18:24.


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