Hola hace un par de días me encontré con la interrogante de pasar linea por linea a mi base de datos en firebird desde un archivo de texto, bueno en realidad nunca pude con el archivo de texto delimitado por fabulaciones pero si con un CSV delimitado por comas aquí presento cómo lo hice e insertando a la base de datos de firebird.
Código Delphi
[-]
procedure TfrmCargaComprobante.btnLecturaClick(Sender: TObject);
var
i, j, conteo, DiaIncap, HoraIncap, barra, barra2: integer;
Cadena, cadena2: string;
campo: TStringList;
TS: TStrings;
i2: integer;
cod: integer;
Apellido, Nom: String;
RxH, sBruto, sSocial, sTotal, sEduc, sNeto, oDesc, hTrabajo: Double;
ExitoComprobante: Boolean;
begin
ProgressBar1.Min := 0;
SetLength(valores, 0);
for i := 0 to Memo1.Lines.Count - 1 do
begin
SetLength(valores, length(valores) + 1);
Cadena := Memo1.Lines[i];
ProgressBar1.Max := Memo1.Lines.Count - 1;
begin
TS := SepararCadena(Cadena, ',');
try
for i2 := 0 to TS.Count - 1 do
begin
conteo := i2;
if conteo = 0 THEN
begin
cod := strtoint(TS[i2]);
end;
if conteo = 1 THEN
begin
Apellido := Trim(TS[i2]);
end;
if conteo = 2 THEN
begin
Nom := Trim(TS[i2]);
end;
if conteo = 3 THEN
begin
RxH := StrToFloat(TS[i2]);
end;
if conteo = 4 THEN
begin
sBruto := StrToFloat(TS[i2]);
end;
if conteo = 5 THEN
begin
sSocial := StrToFloat(TS[i2]);
end;
if conteo = 6 THEN
begin
sTotal := StrToFloat(TS[i2]);
end;
if conteo = 7 THEN
begin
sEduc := StrToFloat(TS[i2]);
end;
if conteo = 8 THEN
begin
sNeto := StrToFloat(TS[i2]);
end;
if conteo = 9 THEN
begin
oDesc := StrToFloat(TS[i2])
end;
if conteo = 10 THEN
begin
hTrabajo := StrToFloat(TS[i2])
end;
if conteo = 11 THEN
begin
DiaIncap := strtoint(TS[i2])
end;
if conteo = 12 THEN
begin
HoraIncap := strtoint(TS[i2])
end;
end;
finally
begin
ExitoComprobante := False;
trnComprobante := dmConectar.Conectar.BeginTransaction;
Try
With dmlogicaPlanilla.qInsertaComprobantes do
begin
Close;
parambyname('Tarjeta').AsInteger := cod;
parambyname('Apellido').AsString := Trim(Apellido);
parambyname('Nombre').AsString := Trim(Nom);
parambyname('RataporHora').AsFloat := RxH;
parambyname('SalarioBruto').AsFloat := sBruto;
parambyname('SeguroSocial').AsFloat := sSocial;
parambyname('TotalSeguros').AsFloat := sTotal;
parambyname('SeguroEducativo').AsFloat := sEduc;
parambyname('SalarioNeto').AsFloat := sNeto;
parambyname('OtrosDescuentos').AsFloat := oDesc;
parambyname('FechaInicio').AsDate := dtpInicio.Date;
parambyname('FechaFinal').AsDate := dtpFinal.Date;
parambyname('HorasTrabajo').AsFloat := hTrabajo;
parambyname('DiasIncap').AsInteger := DiaIncap;
parambyname('HorasIncap').AsInteger := HoraIncap;
parambyname('Cedula').AsString := '0-000-000';
execsql;
begin
dmConectar.Conectar.CommitFreeAndNil(trnComprobante);
ExitoComprobante := true;
end;
barra := Memo1.Lines.Count;
barra2 := barra - 1;
ProgressBar1.Position := barra2;
end;
except
on e: exception do
begin
dmConectar.Conectar.RollbackFreeAndNil(trnComprobante);
ShowMessage('Error Encontrado' + e.Message);
end;
end;
cod := 0;
Apellido := '';
Nom := '';
RxH := 0.00;
sBruto := 0.00;
sSocial := 0.00;
sTotal := 0.00;
sEduc := 0.00;
sNeto := 0.00;
oDesc := 0.00;
hTrabajo := 0.00;
DiaIncap := 0;
HoraIncap := 0;
TS.Free;
end;
end;
end;
end;
ShowMessage('Carga del archivo completada');
if Application.MessageBox('¿Desea Imprimir Comprobantes de Pago?',
'Confirmación', MB_ICONQUESTION OR MB_YESNO) = ID_NO then
begin
frmCargaComprobante.Close;
end
else begin
dmlogicaPlanilla.qConsultaComprobante.Open;
dmlogicaPlanilla.frxSobres.ShowReport(true);
frmCargaComprobante.Close;
end;
end;
lo más seguro que habrá una manera más rápida de hacerlo y creo que con un CASE se mejoraría y la rutina no repetiría varias veces pero ese es otro tema de investigación e implementación.
Saludos
novato_erick