PDA

Ver la Versión Completa : Problemas al exportar a excel con FireSoft


Espartaco
08-03-2007, 15:11:25
Hola de nuevo amigos, tengo otro pequeño problema que supongo será una tontería.
Resulta que estoy usando los componentes de FireSoft para exportar a Excel, y me funcionaban perfectamente, pero no sé porqué resulta que ahora cuando ejecuto el programa me dice que no encuentra el archivo DataExport.pas. Lo he buscado donde tengo los archivos de FireSoft y sólo existe el DataExport.dcu. El DataExport.pas no existe en mi disco duro y sin embargo antes me funcionaba. Puede alguien decirme que está ocurriendo.

Utilizo Delphi 5. He desinstalado los componentes y los he vuelto a instalar pero sigue pidiendome el pas.

Gracias por anticipado. Un saludo.

Espartaco
12-03-2007, 14:43:09
Soy yo otra vez, compañeros. Solo añadir al post anterior, que uso lo mismo en otra forma del programa para hacer otra exportación y me va bien. He mirado y esta todo igual incluidas las uses de las dos formas.

Espero que me podais ayudar.
Muchas gracias.

delphi.com.ar
12-03-2007, 20:11:27
Los archivos DCU no son mas que los PAS compilados, por lo que si tu proyecto encuentra el DCU podrías evitar el problema. De todos modos de mi página tambien puedes bajar la versión con código, donde puedes encontrar el querido: "DataExport.pas". :D

Saludos!

Espartaco
13-03-2007, 12:49:46
Gracias por tu respuesta Delphi.com.ar. He descargado el dichoso archivo .pas y lo he colocado en su sitio, pero ahora me da el siguiente error que te pongo para que lo veas.

if not ACancel then
begin
WriteRecord;
Inc(FRecNo);
if Assigned(FAfterWriteRecord) then
FAfterWriteRecord(Self);
end;
FDataSet.Next;
end;
finally //AQUI SE PARA EL DEBUGER DE DELPHI CUANDO DA EL ERROR
if FPreserveBookmark then
FDataSet.Bookmark := Bookmark;
end;
finally
FDataSet.EnableControls;
end;
end;
procedure TDataExport.SetDataSet(const Value: TDataSet);
begin
FDataSet := Value;

Nota: Este codigo es parte del DataExport.pas

Ya sabia que el dcu es el compilado del pas, incluso he borrado el dcu del path pero aun asi sigue igual.

Lo que me extraña mucho, es que antes funcionaba perfectamente, pero ahora solo me funciona en una de las formas del programa y en otra no. Es lo que no entiendo, pues lo pongo todo igual.

La verdad estoy un poco desesperado porque el cliente me esta apretando. He probado desinstalar los componentes y volverlos a instalar, pero nada.

Gracias por tu apoyo y a ver si ves algo raro en todo esto.

delphi.com.ar
13-03-2007, 14:39:40
Sería bueno que nos digas que error es que da!. Por otro lado, por lo que cuentas sospecho que el error pueda venir del tipo de cursor que estes abriendo, por ejemplo que sea unidireccional.

Saludos!

roman
13-03-2007, 18:18:01
¿Tu componente no trabaja con unidireccionales? ¿Cuál sería la restricción?

// Saludos

Espartaco
14-03-2007, 10:49:03
El mensaje de error es que no puede crear el archivo.

Por otro lado no sé a qué os referís con lo de unidireccional, a lo mejor sé lo que es pero dicho así no sé a qué se refiere. Os agradecería si pudierais explicarme un poco.

Lo que sí he descubierto tras varios intentos son dos cosas:

- Si realizo la operación de exportar desde otra ficha nueva, empieza a funcionar bien hasta que a partir de un momento determinado empieza a fallar otra vez. No sé en qué momento exactamente.

- Yo utilizo otra ficha con un DirectoryListBox para decidir el nombre del archivo y la carpeta donde se va a colocar.
Para obtener el nombre del archivo abro la ficha así

Ficha1:=TExportExcel.Create(Self);
Ficha1.ShowModal;
Ficha1.Free;

y Utilizo una variable pública

DestinoC :string;

y luego cuando cierro la ficha anterior, una vez añadido a la variable la extensión XLS, creo el archivo de esta manera

DataToXLS1.SaveToFile(DestinoC);

Bien pues si en vez de hacer esto, le pongo directamente el nombre del archivo sí funciona, de esta manera

DataToXLS1.SaveToFile('c:\fichmaq\DestinoC.xls');

pero ojo, en la otra ficha que comenté anteriormente, lo hago igual y funciona perfectamente.

