Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Inserción masiva en Firebird, no aparecen todos mis registros (https://www.clubdelphi.com/foros/showthread.php?t=96264)

pgranados 16-06-2023 20:22:01

Inserción masiva en Firebird, no aparecen todos mis registros
 
Buen día, tengo una tabla en mi base de datos en la cual almaceno todos los códigos postales que existen en México, son algo así de +95 mil.

A veces la autoridad competente actualiza los catálogos de códigos postales y por ende necesito actualizarlos en mi programa, pero mi problema es que se están eliminando los registros cuando realizo la inserción masiva, estos códigos postales el Servicio Postal Mexicano los publica en un Excel de dos hojas, entonces yo recorro toda la primera hoja y extraigo los valores, de la siguiente manera:

Código Delphi [-]
if not DataModule.FDQueryGrabar.Active then
   DataModule.FDQueryGrabar.Open;

for Fila := 6 to Rango.Rows.Count do
begin
     DataModule.FDQueryGrabar.Append;
     DataModule.FDQueryGrabarValor1.Value:= Rango.Cells[Fila,1].value;
     DataModule.FDQueryGrabarValor2.Value:= Rango.Cells[Fila,2].value;
     DataModule.FDQueryGrabarValor3.Value:= Rango.Cells[Fila,3].value;
     DataModule.FDQueryGrabar.Post;
end;

// Aqui ya cambio de pagina en el excel y demas

DataModule.FDQueryGrabar.Refresh;
DataModule.FDQueryGrabar.Last;

// Aqui inicio de nuevo el ciclo, pero ya en la otra pagina
for Fila := 6 to Rango.Rows.Count do
begin
     DataModule.FDQueryGrabar.Append;
     DataModule.FDQueryGrabarValor1.Value:= Rango.Cells[Fila,1].value;
     DataModule.FDQueryGrabarValor2.Value:= Rango.Cells[Fila,2].value;
     DataModule.FDQueryGrabarValor3.Value:= Rango.Cells[Fila,3].value;
     DataModule.FDQueryGrabar.Post;
end;

Pero en lugar de grabarme casi 95k de registros me muestra unos 50 mil :confused:

¿Alguien sabe que puedo revisar? Saludos.

Edit: Hago un count(*) a mi tabla y si aparecen los 95k de registros, pero en el DBaver o en el SQL manager no aparecen

Casimiro Notevi 16-06-2023 21:08:03

Cita:

Empezado por pgranados (Mensaje 551757)
Edit: Hago un count(*) a mi tabla y si aparecen los 95k de registros, pero en el DBaver o en el SQL manager no aparecen

¿Quieres decir que haces select count(*) y no dice 95 mil?
Supongo que al menos estarás haciendo un commit antes de cerrar, ¿no?

pgranados 16-06-2023 21:44:59

Hago el count y si aparecen los 95 mil registros, pero cuando quiero visualizarlos no aparecen, solo aparecen como 50k

Casimiro Notevi 17-06-2023 09:19:31

¡Ah!, eso será una limitación para no cargar tantos registros en memoria, supongo.
Porque si le das a "ir al último" estará, ¿no?

pgranados 19-06-2023 16:39:15

Cita:

Empezado por Casimiro Notevi (Mensaje 551761)
¡Ah!, eso será una limitación para no cargar tantos registros en memoria, supongo.
Porque si le das a "ir al último" estará, ¿no?

Ese es el problema, cuando voy al "ultimo" si aparece el registro que debería de ser. Pero cuando voy al primero no aparece el que debería de.

Esa tabla de 95k registros tiene como 17 campos, intente grabando solamente los "obligatorios para el funcionamiento del programa" que son como 4 (los demás son meramente informativos para el usuario), y de esta forma si aparecen todos los registros. :confused:

duilioisola 19-06-2023 17:23:09

Desde Delphi, después de terminar la inserción deberías hacer un SELECT y asegurar que el WHERE no esté filtrando por algo que te esconda registros.
Si haces "SELECT * FROM TABLA" y luego vas al último deberías verlos todos.
Por otro lado revisa que no estés insertando registros duplicados.
En España existe el caso de que varios pueblos pequeños que compartan un mismo código postal.
También se da el caso inverso. Barcelona tiene muchos códigos postales.

De todos modos, habría que ver el código completo para poder saber qué es lo que hay dentro de cada componente.

Cuando se hacen Inserts Masivos, lo normal no es utilizar una tabla, sinó ejecutar un Query independiente ya que los DataSets pueden tener alguna cosa que no podemos controlar.

Yo haría los inserts así:

Código Delphi [-]
var
  Q : TQuery.Create;

begin
[...]
  with Q.SQL do
  begin
    Add(' INSERT INTO CODIGO_POSTAL (CODIGO, NOMBRE, ...) ');
    Add(' VALUES (:CODIGO, :NOMBRE, ...);
  end;

  Q.Prepare;

  for Fila := 6 to Rango.Rows.Count do
  begin
     Q.Params[0].AsString := Rango.Cells[Fila,1].value;
     Q.Params[1].AsString := Rango.Cells[Fila,2].value;
     Q.Params[2].AsString := Rango.Cells[Fila,3].value;
     Q.ExecSQL;
  end;

  Q.Commit;
  [...]
end;


La franja horaria es GMT +2. Ahora son las 09:08:58.

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