Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error al importar fichero txt (https://www.clubdelphi.com/foros/showthread.php?t=85901)

jafera 21-05-2014 13:34:58

Error al importar fichero txt
 
Buenas de nuevo a todos.

Al final he conseguido que delphi XE5 funcione al 100% con todos los componentes instalados.
He realizado las migraciones del antiguo código D6 ajustandolo al nuevo XE5.
Recientemente he pasado mi máquina Win XP 32 bits a W-7 64 bits.

El problema que tengo es que un proceso de importación de un archivo txt se reallizaba correctamente en el formato antiguo y ahora me lanza una excepción sin haber tocado nada del código en esta parte, no se si algun parámetro se debe ajustar a XE5, os pongo el código usado:

Código Delphi [-]
if RadioGroup1.ItemIndex = 1 then
        begin
                OpenDialog1.Filename:='';
                OpenDialog1.InitialDir:='C:\Rebuts_1.0\Fitxers\Rebuts\Capçalera';
                F_Confirmacio := TF_Confirmacio.Create(self);
                F_Confirmacio.Label1.Caption := 'Importem arxiu capçalera';
                try
                        if F_Confirmacio.ShowModal = mrok then
                        begin
                                with BorraTemp do
                                begin
                                        Close;
                                        UnPrepare;
                                        Sql.Text := 'DELETE FROM RE0006TOTALTEMP';
                                        Prepare;
                                        Open;
                                end;

                                F_ModulDades.Rebut_Total_Temp.Close;
                                F_ModulDades.Rebut_Total_Temp.Open;
                                F_ModulDades.Rebut_Total_Temp.Append;
                                F_Importa.IBSQLImporta.SQL.Text := 'Insert into RE0006TOTALTEMP values(:ID_REBUT, :ID_USUARI, :DATA, :TITOL, :C_POSTAL, :CODI_CLUB, :ARBITRES, :MATERIAL, :I1, :I2, :I3, :I4, :I5, :TI1, :TI2, :TI3, :TI4, :TI5, :TOTAL_REBUT, :IMPORT, :TEXTE, :SUSPENSIO, :KM_TOTALS, :ASPIRANT'+
                                                                   ', :HORA_CONST, :HORA_SORT,:NUM_CORREDORS,:ID_ARBITRE, :ID_METGE, :DIR_CURSA, :CATEGORIA, :ZONA, :KM_CURSA, :TRANSP, :GRAVAT, :PREU_FIX, :IMPORT_2, :FEINER, :DOS_SECTORS, :CAMPIONAT, :I10, :CODI_BARRES, :CREA_REBUT, :BICIXIPS, :TI6, :NUM_FIX'+
                                                                   ', :PAGAT, :EXTRES, :REPART, :PAGADOR)';
                                F := TIBInputDelimitedFile.Create;
                                try
                                        F.ColDelimiter := ';';
                                        if OpenDialog1.Execute then
                                        begin
                                                F.Filename := OpenDialog1.FileName;
                                        end;
                                        F_Importa.IBSQLImporta.BatchInput(F);  //aqui es donde se para y da el mensaje de error.
                                finally
                                        F.Free;
                                end;

                                F_ModulDades.Rebut_Total.Close;
                                F_ModulDades.Rebut_Total.Open;
                                F_ModulDades.Rebut_Total_Temp.Close;
                                F_ModulDades.Rebut_Total_Temp.Open;
                                F_ModulDades.Rebut_Total_Temp.First;
                                while not F_ModulDades.Rebut_Total_Temp.Eof do
                                begin
                                        if F_ModulDades.Rebut_Total.Locate('ID_REBUT; ID_USUARI; DATA', VarArrayof([F_ModulDades.Rebut_Total_TempID_REBUT.Value, F_ModulDades.Rebut_Total_TempID_USUARI.Value, F_ModulDades.Rebut_Total_TempDATA.Value]), []) then
                                        begin
                                                F_ModulDades.Rebut_Total.Edit;
                                                F_ModulDades.Rebut_TotalID_REBUT.Value := F_ModulDades.Rebut_Total_TempID_REBUT.Value;
                                                F_ModulDades.Rebut_TotalID_USUARI.Value := F_ModulDades.Rebut_Total_TempID_USUARI.Value;
                                                F_ModulDades.Rebut_TotalDATA.Value := F_ModulDades.Rebut_Total_TempDATA.Value;
                                                F_ModulDades.Rebut_TotalTITOL.Value := F_ModulDades.Rebut_Total_TempTITOL.Value;
                                                F_ModulDades.Rebut_TotalC_POSTAL.Value := F_ModulDades.Rebut_Total_TempC_POSTAL.Value;
                                                F_ModulDades.Rebut_TotalCODI_CLUB.Value := F_ModulDades.Rebut_Total_TempCODI_CLUB.Value;
                                                F_ModulDades.Rebut_TotalARBITRES.Value := F_ModulDades.Rebut_Total_TempARBITRES.Value;
                                                F_ModulDades.Rebut_TotalMATERIAL.Value := F_ModulDades.Rebut_Total_TempMATERIAL.Value;
                                                F_ModulDades.Rebut_TotalI1.Value := F_ModulDades.Rebut_Total_TempI1.Value;
                                                F_ModulDades.Rebut_TotalI2.Value := F_ModulDades.Rebut_Total_TempI2.Value;
                                                F_ModulDades.Rebut_TotalI3.Value := F_ModulDades.Rebut_Total_TempI3.Value;
                                                F_ModulDades.Rebut_TotalI4.Value := F_ModulDades.Rebut_Total_TempI4.Value;
                                                F_ModulDades.Rebut_TotalI5.Value := F_ModulDades.Rebut_Total_TempI5.Value;
                                                F_ModulDades.Rebut_TotalTI1.Value := F_ModulDades.Rebut_Total_TempTI1.Value;
                                                F_ModulDades.Rebut_TotalTI2.Value := F_ModulDades.Rebut_Total_TempTI2.Value;
                                                F_ModulDades.Rebut_TotalTI3.Value := F_ModulDades.Rebut_Total_TempTI3.Value;
                                                F_ModulDades.Rebut_TotalTI4.Value := F_ModulDades.Rebut_Total_TempTI4.Value;
                                                F_ModulDades.Rebut_TotalTI5.Value := F_ModulDades.Rebut_Total_TempTI5.Value;
                                                F_ModulDades.Rebut_TotalTOTAL_REBUT.Value := F_ModulDades.Rebut_Total_TempTOTAL_REBUT.Value;
                                                F_ModulDades.Rebut_TotalIMPORT.Value := F_ModulDades.Rebut_Total_TempIMPORT.Value;
                                                F_ModulDades.Rebut_TotalTEXTE.Value := F_ModulDades.Rebut_Total_TempTEXTE.Value;
                                                F_ModulDades.Rebut_TotalSUSPENSIO.Value := F_ModulDades.Rebut_Total_TempSUSPENSIO.Value;
                                                F_ModulDades.Rebut_TotalKM_TOTALS.Value := F_ModulDades.Rebut_Total_TempKM_TOTALS.Value;
                                                F_ModulDades.Rebut_TotalASPIRANT.Value := F_ModulDades.Rebut_Total_TempASPIRANT.Value;
                                                F_ModulDades.Rebut_TotalHORA_CONS.Value := F_ModulDades.Rebut_Total_TempHORA_CONS.Value;
                                                F_ModulDades.Rebut_TotalHORA_SORT.Value := F_ModulDades.Rebut_Total_TempHORA_SORT.Value;
                                                F_ModulDades.Rebut_TotalNUM_CORREDORS.Value := F_ModulDades.Rebut_Total_TempNUM_CORREDORS.Value;
                                                F_ModulDades.Rebut_TotalID_ARBITRE.Value := F_ModulDades.Rebut_Total_TempID_ARBITRE.Value;
                                                F_ModulDades.Rebut_TotalID_METGE.Value := F_ModulDades.Rebut_Total_TempID_METGE.Value;
                                                F_ModulDades.Rebut_TotalDIR_CURSA.Value := F_ModulDades.Rebut_Total_TempDIR_CURSA.Value;
                                                F_ModulDades.Rebut_TotalCATEGORIA.Value := F_ModulDades.Rebut_Total_TempCATEGORIA.Value;
                                                F_ModulDades.Rebut_TotalZONA.Value := F_ModulDades.Rebut_Total_TempZONA.Value;
                                                F_ModulDades.Rebut_TotalKM_CURSA.Value := F_ModulDades.Rebut_Total_TempKM_CURSA.Value;
                                                F_ModulDades.Rebut_TotalTRANSP.Value := F_ModulDades.Rebut_Total_TempTRANSP.Value;
                                                F_ModulDades.Rebut_TotalGRAVAT.Value := F_ModulDades.Rebut_Total_TempGRAVAT.Value;
                                                F_ModulDades.Rebut_TotalPREU_FIX.Value := F_ModulDades.Rebut_Total_TempPREU_FIX.Value;
                                                F_ModulDades.Rebut_TotalIMPORT_2.Value := F_ModulDades.Rebut_Total_TempIMPORT_2.Value;
                                                F_ModulDades.Rebut_TotalFEINER.Value := F_ModulDades.Rebut_Total_TempFEINER.Value;
                                                F_ModulDades.Rebut_TotalDOS_SECTORS.Value := F_ModulDades.Rebut_Total_TempDOS_SECTORS.Value;
                                                F_ModulDades.Rebut_TotalCAMPIONAT.Value := F_ModulDades.Rebut_Total_TempCAMPIONAT.Value;
                                                F_ModulDades.Rebut_TotalI10.Value := F_ModulDades.Rebut_Total_TempI10.Value;
                                                F_ModulDades.Rebut_TotalCODI_BARRES.Value := F_ModulDades.Rebut_Total_TempCODI_BARRES.Value;
                                                F_ModulDades.Rebut_TotalCREA_REBUT.Value := F_ModulDades.Rebut_Total_TempCREA_REBUT.Value;
                                                F_ModulDades.Rebut_TotalBICIXIPS.Value := F_ModulDades.Rebut_Total_TempBICIXIPS.Value;
                                                F_ModulDades.Rebut_TotalTI6.Value := F_ModulDades.Rebut_Total_TempTI6.Value;
                                                F_ModulDades.Rebut_TotalNUM_FIX.Value := F_ModulDades.Rebut_Total_TempNUM_FIX.Value;
                                                F_ModulDades.Rebut_TotalPAGAT.Value := F_ModulDades.Rebut_Total_TempPAGAT.Value;
                                                F_ModulDades.Rebut_TotalEXTRES.Value := F_ModulDades.Rebut_Total_TempEXTRES.Value;
                                                F_ModulDades.Rebut_TotalREPART.Value := F_ModulDades.Rebut_Total_TempREPART.Value;
                                                F_ModulDades.Rebut_TotalPAGADOR.Value := F_ModulDades.Rebut_Total_TempPAGADOR.Value;
                                                F_ModulDades.Rebut_Total.Post;
                                                F_ModulDades.Rebut_Total_Temp.Next;
                                        end
                                        else
                                        begin
                                                F_ModulDades.Rebut_Total.Last;
                                                i := F_ModulDades.Rebut_TotalID.Value + 1;
                                                F_ModulDades.Rebut_Total.Append;
                                                F_ModulDades.Rebut_TotalID.Value := i;
                                                F_ModulDades.Rebut_TotalID_REBUT.Value := F_ModulDades.Rebut_Total_TempID_REBUT.Value;
                                                F_ModulDades.Rebut_TotalID_USUARI.Value := F_ModulDades.Rebut_Total_TempID_USUARI.Value;
                                                F_ModulDades.Rebut_TotalDATA.Value := F_ModulDades.Rebut_Total_TempDATA.Value;
                                                F_ModulDades.Rebut_TotalTITOL.Value := F_ModulDades.Rebut_Total_TempTITOL.Value;
                                                F_ModulDades.Rebut_TotalC_POSTAL.Value := F_ModulDades.Rebut_Total_TempC_POSTAL.Value;
                                                F_ModulDades.Rebut_TotalCODI_CLUB.Value := F_ModulDades.Rebut_Total_TempCODI_CLUB.Value;
                                                F_ModulDades.Rebut_TotalARBITRES.Value := F_ModulDades.Rebut_Total_TempARBITRES.Value;
                                                F_ModulDades.Rebut_TotalMATERIAL.Value := F_ModulDades.Rebut_Total_TempMATERIAL.Value;
                                                F_ModulDades.Rebut_TotalI1.Value := F_ModulDades.Rebut_Total_TempI1.Value;
                                                F_ModulDades.Rebut_TotalI2.Value := F_ModulDades.Rebut_Total_TempI2.Value;
                                                F_ModulDades.Rebut_TotalI3.Value := F_ModulDades.Rebut_Total_TempI3.Value;
                                                F_ModulDades.Rebut_TotalI4.Value := F_ModulDades.Rebut_Total_TempI4.Value;
                                                F_ModulDades.Rebut_TotalI5.Value := F_ModulDades.Rebut_Total_TempI5.Value;
                                                F_ModulDades.Rebut_TotalTI1.Value := F_ModulDades.Rebut_Total_TempTI1.Value;
                                                F_ModulDades.Rebut_TotalTI2.Value := F_ModulDades.Rebut_Total_TempTI2.Value;
                                                F_ModulDades.Rebut_TotalTI3.Value := F_ModulDades.Rebut_Total_TempTI3.Value;
                                                F_ModulDades.Rebut_TotalTI4.Value := F_ModulDades.Rebut_Total_TempTI4.Value;
                                                F_ModulDades.Rebut_TotalTI5.Value := F_ModulDades.Rebut_Total_TempTI5.Value;
                                                F_ModulDades.Rebut_TotalTOTAL_REBUT.Value := F_ModulDades.Rebut_Total_TempTOTAL_REBUT.Value;
                                                F_ModulDades.Rebut_TotalIMPORT.Value := F_ModulDades.Rebut_Total_TempIMPORT.Value;
                                                F_ModulDades.Rebut_TotalTEXTE.Value := F_ModulDades.Rebut_Total_TempTEXTE.Value;
                                                F_ModulDades.Rebut_TotalSUSPENSIO.Value := F_ModulDades.Rebut_Total_TempSUSPENSIO.Value;
                                                F_ModulDades.Rebut_TotalKM_TOTALS.Value := F_ModulDades.Rebut_Total_TempKM_TOTALS.Value;
                                                F_ModulDades.Rebut_TotalASPIRANT.Value := F_ModulDades.Rebut_Total_TempASPIRANT.Value;
                                                F_ModulDades.Rebut_TotalHORA_CONS.Value := F_ModulDades.Rebut_Total_TempHORA_CONS.Value;
                                                F_ModulDades.Rebut_TotalHORA_SORT.Value := F_ModulDades.Rebut_Total_TempHORA_SORT.Value;
                                                F_ModulDades.Rebut_TotalNUM_CORREDORS.Value := F_ModulDades.Rebut_Total_TempNUM_CORREDORS.Value;
                                                F_ModulDades.Rebut_TotalID_ARBITRE.Value := F_ModulDades.Rebut_Total_TempID_ARBITRE.Value;
                                                F_ModulDades.Rebut_TotalID_METGE.Value := F_ModulDades.Rebut_Total_TempID_METGE.Value;
                                                F_ModulDades.Rebut_TotalDIR_CURSA.Value := F_ModulDades.Rebut_Total_TempDIR_CURSA.Value;
                                                F_ModulDades.Rebut_TotalCATEGORIA.Value := F_ModulDades.Rebut_Total_TempCATEGORIA.Value;
                                                F_ModulDades.Rebut_TotalZONA.Value := F_ModulDades.Rebut_Total_TempZONA.Value;
                                                F_ModulDades.Rebut_TotalKM_CURSA.Value := F_ModulDades.Rebut_Total_TempKM_CURSA.Value;
                                                F_ModulDades.Rebut_TotalTRANSP.Value := F_ModulDades.Rebut_Total_TempTRANSP.Value;
                                                F_ModulDades.Rebut_TotalGRAVAT.Value := F_ModulDades.Rebut_Total_TempGRAVAT.Value;
                                                F_ModulDades.Rebut_TotalPREU_FIX.Value := F_ModulDades.Rebut_Total_TempPREU_FIX.Value;
                                                F_ModulDades.Rebut_TotalIMPORT_2.Value := F_ModulDades.Rebut_Total_TempIMPORT_2.Value;
                                                F_ModulDades.Rebut_TotalFEINER.Value := F_ModulDades.Rebut_Total_TempFEINER.Value;
                                                F_ModulDades.Rebut_TotalDOS_SECTORS.Value := F_ModulDades.Rebut_Total_TempDOS_SECTORS.Value;
                                                F_ModulDades.Rebut_TotalCAMPIONAT.Value := F_ModulDades.Rebut_Total_TempCAMPIONAT.Value;
                                                F_ModulDades.Rebut_TotalI10.Value := F_ModulDades.Rebut_Total_TempI10.Value;
                                                F_ModulDades.Rebut_TotalCODI_BARRES.Value := F_ModulDades.Rebut_Total_TempCODI_BARRES.Value;
                                                F_ModulDades.Rebut_TotalCREA_REBUT.Value := F_ModulDades.Rebut_Total_TempCREA_REBUT.Value;
                                                F_ModulDades.Rebut_TotalBICIXIPS.Value := F_ModulDades.Rebut_Total_TempBICIXIPS.Value;
                                                F_ModulDades.Rebut_TotalTI6.Value := F_ModulDades.Rebut_Total_TempTI6.Value;
                                                F_ModulDades.Rebut_TotalNUM_FIX.Value := F_ModulDades.Rebut_Total_TempNUM_FIX.Value;
                                                F_ModulDades.Rebut_TotalPAGAT.Value := F_ModulDades.Rebut_Total_TempPAGAT.Value;
                                                F_ModulDades.Rebut_TotalEXTRES.Value := F_ModulDades.Rebut_Total_TempEXTRES.Value;
                                                F_ModulDades.Rebut_TotalREPART.Value := F_ModulDades.Rebut_Total_TempREPART.Value;
                                                F_ModulDades.Rebut_TotalPAGADOR.Value := F_ModulDades.Rebut_Total_TempPAGADOR.Value;
                                                F_ModulDades.Rebut_Total.Post;
                                                F_ModulDades.Rebut_Total_Temp.Next;
                                        end;
                                end;

                                Showmessage('Fitxer Importat');
                        end
                        else
                        begin
                                ShowMessage('Fitxer NO importat');
                        end;
                finally
                        with BorraTemp do
                        begin
                                Close;
                                UnPrepare;
                                Sql.Text := 'DELETE FROM RE0006TOTALTEMP';
                                Prepare;
                                Open;
                        end;
                        F_Confirmacio.Free;
                end;

y este es el mensaje de error que se produce:

First chance exception at $75CEC42D. Exception class EIBInterBaseError with message
'Dynamic SQL Error
SQL error code = -303
arithmetic exception, numeric overflow, or string truncation'.
Process Rebuts.exe (1932)

Si alguien tiene alguna idea del porque me puede pasar pues será muy bienvenida su respuesta.

Saludos

Josep

olbeup 21-05-2014 14:43:34

Hola Jafera

El dato que esta cogiendo del fichero de texto no es un número o el número es demasiado grande, mira a ver en que línea se queda y comprueba el valor.

Un saludo.

jafera 21-05-2014 15:15:28

Gracias por la respuesta.

He mirado el fichero txt generado asi como la estructura de la tabla de destino y cuadra todo.

No se como hacer para ver el resultado de la linea

Código Delphi [-]
F_Importa.IBSQLImporta.BatchInput(F);
que es la que me da el error, se debe hacer con un Add Watch?

No se estoy un poco (mucho) desorientado ya que este proceso lleva tiempo funcionando correctamente.

Saludos

Josep

duilioisola 21-05-2014 15:29:52

El error este se da también cuando el string que quieres importar es demasiado largo para el campo donde debe entrar.
Aparentemente tienes un archivo separado por el caracter ";"
Prueba primero importar una sola línea.
Si no funciona, seguramente hay un problema en el fichero y no reconoce bien el "corte" de cada columna

Si es funciona, prueba a importar 2 líneas.
Si no funciona, puede ser que no reconozca los saltos de línea.

Si funciona, has una búsqueda dicotómica en el fichero
- divide al medio el fichero
- importalo
- Si no hay error, el error se encuentra en la otra mitad. Si hay error está en la primera mitad.
- Vuelve a hacer la búsqueda con la mitad que falla.

jafera 21-05-2014 15:42:24

Gracias por la respuesta.

He importado linea a linea y no me da ningun error.
Puede ser esto que comentas que no reconozca el salto de linea?
Si es así como puedo hacer que me reconozca el salto, en D6 no daba ningún error y funciono durante mucho tiempo hasta que he realizado la migración a XE5

Saludos

Josep

Edito: He probado otro proceso que tambien importa otro txt y me da el mismo error, ahora si que creo que no reconoce el salto de linea.

duilioisola 21-05-2014 16:29:05

Si no me equivoco, este componente también tiene un atributo "RowDelimiter".
Este sería el delimitador de siguiente línea
Mira qué es lo que tiene y modifícalo para que sea #13 o #13#10 por ejemplo.

jafera 21-05-2014 17:23:20

Gracias de nuevo.

Yo no veo este atributo por ningun lado, no se si estoy en lo correcto, la generacion del txt lo hago con la consulta sql siguiente:

Código SQL [-]
if F_Confirmacio.ShowModal = mrok then
                        begin
                                SQLAcumula.Close;
                                SQLAcumula.ParamByName('DESDEDATA').AsDate := JvDateEdit1.Date;
                                SQLAcumula.ParamByName('FINSDATA').AsDate := JvDateEdit2.Date;
                                SQLAcumula.Open;
                                If SaveDialog1.Execute then
                                begin
                                        AssignFile(E, SaveDialog1.FileName);
                                        Rewrite(E);
                                        SQLAcumula.First;
                                        while not SQLAcumula.Eof do
                                        begin
                                                WriteLn(E, SQLAcumulaID_REBUT.Value, ';', SQLAcumulaID_USUARI.Value, ';', DateToStr(SQLAcumulaDATA.Value), ';', SQLAcumulaTITOL.Value, ';', SQLAcumulaC_POSTAL.Value, ';', SQLAcumulaCODI_CLUB.Value, ';',
                                                SQLAcumulaARBITRES.Value, ';', FloatToStr(SQLAcumulaMATERIAL.Value), ';', SQLAcumulaI1.Value, ';', SQLAcumulaI2.Value, ';', SQLAcumulaI3.Value, ';', SQLAcumulaI4.Value, ';',
                                                SQLAcumulaI5.Value, ';', FloatToStr(SQLAcumulaTI1.Value), ';', FloatToStr(SQLAcumulaTI2.Value), ';', FloatToStr(SQLAcumulaTI3.Value), ';', FloatToStr(SQLAcumulaTI4.Value), ';',
                                                FloatToStr(SQLAcumulaTI5.Value), ';', FloatToStr(SQLAcumulaTOTAL_REBUT.Value), ';', FloatToStr(SQLAcumulaIMPORT.Value), ';', SQLAcumulaTEXTE.Value, ';', SQLAcumulaSUSPENSIO.Value, ';',
                                                SQLAcumulaKM_TOTALS.Value, ';', SQLAcumulaASPIRANT.Value, ';', TimeToStr(SQLAcumulaHORA_CONS.Value), ';', TimeToStr(SQLAcumulaHORA_SORT.Value), ';', SQLAcumulaNUM_CORREDORS.Value, ';', SQLAcumulaID_ARBITRE.Value, ';',
                                                SQLAcumulaID_METGE.Value, ';', SQLAcumulaDIR_CURSA.Value, ';', SQLAcumulaCATEGORIA.Value, ';', SQLAcumulaZONA.Value, ';', FloatToStr(SQLAcumulaKM_CURSA.Value), ';',
                                                SQLAcumulaTRANSP.Value, ';', SQLAcumulaGRAVAT.Value, ';', SQLAcumulaPREU_FIX.Value, ';', FloatToStr(SQLAcumulaIMPORT_2.Value), ';',
                                                FloatToStr(SQLAcumulaFEINER.Value), ';', FloatToStr(SQLAcumulaDOS_SECTORS.Value), ';', FloatToStr(SQLAcumulaCAMPIONAT.Value), ';', FloatToStr(SQLAcumulaI10.Value), ';', SQLAcumulaCODI_BARRES.Value, ';', SQLAcumulaCREA_REBUT.Value, ';',
                                                FloatToStr(SQLAcumulaTI6.Value), ';', FloatToStr(SQLAcumulaBICIXIPS.Value), ';', SQLAcumulaNUM_FIX.Value, ';', SQLAcumulaPAGAT.VaLue, ';', SQLAcumulaEXTRES.Value, ';', SQLAcumulaREPART.Value, ';', SQLAcumulaPAGADOR.Value);
                                                SQLAcumula.Next;
                                        end;
                                        CloseFile(E);
                                end;
                                Showmessage('Fitxer creat');

Estoy perdido.

Saludos

Josep

duilioisola 21-05-2014 18:19:38

Puede ser que algún valor de los que exportas tenga un ; dentro y al importarlo lo separe en dos y todo se mueva...

Imagina que el valor de un campo tipo string contenga el caracter que utilizas para separar campos:
NOMBRE = 'JUAN PEREZ'
DIRECCION = 'AV. PRINCIPAL NRO. 123; PISO 3' <-- Hay un ; en medio.
IMPORTE = 1234.56

si exportas esto como NOMBRE;DIRECCION;IMPORTE tendrás :
'JUAN PEREZ;AV. PRINCIPAL NRO. 123; PISO 3;1234,56'

Al separarlos obtendrás:
NOMBRE = 'JUAN PEREZ'
DIRECCION = 'AV. PRINCIPAL NRO. 123'
IMPORTE = PISO 3 <-- Esto no es un valor numerico

Otra cosa que puede estar molestando en la importación es la conversión de Float a String.
En España se utiliza la "," como separador decimal. En Norteamérica se utiliza el "."
La convertir mediante FloatToStr utiliza el separador decimal que el ordenador tiene definido y esto puede traer problemas si la importación espera valores separados por "." decimal

jafera 21-05-2014 18:50:50

Revisado de nuevo y no hay ningun ";" dentro de ningun campo.

Lo mas extraño es que tal y como he comentado antes en D6 funcionaba bien y en XE5 no.

Cuando llegue a casa tengo una máquina con XP 32 bits y probaré si allí lo importa, luego comentaré el resultado

Gracias a todos

Josep

jafera 22-05-2014 11:28:21

Probado en una máquina XP 32 bits y falla igual, da el mismo error.

Existe alguna forma d visualizar linea a linea lo que voy importando para sabere n que momento peta?

Gracias

Josep

jafera 28-05-2014 11:50:35

Hola a todos.

Más investigaciones, ejecutando el código en DXE5, falla siempre incluso si le pongo una sola linea me dice que fichero importado, (con lo que creia que lo habia solucionado), pero no importa nada no añade ningun registro a la tabla; si pongo más lineas pues sql error -303 etc, etc..

Si introduzco a mano los datos del txt directamente desde IBExpert en la tabla, me lo coge perfectamente, con lo cual deduxco que no es un problema del formato del txt, aunque algo esta temblando por ahí y no lo consigo aislar.

Si ejecuto el código, que es exactamente igual (he revisado linea a linea), en D6 me importa el fichero sin más.

He revisado el tema del decimal separator y está establecido en el '.' (punto), en la configuración de W7 tambien está establecido el punto.

No se que más mirar, estoy más perdido que una cabra en un garaje.

Gracias y saludos

Josep

duilioisola 28-05-2014 13:38:24

Revisa que el fichero generado también tenga como separador decimal el '.' (punto).
Si lo generas en un ordenador y lo lees en otro, esto podría traerte esa parte modificada.

El formato de la fecha también es importante. Dependiendo del separador, el orden de los elementos es diferente para Firebird (mm/dd/aaaa dd-mm-aaaa aaaa.mm.dd)

Verifica que el tipo de campo acepte el valor que le envías:
SMALLINT 0..65535
INTEGER 0..muuuucho
VARCHAR(x) x caracteres
CHAR(x) x caracteres

Lo dicho anteriormente:
Si hay comillas o comillas simples, puede que eso estropee el formato

jafera 31-05-2014 16:53:34

Hola de nuevo.

Sigo dándole vueltas al asunto.
He probado toda clase de valores en los campos y nada de nada, he probado a guardar el txt como ansi, como unicode, como utf-8 y tampoco.
He probado con otro proceso de importación con otro fichero txt completamente distinto dentro del mismo programa y me da el mismo error.
He quitado el componente que hace la importación (IBSQL), lo he vuelto a soltar dentro del form por si fuera un problema de version actualizada y tampoco funciona.
Estoy semi desesperado, en un XP a 32 bits con D6 funciona bien pero en un W7 a 64 bits con XE5 nada de nada.
Como comenté en un mensaje anterior el código de una versión a la otra es exactamente el mismo.
Porqué narices la compilación D6 funciona de fábula y la XE5 no?
Tendré que cambiar los componentes de acceso a datos?

Gracias por vuestro tiempo.

Saludos

Josep

Casimiro Notevi 31-05-2014 17:25:13

¿Pero por qué no miras en qué linea se detiene?
Tienes muchas formas de hacerlo, por ejemplo, en el bucle puedes mostrar el valor de uno de los campos, código, nombre, etc. que te sirva para reconocer la línea.
También puedes escribir un contador y luego miras en el fichero de texto la línea a la que corresponde.
Etc...

jafera 31-05-2014 17:50:38

Gracias Antonio.

El problema es que no me importa ni una sola linea, eso es lo que me da quebraderos de cabeza.
Tal como comenté en un post anterior si cojo el valor de los campos y los meto a mano en la tabla mediante IBExpert no me da ningun error.
Si pongo una sola linea en el txt me dice que la ha importado pero en la tabla no se refleja nada.

Esto es lo que me pasa basicamente

Saludos

Josep

Casimiro Notevi 31-05-2014 17:55:36

Ahora mismo no recuerdo, pero ¿esto es correcto?

Código Delphi [-]
WriteLn(E, SQLAcumulaID_REBUT.Value, ';', SQLAcumulaID_USUARI.Value, ';', DateToStr(SQLAcumulaDATA.Value), ';', 
                             SQLAcumulaTITOL.Value, ';', SQLAcumulaC_POSTAL.Value, ';', SQLAcumulaCODI_CLUB.Value, ';', 
                             SQLAcumulaARBITRES.Value, ';', FloatToStr(SQLAcumulaMATERIAL.Value), ';', SQLAcumulaI1.Value, ';',
...
...
etc.

Quiero decir que si ¿writeln admite valores separados por comas?

jafera 31-05-2014 18:23:03

Hola de nuevo.

El separador es el punto y coma.
Por lo menos defino el
Código Delphi [-]
F.ColDelimiter := ';';
en la importación.

Pero como ya comenté este código en D6 lleva cuatro años funcionando perfectamente en este proceso y algo similar en otros procesos

Josep

Casimiro Notevi 31-05-2014 19:13:48

Por qué no pruebas a escribir cualquier cosa, para empezar. Por ejemplo,
Código Delphi [-]
writeln(E,"hola")
Y a partir de ahí vas viendo, según el resultado.

jafera 05-06-2014 15:13:14

1 Archivos Adjunto(s)
He seguido haciendo pruebas.

He creado un fichero a mano con el orden de los campos dejando solo los campos enteros y los alfanumericos en blanco y el resultado es la imagen adjunta.

Creo que por lo que deduzco me interpreta toda la linea como una cadena.

No se que mas mirar.

Saludos

Josep

duilioisola 05-06-2014 17:33:06

Todo indica que está asumiendo que todo es una misma columna.

Te propongo una prueba mas:
Genera el fichero con la función TIBOutputDelimitedFile

De esta manera te asegurarías de que quien escribe el fichero y quien lo lee es el "mismo componente".
Una vez lo hayas exportado, compara los fichero para ver dónde está la diferencia.
Quizás espera un espacio entre campos o necesita que los strings estén entre comillas o alguna cosa de esas.

Ya nos informarás de si esto ha servido...

jafera 16-06-2014 15:05:51

Buenas de nuevo.

Retomo el hilo para comentaros los avances, o no.

He creado el fichero mediante el uso de un IBSQL tal y como me recomendasteis, el resultado del proceso es un fichero txt exactamente igual que el creado mediante el proceso antiguo.

Al importar este fichero en el ejecutable hecho con XE5, sigue mostrando el error -303, si me llevo el txt tanto el creado mediante IBSQL como el anterior al ejecutable generado con Delphi 6, se importa perfectamente.

Yo creo que voy a dejar este proyecto congelado en Delphi 6 ya que no se que más mirar, ni si puedo poner un visor para ver donde se para exactamente ya que con el F8 se queda en la linea del BatchInput(F).

Código Delphi [-]
F_ModulDades.Act_Girona_Temp.Close;
F_ModulDades.Act_Girona_Temp.Open;
F_ModulDades.Act_Girona_Temp.Append;
F_Importa.IBSQLImporta.SQL.Text := 'Insert into RE0006AGTEMP values(:ID, :ID_REBUT, :ID_ARBITRE, :NOM, :DATA, :TITOL, :CODI_CLUB, :CANON, :ID_USUARI)';
F := TIBInputDelimitedFile.Create;
    try
          F.ColDelimiter := ';';
          if OpenDialog1.Execute then
          begin
                   F.Filename := OpenDialog1.FileName;
          end;
          F_Importa.IBSQLImporta.BatchInput(F);
finally
          F.Free;
end;

Lo único que se me ocurre es que si alguien quiere hacer un teamviewer conmigo pues estaré encantado de mostrar el proceso que me lleva de craneo y verlo "fallar" los dos a la vez.

Gracias a todos

Saludos

Josep

Nota esta es una de las lineas creadas con el proceso normal:

43;12;1;FERNANDEZ ALBERTI, Josep Antoni;22/08/2010;ESCALADA CASTELL BLANES;626;1.5;2

Solo me queda dudar de que interprete el espacio entre apellidos como final de linea........

duilioisola 16-06-2014 15:28:23

Por lo que entiendo, en este último mensaje, utilizas Delphi 6 para generar la exportación y Delphi XE5 para la importación.
Este podría ser el problema. A partir de Delphi 2009 (creo) se trabaja con Unicode. Deberías ver la posibilidad de crear la exportación con Delphi XE5 y ver si el fichero es igual al exportado con Delphi 6.
En un fichero de texto, los primeros bytes te dicen si en qué formato está. Mira BOM

jafera 16-06-2014 15:30:39

Gracias por la respuestas.

Igual no me he explicado bien, el fichero lo genero en XE5 y no lo importo en XE5 pero si en D6, que es lo que me tiene la mosca en la oreja.

Saludos

Josep

duilioisola 16-06-2014 15:47:29

Entonces sería al contrario... mira como se codifica el fichero que sale de Delphi XE5. Si lo miras byte a byte, podrás ver si tiene algo delante (BOM).
Por ejemplo, podría ser que el fichero empiece con EF BB BF si se tratara de UTF8 y que Delphi 6 los interpretaría como 3 caracteres que se deben procesar. Así, el primer campo de la importación sería "43" que daría un error de conversión si se espera un número.

Podrías preprocesar el fichero con algo así y generar un fichero temporal que luego importarás.
Código Delphi [-]
var
  Registro : string;
  Datos : TextFile;
[...]
           AssignFile(Datos,  OpenDialog1.FileName);
           Reset(Datos);
           CaracteresIgnorar := 0;
           try
              while not EOF(Datos) do
              begin
                 ReadLn(Datos, Registro);
                 {En la primera linea debo ver si es un archivo UTF y ver cuantos caracteres debo ignorar}
                 if (PrimeraLinea) then
                 begin
                    if (Ord(Registro[1]) = $EF) and (Ord(Registro[2]) = $BB) and (Ord(Registro[3]) = $BF) then {Posiblemente UTF8}
                       CaracteresIgnorar := 3;

                    Registro := copy(Registro,CaracteresIgnorar, Length(Registro));
                 end;
                 // Agrego Registro a un StringList
                 sl.Add(Registro);
              end; // while
              // Grabo el StringList a un fichero Temporal
              sl.SaveToFile(FicheroTemporal);

              // importo el fichero temporal
[...]

jafera 16-06-2014 15:49:27

Ok, pero como se mira un fichero txt para ver esta codificación?

He mirado el enlace que me has puesto y estoy más perdido que un pulpo en un garaje.

Saludos

Josep

jafera 16-06-2014 17:14:30

Y una duda que me queda para la prueba, "sl" como se declara?

Es una variable?

Josep

jafera 16-06-2014 17:54:49

Hechas las primeras pruebas, la primera linea empieza por......tachan..... , pero en el codigo puesto, lo he modificado así:

Código Delphi [-]
procedure TF_Importa.Button1Click(Sender: TObject);
var
  Registro : string;
  Datos, ficherotemporal : TextFile;
  caracteresignorar : integer;
  PrimeraLinea : Boolean;
  sl:tstringlist;
begin
           if opendialog1.Execute then
           begin
           AssignFile(Datos,  OpenDialog1.FileName);
           Reset(Datos);
           CaracteresIgnorar := 0;
           try
              while not EOF(Datos) do
              begin
                 ReadLn(Datos, Registro);
                 {En la primera linea debo ver si es un archivo UTF y ver cuantos caracteres debo ignorar}
                 if (PrimeraLinea) then
                 begin
                    if (Ord(Registro[1]) = $EF) and (Ord(Registro[2]) = $BB) and (Ord(Registro[3]) = $BF) then {Posiblemente UTF8}
                       CaracteresIgnorar := 3;
                    Registro := copy(Registro,CaracteresIgnorar, Length(Registro));
                 end;
                 // Agrego Registro a un StringList
                 sl.Add(Registro);
              end; // while
              // Grabo el StringList a un fichero Temporal
              sl.SaveToFile('C:\Rebuts_1.0\Fitxers\Ranking\FicheroTemporal.txt');
              finally
              // importo el fichero temporal
              end;
           end;
end;

ejecutando paso a paso , me dice que primeralinea := False, o sea que no pasa por el caracteresIgnorar y viendo que vale registro y siendo realmente la primera linea pues empieza por los caracteres descritos.

Algo sigo haciendo mal

Gracias

Josep

jafera 16-06-2014 18:23:18

Más avances.

Si codifico el txt como UTF8 (guardar como) es cuando detecta los caracteres iniciales.
Si lo codifico Annsi, no me reconoce caracteres al inicio y la linea (Registro) se ve correcta, pero el código no hace sl.Add, peta y da access violation

Codigo modificado:

Código Delphi [-]
begin
           if opendialog1.Execute then
           begin
           AssignFile(Datos,  OpenDialog1.FileName);
           Reset(Datos);
           CaracteresIgnorar := 0;
           PrimeraLinea:=True;
           sl:=TStringList.Create;  // faltaba esto
           try
              while not EOF(Datos) do
              begin
                 ReadLn(Datos, Registro);
                 {En la primera linea debo ver si es un archivo UTF y ver cuantos caracteres debo ignorar}
                 if (PrimeraLinea) then
                 begin
                    if (Ord(Registro[1]) = $EF) and (Ord(Registro[2]) = $BB) and (Ord(Registro[3]) = $BF) then {Posiblemente UTF8}
                       CaracteresIgnorar := 3;

                    Registro := copy(Registro,CaracteresIgnorar, Length(Registro));
                 end;
                 // Agrego Registro a un StringList
                 sl.Add(Registro);                     //Aqui acces violation.
                 next;
              end; // while
              // Grabo el StringList a un fichero Temporal
              sl.SaveToFile('C:\Rebuts_1.0\Fitxers\Ranking\FicheroTemporal.txt');
              finally
              // importo el fichero temporal
              end;
           end;
end;

No se si todo el código de pruebas esta correctamente realizado.
Esta variable sl se debe inicializar?
Por esto da access violation?

Saludos

Josep

jafera 14-07-2014 16:30:34

Buenas a todos los que seguis este hilo y a los nuevos curiosos pues también.

He tardado bastante en contestar a las modificaciones que he realizado desde el último post ya que no sabía como solucionar el problema, no era un defecto del txt, ya que esto pasaba en varios archivos de este tipo.

Al final, he implementado una solución utilizando el componente JvCsvDataSet al que le cargo el fichero txt generado y anda de maravilla.

No conocía este componente y realmente es potente y sencillo de usar aunque al principio el declarar los campos, las cabeceras etc., es un poco lioso hasta que se asimila bien.

Hoy por fin doy por finiquitado el problema ya que la importación se realiza sin problemas y sin usar tablas temporales intermedias.

Saludos

Josep


La franja horaria es GMT +2. Ahora son las 06:49:47.

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