點(diǎn)擊藍(lán)字 關(guān)注我們
一
問題描述
不知道你有沒有創(chuàng)建過這樣的報(bào)表. 在查詢結(jié)果中,特定字段為空. 但是用該字段為空去查詢, 卻查不出記錄.
如圖一,沒有限制查詢條件時(shí),可以查詢到數(shù)據(jù)
如圖二.通過ALV過濾能只顯示地點(diǎn)為空的數(shù)據(jù)
如圖三.限制地點(diǎn)為空時(shí), 用戶期望能查詢到圖一紅色框中的數(shù)據(jù).
如圖四.實(shí)際查詢不到任何數(shù)據(jù).
圖一
圖二
圖三
圖四
二
問題分析
上述問題產(chǎn)生的原因很簡(jiǎn)單,因?yàn)閳?bào)表程序中使用了左連接(如圖五),并且選擇條件是左連接的表字段.
當(dāng)左連接的右表中不存在的條目被查詢出來的時(shí)候, 該字段的實(shí)際值是NULL. 因?yàn)锳BAP變量的定義及顯示對(duì)于NULL值都轉(zhuǎn)換為初始值處理. 所以導(dǎo)致圖一中的查詢輸出內(nèi)容為空.
因?yàn)镾QL語(yǔ)句本身支持NULL值,圖二的選擇條件無法被解釋成 IS NULL . 所以添加選擇條件為空時(shí),無法查詢到數(shù)據(jù). 如果期望能查詢到數(shù)據(jù), SQL語(yǔ)句需要調(diào)整.
圖五
三
問題解決
有兩種方式可以解決這個(gè)問題:
調(diào)整報(bào)表程序,動(dòng)態(tài)設(shè)置 右表字段的查詢條件
使用CDS視圖,調(diào)整輸出的結(jié)果
01
調(diào)整查詢條件
按下圖的代碼,調(diào)整查詢條件, 判斷左連接的選擇條件內(nèi)容,如果存在空值, 則解析為IS NULL. 否則使用標(biāo)準(zhǔn)的解析邏輯.如圖六
圖六
動(dòng)態(tài)報(bào)表中的NULL值支持
SPRING
動(dòng)態(tài)報(bào)表(D-Query)中使用了一種類似的方式,支持了選擇屏幕輸入null 值
詳見連接無峰贮匕,公眾號(hào):ABAP 技巧與實(shí)戰(zhàn)動(dòng)態(tài)報(bào)表D-Query 添加NULL查詢支持
動(dòng)態(tài)報(bào)表簡(jiǎn)介無峰网梢,公眾號(hào):ABAP 技巧與實(shí)戰(zhàn)動(dòng)態(tài)報(bào)表D-Query簡(jiǎn)介
02
通過CDS視圖
視圖輸出中時(shí)把NULL值調(diào)整成空值.查詢語(yǔ)句調(diào)整為從視圖讀取數(shù)據(jù).
四
總結(jié)
左連接在查詢中廣泛應(yīng)用,如果左連接的表字段參與了查詢條件, 并且沒有做特殊處理, 就會(huì)給業(yè)務(wù)人員帶上困惑,用戶會(huì)質(zhì)疑報(bào)表的正確性.
通過對(duì)報(bào)表查詢方式的一點(diǎn)調(diào)整, 就能解決業(yè)務(wù)的這個(gè)困惑. 讓報(bào)表的查詢結(jié)果更符合業(yè)務(wù)預(yù)期.
THE
END