Тема: Последнее вхождение подстроки

Добрый день!

Делаю шаблон отчета для старого построителя из режима 'Состав с параметрами' итоговой спецификации, версия  7.1.
В запросе не работает функция InStrRev, которая должна определить позицию последнего вхождения подстроки.
При формировании отчета появляется ошибка: "Undefined function 'InStrRev'' in expression".

Так же не работают функции Reverse, StrReverse. С их помощью можно было бы перевернуть строку и найти нужную подстроку через InStr.

Вопросы: почему не работают функции? Есть ли другие способы найти последнее вхождение подстроки?

Re: Последнее вхождение подстроки

Добрый день!
Запрос пожалуйста покажите

Re: Последнее вхождение подстроки

SELECT InStrRev(MM.P8, '\\') as P0, MM.P21 as P1, MM.P22 as P2 FROM RptSheet as MM

Re: Последнее вхождение подстроки

Видимо так использовать функцию в запросе нельзя.

Создайте именованную переменную (Доп. Настройки - Именованные объекты - Переменные) с текстом:

InStrRev([par1], '\\')



INPUT
par1=P0;

и используйте ее в бланке отчета или в функции VBScript (вкладка "Функции").
Запрос:

SELECT MM.P8 as P0, MM.P21 as P1, MM.P22 as P2 FROM RptSheet as MM

Re: Последнее вхождение подстроки

Доп.настройки доступны только для нового построителя отчетов. У нас старый :(

Re: Последнее вхождение подстроки

А как вы хотите использовать значение функции InStrRev() ?

(изменено: Виктор Бебякин, 10 апреля 2018 12:14:15)

Re: Последнее вхождение подстроки

Выгрузите пожалуйста отчет
https://forum.technologics.ru/topic3.html

Re: Последнее вхождение подстроки

Мне необходимо получить список номенклатуры с группировкой по спецификации, куда она входит. Что-то вроде вертикального дерева, как оглавление в книге. В поле ММ.Р8 есть нужная информация: \\Главная сборка\\Подсборка 1\\Подсборка 1.1 и так далее.  Для отчета необходимо получить крайнюю правую часть строки, ограничив ее последним вхождением символа '\\'.
В запросе это будет выглядеть так: RIGHT(MM.P8, LEN(MM.P8) - InStrRev(MM.P8, '\\')) +1)

(изменено: Виктор Бебякин, 11 апреля 2018 06:56:04)

Re: Последнее вхождение подстроки

В шаблоне отчета, в ячейку пропишите имя функции

call ИмяФункции

В модуле Access добавьте эту функцию и в ней выполните это выражение

Public ИмяФункции(MM, Dop, Others)
  Dim P8
  P8 = MM.Fields("P8").Value
  if IsNull(P8) then
    ИмяФункции = ""
  else
    ИмяФункции = RIGHT(P8, LEN(P8) - InStrRev(P8, "\\") +1)
  end if
End Function

Re: Последнее вхождение подстроки

Немного не в тему, но для того чтобы добыть куда входит лучше использовать поле PARENT_OFS - оно укажет REPORTOTALSPECTREE_ID позици владельца, откуда можно получить Обозначение Наименование и прочую информацию (тогда отчет не будет зависеть от полного классификатора да и он может быть слишком длинным).

Но по хорошему нам отчет надо получить чтобы увидеть что вы делаете.

(изменено: Алина Помозова, 10 апреля 2018 13:10:19)

Re: Последнее вхождение подстроки

Олег Зырянов пишет:

Немного не в тему, но для того чтобы добыть куда входит лучше использовать поле PARENT_OFS - оно укажет REPORTOTALSPECTREE_ID позици владельца, откуда можно получить Обозначение Наименование и прочую информацию (тогда отчет не будет зависеть от полного классификатора да и он может быть слишком длинным).

Но по хорошему нам отчет надо получить чтобы увидеть что вы делаете.

Я тоже пришла к идее, что лучше добыть информацию через PARENT_OFS. Но вопрос о нахождении подстроки все равно остался. Теперь вижу, что вызов фунции не ограничивается только запросом в бланке.

Post's attachments

File_10.04.18.zip 55.18 Кб, 1 скачиваний с 2018-04-10 

You don't have the permssions to download the attachments of this post.

Re: Последнее вхождение подстроки

Для нахождения подстроки нужно использовать функцию определенную в VBA модуле MS Access https://help.technologics.ru/7.1/TCSHelp/_673.htm
или
Вызвать процедуру до выполнения отчета https://help.technologics.ru/7.1/TCSHelp/_655.htm
выполнить запрос, пробежаться по записям, достать подстроку, сохранить результат в новую таблицу, присоединить таблицу к источнику данных через JOIN.
или переходить на новый репортер.

Спасибо сказали: Алина Помозова1

Re: Последнее вхождение подстроки

Виктор Бебякин пишет:

Для нахождения подстроки нужно использовать функцию определенную в VBA модуле MS Access https://help.technologics.ru/7.1/TCSHelp/_673.htm
или
Вызвать процедуру до выполнения отчета https://help.technologics.ru/7.1/TCSHelp/_655.htm
выполнить запрос, пробежаться по записям, достать подстроку, сохранить результат в новую таблицу, присоединить таблицу к источнику данных через JOIN.
или переходить на новый репортер.

Спасибо за помощь! Подробно все объяснили :) Код в модуле немного подправила, т.к. вылазила ошибка 3265. Добавила Function после Public и в третьей строчке "Р8=MM.Fields("P8").Value" в скобках вместо "Р8" указала порядковый номер поля источника данных.