Ver Mensaje Individual
  #11  
Antiguo 19-06-2013
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Reputación: 14
novato_erick Va por buen camino
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;
  // Variables de cargar Datos
  cod: integer;
  Apellido, Nom: String;
  RxH, sBruto, sSocial, sTotal, sEduc, sNeto, oDesc, hTrabajo: Double;
  // Variable Transaccion
  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;
            // Close;

          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;
    // campo := TStringList.Create;
  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 // si no cerramos limpiamos nuestros componentes y variables del form
  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
Responder Con Cita