{ exchange #3036
  модуль создан для ускорения операций сохранения данных в DataSet (cdsList)
  суть в том, что вместо частых операций:
    DataSet.Edit
    сохранение значения поля
    DataSet.Post
  сохраняем значения в глобальных переменных, а в конце операции проверки
  за один раз сохраняем все значения в полях.
  чтобы не плодить кучу кода, решено использовать одну функцию (сохранение
  строки):
    CDSListSaveFieldXXX( ид.поля, значение)
  и частные для разных типов:
    CDSListSaveFieldInt( ид.поля, значение)
    CDSListSaveFieldDate( ид.поля, значение)

  перед началом операции вызывается:
    CDSListReset
  затем выполняется проверка, где вызывается CDSListSaveField и подобные
  в конце вызывается:
    CDSListPost

  в результате, ускоряется операция проверки, за счет менее частого обновления
  DataSet.

  в целом ускорение это дает совсем малое.
  зато это дает больше преимуществ при отладке.}
const
  // индексы полейв строке флагов чт/зп полей
  cnField_id                    =  1;
  cnField_Budget_Id             =  2;
  cnField_LS_Number             =  3;
  cnField_ResText               =  4;
  cnField_Rec_Acc_Id            =  5;
  cnField_Rec_Id                =  6;
  cnField_Enroll                =  7;
  cnField_Org_Id                =  8;
  cnField_Industry_Code         =  9;
  cnField_Kesr_Code             = 10;
  cnField_LS_Id                 = 11;
  cnField_Grantinvestment_Id    = 12;
  cnField_GrantInvestment_Code  = 13;
  cnField_Grantinvestment_Type  = 14;
  cnField_Fsr_Id                = 15;
  cnField_Unclassified          = 16;
  cnField_Unclass_Org_Id        = 17;
  cnField_Unclass_Org_Taxcode   = 18;
  cnField_Unclass_Org_Kpp       = 19;
  cnField_Unclass_Org_Name      = 20;
  cnField_Industrycode_Id       = 21;
  cnField_Description           = 22;
  cnField_Org_Name              = 23;
  cnField_Org_TaxCode           = 24;
  cnField_Org_Kpp               = 25;
  cnField_Pi_Budget_Code        = 26;
  cnField_Pay_Account           = 27;
  cnField_Kvr_Code              = 28;
  cnField_Ksda_Code             = 29;


  // поля cnField_id,cnField_Budget_Id,cnField_LS_Number загружаются сразу,
  // поэтому для них сразу выставляется признак read.
  cnSFieldChanges = 'RRR--------------------------';

var
  // перенесено из Un_PayOrderList
  cdsList: TClientDataSet;
  DBGrid: TDBGridEh;

  // глобальный объект результата запроса Query
  // имеет смысл работать с одним xml чем вызывать создание объекта.
  // на это тратится порядка нескольких мс. при большом числе операций
  // это экономия времени уже на сек.
  vXML_Doc: Variant;

  // признаки чтения/записи полей
  // работа со строками немного медденне чем с числами, но гибче.
  // вместо двух операций с числами можно выполнить одну операцию с симв.
  // и в итоге символьные операции уже соизмеримы с числовыми по скорости.
  // поэтому: флаги чт/зп полей будем вести символьной строкой.
  // каждый символ соответствует индексу cnField_XXX в строке vSFieldChanges.
  vSFieldChanges: string;


  // значения полей на один record
  vField_ResText: string;
  vField_Rec_Acc_Id: variant;
  vField_Rec_Id: variant;
  vField_Enroll: variant;
  vField_Org_Id: variant;
  vField_Industry_Code: variant;
  vField_Kesr_Code: variant;
  vField_Kvr_Code: variant;
  vField_Ksda_Code: variant;
  vField_LS_Id: variant;
  vField_Grantinvestment_Id: string;
  vField_GrantInvestment_Code: string;
  vField_Grantinvestment_Type: string;
  vField_LS_Number: string;
  vField_Budget_Id: string;
  vField_Description: string;
  vField_Org_Name: string;
  vField_ID: string;
  vField_Org_TaxCode: string;
  vField_Org_Kpp: string;
  vField_Pi_Budget_Code: string;
  vField_Fsr_Id: string;
  vField_Unclassified: integer;
  vField_Unclass_Org_Id: string;
  vField_Unclass_Org_Taxcode: string;
  vField_Unclass_Org_Kpp: string;
  vField_Unclass_Org_Name: string;
  vField_Industrycode_Id: string;
  vField_Pay_Account: string;





