PDA

Ver la Versión Completa : Un problema con COLNITIALIZE


mRoman
22-06-2005, 16:21:40
Tengo un problema que no sé como resolverlo.....bueno mas bien es un error que no sé como corregirlo, espero que alguno de uds., que tiene mas experiencia en la programación con delphi, y particularmente en el uso de codigo para exportar información de Interbase a Excel, me pueda ayudar a corregirlo, ya que anteriormente funcionaba pero le agrege un componente y eso hizo que restructura el código un poco, no hubo grandes cambios.

Bueno el error es este.....cuando corro la aplicación (mis sistema), y selecciono del menu principal el proceso para exportar, se detiene en la linea :

Excel:=CreateOleObject('Excel.Application');

Y marca el siguiente error: raised exception class EOleSysError with message 'No se ha llamado a Colnitialize'. De que esta hablando?....le mando el código completo para un mayor analisis.
unit Exportar;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IBExtract, Buttons, ToolWin, ComCtrls, ExtCtrls, StdCtrls,
DB, IBCustomDataSet, kds2dbf, OleServer, Excel2000, ComObj, IBQuery,
DataExport, DataToDbf, Mask, DataToXLS;

type
TfrmExportar = class(TForm)
pnlEncabezado: TPanel;
ToolBar1: TToolBar;
sBtnExit: TSpeedButton;
pnlDatos: TPanel;
pnlBotones: TPanel;
SpeedButton1: TSpeedButton;
sBtnExportar: TBitBtn;
pnlPeriodo: TPanel;
Label1: TLabel;
Label2: TLabel;
mskMes: TMaskEdit;
mskAnio: TMaskEdit;
pnlTabla: TPanel;
cbxTablas: TComboBox;
Label3: TLabel;
Label4: TLabel;
qryExportarExcel: TIBQuery;
dXls: TDataToXLS;
procedure sBtnExportarClick(Sender: TObject);
procedure sBtnExitClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure pnlPeriodoExit(Sender: TObject);
procedure pnlTablaEnter(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
frmExportar: TfrmExportar;

implementation
uses Modulo;
{$R *.dfm}

procedure TfrmExportar.sBtnExportarClick(Sender: TObject);
Var
Excel, Libro: Variant;
i,nRuta,nRuta2,nHoja,nMes,nAnio,nCveLec, nFrec :Integer;
nTotFrec, nTotKmsVis, nTotKmsMes,nTotImp,nKmsVis, nKmsMes, nImp : Double;
nDesc, nTotPagar : Double;
Nombre, cRuta, cDescrip, cDias,cFichero, cSuma, cMarcaVehiculo,cModelo : String;
cPlacas, cAseguradora, cPoliza, cSede : String;
cLun1,cLun2,cLun3,cLun4,cLun5,cMar1,cMar2,cMar3,cMar4,cMar5 : TMemo;
cMie1,cMie2,cMie3,cMie4,cMie5,cJue1,cJue2,cJue3,cJue4,cJue5 : TMemo;
cVie1,cVie2,cVie3,cVie4,cVie5 : TMemo;

begin
case cbxTablas.ItemIndex of
0: Begin
qryExportarExcel.Close;
qryExportarExcel.SQL.Clear;
qryExportarExcel.SQL.Add('Select a.mes_periodo,a.anio_periodo,a.clave_ruta,a.lun1,a.lun2,a.lun3,');
qryExportarExcel.SQL.Add('a.lun4,a.lun5,a.mar1,a.mar2,a.mar3,a.mar4,a.mar5,a.mie1,a.mie2,');
qryExportarExcel.SQL.Add('a.mie3,a.mie4,a.mie5,a.jue1,a.jue2,a.jue3,a.jue4,a.jue5,a.vie1,a.vie2,');
qryExportarExcel.SQL.Add('a.vie3,a.vie4,a.vie5,a.sede,a.lecherias,a.lecherias2,a.lecherias3,');
qryExportarExcel.SQL.Add('a.lecherias4,a.comentarios,c.nombre');
qryExportarExcel.SQL.Add('from CALENDARIO a, RUTA b, PROMOTOR c');
qryExportarExcel.SQL.Add('where MES_PERIODO=:MES');
qryExportarExcel.SQL.Add(' and ANIO_PERIODO=:ANIO');
qryExportarExcel.SQL.Add(' and a.clave_ruta=b.clave_ruta');
qryExportarExcel.SQL.Add(' and b.clave_promotor=c.clave_promotor');
qryExportarExcel.SQL.Add('order by a.CLAVE_RUTA');
qryExportarExcel.ParamByName('MES').AsInteger:=StrToInt(mskMes.Text);
qryExportarExcel.ParamByName('ANIO').AsInteger:=StrToInt(mskAnio.Text);
qryExportarExcel.Open;

Excel:=CreateOleObject('Excel.Application');
Excel.Visible:=False;
Excel.DisplayAlerts:=False;
Excel.WorkBooks.Add('c:\Atencion\Plantillas\Calendario.xlt');
qryExportarExcel.First;
nHoja:=1;
// nTotPagar:=0;
While not (qryExportarExcel.Eof) do
begin
i:=10;
nRuta:=qryExportarExcel.FieldValues['CLAVE_RUTA'];
nRuta2:=qryExportarExcel.FieldValues['CLAVE_RUTA'];
cRuta:='Ruta '+IntToStr(nRuta);
Nombre:=qryExportarExcel.FieldValues['NOMBRE'];
nMes:=qryExportarExcel.FieldValues['MES_PERIODO'];
nAnio:=qryExportarExcel.FieldValues['ANIO_PERIODO'];
cSede:=qryExportarExcel.FieldValues['SEDE'];
Excel.WorkBooks[1].WorkSheets[nHoja].Name:=cRuta;
Libro:=Excel.WorkBooks[1].WorkSheets[cRuta];
Libro.Cells[6,1]:='Ruta:'+IntToStr(nRuta)+' '+Nombre;
Libro.Cells[6,3]:='SEDE:'+cSede;
Libro.Cells[6,5]:='Periodo:'+IntToStr(nMes)+' '+IntToStr(nAnio);
While (nRuta=nRuta2) and not (qryExportarExcel.Eof) do
begin
cLun1.Text:=qryExportarExcel.FieldValues['LUN1'];
Libro.Cells[i,1]:=cLun1.Text;
qryExportarExcel.Next;
inc(i);
end;
inc(nHoja);
end;
cFichero:='c:\Atencion\XLS\Calendario_'+mskMes.Text+mskAnio.Text+'.xls';
Libro.SaveAs(cFichero);
ShowMessage('El Archivo '+cFichero+' ha sido creado');
Excel.quit;
cbxTablas.SetFocus;
end;
1: Begin
qryExportarExcel.Close;
qryExportarExcel.SQL.Clear;
qryExportarExcel.SQL.Add('SELECT a.clave_ruta,a.mes_periodo, a.anio_periodo, a.clave_lec,');
qryExportarExcel.SQL.Add('a.lec_descripcion, a.frecuencia, a.kms_visitas, a.kms_mensual,a.importe, c.nombre,');
qryExportarExcel.SQL.Add('d.descripcion, c.placas,c.modelo,c.aseguradora,c.poliza,');
qryExportarExcel.SQL.Add('a.dias_visita, c.clave_promotor, a.descuento,a.COMENTARIO');
qryExportarExcel.SQL.Add('FROM costo_ruta a, ruta b, promotor c, vehiculo d');
qryExportarExcel.SQL.Add('WHERE a.mes_periodo=:MES');
qryExportarExcel.SQL.Add('AND a.anio_periodo=:ANIO');
qryExportarExcel.SQL.Add('AND a.clave_ruta=b.clave_ruta');
qryExportarExcel.SQL.Add('AND b.clave_promotor=c.clave_promotor');
qryExportarExcel.SQL.Add('AND c.clave_coche=d.clave_coche');
qryExportarExcel.SQL.Add('ORDER BY a.clave_ruta, a.clave_lec');
qryExportarExcel.ParamByName('MES').AsInteger:=StrToInt(mskMes.Text);
qryExportarExcel.ParamByName('ANIO').AsInteger:=StrToInt(mskAnio.Text);
qryExportarExcel.Open;
Excel:=CreateOleObject('Excel.Application');
Excel.Visible:=False;
Excel.DisplayAlerts:=False;
Excel.WorkBooks.Add('c:\Atencion\Plantillas\costos.xlt');
qryExportarExcel.First;
nHoja:=1;
nTotPagar:=0;
While not (qryExportarExcel.Eof) do
begin
i:=12;
nRuta:=qryExportarExcel.FieldValues['CLAVE_RUTA'];
nRuta2:=qryExportarExcel.FieldValues['CLAVE_RUTA'];
cRuta:='Ruta '+IntToStr(nRuta);
Nombre:=qryExportarExcel.FieldValues['NOMBRE'];
nMes:=qryExportarExcel.FieldValues['MES_PERIODO'];
nAnio:=qryExportarExcel.FieldValues['ANIO_PERIODO'];
Excel.WorkBooks[1].WorkSheets[nHoja].Name:=cRuta;
Libro:=Excel.WorkBooks[1].WorkSheets[cRuta];
Libro.Cells[7,3]:=Nombre;
Libro.Cells[7,13]:=nMes;
Libro.Cells[8,3]:=nRuta;
Libro.Cells[8,13]:=nAnio;
nTotImp:=0;
nTotFrec:=0;
nTotKmsVis:=0;
nTotKmsMes:=0;
nDesc:=0;
While (nRuta=nRuta2) and not (qryExportarExcel.Eof) do
begin
nCveLec :=qryExportarExcel.FieldValues['CLAVE_LEC'];
cDescrip:=qryExportarExcel.FieldValues['LEC_DESCRIPCION'];
nFrec :=qryExportarExcel.FieldValues['FRECUENCIA'];
nKmsVis :=qryExportarExcel.FieldValues['KMS_VISITAS'];
nKmsMes :=qryExportarExcel.FieldValues['KMS_MENSUAL'];
nImp :=qryExportarExcel.FieldValues['IMPORTE'];
cDias :=qryExportarExcel.FieldValues['DIAS_VISITA'];
cMarcaVehiculo:=qryExportarExcel.FieldValues['DESCRIPCION'];
if qryExportarExcel.FieldByName('DESCUENTO').IsNull then begin
nDesc:=0;
end Else Begin
nDesc:=qryExportarExcel.FieldValues['DESCUENTO'];
end;
if cMarcaVehiculo='NINGUNO' then begin
cMarcaVehiculo:='';
cModelo:='';
cPlacas:='';
cAseguradora:='';
cPoliza:='';
end Else Begin
cMarcaVehiculo:=qryExportarExcel.FieldValues['DESCRIPCION'];
cModelo :=qryExportarExcel.FieldValues['MODELO'];
cPlacas :=qryExportarExcel.FieldValues['PLACAS'];
cAseguradora :=qryExportarExcel.FieldValues['ASEGURADORA'];
cPoliza :=qryExportarExcel.FieldValues['POLIZA'];
end;
Libro.Cells[i,1] :=nCveLec;
Libro.Cells[i,3] :=cDescrip;
Libro.Cells[i,5] :=cDias;
Libro.Cells[i,7] :=nFrec;
Libro.Cells[i,9] :=nKmsVis;
Libro.Cells[i,11]:=nKmsMes;
Libro.Cells[i,13]:=nImp;
inc(i);
nTotFrec:=nTotFrec+nFrec;
nTotKmsVis:=nTotKmsVis+nKmsVis;
nTotKmsMes:=nTotKmsMes+nKmsMes;
nTotImp :=nTotImp+nImp;
qryExportarExcel.Next;
nRuta:=qryExportarExcel.FieldValues['CLAVE_RUTA'];
end;
inc(i);
Libro.Cells[i,5]:='SubTotal';
Libro.Cells[i,7]:=nTotFrec;
Libro.Cells[i,9]:=nTotKmsVis;
Libro.Cells[i,11]:=nTotKmsMes;
Libro.Cells[i,13]:=nTotImp;
Libro.Cells[i+1,11]:='*Descuento';
Libro.Cells[i+1,13]:=nDesc;
Libro.Cells[i+2,11]:='TOTAL A PAGAR';
nTotPagar:=nTotImp-nDesc;
Libro.Cells[i+2,13]:=nTotPagar;
Libro.Cells[i+4,1]:='CARACTERISCTAS DEL VEHICULO';
Libro.Cells[i+5,1]:='Marca Vehiculo:';
Libro.Cells[i+5,2]:=cMarcaVehiculo;
Libro.Cells[i+6,1]:='Modelo:';
Libro.Cells[i+6,2]:=cModelo;
Libro.Cells[i+7,1]:='Placas:';
Libro.Cells[i+7,2]:=cPlacas;
Libro.Cells[i+5,5]:='Aseguradora:';
Libro.Cells[i+5,7]:=cAseguradora;
Libro.Cells[i+6,5]:='Numero Poliza:';
Libro.Cells[i+6,7]:=cPoliza;
Libro.Cells[i+20,1]:=Nombre;
Libro.Cells[i+21,1]:='PROMOTOR SOCIAL';
Libro.Cells[i+22,1]:='(FIRMA)';
Libro.Cells[i+20,8]:='ING. VICTOR MARIO FLORES RUBIO';
Libro.Cells[i+21,8]:='SUBGERENTE DE PADRON DE BENEFICIARIOS';
Libro.Cells[i+22,8]:='(FIRMA)';
inc(nHoja);
end;
cFichero:='c:\Atencion\XLS\costo_'+mskMes.Text+mskAnio.Text+'.xls';
Libro.SaveAs(cFichero);
ShowMessage('El Archivo '+cFichero+' ha sido creado');
Excel.quit;
cbxTablas.SetFocus;
// ShowMessage('En proceso');
end;
end; //Fin del CASE
end;

procedure TfrmExportar.sBtnExitClick(Sender: TObject);
begin
Close;
end;

procedure TfrmExportar.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action:=caFree;
end;

procedure TfrmExportar.pnlPeriodoExit(Sender: TObject);
begin
if (mskMes.Text='') or (mskAnio.Text='') then begin
Application.MessageBox('Digita un periodo valido','Error',mb_ok+mb_IconError);
cbxTablas.SetFocus;
end Else Begin
if cbxTablas.ItemIndex = 0 then begin
qryExportarExcel.Close;
qryExportarExcel.SQL.Clear;
qryExportarExcel.SQL.Add('SELECT * FROM CALENDARIO');
qryExportarExcel.SQL.Add('WHERE MES_PERIODO=:MES AND ANIO_PERIODO=:ANIO');
qryExportarExcel.ParamByName('MES').AsInteger:=StrToInt(mskMes.Text);
qryExportarExcel.ParamByName('ANIO').AsInteger:=StrToInt(mskAnio.Text);
qryExportarExcel.Open;
end Else Begin
qryExportarExcel.Close;
qryExportarExcel.SQL.Clear;
qryExportarExcel.SQL.Add('SELECT * FROM costo_ruta');
qryExportarExcel.SQL.Add('WHERE MES_PERIODO=:MES AND ANIO_PERIODO=:ANIO');
qryExportarExcel.ParamByName('MES').AsInteger:=StrToInt(mskMes.Text);
qryExportarExcel.ParamByName('ANIO').AsInteger:=StrToInt(mskAnio.Text);
qryExportarExcel.Open;
end;
if qryExportarExcel.IsEmpty then begin
Application.MessageBox('No existen movimientos para este periodo','Error',mb_ok+mb_IconError);
cbxTablas.SetFocus;
end;
qryExportarExcel.Active:=true;
end;// Fin del IF
end;

procedure TfrmExportar.pnlTablaEnter(Sender: TObject);
begin
qryExportarExcel.Active:=False;
qryExportarExcel.Close;
mskMes.Text:='';
mskAnio.Text:='';
cbxTablas.Text:='';
end;

end.

DE ANTEMANO GRACIAS POR SUS COMENTARIOS AL RESPECTO, y ojala y me puedan ayudar.

dec
22-06-2005, 16:53:56
Hola,

RAP de la etiqueta DELPHI (léase el texto en tono cántico-festivo-rapero)

La etiqueta DELPHi está aquí,
y te ayuda a ti y a mí,
con ella podrás el código mostrar,
para que de mejor forma te pueda ayudar,
RAP, RAP, RAP, la etiqueta DELPHI está aquí.

Si la etiqueta DELPHi no quieres usar,
yo no pienso molestarme en contestar,
porque no se puede el código leer,
porque cuesta mucho más de comprender,
RAP, RAP, RAP, usa la etiqueta DELPHI YA.

El RAP no da para mucho más: hay que repetir los dos párrafos y ya está... por cierto, echa un vistazo a la guía de estilo (http://clubdelphi.com/foros/guiaestilo.php) del Foro que habla sobre la nunca como se debe alabada etiqueta DELPHI y otros interesantes temas.

jachguate
22-06-2005, 16:56:56
Hola mRoman. Te recomiendo aprender a usar la etiqueta [ code ], [ delphi ], etc. para publicar trozos de código, ya que sin ellas es muy dificil de leer dado que pierde la indentación.


The CoInitialize function initializes the Component Object Model(COM) library. You must initialize the library before you can call its functions. Applications must call CoInitialize before they make any other COM library calls with two exceptions: the CoGetMalloc function, and memory allocation calls.


En otras palabras, falta llamar a coInitialize(nil) antes de iniciar y luego llamar a CoUninitialize; después de terminar.

Para mas información consultá el Win32 Developer's reference del SDK de windows (instalado en le menú Help de tu instalación de delphi).

Hasta luego.

;)

delphi.com.ar
22-06-2005, 16:58:31
Se ejecuta la línea Application.Initialize en el DPR de tu proyecto?

roman
22-06-2005, 17:15:24
Te recomiendo aprender a usar la etiqueta [ code ], [ delphi ], etc. para publicar trozos de código


Y yo enfatizaría la palabra trozos.

// Saludos

mRoman
23-06-2005, 00:11:42
No, en el dpr no se ejecuta ese linea (Application.initialize), que tengo que hacer...?, donde hay que agregar esa linea?....

delphi.com.ar
23-06-2005, 15:16:26
Agregala antes de que se creen tus forms y antes del Application.Run...

mRoman
23-06-2005, 16:38:59
Ok Delphi !....ya funciono GRACIAS.....ya aprendi algo mas !!. Aprovechando la oportunidad, no sé si me puedas auxiliar en esta otra cosa, tengo una tabla con varios campos memos y la quiero exportar a Excel, ¿Se puede exportar los campos memos a una hoja de excel?, ahora el contenido de los memos se puede almacenar en una celda o combinación de estas?.

Gracias nuevamente por tu ayuda.

Que este bien.

roman
23-06-2005, 16:49:30
Aprovechando la oportunidad, no sé si me puedas auxiliar en esta otra cosa

Para esa otra cosa por favor abre otro hilo en el foro que corresponda.

// Saludos