

        REPo Version 1.0

        REPo (Report Object)
        ---------------------
        REPo is a report writer class that enables Clipper developers to
        integrate an easy to use report writer into their applications.
        More than just a report writer, REPo has powerful quering capa-
        bilities. Also, previously defined reports can be launched and output
        to Printer,Screen,File, or Browsed. Since REPo is object based,
        it's behavior is fully customizable and links into your application
        without looking like a third party report writer. Written in 100%
        percent Clipper (FULL SOURCE IS PROVIDED) it is compatible with all
        linkers on the market.

        REPo is intended to allow Clipper developers to define report creation
        and output capabities in their applications. Since REPo is object based,
        different reporting requirements can be achieved within the applic-
        ation.  REPo objects can be created that perform specific functions,
        insulating the end user from unecessary details.

        Column Reports, Form Letters, and Mailing Labels are examples of the
        types of reporting features REPo objects can provide applications.
        If users desire the ability to create their own reports, REPo objects
        can be instantiated enabling users to create, save, retrieve, and view
        their own reports.  A template file can be defined and assigned to the
        REPo object giving meaningful names to database fields and hiding
        system or key fields the user doesn't need to see.

        What's included
        ---------------

        * Full source code
        * Command line utitlity ( Create and Print Reports from DOS Prompt)
        * REPo library that can be linked into application and distributed
          royalty free
        * Technical and user documentation
        * User documentation on disk that can be copied and distributed with
          application documentation royalty free
        * Class(y) interface (NOTE: Class(Y) is NOT required to use REPo)

        Implement Just Like TBROWSE
        ---------------------------

        If you're familiar with Class(y) or the syntax of object hybrids
        introduced  with Clipper 5.0 (Tbrowse, Get, Error), you will be
        quite comfortable implementing REPO. I refer to the object
        extension library Class(y) because it appears to be the most
        popular way to implement true object oriented capabilities to
        Clipper applications. However, REPO is built with Clipper's class
        creation functions so Class(y) IS NOT REQUIRED.

        Object technology is taking software development by storm. One
        appealing aspect of object technology is the code reusability
        it provides the developer. Objects exist as components that
        can be plugged into applications. Analogous to hardware components
        "plug and play", their behavior/function is not dependent upon other
        components of a system. To implement, the developer only has to know
        the interface mechanism.




        REPo objects can be used in an application in a number of different
        ways. For example, a developer can use REPo to create an invoice
        report and assign a REPo object to a menu option that will print
        invoice(s) when selected. Another REPo object can be assigned to a
        menu option that will invoke the report writer enabling the user to
        modify the invoice report or create an accounts receivable report.

        The three example functions below illustrate different ways REPo
        objects can be used in an application.

        FUNCTION CustPrint
        /*
           Output Customer Listing Report user will be prompted for
           destination.

             Printer
             Screen
             File
             Browser

        */
           local o, nError

               select customer

                o := repoNew()
                o:report := "customer.rpt"

                if (nError := o:print()) > 0
                   ?"Error "+str(nError)+" Browsing Customer Report..."
                endif

         return Nil

        FUNCTION EditCust
        /*
           Invoke Report Writer for Customer information
        */
           local o, nError

               select customer

                o := repoNew()

                o:banner := " Customer Information Report Writer "

                if (nError := o:edit()) > 0
                   ?"Error "+str(nError)+" Editing Customer Information..."
                endif

         return Nil




        FUNCTION CustBrow
        /*
           Browe Customer Listing Report
        */
           local o, nError

               select customer

                o := repoNew()

                o:report := "customer.rpt"
                o:output := "BROWSE"

                if (nError := o:print()) > 0
                   ?"Error "+str(nError)+" Browsing Customer Report..."
                endif

         return Nil


        The previous examples reference only a few of REPo's available
        instance variables and methods.


        Scan Objects
        ------------

        Another unique feature of REPo is the ability to define and add
        scan objects to a REPo object. A scan object enables the developer
        to define a work area that will be scanned and ouput, if field(s)
        are defined in a report, for each detail record. Scan objects are
        assigned a meaningful name enabling the user to access them from
        the report writer.  Applications create appropriate REPo and scan
        object combinations and are created to suite a specific reporting
        option. Since scan objects are defined in the application, work area
        and scan definitions are insulated from the user.

        The examples below show how a scan object can be added to a REPo object
        that will print and edit invoice(s).

        FUNCTION prnInvoices
        /*
           Pr set relation to invnum into invitems // Relate invoice
                                                      // header into itepo:report := "invoes.rpt"


             if (nError := oRepo:print()) > 0 // Output Invoices...
                 tone(500)
    ed to the user in the report writer scan option.

        FUNCTION editInvoices
        /*
           Edit Invoices
        */
 tle := " Invoicems "

             oRepo:addScan(oScan)
             oRepo:template := "invoices.rfw"

             if (nError :"
             endif


         return Nil


        Example Applicaton
        ------------------

        A fully functional eMO.ZIP file from compuserve.


        Class(y) Interface
        ------------------

        If you are using Class(y) to devel all right world wide.
        Other brand and product names are used for identification purposes
        only and may be tradem----------------------------------------------------------------------
   Remit to: PITTsof
             150 S.W. 33rd Street
 States  $5.00
         (  ) Overseas       $10.00

    3)  Amount Due (Total lines 1 & 2).........................: [    ]


   ce within the 30 day trial period.

    Signature: [                                       ]   Date: [          ]


