Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Oracle
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 26-10-2004
Jose Manuel Jose Manuel is offline
Miembro
 
Registrado: may 2003
Posts: 112
Poder: 24
Jose Manuel Va por buen camino
Hola, he probado a sustituir la instrucción
'SELECT * FROM &tablename1 WHERE ' por
'SELECT count(*) FROM &tablename1 WHERE '
y me da un error, indicando que el campo C_NIF no se encuentra, aunque existe y es el primer campo de la tabla, y forma parte de la clave única de la tabla CONSTRAINT "TA_NIF_C_NIF_C_VERSION_PK" UNIQUE("C_NIF", "N_VERSION")

No sé, tal vez hay algún error en la sintesis - trabajo con Oracle 9i + Odac + D6-, de momento estoy intentando encontrar algún ejemplo que incluya esta instrucción, mientras tanto he modificado el codigo de la siguiente manera, aunque no lo veo muy claro:

Un saludo a todos
Jose Manuel García


Código:
procedure TfDNI.Btn_consulta_fechasClick(Sender: TObject);
var
n,ini,fin,y:Double;
i,x:integer;
begin
   // deberia comprobar el nº de filas devueltas en la consulta
   fdm.tbNif.close;
   fdm.tbNif.SQL.Clear;
   fdm.tbNif.SQL.Text := 'SELECT COUNT(*) FROM &tablename1 WHERE '+#13+
                         '(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;
   if desde.date=hasta.date then hasta.date  := desde.date+1;
   fdm.tbNif.Open;

   n:=fdm.tbNif.Recordcount; // nº de filas de la tabla
   ShowMessage ('Nº de filas devueltas = '+FormatFloat('####',n)); // esto se debe quitar

   // si el nº de filas devueltas es > 100, sugerir limitar el ambito de la consulta
   if n>10 then
      begin
      text:='Esta consulta tiene '+FormatFloat('####',n)+' filas'+#13+
            'le recomendamos, limite el ámbito de la consulta'+#13+#13+
            'Pulse Cancelar para salir';

      IF Application.MessageBox((pChar(text)) ,'CONSULTAS ',
         mb_OkCancel + mb_IconExclamation)=IdCancel then Exit;

      end;

    // si no se limita el ambito y el nº de filas devueltas es > 10 (el nº de puede aumentar)
    // se muestra el resultado de 10 en 10, dando opción a cancelar la consulta
     if n>10 then
        begin
        y:=(int(n/10))+1;
        i:=StrToint(FloatToStr(y));
        for x:=1 to i do
            begin
            ini:=x-1*10;  // se puede cambiar para mostrar bloques de más de  10 filas
            fin:=x*10;
            fdm.tbNif.close;
            fdm.tbNif.SQL.Clear;
            fdm.tbNif.SQL.Text := 'SELECT * FROM &tablename1 WHERE '+#13+
                                  '    (F_ULTIMO_CONTACTO >= :desde'+#13+
                                  ' and F_ULTIMO_CONTACTO <= :hasta)'+#13+
                                  ' and(rownum > :ini'  +#13+
                                  ' and rownum <= :fin)'+#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.ParamByName('ini').AsFloat := ini;
            fdm.tbNif.ParamByName('fin').AsFloat := fin;
            if desde.date=hasta.date then hasta.date  := desde.date+1;
            fdm.tbNif.Open;

            text:='Quieres ver los siguientes 10 registros'+#13+
                  'Pulse Cancelar para salir';

            IF Application.MessageBox((pChar(text)) ,'CONSULTA ',
               mb_OkCancel + mb_IconExclamation)=IdCancel then Exit;
            end;
        end
        else
        begin
        fdm.tbNif.close;
        fdm.tbNif.SQL.Clear;
        fdm.tbNif.SQL.Text := 'SELECT * FROM &tablename1 WHERE '+#13+
                              '    (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;
        if desde.date=hasta.date then hasta.date  := desde.date+1;
        fdm.tbNif.Open;
      end;
end;
Responder Con Cita
  #2  
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
Como te dije, yo no conozco Oracle. Pero la consulta que haces se ve bastante estándar así como lo es el count. Ahora, en el error que te marca se menciona el campo C_NIF que no aparece en ninguna parte de la consulta- ni la original, ni la que usa count. Quizá la componente tbNif la tengas asociada a algún DBGrid u otro control db que hacía referencia a dicho campo. Al sustituir * por count(*) tal campo ya no aparece en los resultados de la consulta. Si es algo por el estilo intenta entonces usar otra componente para obtener el número de registros (consulta count).

// Saludos
Responder Con Cita
  #3  
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
Para que quede un poco más claro

Una consulta de la forma:

Código SQL [-]
select count(*) from tabla
where
  condiciones

te regresa un sólo registro con una sóla celda que contiene el número de registros de la tabla que satisfacen las condiciones.

La consulta

Código SQL [-]
select * from tabla
where
  condiciones
te devuelve todos los registros de la tabla que satisfacen las condiciones.

La primera consulta es muy rápida ya que el conteo lo hace el servidor mandando al cliente únicamente una celda.

// Saludos
Responder Con Cita
  #4  
Antiguo 27-10-2004
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is online now
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.442
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 Jose Manuel
Hola, he probado a sustituir la instrucción
'SELECT * FROM &tablename1 WHERE ' por
'SELECT count(*) FROM &tablename1 WHERE '
y me da un error, indicando que el campo C_NIF no se encuentra
Yo utilizaría un Query diferente para realizar la consulta del Count
Código SQL [-]
SELECT COUNT(*) AS NUMREG FROM...

No utilices el mismo que usas para la consulta de datos y para acceder al resultado hazlo utilizando FieldByName.

Código Delphi [-]
  n := Qrery2.FieldByName('NUMREG').AsInteger;

Otra cosa, es que puedes eliminar de la consulta del Count el ORDER BY ya que es indiferente para el número de 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
  #5  
Antiguo 28-10-2004
Jose Manuel Jose Manuel is offline
Miembro
 
Registrado: may 2003
Posts: 112
Poder: 24
Jose Manuel Va por buen camino
nº de filas devueltas en una consulta

Hola, he descubierto que el componente ODAC que estoy utilizando para la conexión a ORACLE, tiene una opción que soluciona el problema que origino esta consulta, al tener la posibilidad de indicar que no traiga de una sola vez todas las filas de la consulta, y de indicar el nº de filas que debe traer en cada bloque.

TOraQuery.fetchAll :=False
TOraQuery.fetchRows :=25


En las propiedades del componente he puesto estos datos, y ahora en el caso de una consulta que devuelva 1000 registros, primero trae 25 y solo si llego con el cursor al registro 25, automaticamente se obtiene un segundo bloque de 25 registros, y así hasta el final si continuamos la consulta.

Un saludo a todos y gracias por vuestros comentarios.
Jose Manuel
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


La franja horaria es GMT +2. Ahora son las 11:48:40.


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