{~CDSListReset
  сбрасывает флаги изменения полей.
  при этом часть полей загружаем из текущей записи DataSet сразу для всех
  проверок. это ускоряет обращение к этим полям.}
procedure CDSListReset;
begin

    try
//      vFieldChanges := 0;
      vSFieldChanges := cnSFieldChanges;
      // эти поля должны иметь один и тот же флаг на чтение !!!
      // поскольку значение перед проверкой ВСЕГДА загружается из dataset
      // сразу, и уже есть в переменных.
//      vFieldReaders := cnFieldR_id;
      vField_ID := cdsList.FieldByName('id').AsString;
      vField_Budget_Id := cdsList.FieldByName('Budget_Id').AsString;
      vField_LS_Number := cdsList.FieldByName('LS_Number').AsString;
      // текст сообщения очищаем, но не загружаем из поля dataset.
      // предполагается, что поле будет всегда обновлено.
      // но первоначально на запись его не инициализируем!
      vField_ResText := '';
      except
        ExceptionProc( 'CDSListReset');
    end;

{
  vField_Org_Id := cdsList.FieldByName('Org_Id').AsString;
  vField_Description := cdsList.FieldByName('Description').AsString;
  vField_Kesr_Code := cdsList.FieldByName('Kesr_Code').AsString;
  vField_Org_Name := cdsList.FieldByName('Org_Name').AsString;
  vField_Org_TaxCode := cdsList.FieldByName('Org_TaxCode').AsString;
  vField_Org_Kpp := cdsList.FieldByName('Org_Kpp').AsString;
  vField_Rec_Id := cdsList.FieldByName('Rec_Id').AsString;
  vField_Rec_Acc_Id := cdsList.FieldByName('Rec_Acc_Id').AsString;
  vField_Pi_Budget_Code := cdsList.FieldByName('Pi_Budget_Code').AsString;
  vField_Industry_Code := cdsList.FieldByName('Industry_Code').AsString;
  vField_Grantinvestment_Id := cdsList.FieldByName('Grantinvestment_Id').AsString;
  vField_Pay_Account := cdsList.FieldByName('Pay_Account').AsString;
  }
end;







{~CDSListPost
  сохранение значений всех полей в cdsList }
