2013 Jul 30 2:57 AM
Hello Experts,
Im having trouble in making my requirement, im just new in abap so please help me.
I have 3 SELECT-OPTIONS where in i need to put the values into my Internal table,,
my code works if i fill up both FROM and TO textboxs for example in POSITION. but if i will just fill the POSITION-LOW and leave blank to POSITION-HIGH,
it doesnt get the data that i need.
IF POSITION IS NOT INITIAL AND EMPSUB IS INITIAL AND EMPGROUP IS INITIAL. "POSITION
SELECT PERNR PERSK BEGDA
INTO CORRESPONDING FIELDS OF TABLE IT_PA0001
FROM PA0001
WHERE PLANS BETWEEN POSITION-LOW AND POSITION-HIGH.
ELSEIF POSITION IS INITIAL AND EMPSUB IS NOT INITIAL AND EMPGROUP IS INITIAL. "EMPLOYEE SUB GROUP
SELECT PERNR PERSK BEGDA
INTO CORRESPONDING FIELDS OF TABLE IT_PA0001
FROM PA0001
WHERE PERSK BETWEEN EMPSUB-LOW AND EMPSUB-HIGH.
ELSEIF POSITION IS INITIAL AND EMPSUB IS INITIAL AND EMPGROUP IS NOT INITIAL. "EMPLOYEE GROUP
SELECT PERNR PERSK BEGDA
INTO CORRESPONDING FIELDS OF TABLE IT_PA0001
FROM PA0001
WHERE PERSG BETWEEN EMPGROUP-LOW AND EMPGROUP-HIGH.
ELSEIF POSITION IS NOT INITIAL AND EMPSUB IS NOT INITIAL AND EMPGROUP IS NOT INITIAL.
SELECT PERNR PERSK BEGDA
INTO CORRESPONDING FIELDS OF TABLE IT_PA0001
FROM PA0001
WHERE PERSG BETWEEN EMPGROUP-LOW AND EMPGROUP-HIGH
AND PERSK BETWEEN EMPSUB-LOW AND EMPSUB-HIGH
AND PLANS BETWEEN POSITION-LOW AND POSITION-HIGH.
ENDIF.
2013 Jul 30 12:40 PM
Hi Jepoy,
"IN" is best option in your case , but if you want to use "BETWEEN" then write your code as below
IF POSITION-HIGH IS INITIAL .
POSITION-HIGH = POSITION-LOW .
SELECT PERNR PERSK BEGDA
INTO CORRESPONDING FIELDS OF TABLE IT_PA0001
FROM PA0001
WHERE PLANS BETWEEN POSITION-LOW AND POSITION-HIGH.
ELSE.
SELECT PERNR PERSK BEGDA
INTO CORRESPONDING FIELDS OF TABLE IT_PA0001
FROM PA0001
WHERE PLANS BETWEEN POSITION-LOW AND POSITION-HIGH.
ENDIF.
Note :
Still i suggested you go with "IN" Operator , Unnecessary "IF/ELSE" Increase in your code .
Regard's
Smruti
2013 Jul 30 11:58 AM
Hi,
SELECT-OPTIONS ... NO-EXTENSION NO INTERVALS
extension : no multiple value
intervals : no High value
regards
Fred
2013 Jul 30 12:11 PM
Why dont you use "IN" in your where clasue.
SELECT PERNR PERSK BEGDA
INTO CORRESPONDING FIELDS OF TABLE IT_PA0001
FROM PA0001
WHERE PLANS IN POSITION.
Regards
2013 Jul 30 12:18 PM
Hi Jepoy.
Try line this.....
While using select-option's we should use in
if you use between statement low or high values, if you not enter any thing it will show error values
IF POSITION IS NOT INITIAL AND EMPSUB IS INITIAL AND EMPGROUP IS INITIAL. "POSITION
SELECT PERNR PERSK BEGDA
INTO CORRESPONDING FIELDS OF TABLE IT_PA0001
FROM PA0001
WHERE PLANS BETWEEN POSITION-LOW AND POSITION-HIGH.
WHERE PLANS in POSITION.
ELSEIF POSITION IS INITIAL AND EMPSUB IS NOT INITIAL AND EMPGROUP IS INITIAL. "EMPLOYEE SUB GROUP
SELECT PERNR PERSK BEGDA
INTO CORRESPONDING FIELDS OF TABLE IT_PA0001
FROM PA0001
WHERE PERSK BETWEEN EMPSUB-LOW AND EMPSUB-HIGH.
WHERE PERSK in EMPSUB.
ELSEIF POSITION IS INITIAL AND EMPSUB IS INITIAL AND EMPGROUP IS NOT INITIAL. "EMPLOYEE GROUP
SELECT PERNR PERSK BEGDA
INTO CORRESPONDING FIELDS OF TABLE IT_PA0001
FROM PA0001
WHERE PERSG BETWEEN EMPGROUP-LOW AND EMPGROUP-HIGH.
WHERE PERSG in EMPGROUP.
ELSEIF POSITION IS NOT INITIAL AND EMPSUB IS NOT INITIAL AND EMPGROUP IS NOT INITIAL.
SELECT PERNR PERSK BEGDA
INTO CORRESPONDING FIELDS OF TABLE IT_PA0001
FROM PA0001
WHERE PERSG BETWEEN EMPGROUP-LOW AND EMPGROUP-HIGH
AND PERSK BETWEEN EMPSUB-LOW AND EMPSUB-HIGH
AND PLANS BETWEEN POSITION-LOW AND POSITION-HIGH.
WHERE PERSG in EMPGROUP
AND PERSK in EMPSUB
AND PLANS in POSITION.
ENDIF.
2013 Jul 30 12:19 PM
The "most expected" SELECT for those select-options would be a single (read WHERE - sql_cond)
SELECT pernr persk begda
INTO CORRESPONDING FIELDS OF TABLE it_pa0001
FROM pa0001
WHERE plans IN position
AND persk IN empsub
AND persg IN empgroup.Of course you should also put those select-options in a SELECTION-SCREEN BLOCK and check AT SELECTION-SCREEN ON BLOCK that they are not initial.
Regards,
Raymond
2013 Jul 30 12:40 PM
Hi Jepoy,
"IN" is best option in your case , but if you want to use "BETWEEN" then write your code as below
IF POSITION-HIGH IS INITIAL .
POSITION-HIGH = POSITION-LOW .
SELECT PERNR PERSK BEGDA
INTO CORRESPONDING FIELDS OF TABLE IT_PA0001
FROM PA0001
WHERE PLANS BETWEEN POSITION-LOW AND POSITION-HIGH.
ELSE.
SELECT PERNR PERSK BEGDA
INTO CORRESPONDING FIELDS OF TABLE IT_PA0001
FROM PA0001
WHERE PLANS BETWEEN POSITION-LOW AND POSITION-HIGH.
ENDIF.
Note :
Still i suggested you go with "IN" Operator , Unnecessary "IF/ELSE" Increase in your code .
Regard's
Smruti
2013 Jul 31 1:44 AM
2013 Jul 31 9:31 AM
Hi Jepor,
Why my answer is not correct? Can I know the reason..
2013 Aug 01 2:10 AM
Hi ramesh,
I didnt say your answer was incorrect, it's just that most of the answers are the same.
Your answer is very helpful to me. thanks with that.
2013 Aug 01 12:22 PM
Hi Jepoy.
First you marked my answer as helpful after that you unmarked for that I questioned?
2013 Aug 02 1:05 AM
oh sorry with that, it's just my first time here and im exploring things
2013 Jul 31 10:05 AM
I would insist on IN operatot, try to input a wildcard in LOW value, what will happen, and if a user add an exclustion, or multiple lines...
You could use FM SELECT_OPTIONS_RESTRICT, so user will only be allowed to input ranges or single values, else that may and will generate errors, add in INITIALIZATION a code like :
* - ALL as default, everything allowed
CLEAR opt_list.
MOVE 'ALL' TO opt_list-name.
MOVE 'X' TO: opt_list-options-bt,
opt_list-options-cp,
opt_list-options-eq,
opt_list-options-ge,
opt_list-options-gt,
opt_list-options-le,
opt_list-options-lt,
opt_list-options-nb,
opt_list-options-ne,
opt_list-options-np.
APPEND opt_list TO restrict-opt_list_tab.
* - Only single values and ranges allowed
CLEAR opt_list.
MOVE 'RAN' TO opt_list-name.
MOVE 'X' TO: opt_list-options-eq,
opt_list-options-bt.
APPEND opt_list TO restrict-opt_list_tab.
* Affecting "modes" to select-options
* ALL by default
CLEAR ass.
MOVE: 'A' TO ass-kind,
'*' TO ass-sg_main,
'ALL' TO ass-op_main.
APPEND ass TO restrict-ass_tab.
* RAN to your criteria
CLEAR ass.
MOVE: 'S' TO ass-kind,
'I' TO ass-sg_main, " No exclude
'RAN' TO ass-op_main. " exact values and range
MOVE 'POSITION' TO ass-name.
APPEND ass TO restrict-ass_tab.
MOVE 'EMPSUB' TO ass-name.
APPEND ass TO restrict-ass_tab.
MOVE 'EMPGROUP' TO ass-name.
APPEND ass TO restrict-ass_tab.
* Execute FM
CALL FUNCTION 'SELECT_OPTIONS_RESTRICT'
EXPORTING
restriction = restrict
EXCEPTIONS
OTHERS = 1.Regards,
Raymond