---------------------------------------------------------------------------
---------------------------------------------------------------------------
        NNNNNNNNNNNN        NNNNNNNNNNNN NNNNNNN    NNNNNN NNNNNNN   NNNNNN
       NNNNNNNNNNNNNN    NNNNNNNNNNNNNN NNNNNNNN   NNNNNN NNNNNNNN  NNNNNNN
      NNNNNN    NNNNN  NNNNNNNNNN      NNNNNNNNN  NNNNNN NNNNNNNNN NNNNNNN
     NNNNNN    NNNNN NNNNNNNN         NNNNNNNNNN NNNNNN NNNNNNNNNNNNNNNNN
    NNNNNNNNNNNN    NNNNNN           NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNN
   NNNNNN   NNNNNN NNNNNNN          NNNNNN NNNNNNNNNN NNNNNN NNNNNNNNNN
  NNNNNN   NNNNNN  NNNNNNNN        NNNNNN   NNNNNNNN NNNNNN   NNNNNNNN
 NNNNNNNNNNNNNN     NNNNNNNNNNNNN NNNNNN    NNNNNNN NNNNNN    NNNNNNN
NNNNNNNNNNNNN        NNNNNNNNNNN NNNNNN     NNNNNN NNNNNN     NNNNNN
---------------------------------------------------------------------------
---------------------------------------------------------------------------
Boston Computer News Network                                  October, 1994
A Service of the Boston Computer Society, USA                  Vol.3  No.10
Sponsored by the Xbase Language Group                       Clipper Version
---------------------------------------------------------------------------
 1. Where is Computer Associates' PASSION for the Desktop?
    -----------------------------------------------------------------------
    ReplyTo:    Les Squires LSquires@WJI.Com  [73020,3435]
    Download:   FTP wji.com, get BCNN0993.TXT.

    I'm dismayed!  Let me tell you why.

    Technicon 93.  It was just one year ago (BCNN0993.TXT) that I returned
    from Technicon 93 with a whole new appreciation of the role that Visual
    Objects would play in CA's support of its own 300 business applications
    in finance, accounting, project management, word processing, etc.  VO
    would be the in-house development platform of choice.  I reasoned that
    such a heavy reliance on VO would enhance the reputation of Clipper!
    That would enhance my business.  All would be well.

    Technicon 94.  One year later my reading of the situation is just the
    opposite.  I'm concerned that VO may never be more than an in-house
    development language.  As important as VO may be for CA, I'm not
    convinced that CA has what it takes to reach beyond its own corporate
    boundaries to the microcomputer desktop.

    Here's my evidence.  It takes passion, big money, strategy, and
    cooperation with other vendors these days to play skillfully on the
    microcomputer desktop--to win and to sustain the attention of
    developers.  Here's the passion that other companies are showing.

    o  Win the hearts of the masses.  Microsoft flooded the market with an
       estimated 1.5 million copies of Access to power users.  Microsoft
       thereby paved the way for experienced developers like yourself to
       come along afterward to teach power users about data modeling and
       referential integrity.  Microsoft's action put money into
       developer's pockets.

    o  Give developers a break when they shop around.  Microsoft priced
       Access at about the price of a good textbook.  Remember Oracle's
       $199 offer several years ago?  Gupta recently gave away 50,000
       copies of a package worth several thousand dollars.  Powersoft and
       Borland rang my phone off the hook for months with offers to ease
       the way.  Serious players on the desktop are coming to realize that
       few developers have the resources to shop around without lots of
       assistance.

    o  Play ball with EVERYBODY.  The Visual Basic/Access/Excel communities
       are lifting Object Linking and Embedding (VBX, OCX) to an art form.
       Data from all over the world is linked and embedded into simple-
       looking interfaces such as Lotus Notes or Mosaic documents.  More
       important, however, than the fact that application components
       require the means to share, SOFTWARE VENDORS THEMSELVES must learn
       to work cooperatively.  To open up their architectures.  To enter
       into joint ventures.  To share their secrets.  To build something
       together that no single vendor can build alone.


 2. Advantage Xbase Server:  New Life for Novell Databases (Oct. Meeting)
    -----------------------------------------------------------------------
    ReplyTo:  Chuck Mitten <71075,2507>
              Extended Systems, Inc., 6123 N. Meeker Avenue
              Boise ID 83704 USA
    Phones:   208-322-7575, 800-235-7576
    ReplyTo:  Les Squires, Meeting Moderator LSquires@WJI.Com
    Meeting:  October 18, 1994, 6:30 p.m.
    Place:    Boston Computer Society, Waltham, MA USA  617-290-5700

    Editor's Note.  If you have not yet seen the Advantage Server and if
    you have databases on Novell (and wish the performance could be
    increased without buying Pentiums!), this is a must-attend meeting.

    Chuck Mitten describes Extend Systems Product.  The Advantage Xbase
    Server provides networked CA-Clipper applications with key benefits of
    client/server technology such as significantly improved stability,
    integrity and multi-user performance often without rewriting a single
    line of code.  Rather than access the information directly, Advantage
    Xbase Server applications transmit database access requests from the
    client application to the NLM running on the server. By processing
    those requests on the server, the Advantage Xbase Server can eliminate
    index corruption, increase application performance and reduce network
    traffic.  The Advantage Xbase Server consists of a CA-Clipper
    Replaceable Database Driver (RDD) and a NetWare Loadable Module (NLM)
    which runs on a NetWare file server.  The Advantage Xbase Server works
    directly with DBF files, and supports industry standard NTX, CDX and
    IDX index formats.

    The Advantage Xbase Server uses multi-threaded and shared memory
    designs to accept and execute multiple users requests simultaneously.
    This allows the Advantage Xbase Server to minimize server memory usage
    while simultaneously optimizing performance.  While many of the leading
    SQL server products require up to 2 MBytes of server memory per user,
    the Advantage Xbase Server's small footprint allows the NLM to support
    more than 50 users in just 2 MBytes of server memory.  In addition, the
    number of NLM threads can be configured depending upon your desired
    server application. Decreasing the number of threads reduces the
    overall impact of the Advantage Xbase Server, and ensures plenty of CPU
    bandwidth for other server tasks. Increasing the number of threads
    increases the amount of CPU bandwidth dedicated to servicing database
    requests, which can provide better database application performance.

    The latest release (3.0) of the Advantage Xbase Server includes several
    new features that provide even better application performance, ease
    database administration, and make it even easier to use.  The Advantage
    Expression Engine allows the Advantage Xbase Server to build indexes
    and evaluate filters on the server -- transparently.  Instead of
    sending raw information across the network to be processed on the
    client workstation, applications using the Advantage Expression Engine
    process data on the server.  The Advantage Xbase Server Management
    Utility allows database administrators to view the current status of
    the server to monitor files open, locks currently in use and which
    users have files open.  To provide a smooth growth path, Advantage
    Xbase Server 3.0 now also supports sharing data and indexes with non-
    Advantage applications, such as those written in dBASE, FoxPro, Clipper
    Summer '87, or even C.


 3. Advantage Xbase Server:  From a Developer's Perspective.
    -----------------------------------------------------------------------
    ReplyTo:  Ron Dace <76256.2415@compuserve.com>
              Manager, Information Systems, Illinois Commerce Commission
              527 E. Capitol, Springfield, IL 62974 USA

    Chuck Mitten asked that I send you a note about our reason for
    selecting Advantage XBase Server in preparation for a users group
    meeting.  If you recall, I sent test results for some benchmarks that
    we ran for various RDD's that was published in the January BCCN.

    Our agency has offices in Chicago and Springfield connected via a T1
    using Novell's multi-protocol router.  Our application servers and
    development staff is located in Springfield.  In preparation for
    developing applications that had to be accessible from both sites, we
    discovered that standard Clipper RDD's performed too slow to be usable.
    Duplicating data at both sites would be a difficult solution to
    implement so we began looking at client/server solutions.  We looked at
    the Advantage XBase Server first since we were already using the
    Successware SIX driver and AXS has the same functionality.  Our testing
    was done to assure ourselves that the benefits of client/server were
    valid in our environment.  The test results proved to our satisfaction
    that AXS would provide acceptable results.

    The seamless integration of AXS and the ability to easily interchange
    other drivers were significant factors in our decision.  By creating
    small libraries of 'wrapper' functions, we are able to use either AXS or
    the Six Driver just by re-linking.

    BTW, we recently had the opportunity to run the benchmarks again to
    compare a similarly equipped file server with a Tricord super-server.
    The performance of AXS on the Tricord was 300% (3 times) the
    performance on the file server under heavy load.  Using the DBFNTX RDD
    the performance was the same so AXS offers scalability over standard
    RDD's.


 4. Reporting from CA-Technicon 94.
    -----------------------------------------------------------------------
    ReplyTo:  Yau-Man Chan, Berkeley  <70731,3523>

    This year the CA developers' conference was held in New Orleans from
    August 21 to August 25th.  There were over 2000 attendees, mostly
    die-hard Clipperheads and just as many VO pre-release buyers!  As
    promised, CA had a Pre-release version of Visual Object for sale.  From
    my informal survey, probably every attendee bought a copy for $550.00!

    Visual Objects.

    More than 50 percent of the sessions were on VO or VO-related topics.
    The response from attendees on their exposure to VO ranged from
    absolute awe to panic.  Many long time Clipper programmers with little
    or no Windows experience expressed fear that they will have a hard time
    dealing with the "paradigm shift" from character base and modal
    programs to GUI and modeless applications.  But "shift happens."  So
    most developers are resigned to have to deal with it!

    Those who are already prepared for Windows object-oriented programming
    are excited with the release of the "pre-release" version of VO -
    promised since the 1990 Developers Conference.  VO is very impressive
    and full-featured and will certainly compete very well with the likes
    of Power Builder and Visual C++.  It far surpass the capability of
    FoxPro for Windows and Access, but it is not an end-user tool by any
    means.  It is a very powerful Windows application development tool for
    developers who want to create robust Windows application to deliver to
    the end user.  VO is everything Computer Associates have promised and
    more!

    Is VO the long-awaited Windows version of Clipper?   Xbase?  Well, yes
    and no.  The only relation to the xBase language is the build-in
    functions that all the xBase programmers are familiar with, like
    SUBSTR(), TRIM(), etc.  But everything that has to do with display and
    data access is different. No more .PRG files.  No more @ SAY..GET's.
    No more make files. In fact, no Makes.  No more compile and link.
    These functionalities are built into the IDE (Integrated Development
    Environment). If you are one of those who thinks that ALGOL is FORTRAN
    just because they have similar looking syntax or if you think C++ is C
    or that any food cooked with soy sauce and ginger is Chinese Food, then
    you will be the one to say that VO is xBase !  I think programmers with
    Small Talk or C++ experience will be able to switch to programming in
    VO easier than die-hard xBase programmers like me.

    VO does have a "terminal" mode which will let the user compile and run
    existing Clipper 5.2 code with minimal changes.  About 95% of Clipper
    5.2 code will run without any recoding.   But the application,
    especially the User Interface produced as a result of using the
    Terminal mode, is ugly (to be kind!).  It has a look and feel of
    character based program running in Windows.   Let me clarify.  It
    produces strictly character base programs but it is windows-based.  It
    does not run in a DOS window; it runs in a Windows window, but without
    all the Windows stuff!  It's bizarre. You have to see it to hate it!
    I do not think any one using VO would want to deliver any programs to
    their clients produced in the VO terminal mode.  I am still baffled as
    to why they put it there--just to say that VO is xBase or to let stuck-
    in-the-mud Clipperheads continue to program in procedural modal
    language and still have the bragging rights of having programmed for
    Windows?

    Announcement of CA-Clipper 5.3.

    CA has proven that it will not abandon the DOS-base Clipper market.
    Clipper 5.3 will have some significant enhancements.

    1. Exospace, the protected mode linker will be packaged as the default
       linker, replacing RTLINK.  This will give the Clipper developer the
       ability to produce both protected and non-protected mode
       applications without your having to buy a separate 3rd party linker.
       Of course, Exospace linker still cannot produce dual mode .EXE file
       - you still a have to invest in a copy of Blinker or Causeway for
       that!

    2. Loadstone Comix Drivers. CA announced an agreement with Lodestone to
       use the COMIX .cdx /.fpt index and memo field RDD for FOXPRO
       compatibility.  This is a change from the use of the Successware's
       SIX driver RDD bundled with 5.2.  COMIX as an RDD has been purchased
       by thousands of Clipper programmers since it has proven itself to be
       much faster and more robust than the RDD provided for .cdx and .fpt
       support in Clipper 5.2.

    3. Ganahl Software's Flexfile.  CA announced an agreement with Ganahl
       Software to provide the FLEXFILE memofield RDD with 5.3.  The
       FLEXFILE .DBV format for memo field support has been a favorite
       among Clipper programmers who wanted to get away from the .DBT
       'bloat' and who wanted to have support for BLOBs.  With FLEXFILE's
       .DBV memofield Clipper programs can store arrays, code blocks and
       binaries in the memofield. .DBV memofield will be a built-in option
       for Clipper 5.3.

    4. Mouse Support. Mouse support will be native to Clipper 5.3.  To
       support this rodent and all the consequences of navigating with
       rodents, the GET class and Tbrowse class have been enhanced.  Native
       mouse support will be a reality with Clipper 5.3

    5. Integrated Development Environment.  One of the most talked about
       addition to Clipper 5.3 is the Workbench IDE.  IDE support is
       strictly optional. In fact you are given the option at install time
       whether or not you want the Workbench.  Workbench is a Windows-based
       IDE which works amazingly close to the IDE of VO. In fact, they
       share a common user interface and functionality.   You can develop
       complete Clipper applications using the IDE in Windows and then run
       the Clipper Applications in DOS.  The Workbench IDE includes a
       'chroma-syntactic' source editor just like VO.  This editor changes
       color of words depending on whether they are keyword, comments or
       just variables!  The importance of such 'chromatic correctness' is
       lost on me.  Smart indentation would be a lot more useful for a
       left-handed touch typist like me!   But then true to the Clipper
       roll-your-own attitude, you can tell the IDE to use your own
       favorite editor as the source editor in the IDE.  Chalk another plus
       for CA for understanding Clipperheads!

       A colorful editor notwithstanding, one of the best reasons for
       developing Clipper applications with the Workbench is the IDE's
       debugger.  Again, the technology is borrowed from VO.  It makes CLD
       looks like a toy.  (CLD is still available for those who choose not
       to install the IDE).  I think most Clipper developers will use the
       WorkBench for the power of the debugger.

    Clipper 5.3 is a major update.  No one from CA will commit to a release
    date yet, but most educated guesses and 'unnamed' source have put the
    date sometime at the end of the year.  What year? <g>


 5. UDF Showcase:  ASEEK() -- Binary Search of a Multi-Dimensional Array.
    -----------------------------------------------------------------------
    ReplyTo:  Edward A. Kleinhample <70574.3514@compuserve.com>

    ASEEK() -- Binary search of a multi-dimensional array. <nKey> is the
               column containing the key value, <xValue> is the value to
               search for - can be  any data type.

    CMP() -    General purpose comparison function used by ASEEK.

    //---------------------------------------------------------------------
    //- Module   : aSeek( aArray, nKey, xValue )
    //- Function : Binary Search of (aArray) for (xValue) in column (nKey)
    //- Notes    : aArray must be sorted in ascending order by column (nKey)
    //-            returns 0 if item NOT located
    //---------------------------------------------------------------------
    function    aSeek( aArray, nKey, xValue )
        local   nStart, nEnd, n, i, j

        //--- Initialize local pointers for first pass
        nStart  := 1                //-top of array
        nEnd    := len( aArray )    //-bottom of array
        n       := 0                //-NOT FOUND

        while .T.
          i := nStart + int( (nEnd - nStart) / 2 )
          if ( j := cmp( xValue, aArray[i][nKey] ) ) == nil //-type mismatch
              n := nil
              exit
          elseif j == 0       //-matches, return this index value
              n := i
              exit
          elseif j > 0        //-Greater, tighten bounds and try again
              nStart := i
          elseif j < 0        //-Less, tighten bounds and try again
              nEnd := i
          end
          //-if we have less than five elements in the search area,
          //-do a conventional search through the remaining elements.
          if nEnd - nStart < 5
             n := aScan( aArray, {|a| a[nKey] = xValue}, nStart, nEnd )
             exit
          end
        end
    return n

    //---------------------------------------------------------------------
    //- Function  : Cmp( a, b ) --> nVal
    //- Purpose   : General Purpose Comparison Function. Return values:
    //-                 0   Arguments are of EQUAL value
    //-                 1   Argument (a) is GREATER than argument (b)
    //-                -1   Argument (a) is LESS than argument (b)
    //-                nil  Arguments are NOT of same data type
    //---------------------------------------------------------------------
    static function Cmp( a, b )         //-General Purpose Comparison
    Function
        local   nReturn
        if ValType( a ) = ValType( b )     //-if types are the same
            if a == b
                nReturn := 0
            elseif a > b
                nReturn := 1
            else
                nReturn := -1
            end
        end
        return (nReturn)
    //-------------- eof: aseek.prg ---------------------------------------

    PushScreen(), PopScreen() - stack based screen/screen segment
    management system. Call pushscreen with a set of coordinates. Call
    PopScreen() to restore the screen segment. For Example:

	PushScreen( 5, 5, 15, 50 )
	  .
          .
	PopScreen()
    Remaining functions are useful for management of the screen stack system.

    //--- stacks.prg
    /*---------------------------------------------------------------------
       PushScreen( t, l, b, r ) --> lSuccessful
           Push the specified screen region onto the screen stack.

       PopScreen() --> lSuccessful
           Pop the top screen item off of the stack and restore it to the
           screen.

       PopAllScreens() --> nil
           Restore all screens currently remaining on the screen stack.

       SetStackFrame( aFrame ) --> aOldFrame
           Establish a local stack frame for PushScreen and PopScreen
           functions.

           This function is used to link the PushScreen and PopScreen (and
           PopAllScreens) functions to a local stack. SetStackFrame returns
           a reference to the previous stack frame that should be saved by
           the user's program and later restored using a SetStackFrame
           function. For Example

           local aMyStack := {} ,;     //-local screen stack
                 aSaveStack
              .
           aSaveStack := SetStackFrame( aMyStack ) //-establish local stack
              .
              .
           SetStackFrame( aSaveStack )  //-restore previous screen stack

       GlobalStack() --> nil
           Restore internal stack frame for PushScreen and PopScreen
           functions (*)

       * Perform a PopAllScreens() call prior to GlobalStack() or the
         contents of the local stack may be lost.

    -----------------------------------------------------------------------
    */
    //#define DEBUG             //-un-comment to include stack tracing
    #command    DEFAULT <a> := <b>;
                =>;
                <a> := if(<a> = nil, <b>, <a>)

        #define  ST_DEPTH   20          //-maximum stack depth
        static  _aLocal  := {}          //-local default stack frame
        static  _aStack                 //-Stack pointer

    //---------------------------------------------------------------------
    //- Module   : PushScreen( <nTop>, <nLeft>, <nBottom>, <nRight> )
    //- Function : Push specified screen contents on to the stack
    //- Notes    : retrieve with PopScreen
    //---------------------------------------------------------------------
    function    PushScreen( nTop, nLeft, nBottom, nRight )
        local lReturnStatus := .F. , oE
        default _aStack := _aLocal       //-default pointer to local stack

        if len( _aStack ) == ST_DEPTH
            oE := ErrorNew()
            oE:subsystem   := "STACKS"
            oE:operation   := "PushScreen()"
            oE:description := "Screen Stack Overflow"
            eval( ErrorBlock(), oE )
        else
            aadd( _aStack,                                     ;
                  { nTop, nLeft,                               ;
                    nBottom, nRight,                           ;
                    SaveScreen( nTop, nleft, nBottom, nRight ) ;
                  }                                            ;
                )
            lReturnStatus := .T.
        endif

        #ifdef DEBUG
            StackDepth()
        #endif
        return (lReturnStatus)

    //---------------------------------------------------------------------
    //- Module   : PopScreen()
    //- Function : Pop saved screen from top of stack
    //- Notes    : returns a .T. if successful
    //---------------------------------------------------------------------
    function    PopScreen()
        local   i := len( _aStack ) ,;
            lReturnStatus := .F., oE

        if len( _aStack ) == 0
            /* stack underflow - error out */
            oE := ErrorNew()
            oE:subsystem   := "STACKS"
            oE:operation   := "PopScreen()"
            oE:description := "Screen Stack Underflow"
            eval( ErrorBlock(), oE )
        else
            RestScreen( _aStack[i][1], _aStack[i][2] ,  ;
                        _aStack[i][3], _aStack[i][4] ,  ;
                        _aStack[i][5]                   ;
                      )
            _aStack := aSize( _aStack, i-1 )
            lReturnStatus := .T.
        endif

        #ifdef DEBUG
            StackDepth()
        #endif
        return lReturnStatus

    //---------------------------------------------------------------------
    //- Module   : PopAllScreens()
    //- Function : Pop All remaining screens from the stack
    //- Notes    : returns nil value
    //---------------------------------------------------------------------
    function    PopAllScreens()
      while len( _aStack ) > 0
            PopScreen()
      end
    return nil

    //---------------------------------------------------------------------
    //- Module   : SetStackFrame( aFrame ) --> aOldFrame
    //- Function : Etablish a local stack frame
    //- Notes    : points internal frame pointer to specified array variable
    //---------------------------------------------------------------------
    function    SetStackFrame( aFrame )
        local   oE, aOldFrame
        if valtype( aFrame ) != "A"         //-not an array
            /* Error out! */
            oE := ErrorNew()
            oE:subsystem   := "STACKS"
            oE:operation   := "SetStackFrame()"
            oE:description := "Stack Frame Type Error"
            eval( ErrorBlock(), oE )
        else
            aOldFrame := _aStack  //-pass current frame back to caller
            _aStack   := aFrame   //-point frame pointer at user's stack
        end
        return (aOldFrame)

    //---------------------------------------------------------------------
    //- Module   : GlobalStack() --> nil
    //- Function : Set frame pointer back to local stack
    //---------------------------------------------------------------------
    function    GlobalStack()
    _aStack := _aLocal      //-point frame pointer back at internal stack
    return nil

    //---------------------------------------------------------------------
    //- Module   : StackDepth() --> nil
    //- Function : Display Stack Depth (hotkey function)
    //- Notes    : Note - This function is provided as a means of locating
    //-            and stack overflows. It should be accessed via a hot-key
    //---------------------------------------------------------------------
    function    StackDepth()

    @ 0, 0  say "Stack: " + padl( len( _aStack ), 3 )
    return nil

    //------- eof : stacks.prg --------------------------------------------


 6. Reply to 'Does Windows and .DLLs mean the end of the .LIB?'
    -----------------------------------------------------------------------
    ReplyTo:  David Kuechler  71202.1315@Compuserve.Com

    DLLS are in effect like giving the product away to all of your clients.
    If you develop an application for a company which also has its own
    development team, as soon as you hand over the final build, what's to
    stop them from re-using the .DLLs.

    A technique used by DLL's to avoid this problem is to have a little
    library which _must_ be linked in by the application in order to use
    the DLL.  This library can be anything from a "shell" around the
    DLL's functions, to a simple call to a hidden DLL routine to set a
    switch so that the other DLL functions will work.

    Insofar as people breaking that, people can ultimately just copy the
    disk if they really want to rip you off.  The same argument can be made
    about Clipper or MS Word or Lotus 1-2-3: "Once you give them a disk,
    what's to stop them from making copies for everybody?"  I think the
    reality is that the overwhelming majority of people (and especially
    software developers) are pretty honest in these issues.


 7. Subscribe To and/or Publish in the PC Developer Magazine.             $
    -----------------------------------------------------------------------
    ReplyTo:  Stephen Moignard <76711.1243@compuserve.com>
              Publisher, PC Developer Magazine, Melbourne, Australia
              PO Box 59, Moorabbin VIC 3189, Australia
    Phone:    613-532-0684
    Fax:      613-532-0685
    BBS:      613-532-1689

    Subscriptions.

    PC Developer magazine is easy to read and understand, yet tackles tough
    language specific and generic issues. In depth articles look at
    maximizing your performance with Access, Visual Basic, C/C++, Pascal,
    Paradox, FoxPro, Clipper and more.  Indexed Resource diskettes with
    every issue let you play with source code and sample executables.  PC
    Developer now has at least 72 pages packed with information to keep you
    up with the best.  Sharpen your skills and make your code more
    efficient by learning the latest techniques.  Enjoy programming
    professionally with your own languages, and know what is happening with
    the others. Only PC Developer has the breadth and depth to help you
    write innovative, powerful and bullet proof applications.  Subscribe to
    PC Developer magazine now - its the only way you can get it!

    For one free issue, send your name, address, phones and fax numbers,
    and list of languages you use.  Tell them BCNN sent you.  This is an
    introductory offer only--valid until end of November.

    Publish.

    We pay .14c Aust per word (including source code) for all published
    articles - and at 72 pages per issue - we need heaps of articles.
    Subjects required:  Access, C/C++, Visual Basic, DBASE/Windows,
    Clipper, Fox, and SQLWindows!  Paradox, Pascal, Assembler, etc. - all
    PC Development languages, especially GUI.

    Synopses should be sent to my email address (76711,1243) with full
    author contact details for posting cheques (all paid in US or other
    local currencies).  Articles should be exclusive, but joint publication
    will be considered under some circumstances.


 8. Back Issues of BCNN Clipper Newsletter Available via FTP.
    -----------------------------------------------------------------------
    ReplyTo:    Les Squires LSquires@WJI.Com  [73020,3435]

    Back issues of email newsletters for Clipper, Access, Fox,
    SQLWindows, and Suite/Ole2.0 are available via FTP.  FTP to
    WJI.COM, login as ftp, use your login name as your password, and
    follow the directions.


 9. CD-ROM Opportunity for Clipper Third Party and Shareware Developers.
    -----------------------------------------------------------------------
    ReplyTo:  Edward Tiley of Tallahassee Florida 32311 USA <72007,3455>

    The next version of my book, Using Clipper, is going to have a CD ROM
    disk bound into the back of the book.  If you have anything in the way
    of public domain code, crippled demos of your third party library, or
    shareware Clipper add-ons, let me know.

    This offer is open to anyone with something to share.  The only
    criterion is that material must provide useful value to a Clipper
    programmers and not be JUST a blatant advertisement.


