Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Paradox - Firebird: Una paradoja

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Paradox - Firebird: Una paradoja Responder citando

Tengo dos tablas con idénticos datos en Paradox y en Firebird. Ejecuto este query:
Código:
SELECT Apellidos, Nombre, C_refer FROM Personas WHERE F_baja IS NULL AND F_alta IS NOT NULL AND Situacion = 'A' AND Cuota > 0 AND C_refer NOT IN (SELECT DISTINCT C_refer FROM Recibos)

con los pertinentes cambios (Personas.db en vez de Personas, por ejemplo)... y en Firebird no se ejecuta, teniendo que parar el servicio para poder salir de la aplicación, mientras en Paradox tarda escasamente 5 ó 10 segundos. ¿Alguien se lo explica?
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Que tal Angel, pues no sé si tenga que ver con el manejo de NULL pero te recomiendo que eches un vistazo al siguiente manual, tal vez encuentres algo.

http://www.firebirdsql.org/manual/es/nullguide-es.html

Saludos!
_________________
Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Gracias por la respuesta. He estado echando una ojeada al enlace que me has dado, pero por otra parte he descubierto que el problema no está en los NULL y sí en el SELECT IN; es aquí donde se queda pillado. La tabla firebird de recibos contra la que estoy trabajando tiene ahora mismo algo más de 54.000 registros (88.000 en paradox) y es al hacer la SUBSELECT donde se pierde.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Haciendo pruebas confirmo el problema:
    - La SUBSELECT funciona perfectamente y genera una lista de códigos.
    - La SELECT sin la clausula IN funciona perfectamente

Es la combinación de ambas la que falla. Y no sé como resolverlo.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Otra paradoja más. Esta es con IBManager. SI ejecuto este query:
Código:
SELECT DISTINCT C_refer FROM Recibos WHERE CodProv = '45'

en IBManager me devuelver una tabla con 54.489 registros; los mismos que la tabla. Pero si lo ejecuto desde el programa me devuelve 11.257. ¿No es un poco absurdo?
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola, he pensado que tal vez sea algun tipo de incompatibilidad entre la version del firebird y el componente que usas.

Prueba usando otros componentes (de otra tecnologia) y otras versiones
del Firebird e Interbase.

He estado usando DBExpress debido a que se dijo los compos IB no iban a trabajar bien con Firebird, por desgracia estos no manejan las transacciones complejas de una forma tan limpia como los IB, tampoco me devuelven bien las excepciones creadas en la BD.

Estoy en periodo de prueba con los IB contra las nuevas versiones del Firebird y creo que los chicos programadores de este motor de datos se han cuidado de mantener una buena compatibilidad "hacia atras" pues de momento no he tropezado con ningun inconveniente.

Si detecto algo anormal publicare los defectos por este medio.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola a todos, yo no uso firebird por lo tanto solo voy a hace un comentario
angel dice
Cita:

IBManager me devuelver una tabla con 54.489 registros; los mismos que la tabla.

si en la consulta pones esto
Código:

SELECT DISTINCT C_refer FROM Recibos

deberia devolver la misma cantidad de registro q se encuentra en la tabla osea todos.
En entonses pregunto no se estará interpretando mal la condicion que esta en "where" no se en el IBManager, pero en los clientes mysql suele pasar que se interpreta mal las comillas y esto causa resultados no esperados.
Ahora yo probaria condiciones como
Código:

SELECT C_refer FROM Recibos where CodProv=45

supongo que 45 esta en la tabla, por ej prueba con un valor que no este contenido en el conjunto.
espero te sirva de algo este comentario
saludos Tor
_________________
Un experto es aquel que ya ha cometido todos los errores posibles en una materia muy concreta.
(Niels Bohr)
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

Gracias por el comentario; hay algunas cosas que no se me habían ocurrido y las probaré en cuanto pueda.
Tor escribió:
si en la consulta pones esto
Código:
SELECT DISTINCT C_refer FROM Recibos

deberia devolver la misma cantidad de registro q se encuentra en la tabla osea todos.

No tiene por qué devolver todos ya que puede haber, y de hecho así es, más de un recibo para cada código de referencia. Por programa me dice que hay esos 11.257 referencias diferentes. Más bien pienso que es un problema del motor del IBManager.
Tor escribió:
supongo que 45 esta en la tabla, por ej prueba con un valor que no este contenido en el conjunto.

Sí, el 45 es el distintivo provincial y está en todos los registros de la tabla.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

En mi caso hago una consulta del tipo detalles con calculos promedios sobre varias tablas relacionadas, la tabla de detalles tiene 128.544 registros y me tarda 5 seg 282 ms. y tira adelante con todo sin problemas.

Código:

SELECT
  HISTORICOARTICULOS.DESCRIPCION,
  SUM(UNIDADES) AS CANTIDAD,
  SUM(PVP * UNIDADES) AS TOTALVENTA,
  SUM(COSTE * UNIDADES) AS TOTALCOSTE,
  MIN(PVP) AS MINIMO,
  MAX(PVP) AS MAXIMO,
  AVG(PVP) AS PROMEDIO,
  (SUM(PVP * UNIDADES) - SUM(COSTE * UNIDADES)) AS BENEFICIO
FROM
 HIST_TIQUETS_DET,
 HISTORICOARTICULOS
WHERE
  (COD_ARTICULO = CODHISTARTICULOS)
  AND
  (HIST_TIQUETS_DET.TIQUET IN
                           (SELECT NUM_TIQUET FROM HIST_TIQUETS WHERE FECHA >= '01-01-2002' AND FECHA <= '12-31-2008'))
GROUP BY
  HISTORICOARTICULOS.DESCRIPCION;


Utilizo Interbase 2007.
Esta consulta maneja:
Lecturas Indexadas HistoricoArticulos = 128.544
Lecturas Indexadas Hist_Tiquets = 128.544
Lecturas NO Indexadas Hist_Tiquets_Det = 128.544
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.