网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
12月26日漏签0天
abap吧 关注:2,988贴子:15,795
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 4回复贴,共1页
<<返回abap吧
>0< 加载中...

自己写的一个类,用于检查表中的重复数据。

  • 只看楼主
  • 收藏

  • 回复
  • jane2chen
  • 人中龙凤
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
类参数:
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.


  • jane2chen
  • 人中龙凤
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
说明下参数:
T_TABLE Importing Type TABLE
传递要检查重复数据的表
T_FIELD_DUPL Importing Type ABAP_SORTORDER_TAB
传递要检查重复数据的字段。不要传递数值型的字段,如要检查数据型字段,可把数据放在文本字段里。
DY_TABLE Exporting Type Ref To DATA
返回表,结构为检查重复字段 再另上一个TIMES 字段,检查字段保存重复值,TIMES保存重复次数。
T_FIELD_VALUE Exporting Type TY_T_DUPL
返回表,参考类型 TY_W_DUPL 如下.
types:
BEGIN OF TY_W_DUPL ,
GROUP TYPE I,
FIELD TYPE FIELDNAME,
VALUE TYPE CHAR50,
TIMES TYPE I,
END OF TY_W_DUPL .
DL_TABLE Exporting Type Ref To DATA
返回表,结构和传递进来要检查的表相同,只返回重复的数据。


2025-12-26 17:25:56
广告
不感兴趣
开通SVIP免广告
  • jane2chen
  • 人中龙凤
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
使用此静态类方法:
1,可以检查平时要导入的表中是否存在重复数据。
2,可以检查物料名称,供应商名称,客户名称是否重复。为此也写了个程序。截屏如下:

输入要检查的表名称,这里检查物料描述,用的是MAKT.

按F8执行后,显示一个选择窗口,可以选择要检查的字段,要显示的字段,还可以点条件字段的按钮来设定检查数据的条件.

最后显示重复的数据。


  • Janewar
  • 武林盟主
    14
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
你8级可以直接上传附件了吧


  • Wenkai
  • 人中龙凤
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
欢迎大神造访。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 4回复贴,共1页
<<返回abap吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示