{********************************************************************}
{                                                                    }
{     Copyright (c) 04.2000 by Serge Buzadzhy                        }
{     email:  serge_buzadzhy@mail.ru,                                }
{             FidoNet: 2:467/44.37                                   }
{                                                                    }
{                                                                    }
{********************************************************************}


{
 Работа с Array полями Interbase c помощью FibPlus.
 Эта форма демонстрирует как можно сделать "живой" датасет
 типа :

 SELECT
    JOB.JOB_CODE,
    JOB.JOB_GRADE,
    JOB.JOB_COUNTRY,
    JOB.JOB_TITLE,
    JOB.LANGUAGE_REQ[1] LQ1,
    JOB.LANGUAGE_REQ[2] LQ2
 FROM
    JOB JOB

 как мы видим, здесь выбираются лишь срезы поля, посему для редактирования
 требуются дополнительные действия.

 qryArrField - updateObject который вызывается до pFIBDataSet1.QUpdate.ExecSQL;
 Цель этой штуки получить ArrayId редактируемого поля, который и присваивается
 в соответсвующий параметр pFIBDataSet1.QUpdate.ExecSQL;

 Note: 1.CachedUpdates допустим.
       2.Insert выключен, т.к. в данном селекте нехватает необходимых полей. 

 Также эта форма в сочетании с открытой Form1 демонстрирует возможности
 контейнера и пользовательских эвентов. Если Form1, открыта то датасет на ней
 рефрешит запись текущую для Form2

}
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, FIBDataSet, pFIBDataSet, ExtCtrls, DBCtrls, Grids, DBGrids, StdCtrls,
  FIBQuery, pFIBQuery;

type
  TForm2 = class(TForm)
    ArrayDataSet: TpFIBDataSet;
    DataSource: TDataSource;
    GroupBox1: TGroupBox;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    QryArrField: TpFIBUpdateObject;
    btnApply: TButton;
    chCU: TCheckBox;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure QryArrFieldAfterExecute(Sender: TObject);
    procedure ArrayDataSetAfterPost(DataSet: TDataSet);
    procedure btnApplyClick(Sender: TObject);
    procedure chCUClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

uses DM;

{$R *.DFM}

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  Form2 := nil;
end;

procedure TForm2.QryArrFieldAfterExecute(Sender: TObject);
var v: Variant;
begin
  v := QryArrField.Fields[0].GetArrayValues;
  with ArrayDataSet do begin
    // Если применять ApplyUpdToBase, то здесь код должен быть более изощренным
    v[1] := FieldByName('LQ1').AsString;
    v[2] := FieldByName('LQ2').AsString;
    QryArrField.Fields[0].SetArrayValue(v);
    QUpdate.Params.ByName['LQ'].AsQuad := QryArrField.Fields[0].AsQuad;
  end;
  QryArrField.Close;
end;

procedure TForm2.ArrayDataSetAfterPost(DataSet: TDataSet);
begin
  ArrayDataSet.Transaction.CommitRetaining;
end;

procedure TForm2.btnApplyClick(Sender: TObject);
begin
  with ArrayDataSet do try
    ApplyUpdates;
    Transaction.CommitRetaining;
  except
    Transaction.Rollback;
    Open;
  end;
end;

procedure TForm2.chCUClick(Sender: TObject);
begin
  ArrayDataSet.CachedUpdates := chCU.Checked;
  btnApply.Enabled := chCU.Checked;
end;

procedure TForm2.FormShow(Sender: TObject);
begin
  ArrayDataSet.Open;
end;

end.
