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)
-   -   Una Consulta Sql en FireBird 2.1 (https://www.clubdelphi.com/foros/showthread.php?t=56652)

pmtzg 23-05-2008 02:13:41

Una Consulta Sql en FireBird 2.1
 
Hola Compañeros
Tengo la siguiente situación que deseo compartir con ustedes
y me gustaria que me dieran su punto de vista, quiza lo que voy a exponer es
una Tonteria de mi parte

tengo 2 tablas en FireBird 2.1 con los siguientes campos

fact.no_cve varchar (7)
cuen.no_factura varchar (7)
cuen.docto varchar (9)

si hago la siguiente cosnulta:
pero antes ya hice mi
Select y en el From hago la siguiente comparación

Código Delphi [-]
 
 
fact.no_cve = cuen.no_factura OR
trim(cuen.docto)=trim(fact.no_cve)

en FireBird la consulta se puede quedar toda la tarde y toda la noche
y nunca me regresa el resultado, es más la aplicación me dice
que no responde.

Pero si estas mismas tablas que pase de Paradox a FireBird
hago la consulta en Paradox se tarda un rato si quieres 2 o 3 hras
por que las tablas estan un poco cargaditas de información

pero si me regresa el resultado !!!! pero en firebird no
alguien me podria dar una ayudadita ?????

el porque busco o comparo en los dos campos
pues es que si el valor de fact.no_cve no es igual o no esta lo que busco en
cuen.no_factura, lo encuentro en cuen.docto
se muy bien que el campo cuen.docto es de (9)
y el campo fact.no_cve es de (7) por eso le meti el la funcion
Trim() y si me resulto en las tablas de Paradox Pero en FireBird No

alguien sabe que podria hacer ???
de antemano mil gracias por su apoyo

duilioisola 23-05-2008 08:38:44

Cita:

i hago la siguiente cosnulta:
pero antes ya hice mi
Select y en el From hago la siguiente comparación
Cual es la sentencia select completa? No la veo por ningún lado.

- Dinos cuál es la estructura de las tabla completa.
- Qué indices PKs y FKs tienen estas tablas?
- Qué es eso de la comparación en el From?

Normalmete las comparaciones se hacen en el WHERE:

SELECT campos
FROM tabla1
JOIN tabla 2
ON tabla1.campo=tabla2.campo
WHERE tabla1.campo=dato AND tabla2.campo=dato and tabla1.campo>tabla2.campo
ORDER BY tabla1.campo

pmtzg 23-05-2008 17:31:30

esta es mi colsulta
 
y estoy utilizando inner join

Código Delphi [-]
 
SELECT DISTINCT
inve01.clv_art, inve01.descr, inve01.lin_prod,
fa0ty1.tip_doc, fa0ty1.cve_doc, fa0ty1.cant,
fa0ty1.tip_sig, fa0ty1.doc_sig, fa0ty1.tip_ant,
fa0ty1.doc_ant, 
 fact01.fecha_doc, fact01.status, 
((fact01.can_tot-fact01.des_tot)+fact01.imp_tot4)
as totfac,
clie01.cclie, clie01.nombre,
cuen01.no_factura, cuen01.tipo_mov, cuen01.importe,
cuen01.docto, conc01.num_cpto, conc01.tipo
FROM
conc01 INNER JOIN(
cuen01 INNER JOIN(
clie01 INNER JOIN (fact01 INNER JOIN (fa0ty1 INNER JOIN
inve01 ON fa0ty1.cve_art=inve01.clv_art)
ON fa0ty1.cve_doc=fact01.cve_doc AND 
fa0ty1.tip_doc=fact01.tip_doc)
ON clie01.cclie=fact01.cve_clpv) 
ON cuen01.no_factura=fact01.cve_doc OR 
TRIM(cuen01.docto)=TRIM(fact01.cve_doc))
ON conc01.num_cpto=cuen01.tipo_mov
WHERE
inve01.clv_art Between  '1000' AND  '9000' AND
clie01.cclie  Between  '1' and  '5000' AND
fact01.fecha_doc Between '01/01/2007'and '12/31/2007'
AND inve01.lin_prod LIKE '%'
AND fa0ty1.tip_doc <> 'P' and fa0ty1.tip_doc <> 'C'
AND fa0ty1.tip_doc <> 'R' and fact01.status <> 'C'
ORDER BY inve01.clv_art, clie01.cclie, fact01.fecha_doc, fa0ty1.tip_doc

como puedes ver la consulta es un poco amplia
pero si quito esta parte :
Código Delphi [-]
OR 
TRIM(cuen01.docto)=TRIM(fact01.cve_doc))

si me da la consulta
pero la necesito por eso es q me dirijo a ustedes que tienen mas experiencia

duilioisola 25-05-2008 12:34:08

Bien, ahora solo te queda responder las otras dos cunsultas que te he hecho:

