git-svn-id: https://192.168.0.254/svn/Proyectos.LuisLeon_FactuGES/tags/1.2.0@6 c93665c3-c93d-084d-9b98-7d5f4a9c3376
647 lines
18 KiB
ObjectPascal
647 lines
18 KiB
ObjectPascal
unit uInventarioController;
|
||
|
||
interface
|
||
|
||
|
||
uses
|
||
Classes, SysUtils, uDADataTable, uControllerBase, uEditorDBItem,
|
||
uIDataModuleInventario, uBizInventario, uArticulosProveedorController,
|
||
uAlmacenesController;
|
||
|
||
type
|
||
IInventarioController = interface(IObservador)
|
||
['{FB1DE6BA-ADCC-4A83-B4D4-37DC5892766B}']
|
||
|
||
procedure Anadir(AInventario : IBizInventario);
|
||
function Eliminar(AInventario : IBizInventario; Todos: Boolean; ApplyUpdates: Boolean): Boolean;
|
||
function Trasladar(AInventario : IBizInventario; Todos: Boolean): Boolean;
|
||
// procedure RecibirArticulos(Const APedido: IBizPedidosProveedor; Const CodigoAlmacenDes: Integer); overload;
|
||
procedure RecibirArticulos(Const CodigoAlmacenDes: Integer); overload;
|
||
procedure GuardarArticulosUnitarios(AInventario : IBizInventario);
|
||
// function Trasladar: Boolean;
|
||
// function Liberar: Boolean;
|
||
// function Reservar(Const AMontaje: IBizMontaje): Boolean; overload;
|
||
// function Reservar(Const CodigoMontaje: Integer): Boolean; overload;
|
||
// function Eliminar: Boolean;
|
||
|
||
function Buscar(const ID: Integer): IBizInventario;
|
||
function BuscarTodos: IBizInventario;
|
||
procedure VerTodos(AInventario: IBizInventario);
|
||
procedure Ver(AInventario : IBizInventario);
|
||
|
||
function ExtraerSeleccionados(AArticulos: IBizInventario) : IBizInventario;
|
||
|
||
|
||
{
|
||
function Nuevo : IBizArticulo; overload;
|
||
procedure Anadir(AArticulo : IBizArticulo);
|
||
procedure Eliminar(const ID : Integer); overload;
|
||
function Eliminar(AArticulo : IBizArticulo): Boolean; overload;
|
||
procedure Guardar(AArticulo : IBizArticulo);
|
||
procedure DescartarCambios(AArticulo : IBizArticulo);
|
||
function Existe(const ID: Integer) : Boolean;
|
||
function Duplicar(AArticulo: IBizArticulo): IBizArticulo;
|
||
procedure Preview(AArticulo : IBizArticulo);
|
||
procedure Print(AArticulo : IBizArticulo);
|
||
}
|
||
end;
|
||
|
||
TInventarioController = class(TObservador, IInventarioController)
|
||
private
|
||
FAlmacenesController: IAlmacenesController;
|
||
FArticulosController : IArticulosProveedorController;
|
||
function GetAlmacenesController: IAlmacenesController;
|
||
function GetArticulosController: IArticulosProveedorController;
|
||
procedure SetAlmacenesController(const Value: IAlmacenesController);
|
||
procedure SetArticulosController(const Value: IArticulosProveedorController);
|
||
|
||
protected
|
||
FDataModule : IDataModuleInventario;
|
||
|
||
procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); override;
|
||
procedure AssignarID(AInventario: IBizInventario; ADataModule : IDataModuleInventario); virtual;
|
||
function CreateEditor(const AName : String; const IID: TGUID; out Intf): Boolean;
|
||
function _Vacio : IBizInventario;
|
||
|
||
procedure FiltrarEmpresa(AInventario: IBizInventario);
|
||
function ValidarInventario(AInventario: IBizInventario): Boolean;
|
||
|
||
//Estos son los tres m<>todos a sobre escribir si se desea heredar toda la logica de
|
||
//este controller
|
||
procedure AsignarDataModule; virtual;
|
||
procedure RecuperarObjetos(AInventario: IBizInventario); virtual;
|
||
procedure AsignarEditor(out AEditor: IEditorDBItem); virtual;
|
||
|
||
procedure ValidarObjetos; virtual;
|
||
procedure AsignarCodigo(AInventario: IBizInventario); virtual;
|
||
|
||
public
|
||
property AlmacenesController: IAlmacenesController read GetAlmacenesController write SetAlmacenesController;
|
||
property ArticulosController: IArticulosProveedorController read GetArticulosController write SetArticulosController;
|
||
|
||
constructor Create;
|
||
destructor Destroy; override;
|
||
|
||
procedure Anadir(AInventario : IBizInventario);
|
||
function Eliminar(AInventario : IBizInventario; Todos: Boolean; ApplyUpdates: Boolean): Boolean;
|
||
function Trasladar(AInventario : IBizInventario; Todos: Boolean): Boolean;
|
||
procedure RecibirArticulos(Const CodigoAlmacenDes: Integer); overload;
|
||
procedure GuardarArticulosUnitarios(AInventario : IBizInventario);
|
||
// function Liberar: Boolean;
|
||
// function Reservar(Const AMontaje: IBizMontaje): Boolean; overload;
|
||
// function Reservar(Const CodigoMontaje: Integer): Boolean; overload;
|
||
// function Eliminar: Boolean;
|
||
|
||
function Buscar(const ID: Integer): IBizInventario;
|
||
function BuscarTodos: IBizInventario;
|
||
procedure VerTodos(AInventario: IBizInventario);
|
||
procedure Ver(AInventario : IBizInventario);
|
||
function ExtraerSeleccionados(AArticulos: IBizInventario) : IBizInventario;
|
||
{
|
||
procedure Eliminar(const ID : Integer); overload;
|
||
|
||
procedure Guardar(AArticulo : IBizArticulo); virtual;
|
||
procedure DescartarCambios(AArticulo : IBizArticulo); virtual;
|
||
function Existe(const ID: Integer) : Boolean; virtual;
|
||
|
||
function Buscar(const ID: Integer): IBizArticulo;
|
||
function BuscarTodos: IBizArticulo;
|
||
|
||
|
||
|
||
function Duplicar(AArticulo: IBizArticulo): IBizArticulo;
|
||
procedure Preview(AArticulo : IBizArticulo);
|
||
procedure Print(AArticulo : IBizArticulo);
|
||
}
|
||
end;
|
||
|
||
implementation
|
||
|
||
uses
|
||
cxControls, DB, schInventarioClient_Intf, uEditorRegistryUtils,
|
||
uIEditorInventario, uDataModuleInventario,
|
||
uDataModuleUsuarios, uDAInterfaces, uDataTableUtils,
|
||
uDateUtils, uROTypes, DateUtils, Controls, Windows,
|
||
dialogs,
|
||
uBizAlmacenes, uBizArticulosProveedor, uIEditorEntradaArticulosInventario;
|
||
|
||
{ TInventarioController }
|
||
|
||
{
|
||
procedure TInventarioController.Anadir(AArticulo: IBizArticulo);
|
||
begin
|
||
AArticulo.Insert;
|
||
end;
|
||
}
|
||
|
||
procedure TInventarioController.Anadir(AInventario: IBizInventario);
|
||
var
|
||
AArticulos: IBizArticuloProveedor;
|
||
begin
|
||
//Todos los cambios ser<65>n en cach<63> hasta que el usuario decida guardar
|
||
AArticulos := (FArticulosController.BuscarTodos as IBizArticuloProveedor);
|
||
AArticulos := FArticulosController.ElegirArticulos(AArticulos, '', True);
|
||
if Assigned(AArticulos) then
|
||
AInventario.Copiar(AArticulos)
|
||
end;
|
||
|
||
procedure TInventarioController.AsignarCodigo(AInventario: IBizInventario);
|
||
begin
|
||
if (AInventario.EsNuevo) then
|
||
AssignarID(AInventario, (FDataModule as IDataModuleInventario));
|
||
end;
|
||
|
||
procedure TInventarioController.AsignarDataModule;
|
||
begin
|
||
FDataModule := TDataModuleInventario.Create(Nil);
|
||
end;
|
||
|
||
procedure TInventarioController.AsignarEditor(out AEditor: IEditorDBItem);
|
||
begin
|
||
CreateEditor('EditorEntradaArticulosInventario', IEditorEntradaArticulosInventario, AEditor);
|
||
end;
|
||
|
||
procedure TInventarioController.AssignarID(AInventario: IBizInventario; ADataModule : IDataModuleInventario);
|
||
var
|
||
NuevoIDCabecera : Integer;
|
||
begin
|
||
if not Assigned(AInventario) then
|
||
raise Exception.Create ('Inventario no asignada');
|
||
|
||
NuevoIDCabecera := ADataModule.GetNextID(AInventario.DataTable.LogicalName);
|
||
|
||
AInventario.Edit;
|
||
AInventario.ID := NuevoIDCabecera;
|
||
AInventario.Post;
|
||
end;
|
||
|
||
function TInventarioController.Buscar(const ID: Integer): IBizInventario;
|
||
begin
|
||
Result := (FDataModule as IDataModuleInventario).GetItem(ID);
|
||
FiltrarEmpresa(Result);
|
||
end;
|
||
|
||
function TInventarioController.BuscarTodos: IBizInventario;
|
||
begin
|
||
Result := FDataModule.GetItems;
|
||
FiltrarEmpresa(Result);
|
||
end;
|
||
|
||
constructor TInventarioController.Create;
|
||
begin
|
||
AsignarDataModule;
|
||
FArticulosController := TArticulosProveedorController.Create;
|
||
FAlmacenesController := TAlmacenesController.Create;
|
||
end;
|
||
|
||
function TInventarioController.CreateEditor(const AName: String; const IID: TGUID; out Intf): Boolean;
|
||
begin
|
||
Result := Supports(EditorRegistry.CreateEditor(AName), IID, Intf);
|
||
end;
|
||
|
||
{
|
||
procedure TInventarioController.DescartarCambios(AArticulo: IBizArticulo);
|
||
begin
|
||
if not Assigned(AArticulo) then
|
||
raise Exception.Create ('Articulo no asignado');
|
||
|
||
ShowHourglassCursor;
|
||
try
|
||
if (AArticulo.State in dsEditModes) then
|
||
AArticulo.Cancel;
|
||
|
||
AArticulo.DataTable.CancelUpdates;
|
||
finally
|
||
HideHourglassCursor;
|
||
end;
|
||
end;
|
||
}
|
||
|
||
destructor TInventarioController.Destroy;
|
||
begin
|
||
FDataModule := Nil;
|
||
FArticulosController := Nil;
|
||
FAlmacenesController := Nil;
|
||
inherited;
|
||
end;
|
||
|
||
function TInventarioController.Eliminar(AInventario: IBizInventario; Todos: Boolean; ApplyUpdates: Boolean): Boolean;
|
||
begin
|
||
Result := False;
|
||
if Assigned(AInventario) then
|
||
begin
|
||
ShowHourglassCursor;
|
||
try
|
||
if Todos
|
||
then AInventario.DataTable.ClearRows
|
||
else AInventario.DataTable.Delete;
|
||
|
||
if ApplyUpdates then
|
||
AInventario.DataTable.ApplyUpdates;
|
||
Result := True;
|
||
finally
|
||
HideHourglassCursor;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
function TInventarioController.ExtraerSeleccionados(AArticulos: IBizInventario): IBizInventario;
|
||
var
|
||
ASeleccionados : IBizInventario;
|
||
begin
|
||
ASeleccionados := (Self.Buscar(ID_NULO) as IBizInventario);
|
||
CopyDataTable(AArticulos.DataTable, ASeleccionados.DataTable, True);
|
||
Result := ASeleccionados;
|
||
end;
|
||
|
||
{
|
||
function TInventarioController.Eliminar: Boolean;
|
||
begin
|
||
|
||
end;
|
||
|
||
function TInventarioController.Liberar: Boolean;
|
||
begin
|
||
|
||
end;
|
||
}
|
||
{
|
||
function TInventarioController.Duplicar(AArticulo: IBizArticulo): IBizArticulo;
|
||
begin
|
||
Result := Self._Vacio;
|
||
ShowHourglassCursor;
|
||
try
|
||
DuplicarRegistros(AArticulo.DataTable, Result.DataTable, mdrActual);
|
||
|
||
// Hay que dejar algunos campos como si fuera un art<72>culo nuevo
|
||
Result.Edit;
|
||
with Result do
|
||
begin
|
||
ID_EMPRESA := dmUsuarios.IDEmpresaActual;
|
||
USUARIO := dmUsuarios.LoginInfo.Usuario;
|
||
end;
|
||
|
||
Result.Post;
|
||
finally
|
||
HideHourglassCursor;
|
||
end;
|
||
end;
|
||
}
|
||
|
||
function TInventarioController.ValidarInventario(AInventario: IBizInventario): Boolean;
|
||
begin
|
||
{ Result := False;
|
||
|
||
// Asegurarse de valores en campos "autom<6F>ticos"
|
||
AInventario.Edit;
|
||
try
|
||
AInventario.USUARIO := dmUsuarios.LoginInfo.Usuario;
|
||
}
|
||
Result := True;
|
||
{ finally
|
||
AInventario.Post;
|
||
end;
|
||
}
|
||
end;
|
||
|
||
procedure TInventarioController.ValidarObjetos;
|
||
begin
|
||
//
|
||
end;
|
||
|
||
{
|
||
procedure TInventarioController.Ver(AArticulo: IBizArticulo);
|
||
var
|
||
AEditor : IEditorDBItem;
|
||
begin
|
||
AEditor := NIL;
|
||
ShowHourglassCursor;
|
||
try
|
||
RecuperarObjetos(AArticulo);
|
||
AsignarEditor(AEditor);
|
||
|
||
with (AEditor as IEditorArticulo) do
|
||
begin
|
||
Controller := Self; //OJO ORDEN MUY IMPORTANTE
|
||
Articulo := AArticulo;
|
||
end;
|
||
finally
|
||
HideHourglassCursor;
|
||
end;
|
||
|
||
if Assigned(AEditor) then
|
||
AEditor.ShowModal;
|
||
end;
|
||
}
|
||
|
||
procedure TInventarioController.Ver(AInventario: IBizInventario);
|
||
var
|
||
AEditor : IEditorDBItem;
|
||
begin
|
||
AEditor := NIL;
|
||
ShowHourglassCursor;
|
||
try
|
||
RecuperarObjetos(AInventario);
|
||
AsignarEditor(AEditor);
|
||
|
||
with (AEditor as IEditorEntradaArticulosInventario) do
|
||
begin
|
||
Controller := Self; //OJO ORDEN MUY IMPORTANTE
|
||
Articulos := AInventario;
|
||
end;
|
||
finally
|
||
HideHourglassCursor;
|
||
end;
|
||
|
||
if Assigned(AEditor) then
|
||
AEditor.ShowModal;
|
||
end;
|
||
|
||
procedure TInventarioController.VerTodos(AInventario: IBizInventario);
|
||
var
|
||
AEditor : IEditorInventario;
|
||
begin
|
||
AEditor := NIL;
|
||
ShowHourglassCursor;
|
||
try
|
||
CreateEditor('EditorInventario', IEditorInventario, AEditor);
|
||
with AEditor do
|
||
begin
|
||
Controller := Self; //OJO ORDEN MUY IMPORTANTE
|
||
Inventario := AInventario;
|
||
end;
|
||
finally
|
||
HideHourglassCursor;
|
||
end;
|
||
|
||
if Assigned(AEditor) then
|
||
AEditor.ShowEmbedded;
|
||
end;
|
||
|
||
function TInventarioController._Vacio: IBizInventario;
|
||
begin
|
||
Result := Buscar(ID_NULO);
|
||
end;
|
||
|
||
{
|
||
procedure TInventarioController.Eliminar(const ID: Integer);
|
||
var
|
||
AArticulo : IBizArticulo;
|
||
begin
|
||
AArticulo := Buscar(ID);
|
||
|
||
if not Assigned(AArticulo) then
|
||
raise Exception.Create(Format('No se ha encontrado el art<72>culo con ID = %d', [ID]));
|
||
|
||
Eliminar(AArticulo);
|
||
AArticulo := NIL;
|
||
end;
|
||
|
||
function TInventarioController.Eliminar(AArticulo: IBizArticulo): Boolean;
|
||
begin
|
||
Result := False;
|
||
|
||
if not Assigned(AArticulo) then
|
||
raise Exception.Create ('Articulo no asignada');
|
||
|
||
ShowHourglassCursor;
|
||
try
|
||
if (AArticulo.State in dsEditModes) then
|
||
AArticulo.Cancel;
|
||
|
||
AArticulo.Delete;
|
||
AArticulo.DataTable.ApplyUpdates;
|
||
HideHourglassCursor;
|
||
Result := True;
|
||
except
|
||
on E: Exception do
|
||
begin
|
||
AArticulo.DataTable.CancelUpdates;
|
||
HideHourglassCursor;
|
||
if (Pos('FOREIGN KEY', E.Message) > 0) then
|
||
MessageBox(0, 'No se puede borrar este art<72>culo porque tiene art<72>culos', 'Atenci<63>n', MB_ICONWARNING or MB_OK);
|
||
end;
|
||
end;
|
||
end;
|
||
}
|
||
|
||
procedure TInventarioController.RecibirArticulos(const CodigoAlmacenDes: Integer);
|
||
var
|
||
AInventario: IBizInventario;
|
||
begin
|
||
try
|
||
AInventario := Buscar(ID_NULO);
|
||
if not AInventario.DataTable.Active then
|
||
AInventario.DataTable.Active := True;
|
||
|
||
AInventario.IDAlmacenEntrada := CodigoAlmacenDes;
|
||
Ver(AInventario);
|
||
finally
|
||
AInventario := Nil;
|
||
end;
|
||
end;
|
||
|
||
procedure TInventarioController.RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable);
|
||
begin
|
||
inherited;
|
||
//
|
||
end;
|
||
|
||
procedure TInventarioController.RecuperarObjetos(AInventario: IBizInventario);
|
||
begin
|
||
//
|
||
end;
|
||
|
||
procedure TInventarioController.SetAlmacenesController(const Value: IAlmacenesController);
|
||
begin
|
||
FAlmacenesController := Value;
|
||
end;
|
||
|
||
procedure TInventarioController.SetArticulosController(const Value: IArticulosProveedorController);
|
||
begin
|
||
FArticulosController := Value
|
||
end;
|
||
|
||
function TInventarioController.Trasladar(AInventario: IBizInventario; Todos: Boolean): Boolean;
|
||
var
|
||
AAlmacenes : IBizAlmacen;
|
||
begin
|
||
Result := False;
|
||
if Assigned(AInventario) then
|
||
begin
|
||
ShowHourglassCursor;
|
||
try
|
||
//Seleccionamos almac<61>n
|
||
AAlmacenes := FAlmacenesController.BuscarTodos;
|
||
if not AAlmacenes.DataTable.Active then
|
||
AAlmacenes.DataTable.Active := True;
|
||
|
||
AAlmacenes := FAlmacenesController.VerLista(AAlmacenes);
|
||
|
||
//Aginamos el nuevo almac<61>n
|
||
if Assigned(AAlmacenes) then
|
||
begin
|
||
if not AInventario.DataTable.Editing then
|
||
AInventario.Edit;
|
||
AInventario.ID_ALMACEN := AAlmacenes.ID;
|
||
AInventario.Post;
|
||
|
||
AInventario.DataTable.ApplyUpdates;
|
||
Result := True;
|
||
// if Todos
|
||
// then AInventario.DataTable.ClearRows
|
||
// else AInventario.DataTable.Delete;
|
||
end;
|
||
|
||
finally
|
||
HideHourglassCursor;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
{
|
||
function TInventarioController.Trasladar: Boolean;
|
||
begin
|
||
|
||
end;
|
||
|
||
function TInventarioController.Existe(const ID: Integer): Boolean;
|
||
var
|
||
AArticulo : IBizArticulo;
|
||
begin
|
||
try
|
||
AArticulo := Buscar(ID);
|
||
Result := Assigned(AArticulo) and (AArticulo.ID = ID);
|
||
finally
|
||
AArticulo := NIL;
|
||
end;
|
||
end;
|
||
}
|
||
|
||
procedure TInventarioController.FiltrarEmpresa(AInventario: IBizInventario);
|
||
begin
|
||
if AInventario.DataTable.Active then
|
||
AInventario.DataTable.Active := False;
|
||
|
||
// Filtrar los inventario actuales por empresa
|
||
with AInventario.DataTable.Where do
|
||
begin
|
||
if NotEmpty then
|
||
AddOperator(opAND);
|
||
|
||
OpenBraket;
|
||
AddText('ALMACENES.' + fld_InventarioID_EMPRESA + ' = ' + IntToStr(dmUsuarios.IDEmpresaActual));
|
||
CloseBraket;
|
||
end;
|
||
end;
|
||
|
||
function TInventarioController.GetAlmacenesController: IAlmacenesController;
|
||
begin
|
||
Result := FAlmacenesController;
|
||
end;
|
||
|
||
function TInventarioController.GetArticulosController: IArticulosProveedorController;
|
||
begin
|
||
Result := FArticulosController;
|
||
end;
|
||
|
||
procedure TInventarioController.GuardarArticulosUnitarios(AInventario : IBizInventario);
|
||
var
|
||
AArticulosUnitarios: IBizInventario;
|
||
i: Integer;
|
||
begin
|
||
AArticulosUnitarios := Buscar(ID_NULO);
|
||
if not AArticulosUnitarios.DataTable.Active then
|
||
AArticulosUnitarios.DataTable.Active := True;
|
||
|
||
with AInventario do
|
||
begin
|
||
DataTable.First;
|
||
while not DataTable.EOF do
|
||
begin
|
||
for i:=0 to (CANTIDAD - 1) do
|
||
begin
|
||
AArticulosUnitarios.Insert;
|
||
AArticulosUnitarios.ID_ALMACEN := ID_ALMACEN;
|
||
AArticulosUnitarios.ID_ARTICULO := ID_ARTICULO;
|
||
if not DataTable.FieldByName(fld_INVENTARIOID_PEDIDO_PROVEEDOR).IsNull then
|
||
AArticulosUnitarios.ID_PEDIDO_PROVEEDOR := ID_PEDIDO_PROVEEDOR;
|
||
if not DataTable.FieldByName(fld_INVENTARIOID_PEDIDO_CLIENTE).IsNull then
|
||
AArticulosUnitarios.ID_PEDIDO_CLIENTE := ID_PEDIDO_CLIENTE;
|
||
AArticulosUnitarios.DESCRIPCION := DESCRIPCION;
|
||
AArticulosUnitarios.Post;
|
||
|
||
AssignarID(AArticulosUnitarios, (FDataModule as IDataModuleInventario));
|
||
end;
|
||
DataTable.Next;
|
||
end;
|
||
|
||
DataTable.CancelUpdates;
|
||
AArticulosUnitarios.DataTable.ApplyUpdates;
|
||
end;
|
||
end;
|
||
|
||
{
|
||
procedure TInventarioController.Guardar(AArticulo: IBizArticulo);
|
||
begin
|
||
if not Assigned(AArticulo) then
|
||
raise Exception.Create ('Art<72>culo no asignada');
|
||
|
||
ValidarObjetos;
|
||
|
||
if ValidarArticulo(AArticulo) then
|
||
begin
|
||
ShowHourglassCursor;
|
||
try
|
||
if (AArticulo.DataTable.State in dsEditModes) then
|
||
AArticulo.DataTable.Post;
|
||
|
||
AsignarCodigo(AArticulo);
|
||
|
||
AArticulo.DataTable.ApplyUpdates;
|
||
finally
|
||
HideHourglassCursor;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
function TInventarioController.Nuevo: IBizArticulo;
|
||
var
|
||
AArticulo : IBizArticulo;
|
||
begin
|
||
AArticulo := FDataModule.NewItem;
|
||
FiltrarEmpresa(AArticulo);
|
||
AArticulo.DataTable.Active := True;
|
||
AArticulo.Insert;
|
||
Result := AArticulo;
|
||
end;
|
||
}
|
||
|
||
{
|
||
procedure TInventarioController.Preview(AArticulo: IBizArticulo);
|
||
var
|
||
AReportController : IArticulosReportController;
|
||
begin
|
||
AReportController := TArticulosReportController.Create;
|
||
try
|
||
AReportController.Preview(AArticulo.ID);
|
||
finally
|
||
AReportController := NIL;
|
||
end;
|
||
end;
|
||
|
||
procedure TInventarioController.Print(AArticulo: IBizArticulo);
|
||
var
|
||
AReportController : IArticulosReportController;
|
||
begin
|
||
AReportController := TArticulosReportController.Create;
|
||
try
|
||
AReportController.Print(AArticulo.ID);
|
||
finally
|
||
AReportController := NIL;
|
||
end;
|
||
end;
|
||
}
|
||
|
||
end.
|