AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.03.2007, 12:11   #1  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
В языке Cи можно писать операторы присваивания с условием в одну строку:
Код:
A = (B>100)? C : D;
Это значит присвоить переменной A значение C, в случае если B>100; и значение D в противном случае.

В навижене так писать нельзя, но конструкция подобного типа может пригодится в случае вывода числа в табличную часть формы - например когда в случае нуля надо вывести пустую ячейку, или, например, в случае превышения писать 'превышение'

Парадигма программирования очень простая: булево условие надо превратить в целочисленный параметр и используя это число получить требуемую строку

В общем, начальные условия задачи:

Str1 - строка, которая выводится на при истинности условия
Str2 - строка, которая выводится на при ложности условия
Condition - условие, результат которого есть булево выражение TRUE или FALSE

Тогда

1. Булево выражение Condition надо превратить в число 0 или 1.

Сделать это можно, например, так:
Код:
STRLEN(FORMAT(Condition))-2
Это выражение дает 1 при Condition=FALSE и 0 при TRUE

Можно это выражение инверснуть, т.е
Код:
3-STRLEN(FORMAT(Condition))
даст 0 при Condition=FALSE и 1 при TRUE

дальше проще

2. Вот готовый код, который выводит Str1 или Str2 в завиcимости от условия
Код:
MESSAGE(COPYSTR(str1+str2,
		   STRLEN(str1)*(STRLEN(FORMAT(Condition))-2)+1,
		   STRLEN(str1)*(3-STRLEN(FORMAT(Condition)))
		   +STRLEN(str2)*(STRLEN(FORMAT(Condition))-2)));
Вот и все.

Ну а теперь пара готовых примеров:

1) вывести в поле формы число Number. В случае если Number=0 выводит пустую строку
Код:
COPYSTR(' '+FORMAT(Number),
		   (STRLEN(FORMAT(Number=0))-2)+1,
		   (3-STRLEN(FORMAT(Number=0))) +STRLEN(FORMAT(Number))*(STRLEN(FORMAT(Number=0))-2))
2) вывести в поле формы надпись НОРМА если Number>100 и надпись ПРЕВЫШЕНИЕ в противном случае:
Код:
COPYSTR('НОРМА'+'ПРЕВЫШЕНИЕ',
		   STRLEN('НОРМА')*(STRLEN(FORMAT(Number>100))-2)+1,
		   STRLEN('НОРМА')*(3-STRLEN(FORMAT(Number>100)))
		   +STRLEN('ПРЕВЫШЕНИЕ')*(STRLEN(FORMAT(Number>100))-2))
и все это заметьте в одну строку
Старый 12.03.2007, 12:30   #2  
NeNavision_imported is offline
NeNavision_imported
Участник
Аватар для NeNavision_imported
 
241 / 10 (1) +
Регистрация: 12.08.2005
Зачем? Если все так будут писать, я с ума сойду.
Код:
IF Number>100 THEN Str := 'Превышение' ELSE str:='Норма'
Тоже в одну строку, но гораздо понятнее.
__________________
Должен остаться только один.
Старый 12.03.2007, 13:22   #3  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
В SourceExpr условие IF не запихаешь...
Старый 12.03.2007, 14:08   #4  
Голышев Михаил is offline
Голышев Михаил
Участник
 
106 / 10 (1) +
Регистрация: 03.07.2006
Цитата:
Сообщение от tyrex Посмотреть сообщение
В SourceExpr условие IF не запихаешь...
Можно запихнуть вызов функции...

Хотя то что с трудом писалось, должно с трудом читаться
Старый 14.03.2007, 19:37   #5  
Storkich is offline
Storkich
Участник
 
149 / 10 (1) +
Регистрация: 08.03.2007
OnFormat
Старый 14.03.2007, 21:33   #6  
Storkich is offline
Storkich
Участник
 
149 / 10 (1) +
Регистрация: 08.03.2007
Yes Nо
Да Нет

На разных языках по разному работает, можно попробовать
Код:
strpos(format(false,0,2),'1')
и тогда
Код:
COPYSTR('ПревышениеНорма',strpos('0ревышение1',format(false,0,2)),10)
только самый длинный вариант ответа надо поставить в начало.

Самый красивый вариант
Код:
STRSUBSTNO('%'+Format(strpos('01',format(True,0,2))),'Превышение','Норма')
STRSUBSTNO('%'+Format(strpos('01',format(True,0,2))),'Превышение',Variable)
Самый практичный и короткий вариант таков только запятые нежелательне могут помешать.
1)Вот готовый код, который выводит Str1 или Str2 в завиcимости от условия
Код:
SELECTSTR(strpos('10',format(false,0,2)),'Норма,Превышение')
2) вывести в поле формы число Number. В случае если Number=0 выводит пустую строку
Код:
SELECTSTR(strpos('10',format(Number=0,0,2)),' ,'+format(Number))
3) вывести в поле формы надпись НОРМА если Number>100 и надпись ПРЕВЫШЕНИЕ в противном случае:
Код:
SELECTSTR(strpos('10',format(Number>10,0,2)),' Превышение,'+format(Number))
Может не показать дробную часть
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:20.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.