2016-02-24 3 views
0

Я использую NetCOBOL для .NET для расширения приложения COBOL. Когда я читаю и вводю файл, я делаю простое сравнение по числовому полю, а по некоторым записям получаю ошибку INVALID VALUE SPECIFIED.Недействительное значение NetCOBOL, указанное в сравнении

Поле INV-MST-OnHand, как определено:

02 INV-MST-LOCATION OCCURS 3.     
    04 INV-MST-ONHAND   PIC S9(7)V999. 
    04 INV-MST-SALES   PIC S9(6) OCCURS 12.   
    04 INV-MST-PTDSALE  PIC S9(6)V999. 

Сравнение в этой строке кода

IF INV-MST-ONHAND(1) > 0 MOVE INV-MST-ONHAND(1) TO WS-ITEM-ONHAND. 

Это происходит только на некоторых записях. Файл данных индексируется, поэтому его непросто разобрать вручную. Я ищу способ исправить это или даже пропустить их, но я не знаю, как поймать и обработать это условие ошибки.

Вот полный отчет макет:

000381 FD INVMAST 
000382  RECORD 845 CHARACTERS. 
000383 01 INV-MST-REC. 
000384  02 INV-MST-MCS    PIC X(10). 
000385  02 INV-MST-KEY. 
000386  04 INV-MST-ITEM-NO   PIC X(15) 
000387 02 INV-MST-ALT1-KEY. 
000389  04 INV-MST-PLU     PIC 9(13). 
000390  02 INV-MST-ALT2-KEY. 
000391  04 INV-MST-WORDS1   PIC X(10). 
000392  02 INV-MST-ALT3-KEY. 
000393  04 INV-MST-WORDS2   PIC X(10). 
000394  02 INV-MST-ALT4-KEY  PIC X(10). 
000395  02 INV-MST-ALT5-KEY. 
000396  04 INV-MST-CATEGORY  PIC X(10). 
000399  02 INV-MST-UPC-KEYS. 
000400  04 INV-MST-UPC01-KEY  PIC X(15). 
000401  04 INV-MST-UPC02-KEY  PIC X(15). 
000402  04 INV-MST-UPC03-KEY  PIC X(15). 
000403  04 INV-MST-UPC04-KEY  PIC X(15). 
000404  04 INV-MST-UPC05-KEY  PIC X(15). 
000405  04 INV-MST-UPC06-KEY  PIC X(15). 
000406  04 INV-MST-UPC07-KEY  PIC X(15). 
000407  04 INV-MST-UPC08-KEY  PIC X(15). 
000408  04 INV-MST-UPC09-KEY  PIC X(15). 
000409  04 INV-MST-UPC10-KEY  PIC X(15). 
000410  04 INV-MST-UPC11-KEY  PIC X(15). 
000411  04 INV-MST-UPC12-KEY  PIC X(15). 
000412  02 INV-MST-ITEM-NAME. 
000454  04 INV-MST-NAME1   PIC X(20). 
000455  04 INV-MST-NAME2   PIC X(20). 
000456  04 INV-MST-NAME3   PIC X(20).   
000457  02 INV-MST-SCRAP   PIC 9(6)V99. 
000458  02 INV-MST-ENV-LEVY  PIC 9(3)V99. 
000459  02 INV-MST-UORD   PIC XXX. 
000460  02 INV-MST-USTOCK   PIC XXX. 
000461  02 INV-MST-UUNO   PIC 99999. 
000462  02 INV-MST-VEND1   PIC 9999. 
000463  02 INV-MST-VEND2   PIC 9999. 
000464  02 INV-MST-VEND3   PIC 9999.   
000465  02 INV-MST-ONORDER  PIC 9(6). 
000466  02 INV-MST-COMMIT   PIC 9(6). 
000467  02 INV-MST-REORD   PIC 9(5).   
000468  02 INV-MST-MINORD   PIC 9(5). 
000469  02 INV-MST-BASIS   PIC 99. 
000470  02 INV-MST-BIN   PIC X(6). 
000471  02 INV-MST-GL    PIC 9(4). 
000472  02 INV-MST-DEPT   PIC 999. 
000473  02 INV-MST-ALTITEM1  PIC X(15). 
000474  02 INV-MST-ALTITEM2  PIC X(15).    
000476  02 INV-MST-COST1   PIC 9(6)V99. 
000477  02 INV-MST-COST2   PIC 9(6)V99. 
000478  02 INV-MST-COST3   PIC 9(6)V99. 
000479  02 INV-MST-COST4   PIC 9(6)V99. 
000480  02 INV-MST-SELLPRICES. 
000481  04 INV-MST-SELL1   PIC 9(6)V99. 
000482  04 INV-MST-SELL2   PIC 9(6)V99. 
000483  04 INV-MST-SELL3   PIC 9(6)V99. 
000484  04 INV-MST-SELL4   PIC 9(6)V99. 
000485  04 INV-MST-SELL5   PIC 9(6)V99.   
000486  02 FILLER REDEFINES INV-MST-SELLPRICES. 
000487  04 INV-MST-SELL    PIC 9(6)V99 OCCURS 5. 
000488 02  INV-MST-SELLPRICE-FACTORS. 
000489  04 INV-FACTOR OCCURS 5. 
000490  06 INV-PRC-FACTOR   PIC 9V99. 
000491  06 INV-COST-BASE    PIC X.    
000492  02 INV-MST-SALE-DECPT  PIC 9. 
000493  02 INV-MST-STOCK-DECPT PIC 9. 
000494  02 INV-MST-PRICE-UNITS PIC 9999. 
000495  02 INV-MST-ALTERNATE-UNITS. 
000496  04 INV-MST-ALT-DESC   PIC X(10). 
000497  04 INV-MST-ALT-ABBREV  PIC XX. 
000498  04 INV-MST-ALT-FACTOR  PIC 9(3)V9(4). 
000499  04 INV-MST-ALT-SALE-FLAG PIC X. 
000500  04 INV-MST-ALT-ORDER-FLAG PIC X. 
000501  02 INV-MST-TAX1   PIC X. 
000502  02 INV-MST-TAX2   PIC X.    
000503  02 INV-MST-LOCATION OCCURS 3.     
000504  04 INV-MST-ONHAND   PIC S9(7)V999. 
000505  04 INV-MST-SALES   PIC S9(6) OCCURS 12.   
000506  04 INV-MST-PTDSALE  PIC S9(6)V999.    
000507  02 INV-MST-FIL   PIC X(30). 

