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
icReportName | input | character | name of the report (also name of the query or method) |
icLanguageCode | input | character | report language |
tFilter | input | temp-table | |
tResultFieldToCBF | input | temp-table | |
iiBatchSize | input | integer | Number of records in the specific table |
ozReportData | output | dataset-handle | |
olEndOfDataset | output | logical | Indicates the end of the dataset |
oiReturnStatus | output | integer | Return 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.