К основному контенту

Проверка штрих-кода в базе данных Ninox

Открыл в полюбившейся программе 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")

Все, штрих-код товара проверяется, можно переключиться на что-нибудь еще!

Комментарии