procedure CDSListPost;
begin

    try
      // есть хотя бы одно поле на запись ?
      if (POS( 'W', vSFieldChanges) > 0) then begin

        cdsList.Edit;
        try
          if (vSFieldChanges[ cnField_ResText] = 'W') //((vFieldChanges AND cnField_ResText) = 0)
            then cdsList.FieldByName('ResText').AsString := vField_ResText;
          if (vSFieldChanges[ cnField_Rec_Acc_Id] = 'W') //((vFieldChanges AND cnField_Rec_Acc_Id) = 0)
            then cdsList.FieldByName('Rec_Acc_Id').Value := vField_Rec_Acc_Id;
          if (vSFieldChanges[ cnField_Rec_Id] = 'W') //((vFieldChanges AND cnField_Rec_Id) = 0)
            then cdsList.FieldByName('Rec_Id').Value := vField_Rec_Id;
          if (vSFieldChanges[ cnField_Enroll] = 'W') //((vFieldChanges AND cnField_Enroll) = 0)
            then cdsList.FieldByName('Enroll').Value := vField_Enroll;
          if (vSFieldChanges[ cnField_Org_Id] = 'W') //((vFieldChanges AND cnField_Org_Id) = 0)
            then cdsList.FieldByName('Org_Id').Value := vField_Org_Id;
          if (vSFieldChanges[ cnField_Industry_Code] = 'W') //((vFieldChanges AND cnField_Industry_Code) = 0)
            then cdsList.FieldByName('Industry_Code').Value := vField_Industry_Code;
          if (vSFieldChanges[ cnField_Kesr_Code] = 'W') //((vFieldChanges AND cnField_Kesr_Code) = 0)
            then cdsList.FieldByName('Kesr_Code').Value := vField_Kesr_Code;
          if (vSFieldChanges[ cnField_Kvr_Code] = 'W') //((vFieldChanges AND cnField_Kesr_Code) = 0)
            then cdsList.FieldByName('Kvr_Code').Value := vField_Kvr_Code;
          if (vSFieldChanges[ cnField_Ksda_Code] = 'W') //((vFieldChanges AND cnField_Kesr_Code) = 0)
            then cdsList.FieldByName('Ksda_Code').Value := vField_Ksda_Code;
          if (vSFieldChanges[ cnField_LS_Id] = 'W') //((vFieldChanges AND cnField_LS_Id) = 0)
            then cdsList.FieldByName('LS_Id').Value := vField_LS_Id;
          if (vSFieldChanges[ cnField_Grantinvestment_Id] = 'W') //((vFieldChanges AND cnField_Grantinvestment_Id) = 0)
            then cdsList.FieldByName('Grantinvestment_Id').AsString :=
                                                          vField_Grantinvestment_Id;
          if (vSFieldChanges[ cnField_GrantInvestment_Code] = 'W') //((vFieldChanges AND cnField_GrantInvestment_Code) = 0)
            then cdsList.FieldByName('GrantInvestment_Code').AsString :=
                                                        vField_GrantInvestment_Code;
          if (vSFieldChanges[ cnField_Grantinvestment_Type] = 'W') //((vFieldChanges AND cnField_Grantinvestment_Type) = 0)
            then cdsList.FieldByName('Grantinvestment_Type').AsString :=
                                                        vField_Grantinvestment_Type;
          if (vSFieldChanges[ cnField_LS_Number] = 'W') //((vFieldChanges AND cnField_LS_Number) = 0)
            then cdsList.FieldByName('LS_Number').AsString := vField_LS_Number;
          if (vSFieldChanges[ cnField_Fsr_Id] = 'W') //((vFieldChanges AND cnField_Fsr_Id) = 0)
            then cdsList.FieldByName('Fsr_Id').AsString := vField_Fsr_Id;
          if (vSFieldChanges[ cnField_Unclassified] = 'W') //((vFieldChanges AND cnField_Unclassified) = 0)
            then cdsList.FieldByName('Unclassified').AsInteger := vField_Unclassified;
          if (vSFieldChanges[ cnField_Unclass_Org_Id] = 'W') //((vFieldChanges AND cnField_Unclass_Org_Id) = 0)
            then cdsList.FieldByName('Unclass_Org_Id').AsString := vField_Unclass_Org_Id;
          if (vSFieldChanges[ cnField_Unclass_Org_Taxcode] = 'W') //((vFieldChanges AND cnField_Unclass_Org_Taxcode) = 0)
            then cdsList.FieldByName('Unclass_Org_Taxcode').AsString := vField_Unclass_Org_Taxcode;
          if (vSFieldChanges[ cnField_Unclass_Org_Kpp] = 'W') //((vFieldChanges AND cnField_Unclass_Org_Kpp) = 0)
            then cdsList.FieldByName('Unclass_Org_Kpp').AsString := vField_Unclass_Org_Kpp;
          if (vSFieldChanges[ cnField_Unclass_Org_Name] = 'W') //((vFieldChanges AND cnField_Unclass_Org_Name) = 0)
            then cdsList.FieldByName('Unclass_Org_Name').AsString := vField_Unclass_Org_Name;
          if (vSFieldChanges[ cnField_Industrycode_Id] = 'W') //((vFieldChanges AND cnField_Industrycode_Id) = 0)
            then cdsList.FieldByName('Industrycode_Id').AsString := vField_Industrycode_Id;
    //      if ((vFieldChanges AND cnField_) <> 0)
    //        then cdsList.FieldByName('').Value := vField_;
          finally
            cdsList.Post;
        end;
      end;
      except
        ExceptionProc( 'CDSListPost');
    end;