Когда я проверяю значение INV-MST-ONHAND(1), когда это не удается, Visual Studio отладчик показывает значение +0000000.000 и тесты условий, как верно с помощью Quick Watch.

Когда я инспектировать INV-MST-МЕСТОНАХОЖДЕНИЕ (1) Я вижу это quick watch

+3

Можете ли вы разместить полный макет записи, пожалуйста? Угадайте, что у вас есть счет на записи, в котором рассказывается, сколько из них OCCURS имеют отношение. Либо это, либо просто плохие данные (но использует ли другая программа данные?). 'IF INV-MST-ONHAND (1) НЕ ЧИСЛЕННЫЙ ДИСПЛЕЙ некоторые диагностические материалы END-IF' –

+0

Я добавил полный макет. – sreimer

+0

Спасибо. Используется ли INV-MST-ONHAND в другом месте в существующей программе? Или любая другая программа? Являются ли эти «новые» поля, поскольку они являются последними полями, отличными от «запасных байтов» в конце записи? Вы попробовали IF ... NUMERIC ... Я предложил? У вас есть что-то, что позволит вам просмотреть записи (те, которые вызвали сбой)? Если нет, если вы используете DISPLAY INV-MST-ONHAND (1) и INV-MST-LOCATION (1), каков точный вывод? У вас есть номер сообщения/ссылка с вашей ошибкой? –

ответ

2

Вы используете опцию компилятора, CHECK с Подвариантом (NUMERIC) или (ALL).

Это сообщение JMP0828I-U. U означает, что это закончит выполнение. Где-то вы могли бы сказать это вместо того, чтобы произвести E в качестве суффикса для сообщения, и в этом случае вы получите сообщение, но выполнение будет продолжено.

Проблема в том, что данные не соответствуют требованиям PICture. Поле определяется как подписанное (S в вашей строке PICture), но перегрузка, которая указывает на положительное или отрицательное значение, отсутствует.

Вы упомянули, что создали данные. Я подозреваю, что там, где вы создали данные, вы случайно описали это поле как unsigned (no S в строке PICture), а затем, для удобства, переместили группу в запись, позволяя беззнаковое значение попасть в ваше подписанное поле ,

CHECK (NUMERIC) или CHECK (ALL) заметили это при попытке IF-теста и подготовили сообщение (и закончили вашу программу).

Интересно, что ваш тест NUMERIC был правдой. Вероятно, существует опция компилятора для описания того, что является действительным в тесте NUMERIC. Вам нужно найти это и убедиться, что для поля, подписанного, действительны только положительные и отрицательные, а не неподписанные.

Несколько уроков: ссылка на сообщение важна и позволяет найти дополнительную информацию о сообщении - для будущих поисков исключить суффикс, поскольку описание в документации не описывает суффиксы отдельно; избегайте групповых MOVE - или проявляйте большую осторожность с ними - отсутствующий знак, или неправильная длина или количество десятичных знаков могут дать вам тонкие ошибки, что не стоит экономить на кодировании и времени, преследуя тонкости.

С вашим отладчиком вы должны увидеть, есть ли способ увидеть фактическое значение источника, а не «отредактированное» значение, которое вы указали в своем вопросе. Увидеть фактический источник помог бы вам раньше.

Некоммерческие численные значения являются «зонированными». Одна цифра на каждый байт, которому предшествует значение «зона». Для значения без знака все цифры зонированы. Для значащего значения младший байт имеет «перегруз», чтобы вместо этого указывать положительный или отрицательный.

Значение без знака всегда считается положительным.

COBOL к стандарту 1985 года не имеет механизма для «улавливания» ошибок, вызванных нечисловыми значениями. В вашей документации указывается, есть ли у вас какой-либо способ сделать это во время выполнения NetCOBOL.

Смежные вопросы