This repository has been archived on 2024-11-29. You can view files and clone it, but cannot push or open issues or pull requests.
Tecsitel_FactuGES/Almacenes/ArticulosAlmacen.pas
2007-06-21 15:47:20 +00:00

625 lines
22 KiB
ObjectPascal

{
===============================================================================
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.