end;

function CDSListField_Budget_Id_Get: string;
begin

  Result := vField_Budget_Id;
end;

function CDSListField_ID_Get: string;
begin

  Result := vField_ID;
end;

function CDSListField_Description_Get: string;
begin

  if (vSFieldChanges[ cnField_Description] = '-') then begin;
    vSFieldChanges[ cnField_Description] := 'R';
    vField_Description := cdsList.FieldByName('Description').AsString;
  end;
  Result := vField_Description;
end;

function CDSListField_Grantinvestment_Id_Get: string;
begin

  if (vSFieldChanges[ cnField_Grantinvestment_Id] = '-') then begin;
    vSFieldChanges[ cnField_Grantinvestment_Id] := 'R';
    vField_Grantinvestment_Id := cdsList.FieldByName('Grantinvestment_Id').AsString;
  end;
  Result := vField_Grantinvestment_Id;
end;

function CDSListField_Grantinvestment_Code_Get: string;
begin

  if (vSFieldChanges[ cnField_Grantinvestment_Code] = '-') then begin;
    vSFieldChanges[ cnField_Grantinvestment_Code] := 'R';
    vField_Grantinvestment_Code := cdsList.FieldByName('Grantinvestment_Code').AsString;
  end;
  Result := vField_Grantinvestment_Code;
end;

function CDSListField_Grantinvestment_Type_Get: string;
begin

  if (vSFieldChanges[ cnField_Grantinvestment_Type] = '-') then begin;
    vSFieldChanges[ cnField_Grantinvestment_Type] := 'R';
    vField_Grantinvestment_Type := cdsList.FieldByName('Grantinvestment_Type').AsString;
  end;
  Result := vField_Grantinvestment_Type;
end;

function CDSListField_Industry_Code_Get: string;
begin

  if (vSFieldChanges[ cnField_Industry_Code] = '-') then begin;
    vSFieldChanges[ cnField_Industry_Code] := 'R';
    vField_Industry_Code := cdsList.FieldByName('Industry_Code').AsString;
  end;
  Result := vField_Industry_Code;
end;

function CDSListField_Industrycode_Id_Get: string;
begin

  if (vSFieldChanges[ cnField_Industrycode_Id] = '-') then begin;
    vSFieldChanges[ cnField_Industrycode_Id] := 'R';
    vField_Industrycode_Id := cdsList.FieldByName('Industrycode_Id').AsString;
  end;
  Result := vField_Industrycode_Id;
end;

function CDSListField_Org_Id_Get: string;
begin

  if (vSFieldChanges[ cnField_Org_Id] = '-') then begin;
    vSFieldChanges[ cnField_Org_Id] := 'R';
    vField_Org_Id := cdsList.FieldByName( 'Org_Id').AsString;
  end;
  Result := vField_Org_Id;
end;

function CDSListField_Kesr_Code_Get: string;
begin

  if (vSFieldChanges[ cnField_Kesr_Code] = '-') then begin;
    vSFieldChanges[ cnField_Kesr_Code] := 'R';
    vField_Kesr_Code := cdsList.FieldByName( 'Kesr_Code').AsString;
  end;
  Result := vField_Kesr_Code;
end;

function CDSListField_Ksda_Code_Get: string;
begin

  if (vSFieldChanges[ cnField_Ksda_Code] = '-') then begin;
    vSFieldChanges[ cnField_Ksda_Code] := 'R';
    vField_Ksda_Code := cdsList.FieldByName( 'Ksda_Code').AsString;
  end;
  Result := vField_Ksda_Code;
end;

function CDSListField_Org_Name_Get: string;
begin

  if (vSFieldChanges[ cnField_Org_Name] = '-') then begin;
    vSFieldChanges[ cnField_Org_Name] := 'R';
    vField_Org_Name := cdsList.FieldByName( 'Org_Name').AsString;
  end;
  Result := vField_Org_Name;
