Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-05-2008
Avatar de pmtzg
pmtzg pmtzg is offline
Miembro
 
Registrado: jul 2007
Posts: 179
Poder: 17
pmtzg Va por buen camino
Question 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
Responder Con Cita
  #2  
Antiguo 23-05-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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
Responder Con Cita
  #3  
Antiguo 23-05-2008
Avatar de pmtzg
pmtzg pmtzg is offline
Miembro
 
Registrado: jul 2007
Posts: 179
Poder: 17
pmtzg Va por buen camino
Question 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
Responder Con Cita
  #4  
Antiguo 25-05-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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.
Responder Con Cita
  #5  
Antiguo 25-05-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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.
Responder Con Cita
Respuesta



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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Consulta complicadilla en Firebird Val SQL 2 08-06-2007 17:10:48
Consulta SQL en Firebird Nelly SQL 1 06-04-2007 05:18:48
consulta en firebird cahosoft Firebird e Interbase 6 08-03-2007 21:56:59
consulta en Firebird 1.5.3 pvizcay Firebird e Interbase 5 01-12-2006 01:27:27
Consulta con Firebird senpiterno Firebird e Interbase 1 20-12-2004 23:57:39


La franja horaria es GMT +2. Ahora son las 11:58:09.


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
Copyright 1996-2007 Club Delphi