Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пособие авар.doc
Скачиваний:
62
Добавлен:
02.09.2019
Размер:
2.34 Mб
Скачать

Генерирование abap подпрограммы в runtime

Так же существует возможность в RUNTIME сгенерировать ABAP программу и вызвать из нее процедуру.

DATA:

PROGRAM_NAME LIKE SY-CPROG,

RESULT TYPE STRING,

S TYPE STRING,

S50(50),

LIN TYPE I,

STR(255),

SOURCE_TABLE LIKE TABLE OF STR.

STR = 'REPORT Z_TEMP_POOL_CHK. '.

APPEND STR TO SOURCE_TABLE.

APPEND 'TYPES: ZSF TYPE /BI0/OICS_TRN_GC.' TO SOURCE_TABLE.

APPEND 'FORM ZWRITE USING F TYPE ZSF CHANGING STR50.' TO SOURCE_TABLE. APPEND 'DATA:' TO SOURCE_TABLE. APPEND 'C50 TYPE CHAR50,' TO SOURCE_TABLE. APPEND 'C(1),' TO SOURCE_TABLE. APPEND 'I TYPE I,' TO SOURCE_TABLE. APPEND 'L TYPE I.' TO SOURCE_TABLE. APPEND 'STR50 = ''''.' TO SOURCE_TABLE. APPEND 'WRITE F DECIMALS 0 EXPONENT 0 NO-GAP LEFT-JUSTIFIED TO STR50.' TO SOURCE_TABLE. APPEND 'CONDENSE STR50 NO-GAPS.' TO SOURCE_TABLE. APPEND 'L = STRLEN( STR50 ).' TO SOURCE_TABLE. APPEND 'L = L - 1.' TO SOURCE_TABLE. APPEND 'C = STR50+L(1).' TO SOURCE_TABLE. APPEND 'IF C = ''-''.' TO SOURCE_TABLE. APPEND 'CONCATENATE ''-'' STR50+0(L) INTO STR50.' TO SOURCE_TABLE. APPEND 'ENDIF.' TO SOURCE_TABLE. APPEND 'C50 = STR50.' TO SOURCE_TABLE. APPEND 'STR50 = ''''.' TO SOURCE_TABLE. APPEND 'L = STRLEN( C50 ).' TO SOURCE_TABLE. APPEND 'I = 0.' TO SOURCE_TABLE. APPEND 'WHILE I < L.' TO SOURCE_TABLE. APPEND 'C = C50+I(1).' TO SOURCE_TABLE. APPEND 'IF C NE ''.''.' TO SOURCE_TABLE. APPEND 'CONCATENATE STR50 C INTO STR50.' TO SOURCE_TABLE. APPEND 'ENDIF.' TO SOURCE_TABLE. APPEND 'I = I + 1.' TO SOURCE_TABLE. APPEND 'ENDWHILE.' TO SOURCE_TABLE. APPEND 'ENDFORM.' TO SOURCE_TABLE.

GENERATE SUBROUTINE POOL SOURCE_TABLE NAME PROGRAM_NAME MESSAGE RESULT LINE LIN.

S = 'ZWRITE'.

PERFORM (S) IN PROGRAM (PROGRAM_NAME) USING '50.1' CHANGING S50.

Создание пользовательского средства поиска

Часто заказчик просит отфильтровать доступные значения признака, отображаемые по F4. Пример использования: на ABAP реализован отчет, отображающий статус загрузок данных в разрезе подразделений и месяцев. Необходимо ограничить отображаемые по F4 на экране выбора значения подразделений только теми, которые относятся к компании пользователя, запускающего отчет. Сделать это можно путем создания пользовательского средства поиска.

Это делается в транзакции SE11.

Рисунок 56

В параметрах средства поиска указываем поля, отображаемые на экране справки по вводу. Напротив поля, значение которого должно подставляться, устанавливаем галку в столбце «EXP». Функция ZS_F4IF_SHLP_EXIT_SFORM реализует механизм вывода значений. Её исходный текст приведен ниже:

FUNCTION ZS_F4IF_SHLP_EXIT_SFORM.

*"----------------------------------------------------------------------

*"*"Локальный интерфейс:

*" TABLES

*" SHLP_TAB TYPE SHLP_DESCT

*" RECORD_TAB STRUCTURE SEAHLPRES

*" CHANGING

*" VALUE(SHLP) TYPE SHLP_DESCR

*" VALUE(CALLCONTROL) LIKE DDSHF4CTRL STRUCTURE DDSHF4CTRL