end;

function CDSListField_Org_TaxCode_Get: string;
begin

  if (vSFieldChanges[ cnField_Org_TaxCode] = '-') then begin;
    vSFieldChanges[ cnField_Org_TaxCode] := 'R';
    vField_Org_TaxCode := cdsList.FieldByName( 'Org_TaxCode').AsString;
  end;
  Result := vField_Org_TaxCode;
end;

function CDSListField_Org_Kpp_Get: string;
begin

  if (vSFieldChanges[ cnField_Org_Kpp] = '-') then begin;
    vSFieldChanges[ cnField_Org_Kpp] := 'R';
    vField_Org_Kpp := cdsList.FieldByName( 'Org_Kpp').AsString;
  end;
  Result := vField_Org_Kpp;
end;

function CDSListField_Rec_Acc_Id_Get: string;
begin

  if (vSFieldChanges[ cnField_Rec_Acc_Id] = '-') then begin;
    vSFieldChanges[ cnField_Rec_Acc_Id] := 'R';
    vField_Rec_Acc_Id := cdsList.FieldByName( 'Rec_Acc_Id').AsString;
  end;
  Result := vField_Rec_Acc_Id;
end;

function CDSListField_Rec_Id_Get: string;
begin

  if (vSFieldChanges[ cnField_Rec_Id] = '-') then begin;
    vSFieldChanges[ cnField_Rec_Id] := 'R';
    vField_Rec_Id := cdsList.FieldByName( 'Rec_Id').AsString;
  end;
  Result := vField_Rec_Id;
end;

function CDSListField_Pi_Budget_Code_Get: string;
begin

  if (vSFieldChanges[ cnField_Pi_Budget_Code] = '-') then begin;
    vSFieldChanges[ cnField_Pi_Budget_Code] := 'R';
    vField_Pi_Budget_Code := cdsList.FieldByName( 'Pi_Budget_Code').AsString;
  end;
  Result := vField_Pi_Budget_Code;
end;

function CDSListField_LS_Number_Get: string;
begin

  Result := vField_LS_Number;
end;


function CDSListField_LS_ID_Get: string;
begin

  Result := vField_LS_ID;
end;

function CDSListField_Pay_Account_Get: string;
begin

  if (vSFieldChanges[ cnField_Pay_Account] = '-') then begin;
    vSFieldChanges[ cnField_Pay_Account] := 'R';
    vField_Pay_Account := cdsList.FieldByName( 'Pay_Account').AsString;
  end;
  Result := vField_Pay_Account;
end;

function CDSListField_Fsr_Id_Get: string;
begin
  if (vSFieldChanges[cnField_Fsr_Id] = '-') then begin;
    vSFieldChanges[cnField_Fsr_Id] := 'R';
    vField_Fsr_Id := cdsList.FieldByName('FSR_ID').AsString;
  end;
  Result := vField_Fsr_Id;
end;


procedure CDSListField_Message( aValue: String);
begin
  vSFieldChanges[ cnField_ResText] := 'W';
  vField_ResText := aValue;

end;

{~CDSListField_MessageFormat
  форматированное обновление текста комментария, вида: ...%ResText%...
  где строки шаблонов:
    %ResText% - подстановка исходного значения текста.

  в результате обновляется весь текст с использованием предыдущего значения
  текста сообщения.

  например:
    текст до обновления: код не найден
    вызов: CDSListField_MessageFormat( 'Проверка не найдена. Причина: %ResText%.').
    результат:
      Проверка не найдена. Причина: код не найден.}
procedure CDSListField_MessageFormat( aValue: String);
begin
  CDSListField_Message(
        StringReplace( aValue, '%ResText%', vField_ResText));
end;

procedure CDSListField_Rec_Acc_Id( aValue: variant);
begin
  vSFieldChanges[ cnField_Rec_Acc_Id] := 'W';
  vField_Rec_Acc_Id := aValue;

