powered by simpleCommunicator - 21.11.28     © 2024 Programmizd 02
Map
Форумы / Вопросы по IT / Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
Модераторы: Шоколадный
25 сообщений из 30, страница 1 из 2
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3312956
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
Начнем с REDUCER-а..( с ABAP 7.4х) как найти максимум, минимум во внутренней таблице..можно просто афигеть[:shock].. вот так вот [:biggrin2]
Речь о дереве с узлами. Ищем максимальную / минимальную ноду (node_key) для объекта go_tree TYPE REF TO cl_simple_tree_model.
Спойлер
Код
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
TYPES:
 ts_node      TYPE treemsnodt,
 tt_nodes    TYPE STANDARD TABLE OF ts_node.
DATA:
gt_nodes           TYPE tt_nodes,
gv_nodekey_max      TYPE   tm_nodekey,  " tm_nodeke простой string Datenelement
gv_nodekey_min      TYPE   tm_nodekey,

gv_nodekey_max = REDUCE tm_nodekey( INIT res = '0000000000'  FOR line IN gt_nodes
                                     NEXT res = COND #( WHEN line-node_key > res THEN line-node_key ELSE res ) ).

gv_nodekey_min = REDUCE tm_nodekey( INIT res = gv_nodekey_max   FOR line IN gt_nodes
                                     NEXT res = COND #( WHEN line-node_key < res THEN line-node_key ELSE res ) ).
...
Шоколадный:
Пользователь запросил модераторские права на тему.
Изменено: 07.10.2021, 11:16 - Шоколадный
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3312967
Программизд 02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Администратор
Гидроцефалы всех стран соединяйтесь!
Пользователь назначен модератором темы: Шоколадный.
...
Программизд 02:
Пользователь назначен модератором темы: Шоколадный.
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3313231
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
Поначалу думал что ABAP это какойто специфичный процедурный SQL типа PL-SQL.
Но поработавши с немецкими извращенцами пришлось сваять content management tool в SAP-GUI.
Между тем пока я тут ваял пришли немецкие крысы и уже испортили мне настроение.[:wub]
Спойлер
CRM.png
Так что че нить новое потом..

прикол данной тулзы.. бегаем по дереву нод в несколько уровней. при переходе с одной ноды на другую меняем в циклах структуру соответствующую активной ноде и одновременно прыгаем в subscreen соответствующего формуляра. В формуляре с активной на данный момент структуры актуализируем внутреннюю таблицу а затем делаем CRUD операцию в DDIC таблице и в завершении актуализируем ноду. все через EVENT double_click дерева go_tree ..надо бы добавить шперы на DDIC таблицы[:blink]
...
Изменено: 09.10.2021, 01:08 - Шоколадный
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3325009
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
Сваял второй репорт.
Редактор нижней ветви в моем go_tree. Фичи: ALV Grid с каталогом в сотню полей && Selecton Screen в Docking Dontainer. По Event переход в Dynpro с несколькими Subscreens , где производится CRUD операция. В Круде изюминка. Что-то подобное дельфийских lookup field c ADO-Dataset : Вставка полей по Search Help / Text Table , так называемое F4 Suche [:biggrin2] Пример в спойлере.
Спойлер
COI.png
Спойлер
conte.png
и еще здесь было задействовано.. идея не моя.. но я слегка о##ел и использовал [:biggrin2]:
переброска данных с метода в метод через MEMORY
Спойлер
memo.png
...
Изменено: 13.10.2021, 11:23 - Шоколадный
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3329050
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
Далее поговорю немного о транзкции RFBILA00.
https://www.se80.co.uk/sapreports/r/rfbi/rfbila00.htm
Цитата 
The report creates the balance sheet and profit and loss statements for a user-defined reporting period within a fiscal year with absolute and relative comparisons for a comparison period..
Был новый в этой мутной реке SAP.. Думал что это какая то локальная утилита.
Перекроил стандартную транзкцию сам того не подозревая.
НЕ оценила по достоинству заказавшая мелкая г***фирма.. Хотя я вижу свою перекройку как шедевр [:biggrin2]
основные параметры относятся к бухгалтерской терминологии: область учета ( accounting area, BUKRS) аккаунт, Balance Three ( Баланс-Структура), отчетный период, comparison year ..предыдущий период что ли [:wacko]
стандартная прога дампит, если не указать BUKRS.

здесь бухгалтерская муть:
Спойлер
каждой позиции Структуры баланса (вторая колонка ) с соответствующим BUKRS и SAKNR (aккаунтом) будет посчитана сумма для "oтчетного периода", сумма для предыдущего периода и соответствующее абсолютноая разница. х.з. как оно на русском в бухгалтерии[:wacko]
Причем каждой позиции в структуре баланса соответствует идентефикатор. Для одного типа баланса (KO01) как на картинке это семизначное NUMC для другого это десятизначное. Если попутать число позиций идентефикатора и тогда - ж## хаос на выходе бухгалтерии.
Если все задать более мение резонно получаем выхлоп как на картинке:
Спойлер
bala1.png
сенсационное изменение этой бухгалтерской лошади сделано в следующем:
вместо топорного списка по BALANCE_POSITION->BUKRS--SAKNR был сделан PIVOT по BUKRS причем в ALV и EXCEL ландшафте[:biggrin2]
Спойлер
bu3.png
...
Изменено: 14.10.2021, 15:17 - Шоколадный
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3329199
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
Такой вот ALV. циферки я покромсал.. но думаю идея понятна: слева направо идет PIVOT-коллекция BUKRS по колонкам.. последние 3 колонки - тотальный баланс по позиции (сумма ) и еще 2 бухгалтерских колонки elimination, summe k...
Число колонок высчитываеся динамически исходя из коллекции BUKRS которaя задается либо в selection screen либо какая-то стандартная коллекция..
пожже будет эксель
Спойлер
alv.png
...
Изменено: 14.10.2021, 22:27 - Шоколадный
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3330093
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
а вот какой вышел EXCEL PIVOT..
я до сих пор в экстазе от его вида..[:biggrin] особенно от того как позиционирую ячейку и вычисляю сумму через двойной указатель (в спойлере) все чистый абап..и эксель в том числе. каталог полей, ячейки экселя все вычисляется динамически.
ну само собой базис это классы
Спойлер
Код
1.
2.
3.
4.
5.
zcl_excel,
zcl_excel_worksheet,
zexcel_t_fieldcatalog,
zexcel_s_fieldcatalog,
zcl_excel_output
из abap2xlsx:
https://github.com/sapmentors/abap2xlsx/blob/master/src/zcl_excel_worksheet.clas.abap
Спойлер
exb.png
Спойлер
fs1.png
Спойлер
fs2.png
...
Изменено: 14.10.2021, 19:57 - Шоколадный
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3412718
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
на фоне актуальной короновирусной ж#пы сделаю прозаическое отступление в ABAP OOP.[:wacko]
Руководство о том запрограммировать набор ACTION's (trigger's) с транзакции BEA_ACTION_DEF чтобы затем их серийно обработать в стандартном SAP репорте RSPPFPROCESS
Исходные данные: В Транзакции BEA_ACTION_DEF имеем Профиль с 4-мя Action-Definitions.
Спойлер
Мануалы которыми руководствовался
http://pavelgk.pbworks.com/f/Post Processing Framework (PPF) Guidelines for application developers.pdf
https://blogs.sap.com/2012/08/08/create-an-action-and-set-a-dynamic-container/
https://www.se80.co.uk/oo-abap/c/cl_t/cl_trigger_ppf.htm

Ключевое слово: Post Processing Framework (PPF)

Шаги
1) Получаем инстанц класса cl_manager_ppf
2) выборка фактур
bdh~bdh_guid,
...
from /1bea/ipmi_bdi as bdi
inner join /1bea/ipmi_bdh as bdh on bdi~bdh_guid = bdh~bdh_guid

