Module cWebReport.pkg

     1//****************************************************************************//
     2//                                                                            //
     3// $File name  : cWebReport.PKG                                                //
     4// $File title : cWebreport class                                             //
     5// $Author     : John Tuohy                                                   //
     6//                                                                            //
     7// Confidential Trade Secret.                                                 //
     8// Copyright 1998-1999 Data Access Corporation, Miami FL, USA                 //
     9// All Rights reserved                                                        //
    10// DataFlex is a registered trademark of Data Access Corporation.             //
    11//                                                                            //
    12//                                                                            //
    13// $Rev History                                                               //
    14//   8/12/98 jjt - created                                                    //
    15//                                                                            //
    16//****************************************************************************//
    17
    18
    19//
    20//  Report_DS
    21//    BasicReport
    22//       cHTMLReport     - generic html output report
    23//           cWebReport  - special for vdf Web Server
    24//
    25
    26Use cHtmlReport.pkg  // HTML report
    27
    28
    29
    30Class cWebReport is a cHtmlReport
    31
    32    Procedure construct_object
    33        forward send construct_object
    34
    35        
    36        Property String  psHRefName ""
    37        
    38        Property Integer piMaxCount 0
    39        
    40        property RowId priStartRowId
    41        
    42        property RowId priLastRowId
    43        
    44        
    45        Property Integer piStartRecord 
    46        
    47        
    48        Property Integer piLastRecord
    49        
    50        property integer piFoundCount
    51        
    52        property integer pbPartialReport
    53        
    54        property integer piMaxCountBreakLevel
    55
    56        Set Status_Panel_State to False // never want status panel
    57        Set Server to (Main_dd(self))
    58    End_Procedure
    59
    60    
    61    Procedure Close_Output_Device
    62        integer hObj
    63        Get phOutputDevice to hObj
    64        If not hObj ;
    65            Forward Send Close_Output_Device
    66    End_Procedure
    67
    68    
    69    Procedure Initialize_Output_Device
    70       integer hObj
    71       Set phOutputDevice to ghInetSession // output to here
    72       Get phOutputDevice to hObj
    73       If not hObj ;
    74          Forward Send Initialize_Output_Device
    75    End_procedure
    76
    77    
    78    Procedure Output String WrStr
    79       integer hObj
    80       Get phOutputDevice to hObj
    81       If hObj ;
    82           Send OutputHtml to hObj WrStr
    83       else ;
    84           Forward Send Output WrStr
    85    End_Procedure
    86
    87    
    88    Function AddRecordLink string sValue Returns String
    89        string sRefName sUrl sRec sSep
    90        Get psHRefName to sRefName
    91        If (sRefName<>"") Begin
    92            Move (If(pos("?",sRefName),"&","?")) to sSep
    93            Get Current_record of (server(self)) to sRec
    94            Move (sRefName-sSep-"RecId="-sRec ) to sUrl
    95            Get HtmlLink sUrl sValue to sValue
    96        end
    97        //
    98        Function_Return sValue
    99    End_Function
   100
   101    Function AddRowIdLink string sValue Returns String
   102        string sRefName sUrl sRowId sSep
   103        RowId riRowId
   104        Get psHRefName to sRefName
   105        If (sRefName<>"") Begin
   106            Move (If(pos("?",sRefName),"&","?")) to sSep
   107            Get CurrentRowId of (server(self)) to riRowId
   108            Move (SerializeRowId(riRowId)) to sRowId
   109            Move (sRefName-sSep-"RowId=" - sRowId ) to sUrl
   110            Get HtmlLink sUrl sValue to sValue
   111        end
   112        //
   113        Function_Return sValue
   114    End_Function
   115
   116
   117    
   118    Procedure Find_Init
   119        integer iRec iFile
   120        RowId riRowId
   121        forward send Find_Init
   122        set piFoundCount to 0
   123        set priLastRowId to (NullRowId())
   124        set piLastRecord to 0
   125        set pbPartialReport to 0
   126        get priStartRowId to riRowId
   127        if not (IsNullRowId(riRowId)) begin
   128            Send ReadByRowId riRowId
   129        end
   130        else Begin
   131            get piStartRecord to iRec  // compatibility only
   132            If iRec Begin
   133                Get main_file to iFile
   134                If (iFile<>0) begin
   135                    Set_Field_value iFile 0 to iRec
   136                    VFind iFile 0 eq
   137                    If (Found) Begin
   138                        // this does a double find but it insures that the rowId/recnum finding behaviors are
   139                        // the same
   140                        Send ReadByRowId (GetRowId(iFile))
   141                    End
   142                End
   143            end
   144        end
   145    End_Procedure
   146
   147    // Should report be halted because we've encountered enough "records".
   148    
   149    Function HaltReport integer iBreakLevel Returns integer
   150        Integer bHalt iMax iCnt iLevel
   151        If not (pbChildReport(self)) Begin
   152            Get piMaxCount to iMax
   153            If iMax Begin // if iMax is 0, we don't check for halting
   154                Get piMaxCountBreakLevel to iLevel  // break level to count for at. 0=count at body level
   155                Get piFoundCount to iCnt
   156                If ( (iLevel=0) OR (iBreakLevel>0 AND iBreakLevel<=iLevel) ) Begin
   157                    Move (iCnt=>iMax) to bHalt
   158                    If not bHalt ;
   159                        set piFoundCount to (iCnt+1)
   160                end
   161            end
   162        end
   163        Function_Return bHalt
   164    End_Function
   165
   166    // this replaces superclass method. It is identical except where noted
   167    // with **newcode**. This was altered to support the stopping of a report
   168    // after a max number of breaks or records is encountered.
   169    
   170    Function Handle_Report_Line Returns Integer
   171        Integer RCount Rpt_Status CBreak
   172        Get piRecordCount   to RCount     // how many records found so far
   173        Send Assign_Report_Channel       // set channel and Linecount
   174        //
   175        If (No_Finding_state(self)) Move RPT_OK to Rpt_Status
   176        Else Get Find_Rec to Rpt_Status
   177        //
   178        If Rpt_Status eq RPT_OK Begin
   179            Get OnSelection to Rpt_Status
   180            If Rpt_Status eq RPT_OK begin
   181                Set priCurrentRec   to (priFoundRec(self))
   182                Set piCurrentRecord to (Found_Rec(self)) // compatibility...obsolete
   183                Get Test_BreakPoints to CBreak
   184                If (HaltReport(self, CBreak)) begin           // **new code**
   185                    Set priLastRowId to (priCurrentRec(self))      // **new code**
   186                    Set piLastRecord to (piCurrentRecord(self))      // **new code**
   187                    Set pbPartialReport to True               // **new code**
   188                    Move RPT_END to Rpt_Status                // **new code**
   189                end                                           // **new code**
   190                If (Rpt_Status=RPT_OK) Begin                  // **new code**
   191                    If (RCount>0 and CBreak>0) Send Handle_SubTotals CBreak // print needed subtotals
   192                    If CBreak Gt 0 Send Handle_SubHeaders CBreak // Print needed sub headers as needed
   193                    Set priLastRec to (priCurrentRec(self))
   194                    Set Last_Rec to (piCurrentRecord(self))  // compatibility...obsolete
   195                    Increment RCount
   196                    Set piRecordCount to RCount
   197                    Send OnBody
   198                    If (pbCanceled(self)) Move RPT_CANCEL to Rpt_Status
   199                End                                           // **new code**
   200            End
   201            If (Rpt_Status=RPT_OK or Rpt_Status=RPT_NOT_SELECT) ;
   202                Get Handle_KeyPressed to Rpt_Status
   203        End
   204        Function_Return Rpt_Status
   205    End_Function
   206
   207
   208    
   209    Procedure Error_Report integer iErrNum integer iErrLine string sErrMsg
   210        integer hOldError
   211        If not (Error_Processing_State(self)) Begin
   212            Set Error_Processing_State to True // prevents recursion
   213            // this will end the report. Can be overridden in OnError
   214            Set pbCanceled to TRUE
   215
   216            // There should be an error handler or not much happens
   217            Get old_error_object_id to hOldError
   218            If hOldError ;
   219                Send Error_Report to hOldError iErrNum iErrLine sErrMsg
   220
   221            Send onError iErrNum iErrLine sErrMsg // good for augmentation
   222
   223            Set Error_Processing_State to False
   224        End
   225    End_procedure
   226
   227
   228    //  Function: TestBreakPoint
   229    //
   230    // Overlap fields might contain an imbedded zero value. These get passed
   231    // properly in BStr but can not be stored and retreived in an array object.
   232    // We will convert all 0s to 255s. This is imperfect but better than nothing.
   233
   234    
   235    Function TestBreakPoint Integer iBreakLevel Integer iCurrentBreak Returns Integer
   236        Integer bChanged iItem hBreaksArray hmBreakMsg
   237        String  sNewValue sOldValue
   238
   239        Move oBreakArray to hBreaksArray
   240        Move (iBreakLevel-1*2) to iItem
   241        Get Value of hBreaksArray (iItem+1) to hmBreakMsg
   242
   243        If hmBreakMsg Begin
   244            //
   245            Get Value of hBreaksArray iItem to sOldValue
   246            Get hmBreakMsg to sNewValue
   247            Move (Replaces(character(0),sNewValue,character(255))) to sNewValue
   248            Move (sOldValue<>sNewValue) to bChanged
   249            If bChanged ;
   250                Set Value of hBreaksArray iItem to sNewValue
   251        End
   252
   253        If (iCurrentBreak=0) Begin  // if not..then check for a break change
   254            If (piRecordCount(self)=0) ;
   255                Move 1 to iCurrentBreak // first time..break from top\
   256            Else If bChanged ;
   257                Move iBreakLevel to iCurrentBreak
   258        end
   259
   260        Function_Return iCurrentBreak
   261
   262    End_Function
   263
   264    
   265    Function Test_BreakPoints Returns Integer
   266        Integer iCurrentBreak i iMax
   267        Move 0 to iCurrentBreak
   268        Get piNumberBreaks to iMax
   269        For i from 1 to iMax
   270            Get TestBreakPoint i iCurrentBreak to iCurrentBreak
   271        Loop
   272        Function_Return iCurrentBreak
   273    End_Function
   274
   275    Procedure RegisterBreakpoint integer hmMsg
   276        integer iNum
   277        Get piNumberBreaks to iNum
   278        set Value of oBreakArray (iNum*2+1) to hmMsg
   279        Set piNumberBreaks to (iNum+1)
   280    End_Procedure
   281
   282    
   283    Procedure OnInitBreakPoints
   284    End_Procedure
   285
   286    
   287    Procedure Clear_Breakpoints
   288        Set piNumberBreaks to 0
   289        Send Delete_data of oBreakArray
   290        Send OnInitBreakPoints
   291    End_Procedure
   292
   293End_Class