10.04.2018 06:57
OlegON
 
Никто не озадачивался тем, что операторы фигачат вместо штрихкодов разные символы? Можно же фильтровать их, поставив CHECK CONSTRAINT, например, на цифры любой длины
SQL код:
REGEXP_LIKE(BARCODE'^[0-9]+$'
или на какую-то конкретную длину (не забываем про короткие коды)
SQL код:
REGEXP_LIKE(BARCODE'^[[:digit:]]{13}$'
пробовал кто-нибудь? Есть подводные камни?
10.04.2018 07:07
Mtirt
 
На символы смысл имеет.
На длину - нет.
Во-первых, есть UPC-A и UPC-E
Во-вторых, есть расширение EAN-13 для упаковок товара...
В третьих, сейчас уже достаточно часто встречаются штрих-коды других типов.
10.04.2018 07:28
OlegON
 
Главное - с алкоголем и прочим, символы в ш/к не появились?
10.04.2018 07:58
Mtirt
 
В штрих-коде товара - нет.
10.04.2018 16:12
OlegON
 
SQL код:
alter table supermag.smstoreunits add constraint okcheck_digit check(REGEXP_LIKE(BARCODE,'^[0-9]+$')); 
попробуем....
10.04.2018 16:15
DMaslov
 
Был бы рад увидеть проверку контрольной цифры EAN-13, ну и прочие проверки форматов штрихкодов.
10.04.2018 16:16
OlegON
 
Это у меня бот делает, https://olegon.ru/showthread.php?t=19224
Контрольку в констрейнт я не запихивал...
01.09.2018 13:21
OlegON
 
В общем, вышеприведенный констрейнт не работал с переносами строк ни в каком виде, переделал сначала в check(barcode=to_number(barcode)), но падало с непонятной юзеру ошибкой, сделал по другому

создаем новое ограничение без проверки
Код:
alter table supermag.smstoreunits add constraint okbarcode_digit check(length(replace(TRANSLATE(barcode, '0123456789','0'),'0'))=0) novalidate;
удаляем старое ограничение
Код:
alter table supermag.smstoreunits drop constraint okcheck_digit;
смотрим, какие кривые данные уже попали
Код:
select '('||barcode||')' from supermag.smstoreunits where length(replace(TRANSLATE(barcode, '0123456789','0'),'0')) is not null;
удаляем те записи, которые уже поправили вручную (убрали перенос строки)
Код:
delete from supermag.smstoreunits where length(replace(TRANSLATE(barcode, '0123456789','0'),'0')) is not null and replace(barcode,chr(10),'') in (select barcode from supermag.smstoreunits);
убираем перенос строки (наиболее частая ошибка)
Код:
update supermag.smstoreunits set barcode=replace(barcode,chr(10),'') where length(replace(TRANSLATE(barcode, '0123456789','0'),'0')) is not null;
включаем ограничение с проверкой
Код:
alter table supermag.smstoreunits enable validate constraint okbarcode_digit;

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.