PDA

Ver la Versión Completa : ejecutar varios insert a la ves


jzginez
05-12-2007, 20:13:18
Hola amigos estoy usando Delphi 7, FireBird 2 y las FIBPlus. Estoy haciendo un programa para migrar de una base a otra, tabla por tabla y campo por campo por si no se llaman igual siempre que sean del mismo tipo (aun esta en pañales el sistema :p ).
en la parte básica que llevo genero varias lineas insert p/e:
Insert into CLIENTES (ID, NOMBRE, RFC, DIRECCION, COLONIA, LOCALIDAD, REPRESENTANTE, TELEFONO_1, TELEFONO_2, FAX) values (0, 'inicial', Null, 'inicial', 'inicial', Null, Null, Null, Null, Null);
Insert into CLIENTES (ID, NOMBRE, RFC, DIRECCION, COLONIA, LOCALIDAD, REPRESENTANTE, TELEFONO_1, TELEFONO_2, FAX) values (1, 'BRAVO AUTOMOTRIZ S.A. DE C.V.', 'BAU -831123-T86', 'BLVD. MIGUEL ALEMAN Y MONTES DE OCA', 'BLVD. MIGUEL ALEMAN Y MONTES DE OCA', 'COSAMALOAPAN, VER.', 'SRA. ESTELA BRAVO ACOSTA', '288-20142', '288-21718', '288-22199');
Insert into CLIENTES (ID, NOMBRE, RFC, DIRECCION, COLONIA, LOCALIDAD, REPRESENTANTE, TELEFONO_1, TELEFONO_2, FAX) values (2, 'CIA. AGRICOLA GANADERA DE TABASCO, S.A. DE C.V.', 'AGT -921219-5W5', 'AVENIDA H. COLEGIO MILITAR Nø 108, COLONIA ATASTA', 'AVENIDA H. COLEGIO MILITAR Nø 108, COLONIA ATASTA', 'VILLAHERMOSA, TABASCO', 'SRITA. RITA', Null, Null, Null);
Insert into CLIENTES (ID, NOMBRE, RFC, DIRECCION, COLONIA, LOCALIDAD, REPRESENTANTE, TELEFONO_1, TELEFONO_2, FAX) values (3, 'CIA. AZUCARERA INDEPENDENCIA, S.A. DE C.V.', ' AIN-960314-960', 'BLVD. MANUEL AVILA CAMACHO S/N', 'BLVD. MANUEL AVILA CAMACHO S/N', 'VILLA INDEPENDENCIA, VER.', Null, Null, Null, Null);
Insert into CLIENTES (ID, NOMBRE, RFC, DIRECCION, COLONIA, LOCALIDAD, REPRESENTANTE, TELEFONO_1, TELEFONO_2, FAX) values (4, 'ASOC. LOCAL DE CA¥EROS CNPR INGENIO LA GLORIA', ' - -', 'DOMICILIO CONOCIDO: "INGENIO LA GLORIA"', 'DOMICILIO CONOCIDO: "INGENIO LA GLORIA"', 'MPIO. DE URSULO GALVAN, VER.', Null, Null, Null, Null);
Insert into CLIENTES (ID, NOMBRE, RFC, DIRECCION, COLONIA, LOCALIDAD, REPRESENTANTE, TELEFONO_1, TELEFONO_2, FAX) values (5, 'SOC. VENUSTIANO CARRANZA, S.A. DE C.V.', ' - -', 'DOM. CONOCIDO POBLADO C23, PLAN CHONTALPA', 'DOM. CONOCIDO POBLADO C23, PLAN CHONTALPA', 'CARDENAS, TAB.', Null, Null, Null, Null);
Insert into CLIENTES (ID, NOMBRE, RFC, DIRECCION, COLONIA, LOCALIDAD, REPRESENTANTE, TELEFONO_1, TELEFONO_2, FAX) values (6, 'AUTOTRACTORES DE MORELOS, S.A. DE C.V.', ' ATM-730612-7P4', 'AV. REFORMA NO. 205 COL. EMILIANO ZAPATA', 'AV. REFORMA NO. 205 COL. EMILIANO ZAPATA', 'CUAUTLA, MOR.', Null, Null, Null, Null);
Insert into CLIENTES (ID, NOMBRE, RFC, DIRECCION, COLONIA, LOCALIDAD, REPRESENTANTE, TELEFONO_1, TELEFONO_2, FAX) values (7, 'TRACTORMAYA, S. A. DE C.V.', ' TRA-880107-HW4', 'AV. RUIZ CORTINES ESQ. DO¥A FIDENCIA', 'AV. RUIZ CORTINES ESQ. DO¥A FIDENCIA', 'VILLAHERMOSA, TABASCO', 'SR. MIGUEL ANGEL CORTES', '93 - 12013', '142670', Null);
Insert into CLIENTES (ID, NOMBRE, RFC, DIRECCION, COLONIA, LOCALIDAD, REPRESENTANTE, TELEFONO_1, TELEFONO_2, FAX) values (8, 'ING. EDUARDO GALVAN CARPINTERO', ' - -', 'AV. BENITO JUAREZ Nø 19, MPIO. DE EMILIANO ZAPATA', 'AV. BENITO JUAREZ Nø 19, MPIO. DE EMILIANO ZAPATA', 'MORELOS', Null, Null, Null, Null);
commit;
.......

