Некоторые особенности при работе с QUEUE #2

Помнится, не так давно в наших эхах шли обсуждения на тему эмуляции Set для очередей. В особенности, когда очередь отсортирована, например, по двум полям, и надо встать на начало или конец какой-либо последовательности по первому полю.

Как известно, в C55 появился новый оператор, позволяющий это делать — POSITION().
Но! Есть подобный оператор, точнее функция, и в C5!

  Map
    Module('')
      RTL::Position(QUEUE _Que,LONG _F1=0,...),LONG,RAW,C,NAME('Cla$POSITIONqueuekey')
    .
  .

Использование данной функции несколько отличается от POSITION из C55:

  • POSITION(C55) работает только по текущей сортировке
  • POSITION(C5) работает по любой сортировке, т.к. принудительно, если необходимо, делает SORT.

В остальном логика работы и возвращаемый результат одинаковы для обеих функций.
Для POSITION(C55) не проверял, но POSITION(C5), кроме того, выставляет POINTER на (POSITION(C5)-1). Кроме случая, когда возвращается 0. Тогда POINTER так-же равен 0.

А теперь — о плохом 🙁
К сожалению, разработчики не экспортировали данную функцию в DLL-библиотеку! Таким образом, использование данной функции возможно ТОЛЬКО для LOCALE-варианта сборки приложения.
Вот такой вот облом! Главное не понятно — ПОЧЕМУ !!!