23.04.2019 15:35
AndreyZh
 
Вышеуказанная задача решена и "масло сделано более масленным". Покажу в картинках реакцию программы. По сути пришлось доработать единственную функцию анализа ШК, вызываемую на любой запрос ШК во всех экранных формах и большую часть времени потратил на тест каждой её ветки.

На картинках, в сервисе приёма, где наибольшее число вариаций отражены типичные неверные значения вносимые "ручками", копипастом или со сканера:










Хотя и раньше на дополнительных контролах программа не давала вводить нелогичные по ФЛК значения, анализирую содержимое накладной в ЕГАИС:







Полный список контролов и алгоритм действий и реакций программы можно посмотреть в подробно описанном исходном коде программы:

Текст функции контроля вводимого ШК марки и групповой тары:
Код:
* -------------------------------------------------------------------------------------------------
*   Проверяю на правильность и логичность кода акцизной марки на длину и вхождение допустимых набо-
*   ров символов. Вызов из различных режимов - универсальный код. Параметры:
*       cAm     68 или 150 разрядный код приходящий со сканера 2d
*       lSerAM  Истина, если вызов из сервиса проверок акцизных марок
*       lBox    Истина, если контролировать ещё возможность ШК групповой тары из сервиса приёма
*   05.01.2018  При чтении ^V из блокнота, а из Excel вообще последний знак кривой. Убрал, что прог-
*       рамма ругается на ошибку и иммитирует нажатие клавиши Enter, если вводим в ручную
*   18.06.2018  Обработка, пока примитивная, т.к. не знаю алгоритмов марок DataMax 150 знаков
*   29.12.2018  Добавил анализ ШК групповой тары - набор цифр
*   23.04.2019  Добавил ФЛК и на длину ШК групповой тары, который м.б. 18, 26 цифровых знаков
FUNC lgCheckAM( cAm, lSerAM, lBox )
    LOCA nI:=0, nL:=0, lBad:=FALSE
    DEFAULT lSerAm TO FALSE, lBox TO FALSE
    
    //  Убираю пробелы и определение длины марки. Привожу ШК к допустимой длине, отбрасывая мусорный символ
    cAm := Alltrim(cAm)
    nL  := Len(cAm)
    
    DO CASE
    CASE nL = 68        //  Правильная старая марка
    CASE nL = 69        //  Старая марка, введенная копипастом
        cAm     := Left(cAm,68)
        nL      := 68
    CASE nL = 150       //  Новая марка, введенная со сканера
    CASE nL = 151       //  Новая марка, введенная копипастом
        cAm     := Left(cAm,150)
        nL      := 150
    CASE nL = 18        //  Правильный ШК групповой тары
    CASE nL = 19        //  ШК групповой тары введенный копипастом
        cAm     := Left(cAm,18)
        nL      := 18
    CASE nL = 26        //  Правильный ШК групповой тары
    CASE nL = 27        //  ШК групповой тары введенный копипастом
        cAm     := Left(cAm,26)
        nL      := 26
    ENDC

    IF nL > 26          //  Акцизная марка или сбойный ШК
        IF !((nL = 68) .OR. (nL = 150))   THEN ErrMess("У Вас марка "+Alltrim(Str(nL))+"! Однако длина марки должна быть точно равна 68 или 150 символов!",cError); RETU FALSE
        
        //  Символы должны быть в верхнем регистре и входить в разрешенный набор знаков: цифры и латинские буквы
        FOR nI := 1 TO nL
            IF !( Subs(cAm,nI,1) $ _SIMB_AM )
                lBad    := TRUE
                EXIT
            ENDI 
        NEXT nI
        IF lBad THEN Errmess("Акцизная марка или ШК содержит недопустимые символы! Символы должны быть в верхнем регистре и входить в разрешенный набор знаков: цифры и латинские буквы",cError); RETU FALSE

        //  Проверка на повторный ввод марки в сервисе проверок акцизных марок
        IF lSerAm
            nI  := ascan(aeAM,{|x|x[6]==cAm})
            IF nI > 0 THEN ErrMess("Уже вводили данную акцизную марку в запросе!",cError); RETU FALSE
        ENDI
    ELSE                //  ШК групповой тары или мусор
        IF lBox         //  Проверяю, как ШК групповой тары
            IF !((nL = 18) .OR. (nL = 26))   THEN ErrMess("Неверная длина ШК групповой тары = "+Alltrim(Str(nL))+"! Должная быть 18 или 26 цифровых знаков!",cError); RETU FALSE

            //  Все символы должны иметь числовое значение
            FOR nI := 1 TO nL
                IF !( Subs(cAm,nI,1) $ "0123456789" )
                    lBad    := TRUE
                    EXIT
                ENDI 
            NEXT nI
            IF lBad THEN Errmess("Штрихкод групповой тары может иметь только цифры!",cError); RETU FALSE
        ELSE            //  Проверка акцизной марки. Не вызов, как ФЛК групповой тары
            ErrMess("У Вас марка "+Alltrim(Str(nL))+"! Однако длина марки должна быть точно равна 68 или 150 символов!",cError); RETU FALSE
        ENDI
    ENDI
    RETU TRUE


P.S. До кучи сделал сообщения более детальными и понятными