SAPфорум.RU
https://www.sapboard.ru/forum/

Генерация QR кода больших размеров средствами SAP
https://www.sapboard.ru/forum/viewtopic.php?f=13&t=95947
Страница 1 из 2

Автор:  MeIIIok [ Пн, янв 15 2018, 16:04 ]
Заголовок сообщения:  Генерация QR кода больших размеров средствами SAP

Всем привет!

Возникла необходимость генерить QR коды большого размера (больше 1000 символов кириллицей). При огромном количестве генераторов QR кодов в интернете, у сапа с этим обстоят дела более скромно. У меня в системе вообще не было возможности создания QR. Накатили ноту 2030263 - Support for QR Code 2005 Barcode in SAPscript and Smart Forms, появилась возможность создания QR, но наткнулся на ограничение в 255 символов.

Покопавшись в коде нашел вызов системной функции, которая генерит сам код, в которой как раз это ограничение на 255 символов:
Code:
call 'RSPO_CACHE_CONTROL' id 'AREA' field 'BARCODE'
                            id 'OP'   field 'RENDERBARCODE'
                            id 'BC_PAR' field bc_cmd-tdprintpar
                            id 'BP_PAR' field bp_cmd-tdprintpar
                            id 'BARCDATA' field barcdata
                            id 'BARCDATALEN' field barcdatalen
                            id 'BMSIZE' field bitmapsize
                            id 'WIDTH'  field w
                            id 'HEIGHT' field h
                            id 'MSG'    field msg
                            id 'ERRMSG' field errmsg.


Где BARCDATA и есть содержимое QR кода и при передаче значения больше 255 системная функция перестает выполнятся и возвращает ошибку "operation RENDERBARCODE(BARCODE) failed" если переменную передаю типа string то ошибка "parameter cU("BARCDATA") missing for RENDERBARCODE(BARCODE)"

Пообщавшись с нашим базисом, сделал вывод, что системные функции написаны на языке C, и докрутить их до нужной кондиции нет возможности, так же как и создать свою скопировав системный код.

В интернете описаны решения с ГУГЛ апи, но оно не подходит, так как у конечного пользователя нет интернета. Решение с установкой "левых" программ к пользователю на машину, тоже затруднительно.

Может у кого то был подобный опыт и смогли найти более менее сносное решение с минимальным количеством костылей и желательно в пределах системы SAP без использования сторонних приложений и программ.

Спасибо за любую предоставленную информацию.

Автор:  Kuranov.Dmitry [ Пн, янв 15 2018, 16:14 ]
Заголовок сообщения:  Re: Генерация QR кода больших размеров средствами SAP

На серваке интернет есть?
В смысле конечный клиент это только тот кто запускает гуй, или тот кто содержит сервак?

Автор:  MeIIIok [ Пн, янв 15 2018, 16:21 ]
Заголовок сообщения:  Re: Генерация QR кода больших размеров средствами SAP

Kuranov.Dmitry написал(а):
На серваке интернет есть?
В смысле конечный клиент это только тот кто запускает гуй, или тот кто содержит сервак?

Доступа к интернету нет ни на сервере, ни на компе где будут запускать программу.

Автор:  AFH [ Вт, янв 16 2018, 11:17 ]
Заголовок сообщения:  Re: Генерация QR кода больших размеров средствами SAP

В ноте 2030263 (вроде) есть программа REPORT RSPO_QR_BARCODE_DEBUG, там есть такие куски:

Code:
*>>>> START OF INSERTION <<<<
FORM call_kernel USING    iv_text       TYPE string
                          iv_corrlevel  TYPE c
                          iv_mode       TYPE c
                 CHANGING ev_codewords  TYPE string
                          ev_symbol     TYPE string
                          ev_qr_version type i
                          ev_qr_width   type i
                          ev_error_message  TYPE string.

  DATA: lv_text_length    TYPE i,
        lv_text_help      TYPE c LENGTH 3200, "3200 digits = biggest encodable input string
        lv_codewords_help TYPE c LENGTH 8800, "2178 (number of codewords biggest symbol) * 4 (three digits + space) = 8712
        lv_symbol_help    TYPE c LENGTH 1000,
        lv_qr_version     type i,
        lv_qr_symbolwidth type i.

  lv_text_length = strlen( iv_text ).
  lv_text_help = iv_text.

  CALL 'RSPO_DM_BARCODE_ENCODE'
    ID 'TEXT_LENGTH'  FIELD lv_text_length
    ID 'TEXT'         FIELD lv_text_help
    ID 'MODE'         FIELD iv_mode
    ID 'QR_ERRCORR'   FIELD iv_corrlevel
    ID 'CODEWORDS'    FIELD lv_codewords_help
    ID 'SYMBOL'       FIELD lv_symbol_help
    ID 'QR_VERSION'   FIELD lv_qr_version
    ID 'QR_WIDTH'     FIELD lv_qr_symbolwidth.

