2013 May 23 7:43 AM
Dear Experts,
I have 6 fields in an internal table.
1. STDT - Start Date
2. STTM - Start Time
3. ENDT - End Date
4. ENTM - End Time
5. DURN - Duration
6. OVRLP -Overlap
I have calculated DURN through FM 'SWI_DURATION_DETERMINE' (using fields 1 to 4).
Then I have sorted the table in descending order of DURN.
Now the highest duration record is in the 1st line.
The requirement now is
I need to calculate the duration-overlap of each line item with reference to the 1st record, into field OVRLP (in hours or minutes or seconds).
Your help is requested.
kind regards
Jogeswara Rao
2013 May 23 10:23 AM
Hi Jog,
try this logic.
There is a function module C14B_DATE_TIME_COMPARE , which outputs value X if datetime1 < datetime2. In the code below, COMPARE refers to this FM. Duration refers to your FM to calculate duration
(Also another FM is there SD_CAL_DURATION_FROM_DATETIME which outputs X if datetime 2 < datetime 1. The following logic is based on the first FM, if you want to use the second FM, change logic accordingly. )
Suppose your internal table is itab.
ws1 like line of itab,
ws2 like line of itab.
res1 type c, res2 type c, res3 type c.
read itab index 1 into ws1.
loop at itab into ws2.
* When the start date of current record is between start and end date of first record
compare (ws2-stdt, ws2-sttm, ws1-endt, ws1-entm)
res1 = result.
compare(ws1-stdt,ws1-sttm, ws2-std, ws2-sttm)
res2 = result.
if res1 = 'X' and res2 = 'X'. " Start date of current record is between the start and end date of first record.
compare(ws1-enddt,ws1-enddtm, ws2-enddt,ws2-endtm) " get end date of overlap.
if res3 = 'X
ws2-overlap = duration(ws2-stdt,ws2sttm, ws1-enddt,ws1-endtm.)
else.
ws2-overlap = duration(ws2-stdt, ws2-sttm, ws2-enddt, ws2-endt.)
endif.
modify itab index sy-tabix from ws2.
clear : res1, res2, res3, ws2.
continue
endif.
* When enddate of current record is betwen start and end date of first record.
compare (ws2-enddt, ws2-endtm, ws1-endt, ws1-entm)
res1 = result.
compare(ws1-stdt,ws1-sttm, ws2-enddt, ws2-endtm)
res2 = result.
if res1 = 'X' and res2 = 'X'. " End date of current record is between the start and end date of first record.
compare(ws1-stdt,ws1-sttm, ws2-stdt,ws2-sttm) " get start date of overlap.
if res3 = 'X
ws2-overlap = duration(ws1-stdt,ws1sttm, ws2-enddt,ws2-endtm.)
else.
ws2-overlap = duration(ws2-stdt, ws2-sttm, ws2-enddt, ws2-endtm.)
endif.
modify itab index sy-tabix from ws2.
clear : res1, res2, res3, ws2.
continue
endif.
endloop.
Dont forget to clear the flags and ws2 after each loop.
Message was edited by: Susmitha Thomas
2013 May 23 8:06 AM
What do you mean by duration overlap?
Does the timing and date also have coincide with the first record or you look only at the duration?
2013 May 23 8:23 AM
There is no role of DURN field, further after sorting.
I need the timing overlap of each line item with reference to the first one.
Perhaps I should have used the title as ' Timing Overlap'
Thank you Susmitha for response.
-Jogeswara Rao
2013 May 23 8:54 AM
I think by Overlap you mean how much time is shared by interval of first record and interval of n'th record.
Assuming LT_REC is internal table, LS_REC is structure/workarea, LS_FIRST is another structure meant to store first record data.
SWI_DURATION_CALCULATE gives 0 if end date/time is less than start date/time.
Think of first interval as (2....7) and second interval as (4....12).
Durations between start of one interval and end of other interval would be 10 and 3.
I believe you are considering 3 to be the overlap value in this case.
Here is a pseudocode.
Read table LT_REC into LS_FIRST index 1.
Loop at LT_REC into LS_REC.
Calculate duration between (LS_REC-STDT, LS_REC-STTM, LS_FIRST-ENDT, LS_FIRST-ENTM).
Calculate duration between (LS_FIRST-STDT, LS_FIRST-STTM, LS_REC-ENDT, LS_REC-ENTM).
Out of 2 calculated durations, whichever is lower should be the overlap. Store in it LS_REC-OVRLP.
If the invervals don't overlap, lower calculated duration would be 0.
Modify LT_REC using LS_REC.
Endloop.
If the pseudocode is incorrect or does not make sense, let us know by example data what overlap value are you expecting.
2013 May 23 9:53 AM
Thank you Manish,
I feel you've understood the issue. We are studying the code.
But the example you've give above the code ( 2..7 & 4....12), I could not follow.
So to clear any understanding-gap, I am attaching the graphical representation of my requirement.
Hope this helps you to understand the requirement fully.
2013 May 23 9:01 AM
What about (in pseudo-code):
OVRLP(I1, I2) = DURATION( MAX(START_I1, START_I2) ... MIN(END_I1, END_I2) )
2013 May 23 9:21 AM
i dont know if this is your query , but from what i understand...
overlap line n -->
check start date + start time of line n if greater than end date + end time of line1 , overlap = 0
if not then overlap = end date + end time of line 1 - start date + start time of line n...
you can use F.M. SD_CALC_DURATION_FROM_DATETIME to calculate the difference in hours , it also sets a flag to X if the hours are negative , so you can put your first condition of overlap being 0 if the flag is set(i.e. start date and time is after end date and time of the first line)
2013 May 23 10:18 AM
ok so you can have overlap at the starting also , sorry skipped my mind...
so based on the start date + time , you need to find where does it lie
1)less than start date +time of 1st item,then check end date +time should lie in between , else over lap 0.
2)in between start date + time and end date + time of 1st item
3)greater than end date + time of 1st item ,
for the third case its 0,
for the second case, and first case,
when passing date to FM sd_calc_duration_from_datetime
keep variable lv_to_date, lv_from_date , same for time
if its in the first case - if it satisfies the above condition
lv_from_date = start date of 1st item
IF end date + time of nth line item is GT end date + time of 1st.
lv_to_date = end date of 1st item (same for time).
ELSE.
lv_to_date = end date of nth item.
ENDIF.
Now pass this to the FM
Similar condition check you need to do for second case... I hope it make sense...
2013 May 23 10:23 AM
Hi Jog,
try this logic.
There is a function module C14B_DATE_TIME_COMPARE , which outputs value X if datetime1 < datetime2. In the code below, COMPARE refers to this FM. Duration refers to your FM to calculate duration
(Also another FM is there SD_CAL_DURATION_FROM_DATETIME which outputs X if datetime 2 < datetime 1. The following logic is based on the first FM, if you want to use the second FM, change logic accordingly. )
Suppose your internal table is itab.
ws1 like line of itab,
ws2 like line of itab.
res1 type c, res2 type c, res3 type c.
read itab index 1 into ws1.
loop at itab into ws2.
* When the start date of current record is between start and end date of first record
compare (ws2-stdt, ws2-sttm, ws1-endt, ws1-entm)
res1 = result.
compare(ws1-stdt,ws1-sttm, ws2-std, ws2-sttm)
res2 = result.
if res1 = 'X' and res2 = 'X'. " Start date of current record is between the start and end date of first record.
compare(ws1-enddt,ws1-enddtm, ws2-enddt,ws2-endtm) " get end date of overlap.
if res3 = 'X
ws2-overlap = duration(ws2-stdt,ws2sttm, ws1-enddt,ws1-endtm.)
else.
ws2-overlap = duration(ws2-stdt, ws2-sttm, ws2-enddt, ws2-endt.)
endif.
modify itab index sy-tabix from ws2.
clear : res1, res2, res3, ws2.
continue
endif.
* When enddate of current record is betwen start and end date of first record.
compare (ws2-enddt, ws2-endtm, ws1-endt, ws1-entm)
res1 = result.
compare(ws1-stdt,ws1-sttm, ws2-enddt, ws2-endtm)
res2 = result.
if res1 = 'X' and res2 = 'X'. " End date of current record is between the start and end date of first record.
compare(ws1-stdt,ws1-sttm, ws2-stdt,ws2-sttm) " get start date of overlap.
if res3 = 'X
ws2-overlap = duration(ws1-stdt,ws1sttm, ws2-enddt,ws2-endtm.)
else.
ws2-overlap = duration(ws2-stdt, ws2-sttm, ws2-enddt, ws2-endtm.)
endif.
modify itab index sy-tabix from ws2.
clear : res1, res2, res3, ws2.
continue
endif.
endloop.
Dont forget to clear the flags and ws2 after each loop.
Message was edited by: Susmitha Thomas
2013 May 23 11:59 AM
2013 May 23 11:06 AM
I have edited the code a little. Let me know if its giving the right output.
2013 May 23 11:24 AM
Hi ,
check FM TTE_CHK_DTRNG_DATETAB_2(checl Funtion Group for more FMs) along with FM's mentioned by Susmitha.
Prabhu