naw...this will fall apart for values of time straddling the "5 minute mark" ie: 1:14, 1:15, 1:14, 1:16
I see that now...the grouping would be off here for these types of situations.
How much data is there?? there is another way I can think of but its viability would depend on the amount of data.
Basically, would be to simply group by "#of4"
In the report header you would have an initialization formula for arrays
//@initialization (suppressed in Report header)
//assign 50% more than you need max 1000
whilePrintingrecords;
StringVar array Part1_value := ["","",.....,"",""];
datetimeVar array Part1_Time:= [datetime(0,0,0),datetime(0,0,0),.....,datetime(0,0,0),datetime(0,0,0)];
StringVar array Part2_value := ["","",....."",""];
datetimeVar array Part2_Time:= [datetime(0,0,0),datetime(0,0,0),.....,datetime(0,0,0),datetime(0,0,0)];
StringVar array Part3_value := ["","",....."",""];
datetimeVar array Part3_Time:= [datetime(0,0,0),datetime(0,0,0),.....,datetime(0,0,0),datetime(0,0,0)];
StringVar array Part4_value := ["","",....."",""];
datetimeVar array Part4_Time:= [datetime(0,0,0),datetime(0,0,0),.....,datetime(0,0,0),datetime(0,0,0)];
numberVar Pointer1 := 0;
numberVar Pointer2 := 0;
numberVar Pointer3 := 0;
numberVar Pointer4 := 0;
the report would be groupped on "#of4"
Now you place the following in the detail section
//@Collect data
whilePrintingrecords;
StringVar array Part1_value ;
datetimeVar array Part1_Time;
StringVar array Part2_value ;
datetimeVar array Part2_Time;
StringVar array Part3_value ;
datetimeVar array Part3_Time;
StringVar array Part4_value ;
datetimeVar array Part4_Time;
numberVar Pointer1 ;
numberVar Pointer2 ;
numberVar Pointer3 ;
numberVar Pointer4 ;
if {table.#of4} = 1 then
(
Pointer1 := Pointer1 + 1;
Part1_Time[Pointer1] := {table.timestamp};
Part1_Value[Pointer1] := totext({Table.value});
)
else if {table.#of4} = 2 then
(
Pointer2 := Pointer2 + 1;
Part1_Time[Pointer2] := {table.timestamp};
Part1_Value[Pointer2] := totext({Table.value});
)
else if {table.#of4} = 3 then
(
Pointer3 := Pointer3 + 1;
Part1_Time[Pointer3] := {table.timestamp};
Part1_Value[Pointer3] := totext({Table.value});
)
else if {table.#of4} = 4 then
(
Pointer4 := Pointer4 + 1;
Part1_Time[Pointer4] := {table.timestamp};
Part1_Value[Pointer4] := totext({Table.value});
);
now every section of the report is suppressed except for the Report Footer...in here you break up the section into subsections to display the results
at 20 chars/time stamp you will be able to print out 10 lines of data/formula
//@display Timestamp1
whilePrintingrecords;
datetimeVar array Part1_Time;
datetimeVar array Part2_Time;
datetimeVar array Part3_Time;
datetimeVar array Part4_Time;
StringVar array Part1_Value;
StringVar array Part2_Value;
StringVar array Part3_Value;
StringVar array Part4_Value;
numberVar Pointer ;
stringVar result ;
numberVar temp;
numberVar mins;
numberVar testtime;
StringVar final
for Pointer := 1 to 10 do
(
//only process a full set of numbers
if Part1_Value[Pointer] = "" or Part2_Value[Pointer] = "" or Part3_Value[Pointer] = "" or Part4_Value[Pointer] = "" then exit for;
result := "";
temp := 0;
//
This handles the midnight situation
testtime := hour((Part1_Time[pointer])*60 + minute((Part1_Time[pointer])
if testtime < 5 then
temp := temp + 1439 + testtime
else
temp := temp + testtime;
testtime := hour((Part2_Time[pointer])*60 + minute((Part2_Time[pointer])
if testtime < 5 then
temp := temp + 1439 + testtime
else
temp := temp + testtime;
testtime := hour((Part3_Time[pointer])*60 + minute((Part3_Time[pointer])
if testtime < 5 then
temp := temp + 1439 + testtime
else
temp := temp + testtime;
testtime := hour((Part4_Time[pointer])*60 + minute((Part4_Time[pointer])
if testtime < 5 then
temp := temp + 1439 + testtime
else
temp := temp + testtime;
temp := temp/4
if temp > 1439 then
mins := temp - 1439
else
mins := temp;
result := totext(Part1_Time[pointer],"dd/MM/yy"

+ " "
if temp > 1439 then
result : result + totext(maximum(hour(Part1_Time[pointer]),hour(Part2_Time[pointer]),hour(Part3_Time[pointer]),hour(Part4_Time[pointer])),0,"",""

else
result : result + totext(minimum(hour(Part1_Time[pointer]),hour(Part2_Time[pointer]),hour(Part3_Time[pointer]),hour(Part4_Time[pointer])),0,"",""
result := result + ":" + totext(mins,"00"

;
final := final + result + chr(13) + chr(10);
);
final;
now the last is easier
//@display Sum1
whilePrintingrecords;
StringVar array Part1_value ;
StringVar array Part2_value ;
StringVar array Part3_value ;
StringVar array Part4_value ;
numberVar Pointer ;
stringVar Finalresult := "";
for Pointer := 1 to 10 do
(
Finalresult := Finalresult +
totext(tonumber(Part1_value[Pointer]) +
tonumber(Part2_value[Pointer]) +
tonumber(Part3_value[Pointer]) +
tonumber(Part4_value[Pointer]),0) +
chr(13) + chr(10);
);
FinalResult;
these 2 formulas are placed side-by-side and you create as many formula sets as you have initialized for the arrays/10
enable a suppress Blank section on each subsection and sections with no data will disappear.
I still didn't address midnight changes at monthly or yearly change but this should work
Jim Broadbent