La verdad no entiendo qué puede estar pasando.

Gracias por vuestro interés.

roman
14-03-2007, 18:38:52
La variable DestinoC, ¿dónde está declarada?

// Saludos

Espartaco
15-03-2007, 10:00:09
La tengo declarada en la ficha que inicia el proceso, a continuación pongo un trozo del código de dicha ficha

procedure BitBtn2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
DestinoC: String;
implementation
uses ExpExcl, Menu, LAsigFab;
{$R *.DFM}
procedure TForm1.BitBtn3Click(Sender: TObject);
var ficha1: TExportExcel;

Pero reitero, en otra ficha está igual que en esta y funciona perfectamente.

Gracias.

delphi.com.ar
15-03-2007, 14:22:46
¿Tu componente no trabaja con unidireccionales? ¿Cuál sería la restricción?
Si funciona!.. tenía una idea errónea :p


El mensaje de error es que no puede crear el archivo.

...

- Si realizo la operación de exportar desde otra ficha nueva, empieza a funcionar bien hasta que a partir de un momento determinado empieza a fallar otra vez. No sé en qué momento exactamente.
¿No será que empieza a fallar en el momento en que tienes el archivo abierto y bloqueado por el Excel? :D

Espartaco
16-03-2007, 10:55:41
No sé donde puediera estar el archivo bloqueado por el Excel, ya que yo no tengo el Excel abierto en el momento de exportar. Además, insisto en que en otra ficha me lo hace bien.

Creo que voy a tirar la toalla y ponerle un nombre de archivo fijo en una carpeta fija:( Frustrante, no?

Gracias a todos por vuestra ayuda, de todas formas seguiré visitando este hilo por si a alguien le ha pasado lo mismo y lo ha solucionado. También he pensado en usar otro componente similar, lo que pasa es que este funciona muy rápido, muy bien y es muy sencillo.

delphi.com.ar
16-03-2007, 16:24:07
Es que algo me dice que el problema no viene propiamente del control, sobre todo por el error que dices que informa. ¿Has probado poner un punto de ruptura sobre el SaveToFile para evaluar el contenido de la variable DestinoC?
Básicamente el control crea un TFileStream y escribe la información en este stream, al igual que muchas clases de la VCL. Dudo que falle en sí el procedimiento, ademas que aparenta ser un clásico error informado por el SO, tal como si hacemos:

with TStringList.Create do
try
SaveToFile('');
finally
Free;
end;

o

with TStringList.Create do
try
SaveToFile('c:\?');
finally
Free;
end;

O algún archivo en uso:

with TStringList.Create do
try
SaveToFile('c:\pagefile.sys');
finally
Free;
end;


¿Solo dice que no se puede crear el archivo?

Saludos!

Espartaco
19-03-2007, 13:47:33
Si eses es el error que da, pero si lo prueba en diseño, me da el error y se queda parado en DataExport.pas en la parte que comentas del TFileStream.

Efectivamente creo que el problema debe estar en la variable, he probado ponerla global en la ficha principal pero hace lo mismo, en cambio si en vez de utilizar la ficha con el DirectoryListBox lo hago con un InputBox, no tengo ningún problema, por tanto debe haber algo raro en eso.

No he probado lo del punto de ruptura porque no estoy muy ducho en el Debug, es mi asignatura pendiente, de todas formas seguiré intentado solucionarlo y si encuentro el problema lo postearé para otros foreros.

Si podeis recomendarme alguna lectura sobre el Debug que sea buena os lo agradecería.

Muchas gracias Delphi.com.ar y Roman por vuestra ayuda.

Un saludo,;)

delphi.com.ar
19-03-2007, 15:29:57
Te recomiendo que te bajes el libro "La cara oculta de Delphi 4" que puedes bajar gratuitamente de la página del autor: www.Marteens.com

Igualmente, rápidamente puedes hacer la siguiente prueba, agregando un mensaje antes de intentar crear el archivo:

ShowMessageFmt('El archivo que quiero generar es:"%s"', [DestinoC]);
DataToXLS1.SaveToFile(DestinoC);

Saludos!

Espartaco
20-03-2007, 13:31:33
Tenías razón, me daba el error porque la variable DestinoC estaba vacía. Lo he comprobado con el codigo que me has pasado. El problema era que tenía que poner la variable en la unidad principal y poner en el uses de la ficha que contenía el DirectoryListBox la ficha principal.

Ahora funciona correctamente, muchas gracias por todo.

Foros como este hacen la vida del programador un poco menos solitaria.:)