*"----------------------------------------------------------------------

IF CALLCONTROL-STEP = 'SELECT'.

DATA:

LI_SFORM TYPE /BIC/OISFORM,

LT_SFORM TYPE TABLE OF ZSFORMT,

LS_SFORM TYPE ZSFORMT,

L_SFORM TYPE /BIC/TSFORM,

L_SFORMSET TYPE /BIC/OISFORMSET.

DATA:

LT_TSF TYPE TABLE OF /BIC/TSFORM,

LS_TSF TYPE /BIC/TSFORM,

LT_IT TYPE DDSHIFACES,

LS_IT TYPE LINE OF DDSHIFACES.

DATA:

BEGIN OF LS_RES,

/BIC/SFORM TYPE /BIC/TSFORM-/BIC/SFORM,

/BIC/SFORMSET TYPE /BIC/PSFORM-/BIC/SFORMSET,

TXTLG TYPE /BIC/TSFORM-TXTLG,

END OF LS_RES,

LT_RES LIKE TABLE OF LS_RES.

* LT_IT[] = SHLP-INTERFACE[].

* READ TABLE LT_IT INTO LS_IT WITH KEY SHLPFIELD = 'SFORMSET'.

* IF SY-SUBRC IS INITIAL.

* L_SFORMSET = LS_IT-VALUE.

* ENDIF.

CLEAR: L_SFORMSET, LI_SFORM.

GET PARAMETER ID 'SFORMSET' FIELD L_SFORMSET.

IF L_SFORMSET IS INITIAL.

GET PARAMETER ID 'SFORM' FIELD LI_SFORM.

IF LI_SFORM IS NOT INITIAL.

SELECT SINGLE /BIC/SFORMSET FROM /BIC/PSFORM INTO L_SFORMSET WHERE

/BIC/SFORM = LI_SFORM AND

OBJVERS = 'A'.

ENDIF.

ENDIF.

IF L_SFORMSET IS NOT INITIAL.

SELECT /BIC/SFORM /BIC/SFORMSET INTO CORRESPONDING FIELDS OF TABLE LT_RES

FROM /BIC/PSFORM

WHERE

OBJVERS = 'A' AND

/BIC/SFORMSET = L_SFORMSET.

ELSE.

SELECT /BIC/SFORM /BIC/SFORMSET INTO CORRESPONDING FIELDS OF TABLE LT_RES

FROM /BIC/PSFORM

WHERE

OBJVERS = 'A'.

ENDIF.

SELECT * FROM /BIC/TSFORM INTO TABLE LT_TSF WHERE

DATETO >= SY-DATUM AND

DATEFROM <= SY-DATUM.

LOOP AT LT_RES INTO LS_RES.

READ TABLE LT_TSF INTO LS_TSF WITH KEY /BIC/SFORM = LS_RES-/BIC/SFORM LANGU = SY-LANGU.

IF SY-SUBRC IS INITIAL.

LS_RES-TXTLG = LS_TSF-TXTLG.

MODIFY LT_RES FROM LS_RES.

ENDIF.

ENDLOOP.

LOOP AT LT_RES INTO LS_RES.

LS_SFORM-SFORM = LS_RES-/BIC/SFORM.

LS_SFORM-TXTLG = LS_RES-TXTLG.

APPEND LS_SFORM TO LT_SFORM.

ENDLOOP.

CALL FUNCTION 'F4UT_RESULTS_MAP'

EXPORTING

SOURCE_STRUCTURE = 'ZSFORMT'

APPLY_RESTRICTIONS = 'X'

TABLES

SHLP_TAB = SHLP_TAB

RECORD_TAB = RECORD_TAB

SOURCE_TAB = LT_SFORM

CHANGING

SHLP = SHLP

CALLCONTROL = CALLCONTROL

EXCEPTIONS

ILLEGAL_STRUCTURE = 1

OTHERS = 2.

CALL FUNCTION 'F4UT_OPTIMIZE_COLWIDTH'

EXPORTING

PARAMETER_OPTIMIZE = 'SFORM'

TABLES

SHLP_TAB = SHLP_TAB

RECORD_TAB = RECORD_TAB

CHANGING

SHLP = SHLP

CALLCONTROL = CALLCONTROL.

IF SY-SUBRC IS INITIAL.

CALLCONTROL-STEP = 'DISP'.

ELSE.

EXIT.

ENDIF.

EXIT. "Don't process STEP DISP additionally in this call.

ENDIF.

ENDFUNCTION.