Последняя версия DataExpress 3 beta от 9 мая 2020 года.
Изображение Скачать | Изображение Что нового?
См. также: Энциклопедия DX | Форум на develop-soft | Песочница
ИзображениеИзображениеИзображение

ПУТЕВОДИТЕЛЬ по выражениям

Справочная информация, руководства, видеоматериалы от пользователей DataExpress.

jurist23rus
Эксперт
Сообщения: 2701
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп
Благодарил (а): 2 раза
Поблагодарили: 24 раза

Re: ПУТЕВОДИТЕЛЬ по выражениям

Сообщение jurist23rus » Вс окт 30, 2016 12:57 pm

Проверка записи на уникальность

Код: Выделить всё

block(
   setvar('c', dbcount('форма 1', '[!Номер телефон]=[Номер телефон] & [!статус заказа]="Был конфликт"')),
      iif(newrec=1,
      iif(getvar('c') > 0, 'Предупреждение! Был конфликт.', ''),
      iif(getvar('c') > 0 & [номер телефон]<>oldvalue('номер телефон') & [статус заказа]<>oldvalue('статус заказ'), 'Предупреждение! Был конфликт.', ''))
)


С выходом версии от 30.10.2016 г. можно использовать функции:
DBUNIQUE - проверяет поле/список полей на уникальность;
UNIQUE - проверяет записи подчиненной формы/запроса на уникальность.
Подробнее о данных функциях и их синтаксисе смотри в справке по функциям к программе.
Destiny is a very convenient word for those who never take decisions.

jurist23rus
Эксперт
Сообщения: 2701
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп
Благодарил (а): 2 раза
Поблагодарили: 24 раза

Re: ПУТЕВОДИТЕЛЬ по выражениям

Сообщение jurist23rus » Вс окт 30, 2016 1:29 pm

Появление флажка при вводе текста

Код: Выделить всё

iif([текст]<>null, 1, 0)

Выражение записывается в свойство "Выражение" поля флажок.
Примечание: флажок появляется при переходе на другое поле.
Destiny is a very convenient word for those who never take decisions.

jurist23rus
Эксперт
Сообщения: 2701
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп
Благодарил (а): 2 раза
Поблагодарили: 24 раза

Re: ПУТЕВОДИТЕЛЬ по выражениям

Сообщение jurist23rus » Вс окт 30, 2016 1:36 pm

Значение по умолчанию для поля "Объект"

Код: Выделить всё

OBJID('форма', 'название поля', 'значение')
Destiny is a very convenient word for those who never take decisions.

jurist23rus
Эксперт
Сообщения: 2701
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп
Благодарил (а): 2 раза
Поблагодарили: 24 раза

Re: ПУТЕВОДИТЕЛЬ по выражениям

Сообщение jurist23rus » Вс окт 30, 2016 2:00 pm

Сцепление полей (на примере вывода полного адреса)

Код: Выделить всё

//[Индекс] [Город] [Улица]
IIF([Индекс] = null, '', [Индекс])+""+
IIF([Город] = null, '', ", "+[Город])+""+
IIF([Улица] = null, '',", "+[Улица])


Склейка вида: [текст1]+" "+[текст2]+" "+[текст3] не срабатывает, если не заполнены все 3 поля. Дело в том, что пустое поле содержит значение NULL. Любая операция с NULL в результате тоже дает NULL. Кроме того, во всех функциях, кроме некоторых (IIF, NZ, SETVAR, CSTR) если какой-либо аргумент NULL, то и результат функции тоже будет NULL.

Еще есть удобная функция склейки полей разных типов CONCAT.
Destiny is a very convenient word for those who never take decisions.

jurist23rus
Эксперт
Сообщения: 2701
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп
Благодарил (а): 2 раза
Поблагодарили: 24 раза

Re: ПУТЕВОДИТЕЛЬ по выражениям

Сообщение jurist23rus » Вс окт 30, 2016 2:20 pm

Нумерация записей

Вариант нумерации № 1: Встроенный нумератор.
Плюсы:
1. Нумерация документов производится на уровне БД и поэтому нарушение уникальности при параллельной работе с базой несколькими юзерами исключено.
Минусы (на мой взгляд): Пожалуй только то, что при удалении последнего номера и создании следующего выпадает промежуточный, удаленный ранее (т.е. имея список с номерами 1,2,3,4,5 и ранее удаленный №6 получаем следующий номер "7" как ни крути).
Варианты исправления ситуации в этом случае:
1. Не косячить с документами.
2. Зайти в "Дизайнер" и подправить нумерацию оттуда.

Вариант нумерации № 2: Числовым полем с формулой (в свойстве "По умолчанию", не путать со свойством "Выражение"):

Код: Выделить всё

nz(dbmax('Документы', 'Номер', ''), 0) + 1

Плюсы способа: Исключается "выпадание" номеров описанное выше - удаляем, добавляем - все корректно.
Минусы (один большой): При параллельном создании документа двумя юзерами оба получают и сохраняют одинаковый номер, причем никакого контроля создать невозможно и видим это только после нажатия "Обновить".
Вывод: способ наилучший только для однопользовательского режима работы.

Вариант нумерации № 3
В связи с последними нововведениями в DX - появилась возможность функционально расширить вариант №2.

