{ =============================================================================== Copyright (©) 2001. Rodax Software. =============================================================================== Los contenidos de este fichero son propiedad de Rodax Software titular del copyright. Este fichero sólo podrá ser copiado, distribuido y utilizado, en su totalidad o en parte, con el permiso escrito de Rodax Software, o de acuerdo con los términos y condiciones establecidas en el acuerdo/contrato bajo el que se suministra. ----------------------------------------------------------------------------- Web: www.rodax-software.com =============================================================================== Fecha primera versión: 01-10-2001 Versión actual: 1.0.8 Fecha versión actual: 04-10-2004 =============================================================================== Modificaciones: Fecha Comentarios --------------------------------------------------------------------------- 02-11-2001 En CambiarEntidad tengo que cambiar manualmante la entidad de la barra de titulo ArticulosAlmacen, ya que no está incluida dentro del frame y no se entera de la entidad en la que está, que puede ser ArticulosAlmacen, ArticulosAlmacenFisico o ArticulosAlmacenObra, y en cada uno tendrá un titulo diferente. El no estar incluido en el panel era por un problema de barras en ciertos casos, que salian las dos barras a la vez. Añadir el botón finalizar obra que solo será visible cuando la entidad en la que nos encontremos sea entArticulosAlmacenObra. 02-03-2002 En el contenido se pueden añadir muchos materiales a la vez. 07-04-2002 Se ha adaptado a una unica transacción. 11-08-2002 p223. Se ha modificado finalizar obra para la ampliacion de historico de obras. 07-09-2002 Adaptada la función 'CambiarEntidad'. 15-04-2004 Al hacer doble click sobre el grid, se pasará a modificar el registro o se seleccionará, dependiendo del modo en el que se encuentre la pantalla. 15-04-2004 p272. Adaptación a multiempresa. 14-07-2004 Arreglo de un error de conversion al cambiar de almacenes a articulos obra 04-10-2004 Cambio CambiarEntidad para que soporte otro color. =============================================================================== } unit ArticulosAlmacen; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, RDXFRAME, Grids, DBGrids, ComCtrls, RdxBotones, ToolWin, ExtCtrls, StdCtrls, RdxComboBox, Tipos, Menus, am2000menuitem, IB, Db, am2000popupmenu, am2000, RdxBarras, RdxPaneles, RXDBCtrl, DBTables, RdxFrameArticulosAlmacen, IBCustomDataSet, RdxCampos, StrFunc, Mensajes, dxCntner, dxTL, dxDBCtrl, dxDBGrid, dxEditor, dxExEdtr, dxDBEdtr, dxDBELib, am2000utils; type TfrArticulosAlmacen = class(TRdxFrameArticulosAlmacen) menuEntrada: TPopupMenu2000; menuSalida: TPopupMenu2000; dsEstadoAlmacen: TDataSource; BarraEstado: TRdxBarraSuperior; brSeleccion: TRdxBarraInferior; bSeleccionar: TRdxBoton; bCancelarGuardar: TRdxBoton; RegularizarEntrada: TMenuItem2000; RecibirEntradaPedido: TMenuItem2000; N1: TMenuItem2000; pnlCuerpo: TRdxPanel; pnlGridArticulos: TPanel; pnlDatos: TPanel; pnlExtra: TRdxBarraSuperior; eAlmacen: TLabel; cbxAlmacen: TRdxComboBox; RegularizarSalida: TMenuItem2000; N2: TMenuItem2000; DevolverSalidaPedido: TMenuItem2000; bEntrada: TRdxBotonMenu; bSalida: TRdxBotonMenu; bTrasladar: TRdxBotonSuperior; bEliminar: TRdxBotonSuperior; bConsultar: TRdxBotonSuperior; bBuscar: TRdxBotonSuperior; bListar: TRdxBotonSuperior; bFinalizar: TRdxBoton; gridArticulosAlmacen: TdxDBGrid; pnlBusquedaRapida: TRdxPanel; eBusqueda: TLabel; BusquedaRapida: TdxLookupEdit; imgSombra: TImage; procedure bConsultarClick(Sender: TObject); procedure bEliminarClick(Sender: TObject); procedure bBuscarClick(Sender: TObject); procedure bListadosClick(Sender: TObject); procedure bTrasladarClick(Sender: TObject); procedure RegularizarEntradaClick(Sender: TObject); procedure RegularizarSalidaClick(Sender: TObject); procedure RecibirEntradaPedidoClick(Sender: TObject); procedure DevolverSalidaPedidoClick(Sender: TObject); procedure cbxAlmacenChange(Sender: TObject); procedure bSeleccionarClick(Sender: TObject); procedure bCancelarGuardarClick(Sender: TObject); procedure gridArticulosAlmacenRefreshButton(Sender: TObject); procedure bFinalizarClick(Sender: TObject); procedure gridArticulosAlmacenSelectedCountChange(Sender: TObject); procedure BusquedaRapidaKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure gridArticulosAlmacenDblClick(Sender: TObject); private FCodigoAlmacenInicial : Variant; FCodigoPedido : Variant; FListaArticulosAux : TStringList; procedure ActualizarBotones; protected procedure SetCodigoAlmacen (Value : Variant); override; procedure BuscarAlmacen; override; procedure BuscarArticulo; override; procedure FreeContenido; override; function CambiarEntidad (EntidadAnterior, Entidad : TRdxEntidad): Boolean; override; procedure CambiarModo(ModoAnterior, Modo : TRdxModo); override; procedure SetContenido (NuevoFrame : TRdxFrame); override; procedure VerModal; override; public constructor Create (AOwner : TComponent); override; destructor Destroy; override; published property TablaArticulosAlmacen; property CodigoAlmacen; property CodigoArticulo; end; var frArticulosAlmacen: TfrArticulosAlmacen; implementation {$R *.DFM} uses BaseDatos, ArticuloAlmacen, BuscarArticuloAlmacen, ListadoArticulosAlmacen, MovimientoAlmacenes, PedidosProveedores, TablaArticulosAlmacen, TablaAlmacenes, RdxFramePedidosProveedor, RdxFrameMovimientos, Excepciones, FinalizarObra, Entidades, Configuracion, RdxEmpresaActiva, Literales; constructor TfrArticulosAlmacen.Create (AOwner : TComponent); var i:integer; begin inherited Create(AOwner); FCodigoAlmacenInicial := NULL; FCodigoPedido := NULL; BaseDatos := dmBaseDatos.BD; Transaccion := dmBaseDatos.Transaccion; TablaArticulosAlmacen := TIBDataSet.Create(Self); dsEstadoAlmacen.DataSet := TablaArticulosAlmacen; with TablaArticulosAlmacen do begin Database := BaseDatos; Transaction := Transaccion; SelectSQL.Assign(dmTablaArticulosAlmacen.sqlGrid); end; Entidad := entArticulosAlmacen; ConfigurarFrame(Self, Self.Entidad); dmTablaArticulosAlmacen.InicializarGridArticulosAlmacen(gridArticulosAlmacen); FListaArticulosAux := TStringList.Create; end; destructor TfrArticulosAlmacen.Destroy; begin TablaArticulosAlmacen.Close; TablaArticulosAlmacen.UnPrepare; TablaArticulosAlmacen.Free; if FListaArticulosAux <> NIL then begin FListaArticulosAux.Clear; FListaArticulosAux.Free; FListaArticulosAux := NIL; end; inherited; end; procedure TfrArticulosAlmacen.BuscarAlmacen; begin if Transaccion = NIL then exit; try with TablaArticulosAlmacen do begin DisableControls; Close; if not VarIsNull(CodigoAlmacen) then Params.ByName('CODIGOALMACEN').AsString := CodigoAlmacen; Params.ByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo; Prepare; Open; ActualizarBotones; dmTablaArticulosAlmacen.InicializarTablaArticulosAlmacen(@TablaArticulosAlmacen); EnableControls; end; // Establece en el combox el almacen correspondiente al codigo a buscar cbxAlmacen.ItemIndex := cbxAlmacen.Items.IndexOf(FListaCodigosAlmacen.Values[CodigoAlmacen]); except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrArticulosAlmacen.BuscarArticulo; begin with TablaArticulosAlmacen do begin DisableControls; Close; Open; ActualizarBotones; dmTablaArticulosAlmacen.InicializarTablaArticulosAlmacen(@TablaArticulosAlmacen); EnableControls; end; TablaArticulosAlmacen.Locate('CODIGOARTICULO',CodigoArticulo,[]); end; procedure TfrArticulosAlmacen.cbxAlmacenChange(Sender: TObject); begin CodigoAlmacen := FListaAlmacenesCodigo.Values[cbxAlmacen.Text]; end; procedure TfrArticulosAlmacen.FreeContenido; begin if (Contenido is TRdxFrameArticulosAlmacen) then begin CodigoAlmacen := (Contenido as TRdxFrameArticulosAlmacen).CodigoAlmacen; CodigoArticulo := (Contenido as TRdxFrameArticulosAlmacen).CodigoArticulo; end; // Guarda el codigo del pedido en el que se basa una entrada a almacen por pedido if (ContenidoModal is TRdxFramePedidosProveedor) then FCodigoPedido := (ContenidoModal as TRdxFramePedidosProveedor).CodigoPedido; if (Contenido is TRdxFrameMovimientos) then begin if (Contenido as TRdxFrameMovimientos).Modo = Traslado then CodigoAlmacen := (Contenido as TRdxFrameMovimientos).CodigoAlmacenOrigen; //No incluimos entrada de pedido ni salida devolucion, porque como pueden //ser tanto almacenes como obras el codigoalmacen luego el combo saldria //en blanco al no tener nada mas que almacenes u obras if (Contenido as TRdxFrameMovimientos).Modo = Entrada then CodigoAlmacen := (Contenido as TRdxFrameMovimientos).CodigoAlmacenDestino else begin if (Contenido as TRdxFrameMovimientos).Modo = Salida then CodigoAlmacen := (Contenido as TRdxFrameMovimientos).CodigoAlmacenOrigen else BuscarAlmacen; end; end; inherited; end; procedure TfrArticulosAlmacen.bConsultarClick(Sender: TObject); begin CodigoArticulo := TablaArticulosAlmacen.FieldByName('CODIGOARTICULO').AsString; Contenido := TfrArticuloAlmacen.Create(Self); // Por si realmente no se ha liberado con la pregunta tratarcambios if (Contenido is TRdxFrameArticulosAlmacen) then begin Case Entidad of entArticulosAlmacen : Contenido.Entidad := entArticuloAlmacen; entArticulosAlmacenFisico : Contenido.Entidad := entArticuloAlmacenFisico; entArticulosAlmacenObra : Contenido.Entidad := entArticuloAlmacenObra; end; Contenido.Modo := Consultar; end; end; procedure TfrArticulosAlmacen.bEliminarClick(Sender: TObject); begin CodigoArticulo := TablaArticulosAlmacen.FieldByName('CODIGOARTICULO').AsString; Contenido := TfrArticuloAlmacen.Create(Self); if (Contenido is TRdxFrameArticulosAlmacen) then begin Case Entidad of entArticulosAlmacen : Contenido.Entidad := entArticuloAlmacen; entArticulosAlmacenFisico : Contenido.Entidad := entArticuloAlmacenFisico; entArticulosAlmacenObra : Contenido.Entidad := entArticuloAlmacenObra; end; Contenido.Modo := Eliminar; end; end; procedure TfrArticulosAlmacen.bBuscarClick(Sender: TObject); begin CodigoArticulo := TablaArticulosAlmacen.FieldByName('CODIGOARTICULO').AsString; Contenido := TfrBuscarArticuloAlmacen.Create(Self); Contenido.Entidad := Self.Entidad; end; procedure TfrArticulosAlmacen.bListadosClick(Sender: TObject); begin CodigoArticulo := TablaArticulosAlmacen.FieldByName('CODIGOARTICULO').AsString; Contenido := TfrListadoArticulosAlmacen.Create(Self); end; procedure TfrArticulosAlmacen.RegularizarEntradaClick(Sender: TObject); begin CodigoArticulo := TablaArticulosAlmacen.FieldByName('CODIGOARTICULO').AsString; Contenido := TfrMovimientoAlmacenes.Create(Self); if (Contenido is TRdxFrameMovimientos) then begin Contenido.Entidad := Entidad; Contenido.Modo := Entrada; (Contenido as TRdxFrameMovimientos).CodigoAlmacenDestino := CodigoAlmacen; Contenido.Visible := True; end; end; procedure TfrArticulosAlmacen.RegularizarSalidaClick(Sender: TObject); begin CodigoArticulo := TablaArticulosAlmacen.FieldByName('CODIGOARTICULO').AsString; Contenido := TfrMovimientoAlmacenes.Create(Self); if (Contenido is TRdxFrameMovimientos) then begin Contenido.Entidad := Entidad; Contenido.Modo := Salida; (Contenido as TRdxFrameMovimientos).CodigoAlmacenOrigen := CodigoAlmacen; Contenido.Visible := True; end; end; procedure TfrArticulosAlmacen.RecibirEntradaPedidoClick(Sender: TObject); begin CodigoArticulo := TablaArticulosAlmacen.FieldByName('CODIGOARTICULO').AsString; CaptionModal := 'Lista de pedidos pendientes de recibir'; ModoModal := Recibir; ContenidoModal := TfrPedidosProveedores.Create(Self); if VarIsNull(FCodigoPedido) then exit; Contenido := TfrMovimientoAlmacenes.Create(Self); Contenido.Entidad := Entidad; Contenido.Modo := EntradaPedido; (Contenido as TfrMovimientoAlmacenes).CodigoPedido := FCodigoPedido; Contenido.Visible := True; end; procedure TfrArticulosAlmacen.DevolverSalidaPedidoClick(Sender: TObject); begin CodigoArticulo := TablaArticulosAlmacen.FieldByName('CODIGOARTICULO').AsString; CaptionModal := 'Lista de pedidos totalmente recibidos'; ModoModal := Devolver; ContenidoModal := TfrPedidosProveedores.Create(Self); if VarIsNull(FCodigoPedido) then exit; Contenido := TfrMovimientoAlmacenes.Create(Self); Contenido.Entidad := Entidad; Contenido.Modo := SalidaDevolucion; (Contenido as TfrMovimientoAlmacenes).CodigoPedido := FCodigoPedido; Contenido.Visible := True; end; procedure TfrArticulosAlmacen.bTrasladarClick(Sender: TObject); begin CodigoArticulo := TablaArticulosAlmacen.FieldByName('CODIGOARTICULO').AsString; Contenido := TfrMovimientoAlmacenes.Create(Self); if (Contenido is TRdxFrameMovimientos) then begin Contenido.Entidad := Entidad; Contenido.Modo := Traslado; (Contenido as TRdxFrameMovimientos).CodigoAlmacenOrigen := CodigoAlmacen; Contenido.Visible := True; end; end; procedure TfrArticulosAlmacen.bSeleccionarClick(Sender: TObject); begin if TablaArticulosAlmacen.RecordCount = 0 then begin VerMensaje(msgArtNoHayArtAlm); exit; end; {Codigo almacen no haria falta coger el valor porque ya lo tendríamos, porque se inicializa el crearlo el padre y cada vez que se selecciona un almacen distinto del combox CodigoAlmacen cambia} //FCodigoArticulo := TablaArticulosAlmacen.FieldByName('CODIGOARTICULO').AsString; if gridArticulosAlmacen.SelectedCount <= 1 then FCodigoArticulo := TablaArticulosAlmacen.FieldByName('CODIGOARTICULO').Value else ListaArticulos := FListaArticulosAux; { ESTO NO VALE if gridArticulosAlmacen.SelectedCount = 0 then FCodigoArticulo := TablaArticulosAlmacen.FieldByName('CODIGOARTICULO').Value else FListaArticulos := dmTablaArticulosAlmacen.darListaArticulos(gridArticulosAlmacen, @TablaArticulosAlmacen);} CloseFrame; end; procedure TfrArticulosAlmacen.bCancelarGuardarClick(Sender: TObject); begin {Se recupera el almacen inicial que ha sido guardado en la primera asignación del CodigoAlmacen del frame, para que no haga frMovimientos todo lo que hace cuando el codigo almacen es distinto. No se puede diferenciar desde otro sitio cuando se ha dado a seleccionar y cuando a cancelar} FCodigoAlmacen := FCodigoAlmacenInicial; FCodigoArticulo := Null; CloseFrame; end; function TfrArticulosAlmacen.CambiarEntidad(EntidadAnterior, Entidad: TRdxEntidad): Boolean; var i : Integer; begin if not inherited CambiarEntidad(EntidadAnterior, Entidad) then Exit; ConfigurarFrame(Self, Self.Entidad); //Limpia la posible lista de almacenes que tuviese FListaAlmacenesCodigo.Clear; FListaCodigosAlmacen.Clear; case Entidad of entArticulosAlmacen : begin eAlmacen.Caption := 'Almacén/Obra:'; bFinalizar.Visible := False; BarraEstado.Caption := Entidades.darNombreEntidad(entAlmacen); dmTablaAlmacenes.darAlmacenes(EmpresaActiva.Codigo, FListaAlmacenesCodigo,FListaCodigosAlmacen); end; entArticulosAlmacenFisico : begin eAlmacen.Caption := 'Almacén:'; bFinalizar.Visible := False; BarraEstado.Caption := Entidades.darNombreEntidad(entAlmacenFisico); dmTablaAlmacenes.darAlmacenesFisicos(EmpresaActiva.Codigo, FListaAlmacenesCodigo,FListaCodigosAlmacen); gridArticulosAlmacen.ColumnByFieldName('TOTAL').Destroy; end; entArticulosAlmacenObra : begin eAlmacen.Caption := 'Obra:'; bFinalizar.Visible := True; BarraEstado.Caption := Entidades.darNombreEntidad(entAlmacenObra); dmTablaAlmacenes.darAlmacenesObras(EmpresaActiva.Codigo, FListaAlmacenesCodigo,FListaCodigosAlmacen); end; end; //Limpia la posible lista de almacenes que tuviese cbxAlmacen.Items.Clear; for i:=0 to FListaAlmacenesCodigo.Count-1 do cbxAlmacen.Items.Add(FListaAlmacenesCodigo.Names[i]); // Carga el primer almacen cbxAlmacen.ItemIndex := 0; CodigoAlmacen := FListaAlmacenesCodigo.Values[cbxAlmacen.Text]; {Como FCodigoAlmacenInicial solo sirve para guardar el codigo de almacen del que se parte cuando se activa una ventana modal, reiniciamos a null su valor ya que el codigo que nos interesa es el que establecerá despues de la creacion el frame padre, en nuestro caso ArticuloAlmacen} FCodigoAlmacenInicial := Null; end; procedure TfrArticulosAlmacen.SetCodigoAlmacen(Value: Variant); begin if (EsCadenaVacia(Value)) then Exit; {Se guarda el codigo de almacen que asigna inicialmente el padre} if (VarIsNull(FCodigoAlmacenInicial)) then FCodigoAlmacenInicial := Value; inherited; end; procedure TfrArticulosAlmacen.VerModal; begin { >>>><<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<< if (ContenidoModal is TfrListarArticulosAlmacen) then (ContenidoModal as TfrListarArticulosAlmacen).CodigoAlmacen := CodigoAlmacen;} if (ContenidoModal is TfrFinalizarObra) then (ContenidoModal as TfrFinalizarObra).CodigoObra := CodigoAlmacen; inherited; end; procedure TfrArticulosAlmacen.ActualizarBotones; begin if BaseDatos.IsReadOnly then begin bEntrada.Enabled := False; bSalida.Enabled := False; bTrasladar.Enabled := False; bEliminar.Enabled := False; bConsultar.Enabled := True; bBuscar.Enabled := True; bListar.Enabled := True; Exit; end; if TablaArticulosAlmacen.RecordCount= 0 then begin bEntrada.Enabled := True; bSalida.Enabled := False; bTrasladar.Enabled := False; bConsultar.Enabled := False; bEliminar.Enabled := False; bBuscar.Enabled := False; bListar.Enabled := False; end else begin bEntrada.Enabled := True; bSalida.Enabled := True; bTrasladar.Enabled := True; bConsultar.Enabled := True; bEliminar.Enabled := True; bBuscar.Enabled := True; bListar.Enabled := True; end; end; procedure TfrArticulosAlmacen.gridArticulosAlmacenRefreshButton( Sender: TObject); begin //Porque no se va ha cambiar de almacen ya que es solo refresco BuscarArticulo; end; procedure TfrArticulosAlmacen.bFinalizarClick(Sender: TObject); var Codigo : String; begin Codigo := FListaAlmacenesCodigo.Values[cbxAlmacen.Text]; CaptionModal := 'Cierre de obra'; WidthModal := 360; HeightModal := 190; ModoModal := Emitir; ContenidoModal := TfrFinalizarObra.Create(Self); //Para refrescar el grid BuscarArticulo; end; procedure TfrArticulosAlmacen.gridArticulosAlmacenSelectedCountChange(Sender: TObject); var IndiceCol : Integer; CodArt : String; begin IndiceCol := gridArticulosAlmacen.ColumnByFieldName('CODIGOARTICULO').Index; CodArt := gridArticulosAlmacen.FocusedNode.Strings[IndiceCol]; if gridArticulosAlmacen.SelectedCount = 1 then FListaArticulosAux.Clear; if gridArticulosAlmacen.FocusedNode.Selected then FListaArticulosAux.Add(CodArt) else FListaArticulosAux.Delete(FListaArticulosAux.IndexOf(CodArt)); end; procedure TfrArticulosAlmacen.BusquedaRapidaKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key = VK_RETURN) and (Modo = Seleccionar) then bSeleccionar.Click; end; procedure TfrArticulosAlmacen.CambiarModo(ModoAnterior, Modo: TRdxModo); begin inherited; if Modo = Seleccionar then gridArticulosAlmacen.OptionsBehavior := gridArticulosAlmacen.OptionsBehavior + [edgoMultiSelect] else gridArticulosAlmacen.OptionsBehavior := gridArticulosAlmacen.OptionsBehavior - [edgoMultiSelect]; end; procedure TfrArticulosAlmacen.gridArticulosAlmacenDblClick( Sender: TObject); begin if Modo = Seleccionar then bSeleccionar.Click end; procedure TfrArticulosAlmacen.SetContenido(NuevoFrame: TRdxFrame); begin inherited; if (Contenido is TfrListadoArticulosAlmacen) then begin case Entidad of entArticulosAlmacen : Contenido.Entidad := entAlmacen; entArticulosAlmacenFisico : Contenido.Entidad := entAlmacenFisico; entArticulosAlmacenObra : Contenido.Entidad := entAlmacenObra; end; (Contenido as TfrListadoArticulosAlmacen).CodigoAlmacen := CodigoAlmacen; end; end; end.