3) инициализация контекста : l_context type ref to cl_notif_context_ppf.

4) Для каждой фактуры инициализируем lo_appl_object вызовом статического метода
ca_bea_ppf=>agent->get_persistent... (CA_BEA_PPF Agent Anwendungsklasse für BEAs; BEA https://l3consulting.de/bea-im-sap-hcm/ )

5) генерим applkey. для каждой фактуры FM 'BEA_PPF_O_GET_APPLKEY'

6) инициализируем обьект контекста ( l_context type ref to cl_notif_context_ppf ) профилем и генеренным applekey,
Код
1.
2.
3.
 l_context->name =     'Z_IPMI_BILLING'.       "l_type_notif-ppf_profil.
      l_context->appl = lo_appl_object.
      l_context->applctn =  'BILLING'.              "l_type_notif-ppf_appl.
при необходимости вытягиваем таблицу BP (bussines partners) для каждой фактуры (закомментировано в коде )

7) далее проверка ранее прилинкованных Actions (triggers).. если триггер прилинкован и еще не был сработан - удаляем

8)и последний шаг на основании специфических критериев добавляем тот или иной триггер, определенный в профиле (на катринке выше).
создание и активирование триггера в форме create_trigger.
получается такая простыня ( отточенная и рабочая [:biggrin2]):
Спойлер
z1.PNG
Спойлер
z2.PNG
далее бонусный кусок кода с выборкой фактур
Спойлер
Код
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
  select distinct
