Сломаны фильтры в отчетах складского модуля (MSSQL, Oracle)

ПНР и сопровождение

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Friendlyman
Постоянный гость
Сообщения: 74
Зарегистрирован: 23 июн 2007, 23:07
Откуда: ТопСофт, Минск

Сломаны фильтры в отчетах складского модуля (MSSQL, Oracle)

Сообщение Friendlyman »

Может кому-то окажется полезным...

Не фильтрует в отчетах по наличию модуля Складской учет.
Формирую например, Галактика ERP \ Логистика \ Складской учет \ Отчеты \ Наличие \ Наличие\по складам
Ставлю фильтр по одной группе МЦ, в отчете получаю множество МЦ, в том числе не входящие в эту группу.
Возможно проявление проблемы и на других фильтрах.

Проявляется только на платформах MSSQL и Oracle, т.к. ошибка содержится в той части логики, которая завязана на использование DSQL.
Ошибка состоит в следующем
В интерфейсе L_Ostatki::Store в приватной функции function FillFiltFromPick(_pickConst: word): boolean; (код ниже) допущена ошибка.

Код: Выделить всё

function FillFiltFromPick(_pickConst: word): boolean;
{
  var sql_result, cntRec: integer;
  cntRec := 0;

  result := false;

  _loop PickFilter where (( _pickConst == PickFilter.wList ))
  {
    sql_result := sqlExecDirect('INSERT INTO pick_' + string(_pickConst) + ' (nRec) VALUES (' + ' #comp(' + string(PickFilter.cRec) + '))');
    if (sql_result = tsOk)
      cntRec++
  }

  if (cntRec > 0)
    result := true;
}
Здесь переменная-счетчик помеченных элементов _pickConst зачем-то сделана с типом integer. При определенном, достаточно большом количестве значений в фильтре, иногда получается, что в _pickConst : integer накапливается ОТРИЦАТЕЛЬНОЕ ЧИСЛО. В результате этого условие if (cntRec > 0) в конце функции не выполняется, и фильтрация по любой аналитике с большим количеством выбранных элементов автоматически ломается.
Необходимо поменять тип переменной на Longint.
При фильтрации по ОДНОЙ группе МЦ фильтрация ломается также потому, что логика сразу выбирает все МЦ, подходящие по фильтру по группе МЦ, а потом пытается закачать их в DSQL-фильтр уже не по группе МЦ, а по МЦ, и если МЦ в базе данных много, то _pickConst добирается до отрицательных значений и всё ломается.

ПИР 102.123147

Вот как можно починить до выхода патчей.
Нужно скомпилить нижеследующее счастье в компоненту L_Ostatki (#component "L_Ostatki")

Код: Выделить всё

alter interface Store 'Функция расчета остатка на дату', EscClose, Blue;

overload
  function FillFiltFromPick(_pickConst: word): boolean;
end;

function FillFiltFromPick(_pickConst: word): boolean;
{
  var sql_result : integer;
  var cntRec     : longint;

  cntRec := 0;

  result := false;

  _loop PickFilter where (( _pickConst == PickFilter.wList ))
  {
    sql_result := sqlExecDirect('INSERT INTO pick_' + string(_pickConst) + ' (nRec) VALUES (' + ' #comp(' + string(PickFilter.cRec) + '))');
    if (sql_result = tsOk)
      cntRec++
  }

  if (cntRec > 0)
    result := true;
}
end.
Ответить