Работа со списками
Списки, разделённые запятыми, используются для хранения нескольких элементов в одной символьной переменной. Например, вы можете хранить:
- Квоты продаж на 12 месяцев
- Названия отделов в вашей компании
- Названия 12 месяцев в году
Определение списка
Список — это строка с подстроками, каждая из которых разделена символом-разделителем. Запятая является разделителем по умолчанию.
В следующем коде показаны два примера переменных списка. Вам не нужно инициализировать переменную списка, когда она определена, но в ней должны быть элементы, чтобы вы могли с ней работать.
VAR CHAR cMonths = "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec". VAR CHAR cQuarterlyQuotas = "100500,400000,250000,175000".
Доступ к значению в списке
ABL предоставляет функции для доступа к элементам списка и управления ими. Эти функции позволяют:
- Найти позицию элемента в списке (функция LOOKUP).
- Извлечь значение из определенной позиции в списке (функция ENTRY).
- Узнать, сколько элементов в списке (функция NUM-ENTRIES).
- Присвоить конкретному элементу списка значение (оператор ENTRY).
Поиск элемента в списке
Используйте функцию LOOKUP, чтобы определить, находится ли конкретный элемент в списке. Функция LOOKUP возвращает 0, если элемента нет в списке; в противном случае возвращается целочисленное значение позиции элемента в списке.
Синтаксис функции LOOKUP:
position = LOOKUP(expression, list)
position
Возвращает целочисленное значение позиции выражения в списке . Если не найдено, то position устанавливается равным 0.
expression
Символьное выражение для поиска в списке.
list
Переменная CHARACTER, содержащая список элементов, разделённых запятыми.
В следующем примере кода определяется вызываемый список cMonths, содержащий месяцы года. expr— это выражение для поиска в списке, для которого установлено значение «Sep».
VAR CHAR cMonths = "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec". VAR CHAR expr = "Sep". VAR INT position. position = LOOKUP(expr, cMonths). MESSAGE "cMonths:" cMonths SKIP "expr:" expr SKIP "position:" position VIEW-AS ALERT-BOX.
Следующий вывод получается при выполнении кода. Обратите внимание, что позиция установлена на 9, потому что «Sep» находится на девятой позиции в списке.
cMonths: Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec expr: Sep position: 9
Извлечение значения из списка
Используйте функцию ENTRY, чтобы вернуть запись из списка на основе целочисленной позиции.
item = ENTRY(position,list)
Следующий пример кода извлекает адресные данные из списка, разделённого запятыми.
VAR CHAR cAddress. cAddress = "Lift Tours,276 North Drive,,Burlington,MA,01730,USA". MESSAGE "Name:" ENTRY(1,cAddress) SKIP "Address line 1:" ENTRY(2,cAddress) SKIP "Address line 2:" ENTRY(3,cAddress) SKIP "City:" ENTRY(4,cAddress) SKIP "State:" ENTRY(5,cAddress) SKIP "Zipcode:" ENTRY(6,cAddress) SKIP "Country:" ENTRY(7,cAddress) VIEW-AS ALERT-BOX.
Следующий вывод получается при выполнении кода.
Name: Lift Tours Address line 1: 276 North Drive Address line 2: City: Burlington State: MA Zipcode: 01730 Country: USA
Определить количество записей в списке
Используйте функцию NUM-ENTRIES, чтобы получить количество элементов в списке. NUM-ENTRIES полезна, когда вы хотите обрабатывать элементы в списке в цикле. Значение NUM-ENTRIES сообщает вам количество итераций, которые вам нужно сделать.
Пример кода, где используется NUM-ENTRIES для определения количества итераций в блоке REPEAT.
VAR INT ix = 1. VAR CHAR cMonths = "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec". REPEAT ix = 1 TO NUM-ENTRIES(cMonths): DISPLAY ix " " ENTRY(ix, cMonths). END.
Выполнение кода приводит к следующему выводу:
ix ---------- 1 Jan 2 Feb 3 Mar 4 Apr 5 May 6 Jun 7 Jul 8 Aug 9 Sep 10 Oct 11 Nov 12 Dec
Установить значение в списке
Вы можете заменить значение в списке другим значением, используя оператор ENTRY.
Синтаксис оператора ENTRY:
ENTRY(position, list) = expr.
position
Целочисленное значение, соответствующее положению строки символов в списке.
list
Список строк символов, разделённых символьным разделителем.
expr
Символьное значение, которое заменяет элемент в списке в указанной позиции.
Следующий пример кода заменяет значения списка на аналогичные на французском языке.
VAR CHAR cList = "North,South,East,West". MESSAGE "English:" cList VIEW-AS ALERT-BOX. ENTRY(1, cList) = "Nord". ENTRY(2, cList) = "Sud". ENTRY(3, cList) = "Est". ENTRY(4, cList) = "Ouest". MESSAGE "French:" cList VIEW-AS ALERT-BOX.
Выполнение кода приводит к следующему выводу:
English: North,South,East,West French: Nord,Sud,Est,Ouest