Автор:  Kengur [ Вт, янв 16 2018, 11:33 ]
Заголовок сообщения:  Re: Генерация QR кода больших размеров средствами SAP

QR код можно генерить в выходной форме SFP. Возможно там больше схавает.

Автор:  MeIIIok [ Вт, янв 16 2018, 13:23 ]
Заголовок сообщения:  Re: Генерация QR кода больших размеров средствами SAP

Kengur написал(а):
QR код можно генерить в выходной форме SFP. Возможно там больше схавает.

Там тоже ограничение.

Автор:  MeIIIok [ Вт, янв 16 2018, 13:31 ]
Заголовок сообщения:  Re: Генерация QR кода больших размеров средствами SAP

AFH написал(а):
В ноте 2030263 (вроде) есть программа REPORT RSPO_QR_BARCODE_DEBUG, там есть такие куски:

Code:
*>>>> START OF INSERTION <<<<
FORM call_kernel USING    iv_text       TYPE string
                          iv_corrlevel  TYPE c
                          iv_mode       TYPE c
                 CHANGING ev_codewords  TYPE string
                          ev_symbol     TYPE string
                          ev_qr_version type i
                          ev_qr_width   type i
                          ev_error_message  TYPE string.

  DATA: lv_text_length    TYPE i,
        lv_text_help      TYPE c LENGTH 3200, "3200 digits = biggest encodable input string
        lv_codewords_help TYPE c LENGTH 8800, "2178 (number of codewords biggest symbol) * 4 (three digits + space) = 8712
        lv_symbol_help    TYPE c LENGTH 1000,
        lv_qr_version     type i,
        lv_qr_symbolwidth type i.

  lv_text_length = strlen( iv_text ).
  lv_text_help = iv_text.

  CALL 'RSPO_DM_BARCODE_ENCODE'
    ID 'TEXT_LENGTH'  FIELD lv_text_length
    ID 'TEXT'         FIELD lv_text_help
    ID 'MODE'         FIELD iv_mode
    ID 'QR_ERRCORR'   FIELD iv_corrlevel
    ID 'CODEWORDS'    FIELD lv_codewords_help
    ID 'SYMBOL'       FIELD lv_symbol_help
    ID 'QR_VERSION'   FIELD lv_qr_version
    ID 'QR_WIDTH'     FIELD lv_qr_symbolwidth.

Нашел отчет этот, это уже близко к истине, ограничение по QR коду 3200 символов, и вроде генерит его нормально, системная функция выдает набор кодовых слов (codewords), как бы теперь их преобразовать в BMP файл?

Результат работы выглядит сейчас так:
Прогр. ZRSPO_QRCODE_BARCODE_DEBUG

Input String: a1234567890b1234567890c1234567890d1234567890e1234567890g123456
Mode: Automatic Mode
Error Corr. Level: H = 30%
Generated Data Codewords:
64 0 22 17 0 161 237 200 197 65 0 0 88 132 2 135 183 35 21 4
0 1 99 16 10 30 220 140 84 16 0 5 144 64 40 123 114 49 80 64
0 22 81 0 161 237 200 197 65 0 0 89 196 2 135 183 35 21 4 0
1 116 16 10 30 220 140 84 16 0 5 200 64 40 123 114 49 80 64 0
22 33 0 161 237 200 197 65 0 0 91 132 2 135 183 35 21 4 0 1
115 16 10 30 220 140 84 16 0 9 153 132 64 40 123 114 49 80 64 0
22 33 0 161 237 200 197 65 0 0 88 196 2 135 183 35 21 4 0 1
100 16 10 30 220 140 84 16 0 5 148 64 40 123 114 49 80 64 0 22
113 0 161 237 200 197 65 0 0 93 4 2 135 183 35 21 4 0 1 114
16 10 30 220 140 84 16 0 5 136 64 40 123 114 49 80 64 0 22 225
0 161 237 200 197 65 0 0 92 196 2 135 183 35 21 4 0 1 102 0
236 17 236

Вариант в котором ограничение 255 символов это происходило в системной функции, при генерации он походу сразу создавал где то внутри BMP файл, который потом считывался кусками в 16-тиричном виде.

Code:
  CALL 'RSPO_CACHE_CONTROL' ID 'AREA' FIELD 'BARCODE'
                            ID 'OP'   FIELD 'RENDERBARCODE'
                            ID 'BC_PAR' FIELD bc_cmd-tdprintpar
                            ID 'BP_PAR' FIELD bp_cmd-tdprintpar
                            ID 'BARCDATA' FIELD barcdata
                            ID 'BARCDATALEN' FIELD barcdatalen
                            ID 'BMSIZE' FIELD bitmapsize
                            ID 'WIDTH'  FIELD w
                            ID 'HEIGHT' FIELD h
                            ID 'MSG'    FIELD msg
                            ID 'ERRMSG' FIELD errmsg.
  IF sy-subrc = 0.
