Разделение строк/извлечение строк по частям

Оценить
(0 голоса)

В более сложных отчетах может возникнуть желание сделать так, чтобы извлекались только какие-то определенные части строк (например, только первые инициалы имени). Crystal Reports содержит множество интересных функций для формул, которые позволяют справляться даже с еще более сложными требованиями, предполагающими извлечение “подстрок”.

Например, рассмотренная выше функция ToWords может использоваться не только для печати чеков. При распечатке контрактов, документов по недвижимости или банковских платежных документов, к примеру, может возникнуть необходимость в том, чтобы число распечатывалось как в числовом, так и в текстовом формате, вроде:

Срок действия данного контракта истекает через тридцать (30) дней.

Ради этого примера представим, что данные, обозначающие число дней до истечения срока контракта, содержатся в числовом поле базы данных. А раз так, значит можно попробовать создать формулу. Для начала эта формула могла бы выглядеть так:

Срок действия данного контракта истекает через " &

ToWords({Contract.Expires}) & " (" &ToText({Contract.Expires},0) & ") дней."

Здесь функция ToWords используется для преобразования числового поля в текст, а функция ToText — для преобразования числа в числовую строку без десятичных разрядов.

Однако результат, возвращаемый этой формулой, будет иметь такой вид:

Срок действия данного контракта истекает через тридцать ихх/100 (30) дней.

Поскольку функция ToWords разрабатывалась для печати чеков, она возвращает не только часть числового поля, содержащую целое число, но и часть, содержащую сотые доли. Поэтому для нашего примера с контрактом она работать не будет. Как же создать формулу, которая бы возвращала только часть, содержащую целое число?

Если вы повнимательнее присмотритесь к функции ToWords, то заметите, что в ней целая часть числа всегда отделяется от части сотых долей с помощью слова “and” (“и”). Если вы сделаете так, чтобы в результатах функции ToWords выполнялся поиск слова “and” и возвращалась только та часть значения, которая находится перед ним, формула будет работать так, как нужно.

Взгляните на следующий пример:

Срок действия данного контракта истекает через " &

Left(ToWords({Contract.Expires}),

Instr(ToWords({Contract.Expires}), " и "))

& " {" & ToText({Contract.Expires},0) & ") дней."

В этой формуле используются несколько функций и методов, которые требуют дополнительных пояснений:

•    Функция Left. Функция Left возвращает заданное количество символов из левой части другой строки (и, как вы, наверное, уже догадались, также доступна и функция Right, которая возвращает символы из правой части строки). В данной формуле задача функции Left состоит в том, чтобы возвращать все слова из левой части строки, которую вернула функция ToWords, до тех пор, пока не встретится слово “и”. Таким образом, если функция ToWords возвращает "тридцать и хх / 100м, необходимо извлечь первые восемь символов слева (стоящих до “ и ”). Но как же мы определим, где находится это самое “ и ”?

•    Функция InStr. В языке формул существует несколько различных версий функции InStr. Версия, задействованная в предыдущем примере, принимает два аргумента — строку, в которой должен выполняться поиск, и подстроку, которую требуется отыскать в этой первой строке. Передавая функцию ToWords в качестве первого аргумента и символы “ и ” в качестве второго, мы просим функцию InStr вернуть числовую позицию “ и ” в строке "тридцать и хх / 100". В данном случае “ и ” находится в 9-й позиции, поэтому именно ее функция InStr и вернет в качестве результата.

Таким образом, используя функцию InStr внутри функции Left, мы можем извлечь требуемое количество символов, чтобы получить только целую часть числа из числового значения, представленного прописью. Единственное, на что здесь следует обратить внимание — это то, что функция InStr возвращает значение 9, а если вы хотите, чтобы вернулись только первые 8 символов (или 9, если вы не возражаете против пробела в конце строки), вам потребуется добавить операцию, вычитающую 1 из значения, возвращаемого функцией InStr. В этом случае будут возвращены 9 символов с левого края, включая пробел, то есть результатом будет “тридцать ”.

Существует и множество других встроенных строковых функций, которые также позволяют выполнять подобные операции. Найти их можно в категории Strings. Для получения более подробной информации об этих функциях, а также других версиях функций ToText, InStr, Mid, обратитесь к приложению А.

 

Формулы, работающие с типом даты/времени
Количество дней между двумя датами
Функция DateValue
Формулы If-Then-Else
Else "Обычный заказ"

Добавить комментарий


Защитный код
Обновить