HandKot писал(а):можно запросы со встроенными ф-циями организовывать в виде сохраненных запросов в самом Акцес и в этом случае их можно использовать как ХП
плюсы:
- всё хранится в одном месте
- не надо заботится о диалекте: создал в Акцесс - значит работает
Вот! Именно об этом и идет речь.
Есть часто используемая вьюшка, которая уже сохранена в ACCESS (типа ХП). И в самом ACCESS она прекрасно работает.
А если эту же вьюшку использовать не через ACCESS, а через Jet-провайдер, то InStrRev уже не работает.
Пишет: Undefined function 'InStrRev' in expression.
Дело в том, что когда используешь свою вьюшку прямо в ACCESS, то процесс принадлежит самому ACCESSу.
У самого ACCESSа возможностей полно. В том числе он может использовать прямо в SQL-запросе все функции VB.
А так же все Ваши собственные публичные функции, написанные в модуле.
Но как только Вы используете эту же вьюшку через Jet-провайдер, то на Вашем компьютере может вообще не быть ACCESSа.
ACCESS теперь не используется вообще. Используется просто mdb-файл, как обычный текстовый файл.
Управление компьютером производится провайдером (от имени процесса Вашей программы).
А этот Jet-провайдер, во-первых , не знает и не должен знать всех VB-шных функций.
А, во-вторых, он не умеет использовать Ваши собственные публичные функции, написанные в модуле.
Может кто знает, где можно увидеть список всех функций, которые можно использовать с Jet-провайдером?По-идее, глядя на него можно будет сразу сказать, возможно такое написать прямо в SQL-запросе или нет.
А то без этого списка ищешь черную кошку в темной комнате...
PS: вот тут пишут, что скорее всего провайдером поддерживаются только те функции, которые были до VB6,
то есть кроме: Replace; StrReverse; InStrRev; Split; Join; Round; MonthName; WeekdayName и еще несколько других.
http://www.sql.ru/forum/actualthread.aspx?tid=678037PPS: Вот здесь интересный вариант реализации. Прямо скажет нестандартный.
Но производительность, скорее всего, просадится уже на нескольких тысячах записей, если поля тоже длиной по 1000 знаков и больше.
Использовать такое вряд ли буду, ибо производительность в моем текущем проекте просаживать нельзя (уж лучше обойдусь лишним VB-кодом, чем таким запросом).
Хотя на маленьких табличках вполне возможно подойдет...
http://www.sql.ru/forum/actualthread.as ... =2#7280425- Код: Выделить всё
SELECT Q.ID, Mid(T.ID,1,Q.MaxN-1) AS ParentID
FROM T,
(SELECT T.ID, Max(N) AS MaxN
FROM T, numb
WHERE IIf(InStr(T.ID,".")>0,Mid(T.ID,N,1) Like ".",True) AND Len(T.ID)>=N-1
GROUP BY T.ID
) AS Q
WHERE T.ID = Q.ID;
Тут Ваша таблица - T, с полем ID, где хранятся данные типа "ББ 5.3.2"
также необходима таблица numb (с одним уникальным полем N) - она содержит натуральные числа от 1 до как минимум {максим. длина поля ID +1}, больше тоже можно.