Оригинал на GitHub
Вопрос
Нужно сделать проверку уникальности SKU перед сохранением товара в таблицу товаров из другой таблицы, чтобы не плодились дубли в таблице товаров. Как правильно это сделать? Плюс еще нужно удалить из SKU все лишние символы, оставить только разрешенные. По идее нужно сделать удаление ненужного, потом проверку на дубль по таблице товаров и потом сохранение.
Ответ
Это можно сделать, добавив код действия при добавлении, в поле с артикулом. Он проверяет дубли и блокирует действие если их находит.
Код действия при добавлении в поле с артикулом в таблице в которую добавляем строки:
ad1=: if(condition: $select != ""; then: $err)
select: select(table: $#ntn; field: 'id'; where: 'id' != #id; where: $#nf = $#nfv)
err: errorException(text: "Already have this SKU")
only_numbers: if(condition: $matches = true; then: $replace; else: #sku_data)
matches: strRegAllMatches(str: #sku_data; template: "([^a-zA-Z0-9а-яА-Я .,\-+{}()]+)"; matches: "matches"; flags: "u")
replace: strReplace(str: #sku_data; from: $#matches[0]; to: "")
В only_numbers мы ищем список всех символов не попадающих в список разрешенных. И потом все, что не a-zA-Z0-9а-яА-Я .,\-+{}()
мы заменяем на "".
Далее ищем строку в текущей таблице где текущее поле равно значению текущего поля в новой строке. Так как коды действия выполняются после кодов, то строка уже существует и записана в базу данных, поэтому нам нудо указать, что мы исключаем текущую строку where: 'id' != #id;
, что бы небыло ложного срабатывания на саму себя.