类参数:
T_TABLEImportingTypeTABLE
T_FIELD_DUPLImportingTypeABAP_SORTORDER_TAB
DY_TABLEExportingType Ref ToDATA
T_FIELD_VALUEExportingTypeTY_T_DUPL
DL_TABLEExportingType Ref ToDATA
用到的一个类型:
types:
BEGIN OF TY_W_DUPL ,
GROUP TYPE I,
FIELD TYPE FIELDNAME,
VALUE TYPE CHAR50,
TIMES TYPE I,
END OF TY_W_DUPL .
types:
TY_T_DUPL TYPE TABLE OF TY_W_DUPL INITIAL SIZE 0 .
类方法 :
METHOD CHECK_DUPLICATE_DATA.
FIELD-SYMBOLS:<DYN_TABLE_DUPL> TYPE STANDARD TABLE, "重复项的动态表内指针
<DYN_TABLE_DUPL2> TYPE STANDARD TABLE,
<DYN_WA> TYPE ANY,
<DYN_WA_DUPL> TYPE ANY,
<DYN_WA_DUPL2> TYPE ANY,
<DYN_FIELD_DUPL> TYPE ANY,
<DYN_FIELD_DUPL2> TYPE ANY,
<DYN_FIELD> TYPE ANY.
DATA: DY_LINE TYPE REF TO DATA, "重复项的动态内表行
WA_NEW_LINE TYPE REF TO DATA,
IT_STRUCTURE TYPE LVC_T_FCAT, "用于生成动态内表的结构表
WA_STRUCTURE TYPE LVC_S_FCAT, "用于生成动态内表的工作区
IT2_STRUCTURE TYPE LVC_T_FCAT, "用于生成动态内表的结构表
WA2_STRUCTURE TYPE LVC_S_FCAT. "用于生成动态内表的工作区
DATA: W_FIELD_DUPL LIKE LINE OF T_FIELD_DUPL,
W_FIELD_VALUE LIKE LINE OF T_FIELD_VALUE.
DATA: I_GROUP TYPE I VALUE 0. "用于对重复行进行分组
* 以下声明的变量用于从动态内表的工作区中取表结构
DATA: DESCR_REF TYPE REF TO CL_ABAP_STRUCTDESCR,
tab type REF TO cl_abap_tabledescr,
comp_tab type cl_abap_structdescr=>component_table,
WA_COMP LIKE LINE OF COMP_TAB.
FIELD-SYMBOLS: <COMP_WA> TYPE ABAP_COMPDESCR,
<COMP_FIELD> TYPE ANY.
FIELD-SYMBOLS: <DL_TABLE> TYPE TABLE.
DATA: TEXT TYPE STRING.
DATA: DY_TABLE2 TYPE REF TO DATA,
DY_LINE2 TYPE REF TO DATA .
*& 建立并分配指向检查表的工作区
CREATE DATA WA_NEW_LINE LIKE LINE OF T_TABLE .
ASSIGN WA_NEW_LINE->* TO <DYN_WA>.
*& 获取工作区的结构类
DESCR_REF ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( <DYN_WA> ).
*& 循环并检查传递进来的要检查的重复字段
LOOP AT T_FIELD_DUPL INTO W_FIELD_DUPL.
CLEAR: WA_STRUCTURE.
TEXT = W_FIELD_DUPL-NAME. "字段文本
READ TABLE DESCR_REF->COMPONENTS ASSIGNING <COMP_WA> WITH KEY NAME = W_FIELD_DUPL-NAME.
* 检查字段是否在表中存在
IF SY-SUBRC = 0.
* 检查字段类型
IF <COMP_WA>-TYPE_KIND = 'I ' OR <COMP_WA>-TYPE_KIND = 'P' OR <COMP_WA>-TYPE_KIND = 'F'.
RAISE EXCEPTION TYPE CX_SALV_METHOD_NOT_SUPPORTED
EXPORTING CLASS = 'ZCL_CYZ001'
METHOD = 'CHECK_DUPLICATE_DATA'
OBJECT = 'STATIC METHOD'
KEY = '方法不支持I, P, F 类型的重复检查字段.'.
ELSE.
WA_STRUCTURE-FIELDNAME = W_FIELD_DUPL-NAME.
WA_STRUCTURE-INTTYPE = <COMP_WA>-TYPE_KIND.
WA_STRUCTURE-INTLEN = <COMP_WA>-LENGTH.
WA_STRUCTURE-DECIMALS = <COMP_WA>-DECIMALS.
APPEND WA_STRUCTURE TO IT_STRUCTURE.
ENDIF.
ELSE.
CONCATENATE '在传递的内表中不存在字段:' TEXT INTO TEXT.
RAISE EXCEPTION TYPE CX_SALV_METHOD_NOT_SUPPORTED
EXPORTING CLASS = 'ZCL_CYZ001'
METHOD = 'CHECK_DUPLICATE_DATA'
OBJECT = 'STATIC METHOD'
KEY = TEXT.
ENDIF.
ENDLOOP.
CLEAR WA_STRUCTURE.
"重复次数字段
WA_STRUCTURE-FIELDNAME = 'TIMES'.
WA_STRUCTURE-INTTYPE = 'I'.
WA_STRUCTURE-INTLEN = 4.
WA_STRUCTURE-DECIMALS = 0.
APPEND WA_STRUCTURE TO IT_STRUCTURE.
*& 生成重复字段值表
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
IT_FIELDCATALOG = IT_STRUCTURE
IMPORTING
EP_TABLE = DY_TABLE.
ASSIGN DY_TABLE->* TO <DYN_TABLE_DUPL>.
CREATE DATA DY_LINE LIKE LINE OF <DYN_TABLE_DUPL>.
ASSIGN DY_LINE->* TO <DYN_WA_DUPL>.
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
IT_FIELDCATALOG = IT_STRUCTURE
IMPORTING
EP_TABLE = DY_TABLE2.
ASSIGN DY_TABLE2->* TO <DYN_TABLE_DUPL2>.
CREATE DATA DY_LINE2 LIKE LINE OF <DYN_TABLE_DUPL2>.
ASSIGN DY_LINE2->* TO <DYN_WA_DUPL2>.
*& 建立一个和传进来的表相同结构的表
DESCR_REF ?= CL_ABAP_STRUCTDESCR=>DESCRIBE_BY_DATA( <DYN_WA> ).
comp_tab = DESCR_REF->GET_COMPONENTS( ).
DESCR_REF = CL_ABAP_STRUCTDESCR=>CREATE( comp_tab ).
TAB = cl_abap_tabledescr=>CREATE( DESCR_REF ).
CREATE DATA DL_TABLE TYPE HANDLE TAB.
ASSIGN DL_TABLE->* TO <DL_TABLE> CASTING TYPE HANDLE TAB.
LOOP AT T_TABLE ASSIGNING <DYN_WA>.
LOOP AT T_FIELD_DUPL INTO W_FIELD_DUPL.
ASSIGN COMPONENT W_FIELD_DUPL-NAME OF STRUCTURE <DYN_WA> TO <DYN_FIELD>.
ASSIGN COMPONENT W_FIELD_DUPL-NAME OF STRUCTURE <DYN_WA_DUPL> TO <DYN_FIELD_DUPL>.
<DYN_FIELD_DUPL> = <DYN_FIELD>.
ENDLOOP.
ASSIGN COMPONENT 'TIMES' OF STRUCTURE <DYN_WA_DUPL> TO <DYN_FIELD_DUPL>.
<DYN_FIELD_DUPL> = 1.
COLLECT <DYN_WA_DUPL> INTO <DYN_TABLE_DUPL> .
ENDLOOP.
LOOP AT <DYN_TABLE_DUPL> ASSIGNING <DYN_WA_DUPL>.
ASSIGN COMPONENT 'TIMES' OF STRUCTURE <DYN_WA_DUPL> TO <DYN_FIELD_DUPL>.
IF <DYN_FIELD_DUPL> > 1.
I_GROUP = I_GROUP + 1.
W_FIELD_VALUE-GROUP = I_GROUP.
W_FIELD_VALUE-TIMES = <DYN_FIELD_DUPL>.
LOOP AT T_FIELD_DUPL INTO W_FIELD_DUPL.
ASSIGN COMPONENT W_FIELD_DUPL-NAME OF STRUCTURE <DYN_WA_DUPL> TO <DYN_FIELD_DUPL>.
W_FIELD_VALUE-FIELD = W_FIELD_DUPL-NAME.
W_FIELD_VALUE-VALUE = <DYN_FIELD_DUPL>.
APPEND W_FIELD_VALUE TO T_FIELD_VALUE.
ENDLOOP.
ELSE.
DELETE <DYN_TABLE_DUPL>.
ENDIF.
ENDLOOP.
UNASSIGN <dyn_wa_dupl>.
ASSIGN DY_LINE2->* TO <DYN_WA_DUPL>.
APPEND LINES OF <DYN_TABLE_DUPL> TO <DYN_TABLE_DUPL2>.
LOOP AT T_TABLE ASSIGNING <DYN_WA>.
LOOP AT T_FIELD_DUPL INTO W_FIELD_DUPL.
ASSIGN COMPONENT W_FIELD_DUPL-NAME OF STRUCTURE <DYN_WA> TO <DYN_FIELD>.
ASSIGN COMPONENT W_FIELD_DUPL-NAME OF STRUCTURE <DYN_WA_DUPL2> TO <DYN_FIELD_DUPL2>.
<DYN_FIELD_DUPL2> = <DYN_FIELD>.
ENDLOOP.
ASSIGN COMPONENT 'TIMES' OF STRUCTURE <DYN_WA_DUPL2> TO <DYN_FIELD_DUPL2>.
<DYN_FIELD_DUPL2> = 1.
COLLECT <DYN_WA_DUPL2> INTO <DYN_TABLE_DUPL2> ASSIGNING <DYN_WA_DUPL> .
ASSIGN COMPONENT 'TIMES' OF STRUCTURE <DYN_WA_DUPL> TO <DYN_FIELD_DUPL2>.
IF <DYN_FIELD_DUPL2> > 2 .
APPEND <DYN_WA> TO <DL_TABLE>.
ENDIF.
ENDLOOP.
sort <DL_TABLE> by (T_FIELD_DUPL).
ENDMETHOD.
T_TABLEImportingTypeTABLE
T_FIELD_DUPLImportingTypeABAP_SORTORDER_TAB
DY_TABLEExportingType Ref ToDATA
T_FIELD_VALUEExportingTypeTY_T_DUPL
DL_TABLEExportingType Ref ToDATA
用到的一个类型:
types:
BEGIN OF TY_W_DUPL ,
GROUP TYPE I,
FIELD TYPE FIELDNAME,
VALUE TYPE CHAR50,
TIMES TYPE I,
END OF TY_W_DUPL .
types:
TY_T_DUPL TYPE TABLE OF TY_W_DUPL INITIAL SIZE 0 .
类方法 :
METHOD CHECK_DUPLICATE_DATA.
FIELD-SYMBOLS:<DYN_TABLE_DUPL> TYPE STANDARD TABLE, "重复项的动态表内指针
<DYN_TABLE_DUPL2> TYPE STANDARD TABLE,
<DYN_WA> TYPE ANY,
<DYN_WA_DUPL> TYPE ANY,
<DYN_WA_DUPL2> TYPE ANY,
<DYN_FIELD_DUPL> TYPE ANY,
<DYN_FIELD_DUPL2> TYPE ANY,
<DYN_FIELD> TYPE ANY.
DATA: DY_LINE TYPE REF TO DATA, "重复项的动态内表行
WA_NEW_LINE TYPE REF TO DATA,
IT_STRUCTURE TYPE LVC_T_FCAT, "用于生成动态内表的结构表
WA_STRUCTURE TYPE LVC_S_FCAT, "用于生成动态内表的工作区
IT2_STRUCTURE TYPE LVC_T_FCAT, "用于生成动态内表的结构表
WA2_STRUCTURE TYPE LVC_S_FCAT. "用于生成动态内表的工作区
DATA: W_FIELD_DUPL LIKE LINE OF T_FIELD_DUPL,
W_FIELD_VALUE LIKE LINE OF T_FIELD_VALUE.
DATA: I_GROUP TYPE I VALUE 0. "用于对重复行进行分组
* 以下声明的变量用于从动态内表的工作区中取表结构
DATA: DESCR_REF TYPE REF TO CL_ABAP_STRUCTDESCR,
tab type REF TO cl_abap_tabledescr,
comp_tab type cl_abap_structdescr=>component_table,
WA_COMP LIKE LINE OF COMP_TAB.
FIELD-SYMBOLS: <COMP_WA> TYPE ABAP_COMPDESCR,
<COMP_FIELD> TYPE ANY.
FIELD-SYMBOLS: <DL_TABLE> TYPE TABLE.
DATA: TEXT TYPE STRING.
DATA: DY_TABLE2 TYPE REF TO DATA,
DY_LINE2 TYPE REF TO DATA .
*& 建立并分配指向检查表的工作区
CREATE DATA WA_NEW_LINE LIKE LINE OF T_TABLE .
ASSIGN WA_NEW_LINE->* TO <DYN_WA>.
*& 获取工作区的结构类
DESCR_REF ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( <DYN_WA> ).
*& 循环并检查传递进来的要检查的重复字段
LOOP AT T_FIELD_DUPL INTO W_FIELD_DUPL.
CLEAR: WA_STRUCTURE.
TEXT = W_FIELD_DUPL-NAME. "字段文本
READ TABLE DESCR_REF->COMPONENTS ASSIGNING <COMP_WA> WITH KEY NAME = W_FIELD_DUPL-NAME.
* 检查字段是否在表中存在
IF SY-SUBRC = 0.
* 检查字段类型
IF <COMP_WA>-TYPE_KIND = 'I ' OR <COMP_WA>-TYPE_KIND = 'P' OR <COMP_WA>-TYPE_KIND = 'F'.
RAISE EXCEPTION TYPE CX_SALV_METHOD_NOT_SUPPORTED
EXPORTING CLASS = 'ZCL_CYZ001'
METHOD = 'CHECK_DUPLICATE_DATA'
OBJECT = 'STATIC METHOD'
KEY = '方法不支持I, P, F 类型的重复检查字段.'.
ELSE.
WA_STRUCTURE-FIELDNAME = W_FIELD_DUPL-NAME.
WA_STRUCTURE-INTTYPE = <COMP_WA>-TYPE_KIND.
WA_STRUCTURE-INTLEN = <COMP_WA>-LENGTH.
WA_STRUCTURE-DECIMALS = <COMP_WA>-DECIMALS.
APPEND WA_STRUCTURE TO IT_STRUCTURE.
ENDIF.
ELSE.
CONCATENATE '在传递的内表中不存在字段:' TEXT INTO TEXT.
RAISE EXCEPTION TYPE CX_SALV_METHOD_NOT_SUPPORTED
EXPORTING CLASS = 'ZCL_CYZ001'
METHOD = 'CHECK_DUPLICATE_DATA'
OBJECT = 'STATIC METHOD'
KEY = TEXT.
ENDIF.
ENDLOOP.
CLEAR WA_STRUCTURE.
"重复次数字段
WA_STRUCTURE-FIELDNAME = 'TIMES'.
WA_STRUCTURE-INTTYPE = 'I'.
WA_STRUCTURE-INTLEN = 4.
WA_STRUCTURE-DECIMALS = 0.
APPEND WA_STRUCTURE TO IT_STRUCTURE.
*& 生成重复字段值表
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
IT_FIELDCATALOG = IT_STRUCTURE
IMPORTING
EP_TABLE = DY_TABLE.
ASSIGN DY_TABLE->* TO <DYN_TABLE_DUPL>.
CREATE DATA DY_LINE LIKE LINE OF <DYN_TABLE_DUPL>.
ASSIGN DY_LINE->* TO <DYN_WA_DUPL>.
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
IT_FIELDCATALOG = IT_STRUCTURE
IMPORTING
EP_TABLE = DY_TABLE2.
ASSIGN DY_TABLE2->* TO <DYN_TABLE_DUPL2>.
CREATE DATA DY_LINE2 LIKE LINE OF <DYN_TABLE_DUPL2>.
ASSIGN DY_LINE2->* TO <DYN_WA_DUPL2>.
*& 建立一个和传进来的表相同结构的表
DESCR_REF ?= CL_ABAP_STRUCTDESCR=>DESCRIBE_BY_DATA( <DYN_WA> ).
comp_tab = DESCR_REF->GET_COMPONENTS( ).
DESCR_REF = CL_ABAP_STRUCTDESCR=>CREATE( comp_tab ).
TAB = cl_abap_tabledescr=>CREATE( DESCR_REF ).
CREATE DATA DL_TABLE TYPE HANDLE TAB.
ASSIGN DL_TABLE->* TO <DL_TABLE> CASTING TYPE HANDLE TAB.
LOOP AT T_TABLE ASSIGNING <DYN_WA>.
LOOP AT T_FIELD_DUPL INTO W_FIELD_DUPL.
ASSIGN COMPONENT W_FIELD_DUPL-NAME OF STRUCTURE <DYN_WA> TO <DYN_FIELD>.
ASSIGN COMPONENT W_FIELD_DUPL-NAME OF STRUCTURE <DYN_WA_DUPL> TO <DYN_FIELD_DUPL>.
<DYN_FIELD_DUPL> = <DYN_FIELD>.
ENDLOOP.
ASSIGN COMPONENT 'TIMES' OF STRUCTURE <DYN_WA_DUPL> TO <DYN_FIELD_DUPL>.
<DYN_FIELD_DUPL> = 1.
COLLECT <DYN_WA_DUPL> INTO <DYN_TABLE_DUPL> .
ENDLOOP.
LOOP AT <DYN_TABLE_DUPL> ASSIGNING <DYN_WA_DUPL>.
ASSIGN COMPONENT 'TIMES' OF STRUCTURE <DYN_WA_DUPL> TO <DYN_FIELD_DUPL>.
IF <DYN_FIELD_DUPL> > 1.
I_GROUP = I_GROUP + 1.
W_FIELD_VALUE-GROUP = I_GROUP.
W_FIELD_VALUE-TIMES = <DYN_FIELD_DUPL>.
LOOP AT T_FIELD_DUPL INTO W_FIELD_DUPL.
ASSIGN COMPONENT W_FIELD_DUPL-NAME OF STRUCTURE <DYN_WA_DUPL> TO <DYN_FIELD_DUPL>.
W_FIELD_VALUE-FIELD = W_FIELD_DUPL-NAME.
W_FIELD_VALUE-VALUE = <DYN_FIELD_DUPL>.
APPEND W_FIELD_VALUE TO T_FIELD_VALUE.
ENDLOOP.
ELSE.
DELETE <DYN_TABLE_DUPL>.
ENDIF.
ENDLOOP.
UNASSIGN <dyn_wa_dupl>.
ASSIGN DY_LINE2->* TO <DYN_WA_DUPL>.
APPEND LINES OF <DYN_TABLE_DUPL> TO <DYN_TABLE_DUPL2>.
LOOP AT T_TABLE ASSIGNING <DYN_WA>.
LOOP AT T_FIELD_DUPL INTO W_FIELD_DUPL.
ASSIGN COMPONENT W_FIELD_DUPL-NAME OF STRUCTURE <DYN_WA> TO <DYN_FIELD>.
ASSIGN COMPONENT W_FIELD_DUPL-NAME OF STRUCTURE <DYN_WA_DUPL2> TO <DYN_FIELD_DUPL2>.
<DYN_FIELD_DUPL2> = <DYN_FIELD>.
ENDLOOP.
ASSIGN COMPONENT 'TIMES' OF STRUCTURE <DYN_WA_DUPL2> TO <DYN_FIELD_DUPL2>.
<DYN_FIELD_DUPL2> = 1.
COLLECT <DYN_WA_DUPL2> INTO <DYN_TABLE_DUPL2> ASSIGNING <DYN_WA_DUPL> .
ASSIGN COMPONENT 'TIMES' OF STRUCTURE <DYN_WA_DUPL> TO <DYN_FIELD_DUPL2>.
IF <DYN_FIELD_DUPL2> > 2 .
APPEND <DYN_WA> TO <DL_TABLE>.
ENDIF.
ENDLOOP.
sort <DL_TABLE> by (T_FIELD_DUPL).
ENDMETHOD.