"    bdi~bdi_guid,
    bdh~bdh_guid,
    bdi~src_guid,
    bdh~headno_ext,
    bdi~src_headno,
    bdh~bill_date,
    bdh~bill_type,
"    bdi~item_category,
    bdh~bill_org,
    bdh~parset_guid
    into table @lt_lty_bdi
    from  /1bea/ipmi_bdi as bdi
    inner join /1bea/ipmi_bdh as bdh on bdi~bdh_guid = bdh~bdh_guid
    where
       "( ( bill_type  between 'ZIF1' and 'ZIF8' )  and ( src_headno between  '0800000000'  and '0899999999' ) and  bdi~src_headno in @s_objid and bdh~headno_ext in @s_faktid "and bdh~bill_org  > 0.
        bdi~src_headno in @s_objid and bdh~headno_ext in @s_faktid.

  sort   lt_lty_bdi by src_headno headno_ext.

  call function 'POPUP_TO_CONFIRM'
    exporting
      titlebar              = 'Aktionen zu den ausgewählten Fakturen zuweisen'
      text_question         = 'Wollen Sie wirklich die Aktionen zu den ausgewählten Fakturen zuweisen?'
      text_button_1         = 'Ja'
      display_cancel_button = ''
      icon_button_1         = 'ICON_OKAY'
      text_button_2         = 'Nein'
      icon_button_2         = 'ICON_CANCEL'
      default_button        = '2'
    importing
      answer                = lv_answer "Rückgabewerte: '1', '2', 'A'
    exceptions
      text_not_found        = 1
      others                = 2.

  if sy-subrc <> 0.
    message i531(0u) with 'Fehler beim Funktionsbaustein POPUP_TO_CONFIRM'.
    return.
  endif.

  if lv_answer = '2' or
     lv_answer = 'A'.
    return.
  endif.
...
Изменено: 16.11.2021, 13:04 - Шоколадный
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3414269
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
Спойлер
z3.PNG
опять бонусный кусок кода з закоментеными BP's
Спойлер
Код
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
    if lo_trigger is not initial.
          lv_status  = lo_trigger->get_status( ).
          if lv_status = 0.
            g_manager->delete_trigger( io_context = l_context io_trigger = lo_trigger io_force = crmkc_con_yes ).
          endif.
        endif.
      enddo.

      "      ls_context = l_context.
      "     append ls_context to lt_context.

      "      check lt_context is not initial.
*
**   create partner collection
*      create object lo_partner_coll.
*
*      call function 'BEA_PAR_O_GET'
*        exporting
*          iv_parset_guid = ls_lty_bdi-parset_guid
*        importing
*          et_par         = lt_partner
*        exceptions
*          reject         = 1
*          others         = 2.
*      loop at lt_partner into ls_partner.
**     create a partner object
*        create object lo_partner
*          exporting
*            ip_partner_role  = ls_partner-partner_fct
*            ip_partner_no    = ls_partner-partner_no
*            ip_partner_text  = ''
*            ip_zav_addressno = ls_partner-addr_nr
*            ip_zav_persno    = ls_partner-addr_np
*            ip_zav_addr_type = ls_partner-addr_type.
**    add partner object to partner collection
*        call method lo_partner_coll->add_element( lo_partner ).
*      endloop.
** update partner collection to context
*      loop at lt_context assigning <lf_context>.
*        <lf_context>->partner = lo_partner_coll.
*      endloop.
*
*      clear gv_ttype_name.
*      clear lo_trigger.
*
*      call method g_manager->get_active_triggers
*        exporting
*          it_contexts = lt_context
*        importing
*          et_triggers = gt_activ_trigger.
*
*      loop at gt_inactiv_trigger into gs_inactiv_trigger.
*        ls_action-guid = gs_inactiv_trigger->read_guid( ).
*        "                ls_action-def = gs_inactiv_trigger->get_ttype( ).
*        "                ls_action-text = cl_view_service_ppf=>get_descrp_for_dropdown( io_trigger = gs_inactiv_trigger ).
*        "lv_status  =  gs_inactiv_trigger->get_status( ).
*      endloop.
*
*      if  lines( gt_activ_trigger ) > 0.
*        g_manager->delete_all_triggers_for_object( lo_appl_object ).
*      endif.
*
*

