unit ArticuloPresupuesto;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, RdxFrameArticulos, cxStyles, cxCustomData, cxGraphics, cxFilter,
  cxData, cxEdit, DB, cxDBData, Menus, am2000menuitem, am2000popupmenu,
  am2000, cxButtonEdit, cxDBEdit, cxMaskEdit, cxDropDownEdit, cxContainer,
  cxTextEdit, cxMemo, StdCtrls, cxGridLevel, cxClasses, cxControls,
  cxGridCustomView, cxGridCustomTableView, cxGridCardView,
  cxGridDBCardView, cxGrid, AdvPanel, ExtCtrls, RdxBotones, RdxPaneles,
  RdxBarras, RdxTitulos, cxSpinEdit, Configuracion;

type
  TfrArticuloPresupuesto = class(TRdxFrameArticulos)
    Cantidad: TcxDBSpinEdit;
    Label1: TLabel;
    Label2: TLabel;
    ImporteUnidad: TcxDBSpinEdit;
    Label3: TLabel;
    ImporteTotal: TcxDBButtonEdit;
  private
    FCodigoPresupuesto: Variant;
    FNumConcepto: Variant;
    procedure SalvarDatosPropiedades; 
    procedure PropiedadesMemAfterInsert(DataSet: TDataSet);
    function ComprobarDatos: Boolean; override;
    procedure SetCodigoPresupuesto(const Value: Variant);
    procedure SetNumConcepto(const Value: Variant);
    procedure dsDetallesStateChange(Sender: TObject);
  protected
    procedure ActivarModoModificar; override;
    function ModificarDatos : Boolean; override;
    function CancelarModificar : Boolean; override;
    procedure BuscarArticulo; override;
  public
    constructor Create (AOwner : TComponent); override;
    property CodigoPresupuesto : Variant read FCodigoPresupuesto write SetCodigoPresupuesto;
    property NumConcepto : Variant read FNumConcepto write SetNumConcepto;
  end;

var
  frArticuloPresupuesto: TfrArticuloPresupuesto;

implementation

{$R *.dfm}

uses
  TablaPresupuestos, TablaPropiedades, Mensajes, Literales, IB, Excepciones,
  IBErrorCodes, StrFunc, RdxFrame;

{ TfrArticuloPresupuesto }

procedure TfrArticuloPresupuesto.ActivarModoModificar;
begin
  inherited;
//  Codigo.Properties.Buttons[0].Visible := False;
  try
    with TablaArticulos do
    begin
      Open;
      if RecordCount = 0 then
      begin
        VerMensajeFmt(msgDatosNoExisteArt, [CodigoArticulo]);
        CancelarModificar;
        CloseFrame;
        Exit;
      end;
      Edit;
      Post;
      Edit;
    end;

    with TablaPropiedades do
    begin
      Close;
      Prepare;
      Open;
    end;
{
    with TablaPropiedadesMem do
    begin
      Close;
      Open;
      CargarDatosPropiedades;
      AfterInsert := PropiedadesMemAfterInsert;
      if not IsEmpty then
        Edit;
    end;
}
    Visible := True;
  except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : begin
                              VerMensajeFmt(msgDatosArtBloqueado, [CodigoArticulo]);
                              CancelarModificar;
                              CloseFrame;
                              Exit;
                            end
        else
          TratarExcepcion(E);
      end;
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrArticuloPresupuesto.BuscarArticulo;
begin
  if Transaccion = NIL then
    Exit;
  try
    TablaArticulos.DisableControls;
    TablaPropiedades.DisableControls;

    TablaArticulos.Close;
    TablaPropiedades.Close;

    // Buscar la fila a tratar si es necesario
    if not EsCadenaVacia(CodigoPresupuesto) and not EsCadenaVacia(NumConcepto) then
    begin
      TablaArticulos.Params.ByName('CODIGOPRESUPUESTO').AsString := CodigoPresupuesto;
      TablaArticulos.Params.ByName('NUMCONCEPTO').AsString := NumConcepto;
      TablaPropiedades.Params.ByName('CODIGOPRESUPUESTO').AsString := CodigoPresupuesto;
      TablaPropiedades.Params.ByName('NUMCONCEPTO').AsString := NumConcepto;
    end;

    TablaArticulos.Prepare;
    TablaPropiedades.Prepare;

    TablaArticulos.Open;
    TablaPropiedades.Open;

    TablaArticulos.EnableControls;
    TablaPropiedades.EnableControls;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrArticuloPresupuesto.CancelarModificar: Boolean;
begin
  Result := False;
  try
    TablaArticulos.Cancel;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrArticuloPresupuesto.ComprobarDatos: Boolean;
