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;