Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 16-06-2014
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
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, ATA, :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........

Última edición por jafera fecha: 16-06-2014 a las 15:12:10.
Responder Con Cita
  #22  
Antiguo 16-06-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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
Responder Con Cita
  #23  
Antiguo 16-06-2014
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
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
Responder Con Cita
  #24  
Antiguo 16-06-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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
[...]

Última edición por duilioisola fecha: 16-06-2014 a las 16:00:08.
Responder Con Cita
  #25  
Antiguo 16-06-2014
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
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
Responder Con Cita
  #26  
Antiguo 16-06-2014
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
Y una duda que me queda para la prueba, "sl" como se declara?

Es una variable?

Josep
Responder Con Cita
  #27  
Antiguo 16-06-2014
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
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
Responder Con Cita
  #28  
Antiguo 16-06-2014
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
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

Última edición por jafera fecha: 16-06-2014 a las 18:26:33.
Responder Con Cita
  #29  
Antiguo 14-07-2014
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
DELPHI6 Importar fichero codificado UTF-8 a Dbase Jose Manuel Varios 0 16-05-2011 18:46:14
Importar fichero XML cincosoft OOP 1 08-02-2009 10:29:58
Importar fichero .dat desde cobol julian_ch Varios 0 08-08-2005 17:43:17
Error al importar dll mguixot Varios 2 08-07-2005 15:47:26
importar fichero consumo telefonica tonid Varios 3 11-09-2003 09:49:28


La franja horaria es GMT +2. Ahora son las 09:22: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
Copyright 1996-2007 Club Delphi