Цикл While Do

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

Циклическая структура, подобная For, может использоваться для повторного выполнения операторов в случае, если заданное условие удовлетворено. Если цикл For для определения количества раз, которое должен выполняться цикл, использует переменную-счетчик, то цикл While Do вычисляет условие перед тем, как будет выполнена очередная итерация цикла, и останавливается, если условие перестает быть истинным. Эта конструкция похожа на циклы Do и While, используемые в Visual Basic и других процедурных языках.

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

Использование функций Join и Split вместо циклов

Хотя показанный выше программный код и служит удачным примером использования цикла For, на самом деле существует еще одна встроенная функция, которая делает объявление переменных, реализацию логики цикла и удаление запятой/пробела излишними при создании одной строки, содержащей записи из многозначного поля параметров. Взгляните на следующий код:

"Выбранные регионы: = Join({?Region}, ", ")

В этой формуле используется функция Join, похожая на свой аналог из Visual Basic, которая берет все элементы массива, указанные в первом аргументе (многозначное поле параметров фактически представляет собой массив), связывает их вместе и, при необходимости, вставляет между ними строку, указанную во втором аргументе. Join делает то же самое, что и логика цикла с применением переменных, показанная в предыдущем разделе, с помощью одной простой функции.

Не исключена и обратная ситуация: может, вы захотите взять строковое значение или переменную, которая содержит множество строк, отделенных друг от друга общим разделителем (типа косой черты), и создать массив строковых значений. В этом случае вы могли бы создать цикл, который бы просматривал строку, по одному символу за раз, отыскивал разделитель (косую черту) и выполнял сложную логику для извлечения подстроки и ее добавления в массив. Но функция Split, подобно ее эквиваленту из Visual Basic, выполняет все описанные действия автоматически. Взгляните на следующий фрагмент кода (это не целая формула, а только ее часть):

StringVar array Regions;

Regions :=

Split("Северо-запад, Юго-запад, Северо-восток, Юго-восток, Средний Запад", " / ")

Вторая строка кода накапливает в переменной типа массива Region пять элементов путем просмотра строки и выделения пяти подстрок, отделенных друг от друга косой чертой.

Однако о циклах все-таки забывать не стоит - функции Join и Split работают только со строковыми значениями. Если используемое многозначное поле параметров имеет числовой или какой-нибудь другой нестроковый тип, для извлечения из него отдельных элементов вам все равно придется воспользоваться циклами. А если вы захотите создать какой-нибудь нестроковый массив, вам также, возможно, доведется прибегнуть к помощи циклов, потому что функция Split работает только со строками.

Если в переменной присутствует дефис, цикл Do выполнит оператор, который извлечет этот дефис, оставив в строке только цифры из телефонного номера. Когда в переменной больше не остается ни одного дефиса, условие While возвращает false, после чего будет выполнен оператор, указанный после закрывающей скобки цикла While Do (в данном случае это имя переменной, которая отобразит цифры телефонного номера без дефисов).

StringVar NewPhone := {Customer.Phone};

While Instr(NewPhone,   > 0 Do

(

NewPhone := Left(NewPhone, Instr(NewPhone, "-") - 1) &

Right(NewPhone, Length(NewPhone) - Instr(NewPhone,

);

NewPhone

Данный пример прекрасно иллюстрирует работу цикла While Do, когда условие выполняется; однако, согласитесь, что для выполнения такой относительно простой функции, как “найти и заменить”, это слишком сложный процесс. При желании создать более простую формулу вы можете воспользоваться функцией Replace, как показано в следующем примере:

Replace({Customer.Phone},   "")

В данном случае функция Replace принимает три параметра: первый — строковое поле или значение, которое необходимо изменить, второй — искомый символ или символы, и третий — символ или символы, на которые должны быть заменены искомые символы.

На заметку! Во всех приведенных выше примерах логических конструкций использовался синтаксис Crystal Логические конструкции в синтаксисе Basic очень похожи, если вообще не идентичны своим аналогам из Visual Basic. Главное не забывайте о том, что в синтаксисе Basic для того, чтобы результат возвращался в отчет, вы должны будете использовать в своей формуле, по крайней мере, один экземпляр внутренней переменной Formula.

Булевские формулы
Переменные в формулах и времена вычисления
Объявление переменной
Область действия переменной
Присваивание значения переменной

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


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