Steploop and table contol is inevitable in certain
transactions. When we run BDC for such transactions, we will face the situation:
how many visible lines of steploop/tablecontrol are on the screen? Although
we can always find certain method to deal with it, such as function code
'NP', 'POPO', considering some extreme situation: there is only one line
visible one the screen,
our BDC program should display an error message.
(See transaction 'ME21', we you resize your screen to let only one row
visible, you can not enter mutiple lines on this screen even you use 'NP')
Now, I find a method with which we can determine
the number of visible lines on Transaction Screen from our Calling BDC
program. Maybe it is useless to you, but I think it will give your some
idea.
Demo ABAP code has two purposes:
1. how to determine number of visible lines and
how to calculte page number; (the 'calpage' routine has been modify to
meet general purpose usage)
2. using field symbol in BDC program, please
pay special attention to the difference in Static
ASSIGN and Dynamic ASSIGN.
Now I begin to describe the step to implement
my method:
(I use transaction 'ME21', screen 121 for sample,
the method using is Call Transation Using..)
Step1: go to screen painter to display the screen
121, then we can count the fixed line on this screen, there is 7 lines
above the steploop and 2 lines below the steploop, so there are total 9
fixed lines on this screen. This means except these 9 lines, all the other
line is for step loop.
Then have a look at steploop itselp, one entry
of it will occupy two lines.
(Be careful, for table control, the head and
the bottom scroll bar will possess another two fixed lines, and there is
a maximum number for table line)
Now we have : FixedLine = 9
LoopLine = 2(for table control, LoopLine is always equal to 1)
Step2: go to transaction itself(ME21) to see how it roll page, in ME21, the first line of new page is always occupied by the last line of last page, so it begin with index '02', but in some other case, fisrt line is empty and ready for input.
Now we have: FirstLine = 0
or FirstLine = 1 ( in our case, FirstLine is 1 because the first line of
new page is fulfilled)
Step3: write a subroutine calcalculating number
of pages
(here, the name of actual parameter is the same
as formal parameter)
global data: FixedLine type
i, " number of fixed line on a certain screen
LoopLine type i, " the number of lines occupied by one steploop item
FirstLine type i, " possbile value 0 or 1, 0 stand for the first line of
new
" scrolling screen is empty, otherwise is 1
Dataline type i, " number of items you will use in BDC, using DESCRIBE
to get
pageno type i, " you need to scroll screen how many times.
line type i, " number of lines appears on
the screen.
index(2) type N, " the screen index for certain item
begin type i, " from parameter of loop
end type i. " to parameter of loop
*in code sample, the DataTable-linindex stands
for the table index number of this line
form calpage using FixedLine type i (see step
1)
LoopLine type i (see step 1)
FirstLine type i (see step 2)
DataLine type i ( this is the item number you will enter in transaction)
changing pageno type i (return the number of page, depends
on run-time visible line in table control/ Step Loop)
changing line type i.(visible lines one the
screen)
data: midd type i,
vline type i,
"visible lines
if DataLine eq 0.
Message eXXX.
endif.
vline = ( sy-srows - FixedLine ) div LoopLine.
*for table control, you should compare vline
with maximum line of
*table control, then take the small one that
is min(vline, maximum)
*here only illustrate step loop
if FirstLine eq 0.
pageno
= DataLine div vline.
if
pageno eq 0.
pageno = pageno + 1.
endif.
elseif FirstLine eq 1.
pageno
= ( DataLine - 1 ) div ( vline - 1 ) + 1.
midd
= ( DataLine - 1 ) mod ( vline - 1).
if
midd = 0 and DataLine gt 1.
pageno = pageno - 1.
endif.
endif.
line = vline.
endform.
Step4 write a subroutine to calculate the line index for each item.
form calindex using Line type i (visible lines
on the screen)
FirstLine type i(see step 2)
LineIndex type i(item index)
changing Index type n. (index on the screen)
if FirstLine = 0.
index
= LineIndex mod Line.
if
index = '00'.
index = Line.
endif.
elseif FirstLine = 1.
index
= LineIndex mod ( Line - 1 ).
if
( index between 1 and 0 ) and LineIndex gt 1.
index = index + Line - 1.
endif.
if
Line = 2.
index = index + Line - 1.
endif.
endif.
endform.
Step5 write a subroutine to calculate the loop range.
form calrange using Line type i ( visible lines
on the screen)
DataLine type i
FirstLine type i
loopindex like sy-index
changing
begin type i
end type i.
If FirstLine = 0.
if loopindex = 1.
begin
= 1.
if
DataLine <= Line.
end = DataLine.
else.
end = Line.
endif.
elseif loopindex gt 1.
begin
= Line * ( loopindex - 1 ) + 1.
end
= Line * loopindex.
if
end gt DataLine.
end = DataLine.
endif.
endif.
elseif FirstLine = 1.
if loopindex = 1.
begin
= 1.
if
DataLine <= Line.
end = DataLine.
else.
end = Line.
endif.
elseif loop index gt 1.
begin
= ( Line - 1 ) * ( loopindex - 1 ) + 2.
end
= ( Line - 1 ) * ( loopindex - 1 ) + Line.
if
end gt DataLine.
end = DataLine.
endif.
endif.
endif.
endform.
Step6 using field sysbol in your BDC, for example: in ME21, but you should calculate each item will correponding to which index in steploop/Table Control
form creat_bdc.
field-symbols: <material>, <quan>, <indicator>.
data: name1(14) value 'EKPO-EMATN(XX)',
name2(14) value
'EKPO-MENGE(XX)',
name3(15) value
'RM06E-SELKZ(XX)'.
assign:
name1 to <material>,
name2 to <quan>,
name3 to <indicator>.
.
do pageno times.
if sy-index gt 1
*insert scroll page ok_code"
endif.
.
.
perform
calrange using Line DataLine FirstLine sy-index
changing begin end.
.
.
loop at DataTable from begin to end.
perform
calindex using Line FirstLine DataTable-LineIndex changing Index.
name1+11(2)
= Index.
name2+11(2)
= Index.
name3+12(2)
= Index.
.
.
perform
bdcfield using <material> DataTable-matnr.
perform
bdcfield using <quan> DataTable-menge.
perform
bdcfield using <indicator> DataTable-indicator.
.
.
.
endloop.
enddo.
I only focus on the most difficult part, otherwise
we will lost in the sea of code.
| Beam Back to ABAP Index
ABAP Cafe for Abapers Beam Back to Main Index
|