Ah yes here it is. It's just a rip of an internal procedure so won't work as it is, but gives you an idea.
Code:
PROCEDURE AmalgamateLines :
/*------------------------------------------------------------------------------
Purpose:
Notes:
------------------------------------------------------------------------------*/
DEFINE VARIABLE lv-SortField AS CHARACTER NO-UNDO.
DEFINE VARIABLE lv-Query AS HANDLE NO-UNDO.
DEFINE VARIABLE lv-QueryString AS CHARACTER NO-UNDO.
DEFINE VARIABLE lv-QueryBuffer AS HANDLE NO-UNDO.
DEFINE VARIABLE lv-Handle AS HANDLE NO-UNDO.
DEFINE VARIABLE lv-RecQueryString AS CHARACTER NO-UNDO.
DEFINE VARIABLE lv-RecQueryHandle AS HANDLE NO-UNDO.
DEFINE VARIABLE lv-RecBufferHandle AS HANDLE NO-UNDO.
DEFINE VARIABLE lv-i AS INTEGER NO-UNDO.
RUN GetBufferHandle IN lv-Browse-Manager-Handle
(OUTPUT lv-Handle).
CREATE BUFFER lv-QueryBuffer FOR TABLE lv-Handle.
CREATE BUFFER lv-RecBufferHandle FOR TABLE lv-Handle.
ASSIGN
lv-SortField = com-Unique:SCREEN-VALUE IN FRAME {&FRAME-NAME}.
ASSIGN
lv-QueryString = "FOR EACH " + lv-Handle:NAME + " BREAK BY " + lv-Handle:NAME + "." + lv-SortField.
CREATE QUERY lv-Query.
lv-Query:SET-BUFFERS(lv-QueryBuffer).
lv-Query:QUERY-PREPARE(lv-QueryString).
lv-Query:QUERY-OPEN.
lv-Query:GET-FIRST.
DO WHILE NOT lv-Query:QUERY-OFF-END:
IF lv-Query:FIRST-OF(1) THEN
DO:
ASSIGN
lv-RecQueryString = "FOR EACH " + lv-RecBufferHandle:NAME + " WHERE RECID(" + lv-RecBufferHandle:NAME + ") EQ " + STRING(lv-QueryBuffer:RECID).
CREATE QUERY lv-RecQueryHandle.
lv-RecQueryHandle:SET-BUFFERS(lv-RecBufferHandle).
lv-RecQueryHandle:QUERY-PREPARE(lv-RecQueryString).
lv-RecQueryHandle:QUERY-OPEN.
lv-RecQueryHandle:GET-FIRST.
END.
ELSE
DO:
DO lv-i = 1 TO NUM-ENTRIES({&AmalgListStartDate}):
FIND FIRST tt-DataCombos
WHERE tt-DataCombos.DataColumn EQ entry(lv-i,{&AmalgListStartDate}) NO-ERROR.
IF tt-DataCombos.WidgetHandle:SCREEN-VALUE NE "0" THEN
DO:
IF lv-QueryBuffer:BUFFER-FIELD(tt-DataCombos.BrowseColumn):BUFFER-VALUE LT lv-RecBufferHandle:BUFFER-FIELD(tt-DataCombos.BrowseColumn):BUFFER-VALUE THEN
lv-RecBufferHandle:BUFFER-FIELD(tt-DataCombos.BrowseColumn):BUFFER-VALUE = lv-QueryBuffer:BUFFER-FIELD(tt-DataCombos.BrowseColumn):BUFFER-VALUE.
END.
END.
DO lv-i = 1 TO NUM-ENTRIES({&AmalgListEndDate}):
FIND FIRST tt-DataCombos
WHERE tt-DataCombos.DataColumn EQ entry(lv-i,{&AmalgListEndDate}) NO-ERROR.
IF tt-DataCombos.WidgetHandle:SCREEN-VALUE NE "0" THEN
DO:
IF lv-QueryBuffer:BUFFER-FIELD(tt-DataCombos.BrowseColumn):BUFFER-VALUE GT lv-RecBufferHandle:BUFFER-FIELD(tt-DataCombos.BrowseColumn):BUFFER-VALUE THEN
lv-RecBufferHandle:BUFFER-FIELD(tt-DataCombos.BrowseColumn):BUFFER-VALUE = lv-QueryBuffer:BUFFER-FIELD(tt-DataCombos.BrowseColumn):BUFFER-VALUE.
END.
END.
DO lv-i = 1 TO NUM-ENTRIES({&AmalgListDec}):
FIND FIRST tt-DataCombos
WHERE tt-DataCombos.DataColumn EQ entry(lv-i,{&AmalgListDec}) NO-ERROR.
IF tt-DataCombos.WidgetHandle:SCREEN-VALUE NE "0" THEN
lv-RecBufferHandle:BUFFER-FIELD(tt-DataCombos.BrowseColumn):BUFFER-VALUE = lv-RecBufferHandle:BUFFER-FIELD(tt-DataCombos.BrowseColumn):BUFFER-VALUE + lv-QueryBuffer:BUFFER-FIELD(tt-DataCombos.BrowseColumn):BUFFER-VALUE.
END.
lv-QueryBuffer:BUFFER-DELETE.
END.
IF lv-Query:LAST-OF(1) THEN
DO:
IF VALID-HANDLE(lv-RecQueryHandle) THEN
DO:
lv-RecQueryHandle:QUERY-CLOSE.
DELETE OBJECT lv-RecQueryHandle.
END.
END.
lv-Query:GET-NEXT.
END.
lv-Query:QUERY-CLOSE.
DELETE OBJECT lv-Query.
DELETE OBJECT lv-QueryBuffer.
DELETE OBJECT lv-RecBufferHandle.
END PROCEDURE.