Вот несколько советов ...
Используйте hieratical структуру записи, чтобы просмотреть данные по-разному. Например:
01 ITEM-REC.
05 ITEM-CODE.
10 ITEM-NUM-CODE PIC 9(3).
10 ITEM-CHAR-CODE PIC A(3).
88 ITEM-TYPE-A VALUE 'AAA' THRU 'AZZ'.
88 ITEM-TYPE-B VALUE 'BAA' THRU 'BZZ'.
05 QUANTITY PIC 9(4).
ITEM-CODE
представляет собой поле из 6 символов группы, первая часть которого является числовым (ЭЛЕМЕНТ-NUM-КОД) и последняя часть буквенный (ЭЛЕМЕНТ-СИМ-КОД). Вы можете ссылаться на любую из этих трех переменных в вашей программе. Когда вы обратитесь к ITEM-CODE
или к любому другому элементу группы, COBOL обрабатывает переменную, как если бы она была объявлена как PIC X
. Это означает, что вы можете MOVE
что-нибудь в нем, не поднимая ошибки. Например:
MOVE 'ABCdef' TO ITEM-CODE
или
MOVE 'ABCdef0005' TO ITEM-REC
Ни один не будет вызывать ошибку, даже если элемент ITEM-NUM-CODE
элементарных данные, безусловно, не является числом. Чтобы проверить достоверность данных ваших данных после группового перемещения, вы должны проверять каждый элемент элементарных данных отдельно (если только вы точно знаете, что ошибки типа данных не могли возникнуть). Существует множество способов сделать это. Для Например, если элемент данных должен быть числовыми следующее будет работать:
IF ITEM-NUM-CODE IS NUMERIC
CONTINUE
ELSE
DISPLAY 'ITEM-NUM-CODE IS NOT NUMERIC'
PERFORM BIG-BAD-ERROR
END-IF
COBOL предоставляет различные тесты класса, которые могут быть применены в отношении элемента данных. Для примера обычно используются ЧИСЛЕННЫЕ, АЛФАВИТНЫЕ И АЛЬФАМЕННЫЕ.
Другим распространенным способом проверки диапазонов значений является определение различных 88 уровней - но упражнение предостережение. В приведенном выше примере пример ITEM-TYPE-A
представляет собой уровень 88, который определяет диапазон данных от «AAA» до «AZZ» на основе текущей последовательности сопоставления. Для того, чтобы убедиться в том, что ITEM-CHAR-CODE
содержит только буквенные символы и первая буква является «A» или «B», вы могли бы сделать что-то вроде:
IF ITEM-CHAR-CODE ALPHABETIC
DISPLAY 'ITEM-CHAR-CODE is alphabetic.'
EVALUATE TRUE
WHEN ITEM-TYPE-A
DISPLAY 'ITEM-CHAR-CODE is in range AAA through AZZ'
WHEN ITEM-TYPE-B
DISPLAY 'ITEM-CHAR-CODE is in range BAA through BZZ'
WHEN OTHER
DISPLAY 'ITEM-CHAR-CODE is in some other range'
END-EVALUATE
ELSE
DISPLAY 'ITEM-CHAR-CODE is not alphabetic'
END-IF
Примечания отдельного теста для ALPHABETIC
выше. Почему это, когда 88-уровневые тесты могли бы выполнить эту работу?На самом деле 88-х не являются достаточными, потому что они охватывают весь диапазон от AAA
до AZZ
на основе последовательности сортировки в настоящее время . В среде, основанной на EBCDIC (очень большое количество магазинов COBOL использует EBCDIC), это фиксирует значения , такие как A}\
. символы закрывающей и обратной косой черты не альфа, но попадают в середину диапазон 'A' через 'Z' (что это за * * @! это все?). Также обратите внимание, что такое значение как 'aaa' не удовлетворяет условию ITEM-TYPE-A
, потому что строчные буквы выпадают вне определенного диапазона. Возможно, время для проверки таблицы символов EBCDIC.
Наконец, вы можете подсчитать количество вхождений символа или строки символов, в переменную с INSPECT
глагола следующим образом:
INSPECT ITEM-CODE TALLING DASH-COUNT FOR ALL '-'
DASH-COUNT
должен быть числовой элемент и будет содержать количество символов штрих-кода в ITEM-CODE
. Глагол INSPECT
не так полезен, если вы хотите подсчитать количество цифр. Для этого вам понадобится один оператор для каждой цифры.
Это может быть проще просто закодировать что-то вроде петли:
PERFORM VARYING I FROM 1 BY 1
UNTIL I > LENGTH OF ITEM-CODE
EVALUATE ITEM-CODE(I:1)
WHEN '-'
COMPUTE DASH-COUNT = DASH-COUNT + 1
WHEN '0' THRU '9'
COMPUTE DIGIT-COUNT = DIGIT-COUNT + 1
WHEN OTHER
COMPUTE OTHER-COUNT = OTHER-COUNT + 1
END-EVALUATE
END-PERFORM
Теперь спросите себя, почему мне было комфортно, используя чек от нуля до 9 диапазона? Подсказка: посмотрите на последовательность сортировки.
Надеюсь, это поможет.
Что вы пробовали? Вы ищете помощь в понимании концепций или реализации? – Davidann
Я в основном думал о том, как работать над этой проблемой. Я думаю, что у меня есть решение для моего второго вопроса. Если я переведу запись с информацией, которую я должен проверить в другом поле, помещая каждый столбец в свою собственную запись, я могу проверить их 1 на 1 и добавить общее количество тире. Этот способ звучит немного сложнее, и я уверен, что там это более простой способ выполнить эту задачу. – Kimmy1235