10. EndofMonth Function
    -----------------------------------------------------------------------
    ReplyTo:  Dana  P. Crenshaw [75022,1343]

    I was reading the latest newsletter article containing a function for
    finding the last day in the month.  I would like to submit this to your
    readership:

    *----------------------
    Function LastDay(cDate)  //-expected format is string date mm/dd/yy
    *----------------------
    local dMaxDate := ctod( left(cDate,3) + '28' + right(cDate,3) )
    local nMon        := Month(dMaxDate)
    do while Month(dMaxDate + 1) == nMon
         dMaxDate++
    enddo
    return (dMaxDate)  //-returns last day in date format


11. ProHP 6.0 - Now supports Color printers. Upgrade Offer               $
    -----------------------------------------------------------------------
    ReplyTo:  Zion Nefesh ProHP <70712,3072>
    Fax:      407-774-6750
    Phones:    800-374-7734, 407-774-7734 )
    New Copy of ProHP 6.0       $179.00
    Upgrade copies of ProHP 6.0   69.00 (Registered users only)
    Copies of EasyLet 2.1         20.00 (Limit 1 for each ProHP upgrade)

    Added Features to version 5.42
    ------------------------------
    Fully support the DeskJet 1200C (all features like the LaserJet 4 with
    color). PaintJet XL300 is like the DeskJet 1200C without all the fonts
    and it is also supported. With the DeskJet 1200C and PaintJet XL300 you
    can scale, render and print color PCX images. You'll get excellent
    color output. With all and other DeskJet printers you can create define
    and mix your own color palettes, select and use easily.  New HP_prpcx()
    with progress function and option to abort the process.  ProHP 6.0 has
    better memory management.

    New DeskJet functions
    ---------------------
    DJ_prcpcx()     print a PCX color image to the printer
    DJ_initRGB()    Create a modifiable RGB palette
    DJ_BW_pal()     Set BW palette
    DJ_CMY_pal()    Select 8 entry CMY palette
    DJ_RGB_pal()    Select 8 entry RGB palette
    DJ_addRGB()     Add RGB color to palette
    DJ_flush()      Flush all pages
    DJ_gamma()      Specify the gamma correction to be applied
    DJ_media()      Select media type
    DJ_negmove()    Specifies whether negative motion will be used
    DJ_poppal()     Pop palette from stack
    DJ_pushpal()    Push a copy of the active palette to stack
    DJ_quality()    Select print quality
    DJ_render()     Select render algorithm
    DJ_scaleHW()    Set dest the foreground color
    _writeat()      Write text to the screen while printing.


