Открыл в полюбившейся программе Ninox Database мою учебно-развлекательную базу данных товаров, подумал: классно было бы вносимый штрихкод проверять прямо при вводе. А то на Айфоне-то фотосканер кода в цифрах не ошибется, а на компьютере я их вручную ввожу, приходится тщательно проверять потом, что навводил.
Достал клавиатуру, занес над ней руки, щелкнул костяшками... И такая вдруг лень накатила — у меня ж на товарах как минимум два типа кодов уже попадались — стандартный EAN-13 и короткий EAN-8. Третий, UPC американский, тоже не исключаю. И какой из них проверять?
Передумал. Почти. Пошел почитать хоть что это за коды такие. Оказалось, что как минимум шесть типов кодов (включая перечисленные выше) проверяются одним и тем же способом! То есть, по сути, любой из них можно дополнить слева нулями до самого длинного типа и проверять уже только его.
Оправданий не осталось. Пришлось снова достать клавиатуру.
Код проверки кода
В моем примере скрипт запускается всякий раз после изменения в Ninox Database поля кода товара itemBarcode
и выносит вердикт в текстовое поле статуса штрихкода barcodeValidation
, специально добавленное в базу для этого случая.
Для удобства ввода код товара можно печатать с пробелами, они вырежутся, если совпадет контрольная сумма.
let barcodeShrinked := replace(itemBarcode, " ", "");
let barcodeLength := length(barcodeShrinked);
let evenPositionDigitSum := 0;
let oddPositionDigitSum := 0;
if barcodeLength = 8 or
barcodeLength = 12 or
barcodeLength = 13 or
barcodeLength = 14 or
barcodeLength = 17 or
barcodeLength = 18 then
(let barcode := lpad(barcodeShrinked, 19, "0");
for i in range(0, 9) do
evenPositionDigitSum := evenPositionDigitSum + number(substr(barcode, i * 2, 1));
oddPositionDigitSum := oddPositionDigitSum + number(substr(barcode, i * 2 + 1, 1))
end;
let barcodeCheckSum := number(substr(barcode, 18, 1));
let resultSum := 3 * oddPositionDigitSum + evenPositionDigitSum;
let resultCheckSum := 0;
if resultSum != 10 * floor(resultSum / 10) then
(resultCheckSum := 10 * floor(resultSum / 10) - resultSum + 10)
else void;
if barcodeCheckSum != resultCheckSum then
(barcodeValidation := "Wrong checksum")
else
(itemBarcode := barcodeShrinked;
barcodeValidation := "Correct"))
else
(barcodeValidation := "Wrong barcode")
Все, штрих-код товара проверяется, можно переключиться на что-нибудь еще!
Комментарии