*
Спойлер
z4.PNG
...
Изменено: 16.11.2021, 14:08 - Шоколадный
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3414295
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
и форма создания и активирования триггера
Спойлер
z5.PNG
Спойлер
z6.PNG
...
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3414418
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
теперь.. зачем все это.. а вот зачем.. кто курит SAP CRM PPF тот поймёт [:biggrin2]
Спойлер
z10.png
...
Изменено: 16.11.2021, 14:09 - Шоколадный
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3419381
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
потерялась исходная профиля с акциями(триггерами) картинка в посте 3412718
без нее все нижестоящее е имеет смысла.
поскольку нежелательно исправлять посты добавлю здесь.
Спойлер
prof.png
...
Изменено: 18.11.2021, 13:13 - Шоколадный
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3419724
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
сегодня покажу как вытащить со смартформы PDF, прикрепить его к E-Mail, выслать E-Mail и записать PDF на APP-сервер. как раз сворганил и жду пятницы.. или очередной мозгo#bины
надо скоротать время и сделать заначку на дедофоруме[:wacko]

начинаем с того же профиля с триггерами BEA_ACTION_DEF
+ транзакция конфигурации BEA_ACTION_CONF (лень туда лезть)
Спойлер
1.PNG
в профиле триггер (Aktiondefinition) в котором переопределяем глобальный класс CL_BEA_IPM_SF_PROCESSING_PPF (IPM: Verarbeitungsklasse für BEAs)
Спойлер
2.PNG
в моем случае это класс ZCL_BEA_IPM_SF_SENDMAIL_PPF
смартформа ZMBA_BEA_IPMI_BILLING_SF
в классе буду перекраивать метод PROCESS_SMART_FORM
Спойлер
3.PNG
...
Изменено: 18.11.2021, 16:04 - Шоколадный
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3419804
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
методы глобального класса. добавил пару своих.
Названия говорят сами за себя.
Спойлер
4.PNG
важные аспекты перекраивания процедуры PROCESS_SMART_FORM
для сохранения смартформы (SF) в PDF обведены красным
Вызов модуля 'SSF_FUNCTION_MODULE_NAME' с параметром имени SF для получения имени функции SF lv_smartform_funcname
Важен параметр ls_control_parameters-getotf = abap_true.
иначе на выходе структуры es_job_output_info-otfdata будет нулевой.
otfdata это и есть бинар который изначалньно в OTF формате, который дальше переконвертируется в PDF (rv_pdf) вызовом модуля 'CONVERT_OTF'
Спойлер
8.png
Далее идет валидирование E-Mail (который в данном случае вытянут с BP вызовом модуля 'BEA_PAR_O_GET' либо желаемый адрес)
Спойлер
9.PNG
...
Изменено: 18.11.2021, 17:15 - Шоколадный
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3419877
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
и вызов 2х-выше представленных методов
Спойлер
10.PNG
и сами методы
SEND_EMAIL
Спойлер
11.png
STORE_FILE_ON_SERVER (в виде бонус-кода для интересующихся)[:biggrin2]
Спойлер
Код
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
  method store_file_on_server.

    data: lt_solix    type solix_tab,
          lv_solix    type solix,
          lv_filename type string,
          lv_path     type string,
          lv_date     type char10.

    lv_filename = 'Zahllauf' && '_' && iv_faktnum && '_' && sy-datum  && '.pdf'.
