unit uBizArticulos; interface uses uDAInterfaces, uDADataTable, schArticulosClient_Intf, Classes, DBGrids, uDBSelectionList, DB, uExceptions, Controls, uBizMontajes, uBizPedidosProveedor; type IBizArticulosAlmacen = interface(IARTICULOS) ['{97972D47-1503-4DDD-9B49-966A6E93EF5E}'] procedure RecibirArticulos(Const APedido: IBizPedidosProveedor; Const CodigoAlmacenDes: Integer); overload; procedure RecibirArticulos(Const CodigoAlmacenDes: Integer); overload; procedure GuardarArticulosUnitarios; function Trasladar: Boolean; function Liberar: Boolean; function Reservar(Const AMontaje: IBizMontaje): Boolean; overload; function Reservar(Const CodigoMontaje: Integer): Boolean; overload; function Eliminar: Boolean; function GetCodigoAlmacenEntrada: Integer; procedure SetCodigoAlmacenEntrada(const Value: Integer); property CodigoAlmacenEntrada: Integer read GetCodigoAlmacenEntrada write SetCodigoAlmacenEntrada; function GetPedido : IBizPedidosProveedor; procedure SetPedido (Const Value: IBizPedidosProveedor); property Pedido: IBizPedidosProveedor read GetPedido write SetPedido; function Show: TModalResult; function ShowForSelect : TModalResult; // procedure ShowAll; // procedure Preview; end; TBizArticulosAlmacenDataTableRules = class(TARTICULOSDataTableRules, IBizArticulosAlmacen, IApplyUpdateFailedException, ISelectedRowList) private FCodigoAlmacenEntrada : Integer; FSelectedRows : TSelectedRowList; FPedido : IBizPedidosProveedor; procedure OnNewRecord(Sender: TDADataTable); override; procedure OnPostError(DataTable: TDADataTable; Error: EDatabaseError; var Action: TDataAction); override; protected function GetPedido : IBizPedidosProveedor; procedure SetPedido (Const Value: IBizPedidosProveedor); function GetCodigoAlmacenEntrada: Integer; procedure SetCodigoAlmacenEntrada(const Value: Integer); function GetSelectedRows : TSelectedRowList; virtual; procedure ShowApplyUpdateFailed (const Error: EDAApplyUpdateFailed); virtual; public property CodigoAlmacenEntrada: Integer read GetCodigoAlmacenEntrada write SetCodigoAlmacenEntrada; constructor Create(aDataTable: TDADataTable); override; destructor Destroy; override; function Show: TModalResult; function ShowForSelect : TModalResult; procedure RecibirArticulos(Const APedido: IBizPedidosProveedor; Const CodigoAlmacenDes: Integer); overload; procedure RecibirArticulos(Const CodigoAlmacenDes: Integer); overload; procedure GuardarArticulosUnitarios; function Trasladar: Boolean; function Liberar: Boolean; function Reservar(Const AMontaje: IBizMontaje): Boolean; overload; function Reservar(Const CodigoMontaje: Integer): Boolean; overload; function Eliminar: Boolean; property SelectedRows : TSelectedRowList read GetSelectedRows; property Pedido: IBizPedidosProveedor read GetPedido write SetPedido; end; implementation uses Dialogs, uDACDSDataTable, SysUtils, uDataModuleBase, uDataModuleUsuarios, uEditorUtils, uDataModuleArticulos, Variants, uBizImportesDetalleBase, uDataModuleAlmacenes, uBizAlmacenes, schPedidosProveedorClient_Intf, uEditorSituacionPedido, Forms, wIndows, uDataModuleMontajes; { TBizArticulosAlmacenDataTableRules } constructor TBizArticulosAlmacenDataTableRules.Create( aDataTable: TDADataTable); begin inherited; FPedido := NIL; FSelectedRows := TSelectedRowList.Create(aDataTable); CodigoAlmacenEntrada := -1; end; destructor TBizArticulosAlmacenDataTableRules.Destroy; begin FPedido := NIL; FSelectedRows.Free; inherited; end; function TBizArticulosAlmacenDataTableRules.GetSelectedRows: TSelectedRowList; begin Result := FSelectedRows; end; procedure TBizArticulosAlmacenDataTableRules.RecibirArticulos(Const APedido: IBizPedidosProveedor; Const CodigoAlmacenDes: Integer); var AArticulos: IBizArticulosAlmacen; ADetalles: IBizDetallesPedidoProveedor; begin try if APedido.DataTable.FieldByName(fld_PedidosProveedorCODIGOALMACEN).IsNull then begin MessageBox(0, 'En el pedido que ha elegido no figura ningún almacén como destino.' + #10#13 + 'Si desea recibir este pedido en algún almacén' + #10#13 + 'modifique antes el pedido para indicarlo.', 'Atención', MB_ICONWARNING or MB_OK); Exit; end; AArticulos := dmArticulos.GetItem(-1); if not AArticulos.DataTable.Active then AArticulos.DataTable.Active := True; ADetalles := APedido.Detalles; if Assigned(ADetalles) then begin ADetalles.First; while not ADetalles.EOF do begin if (ADetalles.TIPO = TIPODETALLE_CONCEPTO) and (Length(Trim(ADetalles.DESCRIPCION)) <> 0) then begin AArticulos.Insert; if not APedido.DataTable.FieldByName(fld_PedidosProveedorCODIGOALMACEN).IsNull then AArticulos.CODIGOALMACEN := APedido.CODIGOALMACEN; if not APedido.DataTable.FieldByName(fld_PedidosProveedorCODIGO).IsNull then AArticulos.CODIGOPEDIDO := APedido.CODIGO; if not APedido.DataTable.FieldByName(fld_PedidosProveedorCODIGOMONTAJE).IsNull then AArticulos.CODIGOMONTAJE := APedido.CODIGOMONTAJE; AArticulos.DESCRIPCION := ADetalles.DESCRIPCION; AArticulos.CANTIDAD := ADetalles.CANTIDAD; AArticulos.Post; end; ADetalles.Next; end; end; if APedido.DataTable.FieldByName(fld_PedidosProveedorCODIGOALMACEN).IsNull then AArticulos.CodigoAlmacenEntrada := CodigoAlmacenDes else begin AArticulos.CodigoAlmacenEntrada := APedido.CODIGOALMACEN; AArticulos.Pedido := APedido; end; if AArticulos.show = mrOK then begin with TfEditorSituacionPedido.Create(Nil) do try if (ShowModal = mrOk) then begin if rdxSituacion1.checked then APedido.CambiarSituacion(SITUACION_RECIBIDO) else APedido.CambiarSituacion(SITUACION_PARCIAL); end else showmessage('Pedido quedará con la misma situación con la que estaba antes de ser elegido'); finally Free; end; Self.DataTable.Refresh; end; finally AArticulos := Nil; end; end; function TBizArticulosAlmacenDataTableRules.Show: TModalResult; begin Result := ShowEditor(IBizArticulosAlmacen, Self, etItem); end; procedure TBizArticulosAlmacenDataTableRules.ShowApplyUpdateFailed( const Error: EDAApplyUpdateFailed); begin if (Pos(AUF_FKVIOLATION, Error.Message) > 0) then MessageBox(0, 'No se puede borrar este artículo porque asociado a algo', 'Atención', MB_ICONWARNING or MB_OK); end; procedure TBizArticulosAlmacenDataTableRules.OnNewRecord(Sender: TDADataTable); begin inherited; DESCRIPCION := 'Escriba aquí la descripción del artículo'; CODIGO := dmArticulos.GetNextAutoinc; if CodigoAlmacenEntrada <> -1 then CODIGOALMACEN := CodigoAlmacenEntrada; CANTIDAD := 1; end; function TBizArticulosAlmacenDataTableRules.Trasladar: Boolean; var AAlmacen: IBizAlmacen; AObj: TSelectedRowList; i: Integer; begin try AAlmacen := dmAlmacenes.GetItems; if AAlmacen.ShowForSelect = mrOk then begin AObj := Self.GetSelectedRows; Self.DataTable.DisableControls; for i:=0 to (AObj.Count -1) do begin Self.DataTable.GotoBookmark(AObj.Items[i]); Self.Edit; Self.CODIGOALMACEN := AAlmacen.CODIGO; Self.Post; end; Self.DataTable.EnableControls; Self.DataTable.ApplyUpdates; end; AAlmacen := Nil; except on E: EDAApplyUpdateFailed do begin Self.DataTable.CancelUpdates; showmessage('Error en el traslado'); AAlmacen := Nil; end; end; end; function TBizArticulosAlmacenDataTableRules.Liberar: Boolean; var AObj: TSelectedRowList; i: Integer; begin try AObj := Self.GetSelectedRows; Self.DataTable.DisableControls; for i:=0 to (AObj.Count -1) do begin Self.DataTable.GotoBookmark(AObj.Items[i]); Self.Edit; Self.datatable.FieldByName(fld_ARTICULOSCODIGOMontaje).AsVariant := Null; Self.Post; end; Self.DataTable.EnableControls; Self.DataTable.ApplyUpdates; except on E: EDAApplyUpdateFailed do begin Self.DataTable.CancelUpdates; showmessage('Error al liberar los artículos'); end; end; end; function TBizArticulosAlmacenDataTableRules.Reservar(const AMontaje: IBizMontaje): Boolean; var AObj: TSelectedRowList; i: Integer; begin try AObj := Self.GetSelectedRows; Self.DataTable.DisableControls; for i:=0 to (AObj.Count -1) do begin Self.DataTable.GotoBookmark(AObj.Items[i]); Self.Edit; Self.CODIGOMontaje := AMontaje.CODIGO; Self.Post; end; Self.DataTable.EnableControls; Self.DataTable.ApplyUpdates; except on E: EDAApplyUpdateFailed do begin Self.DataTable.CancelUpdates; showmessage('Error al reservar para la Montaje'); end; end; end; procedure TBizArticulosAlmacenDataTableRules.RecibirArticulos(Const CodigoAlmacenDes: Integer); var AArticulos: IBizArticulosAlmacen; begin try AArticulos := dmArticulos.GetItem(-1); if not AArticulos.DataTable.Active then AArticulos.DataTable.Active := True; AArticulos.CodigoAlmacenEntrada := CodigoAlmacenDes; AArticulos.Show; Self.DataTable.Refresh; finally AArticulos := Nil; end; end; procedure TBizArticulosAlmacenDataTableRules.GuardarArticulosUnitarios; var AArticulosUnitarios: IBizArticulosAlmacen; i: Integer; begin AArticulosUnitarios := dmArticulos.getItem(-1); if not AArticulosUnitarios.DataTable.Active then AArticulosUnitarios.DataTable.Active := True; Self.First; while not Self.DataTable.EOF do begin for i:=0 to (Self.CANTIDAD - 1) do begin AArticulosUnitarios.Insert; AArticulosUnitarios.CODIGOALMACEN := Self.CODIGOALMACEN; if not Self.DataTable.FieldByName(fld_ARTICULOSCODIGOPEDIDO).IsNull then AArticulosUnitarios.CODIGOPEDIDO := Self.CODIGOPEDIDO; if not Self.DataTable.FieldByName(fld_ARTICULOSCODIGOMONTAJE).IsNull then AArticulosUnitarios.CODIGOMONTAJE := Self.CODIGOMONTAJE; AArticulosUnitarios.DESCRIPCION := Self.DESCRIPCION; AArticulosUnitarios.Post; end; Self.Next; end; Self.DataTable.CancelUpdates; AArticulosUnitarios.DataTable.ApplyUpdates; end; function TBizArticulosAlmacenDataTableRules.Eliminar: Boolean; var AObj: TSelectedRowList; i: Integer; begin try AObj := Self.GetSelectedRows; Self.DataTable.DisableControls; for i:=0 to (AObj.Count -1) do begin Self.DataTable.GotoBookmark(AObj.Items[i]); Self.DataTable.Delete; end; Self.DataTable.EnableControls; Self.DataTable.ApplyUpdates; // Self.SelectedRows.Clear; // Self.SelectedRows.CurrentRowSelected := True; except on E: EDAApplyUpdateFailed do begin Self.DataTable.CancelUpdates; showmessage('Error al eliminar los artículos'); end; end; end; procedure TBizArticulosAlmacenDataTableRules.OnPostError( DataTable: TDADataTable; Error: EDatabaseError; var Action: TDataAction); begin inherited; Action := daAbort; if (Pos(AUF_HAVEVALUE, Error.Message) > 0) then begin if (Pos('almacén', Error.Message) > 0) then MessageBox(0, 'Debe indicar el almacén de destino', 'Atención', MB_ICONWARNING or MB_OK) else raise Error; end else raise Error; end; function TBizArticulosAlmacenDataTableRules.GetCodigoAlmacenEntrada: Integer; begin Result := FCodigoAlmacenEntrada; end; procedure TBizArticulosAlmacenDataTableRules.SetCodigoAlmacenEntrada( const Value: Integer); begin FCodigoAlmacenEntrada := Value; end; function TBizArticulosAlmacenDataTableRules.ShowForSelect: TModalResult; begin Result := ShowEditor(IBizArticulosAlmacen, Self, etSelectItems); end; function TBizArticulosAlmacenDataTableRules.Reservar(const CodigoMontaje: Integer): Boolean; var AMontaje: IBizMontaje; begin try AMontaje := dmMontajes.GetItem(CodigoMontaje); AMontaje.DataTable.Active := True; Reservar(AMontaje); finally AMontaje := Nil; end; end; function TBizArticulosAlmacenDataTableRules.GetPedido: IBizPedidosProveedor; begin Result := FPedido; end; procedure TBizArticulosAlmacenDataTableRules.SetPedido(const Value: IBizPedidosProveedor); begin FPedido := Value; end; initialization RegisterDataTableRules('BizAlmacen', TBizAlmacenDataTableRules); RegisterDataTableRules('BizArticulosAlmacen', TBizArticulosAlmacenDataTableRules); finalization end.