Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
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 23-08-2011
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.418
Poder: 24
fjcg02 Va camino a la fama
A bote pronto, parece que el formato que traga es MM/DD/YYYY HH:MM:SS

y tu le estás pasando DD/MM/YYYY HH:MM:SS

Prueba a ver cambiando el orden.

por otro lado, no puedes hacer el cast de string timestamp directamente ?

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #2  
Antiguo 24-08-2011
juanlito juanlito is offline
Miembro
NULL
 
Registrado: ago 2011
Ubicación: Jerez de la Frontera
Posts: 14
Poder: 0
juanlito Va por buen camino
Muchas gracias fjcg02
Acertaste de pleno con el problema, es que como yo ya tenia las consultas hechas y sobre access me iban bien pues no pense que el formato de la fecha me cambiase ahora, pero por lo visto he de tener mas cuidado.

Al igual que dije con la consulta anterior, si este hilo ya ha perdido su razon de ser y tengo que abrir otro me lo comentais y lo hago, pero mientras tanto sigo aqui porque en realidad es todo sobre lo mismo,(o al menos asi lo creo)

Sigo modificando todo mi codigo para que me funcione con firebird en vez de access y me he encontrado otro problema, tengo una consulta algo compleja (la terminaba con codigo en delphi sacando datos de varios querys ) que he decidido hacerla con un otro SP (le estoy cogiendo el gustito) pero me da error, a continuacion voy a poner el codigo y explicar lo que quiero que haga, quizas este mal pero viendo otros hilos en el foro he creido que era la forma adecuada.

Código SQL [-]
 
CREATE OR ALTER PROCEDURE COMP_GUAN_PLATA 
returns (
    CALLING varchar(255),
    CALLT timestamp,
    CALLED varchar(255))
as
declare variable LINEA varchar(255);
declare variable LON integer;
begin
  /* Procedure Text */
 FOR SELECT GUAN.callingnumber, GUAN.callednumber, GUAN.calltime FROM guan
 INTO :CALLING, :CALLED, :CALLT    DO
 BEGIN
   LON =  CHAR_LENGTH (:CALLED);
   if (:LON > 9) then
   begin
     CALLED = left(:CALLED,:LON-4);
     CALLED = :CALLED ||'XXXX';
   end
   CALLED = :CALLED ||'%';
   SELECT PLAT.LINEA FROM PLAT WHERE (((PLAT.LINEA) = :CALLING) 
AND ((PLAT.DESTINO) Like :CALLED) AND ((PLAT.FECHA_HORA_INICIO)>DateAdd(hour,-2,:CALLT) 
And (PLAT.FECHA_HORA_INICIO)hour,2,:CALLT)))
   INTO :LINEA ;
   if (:LINEA IS NULL) then
   begin
    EXIT;
    suspend;
   end
   else
   CALLED = null;
   CALLT = null;
   CALLING = null;
  suspend;
 END

tengo 2 tablas, guan y plat, tengo que comparar si todos los registros de guan se encuentra en plat, y mostrar los que no se encuentren, hasta ahi todo simple, el problema es que tengo que modificar un campo de guan para que coincida con plat (siempre tienen la misma diferencia) y luego quiero que esos registros seo se produzca casi en la misma fecha y hora, he usado un intervalo de 2 horas arriba - 2 horas abajo.

como el SP me devuelve solo un registro, luego uso un IBquery con sql: select * from COMP_GUAN_PLATA , para que me muestre todos los registros resultantes.

Me da un error cuando lo ejecuto en el IBExpert. diciendo: "multiples rows in singleton select", esto sera debido porque puede darse el caso de que en el intervalo que uso de 4 horas pueda repetirse el registro, pero a mi solo me interesa que no se de nunca, si se da una o varias me da igual, no se mostraria en ninguno de los 2 casos, solo cuando no exista.

Espero despues de este parrafon haberme explicado con claridad.

Gracias
Responder Con Cita
  #3  
Antiguo 24-08-2011
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.418
Poder: 24
fjcg02 Va camino a la fama
Código SQL [-]
   SELECT PLAT.LINEA FROM PLAT WHERE (((PLAT.LINEA) = :CALLING) 
AND ((PLAT.DESTINO) Like :CALLED) AND ((PLAT.FECHA_HORA_INICIO)>DateAdd(hour,-2,:CALLT) 
And (PLAT.FECHA_HORA_INICIO)hour,2,:CALLT)))
   INTO :LINEA ;
   if (:LINEA IS NULL) then
   begin
    EXIT;
    suspend;
   end
Cambia estas sentencia por
Código SQL [-]
   SELECTcount( PLAT.LINEA) FROM PLAT WHERE (((PLAT.LINEA) = :CALLING) 
AND ((PLAT.DESTINO) Like :CALLED) AND ((PLAT.FECHA_HORA_INICIO)>DateAdd(hour,-2,:CALLT) 
And (PLAT.FECHA_HORA_INICIO)hour,2,:CALLT)))
   INTO :VECES ;
   if (:VECES IS NULL)  then
   begin
    EXIT;
    suspend;
   end

Preguntas cuantos registros cumplen, y ya está. Tengo la duda de que si no hay registros te devuelve null o 0. Compruebalo y nos cuentas.
No puedes devolver en una variable varios valores, que es lo que ocurre cuando hay más de un registro.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #4  
Antiguo 24-08-2011
juanlito juanlito is offline
Miembro
NULL
 