"    lv_path = 'P:\_Temp\faktura'.
        lv_path = '/usr/sap/tmp'.
    "select single dirname from user_dir into lv_path where aliass = 'DIR_TEMP'.
    lv_path = lv_path && '/' && lv_filename.

    "Convert xstring to binary
    lt_solix = cl_bcs_convert=>xstring_to_solix( iv_xstring = iv_pdf ).

    try.
        open dataset lv_path for output in binary mode.
        loop at lt_solix into lv_solix.
          transfer lv_solix to lv_path.
        endloop.
        close dataset lv_path.
        rv_return = abap_false.
      catch cx_bcs.
        rv_return = abap_true.
    endtry.

  endmethod.
...
Изменено: 18.11.2021, 16:42 - Шоколадный
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3430756
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
Надо замутить тему с REST API
...
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3432569
Король Жезлов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ΔЅΔ
Шоколадный  22.11.2021, 17:10
Надо замутить тему с REST API
Что там интересного?
...
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3433209
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
Король Жезлов  23.11.2021, 08:39
Шоколадный  22.11.2021, 17:10
Надо замутить тему с REST API
Что там интересного?
увидишь если интересно
...
Изменено: 23.11.2021, 13:20 - Шоколадный
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3485149
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
ох какой облом.. пробую начать[:wacko]

в основе лежит пару классов для генерации HTTP(s) запроса:
- cl_http_client : HTTP client control block;
- lo_rest_client : REST HTTP Client;
интерфейс : if_http_client : HTTP Client Abstraction
- класс утилит /UI2/CL_JSON JSON
для конвертирования ответки на API запрос в xml, Json,который надо десереализовать и втятуть в DDIC Таблицу.
Структурa DDIC Таблицы должна соответствовать формату ответа на API запрос... либо есть один трюк, который опишу ниже.
...
Изменено: 14.12.2021, 21:25 - Шоколадный
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3485225
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
переменные, типы
Код
1.
2.
3.
4.
5.
 lv_url TYPE string VALUE    'https://some.dienstap.de',
lo_http_client  TYPE REF TO if_http_client,
lo_rest_client  TYPE REF TO cl_rest_http_client,
lt_response TYPE STANDARD TABLE OF ty_response,
lr_json TYPE REF TO /ui2/cl_json.
Спойлер
Код
1.
2.
3.
4.
5.
6.
7.
8.
TYPES:
 BEGIN OF ty_odata_results,
           results TYPE STANDARD TABLE OF ty_response WITH DEFAULT KEY,
END OF ty_odata_results,

BEGIN OF ty_odata,
           d TYPE ty_odata_results,
END OF ty_odata.
генерим http запрос с аутентификацией
Спойлер
Код
1.
2.
3.
4.
5.
6.
7.
8.
 cl_http_client=>create_by_url( EXPORTING url =  lv_url
                                   IMPORTING client  = lo_http_client ).

    lo_http_client->request->set_version( if_http_request=>co_protocol_version_1_1 ).

    lo_http_client->authenticate(               "
        username =  'user'   "sy-uname
        password =  'pw'
далее uri с API:
a) пример запроса на SAP сервер с OData сервисом (concatenate string's with &&)
Спойлер
Код
1.
2.
3.
lv_urlreq = '/sap/opu/odata/sap/ZQA_KLK_CI_VAR_CF_SRV/ZQA_KLK_CI_VAR_CF'.
 lv_urlreq = lv_urlreq && '(ZV_CF_BUKRS=' && |'{ lv_bukrs }'| && ',ZV_CF_DLMM=' && |'{ lv_dimm }'| &&  ',ZV_CF_VERSN=' && |'{ lv_bew_ver }')|.
 lv_urlreq = lv_urlreq && '/Results?$format=json'.