begin
  Result := False;
{
  if EsCadenaVacia(Descripcion.Text) then
  begin
    VerMensaje(msgDatosFaltaDescripcionArt);
    Descripcion.SetFocus;
    Exit;
  end;
}
  Result := True;
end;

constructor TfrArticuloPresupuesto.Create(AOwner: TComponent);
begin
  inherited;
  with TablaArticulos do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaPresupuestos.sqlConsultarDetalles);
    InsertSQL.Assign(dmTablaPresupuestos.sqlInsertarDetalles);
    ModifySQL.Assign(dmTablaPresupuestos.sqlModificarDetalles);
    DeleteSQL.Assign(dmTablaPresupuestos.sqlEliminarDetalles);
    RefreshSQL.Assign(dmTablaPresupuestos.sqlConsultarDetalles);
  end;

  with TablaPropiedades do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaPresupuestos.sqlConsultarGridPropiedadesModal);
    InsertSQL.Assign(dmTablaPresupuestos.sqlInsertarPropiedades);
    ModifySQL.Assign(dmTablaPresupuestos.sqlModificarPropiedades);
    DeleteSQL.Assign(dmTablaPresupuestos.sqlEliminarPropiedades);
    RefreshSQL.Assign(dmTablaPresupuestos.sqlConsultarPropiedades);
  end;

{  TablaPropiedadesMem.CopyStructure(TablaPropiedades);
  dmTablaPresupuestos.InicializarGridPropiedades(gridPropiedadesDBCardView);
  with TcxComboBoxProperties(gridPropiedadesDBCardView.GetRowByFieldName('PROPIEDAD').Properties) do
    Items := dmTablaPropiedades.darPropiedades;
  dsPropiedades.OnStateChange := dsDetallesStateChange;
}
end;

procedure TfrArticuloPresupuesto.dsDetallesStateChange(Sender: TObject);
begin
  if not (Modo in [Anadir, Modificar]) then
    Exit;

//  bEliminar.Enabled := not (TablaPropiedadesMem.RecordCount = 0);
//  bEliminarTodo.Enabled := not (TablaPropiedadesMem.RecordCount = 0);
end;

function TfrArticuloPresupuesto.ModificarDatos: Boolean;
begin
  Result := False;
  try
    TablaArticulos.Post;
//    BorrarDatosPropiedadesIB;
    SalvarDatosPropiedades;

    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrArticuloPresupuesto.PropiedadesMemAfterInsert(
  DataSet: TDataSet);
begin
  with DataSet do
  begin
    FieldByName('CODIGOPRESUPUESTO').AsString := CodigoPresupuesto;
    FieldByName('NUMCONCEPTO').AsString := NumConcepto;
    FieldByName('NUMPROPIEDAD').AsString := '-';
  end;
end;

procedure TfrArticuloPresupuesto.SalvarDatosPropiedades;
var
  NumeroCampo : Integer;
  NumeroPropiedad : Integer;
  Valor : Variant;
begin
  NumeroPropiedad := 1;
  try
    with TablaPropiedadesMem do
    begin
      if IsEmpty then
        Exit;
      DisableControls;
      First;
      TablaPropiedades.First;

      while not EOF do
      begin
        TablaPropiedades.Insert;

        for NumeroCampo := 0 to FieldCount-1 do
        begin
          Valor := Fields[NumeroCampo].AsVariant;

          if (Fields[NumeroCampo].FieldName = 'PROPIEDAD')
             and (EsCadenaVacia(Valor)) then
            raise Exception.Create(msgDatosFaltaDescripcionPro);

          if TablaPropiedades.Fields[NumeroCampo].FieldName = 'CODIGOPRESUPUESTO' then
            Valor := CodigoPresupuesto;

          if TablaPropiedades.Fields[NumeroCampo].FieldName = 'NUMCONCEPTO' then
            Valor := NumConcepto;

          if TablaPropiedades.Fields[NumeroCampo].FieldName = 'NUMPROPIEDAD' then
            Valor := NumeroPropiedad;

          TablaPropiedades.Fields[NumeroCampo].AsVariant := Valor;
        end;
        TablaPropiedades.Post;
        Inc(NumeroPropiedad);
        Next;
      end;
      EnableControls;
    end;
  except
    on E : EIBError do begin
      TablaPropiedadesMem.EnableControls;
      raise;
    end;
    on E : Exception do begin
      TablaPropiedadesMem.EnableControls;
      raise;
    end;
  end;
end;

procedure TfrArticuloPresupuesto.SetCodigoPresupuesto(const Value: Variant);
begin
  FCodigoPresupuesto := Value;
end;

procedure TfrArticuloPresupuesto.SetNumConcepto(const Value: Variant);
begin
  FNumConcepto := Value;
  BuscarArticulo;
end;

end.
