SAPфорум.RU
https://sapboard.ru/forum/

Что означает оператор NOT в языке FORMCALC для PDF-формуляров?
https://sapboard.ru/forum/viewtopic.php?f=13&t=99790
Страница 1 из 1

Автор:  skaa [ Ср, окт 06 2021, 17:43 ]
Заголовок сообщения:  Что означает оператор NOT в языке FORMCALC для PDF-формуляров?

Добрый день! Пытаюсь понять, что означает оператор NOT в приведённом куске кода (язык FORMCALC), и понять не могу. Может, кто подскажет, что значит NOT к переменной "Shipments.ShipmentsTab.DATA[0].SHPMNT_DOC_NUM". Вроде, оператор NOT должен использоваться к какому-то логическому выражению, а не к переменной. Если что, это кусок кода FORMCALC от стандартного SAP-формуляра.
Code:
IF ( NOT(Shipments.ShipmentsTab.DATA[0].SHPMNT_DOC_NUM) and tab_row_count <= 1 ) then
   $ = "№      от   "
else   
   $ = Left(shpmnt_line,Len(shpmnt_line)-2)
   
ENDIF

Автор:  andry_moz [ Чт, окт 07 2021, 10:06 ]
Заголовок сообщения:  Re: язык FORMCALC для sfp формуляров

not The logical negation of the operand.

NOTE: The arithmetic negation of a null operand yields the result null, whereas the logical negation of
a null operand yields the Boolean result true. This is justified by the common sense statement: If null
means nothing, then “not nothing” should be something.

Проверка Shipments.ShipmentsTab.DATA[0].SHPMNT_DOC_NUM на null

Автор:  skaa [ Чт, окт 07 2021, 14:59 ]
Заголовок сообщения:  Re: язык FORMCALC для sfp формуляров

andry_moz написал:
not The logical negation of the operand.

NOTE: The arithmetic negation of a null operand yields the result null, whereas the logical negation of
a null operand yields the Boolean result true. This is justified by the common sense statement: If null
means nothing, then “not nothing” should be something.

Проверка Shipments.ShipmentsTab.DATA[0].SHPMNT_DOC_NUM на null


Спасибо!
Но работает очень странно этот оператор. Переменная Shipments.ShipmentsTab.DATA[0].SHPMNT_DOC_NUM имеет тип char255. И когда в этой переменой содержится числовое значение, то NOT(Shipments.ShipmentsTab.DATA[0].SHPMNT_DOC_NUM) = false. Если в переменной содержится буквенное значение, то NOT(Shipments.ShipmentsTab.DATA[0].SHPMNT_DOC_NUM) = true.
Получается это не проверка Shipments.ShipmentsTab.DATA[0].SHPMNT_DOC_NUM на null.

Автор:  baboon [ Пт, окт 08 2021, 16:18 ]
Заголовок сообщения:  Re: Что означает оператор NOT в языке FORMCALC для PDF-формуляров?

Зависит, по-видимому, от того, как значение из SHPMNT_DOC_NUM
конвертится в boolean при попытке применить к нему NOT.

Автор:  RoustR [ Вт, окт 12 2021, 13:28 ]
Заголовок сообщения:  Re: Что означает оператор NOT в языке FORMCALC для PDF-формуляров?

skaa написал(а):
Вроде, оператор NOT должен использоваться к какому-то логическому выражению, а не к переменной.

Да, но в качестве логического выражения может выступать переменная. Запись вида IF ( A ) эквивалентна выражению IF ( A = true ). В стартовом сообщении следует считать выражение как
Code:
IF ( NOT(Shipments.ShipmentsTab.DATA[0].SHPMNT_DOC_NUM) = true and tab_row_count <= 1 ) then

В языках с неявным преобразованиям к логическому типу писать выражение полностью ( A = true ) смысла нет, поэтому получается просто ( A ).

В описанном фрагменте выражение неоднозначность не с оператором NOT, а в приведении выражения к boolean. В том же описании к FormCalc:

When performing Boolean operations on non-Boolean operands, the non-Boolean operands are first promoted to their Boolean equivalent. If the non-Boolean operand does not successfully convert to a nonzero value, its value is true (1); otherwise its value is false (0). When promoting null-valued operands to a Boolean value, that value is always false (0). For example, the expression:
Code:
"abc" | 2
evaluates to 1. That is, false | true = true, whereas
Code:
if ("abc") then
  10
else
  20
endif
evaluates to 2


То есть, если в SHPMNT_DOC_NUM содержится число, то оно может быть приведено к boolean ( 0 - false, иначе - true). Если в SHPMNT_DOC_NUM не число, то оно всегда false. Оператор NOT просто инвертирует полученное значение.

Автор:  skaa [ Вт, окт 12 2021, 15:22 ]
Заголовок сообщения:  Re: Что означает оператор NOT в языке FORMCALC для PDF-формуляров?

Спасибо RoustR за столь подробное объяснение!

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/