unit PropiedadesArticulo;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, cxStyles, cxCustomData, cxGraphics, cxFilter,
  cxData, cxEdit, DB, cxDBData, RdxPaneles, RdxBarras, RdxBotones,
  cxGridLevel, cxClasses, cxControls, cxGridCustomView,
  cxGridCustomTableView, cxGridCardView, cxGridDBCardView, cxGrid,
  ExtCtrls, AdvPanel, RxMemDS, Grids, DBGrids, StdCtrls, ActnList,
  TablaArticulos, cxContainer, cxTextEdit, cxMemo, cxDBEdit,
  IBCustomDataSet, IBQuery, cxDBLookupComboBox, cxDataStorage;

type
  TfrPropiedadesArticulo = class(TForm)
    gridPropiedades: TcxGrid;
    gridPropiedadesDBCardView: TcxGridDBCardView;
    gridPropiedadesLevel: TcxGridLevel;
    brDoble: TRdxBarraInferior;
    bAceptar: TRdxBoton;
    bCancelar: TRdxBoton;
    TablaPropiedadesArt: TRxMemoryData;
    dsPropiedadesArt: TDataSource;
    RdxPanel1: TRdxPanel;
    bAnadir: TRdxBoton;
    bEliminar: TRdxBoton;
    bEliminarTodo: TRdxBoton;
    eDescripcionArticulo: TLabel;
    ActionList1: TActionList;
    actAnadir: TAction;
    actEliminar: TAction;
    actEliminarTodo: TAction;
    actAceptar: TAction;
    actCancelar: TAction;
    eDescripcion: TLabel;
    Descripcion: TcxMemo;
    TablaValores: TIBQuery;
    TablaPropiedades: TIBQuery;
    dsPropiedades: TDataSource;
    dsValores: TDataSource;
    gridPropiedadesDBCardViewDBCardViewRow1: TcxGridDBCardViewRow;
    gridPropiedadesDBCardViewDBCardViewRow2: TcxGridDBCardViewRow;
    gridPropiedadesDBCardViewDBCardViewRow3: TcxGridDBCardViewRow;
    procedure gridPropiedadesResize(Sender: TObject);
    procedure actAnadirExecute(Sender: TObject);
    procedure actEliminarExecute(Sender: TObject);
    procedure actEliminarTodoExecute(Sender: TObject);
    procedure actEliminarUpdate(Sender: TObject);
    procedure actEliminarTodoUpdate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure actAceptarExecute(Sender: TObject);
    procedure actCancelarExecute(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    FDatosArticulo : TDatosArticulo;
    procedure SetDatosArticulo(const Value: TDatosArticulo);
    procedure VALORGetProperties(
      Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord;
      var AProperties: TcxCustomEditProperties);
  public
    property DatosArticulo : TDatosArticulo read FDatosArticulo write SetDatosArticulo;
  end;

var
  frPropiedadesArticulo: TfrPropiedadesArticulo;

implementation

{$R *.dfm}

{ TfrPropiedadesArticulo }

uses
  BaseDatos, cxDropDownEdit, Mensajes,
  Literales, TablaPropiedadesArticulo, TablaPropiedades, Configuracion, Entidades;

procedure TfrPropiedadesArticulo.gridPropiedadesResize(Sender: TObject);
begin
  gridPropiedadesDBCardView.OptionsView.CardWidth := (gridPropiedades.Width - 50) div 2;
end;

procedure TfrPropiedadesArticulo.actAnadirExecute(Sender: TObject);
begin
  gridPropiedades.SetFocus;
  with TablaPropiedadesArt do
  begin
    Append;
    Post;
    Edit;
    FieldByName('CODIGOPROPIEDAD').FocusControl;
  end;
end;

procedure TfrPropiedadesArticulo.actEliminarExecute(Sender: TObject);
begin
  if TablaPropiedadesArt.RecordCount = 0 then begin
    { Hacemos un cancel de la tabla por si el registro actual estuviera
      recien creado }
    TablaPropiedadesArt.Cancel;
    Exit;
  end;
  if (VerMensajePregunta(msgDatosBorrarPropiedad) <> IDYES) then
    Exit;
  TablaPropiedadesArt.Delete;
end;

procedure TfrPropiedadesArticulo.actEliminarTodoExecute(Sender: TObject);
begin
  if (VerMensajePregunta(msgDatosBorrarPropiedades) = IDYES) then
    TablaPropiedadesArt.EmptyTable;
end;

procedure TfrPropiedadesArticulo.actEliminarUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := not (TablaPropiedadesArt.RecordCount = 0);
end;

procedure TfrPropiedadesArticulo.actEliminarTodoUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := not (TablaPropiedadesArt.RecordCount = 0);
end;

procedure TfrPropiedadesArticulo.FormShow(Sender: TObject);
var
  Contador : Integer;
  FPropiedad : TDatosPropiedad;
begin
  Descripcion.Text := FDatosArticulo.Descripcion;

  with TablaPropiedadesArt do
  begin
    DisableControls;
    try
      EmptyTable;
      Open;
      for Contador := 0 to (FDatosArticulo.ListaPropiedades.Count - 1) do
      begin
        FPropiedad := FDatosArticulo.ListaPropiedades.Items[Contador];
        Insert;
        FieldByName('CODIGOPROPIEDAD').AsInteger := FPropiedad.CodigoPropiedad;
        FieldByName('VALOR').AsString := FPropiedad.Valor;
        Post;
      end;
    finally
      EnableControls;
    end;
  end;
end;

procedure TfrPropiedadesArticulo.SetDatosArticulo(
  const Value: TDatosArticulo);
begin
  FDatosArticulo := Value;
end;

procedure TfrPropiedadesArticulo.actAceptarExecute(Sender: TObject);
var
  FPropiedad : TDatosPropiedad;
  FBookmark : string;
begin
  FDatosArticulo.Descripcion := Descripcion.Text;
  FDatosArticulo.ListaPropiedades.Clear;

  // Copiar las nuevas propiedades
  with TablaPropiedadesArt do
  begin
    FBookmark := Bookmark;
    DisableControls;
    try
      First;
      while not EOF do
      begin
        FPropiedad := TDatosPropiedad.Create;
        FPropiedad.CodigoPropiedad := FieldByName('CODIGOPROPIEDAD').AsInteger;
        FPropiedad.Valor := FieldByName('VALOR').AsString;
        FDatosArticulo.ListaPropiedades.Add(FPropiedad);
        Next;
      end;
    finally
      Bookmark := FBookmark;
      EnableControls;
      ModalResult := mrOk;
    end;
  end;
end;

procedure TfrPropiedadesArticulo.actCancelarExecute(Sender: TObject);
begin
  ModalResult := mrCancel;
end;

procedure TfrPropiedadesArticulo.FormCreate(Sender: TObject);
begin
  ConfigurarFrame(Self, entPresupuestoCliente);
  with TablaPropiedades do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    Open;
  end;

  with TablaValores do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
  end;

  //dmTablaPropiedadesArticulo.InicializarGridPropiedadesArticulo(gridPropiedadesDBCardView);
  with TcxLookupComboBoxProperties(gridPropiedadesDBCardView.GetRowByFieldName('CODIGOPROPIEDAD').Properties) do
    ListSource := dsPropiedades;
  gridPropiedadesDBCardView.GetRowByFieldName('VALOR').OnGetProperties := VALORGetProperties;
end;

procedure TfrPropiedadesArticulo.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  TablaPropiedades.Close;
end;

procedure TfrPropiedadesArticulo.VALORGetProperties(
  Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord;
  var AProperties: TcxCustomEditProperties);
begin
  if not Sender.Focused then
  begin
    AProperties := TcxTextEditProperties.Create(Self);//dmConfiguracion.ItemEdit.Properties;
  end
  else begin
    with TablaValores do
    begin
      try
        DisableControls;
        Close;
        // ¿Tiene 'copia'?
        if TablaPropiedades.FieldByName('COPIA').AsVariant <> NULL then
          ParamByName('CODIGOPROPIEDAD').AsInteger := TablaPropiedades.FieldByName('COPIA').AsInteger
        else // No tiene 'copia'
          ParamByName('CODIGOPROPIEDAD').AsInteger := TablaPropiedadesArt.FieldByName('CODIGOPROPIEDAD').AsInteger;
        Prepare;
        Open;

        if RecordCount = 0 then
        begin
          AProperties := TcxTextEditProperties.Create(Self);//dmConfiguracion.ItemEdit.Properties;
          EnableControls;
          Exit;
        end;

        AProperties := TcxLookupComboBoxProperties.Create(Self);
        with TcxLookupComboBoxProperties(AProperties) do
        begin
          DropDownListStyle := lsEditList;
          ImmediatePost := True;
          KeyFieldNames := 'DESCRIPCION';
          ListColumns.Clear;
          ListColumns.Add.FieldName := 'DESCRIPCION';
          ListOptions.AnsiSort := True;
          ListOptions.GridLines := glNone;
          ListOptions.ShowHeader := False;
          ListSource := dsValores;
        end;
      finally
        EnableControls;
      end;
    end;
  end;
end;

end.
