2019-10-18利用正則表達式解決問題excel上傳等數據驗證問題

當我們啟用excel上傳時硼莽,我們以前采用了字段內容校驗缀棍,這種方法特別大量的耗損了abap的時間熟嫩,做這種重復的數據檢查工作秦踪,在碧桂園項目,領導提出了只檢查數據類型掸茅,于是做了一個版本椅邓,我在泰康做了第二個版本升級,今天又做第三個版本昧狮,進行升級景馁。最近面試老是被人問有沒有作過什么特別的東西,哎逗鸣,說實話寫代碼太多了合住,真心都覺得一般般绰精,答不出來什么是特別的,很特別的東西透葛,只是需要點時間而已笨使,其它都是扯蛋。

FUNCTION ZTEST_XIAOY_CHECKTF.

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

*"*"本地接口:

*"? IMPORTING

*"? ? REFERENCE(IV_TABNAME) TYPE? TABNAME

*"? TABLES

*"? ? ? IT_DATA

*"? ? ? ET_MESSAGE STRUCTURE? ZSHR_MESSAGE

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

DATA:? ? dyn_table? ? TYPE REF TO data,

? ? ? ? ? ? ? ”gs_display? type ref to data,

? ? ? ? ? ? ? lo_descr? ? type ref to cl_abap_structdescr,

? ? ? ? ? ? ? lt_fields? ? type ddfields,

? ? ? ? ? ? ? lv_zz? ? ? ? type string,

? ? ? ? ? ? ? ls_fields? ? like line of lt_fields,

? ? ? ? ? ? ? ls_message? type zshr_message,

? ? ? ? ? ? ? lv_text? ? ? type string,

? ? ? ? ? ? ? lv_line? ? ? type char20,

? ? ? ? ? ? ? dyn_wa? ? ? TYPE REF TO data.

FIELD-SYMBOLS: <dyn_table>? TYPE table,

? ? ? ? ? ? ? <dyn_wa>? ? TYPE ANY.

*IV_TABNAME 是我們excel se11定義的結構或者表

CREATE DATA dyn_table TYPE TABLE OF (IV_TABNAME).

ASSIGN dyn_table->* TO <dyn_table>.

CREATE DATA dyn_wa LIKE LINE OF <dyn_table>.

ASSIGN dyn_wa->* TO <dyn_wa>.

*<dyn_table> = IT_DATA[].

ASSIGN IT_DATA[] to <dyn_table>.

*下面是獲取結構字段屬性 當然有個簡單的辦法僚害,直接從dd03l讀取就行

lo_descr ?= cl_abap_typedescr=>describe_by_data( <dyn_wa> ).

lt_fields = lo_descr->get_ddic_field_list( p_langu = 'E'

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? p_including_substructres = abap_true ).

*sort lt_fields by tabname fieldname.

loop at <dyn_table> ASSIGNING <dyn_wa>.

? ? lv_line = sy-tabix.

? ? CONDENSE lv_line.

? loop at lt_fields into ls_fields.

? ?ASSIGN COMPONENT ls_fields-fieldname of STRUCTURE <dyn_wa> to FIELD-SYMBOL(<field>).

? ? if <field> is ASSIGNED.

? ? case ls_fields-inttype.

? ? ? when 'D'.

? ? ? ? if <field> is not initial.

? ? ? ? ? ? ? replace all occurrences of '\' in lv_text with space.

? ? ? ? ? ? ? replace all occurrences of '-' in lv_text with space.

? ? ? ? ? ? ? replace all occurrences of '/' in lv_text with space.

? ? ? ? ? ? ? condense: lv_text no-gaps.

? ? ? ? ? ? ? lv_text = <field> .

? ? ? ? ? ? ? lv_zz? = '^(?:(?:(?:(?:(?:1[6-9]|[2-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:0229))|' &&

? ? ? ? ? ? ? ? ? ? ? '(?:(?:(?:1[6-9]|[2-9]\d)\d{2})(?:(?:(?:0[13578]|1[02])31)|(?:(?:0[13-9]|1[0-2])(?:29|30))|(?:(?:0[1-9])|(?:1[0-2]))(' &&

? ? ? ? ? ? ? ? ? ? ? '?:0[1-9]|1\d|2[0-8]))))$'.

? ? ? ? ? ? ? if cl_abap_matcher=>matches(

? ? ? ? ? ? ? ? ? pattern = lv_zz

? ? ? ? ? ? ? ? ? text = lv_text ) ne abap_true.

? ? ? ? ? ? ? ? ls_message-msgty = 'E'.

? ? ? ? ? ? ? ? concatenate 'Excel第' lv_line? '字段' ls_fields-fieldname '數據不是日期格式YYYYMMDD' into ls_message-msgtx SEPARATED BY space.

? ? ? ? ? ? ? ? append ls_message to ET_MESSAGE.

? ? ? ? ? ? ? ? “exit .

? ? ? ? ? ? ? ? clear:ls_message.

? ? ? ? ? ? ? endif.

? ? ? ? ? ? ? <field> = lv_text.

? ? ? ? ? ? endif.

? ? ? ? when 'N' or 'I' .

? ? ? ? ? ? if <field> is not initial.

? ? ? ? ? ? ? lv_text = <field> .

? ? ? ? ? ? ? replace all occurrences of ',' in lv_text with space.

? ? ? ? ? ? ? condense: lv_text no-gaps.

? ? ? ? ? ? ? if cl_abap_matcher=>matches(

? ? ? ? ? ? ? ? ? pattern = '-?[0-9]\d*'

? ? ? ? ? ? ? ? ? text = lv_text ) ne abap_true.

