Lenguaje de programación Borland Delphi
Con este "truco" se abrirá/imprimirá un informe/listado/report existente en una base de datos Microsoft Access desde una aplicación desarrollada con Delphi. Para ello deberá existir la base de datos Access, el informe y la tabla a la cual apunte dicho informe (puede ser una tabla vinculada a cualquier BD que admita Access, con lo cual, con este "truco", podría accederse a casi cualquier tipo de BD). El código fuente del "truco" sería:
uses
ComObj
...
procedure TFormTotalesVales.actImprimirExecute(
Sender: TObject);
var
bdAccess, informe : string;
Access: Variant;
const
acViewNormal = $00000000;
acViewDesign = $00000001;
acViewPreview = $00000002;
acQuitPrompt = $00000000;
acQuitSaveAll = $00000001;
acQuitSaveNone = $00000002;
begin
MessageDlg('Este informe se generará en MS Access, con lo cual es conveniente ' +
'que esté cerrado antes de continuar. Cuando lo haya cerrado (si está abierto) ' +
'pulse en Aceptar para generar el informe.', mtInformation, [mbok], 0);
informe := 'infTotalesValesFinca';
bdAccess := ExtractFilePath(Application.ExeName) + 'Temp\impresion.mdb';
//Abrimos access
try
//si ya está abierta la instancia de MS Access la asignamos a la variable
Access := GetActiveOleObject('Access.Application');
except
//si no estaba abierta dará error, capturamos el mismo y la creamos
Access := CreateOleObject('Access.Application');
end;
try
//intentamos visualizar MS Access
Access.Visible := True;
except
MessageDlg('MS Access no se ha podido abrir, asegurése que no esté ' +
'abierto ya, si es así ciérrelo e inténtelo de nuevo.', mterror, [mbok], 0);
end;
//abrimos la BD en modo NO exclusivo (false), para exclusivo: True
Access.OpenCurrentDatabase(bdAccess, false);
//ejecutamos el informe, a este se le puede pasar un filtro como parámetro
Access.DoCmd.OpenReport (informe, acViewPreview, EmptyParam, EmptyParam);
MessageDlg('El informe ha sido generado correctamente en MS Access. ' +
'Cuando lo haya imprimido pulse en Aceptar y la ' +
'aplicación cerrará MS Access automáticamente.', mtInformation, [mbok], 0);
//cerramos la BD si no la ha cerrado el usuario
try
Access.CloseCurrentDatabase;
except
//silenciosa, pues si se produce este error es porque el usuario ha cerrado Access
end;
//Cerramos Access si no lo ha cerrado el usuario
try
//cerramos MS Access guardando los cambios
Access.Quit(acQuitSaveAll);
except
//silenciosa, pues si se produce este error es porque el usuario ha cerrado Access
end;
end;
Nota: debido a que estamos trabajando con MS Access directamente, éste debe estar instalado.
Publicado el: 2004-08-30