Код: Выделить всё

block(
iif([Номер]=0 | newrec=1 & oldvalue('Номер')=null,
setfield('Номер',nz(dbmax('Нумератор', 'Номер', '[!Дата]>beginyear([Дата]) & [!Дата]<endyear([Дата])'), 0) + 1),''),
''
)            //Вместо выражения в проверке значения для номера. И в случае с "Копировать" и "Копировать все" - нумератор будет срабатывать корректно.

Вариант № 3 - это также не счетчик FireBird и не имеет блокировки при назначении следующего номера (т.е. теоретически все же возможно попадание неуникального номера, но в сетевой работе она ничтожно мала по сравнению с вариантом №2, т.к. присвоение номера происходит в момент сохранения записи.)

Возможности:
1. Нумерация в пределах года (квартала, месяца, дня...)
2. Нумерация в зависимости от другого условия (например от клиента, договора и т.п.)
3. Настройка без использования "разработчика"
4. Создание и привязка справочника нумераторов к различным формам (несколько усложненный вариант использования)
5. Гибкая настройка - например использование одного и того же нумератора для нескольких форм, и наоборот - распределенная нумерация документов в зависимости от условия (к примеру: своя_организация_1, своя_организация_2...)
6. Исключено "выпадание" последнего номера (если запись с ним была ранее удалена).

Недостатки:
Теоретическая возможность нарушения уникальности (несколько микросекунд в которые должны "попасть" при сохранении записи 2 одновременно работающих пользователя. вероятность - 1:‎1000000....)

Условие для формирования - дата указанная в поле [Дата] (по дефолту - текущая дата)
Допустим в базе имеется список записей вида:

№1 от 01.06.2015
№2 от 01.06.2015
№1 от 01.06.2016
№3 от 01.06.2016
№4 от 01.06.2016
№1 от 01.06.2017

- по умолчанию для следующей записи в текущем году (2016) будет назначен № 5
- при указании даты вручную (например хх.хх.2015) - следующим порядковым номером при сохранении будет назначен №3
- с начала года нумерация автоматом начинается за номером 1.
Destiny is a very convenient word for those who never take decisions.

jurist23rus
Эксперт
Сообщения: 2701
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп
Благодарил (а): 2 раза
Поблагодарили: 24 раза

Re: ПУТЕВОДИТЕЛЬ по выражениям

Сообщение jurist23rus » Вс окт 30, 2016 2:24 pm

Очистка поля по условию

Два способа:

Первый:

Код: Выделить всё

iif([некоторый объект]=null, null, [текущий объект])


Второй:

Код: Выделить всё

//[некоторый объект]
null

Примечание: второй способ удобнее в связанных списках, так как позволяет очищать текущее поле не только при очистке поля [Некоторый объект], но и при его изменении.
Destiny is a very convenient word for those who never take decisions.

jurist23rus
Эксперт
Сообщения: 2701
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп
Благодарил (а): 2 раза
Поблагодарили: 24 раза

Re: ПУТЕВОДИТЕЛЬ по выражениям

Сообщение jurist23rus » Вт ноя 15, 2016 8:22 pm

Принцип вычисления выражений

Принцип вычисления выражений похож на MS Excel. Выражения в полях вычисляются только в том случае, если программа находит в выражении имя поля, которое было изменено. А ищет она подстроку (часть текста) вида [поле], [:поле], [!поле], [поле|, [:поле| или [!поле|. И не важно где эта подстрока находится: в самом выражении или в комментарии.

Пример выражения в поле "Сумма":

Код: Выделить всё

[цена] * [количество]

При изменении полей "цена" и "количество" поле "сумма" вычисляется автоматически.

Однако, в некоторых случаях имена полей записываются без квадратных скобок в кавычках. В этом случае поле может не пересчитаться. Например, выражение вида:

Код: Выделить всё

DBUNIQUE('фамилия;имя;отчество')

не будет вычислено при изменении полей "фамилия", "имя", "отчество". В этом случае добавьте имена полей в комментариях:

Код: Выделить всё

// [фамилия] [имя] [отчество]
DBUNIQUE(...)
Destiny is a very convenient word for those who never take decisions.

jurist23rus
Эксперт
Сообщения: 2701
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп
Благодарил (а): 2 раза
Поблагодарили: 24 раза

Re: ПУТЕВОДИТЕЛЬ по выражениям

Сообщение jurist23rus » Вт ноя 15, 2016 8:57 pm

Пример проверки значения поля с выводом сообщения.

Выражение записывается в свойство "Проверка значения" любого поля (где такое свойство есть). Проверка осуществляется при сохранении записи.

Код: Выделить всё

iif ( [Поле]=null, //здесь может быть любое другое условие
  iif ( YESNOBOX ('Внимание!', 'Некорректное значение поля. Продолжить?')=2, 'Отредактируйте поле', ''), '')  //в случае выполнения условия появляется сообщение
  '')

Рис 1.jpg
Рис 1
Рис 1.jpg (38.21 КБ) 8583 просмотра

Рис 2.jpg
Если нажать НЕТ
Рис 2.jpg (24.47 КБ) 8583 просмотра


При нажатии ДА программа сохраняет запись игнорируя ошибку.
Destiny is a very convenient word for those who never take decisions.