Академический Документы
Профессиональный Документы
Культура Документы
В SAP ERP имеются типовые и общие приложения/программы, которые участвуют (или могут
участвовать) во многих бизнес-процессах/разработках. К таким «типовым приложения» относятся
печатные формы (pdf-формуляры/Adobe, smartforms, sapscript), обработка IDOC, код в customer
function, user-exit, Enhancement, BTE, substitution, ALV-отчеты, анализ полномочий пользователя,
события WF, создание XML-файлов.
Печатные формы
Инструменты работы с печатной формами в определенной мере стандартизированы. При разборе
ошибки с печатной формой (любого вида) нам нужно, прежде всего, определить правильно
программу печати, сам объект формуляра.
Запись в таблице TNAPR говорит о том, что в программе ZV_RVADOR01 будет вызвана
подпрограмма ENTRY.
Язык: E
Код формуляра: ZSD_RVORDER02
Теперь посмотрим, как попадают значения на экран в sapscript
Для этого зайдем в формуляр через транзакцию SE71 и посмотрим, как он выглядит (обратим
внимание на язык).
Переходим в Layout
Также обратим внимание на FORMAT TAG типа E/ - это начало блоков, которые могут быть
повторены в Window main (и только в этом окне они могут быть повторены).
При этом в самой программе будет указано какие окна/блоки выводятся.
Вывод: переменные в SAPSCRIPT контролируются через программу, и вывод блоков тоже
контролируется программно. Сам по себе подход SAPSCRIPT базируется на «длинных текстах»
(SO10); на смену sapscript пришли другие подходы в печати.
Синтаксис вывода (ограничение длины, жирный шрифт – можно указывать как через стили, так
и через дополнительные операторы). Подробнее здесь
https://wiki.scn.sap.com/wiki/display/ABAP/SAPscript#SAPscript-HowcanIdebugmySAPscript?
Которые мы можем заполнить уже внутри SMARTFORM и использовать для заполнения значений
ячеек и таблиц.
В ячейках мы можем указать «твердый текст», ссылку на текст из SO10 (стандартный длинный
текст).
Или переменные из выше обозначенных источников (глобальные и параметры импорта).
Дополнительный код может быть привязан практически в любом месте
PDF-формуляры
PDF формуляры работают посредством дополнительной службы ADS. Эту функциональность нужно
встраивать отдельно. Более того, чтобы была возможность просматривать шаблоны формуляров
нужна специальная программа Adobe Lifecycle Designer. Ее можно скачать с SAP Service Market Place
(обычно это может сделать только базис, то есть супер-пользователи).
Для проверки работы сервера ADS, а также ознакомление с возможностями PDF, можно
использовать программы FP_TEST_*.
https://help.sap.com/doc/saphelp_erp60_sp/6.0/en- US/fc/eb2d5a358411d1829f0000e829fbfe/
frameset.htm
https://help.sap.com/erp2005_ehp_04/helpdata/en/46/2d15ce7f944250e10000000a1553f6/framese t.htm
FormCalc не имеет отладчика. Значение переменных можно выводить при помощи оператора
для вывода сообщений – messageBox()
https://blogs.sap.com/2014/06/23/how-to-debug-adobe-interactive-forms-with-javascript-or-
formcalc/
http://help.adobe.com/en_US/livecycle/10.0/DesignerScriptingBasics/index.html
4) Жмем скрепку, сохраняем XFD.xml (лучше как <вид вых. документа>.xml , например
ZSPE.xml )
5) В системе разработки запускаем SFP, открываем редактор формуляра, правой кнопкой на
Preview PDF, Form Properties…
Выгрузка в Excel
Стандартный подход к выгрузке в Excel у SAP – это выгрузка при помощи OLE. Однако, энтузиасты-
разработчики создали свои подходы (продукты), которые позволяют выгружать в Excel.
Подход
Выгрузка через Если выгрузка идет этим способом, то точку останова нужно
ZWWW_OPENFORM ставить в ФМ ZWWW_OPENFORM
Автор: Parazit
http://sapboard.ru/forum/vi
ewtopic.php?f=13&t=4880&
view=unread#unread
https://blogs.sap.com/2014/
04/22/xlsx-workbench/
Также мы видим, что на вход этому методу подается внутренняя таблица - me->T_OUTTAB[]
Именно она и является ключевой при сборе данных отчетом.
Эта таблица отвечает за каталог полей (за то. какие поля будут отображаться, а какие будут скрыты).
Через поиск по коду текста программы или через точку наблюдения можно определить, где
заполняется эта таблица.
4) В каком месте программы определяется набор кнопок и текстов (GUI статус)?
Нужно определить экран, в котором открывается ALV-экран (мы это определили на предыдущем
шаге) и зайти в PAI модуль.
Чтобы познакомиться подробнее с возможностями ALV можно зайти в пакет SLIS и посмотреть на
программы. Здесь представлены практически все возможности ALV.
Формирование IDOc: ключевые моменты
IDOC формируется с помощью функционального модуля, предназначенного для типа сообщения.
Транзакция Описание
WE02 = Отчет по обработанным IDOC со статусами.
WE05 Из конкретного IDOC мы можем узнать тип сообщения, настройки
партнера
WE20 Проверка настроек партнера
Просмотр типа IDOC.
WE30 Можно посмотреть как стандартную часть IDOC, так и расширение IDOC.
WE57 Присвоение типа сообщение и IDOC. Также можно увидеть ФМ-обработчик
конкретного типа сообщения.
Именно с помощью такого способа можно быстро установить, какой ФМ
обрабатывает конкретный тип сообщения.
WE82 Присвоение типа сообщения и типа IDOC
WE19 Инструмент для создания IDOC.
Можно создать файл IDOC "с нуля", а можно создать по образцу от
существующего IDOC и внести изменения.
BD87 Перезапуск IDOC.
Прежде всего, нужно прочитать сообщение об ошибке (если оно есть). Причина "падения" IDOC
может быть не связанна напрямую с бизнес-процессом. Это могут быть: нерасширенные данные,
неприсвоенные орг.структуры; по таким проблемам система явно обозначит причину через
сообщение и Вы сэкономите свое время на исследования.
Для просмотра сообщений к IDOC щелкаем по нему дважды в списке и переходим к
соответствующей части в дереве IDOC.
С помощью транзакции WE57 мы можем определить ФМ, с помощью которого идет обработка
IDOC данного типа.
Эти данные хранятся в таблице EDIFCT (IDoc: Assignment of FM to log. message and IDoc type)
При отправке IDOC через выходные документы удобно использовать программу RSNAST0D
(Generic output issue). С ее помощью можно тестировать выходные документы; и если к
выходному документу привязан IDOC, то данную программу весьма удобно использовать.
Для использования пакетного ввода необязательно даже писать отдельную программу можно
использовать возможности регистратора пакетного ввода.
К регистратору пакетного ввода (Batch Input Recorder) можно перейти практически из любого экрана
SAP
В открывшемся экране нажимаем New Recording (Новая запись)
Система откроет указанную транзакцию, где мы должны указать данные. По завершению
транзакции (когда сработает явный COMMIT), система выдаст данные для пакетного ввода с
именами программ, экранов и команд.
Эти данные дают нам возможность:
Выбрав режим E - система остановится только на тех экранах и полях, где будет какая-либо
ошибка; ошибка может быть связана как с логикой проверки бизнес-данных, так и с ошибками в
самом пакетном вводе (например, не предусмотрены данные для какого-либо экрана или
используется ошибочная команда).
Эти два режима пакетного ввода весьма полезны при отладки программы и понимании того,
почему пакетный ввод "отрабатывает не так, как от него ожидается".
В ABAP пакетный ввод может быть использован при помощи оператора CALL TRANSACTION using
bdc_data.
http://help-legacy.sap.com/abapdocu_70/en/ABAPCALL_TRANSACTION_SHORTREF.htm
https://help.sap.com/saphelp_erp60_sp/helpdata/en/fa/09715a543b11d1898e0000e8322d00/framese t.htm
В ABAP-коде нам нужно будет заполнить данные для пакетного ввода (которые мы получили на
шаге выше) и вызвать оператор CALL TRANSACTION с соответствующими параметрами
Более того, чтобы пошагово просмотреть выполнение пакетного ввода, вызываемого через
самописный ABAP-код нужно импользовать параметр opt-dismode. Этот параметр может
принимать значение E (режим только ошибок), A (видимый режим) и другие.
Клиентский код (Y|Z-код)
Существуют различные способы расширения системы. В каждом модуле развита своя концепция
ведения расширений (написание клиентского кода). Давайте рассмотрим самые популярные и
рекомендованные.
Замещения в модуле FI
http://sapland.ru/articles/stats/rabota-s-zamescheniyami-fi.html
http://sapland.ru/articles/stats/rabota-s-zamescheniyami-fi-chasti-2.html
FI_SUBSTITUTION_DOC
FI_SUBSTITUTION_HEADER
FI_SUBSTITUTION_ITEM
И проверить значение до и после. Таким образом будет понятно, стоит ли исследовать замещения FI
или дело в чем-то другом.
Замещения в модуле PS
Работа с расширениями в PS описана в нотах (и в связанных с ними нотах тоже есть полезная
информация):
https://launchpad.support.sap.com/#/notes/358473
https://launchpad.support.sap.com/#/notes/440186
Замещения в модуле CO
Надо также заметить, что работа с замещениями (по всем модулям и событиям), а также
Validation можно выполнить в транзакции GGB0 и GGB1.
1 https://wiki.scn.sap.com/wiki/display/ERPFI/Top+down+Distribution+explained+with+an+exampl
e
2 https://wiki.scn.sap.com/wiki/display/ERPFI/Troubleshooting+Guides+-+COPA
3 https://wiki.scn.sap.com/wiki/display/Community/Add+User-
Defined+Characteristics+to+Operating+Concern
4 https://launchpad.support.sap.com/#/notes/932912/E
(KEDR: Termination after table access)
5 https://wiki.scn.sap.com/wiki/display/ERPFI/How+to+analyze+derivation+analysis
6 https://wiki.scn.sap.com/wiki/display/ERPFI/Derivation
Customer Function
Customer Function - Это функциональный модуль, в котором есть Z-инклюд, в котором можно
писать код клиента.
Вызываются данные ФМ через оператор call customer-function (по этому оператору в программе
можно найти).
https://help.sap.com/http.svc/rc/abapdocu_751_index_htm/7.51/en-US/abapcall_customer-
function.htm
1 http://sapland.ru/articles/stats/upravlenie-proektami-rasshirenii-v-sistemah-tehnika-
customerexits-polizovatelisk.html
2 https://wiki.scn.sap.com/wiki/pages/viewpage.action?pageId=107774353
3 https://wiki.scn.sap.com/wiki/pages/viewpage.action?pageId=189893877
Чтобы найти возможные user-exit можно просто зайти в программу (например, SAPMV45A) и
обратить внимание на include, помеченные комментарием user-exit.
Перейдя в include двойным кликом - из описания можно понять зачем он предназначается.
Также мы можем определить, в каком месте вызывается данная подпрограмма (либо через поиск
либо просто поставить точку останова и прогнать операцию с объектом).
1 http://sapland.ru/articles/stats/userexits-polizovateliskie-podprogrammi.html
2 https://wiki.scn.sap.com/wiki/display/ERPLO/SD+User+exits
Формулы/предпосылки в SD/MM
При переносе новой формулы нужно не забывать помещать в запрос программу RV80HGEN.
(https://archive.sap.com/discussions/thread/118726)
Follow-up function in QM
Настройка модуля RCM является наиболее гибкой по моему мнение, которая вобрала в себя и BADI и
BTE и принципы ООП.
BADI
Как показывает практика у некоторых BADI есть какая-то специфика использования, о которой
можно узнать из sap note или sdn.sap.com.
1 http://sapland.ru/articles/stats/badi-tehnologiya-vnedreniya-biznes-rasshirenii-
dopolnenii.html
2 https://wiki.scn.sap.com/wiki/pages/viewpage.action?pageId=133758980
3 https://wiki.scn.sap.com/wiki/display/SRM/BAdI+-+general+information
4 https://wiki.scn.sap.com/wiki/display/ABAP/Find+a+BADI
5 https://wiki.scn.sap.com/wiki/display/ABAP/BAdI
6 https://wiki.scn.sap.com/wiki/display/ABAP/Document+on+BADI
7
Enhancements
1 http://sapland.ru/articles/stats/rasshireniya-sistemi-enhancement-framework-chasti-1.html
2 http://sapland.ru/articles/stats/rasshireniya-sistemi-enhancement-framework-chasti-2.html
3 https://wiki.scn.sap.com/wiki/display/ABAP/How+to+do+Explicit+Enhancement
4 https://wiki.scn.sap.com/wiki/display/ABAP/Enhancements+Types
5 http://sapland.ru/articles/spj/2008/1/Novaya_kontseptsiya_rasshirenii_kak_metod_sovershenstv
ovaniya_programm_SAP_bez_ih_modifikatsii.html
На селекционном экране мы можем задать параметры для отбора нужны результатов и запускаем
отчет. В моем случае, я запущу отчет на всех параметрах, так как трассировка была активирована
мною на непродолжительное время.
В транзакции SWETYPV мы можем посмотреть события WF, которые привязаны к этим событиям
объектов.
Также, чтобы найти место вызова WF можно поставить точку останова на функциональные модули
мы можем отображать результат "в столбик" и "в строчку" - регулируется с помощью кнопки
"Single-Column/Parallel" (в левом верхнем углу)
Сравнение между системами
Для сравнения версий между системами нам нужно: выбрать версию в текущей системе, нажать на
кнопку "REMOTE Comparison" (мы можем сравнивать не только активные версии)
Для сравнения версий и вообще программ между собой можно использовать транзакцию SE39
Система откроет текст программ: слева и справа; затем нажимаем кнопку "сравнить", и система
покажет места, где программы отличаются и совпадают.
Касательно сравнения версий смартформ
При создании смартформ у нас за кадром всегда создаётся определенный ФМ и нам нужно
сравнивать именно этот ФМ.
Этот способ позволяет открыть документ, запустить отчет с помощью SAP Logon на основе
команды из внешней программы.
Содержимое файла
Код
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
[System]
Name=SYSID
Description = System_Descrition
Client = 500
[User]
Name=USERNAME
Password=PW_14EC7E1AD3F538
Language = EN
[Function]
Title = SAP Easy Access
Command=SESSION_MANAGER
[Configuration]
WorkDir=C:\Users\[windows_username]\Documents\SAP\SAP GUI
[Options]
Reuse=1
В файле может быть различный набор параметров и одним из параметров может быть пароль
Password=PW_14EC7E1AD3F538
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
/SAPDMC/LSSCREEN-PROJECT=Z01
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
http://sapland.ru/articles/stats/2012/1/sozdanie-bistrogo-vvoda-parolya-v-sistemu-sap-erp-ecc-na-
storone-klienta.html
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
После создания ярлыка в SAP Logon мы можем его преобразовать до файлика с расширением .sap
и под редактировать, а также мы можем преобразовать его содержимое до уровня команды.
Для этого перетащим файлик из SAP Logon на рабочий стол или в другую папку.
1) Добавить пароль
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
3) Изменить свойство reuse – чтобы создавать новое соединение или наоборот не создавать
его.
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
Запустим ярлык дважды и убедимся, что параметр Z02 проставился в нужном поле
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
Для функционала как такового потребуется, скорее всего, больше, чем просто создать
один функциональный модуль.
Давайте посмотрим, как это может выглядеть (это не единственная возможная реализация,
естественно).
IF sy-subrc eq 0.
LOOP AT TABLESTRUCT ASSIGNING <fs_tabinfo>.
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
ENDIF.
SELECT *
from dd04t
INTO CORRESPONDING FIELDS OF TABLE lt_data_el_text
FOR ALL ENTRIES IN TABLESTRUCT[]
WHERE rollname = TABLESTRUCT-rollname
and ddlanguage = sy-langu
.
IF sy-subrc eq 0.
ENDIF.
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
CASE w_tab_wa-type_kind.
WHEN 'STRING'. w_typ = cl_abap_elemdescr=>get_string( ).
WHEN 'XSTRING'. w_typ = cl_abap_elemdescr=>get_xstring( ).
WHEN 'I'. w_typ = cl_abap_elemdescr=>get_i( ).
WHEN 'F'. w_typ = cl_abap_elemdescr=>get_f( ).
WHEN 'D'. w_typ = cl_abap_elemdescr=>get_d( ).
WHEN 'T'. w_typ = cl_abap_elemdescr=>get_t( ).
WHEN 'C'. w_typ = cl_abap_elemdescr=>get_c( p_length = w_tab_wa-
length ).
WHEN 'N'. w_typ = cl_abap_elemdescr=>get_n( p_length = w_tab_wa-
length ).
WHEN 'X'.
w_tab_wa-length = <fs_tabinfo>-INTLEN.
CASE <fs_tabinfo>-DATATYPE.
WHEN 'INT4'.
" w_typ = cl_abap_elemdescr=>get_n( p_length = w_tab_wa-length ).
w_typ = cl_abap_elemdescr=>get_i( ).
WHEN OTHERS.
w_typ = cl_abap_elemdescr=>get_x( p_length = w_tab_wa-length ).
ENDCASE.
WHEN 'P'.
TRY .
w_typ = cl_abap_elemdescr=>get_p( p_length = ( w_tab_wa-
length - w_tab_wa-DECIMALS )
p_decimals = w_tab_wa-
DECIMALS ).
CATCH CX_PARAMETER_INVALID_RANGE.
"w_typ = cl_abap_elemdescr=>DESCRIBE_BY_NAME( P_NAME = <fs_tabinfo
>-ROLLNAME ).
ENDTRY.
ENDCASE.
CLEAR la_comp.
la_comp-type = w_typ. "Field type
la_comp-name = w_tab_wa-name. "Field name ex: FIELD1
APPEND la_comp TO lt_tot_comp. "Add entry to component table
ENDLOOP.
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
SELECT (ftab)
INTO CORRESPONDING FIELDS OF TABLE <dyn_tab>
from (tablename)
UP TO N_RECORD ROWS
WHERE (CONDITION)
.
IF sy-subrc eq 0.
CLEAR ls_content.
"ENDIF.
ENDIF.
TABLECONTENT[] = TABLECONTENT[].
TABLESTRUCT[] = TABLESTRUCT[].
TABLESTEXT[] = TABLESTEXT[].
ENDFUNCTION.
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
theFunc.Exports("TABLENAME") = table_name
returnFunc = theFunc.Call
die_exception = theFunc.Exception
End Sub
Sub GetTableContent()
Dim functionCtrl As Object 'Function Control (Collective object)
Dim sapConnection As Object 'Connection object
Dim theFunc As Object 'Function object
Set functionCtrl = CreateObject("SAP.Functions")
Set sapConnection = functionCtrl.Connection
'
'Declaration
'
Dim linetab As Object
Dim TabDef As Object
Dim TabDefName As Object
Dim returnFunc As Boolean
Dim startzeil As Integer
Dim endcol As Integer
Dim table_name As String
Dim n_record As String
Dim n_fields As String
Dim where_condition As String
Dim start_char As Integer
Dim WriteCell As String
Dim Offset As Integer
'
'Logon with initial values
'
Worksheets(1).Select
Destination_System = ActiveSheet.Cells(11, 2).Value
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
startzeil = 1
returnFunc = theFunc.Call
die_exception = theFunc.Exception
If returnFunc = True Then
Set linetab = theFunc.Tables.Item("TABLECONTENT")
Set TabDef = theFunc.Tables.Item("TABLESTRUCT")
Set TabDefName = theFunc.Tables.Item("TABLESTEXT")
' Set linetab = theFunc.Imports.Item("CH_TABLECONTENT")
' Set TabDef = theFunc.Imports.Item("CH_TABLESTRUCT")
'Set TabDefName = theFunc.Imports.Item("CH_TABLESTEXT")
endcol = 0
Call display_header(TabDef, TabDefName, n_fields)
Call display_lines(table_name, linetab, TabDef, startzeil, endcol)
startzeil = endcol
Set customers = Nothing
Else
If die_exception = "NO_RECORD_FOUND" Then
Cells(startzeil, 1) = "No values exist for " + the_name
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
startzeil = startzeil + 1
Else
MsgBox "Error when accessing function in R/3 ! "
Exit Sub
End If
End If
'Close connection to R/3 !
'
functionCtrl.Connection.logoff
'
'Release the objects to free storage space
'
Set sapConnection = Nothing
Set functionCtrl = Nothing
j=1
For Each TabDef In table_def.Rows
Cells(1, j) = Trim(TabDef("FIELDNAME"))
j=j+1
Next
j=1
For Each TabDefName In table_name.Rows
Cells(2, j) = Trim(TabDefName("DDTEXT"))
j=j+1
Next
End Sub
Sub display_lines(TabName As String, ByRef line_table As Object, ByRef table_def As Object, start_zeil
As Integer, ByRef end_col As Integer)
'
'Display contents of customer table
'
bManyLines = False
If (bManyLines = False) Then
i=3
For Each Line In line_table.Rows
Offset = 1
j=1
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
Leng = Trim(TabDef("LENG"))
WriteCell = Mid(Trim(Line("LINE")), Offset, Leng)
Cells(i, j) = WriteCell
Offset = Offset + Leng
j=j+1
Next
i=i+1
Next
End If
end_col = i
End Sub
Проверяем так:
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
http://www.eclipse.org/mars/
Устанавливаем версию
http://www.eclipse.org/downloads/packages/release/Mars/2
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
https://www.sap-press.com/sap-gateway-and-odata_3904/
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
Ссылка
http://<host_name:port>/sap/opu/odata/IWFND/USERSERVICE/UserCollection
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
Метод TABSTRINGSET_GET_ENTITYSET
method TABSTRINGSET_GET_ENTITYSET.
data lv_tabname TYPE tabname VALUE 'DD03L'.
data lv_condition TYPE char100.
data lt_TABLECONTENT TYPE ZLSP_CHAR1250_T.
data lt_TABLESTRUCT TYPE LTR_T_DD03L.
data lt_TABLESTEXT TYPE BKK_TAB_DD03T.
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
IF lv_length gt 0.
lv_tabname = lv_tabname+6.
ENDIF.
lv_condition = lv_condition+5.
" BREAK-POINT.
IF lv_tabname is INITIAL.
else.
" lv_tabname = iv_entity_name.
ENDIF.
ENDIF.
endmethod.
UseFul links
Conver https://support.office.com/en-us/article/Split-text-into-different-columns-with-the-
t Text Convert-Text-to-Columns-Wizard-30b14928-5550-41f5-97ca-7a3e9c363ed7 to
Tab
Split http://www.exceltrick.com/formulas_macros/vba-split-function/
Functi
on
VBA
OData https://blogs.msdn.microsoft.com/marcelolr/2010/02/16/consuming-odata-with-office-
call in vba-part-i/
VBA https://blogs.msdn.microsoft.com/marcelolr/2010/02/17/consuming-odata-with-office-
vba-part-ii/
https://blogs.msdn.microsoft.com/marcelolr/2010/02/18/consuming-odata-with-office-
vba-part-iii-excel/
Itab to https://archive.sap.com/discussions/thread/3550748
JSON
Query http://stackoverflow.com/questions/28052391/odata-sap-gateway-about-query-with-filter-
with and-expand-simultaneously
$filter
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
Odta https://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/odata-
v4 in actions-and-functions
.Net
http://www.odata.org/documentation/odata-version-2-0/uri-conventions/
.net https://archive.sap.com/discussions/thread/1446750
.net https://archive.sap.com/discussions/thread/3578601
useful links:
https://blogs.sap.com/2012/08/22/sap-connectivity-with-ms-excel/
As it appears wdtlog.ocx file was missing from c:\Program Files\Common Files\SAP Shared\
https://wiki.scn.sap.com/wiki/display/Snippets/Example+-
+create+a+dynamic+internal+table
http://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/com.sap.nw.wpc.runtime.docs/libra
ry/abap/_abap/abap-code-
samples/Read%20Any%20SAP%20Table%20with%20Microsoft%20Excel.pdf
https://blogs.sap.com/2006/12/14/read-any-sap-tables-from-excel/
http://scn.sap.com/people/thomas.jung/blog/2004/09/09/receiving-e-mail-and-processing-it-with-
abap--version-610-and-higher
Далее в настройках транзакции SCOT необходимо сделать мэппинг адреса и класс обработчика.
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
Архитектура работы:
MS Exchange Server -> SAP ERP -> SAPconnect (SMTP Host) -> класс CL_SMTP_EXT_SAPCONNECT -
> класс ZCL_LSP000_MAIL_INBOUND.
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
ro_ref = unique_instance.
endmethod.
Класс ZCL_LSP000_MAIL_INBOUND, метод IF_INBOUND_EXIT_BCS~PROCESS_INBOUND
method IF_INBOUND_EXIT_BCS~PROCESS_INBOUND.
DATA: sender TYPE REF TO if_sender_bcs.
DATA: sender_addr TYPE string.
DATA: lo_reply TYPE REF TO cl_send_request_bcs .
DATA: li_document TYPE REF TO if_document_bcs,
l_subject TYPE so_obj_des,
ls_text TYPE soli,
lt_text TYPE soli_tab.
TRY.
**** init
CLEAR e_retcode.
CLEAR es_t100msg.
* Get a pointer to the reply email
object lo_reply = io_sreq->reply( ).
* send reply
CONCATENATE 'System Status for:'(s01)
sy-sysid
INTO l_subject
SEPARATED BY space.
"ENDIF.
ENDIF.
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
* system error
CATCH cx_os_object_not_found
cx_alert_recipient_unknown
cx_document_bcs
cx_send_req_bcs
cx_address_bcs.
TRY.
**** send reply
l_subject = 'Message could not be processed'.
**** build content for reply
ls_text = 'An internal system error occured!! Please send
the message again.'.
APPEND ls_text TO lt_text.
ls_text = 'If this error occurs again please call your sys
tem administrator.'.
APPEND ls_text TO lt_text.
endmethod.
Класс ZCL_LSP000_MAIL_INBOUND, метод SEND_REPLY
method SEND_REPLY.
* —————————————————————————————-
* send confirmation or error status mail
* —————————————————————————————-
data: lo_sender type ref to cl_sapuser_bcs,
ls_config type salrtsconf,
lo_reply_doc type ref to cl_document_bcs,
lo_alert_man type ref to cl_alert_manager,
lo_bcs type ref to cl_bcs,
l_rc type sy-subrc.
* set sender
" NOT
MAILER TRY .
lo_sender = cl_sapuser_bcs=>create( 'OLEGBASH' ).
CATCH cx_address_bcs.
ENDTRY.
* add sender
TRY .
call method io_reply->setu_sender
exporting
i_sender = lo_sender.
CATCH cx_send_req_bcs
cx_address_bcs
.
ENDTRY.
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
TRY .
lo_reply_doc = cl_document_bcs=>create_document( i_type = 'HTM'
i_text = it_content
i_subject = ip_subject ).
CATCH cx_send_req_bcs
cx_document_bcs
.
ENDTRY.
* set
document try.
io_reply->setu_document( lo_reply_doc ).
CATCH cx_send_req_bcs
cx_document_bcs
.
ENDTRY.
* no status messages
required try.
io_reply->setu_status_mail( 'N' ).
CATCH cx_send_req_bcs.
ENDTRY.
try.
io_reply->setu_requested_status( 'N' ).
CATCH cx_send_req_bcs.
ENDTRY.
* get facade
try.
lo_bcs = io_reply->getu_facade( ).
CATCH cx_send_req_bcs.
ENDTRY.
* set send immediately
flag try.
lo_bcs->set_send_immediately( 'X' ).
CATCH cx_send_req_bcs.
ENDTRY.
* send
try.
io_reply->release( ).
CATCH cx_send_req_bcs.
ENDTRY.
commit work.
endmethod.
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
- Открыть документы
- запускать отчеты
- запускать функции в отчетах.
Tcode: ZTLSP000_UNI_CODE
Report: ZLSP000_UNI_CODE
[показать функционал]
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
Но я решил пойти по пути создания файла для запуска (исполнения) и назвал его uni_file.
Uni file
Uni_file – Это xml файл который состоит из тэгов headerXX и LineYY, то есть из «общих,
обезличенных» тэгов заголовка и позиции (все тэги входят в общий тэг order).
Файл сам по себе может включать информацию о любом объекте; файл может быть небольшим
и большим по размеру.
В атрибутах этого узла содержится тип файла, который говорит о назначениях полей. Описание
(назначение и смысл каждого поля) может быть описана во внутренних таблицах SAP ERP, но это
не является обязательным условием для его обработки.
Класс ZCL_LSP000_UNI_FILE.
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
Это класс либо «выполняет» содержимое из файла, либо возвращает данные из uni_file во
внутренней таблице.
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
С помощью uni_file мы можем передать любое количество параметров в любую программу без
расширения экрана в SAP (в общем случае, редактирование ABAP-логики потребуется).
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
<Tag11>310325932</Tag11></Line></Order>
Получается, что мы можем передать любую информацию для выполнения любого действия в
системе, так как мы можем передать информацию для запуска любого отчета и любой
транзакции, включая параметр.
Получается, что мы получаем «универсальный запуск» = smartTcode
Теперь вернемся к обработке входящей почты.
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
Современные ERP-системы (или практически любые системы учета) способны генерировать email.
Таким образом, с помощью данного способа можно развернуть быстро и надежно
интеграционный обмен данными; и это обойдется в минимум затрат по деньгам, по усилиям и по
времени.
*http://sen.sap.com/people/thomas.jung/blog/2004/09/09/receiving-e-mail-
and-processing-it-with-abap--version-610-and-higher *И
*http://wiki.sen.sap.com/wiki/display/Snippets/Sample+Code+for+processing+In
bound+Ma+with+Adobe+Interactive+Forms
*" http://sen.sap.com/thread/756086
*И
*http://sen.sap.com/community/crm/blog/2005/10/02/inbound-mail-processing-
attach-files-to-opportunity
data binary_file TYPE xstring.
DATA : pdf_line TYPE solix . " SAPoffice: Binary data, length 255
DATA : nb_att(10) TYPE n. " Att(10) of type Numeric Text Fields
DATA : w_part TYPE int4 " Natural Number
, lv_strlen type i " Strlen of type Integers
, lv_char255 TYPE C LENGTH 255 " Char255 of type
, do_not_process TYPE C LENGTH 1 " Not_process of type
, lv_vbeln TYPE VBELN_VA " Sales Document
, lv_auart TYPE auart " Sales Document Type
, lv_vbe1n_tmp TYPE VBELN_VA " Sales Document
, lv_charl00 TYPE C LENGTH 100
, lv_char255_2 TYPE C LENGTH 255 " Char255_2 of type
, lv_char255_3 TYPE C LENGTH 255 " Char255_3 of type
.
FIELD-
SYMBOLS : <pdf_line> TYPE solix. " SAPoffice: Binary data, length 255
data ls_attachement_attributes TYPE BCSS_DBPA. " Attributes of a Documen
t Body Part
data attachement_attributes TYPE BCSS_DBPA. " Attributes of a Document
B ody Part
data: mail TYPE REF TO if_document_bcs " Document Interface for BCS
.
TRY .
* Get the email document that was sent.
mail = io_sreq->get_document( ).
* Get number of attachement in the mail
* If number is lower than 2 that means no attachement to the
mail nb_att = mail->get_body_part_count( ) - 1.
IF nb_att = 0.
"me->ADD_L0G( EXPORTING i_text255 = text-
214 ). else . " ELSE -> IF nb_att = 0
clear lv_char255_3.
lv_char255_3 = text-215.
" REPLACE all OCCURRENCES OF '$$$1' in lv_char255_3 with
nb_att. "me->ADD_LOG( EXPORTING i_text255 = lv_char255_3 ).
CLEAR w_part.
* Process each document
DO nb_att TIMES.
www.olegbash.ru
Content
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова s
Москва, 26 октября 2017
clear do_not_process.
w_part = sy-index + 1 .
" CLEAR xml_document .
" Get attachement attributes
" attachement_attributes =
ls_attachement_attributes = mail-
>get_body_part_attributes( im_part = w_part ).
MOVE-CORRESPONDING ls_attachement_attributes to
attachement_attributes.
IF attachement_attributes-doc_type IS INITIAL.
DATA w_pos TYPE i . " Pos of type
Integers FIND '.' IN
attachement_attributes-filename IN
CHARACTER MODE MATCH OFFSET w_pos. ADD 1
TO w_pos.
attachement_attributes-doc_type =
attachement_attributes-filename+w_pos.
ENDIF. " IF attachement_attributes-doc_type IS
INITIAL " Get the attachement