* get bitmap buffer
    totallen = 0.
    DO.
      CALL 'RSPO_CACHE_CONTROL' ID 'AREA' FIELD 'BARCODE'
                                ID 'OP'   FIELD 'GETBITMAP'
                                ID 'BUFFER' FIELD bmbuf-data
                                ID 'LENGTH' FIELD c_bmbuf_size
                                ID 'ACTSIZE' FIELD actlen.
      IF sy-subrc = 0.
        IF actlen > 0.
          APPEND bmbuf.
          ADD actlen TO totallen.
        ENDIF.
        IF totallen >= bitmapsize.
          sy-subrc = 0.
          EXIT.
        ENDIF.
      ELSE.
*      write: / 'ERROR at GETBITMAP, SUBRC', sy-subrc.
        EXIT.
      ENDIF.
    ENDDO.
    IF sy-subrc = 0.
*   write: / 'Read', totallen, 'bytes of bitmap data'.
    ENDIF.
  ELSE.
    CONCATENATE errmsg ':' msg INTO errormsg.
    sy-subrc = 1. "concatenate changes SUBRC
  ENDIF


Да и это нота 2042314 https://launchpad.support.sap.com/#/notes/2042314

Автор:  AFH [ Ср, янв 17 2018, 10:42 ]
Заголовок сообщения:  Re: Генерация QR кода больших размеров средствами SAP

Посмотрите, про кодовые слова немного расписано тут:

https://habrahabr.ru/company/edison/blog/341212/

Изображение

Как-то там сложно, маски, уровни коррекции и т.д. не придется ли наполовину генератор самим написать чтобы кодовые слова разобрать.

Автор:  MeIIIok [ Ср, янв 17 2018, 14:15 ]
Заголовок сообщения:  Re: Генерация QR кода больших размеров средствами SAP

AFH написал(а):
Посмотрите, про кодовые слова немного расписано тут:

https://habrahabr.ru/company/edison/blog/341212/



Как-то там сложно, маски, уровни коррекции и т.д. не придется ли наполовину генератор самим написать чтобы кодовые слова разобрать.

Спасибо за ссылку. Алгоритмы действительно очень сложные. Разработку своего генератора QR кода оставлю на на последний момент. Пока все же постараюсь найти более менее готовое решение.

Автор:  DiVo [ Чт, янв 18 2018, 10:45 ]
Заголовок сообщения:  Re: Генерация QR кода больших размеров средствами SAP

Сам не пробовал, но, возможно, решение по ссылке поможет

https://archive.sap.com/discussions/thread/3824600

Автор:  MeIIIok [ Чт, янв 18 2018, 13:52 ]
Заголовок сообщения:  Re: Генерация QR кода больших размеров средствами SAP

DiVo написал(а):
Сам не пробовал, но, возможно, решение по ссылке поможет

https://archive.sap.com/discussions/thread/3824600


Пробую, но честно говоря не совсем понял смысл описанный по ссылке, так как не силен в смартформах.

Создал в SO10 текст.
Изображение

В смартформах создал шаблон-> текст-> строки программы.
Изображение
Изображение

Заполнил как написано в приведенной ссылке, при активации выдает ошибку.
Изображение

Где в смартформах прописать эти переменные gv_qrcode1 gv_qrcode2?

Автор:  Bimit [ Чт, янв 18 2018, 14:08 ]
Заголовок сообщения:  Re: Генерация QR кода больших размеров средствами SAP

Папка "Глобальные настройки" вкладка "Глобальные определения"

Автор:  MeIIIok [ Чт, янв 18 2018, 14:51 ]
Заголовок сообщения:  Re: Генерация QR кода больших размеров средствами SAP

Bimit написал(а):
Папка "Глобальные настройки" вкладка "Глобальные определения"

Спасибо. Извините за глупые вопросы.
Теперь все активируется, но на экран выводится пустой белый лист...
Как Сап должен понять в смартоформах что нужно вывести QR код?

Автор:  MeIIIok [ Чт, янв 18 2018, 15:00 ]
Заголовок сообщения:  Re: Генерация QR кода больших размеров средствами SAP

Еще по ссылке https://archive.sap.com/discussions/thread/3824600 у человека в настройках текста стоит формат абзацев QR, у меня таких настроек нет. Как он туда QR указал?

Автор:  DiVo [ Чт, янв 18 2018, 15:36 ]
Заголовок сообщения:  Re: Генерация QR кода больших размеров средствами SAP

Сначала в тр. SE73 создайте свой QR код (как здесь):

https://blogs.sap.com/2016/05/12/qr-code-or-2d-bar-code-in-sap/

Затем для смартформы создайте стиль и в этом стиле создайте формат знаков, ссылающийся на ранее созданный QR код. Далее используйте этот формат в смартформе для отображения QR кода.

Изображение

Изображение

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/