12. Technicon '94 Proceedings Book Now Available Through Client Care.
    -----------------------------------------------------------------------
    ReplyTo:  Computer Associates Client Care <72662,3706>
    Phone:    1-800-CALL-CAI (225-5224)

    Starting today, CA Client Care will start processing orders for the
    Technicon '94 Proceedings book.  You will be charged $75 a copy, which
    includes shipping and handling within the US.  (Depending on the
    country, there may be an additional charge to ship it outside of the
    US.)

    Copies are limited, and orders will be processed on a first come, first
    serve basis.


13. New OO Articles Posted on CASE Forum.
    -----------------------------------------------------------------------
    ReplyTo:  Bill Lazar 76270,1541

    Ed Berard, creator of the Berard methodology, has just posted two new
    articles in the CASE-DCI forum (GO CASE), plus some background on
    himself and his work.

    Ed describes the two postings as follows:

    I have uploaded an article titled "Issues on the Testing of Object-
    Oriented Software" to library 13 (Quality Assrnc Inst) of the CASE -
    DCI forum.  The article contains a large bibliography.  An updated
    version of this article appears as chapter 15 in my book, "Essays on
    Object-Oriented Software Engineering, Volume 1," published by Prentice
    Hall, copyright 1993.  (The name of the document should be
    "OOTEST.TXT".)

    -and-

    I have posted an article titled "Basic Object-Oriented Concepts" in
    library 3 (Objects) in the CASE - DCI Forum.  The article presents an
    easy-to-read description of such object-oriented concepts as classes,
    metaclasses, parameterized classes, inheritance, aggregation, and
    systems of objects. The size of the article is about 35K.  You may
    freely copy and distribute this article as long as you credit the
    author (me).


