Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-10-2004
Jose Manuel Jose Manuel is offline
Miembro
 
Registrado: may 2003
Posts: 112
Poder: 22
Jose Manuel Va por buen camino
Conocer el nº de filas devueltas en una consulta

Hola, estoy trabajando con D6 y empiezo con Oracle 9i + componentes ODAC. Mi pregunta es como conseguir que al realizar una consulta, si el nº de filas devueltas es muy grande, aparezca un mensaje informativo y si es posible, pregunte si deseamos continuar o no, con la consulta.

Por ejemplo, cuando hago la siguiente consulta, desconozco el nº de filas que me devolverá la consulta, por lo que me gustaría poder saber a priori que si el nº de filas devueltas supera, por ejemplo las 100 , entonces aparezca un mensaje de aviso dando la opción de continuar o limitar el rango de la consulta.

Un saludo
Jose Manuel


Código:
 
procedure TfDNI.Btn_fechasClick(Sender: TObject);
begin
   fdm.tbNif.close;
   fdm.tbNif.SQL.Clear;
   fdm.tbNif.SQL.Text := 'SELECT * FROM &tablename1 '        +#13+
                         'WHERE (F_ULTIMO_CONTACTO >= :desde' +#13+
                         'and      F_ULTIMO_CONTACTO <= :hasta)' +#13+
                         'ORDER BY A_nombre';
   fdm.tbNif.MacroByName('TableName1').Value := cb_tablespace.Text;
   fdm.tbNif.ParamByName('desde').AsDateTime := desde.date;
   fdm.tbNif.ParamByName('hasta').AsDateTime := hasta.date;
   fdm.tbNif.Open;
end;
Responder Con Cita
  #2  
Antiguo 25-10-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Pues de Oracle no tengo ni idea pero ¿por qué no sustituyes select * por select count(*) en tu consulta? De esta forma sabrás el número de registros que te devolverá la consulta original.

// Saludos
Responder Con Cita
  #3  
Antiguo 25-10-2004
Jose Manuel Jose Manuel is offline
Miembro
 
Registrado: may 2003
Posts: 112
Poder: 22
Jose Manuel Va por buen camino
Gracias por responder, pero dime una cosa, con esta instrucción el nº de filas lo coneceré una vez está la consulta en la pantalla, y yo lo que pretendo, es que teniendo un grid, la consulta que pueda hacer un cliente no sea tan grande que colapse la red, por ejemplo que ¿pasaría si la consulta devuelve 50000 registros?

Bueno, probaré esta instrucción a ver si me ayuda con esto.

Gracías y un saludo.
Jose Manuel
Responder Con Cita
  #4  
Antiguo 25-10-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Jose Manuel
pero dime una cosa, con esta instrucción el nº de filas lo coneceré una vez está la consulta en la pantalla
No. Con esa consulta (select count) no traes ningún registro, únicamente obtienes el número de registros que satisfacen las condiciones. Este tipo de consultas suele ser muy rápido de manera que no pierdes gran cosa. Si el número de filas no es muy alto entonces sí mandas llamar tu consulta original para traer los registros y en caso contrario mandas el aviso al usuario.

// Saludos
Responder Con Cita
  #5  
Antiguo 26-10-2004
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.321
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por roman
¿por qué no sustituyes select * por select count(*) en tu consulta?
Aun mejor si utilizas para el Count el campo de clave primaria, es decir Select Count(CampoPK)... (el resto de la consulta igual que estaba)

Cita:
Empezado por Jose Manuel
la consulta que pueda hacer un cliente no sea tan grande que colapse la red, por ejemplo que ¿pasaría si la consulta devuelve 50000 registros?
Has pensado en utilizar Filtros previos o TOP;
Personalmente considero que hacer (o que el usuario haga) una consulta que devuelve 50000 registros es inútil; y lo subrayo porque además de inútil lo considero un "error" de programación; Resulta que el usuario hace una consulta (en un Grid por ejemplo) que devueve 50000 registros y el registro que le interesa está en la posición 14356, ¿realmente lo va a encontrar? ¿Realmente lo va a buscar? porque no me imagino un usuario dándole al cursor o a la barra de desplazamiento hasta esa posición.

Creo que en éstos casos se debería sacar un filtro previo para que el usuario seleccione determinados valores y utilizar un TOP (yo utilizao ambas cosas, al igual que SAP, por ejemplo); El top por defecto son 500 (aunque el usuario puede modificarlo);

NOTA: Normalmente en un tabla grande suele ser más rápido un TOP 200 que un Count (ya que el count, aunque sólo sea para contar debe recorrer toda la tabla...)

Cita:
Empezado por Jose Manuel
¿que pasaría si la consulta devuelve 50000 registros?
(si al final y después de todo llegas a esa situación...)
Para esos casos debes configurar la conexión como Cliente-Servidor; ADO, IBExpress,... poseen alguna propiedad en la conexión que te permite configurar ésta modalidad de forma que en una consulta de 50000 registros se "traen" por bloques, primero se traen 250 y a medida que el usuario pide más (baja en el Grid, por ejemplo) se van trayendo el resto.

De todas formas mi consejo es que evites a todas costa llegar a esa situación (ejecutar ésta un select con un resultado de 50000 registros).
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 26-10-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Neftali
De todas formas mi consejo es que evites a todas costa llegar a esa situación (ejecutar ésta un select con un resultado de 50000 registros).
Creo que esto es precisamente lo que Jose Manuel quiere evitar y por ello está preguntando.

Su enfoque me parece adecuado. Si el usuario hace una búsqueda que va a devolver una cantidad más allá de un límite razonable de registros, ¿qué mejor que avisarle para que refine su búsqueda antes de lanzar la consulta real que traiga los registros?

// Saludos
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


La franja horaria es GMT +2. Ahora son las 08:14:15.


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