2016-02-05 118 views
1

我有一個非常簡單的選擇空值:過濾掉來自where子句

select * from ZMM_TABLE 
    into CORRESPONDING FIELDS OF table lt_table 
    where mjahr = p_mjahr and 
     werks = p_werks and 

...

時p_values都 - 一切正常。有六打,所以問題 - 如何只使用由用戶填充的問題。我不能強制要求填寫所有這些字段。 我曾考慮過病例陳述,但可能存在太多的組合。我應該如何解決這個問題儘可能簡單?

回答

-2

什麼數據類型是p_values?

這個例子會工作,如果他們是int和mjahr和WERKS不能有值爲0(零):

select * from ZMM_TABLE 
    into CORRESPONDING FIELDS OF table lt_table 
    where mjahr = isnull(p_mjahr,0) and 
     werks = isnull(p_werks,0) and 
+0

不同的類型,但大多是字符。 – AlexanderK

+2

就我所見,'isnull()'在ABAP Open SQL中不是一個有效的語句。 – vwegert

+0

你可以使用相同的邏輯,並根據ABAB打開SQL語法採用代碼,因爲我注意到Tordek已經這麼做了 – JassyJov

1

我假設你想在某些領域進行篩選,如果過濾器是空的,任何該字段的值是有效的。

最好的選擇是根據需要構建查詢。例如,如果用戶輸入「p_mjahr」,而不是「p_werks」,您發出創建一個查詢像...

select * from ZMM_TABLE 
    into CORRESPONDING FIELDS OF table lt_table 
    where mjahr = p_mjahr 

如果這是不可能的,你可以這樣做:

select * from ZMM_TABLE 
    into CORRESPONDING FIELDS OF table lt_table 
    where (mjahr = p_mjahr or p_mjahr = '') and 
     (werks = p_werks or p_werks = '') and 

這個查詢的工作方式是,如果p_mjahr有一個值,「or」的第二個參數將是false,但第一個參數會按預期匹配。但是,如果p_mjahr爲''(空字符串),則or子句的第二個參數將爲true,從而使整個子句爲true。通過and的其他過濾器將按預期工作。

+0

謝謝,我認爲第二個應該可以很好地工作...糟糕,除非它沒有。錯誤 - p_mjahr不是表格列。 – AlexanderK

-1

改爲使用selection tables' syntax。爲了使用它們,你必須聲明範圍表是這樣的:

DATA: BEGIN OF rtab OCCURS {10|n}, 
    sign TYPE c LENGTH 1, 
    option TYPE c LENGTH 2, 
    low LIKE dobj, 
    high LIKE dobj, 
    END OF rtab. 

他們需要填補這樣的:

rtab-sign = 'I'. 
rtab-options = 'EQ'. 
rtab-low = p_mjahr. 
rtab-high = p_mjahr. 
APPEND rtab. 

如果選擇表是初始,表達IN seltab總是正確的。

+1

這個答案是提倡過時的語法元素。避免採用這種風格。 – vwegert

1

第一:請注意,NULL值和空字段是兩個完全不同的東西。 ABAP應用程序中的NULL值相對不常見,需要使用IS [NOT] NULL聲明來處理。

假設你真的是空字段,而不是NULL值:使用選擇表,但使用規範的方式來定義他們,如果可能的話現代的方式來填補他們:

DATA: lt_range_whatever TYPE RANGE OF datatype_here. 

lt_range_whatever = value #((sign = 'I' option = 'EQ' low = 'value')). 

SELECT foo, bar 
    FROM baz 
    INTO wherever 
    WHERE whatever IN @lt_range_whatever. 
1

對不起,我找到了另一種方法來實現這一點使用的語句如下:

select-OPTIONS: s_mjahr for ZMM_TABLE-mjahr no-EXTENSION 
        no INTERVALS, 
... 


select * from ZMM_TABLE 
    into CORRESPONDING FIELDS OF table lt_table 
    where mjahr in s_mjahr and 
     werks in s_werks and ... so on. 
+0

如果那是你以前的樣子,那麼你應該先說明你想要一個選擇屏幕。我們應該怎麼知道? – vwegert