14. BCNN Statement of Ownership, Copyright, and Responsibility.
    --------------------------------------------------------------------------
    The BCNN Newsletter is sponsored by the Xbase User Group of the Boston
    Computer Society.  BCNN is dedicated to keeping professional database
    developers (both consultants and corporate employees) informed about
    educational events, meetings, job openings, world events, notable
    articles, technical tips, new and 'must have' products, etc.

    As an electronic network, organized by interest rather than geography,
    BCNN is also a hub where developers can address world class issues to
    fellow developers around the world.  Recipients agree to respond via
    Email to periodic polls of their directions, opinions, and needs. For
    those who do not have User Groups in their areas, BCNN is a vehicle
    where individuals can volunteer and contribute to something larger than
    themselves.  Over 10,200 persons world-wide participate in discussions
    on CA-Clipper, Microsoft Access, FoxPro, Gupta SQLWindows, and
    Suiteware.

    The newsletter is distributed monthly by electronic mail via CompuServe,
    Internet, FidoNet, and other electronic gateways.  It is free of charge
    to individual developers.  Modest fees are charged to corporations for
    job placement and third-party announcements.  Opinions expressed are
    solely expressed by the authors or by the Xbase Language Group of the
    Boston Computer Society, even in cases where 'Xbase Language Group'
    is abbreviated to 'BCS'.  All materials are copyrighted by the BCS,
    unless otherwise indicated, and free for any user group to
    redistribute via BBS or newsletter on the condition that a by-line
    referencing the BCNN and the individual author are included.

    Les Squires, Director
    Xbase User Group
    c/o Word Jenny, Incorporated
    P. O. Box 126
    29 Brick Kiln Road, Kilnwood
    Center Harbor, New Hampshire 03226-0126 USA
    603-253-6109                  //-Primary Phone & Messages 24 hours
    603-253-7214                  //-Messages Only 24 hours
    603-253-9864                  //-Fax 24 hours a day
    INTERNET:LSquires@WJI.Com     //-First choice for Email.
    CIS:73020,3435                //-Second choice for Email.

    Boston Computer Society, Inc.
    101 First Avenue, Suite 2
    Waltham, MA 02154
    617-290-5700  General Number
    617-290-5700  Ext. 432 for up-to-date meeting information.

    Add Subscribers:        CLIPPER-YES to LSquires@WJI.Com.
    Delete Subscribers:     CLIPPER-NO  to LSquires@WJI.Com.
    Address Change:         Email using OLD Address. Indicate New Address.
    Back Issues:            FTP WJI.Com, Login as ftp, use your ID as the
                            password, cd clipper, copy all back issues.

    WWDN(tm) World Wide Developer Network Email Services donated by
    Word Jenny, Inc., Boston, Massachusetts USA    LSquires@WJI.Com

    (c) 1994 Boston Computer Society, Inc.