б) слегка усложненный "обычный" API запрос но тем не менее по правилам синтаксиса OData:
http://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part1-protocol.html#sec_QueryingCollections
https://www.jsonapi.net/usage/reading/filtering.html
Здесъ задействованы команды OData такие как : filter, startswith, in,eq,gt,ne, cast а также top, skip для пагинации (пошагового запроса) во избежание таймаута:
Спойлер
Код
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
    lv_urlreq = '/Nautilus_API_Basic/api/CampaignIPM?$filter='.
      if  lv_cpgid_min is not initial and lv_cpgid_max is not initial and lv_cpgid_min < lv_cpgid_max.
       lv_urlreq = lv_urlreq && 'cpgNumber ge' && | { lv_cpgid_min }| && ' and cpgNumber le' && | { lv_cpgid_max } and |.
     elseif
         lv_cpgid_min is not initial and lv_cpgid_max is initial.
        lv_urlreq = lv_urlreq && 'cpgNumber eq ' && | { lv_cpgid_min } and |.
      endif.
      lv_urlreq = lv_urlreq && 'cpgCliDeliveryFrom gt cast(' && lv_curyear && '-01-01Z,Edm.DateTimeOffset)'.
      lv_urlreq = lv_urlreq && ' and startswith(cpgForeignNumber, ''92'')'.
      lv_urlreq = lv_urlreq && ' and length(cpgForeignNumber) eq 6'.
      "   lv_urlreq = lv_urlreq && ' and ( startswith(cpgForeignNumber, ''581'') or startswith(cpgForeignNumber, ''565''))'.
      lv_urlreq = lv_urlreq && ' and cpgForeignNumber ne null'.
      lv_urlreq = lv_urlreq && ' and cpgForeignNumber ne '' : '''.
      lv_urlreq = lv_urlreq && ' and cpgForeignNumber ne '''''.
      lv_urlreq = |{ lv_urlreq }cpgForeignNumber eq '{ <ls_contidrg>-low }'|.
      "    lv_urlreq = lv_urlreq && ' and cpgcsName in (''tvnow.de ADA'',''n-tvnow.de ADA'',''RTLnow.de AdA'') '.
      "    lv_urlreq = lv_urlreq && ' and cpgcsName eq ''tvnow.de ADA'''.
      "lv_urlreq = lv_urlreq && '&?$orderby=cpgCliDeliveryFrom'.
      "    lv_urlreq = lv_urlreq && '&$top=10&$skip=0'.
      lv_urlreq = lv_urlreq && '&$top=' && |{ 300 }| && '&$skip=' && |{ lv_page }|.
и генерим API запрос:
Спойлер
Код
1.
2.
3.
4.
5.
  cl_http_utility=>set_request_uri(
      EXPORTING
          request = lo_http_client->request
          uri     = lv_urlreq
    ).
на этом шаге меня были непонятки. не мог сгенерить https и даже просил помощи в пт. но в ответ уличили в хусятине[:wacko]
причина довольно обыденная:
надо зайти в gateway client, tr: /n/IWFND/GW_CLIENT и проверить не закрыт ли https порт
в данном случае connect был возможен только по авторизованному http:
Спойлер
nau.png
...
Изменено: 14.12.2021, 21:27 - Шоколадный
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3485303
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
и если connect состоялся, в gateway client можно посмотреть API request с metadata и т.д.
Спойлер
y1.PNG
если запрос в gateway client работает можно далее формировать его в abap и сериализовать json ответ
и десериализовать в DDIC структуру
Спойлер
Код
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
*Create REST Client object
      if lo_rest_client is initial.
        create object lo_rest_client
          exporting
            io_http_client = lo_http_client.
      endif.

      if lo_http_client is bound and lo_rest_client is bound.

        try.

            lo_rest_client->if_rest_client~get( ).
            data(lo_response) = lo_rest_client->if_rest_client~get_response_entity( ).
            data(lv_http_status) = lo_response->get_header_field( '~status_code' ).
            if lv_http_status ne 200.
              lv_error_status = lv_http_status.

*HTTP Request Failed
              data(lv_reason) = lo_response->get_header_field( '~status_reason' ).
            endif.

*Receive the response data in JSON.
            lv_json_data = lo_response->get_string_data( ).
            "Refresh the SLACK response to clear HTTP memory of previous calls
            if lo_http_client is bound.
              lo_http_client->refresh_response( ).
            endif.