este código lo asigno ya sea a un pFIBQuery, pFIBStoredproc o a un pFIBUpdateObject y en todos estos al intentar ejecutar las sentencias me marca error de sintaxis en la linea 2 columna 1 la sentencia INSERT, si copio todas estas sentencias a ibexpert y las ejecuto funciona de forma correcta.

Alguien me pude decir como hacer que delphi ejecute todas las lineas seguidas y no tener que ejecutar linea por linea.

Gracias

p.d. encontré este tema (http://www.clubdelphi.com/foros/showthread.php?t=8926&highlight=insertar+varios+registros+juntos) en el foro pero esa estructura del insert no funciona en firebird

Lepe
05-12-2007, 20:31:48
Echa un visual al FTp del club, hay una herramienta para migrar de paradox a firebird (http://www.terawiki.clubdelphi.com/archivos/Delphi-Win32/Herramientas/Migrar%20Tablas%20Paradox%20a%20Firebird%20Pdox2FB%20v4.zip), quizás te sirva.

PD: Necesitas usar un FIBScript (debe llamarse así) que si permitirá varias instrucciones.

Saludos

AzidRain
05-12-2007, 22:20:35
Yo hice alguna vez una aplicación similar pero de DBF a MySQL. Yo lo hice utilizando las caracteristicas de importacion de MySQL (Insert from local) pasandole un archivo de texto plano delimitado por comas y la velocidad que se adquiere es muy superior a hacer un insert por cada registro. No se si FB tenga algo similar, espero que si.. Con este enfoque pasaba 20 000 a 30000 registros en 1 minuto a lo mucho.

jhonny
05-12-2007, 22:31:58
En estos casos siempre uso el DataPump, ya que hay casos en los que hay que respetar las llaves foreneas de la base de datos y estos programas ya tienen en cuenta ese tipo de cosas.

jachguate
06-12-2007, 03:35:29
Si queres hacerlo por código, te comento que los componentes Query solamente envían una instrucción al servidor.

Lo que te tocaría es enviar al servidor sentencia por sentencia, suponiendo que todas las instrucciones generadas están en una sola línea, es sencillo:


var
Insrucciones: TStringList;
begin
Instrucciones := TStringList.Create();
try
Instrucciones.Read
for I:= 0 to Instrucciones.Count - 1 do
begin
Query1.SQL.Text := Instrucciones[I];
Query1.ExecSQL;
end;
finally
Instrucciones.Free;
end;


Hasta luego.

;)