{~ExchangeQueryLoadEx
  exchange #2927
    здесь нужно учесть, что допускается несколько подстрок
  с заменой в запросе, в результате, на каждую заменяемую
  подстроку нужно указывать параметр даты.
    для этого в начале подсчитываем количество подстрок в строке,
  и на каждую найденную подстроку добавлем параметр даты.
    так же нужно учесть, что в подзапросах не только фигурирует параметр даты,

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

    в результате, замена подстрок выполняется в несколько этапов, еще
  на этапе формирование итогового запроса. за один раз меняется одна подстрока
  и добавляется дата к параметрам запроса.}
function ExchangeQueryLoadEx( aSQL: string;
                             aPrefix: string;// = 'KL';
                             aSubStr: string;
                             aFilter1: string = ''): string;
var
  xSubStr: string;
begin

    try
      case vCfgSelectorKBK of
        cnCfgSelectorKBK_Changes: begin
                { выгружаются только те строки КБК и только та история
                  изменения кода, которая не выгружалась относительно
                  последней выгрузки КБК. }
                xSubStr := StringReplace(
                         ' and (~.UNAPPROVED=0)'
                        +'    and ((~.unload_date is null) or'// /* дата выгрузки указана (был выгружен) */
                        +'        (~.change_date>~.unload_date))',//  /* и небыло изменений после выгрузки */
                         '~',
                         aPrefix);

                Result := StringReplace(aSQL, aSubStr, xSubStr + aFilter1);

              end;

        cnCfgSelectorKBK_Last: begin
                { выгружаются данные по КБК со строкой истории кода,
                  в которой дата окончания действия больше или равна рабочей
                  даты (дата может быть устанавлена при присоединении
                  AzkExchange к серверу приложений, либо не установлена.}
                xSubStr := StringReplace(
                         ' and (~.UNAPPROVED=0)'
                        +' and ((~.end_date is null) or (~.end_date >= ?))',
                         '~',
                         aPrefix);

                Result := StringReplace(aSQL, aSubStr, xSubStr + aFilter1);

                Query.AddDate( Work_Date);
              end;

        else begin
                xSubStr := StringReplace(
                         ' and (~.UNAPPROVED=0)',
                         '~',
                         aPrefix);

                Result := StringReplace(aSQL, aSubStr, xSubStr + aFilter1);

              end;
      end;//case//

      except
        ExceptionLog( 'Сбой ExchangeQueryLoadEx');
    end;



end;


{~ExecuteQueryLoadExBySQL
  выполнение запроса aSQL с параметрами, переданными глобальному объекту
  запроса Query.}
function ExecuteQueryLoadExBySQL( aSQL: string): Variant;
begin

    try
      Result := CreateOleObject('Microsoft.XmlDom');
      Result.LoadXml( Query.Run( aSQL));

      except
        ExceptionLog( 'Сбой ExecuteQueryLoadExBySQL');
    end;

end;



{~ExecuteQueryLoadEx
 выполняет запрос загрузки справочника КБК по SQL запросу  aSQL.
  в этой процедуре расширяется запрос по условию опции конфигурации:
   "Вариант выгрузки КБК".
  в зависимости от варианта значения этой опции селектируются КБК по дате
  окончания действия КБК или по дате последней выгрузки КБК.
  в результате возвращается список загруженных КБК в виде XML.

  дополнительно к подзапросу добавляется фильтр1 - aFilter1.}
function ExecuteQueryLoadEx( aSQL: string;
                             aPrefix: string;// = 'KL';
                             aSubStr: string;
                             aFilter1: string = ''): Variant;
{var
  xSQL,xSubStr: string;
  s: string;
  xPos: integer;}
begin

    try
      Result := ExecuteQueryLoadExBySQL(
                    ExchangeQueryLoadEx( aSQL,
                                         aPrefix,
                                         aSubStr,
                                         aFilter1));

      except
        ExceptionLog( 'Сбой ExecuteQueryLoadEx');
    end;

end;


{~GetSQLPrefixID
  возвращает строку указания префикса в запросе SQL.}
function GetSQLPrefixID( aPrefix: string;
                          const aDelimiter: string = ','): string;
begin
  Result := ' '#39 + aPrefix + #39' PREFIXID' + aDelimiter;
end;


begin
end.