Registrado: ago 2011
Ubicación: Jerez de la Frontera
Posts: 14
Poder: 0
juanlito Va por buen camino
Muchas Gracias,

Creo que me funciona, he tenido que poner IF (:LINEA = 0) y quitar la linea EXIT (realmente no se porque, ni porque la he quitado ni porque tenia que ir), en este caso el IBExpert me muestra los datos, pero me muestra muchas lineas con null, con lo cual he intentado en mi apliacion no mostrarlo,en vez de usar el codigo para el IBQUERY:

Código SQL [-]
 
SELECT * FROM COMP_GUAN_PLATA

uso

Código SQL [-]
 
SELECT * FROM COMP_GUAN_PLATA
WHILE (CALLING IS NOT NULL) AND (CALLED IS NOT NULL)

Con esto me muestra los datos, creo que correctos, pero el problema es que tanto en el IBExpert, como en el Grid que tengo enlazado al IBQuery, cuando intento moverme por los registros necesitan segundos para refrescar, en el grid me va algo mejor que en el IBExpert, hay alguna forma de mejorar esto.

Podria alguien explicarme porque no he tenido que usar el EXIT? o en que casos se suele usar.( esto no es que me haga falta para mi codigo ahora, sino por aprender para un futuro, para entenderlo mejor)

Creo que ya con esto ya podre migrar la aplicacion entera, tengo mucho mas codigo que cambiar pero casi todo es consultas bastante similares a esta ultima.

Muchisimas gracias a todos y a ver si voy mejorando para poder yo tambien colaborar ayudando a otros.
Responder Con Cita
  #5  
Antiguo 25-08-2011
juanlito juanlito is offline
Miembro
NULL
 
Registrado: ago 2011
Ubicación: Jerez de la Frontera
Posts: 14
Poder: 0
juanlito Va por buen camino
Buenas, se que quizas no pueda pedir mas, ya que las tablas tienen bastantes registros unos 200000 cada una, pero este ultimo SP del que he hablado, me tarda 15 minutos en mostrarme datos, se que antes era mas de 2 horas, y que he Optimizado mucho, pero aun asi para que el cliente decida, ahora veo datos, y necesite 15 minutos pues..... ya saben se aburre de esperar.

Podria hacerlo de alguna otra forma que mejorase mas aun, las pruebas ya las estoy haciendo con la BD en otro equipo remoto, para que salga como el resultado final.

Ganaria velocidad si reduzco el numero de columnas de las tablas, en realidad las tablas tienen muchos campos que no uso, con menos campos en las tablas seria mas rapido o eso influye poco?

Gracias de antemano.
Responder Con Cita
  #6  
Antiguo 25-08-2011
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.418
Poder: 24
fjcg02 Va camino a la fama
Hola Juanlito:

yo intentaría varias cosas:
- hacer todo en una sola query, es decir, con 'CASE' intentar hacer en una sola select lo que haces en el procedimiento almacenado. Si lo consigues, podrías dejarlo en una vista en lugar de un procedimiento almacenado.
- Revisar que los campos por los que preguntas, cruzas y filtras tienen indices. Si no tienen, añadirlos y ver si afecta al rendimiento cuando se hacen las inserciones, ya que al motor le costará algo más.
- Intentar cambiar de la condición ((PLAT.DESTINO) Like :CALLED) el 'like' y poner '=' ( si puedes ).

Ya nos contarás. Si tienes alguna dificultad, ponnos la bbdd con información para que podamos probar.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #7  
Antiguo 01-09-2011
juanlito juanlito is offline
Miembro
NULL
 
Registrado: ago 2011
Ubicación: Jerez de la Frontera
Posts: 14
Poder: 0
juanlito Va por buen camino
Ante todo disculparme por el retraso en responder, me han surgido otras cosas que me tienen muy ocupado y no he podido avanzar con mi problema, ni probar cosas nuevas.

Muchas gracias por tus sugerencias, en cuanto tenga un rato las probare como es debido.

Lo de los indices, deberia de estar indexado pero lo comprobare, como los datos vienen importados de access quizas algunos indices no sean los mejores, vi que se habian creado indices y por eso no les presté la debida atencion.

Con respecto a hacer una sola query con CASE, realmente no se como hacerlo, si hubiera sabido ten por seguro que no tendria un codigo tan complejo, pero viendo que me lo das como opcion( creia que no se podia hacer), me documentare de como podria hacer que mi codigo se redujese a un query.

Sobre el ultimo punto, hice una prueba rapida, y cambiando el 'like' por '=' la verdad es que no note mejora, no calcule exactamente pero estara en el mismo tiempo.

Un saludo y seguire informando de los avances cuando pueda ir probando.

Muchas Gracias
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Optimización! Optimización! PiornoCKA&G Varios 1 31-12-2006 20:45:30
Optimización Rendimiento dB amesoft SQL 1 05-08-2006 06:26:37
optimizacion del SQL seb@ SQL 1 22-09-2004 19:55:24
Optimizacion manuelpr Conexión con bases de datos 3 30-07-2004 17:26:24
Rendimiento y optimizacion de una aplicacion erickperez6 Varios 2 10-09-2003 01:12:32


La franja horaria es GMT +2. Ahora son las 12:58:49.


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