*Collect into the exception table.
          catch cx_rest_client_exception into data(lo_rest_client_exception).
            data(lv_msg) = `HTTP GET failed: ` && lo_rest_client_exception->get_text( ).

        endtry.

   if lv_json_data is not initial.
          create object lr_json.
          try .
              lr_json->deserialize( exporting json = lv_json_data
                                               pretty_name = /ui2/cl_json=>pretty_mode-camel_case
                changing data =  lt_campaignipm ).

            catch cx_sy_move_cast_error into data(lo_move_cast_error) .
          endtry.

        endif.
      endif.

      append lines of lt_campaignipm to et_result.
      if lo_http_client is bound.
        lo_http_client->refresh_response( ).
      endif.
...
...
Изменено: 14.12.2021, 21:31 - Шоколадный
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3485360
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
здесь трюк со вложенной многоуровневой структурой json...как впихнуть его в простую DDIC структуру?[:blink]
пусть ответка будет такая (для наглядности в хмл) мне надо вытянуть все теги в properties
Спойлер
x1.PNG
обьявляю тип ty_response с полями в точности = тегам
Спойлер
Код
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
  types:
    BEGIN OF ty_response,
    id  TYPE string,
    TotaledProperties TYPE string,
    _ard_io_cnit TYPE string,
    _ard_io_cnit_t TYPE string,
    a0fiscyear TYPE string,
    _ard_io_vrst TYPE string,
    _ard_io_vrst_t TYPE string,
    a00o2tqr4cavr885w5ec2ogpl2 TYPE string,
    a00o2tqr4cavr885w5ec2ogpl2_f TYPE string,
    a00o2tqr4cavr885w5ec2ogpl2_e   TYPE string,
    a00o2tqr4cavr885w5ec2ogvwm   TYPE string,
    a00o2tqr4cavr885w5ec2ogvwm_f TYPE string,
    a00o2tqr4cavr885w5ec2ogvwm_e TYPE string,
    a00o2tqr4cavr885w5ec2oh286 TYPE string,
    a00o2tqr4cavr885w5ec2oh286_f TYPE string,
    a00o2tqr4cavr885w5ec2oh286_e TYPE string,
    a00o2tqr4cavr885w5ec2oh8jq TYPE string,
    a00o2tqr4cavr885w5ec2oh8jq_f TYPE string,
    a00o2tqr4cavr885w5ec2oh8jq_e TYPE string,
   END OF ty_response .
далее такую комбинацию которая будет соответствовать формату возвращаемого json:
Спойлер
Код
1.
2.
3.
4.
5.
6.
7.
8.
 TYPES:
      BEGIN OF ty_odata_results,
           results TYPE STANDARD TABLE OF ty_response WITH DEFAULT KEY,
      END OF ty_odata_results,

      BEGIN OF ty_odata,
           d TYPE ty_odata_results,
      END OF ty_odata.
и структуру в которую буду записывать десериализованый json:
Спойлер
Код
1.
DATA: ls_odata TYPE ty_odata.
и готово[:biggrin]
Спойлер
Код
1.
2.
3.
    lr_json->deserialize( EXPORTING json = lv_json_data
                                          pretty_name = /ui2/cl_json=>pretty_mode-camel_case
                                CHANGING data =  ls_odata ).
