Код программы:
TABLES: BKPF, Z00AVIZO, Z00AVIZOP.
DATA: AVSR TYPE P, AVSR_2 TYPE C, OTV(1), PEREM(10) TYPE C,
MSG LIKE BDCMSGCOLL OCCURS 10 WITH HEADER LINE,
X1(10) TYPE C, X2(16) TYPE C, X3(16) TYPE C, X4(16) TYPE C,
X5(16) TYPE C, X6(16) TYPE C.
TYPE-POOLS: SLIS.
DATA:
T_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
T_SORT TYPE SLIS_T_SORTINFO_ALV,
L_LAYOUT TYPE SLIS_LAYOUT_ALV,
L_SEL_H TYPE SLIS_SEL_HIDE_ALV,
T_EVENTS TYPE SLIS_T_EVENT,
GX_VARIANT LIKE DISVARIANT,
G_SAVE(1) TYPE C,
G_EXIT(1) TYPE C,
G_VARIANT LIKE DISVARIANT,
G_PRINT TYPE SLIS_PRINT_ALV,
G_REPID LIKE SY-REPID.
DATA: BEGIN OF AVS OCCURS 50,
BUKRS LIKE BKPF-BUKRS,
BELNR LIKE BKPF-BELNR, "№ бух док-та
AVZNR(10) TYPE C, "№ док-та авизо
GJAHR LIKE Z00AVIZOP-GJAHR, "Фин год
MONAT LIKE BKPF-MONAT, "Период проводки
DEL LIKE Z00AVIZO-DEL, "Признак удаления авизо
XBLNR LIKE BKPF-XBLNR, "Старый № ссылки
NEW LIKE BKPF-XBLNR, "Новый № ссылки
XBLNR_2 LIKE BKPF-XBLNR,
AVZNR_N(10) TYPE C,
CH(1),
END OF AVS.
SELECTION-SCREEN BEGIN OF BLOCK CARR WITH FRAME TITLE TEXT-SER.
PARAMETERS: PBUKRS LIKE BKPF-BUKRS DEFAULT '6002'
MEMORY ID BUK OBLIGATORY.
SELECT-OPTIONS: PMONAT FOR BKPF-MONAT DEFAULT '1' TO '12'
OBLIGATORY NO-EXTENSION.
PARAMETERS: PGJAHR LIKE BKPF-GJAHR DEFAULT SY-DATUM(4)
MEMORY ID BUK OBLIGATORY.
SELECTION-SCREEN END OF BLOCK CARR.
INITIALIZATION.
AT SELECTION-SCREEN ON PMONAT.
IF PMONAT-LOW > 12 OR PMONAT-HIGH > 12.
MESSAGE E014 WITH 'Значение периода должно быть не больше 12.'.
ENDIF.
START-OF-SELECTION.
SELECT A~AVZNR A~BELNR A~BUKRS B~DEL B~GJAHR B~MONAT
INTO CORRESPONDING FIELDS OF TABLE AVS
FROM Z00AVIZOP AS A
INNER JOIN Z00AVIZO AS B
ON A~AVZNR = B~AVZNR AND A~GJAHR = B~GJAHR
WHERE A~BUKRS = PBUKRS AND B~GJAHR = PGJAHR
AND B~MONAT IN PMONAT.
* and b~del = space.
SORT AVS BY MONAT BELNR AVZNR.
LOOP AT AVS.
SELECT SINGLE XBLNR FROM BKPF INTO AVS-XBLNR
WHERE BELNR = AVS-BELNR AND BUKRS = PBUKRS
AND GJAHR = AVS-GJAHR.
MOVE AVS-XBLNR TO AVS-XBLNR_2.
*убираем нули и сдвигаем поле влево
AVSR = AVS-AVZNR.
AVS-AVZNR = AVSR.
SHIFT AVS-AVZNR LEFT DELETING LEADING SPACE.
*авизо удалено и есть в ссылке
IF AVS-DEL = 'X' AND AVS-XBLNR CS AVS-AVZNR.
PEREM = AVS-AVZNR.
SHIFT PEREM LEFT DELETING LEADING SPACE.
ENDIF.
SEARCH AVS-XBLNR FOR PEREM.
IF SY-SUBRC = 0.
SPLIT AVS-XBLNR AT ' ' INTO X1 X2 X3 X4 X5 X6.
CONCATENATE X2 X3 X4 X5 X6
INTO AVS-XBLNR
SEPARATED BY ' '.
SHIFT AVS-XBLNR LEFT DELETING LEADING SPACE.
ELSE.
ENDIF.
MODIFY AVS.
*авизо не удалено и в ссылке его нет
IF AVS-DEL = SPACE.
SEARCH AVS-XBLNR FOR AVS-AVZNR.
IF SY-SUBRC = 0.
ELSE.
SHIFT AVS-XBLNR LEFT DELETING LEADING SPACE.
CONCATENATE AVS-AVZNR AVS-XBLNR
INTO AVS-NEW
SEPARATED BY ' '.
ENDIF.
ENDIF.
AVS-CH = 'X'.
MODIFY AVS.
ENDLOOP.
*удаляем лишние строки из таблицы
DELETE AVS WHERE NEW = SPACE.
DELETE ADJACENT DUPLICATES FROM AVS
COMPARING BELNR AVZNR.
PERFORM ALV_LIST.
*&---------------------------------------------------------------------*
*& Form ALV_LIST
*&---------------------------------------------------------------------*
FORM ALV_LIST.
CLEAR AVS.
G_REPID = SY-REPID.
PERFORM PRL_FIELDCAT .
PERFORM PRL_LAYOUT CHANGING L_LAYOUT.
PERFORM FILL_SORT CHANGING T_SORT.
PERFORM PRL_SEL_H CHANGING L_SEL_H.
PERFORM PRL_EVENTS CHANGING T_EVENTS.
PERFORM PRL_VARIANT CHANGING G_VARIANT.
PERFORM PRINT_BUILD USING G_PRINT.
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = G_REPID
I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
I_STRUCTURE_NAME = 'AVS'
IS_LAYOUT = L_LAYOUT
IT_FIELDCAT = T_FIELDCAT
IT_SORT = T_SORT
IS_SEL_HIDE = L_SEL_H
IT_EVENTS = T_EVENTS
IS_VARIANT = G_VARIANT
I_DEFAULT = 'X'
I_SAVE = 'A'
IS_PRINT = G_PRINT
TABLES
T_OUTTAB = AVS
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
ENDFORM. " ALV_LIST
*---------------------------------------------------------------------*
FORM USER_COMMAND USING U_UCOMM LIKE SY-UCOMM
SELFIELD TYPE SLIS_SELFIELD.
CASE U_UCOMM.
WHEN 'S_XBN'.
CALL FUNCTION 'POPUP_TO_DECIDE'
EXPORTING
TEXTLINE1 = 'Изменить исходные данные?'
* textline2 = ' '
TEXT_OPTION1 = 'Да'
TEXT_OPTION2 = 'Нет'
TITEL = 'Изменение поля ссылки'
CANCEL_DISPLAY = ' '
IMPORTING
ANSWER = OTV
EXCEPTIONS
OTHERS = 1.
*изменяем данные
IF OTV = 1.
PERFORM CREATE_CH.
* PERFORM ALV_LIST.
.
ELSE.
ENDIF.
ENDCASE.
ENDFORM.
*---------------------------------------------------------------------*
FORM FILL_SORT CHANGING C_T_SORT TYPE SLIS_T_SORTINFO_ALV.
ENDFORM. " FILL_SORT
*---------------------------------------------------------------------*
FORM PRL_EVENTS CHANGING L_EVENTS TYPE SLIS_T_EVENT.
DATA: L_EVENTS_C LIKE LINE OF L_EVENTS.
L_EVENTS_C-NAME = 'TOP_OF_PAGE'.
L_EVENTS_C-FORM = 'TOP_OF_PAGE'.
APPEND L_EVENTS_C TO L_EVENTS.
ENDFORM.
*---------------------------------------------------------------------*
* FORM TOP_OF_PAGE *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM TOP_OF_PAGE.
NEW-LINE NO-SCROLLING.
FORMAT COLOR COL_BACKGROUND INTENSIFIED OFF.
WRITE: SY-DATUM, SY-UZEIT.
NEW-LINE SCROLLING.
ENDFORM. " PRINT_BUILD
*---------------------------------------------------------------------*
FORM PRL_FIELDCAT.
DATA: STR_FIELDCAT LIKE LINE OF T_FIELDCAT,
N_POS TYPE I.
CLEAR STR_FIELDCAT.
N_POS = N_POS + 1.
STR_FIELDCAT-COL_POS = N_POS.
STR_FIELDCAT-SELTEXT_L = 'Период'.
STR_FIELDCAT-FIELDNAME = 'MONAT'.
STR_FIELDCAT-OUTPUTLEN = 6.
STR_FIELDCAT-DO_SUM = 'X'.
APPEND STR_FIELDCAT TO T_FIELDCAT.
CLEAR STR_FIELDCAT.
N_POS = N_POS + 1.
STR_FIELDCAT-COL_POS = N_POS.
STR_FIELDCAT-SELTEXT_L = 'Номер бух.док-та'.
STR_FIELDCAT-FIELDNAME = 'BELNR'.
STR_FIELDCAT-OUTPUTLEN = 16.
STR_FIELDCAT-DO_SUM = 'X'.
APPEND STR_FIELDCAT TO T_FIELDCAT.
CLEAR STR_FIELDCAT.
N_POS = N_POS + 1.
STR_FIELDCAT-COL_POS = N_POS.
STR_FIELDCAT-SELTEXT_L = 'Старый ссыл.номер'.
STR_FIELDCAT-FIELDNAME = 'XBLNR_2'.
STR_FIELDCAT-OUTPUTLEN = 17.
APPEND STR_FIELDCAT TO T_FIELDCAT.
CLEAR STR_FIELDCAT.
N_POS = N_POS + 1.
STR_FIELDCAT-COL_POS = N_POS.
STR_FIELDCAT-SELTEXT_L = 'Новый ссыл.номер'.
STR_FIELDCAT-FIELDNAME = 'NEW'.
STR_FIELDCAT-OUTPUTLEN = 16 .
STR_FIELDCAT-DO_SUM = 'X'.
APPEND STR_FIELDCAT TO T_FIELDCAT.
ENDFORM. " PRL_FIELDCAT
*---------------------------------------------------------------------*
FORM PRL_LAYOUT CHANGING P_L_LAYOUT.
L_LAYOUT-MIN_LINESIZE = 200.
L_LAYOUT-MAX_LINESIZE = 10000.
L_LAYOUT-BOX_FIELDNAME = 'CH'.
ENDFORM. " PRL_LAYOUT
*---------------------------------------------------------------------*
FORM PRL_SEL_H CHANGING L_SEL_H TYPE SLIS_SEL_HIDE_ALV.
DATA: LH_ENTRIES LIKE LINE OF L_SEL_H-T_ENTRIES.
L_SEL_H-MODE = 'C'. "(R)eplace or (C)hange
LH_ENTRIES-MODE = 'D'. "(D)elete (A)dd
LH_ENTRIES-SELNAME = 'P_STAMM'.
APPEND LH_ENTRIES TO L_SEL_H-T_ENTRIES.
ENDFORM. " PRL_SEL_H
*----------------------------------------------------------------------*
FORM PRL_VARIANT CHANGING G_VARIANT LIKE DISVARIANT.
G_VARIANT-REPORT = SY-REPID.
ENDFORM. " PRL_VARIANT
*----------------------------------------------------------------------*
FORM PRINT_BUILD USING G_PRINT TYPE SLIS_PRINT_ALV.
G_PRINT-NO_PRINT_LISTINFOS = 'X'.
ENDFORM. " PRINT_BUILD
*----------------------------------------------------------------------*
FORM PF_STATUS_SET USING EXTAB TYPE SLIS_T_EXTAB.
SET TITLEBAR 'S_AVS' WITH PBUKRS.
SET PF-STATUS 'STANDARD1' EXCLUDING EXTAB.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CREATE_CH
*&---------------------------------------------------------------------*
FORM CREATE_CH.
LOOP AT AVS WHERE CH = 'X'.
CLEAR: BDC, MSG. REFRESH: BDC, MSG.
PERFORM BDC_INS USING: 'X' 'SAPMF05L' '0100',
' ' 'RF05L-BELNR' AVS-BELNR,
' ' 'RF05L-BUKRS' AVS-BUKRS,
' ' 'RF05L-GJAHR' AVS-GJAHR,
' ' 'BDC_OKCODE' '/00'.
PERFORM BDC_INS USING: 'X' 'SAPMF05L' '0700',
' ' 'BDC_OKCODE' '=VK'.
PERFORM BDC_INS USING: 'X' 'SAPMF05L' '1710',
' ' 'BKPF-XBLNR' AVS-NEW,
' ' 'BDC_OKCODE' '=ENTR'.
PERFORM BDC_INS USING: 'X' 'SAPMF05L' '0700',
' ' 'BDC_OKCODE' '=AE'.
CALL TRANSACTION 'FB02' USING BDC MODE 'N' UPDATE 'S'
MESSAGES INTO MSG.
ENDLOOP.
* read table msg with key msgid = 'F5' msgnr = '312'.
IF SY-SUBRC NE 0.
MESSAGE S998.
ELSE.
MESSAGE W999.
ENDIF.
ENDFORM.
|
|