- Qué indices PKs y FKs tienen estas tablas?
Puede ser que no tengas indices correctos para cuen01 o fact01
- Qué es eso de la comparación en el From?

Prueba este select, a ver cómo te va:

Código SQL [-]
SELECT DISTINCT
inve01.clv_art, inve01.descr, inve01.lin_prod,
fa0ty1.tip_doc, fa0ty1.cve_doc, fa0ty1.cant,
fa0ty1.tip_sig, fa0ty1.doc_sig, fa0ty1.tip_ant,
fa0ty1.doc_ant,  fact01.fecha_doc, fact01.status, 
((fact01.can_tot-fact01.des_tot)+fact01.imp_tot4) as totfac,
clie01.cclie, clie01.nombre, cuen01.no_factura, 
cuen01.tipo_mov, cuen01.importe, cuen01.docto, 
conc01.num_cpto, conc01.tipo
FROM
conc01 

join cuen01 
on conc01.num_cpto=cuen01.tipo_mov

join fact01
ON cuen01.no_factura=fact01.cve_doc OR 
   TRIM(cuen01.docto)=TRIM(fact01.cve_doc)

join clie01
ON clie01.cclie=fact01.cve_clpv

join fa0ty1
ON fa0ty1.cve_doc=fact01.cve_doc AND 
   fa0ty1.tip_doc=fact01.tip_doc

join inve01
ON fa0ty1.cve_art=inve01.clv_art

WHERE
inve01.clv_art Between  '1000' AND  '9000' AND
clie01.cclie  Between  '1' and  '5000' AND
fact01.fecha_doc Between '01/01/2007'and '12/31/2007'
AND inve01.lin_prod LIKE '%'
AND fa0ty1.tip_doc <> 'P' and fa0ty1.tip_doc <> 'C'
AND fa0ty1.tip_doc <> 'R' and fact01.status <> 'C'
ORDER BY inve01.clv_art, clie01.cclie, fact01.fecha_doc, fa0ty1.tip_doc
que debería ser igual a tu select
Código SQL [-]
SELECT DISTINCT
inve01.clv_art, inve01.descr, inve01.lin_prod,
fa0ty1.tip_doc, fa0ty1.cve_doc, fa0ty1.cant,
fa0ty1.tip_sig, fa0ty1.doc_sig, fa0ty1.tip_ant,
fa0ty1.doc_ant,  fact01.fecha_doc, fact01.status, 
((fact01.can_tot-fact01.des_tot)+fact01.imp_tot4) as totfac,
clie01.cclie, clie01.nombre, cuen01.no_factura, 
cuen01.tipo_mov, cuen01.importe, cuen01.docto, 
conc01.num_cpto, conc01.tipo
FROM
conc01 INNER JOIN(cuen01 INNER JOIN(clie01 INNER JOIN (fact01 INNER JOIN (fa0ty1 INNER JOIN inve01 
                                                                                 ON fa0ty1.cve_art=inve01.clv_art)
                                                              ON fa0ty1.cve_doc=fact01.cve_doc AND 
                                                                 fa0ty1.tip_doc=fact01.tip_doc)
                                           ON clie01.cclie=fact01.cve_clpv) 
                                           ON cuen01.no_factura=fact01.cve_doc OR 
                                              TRIM(cuen01.docto)=TRIM(fact01.cve_doc))
       ON conc01.num_cpto=cuen01.tipo_mov
WHERE
inve01.clv_art Between  '1000' AND  '9000' AND
clie01.cclie  Between  '1' and  '5000' AND
fact01.fecha_doc Between '01/01/2007'and '12/31/2007'
AND inve01.lin_prod LIKE '%'
AND fa0ty1.tip_doc <> 'P' and fa0ty1.tip_doc <> 'C'
AND fa0ty1.tip_doc <> 'R' and fact01.status <> 'C'
ORDER BY inve01.clv_art, clie01.cclie, fact01.fecha_doc, fa0ty1.tip_doc

- Tampoco veo como unes cuen01 con clie01. Esto puede hacer que hagas más lecturas de las necesarias...
- Prueba a usar RTRIM (). Esta función quita los espacios de la derecha y quizás sea mejor para hacer comparaciones. (podrá utilizar índices sobre los campos)
- Si estas cosas no funcionan, prueba a crear campos nuevos trim_docto y trim_cve_doc calculándolos en un trigger.

duilioisola 25-05-2008 12:41:19

Ahora que releo tu mensaje:
Cita:

...se muy bien que el campo cuen.docto es de (9)
y el campo fact.no_cve es de (7) por eso le meti el la funcion
Trim()...
Creo que no es necesario que utilices el Trim(). Prueba a hacer el select sin el trim. Debería funcionar correctamente.

De todos modos, mira como unes las tablas. cuen01 no está unida a clie01 y esto puede hacer que leas más cosas de lo necesario.


La franja horaria es GMT +2. Ahora son las 15:10:16.

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