зы.. прикол не мой. дело вот в чем. десериализация в /ui2/cl_json заточена под json формат:
Код
1.
 {"d":{"results":[{"__metadata":....
ссылка
https://answers.sap.com/questions/12998367/odata-simple-json-deserialize.html
...
Изменено: 14.12.2021, 21:32 - Шоколадный
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3485457
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
трюк: шаблонная модификация данных во внутренней таблице путем присвоения значения текущего поля структуры (по sy-index) указателю
(простая структура без разницы какая. со вложениями вероятно не покатит.):
Спойлер
Код
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
FIELD-SYMBOLS: <comp> TYPE ANY.
 DO.
      ASSIGN COMPONENT sy-index OF STRUCTURE wa_material_data TO <comp>.
      IF sy-subrc NE 0.
        EXIT.
      ENDIF.

*Remove leading spaces from file
      SHIFT <comp> LEFT DELETING LEADING space.
"      SHIFT <comp> LEFT DELETING LEADING '0'.

      replace all occurrences of '"' in <comp> with ' '.
      concatenate '"' <comp> '"' into tcomp.

      IF sy-index = 1.
        ls_output = tcomp.
      ELSE.
        CONCATENATE ls_output tcomp INTO ls_output SEPARATED BY ','.
      ENDIF.
    ENDDO.
...
Изменено: 14.12.2021, 21:38 - Шоколадный
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3556512
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
ABAP трюк.
Ваборка DDIC tаблицы с удаленной системы через RFC Connection
и "расшифровка" возвращенной таблицы путем присвоения имени поля локальной структуры указателю на имя поля возращенной структуры.
Смысл:идет цикл по строкам возвращенной таблицы.
Если имена полей в возвращенной и локальной струкруре совпадают значит можно выгребать значение в локальную структуру
и затем структуру инсертить в локальную таблицу[:biggrin2]
Имена полей и фильтры добабляются в таблицы lt_fields и lt_options соответственно.
Спойлер
Код
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
TYPES:
     BEGIN OF ty_mara,
            pva TYPE char8, " pva,
            matnr TYPE matnr,
            ISMMEDIATYPE TYPE ZISMMEDIATYPE,
      END OF ty_mara,

 DATA:
 lt_fields          TYPE STANDARD TABLE OF rfc_db_fld,
 ls_fields LIKE LINE OF lt_fields,
 lt_options        TYPE STANDARD TABLE OF rfc_db_opt,
 ls_options LIKE LINE OF lt_options.
 l_offset   TYPE i,
 l_len      TYPE i,
 t_mara TYPE TABLE OF ty_mara,
 l_mara LIKE LINE OF t_mara
 ls_vbrks TYPE ty_vbrks.

  FIELD-SYMBOLS:
   <ls_fields> TYPE rfc_db_fld,
   <ls_data>   TYPE tab512,
   <l_field>   TYPE ANY.


   REFRESH : lt_mara, lt_fields,lt_options.
    CLEAR  ls_options.
    CONCATENATE  'BISMT =''' z_zukri-pva '''' INTO  ls_options.
    APPEND ls_options TO lt_options.

    CLEAR  ls_fields.
    ls_fields-fieldname = 'MATNR'.
    APPEND ls_fields TO lt_fields.

    CALL FUNCTION 'RFC_READ_TABLE' DESTINATION 'S4DCLNT130'
      EXPORTING
        query_table          = 'MARA'
        rowcount             = 1
      TABLES
        OPTIONS              = lt_options
        fields               = lt_fields
        data                 = lt_mara
      EXCEPTIONS
        table_not_available  = 1
        table_without_data   = 2
        option_not_valid     = 3
        field_not_valid      = 4
        not_authorized       = 5
        data_buffer_exceeded = 6
        OTHERS               = 7.

    LOOP AT lt_mara ASSIGNING <ls_data>.
      LOOP AT lt_fields ASSIGNING <ls_fields>.
        l_offset = <ls_fields>-offset.
        l_len = <ls_fields>-length.
        ASSIGN COMPONENT <ls_fields>-fieldname OF STRUCTURE
                                       l_mara TO <l_field>.

        IF sy-subrc EQ 0.
          <l_field> = <ls_data>+l_offset(l_len).
        ENDIF.
        l_mara-pva = z_zukri-pva.
        APPEND l_mara TO t_mara.
      ENDLOOP.
    ENDLOOP.
...
Изменено: 14.01.2022, 22:09 - Шоколадный
Рейтинг: 0 / 0
Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
    #3581347
Шоколадный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор темы
ABAP-Трюки с дибаггером.

I) Таблица доступна только на чтение. Нужно сделать что либо из CREATE / UPDATE / DELETE
Транзакция SE16. 0)SELECT 1) F7- Datensatz anzeigen 2) Aufruf von Debugger :/h 3) "OK"
4) Ersetzen CODE Variable in Debugger: CODE = 'EDIT' 5) Datensatz in EDIT Modus 6) Speichern.
Спойлер
test.png
...
Изменено: 26.01.2022, 13:49 - Шоколадный
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Вопросы по IT / Здесь буду выкладывать ABAP-ные трюки, шедевры своего ABAP-ного и UI5-ного формоклепства, ну и перекроённые мною лично транзакции SAP.
Модераторы: Шоколадный
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Игнорируют тему (5): Гарыныч, PaNik, Сибирская кошка, WildMage, erbol
Читали форум (2): Анонимы (1), Bing Bot 3 мин.
Пользователи онлайн (4): Анонимы (1), Yandex Bot, Bing Bot, Google Bot 7 мин.
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]