project BLF > class Report Component > method ProcessReportLogic

Description

Generic method for running a report.
Returned data will be split up in segments to reduce the amount of data returned in one run. This method must be called repeatedly, untill the olEndOfDataset boolean is true, and all returned data should be merged in a single dataset to form the entire report dataset.


Parameters


icReportNameinputcharactername of the report (also name of the query or method)
icLanguageCodeinputcharacterreport language
tFilterinputtemp-table
tResultFieldToCBFinputtemp-table
iiBatchSizeinputintegerNumber of records in the specific table
ozReportDataoutputdataset-handle
olEndOfDatasetoutputlogicalIndicates the end of the dataset
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


unused


program code (program1/breport.p)

If oiReturnStatus = 0
Then Assign oiReturnStatus = -98.

/*Count buffers in ozReportData*/
Assign viCountBuffers = 0.

/*if this is the first time the method is called in this instance then do the following*/
If vlFirstCall = True
Then Do:

    if iiBatchSize = 0 Or
       iiBatchSize = ?
    then do:
        assign vcFile = search ("server.xml":U)
               viBatchSize = 5000.                          
    
        if vcFile <> ?
        then do:
         
            assign vhFcComponent = ?.
            <M-2 run MainBlock
               () in XML>
            assign vhXMLhandle = vhFcComponent.
            
            <M-5 run ReadXMLNodeValue
               (input  vcFile (icXMLFile), 
                input  'reports':U (icStartTag), 
                input  'batchsize':U (icNodeTag), 
                output vcbatchsize (ocNodeValue), 
                output viFcReturnSuper (oiReturnStatus)) in XML>
            run gipr_DeleteProcedure in vhXMLhandle.
            delete procedure vhXMLHandle.
            if viFcReturnSuper <> 0
            then assign oiReturnStatus = viFcReturnSuper.
            if viFcReturnSuper < 0
            then return.
            if vcbatchsize <> ""
            then assign viBatchSize = integer (vcBatchSize) no-error.
        end.
    end.
    Else Assign viBatchSize = iiBatchSize.   

    create dataset vhReportDatasetForBatch in widget-pool "non-persistent".
    
    <M-4 run ApiProcessReportLogic
       (input  icReportName (icReportName), 
        input  icLanguageCode (icLanguageCode), 
        input  tFilter (tFilter), 
        input  tResultFieldToCBF (tResultFieldToCBF), 
        output vhReportDatasetForBatch by-reference (ozReportData), 
        output viFcReturnSuper (oiReturnStatus)) in breport>    

    If viFcReturnSuper <> 0
    Then Assign oiReturnStatus = viFcReturnSuper.
    /*yns
      Do not return, this causes an error in the .Net open client layer
    if viFcReturnSuper < 0
    then return.*/   

    Assign viCount1 = 1
           viCount2 = 0
           viFcCount2 = 0
           vlBatch = False.

    /*add buffers to output dataset handle (tqFilter,tqHeader,tqText)*/
    /*and see if we need batching*/
    Do viFcCount1 = 1 To vhReportDatasetForBatch:Num-buffers:
        vhBufferFrom = vhReportDatasetForBatch:Get-buffer-handle(viFcCount1).
        If Not (vhBufferFrom:Table = 'tqFilter':U Or
                vhBufferFrom:Table = 'tqHeader':U Or
                vhBufferFrom:Table = 'tqText':U     )
        Then Do:
            Create Query vhQuery in widget-pool "non-persistent".
            vhQuery:forward-only = yes.
            vhQuery:Set-buffers(vhBufferFrom). 
            vhQuery:Query-prepare("for each ":U + vhBufferFrom:Table).
            vhQuery:Query-open.
            Repeat:
                vhQuery:Get-next().
                If vhQuery:Query-off-end 
                Then Leave.
                Assign viFcCount2 = viFcCount2 + 1.
                If viFcCount2 > viBatchSize
                Then Do: 
                    Assign vlBatch = True.
                    Leave.
                End. /*If viFcCount2 > viBatchSize*/
            End. /*Repeat*/
            vhQuery:Query-close.
            Delete Object vhQuery.

            Next.
        End. /*If Not (vhBufferFrom:Table = 'tqFilter':U Or*/

        Create Buffer vhBufferTo For Table vhBufferFrom:Table-handle in widget-pool "non-persistent".
        vhBufferFrom:Table-handle:schema-marshal = "FULL".
        /*Count buffers in ozReportData*/
        Assign viCountBuffers = viCountBuffers + 1.
        If viCountBuffers = 1
        Then ozReportData:Set-buffers(vhBufferTo).
        Else ozReportData:Add-buffer(vhBufferTo).
    End. /*do viFcCount1 = 1 to vhReportDataset:num-buffers:*/  

