Использование системных команд UNIX в ABAP

Зачастую есть потребность вызывать команды операционной системы из ABAP. Это бывает крайне удобно. К примеру, в ситуации когда необходимо, склеить вместе несколько файлов, перенести файлы на уровне Ф.С. и.т.д.
Здесь будет расмотрен именно этот пример.

Шаг 1
Определить поля для команд:

  1. " для UNIX команд
  2. DATA: command(2000). " для коротких команд в одну строку
  3. DATA: BEGIN OF tabl OCCURS 0, " а сюда можно записать целый скрипт
  4. line(2000),
  5. END OF tabl.

Шаг 2
Записать саму команду:

  1. CONCATENATE 'chmod 777' fullpath2 INTO command SEPARATED BY SPACE.
  2. * где fullpath2 - путь до директории \ файла.
  3. CONDENSE command. " убрать в команде ведущие и последующие пробелы. в.ч. no-gaps
  4. * выполнить команду в ОС
  5. CALL 'SYSTEM' ID 'COMMAND' FIELD command
  6. ID 'TAB' FIELD tabl-*sys*.

Собственно говоря все. Можно выполнять подобным образом любые UNIX команды
Ниже приведен пример программы, которая писалась для Проекта XXXX XXX

Суть программы в том, чтобы консолидировать множество, подобных файлов (сходство по маске)
В один. перемещать их в нужный каталог. Старые файлы тоже перемещать, задавать нужные права итд
Код ниже:

  1. *&---------------------------------------------------------------------*
  2. *& Report ZTST
  3. *&
  4. *&---------------------------------------------------------------------*
  5. *&
  6. *&
  7. *&---------------------------------------------------------------------*
  8.  
  9. REPORT ZTST.
  10.  
  11. PARAMETERS maskin(64) default 'NI11TRUD********'.
  12. PARAMETERS fldrep(64) default 'OLD'.
  13.  
  14. data: fullpath type string,
  15. fullpath2 type string,
  16. FullpathR TYPE string,
  17. FullpathR2 TYPE string,
  18. fn(64),
  19. mask like EPSF-EPSFILNAM,
  20. dl like EPSFILI OCCURS 0 WITH HEADER LINE.
  21. DATA: p_file(128).
  22. " для UNIX команд
  23. DATA: command(2000).
  24. DATA: BEGIN OF tabl OCCURS 0,
  25. line(2000),
  26. END OF tabl.
  27. *if maskin eq 'NI11TRUD'.
  28. * mask = 'NI11TRUD********.csv'.
  29. *ELSEIF maskin eq 'NI01_1'.
  30. *mask = 'NI01_1********.csv'.
  31. * ELSEIF maskin eq 'NI01_2'.
  32. * mask = 'NI01_2******.csv'.
  33. * ELSE.
  34. * mask = ''.
  35. * ENDIF.
  36. mask = maskin.
  37.  
  38. " получаем список файлов
  39. CALL FUNCTION 'EPS_GET_DIRECTORY_LISTING'
  40.  
  41. EXPORTING
  42. DIR_NAME = '/usr/sap/DBW/DVEBMGS00/work/Kons/RNCP'
  43. FILE_MASK = mask
  44. * IMPORTING
  45. * DIR_NAME =
  46. * FILE_COUNTER =
  47. * ERROR_COUNTER =
  48. DIR_LIST = dl
  49. EXCEPTIONS
  50. * INVALID_EPS_SUBDIR = 1
  51. * SAPGPARAM_FAILED = 2
  52. * BUILD_DIRECTORY_FAILED = 3
  53. * NO_AUTHORIZATION = 4
  54. * READ_DIRECTORY_FAILED = 5
  55. * TOO_MANY_READ_ERRORS = 6
  56. EMPTY_DIRECTORY_LIST = 7
  57. * OTHERS = 8
  58.  
  59. .
  60. IF SY-SUBRC <> 0.
  61. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
  62. WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  63.  
  64. loop at dl.
  65. * собираем пути к файлам. разделитеть - пробел
  66. CONCATENATE fullpath '/usr/sap/DBW/DVEBMGS00/work/Kons/RNCP/' dl-NAME INTO fullpath.
  67. CONCATENATE fullpath ' ' INTO fullpath SEPARATED BY SPACE.
  68. "command = 'cat /tmp/file1.txt /tmp/file2.txt /tmp/file3.txt > /tmp/file4.txt'.
  69. * ставим на все файлы которые будем клеить права 777 дабы избежать нюансов
  70. CONCATENATE '/usr/sap/DBW/DVEBMGS00/work/Kons/RNCP/' dl-NAME INTO fullpath2.
  71. CONCATENATE 'chmod 777' fullpath2 INTO command SEPARATED BY SPACE.
  72. CONDENSE command.
  73. CALL 'SYSTEM' ID 'COMMAND' FIELD command
  74. ID 'TAB' FIELD tabl-*sys*.
  75. *write command.
  76.  
  77. *fn = maskin.
  78. CONCATENATE maskin 'con.csv' INTO fn.
  79. * если файл есть, то сначала, удалить его
  80. *p_file = '/usr/sap/DBW/DVEBMGS00/work/Kons/RNCP/con/con.csv'.
  81. CONCATENATE '/usr/sap/DBW/DVEBMGS00/work/Kons/RNCP/con/' fn INTO p_file.
  82. OPEN DATASET p_file FOR INPUT in BINARY MODE.
  83. IF sy-subrc NE 0.
  84. "MESSAGE e899(bd) WITH p_file 'DOES NOT EXIST'.
  85. "EXIT.
  86. DELETE DATASET p_file.
  87. CLOSE DATASET p_file.
  88.  
  89. * UNIX команды
  90. * конкантинация. сортируем. собираем уникальный строки
  91. CONCATENATE 'cat' fullpath '| sort | uniq >' p_file INTO command SEPARATED BY SPACE.
  92. *CONCATENATE 'cat' fullpath '| uniq > /usr/sap/DBW/DVEBMGS00/work/Kons/RNCP/con/con.csv' INTO command SEPARATED BY SPACE.
  93. CONDENSE command.
  94. CALL 'SYSTEM' ID 'COMMAND' FIELD command
  95. ID 'TAB' FIELD tabl-*sys*.
  96. * изменяем права
  97. CONCATENATE 'chmod 777' p_file INTO command SEPARATED BY SPACE.
  98. CONDENSE command.
  99. CALL 'SYSTEM' ID 'COMMAND' FIELD command
  100. ID 'TAB' FIELD tabl-*sys*.
  101. * изменяем владельца
  102. CONCATENATE 'chown kons' p_file INTO command SEPARATED BY SPACE.
  103. CONDENSE command.
  104. CALL 'SYSTEM' ID 'COMMAND' FIELD command
  105. ID 'TAB' FIELD tabl-*sys*.
  106. * изменяем группу
  107. CONCATENATE 'chown :users' p_file INTO command SEPARATED BY SPACE.
  108. CONDENSE command.
  109. CALL 'SYSTEM' ID 'COMMAND' FIELD command
  110. ID 'TAB' FIELD tabl-*sys*.
  111.  
  112. * создать папку куда переместим обработанные файлы
  113. CONCATENATE 'mkdir /usr/sap/DBW/DVEBMGS00/work/Kons/RNCP/' fldrep INTO command.
  114. CONDENSE command.
  115. CALL 'SYSTEM' ID 'COMMAND' FIELD command
  116. ID 'TAB' FIELD tabl-*sys*.
  117.  
  118. * изменяем владельца
  119. CONCATENATE 'chown kons /usr/sap/DBW/DVEBMGS00/work/Kons/RNCP/' fldrep INTO command.
  120. CONDENSE command.
  121. CALL 'SYSTEM' ID 'COMMAND' FIELD command
  122. ID 'TAB' FIELD tabl-*sys*.
  123. * изменяем группу
  124. CONCATENATE 'chown :users /usr/sap/DBW/DVEBMGS00/work/Kons/RNCP/' fldrep INTO command.
  125. CONDENSE command.
  126. CALL 'SYSTEM' ID 'COMMAND' FIELD command
  127. ID 'TAB' FIELD tabl-*sys*.
  128.  
  129.  
  130. * утановим на нее права
  131. CONCATENATE 'chmod 777 /usr/sap/DBW/DVEBMGS00/work/Kons/RNCP/' fldrep INTO command.
  132. CONDENSE command.
  133. CALL 'SYSTEM' ID 'COMMAND' FIELD command
  134. ID 'TAB' FIELD tabl-*sys*.
  135. *перемещаем туда файлы.
  136. loop at dl.
  137. CONCATENATE '/usr/sap/DBW/DVEBMGS00/work/Kons/RNCP/' dl-NAME INTO FullpathR.
  138. CONCATENATE '/usr/sap/DBW/DVEBMGS00/work/Kons/RNCP/' fldrep INTO FullpathR2.
  139. CONCATENATE 'mv ' FullpathR FullpathR2 INTO command SEPARATED BY SPACE.
  140. CONDENSE command.
  141. CALL 'SYSTEM' ID 'COMMAND' FIELD command
  142. ID 'TAB' FIELD tabl-*sys*.
  143. *write command.

Комментарии