end;

procedure CDSListField_Rec_Id( aValue: variant);
begin
  vSFieldChanges[ cnField_Rec_Id] := 'W';
  vField_Rec_Id := aValue;

end;

procedure CDSListField_Enroll( aValue: variant);
begin
  vSFieldChanges[ cnField_Enroll] := 'W';
  vField_Enroll := aValue;

end;

procedure CDSListField_Org_Id( aValue: variant);
begin
  vSFieldChanges[ cnField_Org_Id] := 'W';
  vField_Org_Id := aValue;

end;

procedure CDSListField_Industry_Code( aValue: variant);
begin
  vSFieldChanges[ cnField_Industry_Code] := 'W';
  vField_Industry_Code := aValue;

end;

procedure CDSListField_Industrycode_Id( aValue: string);
begin
  vSFieldChanges[ cnField_Industrycode_Id] := 'W';
  vField_Industrycode_Id := aValue;

end;

procedure CDSListField_Kesr_Code( aValue: variant);
begin
  vSFieldChanges[ cnField_Kesr_Code] := 'W';
  vField_Kesr_Code := aValue;

end;

procedure CDSListField_Kvr_Code( aValue: variant);
begin
  vSFieldChanges[ cnField_Kvr_Code] := 'W';
  vField_Kvr_Code := aValue;

end;

procedure CDSListField_Ksda_Code( aValue: variant);
begin
  vSFieldChanges[ cnField_Ksda_Code] := 'W';
  vField_Ksda_Code := aValue;

end;

procedure CDSListField_LS_Id( aValue: variant);
begin
  vSFieldChanges[ cnField_LS_Id] := 'W';
  vField_LS_Id := aValue;

end;

procedure CDSListField_Grantinvestment_Id( aValue: string);
begin
  vSFieldChanges[ cnField_Grantinvestment_Id] := 'W';
  vField_Grantinvestment_Id := aValue;

end;

procedure CDSListField_GrantInvestment_Code( aValue: string);
begin
  vSFieldChanges[ cnField_GrantInvestment_Code] := 'W';
  vField_GrantInvestment_Code := aValue;

end;

procedure CDSListField_Grantinvestment_Type( aValue: string);
begin
  vSFieldChanges[ cnField_Grantinvestment_Type] := 'W';
  vField_Grantinvestment_Type := aValue;

end;

procedure CDSListField_LS_Number( aValue: string);
begin
  vSFieldChanges[ cnField_LS_Number] := 'W';
  vField_LS_Number := aValue;

end;

procedure CDSListField_Fsr_Id( aValue: string);
begin
  vSFieldChanges[ cnField_Fsr_Id] := 'W';
  vField_Fsr_Id := aValue;

end;

procedure CDSListField_Unclassified( aValue: integer);
begin
  vSFieldChanges[ cnField_Unclassified] := 'W';
  vField_Unclassified := aValue;

end;

procedure CDSListField_Unclass_Org_Id( aValue: string);
begin
  vSFieldChanges[ cnField_Unclass_Org_Id] := 'W';
  vField_Unclass_Org_Id := aValue;

end;

procedure CDSListField_Unclass_Org_Taxcode( aValue: string);
begin
  vSFieldChanges[ cnField_Unclass_Org_Taxcode] := 'W';
  vField_Unclass_Org_Taxcode := aValue;

end;

procedure CDSListField_Unclass_Org_Kpp( aValue: string);
begin
  vSFieldChanges[ cnField_Unclass_Org_Kpp] := 'W';
  vField_Unclass_Org_Kpp := aValue;

end;

procedure CDSListField_Unclass_Org_Name( aValue: string);
begin
  vSFieldChanges[ cnField_Unclass_Org_Name] := 'W';
  vField_Unclass_Org_Name := aValue;

end;



procedure InitializeDataSetPost;
begin

    try
      vXML_Doc:= CreateOleObject('Microsoft.XmlDom');
      except
        ExceptionProc( 'InitializeDataSetPost');
    end;

end;


begin
end.