End. /*If vlFirstCall*/

/*if batching is not needed, copy the rest of the buffers*/
If vlBatch = False
Then Do:
    Do viFcCount1 = 1 To vhReportDatasetForBatch:Num-buffers:
        vhBufferFrom = vhReportDatasetForBatch:Get-buffer-handle(viFcCount1).
        If vhBufferFrom:Table = 'tqFilter':U Or
           vhBufferFrom:Table = 'tqHeader':U Or
           vhBufferFrom:Table = 'tqText':U  
        THEN Next.    

        Create Buffer vhBufferTo For Table vhBufferFrom:Table-handle in widget-pool "non-persistent".
        vhBufferFrom:Table-handle:schema-marshal = "FULL".
        /*Count buffers in ozReportData*/
        Assign viCountBuffers = viCountBuffers + 1.
        If viCountBuffers = 1
        Then ozReportData:Set-buffers(vhBufferTo).
        Else ozReportData:Add-buffer(vhBufferTo).
    End. /*Do viFcCount1 = 1 To vhReportDatasetForBatch:Num-buffers:*/

    /*set end of dataset*/
    Assign olEndOfDataset = True.
End. /*If vlBatch = False */

/*if we need batching*/
Repeat:    
    If viCount1 > vhReportDatasetForBatch:Num-buffers Or
       vlBatch = False
    Then Leave.    

    vhBufferFrom = vhReportDatasetForBatch:Get-buffer-handle(viCount1).    
    
    If vhBufferFrom:Table = 'tqFilter':U Or
       vhBufferFrom:Table = 'tqHeader':U Or
       vhBufferFrom:Table = 'tqText':U  
    Then DO: 
        Assign viCount1 = viCount1 + 1.
        Next.   
    End.

    Assign olEndOfDataset = False.

    Create Temp-Table vhTableHandle in widget-pool "non-persistent".
    vhTableHandle:Create-like(vhBufferFrom).
    vhTableHandle:Temp-table-prepare(vhBufferFrom:Table).
    vhTableHandle:schema-marshal = "FULL".
    Create Buffer vhBufferTo For Table vhTableHandle in widget-pool "non-persistent".

    If viCount2 < viBatchSize
    Then Do:
        Create Query vhQuery in widget-pool "non-persistent".
        vhQuery:forward-only = yes.
        vhQuery:Set-buffers(vhBufferFrom). 
        vhQuery:Query-prepare("for each ":U + vhBufferFrom:Table).
        vhQuery:Query-open.
    End. /*If viCount2 < viBatchSize*/
    Else Assign viCount2 = 0.
    Repeat:
        vhQuery:Get-next().
        If vhQuery:Query-off-end 
        Then Leave.
        
        vhBufferTo:Buffer-create().
        vhBufferTo:Raw-transfer(False,vhBufferFrom).

        Assign viCount2 = viCount2 + 1.
        If viCount2 >= viBatchSize
        Then Leave.        
    End. /*Repeat*/

    If viCount2 < viBatchSize
    Then Do:
        vhQuery:Query-close.
        Delete Object vhQuery.
        Assign olEndOfDataset = TRUE               
               viCount1 = viCount1 + 1.
    End. /*If viCount2 < viBatchSize*/

    /*Count buffers in ozReportData*/
    Assign viCountBuffers = viCountBuffers + 1.
    If viCountBuffers = 1
    Then ozReportData:Set-buffers(vhBufferTo).
    Else ozReportData:Add-buffer(vhBufferTo).
    
    If viCount2 >= viBatchSize
    Then Leave.   
    
End. /*Repeat*/

Assign vlFirstCall = False.

If oiReturnStatus = -98
Then Assign oiReturnStatus = 0.