? ? ? ? ? ? ? ? ls_MESSAGE-msgty = 'E'.

*? ? ? ? ? ? ? ? concatenate? ls_fields-fieldname '數據不是整數類型的' into ls_MESSAGE-msgtx.

? ? ? ? ? ? ? ? concatenate 'Excel第' lv_line? '字段' ls_fields-fieldname '數據不是整數類型的' into ls_message-msgtx SEPARATED BY space.

? ? ? ? ? ? ? ? append ls_MESSAGE to ET_MESSAGE.

? ? ? ? ? ? ? ? ”exit .

? ? ? ? ? ? ? ? clear:ls_MESSAGE.

? ? ? ? ? ? ? endif.

? ? ? ? ? ? ? <field>? = lv_text.

? ? ? ? ? ? endif.

? ? ? when? 'P'.

? ? ? ? ? ? if <field> is not initial.

? ? ? ? ? ? ? lv_text = <field> .

? ? ? ? ? ? ? replace all occurrences of ',' in lv_text with space.

? ? ? ? ? ? ? condense: lv_text no-gaps.

? ? ? ? ? ? ? if cl_abap_matcher=>matches(

*? ? ? ? ? ? ? ? ? pattern = '^(([1-9]\d*)(\.\d{1,2})?)$|^(0\.0?([1-9]\d?))$'

? ? ? ? ? ? ? ? ? pattern =? '^[0-9]+.?[0-9]*$'"肖勇更改正則表達式 20190422

? ? ? ? ? ? ? ? ? text = lv_text ) ne abap_true.

? ? ? ? ? ? ? ? ls_message-msgty = 'E'.

*? ? ? ? ? ? ? ? concatenate? ls_ztehrdt02-fielc '數據不是數字類型的' into ls_message-msgtx.

? ? ? ? ? ? ? ? concatenate 'Excel第' lv_line? '字段' ls_fields-fieldname '數據不是數字類型的' into ls_message-msgtx SEPARATED BY space.

? ? ? ? ? ? ? ? append ls_message to et_message.

? ? ? ? ? ? ? ?“ exit .

? ? ? ? ? ? ? ? clear:ls_message.

? ? ? ? ? ? ? endif.

? ? ? ? ? ? ? <field> = lv_text.

? ? ? ? ? ? endif.

? ? ? ? when 'C'.

*? ? ? ? ? clear:len.

? ? ? ? ? ? data(len) =? strlen( <field> )."先判斷長度

? ? ? ? ? ? if len > ls_fields-leng.

? ? ? ? ? ? ? ls_message-msgty = 'E'.

*? ? ? ? ? ? ? concatenate? ls_ztehrdt02-fielc '數據長度過長' into ls_message-msgtx.

? ? ? ? ? ? ? concatenate 'Excel第' lv_line? '字段' ls_fields-fieldname '數據長度過長' into ls_message-msgtx SEPARATED BY space.

? ? ? ? ? ? ? append ls_message to ET_MESSAGE.clear:ls_message.

? ? ? ? ? ? endif.

? ? ? ? ? ? clear:len.

? ? endcase.

? ? endif.

? endloop.

ENDLOOP.

ENDFUNCTION.




測試用的小段代碼

select * into CORRESPONDING FIELDS OF TABLE lt_mara from mara UP TO 10 ROWS.

CALL FUNCTION 'ZTEST_XIAOY_CHECKTF'

? EXPORTING

? ? IV_TABNAME = 'MARA'

? TABLES

? ? IT_DATA? ? = lt_mara[]

? ? ET_MESSAGE = ET_MESSAGE.


我們在debug的時候可以改變 lt_mara里面的值來驗證代碼硫椰。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市萨蚕,隨后出現的幾起案子靶草,更是在濱河造成了極大的恐慌,老刑警劉巖岳遥,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爱致,死亡現場離奇詭異,居然都是意外死亡寒随,警方通過查閱死者的電腦和手機糠悯,發(fā)現死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妻往,“玉大人互艾,你說我怎么就攤上這事⊙镀” “怎么了纫普?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長好渠。 經常有香客問我昨稼,道長,這世上最難降的妖魔是什么拳锚? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任假栓,我火速辦了婚禮,結果婚禮上霍掺,老公的妹妹穿的比我還像新娘匾荆。我一直安慰自己,他們只是感情好杆烁,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布牙丽。 她就那樣靜靜地躺著,像睡著了一般兔魂。 火紅的嫁衣襯著肌膚如雪烤芦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天析校,我揣著相機與錄音构罗,去河邊找鬼铜涉。 笑死,一個胖子當著我的面吹牛绰播,可吹牛的內容都是我干的骄噪。 我是一名探鬼主播尚困,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蠢箩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了事甜?” 一聲冷哼從身側響起谬泌,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逻谦,沒想到半個月后掌实,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡邦马,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年贱鼻,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滋将。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡邻悬,死狀恐怖,靈堂內的尸體忽然破棺而出随闽,到底是詐尸還是另有隱情父丰,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布掘宪,位于F島的核電站蛾扇,受9級特大地震影響,放射性物質發(fā)生泄漏魏滚。R本人自食惡果不足惜镀首,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鼠次。 院中可真熱鬧蘑斧,春花似錦、人聲如沸须眷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽花颗。三九已至捕传,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扩劝,已是汗流浹背庸论。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工职辅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人聂示。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓域携,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鱼喉。 傳聞我的和親對象是個殘疾皇子秀鞭,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355