------------------------------------------------------------------------------
------------------------------------------------------------------------------
        NNNNNNNNNNNN        NNNNNNNNNNNN  NNNNNNN    NNNNNN NNNNNNN    NNNNNN
       NNNNNNNNNNNNNN    NNNNNNNNNNNNNN  NNNNNNNN   NNNNNN NNNNNNNN   NNNNNN
      NNNNNN    NNNNN  NNNNNNNNNN       NNNNNNNNN  NNNNNN NNNNNNNNN  NNNNNN
     NNNNNN    NNNNN NNNNNNNN          NNNNNNNNNN NNNNNN NNNNNNNNNN NNNNNN
    NNNNNNNNNNNN    NNNNNN            NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNN
   NNNNNN   MNNNNN NNNNNNN           NNNNNN NNNNNNNNNN NNNNNN NNNNNNNNNN
  NNNNNN   MNNNNN  NNNNNNNN         NNNNNN   NNNNNNNN NNNNNN   NNNNNNNN
 NNNNNNNNNNNNNN     NNNNNNNNNNNNN  NNNNNN    NNNNNNN NNNNNN    NNNNNNN
NNNNNNNNNNNNN        NNNNNNNNNNN  NNNNNN     NNNNNN NNNNNN     NNNNNN
------------------------------------------------------------------------------
------------------------------------------------------------------------------
Boston Computer News Network                                         May, 1994
A Service of the Boston Computer Society, USA                      Vol.3  No.5
Sponsored by the Xbase Language Group                          Clipper Version
------------------------------------------------------------------------------
 1. UDF@Showcase:  My Favorite UDF!
    -----------------------------------------------------------------------
    ReplyTo:   Les Squires bcnn@world.std.com  [73020,3435]

    Beginning this month and lasting for several months, we publish
    favorite UDFS submitted by Clipper developers.  There is something for
    everybody.  Some are sophisticated.  Some are simple.  Some could be
    improved.  But they are somebody's favorite, and that's what counts.
    If you want to submit UDFS of your own, or new and improved versions of
    any UDFS listed here, do it.  As time goes on, if you think we somehow
    misplaced yours, submit it again. :(

    In every case the code is submitted to the public domain.  You are free
    to use and modify as you please.  Neither the individual authors nor
    the BCNN make warranties of any kind.


 2. UDF@Showcase:  EAN_TO_ISBN():  EAN to ISBN Conversion.
    -----------------------------------------------------------------------
    ReplyTo:  Thomas Berend [72762,1630]
              Datatek Software Integration

    You may notice that the EAN barcode on books is ALMOST the same as ISBN
    numbers.  If you are using a wedge to scan this barcode, you can easily
    strip the 978 header.  However, you need to re-calculate the checkdigit
    in order to finish the conversion.  EAN_TO_ISBN() takes the last 10
    digits of the EAN barcode (stripped 978), and converts it to an ISBN.
    Watch out!  an ISBN is not numeric!  'X' is a possible checkdigit.

    FUNCTION ean_to_ISBN (barcode)
    LOCAL isbnsum,i

    if valtype(barcode) <> "C" .or. len(barcode) <> 10
       alert ("Invalid Barcode - '"+barcode+"'")
       return (nil)
    endif

    isbnsum = 0
    i = 10
    do while i >= 2
       isbnsum += (val(substr(barcode,11-i,1)) * i)
       i = i - 1
    ENDDO

    RETURN (left(barcode,9) + substr("0X987654321",mod(isbnsum,11)+1,1))


 3. Cut On-line Costs!  Get More Information!  Tip of the Month.
    -----------------------------------------------------------------------
    ReplyTo:   Les Squires bcnn@world.std.com  [73020,3435]

    Recent CIS-Internet developments have tremendous implications for
    hookup and the amounts we pay to our information providers.  If you
    save money with this tip, please let us know.  If you have problems,
    particularly with front-end readers, let us know that too.

    Option    Your CPU       Telephone       Carrier        CompuServe
    -----------------------------------------------------------------
    1      |     PC     |   |   [LD]   |   | PacketN  |   |    CIS     |
           --------------   ------------   ------------   --------------
    2      |     PC     |   |   800    |   |   N/A    |   |    CIS     |
           --------------   ------------   ------------   --------------
    3      |     PC     |   |   [LD]   |   | Internet |   |    CIS     |
           --------------   ------------   ------------   --------------


    Option 1   Local Numbers to CompuServe.

    You use a local number for CompuServe, right?  When CIS published its
    local numbers, everybody took closest available number to avoid long
    distance telephone charges.  Those of us who live beyond local numbers,
    picked numbers with the cheapest long distance charges.  On the road?
    Why not?  Phone home.

    After login to CompuServe, charges depend on the type of service.  But
    it is critical to remember that _in addition to connect charges_, you
    are paying CompuServe Packet Network charges (about $6.00 per hour in
    the U.S.), even if you are sitting on the free menus in CompuServe.
    Add long distance telephone charges, if you have to call long distance
    to get to the local call, and whew . . . !


    Option 2   Toll Free Numbers to CompuServe (U.S. Only).

    CompuServe offers an 800 number to persons in the U.S.  It isn't free
    (it's about $5.60 per hour), but the 800 service does cut down the leap
    frogging often required with the first option.  Option 2 means no more
    long distance charges while on the road, or you live beyond the reach
    of a local number.  What is important is that you pay EITHER the 800
    charge or the Packet Network charge, but not both.  Call CompuServe
    to find our rates and options.


    Option 3   CIS via Internet.

    Here is the news of the month!  Many people (particularly if your
    company has a direction connection to Internet that offers Telnet) can
    now log into CompuServe from WITHIN AN INTERNET SESSION.

    Entering 'telnet compuserve.com' during your next Internet session
    takes you immediately to CIS prompts HOST ID . . . Enter your CIS ID .
    . . Enter your Password . . ., and bingo you're on CLIPPER or TELECO or
    MSACCESS or FOXGANG or DBA.  Just pure, wonderful, and reasonable
    <rof,l> connect time to your CIS forum of choice.  Bottom line:  the
    Internet removes any need for long distance and for packet network

    I would be particularly interested in how this tip might affect those
    in countries outside the U.S., where telecommunications charges can
    reach $24 and more per hour.  Please drop a note.  If it saves you a
    few bucks, say thanks.

    One problem.  Do you know of any front-end software capable of
    launching a CIS session from Internet?  We ought to pass the hat for
    the first front end developer that meets this challenge!

    Questions?  GO INTFORUM for a special forum that addresses the CIS-INT
    connection.

 4. UDF@Showcase:  Functions to Exchange Data with Windows Clipboard.
    -----------------------------------------------------------------------
    ReplyTo:  Flaviano Tresoldi [73064,2670].
    Note:     Must be linked with FUNKY.

    FUNCTION MAIN()
    LOCAL sTemp, sPmet, aEnv, lTemp, nI

    aEnv := ARRAY(FT_GETE())             //-Tests if Windows is running.
    FT_GETE(aEnv)
    lTemp = .F.
    FOR nI := 1 TO LEN(aEnv)
        IF(AT("windir",aEnv[nI])) > 0    //-by testing if "windir" exists
           lTemp = .T.
        ENDIF
    NEXT
    IF !lTemp
      ? "Windows not running"
      QUIT
    ENDIF
                                  //-OK, now we know Windows is here
    IF !FL_OpenClipboard()        //-try to open the clipboard
      ? "Impossible to open clipboard"
      QUIT
    ENDIF

    sTemp = "This is a message to be sent to clipboard"
    IF !FL_SetClipboard(sTemp)    //-Send msg to Win clipboard
       ? "Not possible to send message to clipboard"
       FL_CloseClipboard()         //-Close clipboard
       QUIT
    ENDIF

    FL_CloseClipboard()           //-Close clipboard
    FL_OpenClipboard()            //-Now re-open to read what is in
    sPmet = FL_GetClipboardData() //-and put the data read into var sPmet
    FL_CloseClipboard()           //-and stop closing clipboard
    ? sPmet
    RETURN NIL


    FUNCTION FL_ClearClipboard()  //-Clear clipboard contents.
    LOCAL lTemp
    lTemp = .F.
    reg_ah("17")
    reg_al("02")
    interrupt("2F")
    IF reg_ax() > 0
      lTemp = .T.
    ENDIF
    RETURN lTemp


    FUNCTION FL_CloseClipboard()   //-Close clipboard.
    reg_ah("17")
    reg_al("08")
    interrupt("2F")
    RETURN NIL


    FUNCTION FL_GetClipboardData()  //-Get data from clipboard.
    LOCAL sTemp:="", nLen
    nLen = FL_GetSizeClipboardData()
    IF nLen > 0
       sTemp = SPACE(nLen)
       reg_ah("17")
       reg_al("05")
       reg_dx("01")
       reg_bx(off(sTemp))
       reg_es(seg(sTemp))
       interrupt("2F")
       IF reg_ax() > 0
         nLen = AT(CHR(0),sTemp)
         IF nLen > 0
          sTemp = SUBSTR(sTemp,1,nLen)
         ENDIF
       ENDIF
     ENDIF
    RETURN sTemp


    FUNCTION FL_GetSizeClipboardData()   //-Get clipboard data length.
    LOCAL nLen

    reg_ah("17")
    reg_al("04")
    reg_dx("01")
    interrupt("2F")
    nLen = reg_ax()
    RETURN nLen


    FUNCTION FL_OpenClipboard()     //-Open the clipboard.
    LOCAL lTemp

    lTemp = .F.
    reg_ah("17")
    reg_al("01")
    interrupt("2F")
    IF reg_ax() > 0
      lTemp = .T.
    ENDIF
    RETURN lTemp


    FUNCTION FL_SetClipboardData(sData)  //-Put data into clipboard.
    LOCAL lTemp
    lTemp = .F.
    IF LEN(ALLTRIM(sData)) > 0
      IF FL_ClearClipboard()
        reg_ah("17")
        reg_al("03")
        reg_dx("01")
        reg_cx(LEN(sData))
        reg_bx(off(sData))
        reg_es(seg(sData))
        interrupt("2F")
        IF reg_ax() > 0
          lTemp = .T.
        ENDIF
      ENDIF
    ENDIF
    RETURN lTemp


 5. Authors Wanted by Advisor Publications Group.                         $
    -----------------------------------------------------------------------
    ReplyTo:   Les Squires bcnn@world.std.com  [73020,3435]
    Download:  ADV_WG.ZIP on CIS DBADVISOR Forum, LIB 13/DBA.

    Advisor Publications Group is launching a new developer-oriented
    magazine, dBASE Advisor, focused on Borland's next generation of dBASE
    for Windows and DOS.  The premiere issue will appear in late summer.
    Other Advisor magazines include Data Based Advisor, Client/Server
    Advisor, Access Advisor, Clipper Advisor, FoxPro Advisor.

    If you are interested in writing for dBASE Advisor, or any of the
    Advisor magazines, please download the Writer Guidelines from
    CompuServe's DBADVISOR forum, library 13/DBA Mag Files, file name
    ADV_WG.ZIP.

    Follow the instructions in the Guidelines to submit article proposals.
    For each publication, the appropriate editor's CompuServe e-mail
    address is listed in the Guidelines. Please do not call the Advisor
    office, since CompuServe mail is the established way to work as a
    writer for the magazines.

    To subscribe to any Advisor magazine, call 800-336-6060, (619)483-6400,
    fax (619)483-9851, or CompuServe GO DB. (GO DBA to reach the Advisor
    forum to discuss database development products and techniques.)


 6. Client Server _Applications_ (May Meeting).
    -----------------------------------------------------------------------
    ReplyTo:   Les Squires bcnn@world.std.com  [73020,3435]
    Meeting:   May 17, 1994, 6:30 p.m.
    Location:  BCS Office, Waltham, Massachusetts USA

    Historically, we Xbase developers invested the 'smarts' of our
    applications in executables.  Everything was 'linked'.  Some of us got
    smart, as the executables became too large, and built repositories to
    hold details of application behavior externally.  Even more important
    than the size of the EXE files, was the fact that we could manage and
    change application behavior externally, without running the
    application.  The DBF structure, however, severely limits the
    sophistication of applications we can build by requiring us to 'over
    invest' application behavior in procedural code.

    Les Squires is the presentor at the May meeting.  He will utilize
    Microsoft Access to demonstrate how more and more application behavior
    is being invested in database engines (validation, defaults, pictures,
    triggers, etc.) and in external dynamic link libraries (DLLs).

    Les will demonstrate the OLE 2.0 Data Outliner Control that ships with
    the Access Developer Kit--enabling 'Lotus style' drill-down behavior--
    as a case study.  In addition, he will make a very cursory treatment of
    distributing databases, in which behavior of an 'application' is fanned
    out even more to multiple locations.  You might call it 'multi-site
    binding' <g>.

    The objective of the meeting is for developers to internalize the
    implications that these changes have for our professions.  Anybody who
    thinks that 'going Windows' is merely the addition of GUI to 3GL is
    sadly mistaken.

    We welcome input and questions from anybody who receives BCNN.



 7. Free Windows Seminars from "Simply Windowing".                        $
    -----------------------------------------------------------------------
    ReplyTo:   Paul Corrigan <75140.2505@CompuServe.COM>
    MoreInfo:  212-460-4171

    For those running Windows and who would like to become more familiar
    with the Windows environment, I will be holding a series of "free
    seminars" in New York City.  These very basic seminars will detail some
    of concepts such as multi-tasking, fonts and groups and icons that may
    help you to become more comfortable working in Windows.  I will base
    the seminars on my book "Simply Windowing".

    May 12 7:30-8:30pm Borders Books, 1551 Sunrise Highway, Bohemia,NY
    May 23 7:30-8:30pm Barnes & Noble, 91 Old Country Road, Glen Cove,NY
    May 25 7:30-8:30pm Barnes & Noble,  1542 Northern Blvd., Manhasset, NY
    May 31 7:30-8:30pm Barnes & Noble, 5224 Sunrise Highway, Massapequa, NY
    Jun 16 1:00-2:00pm Barnes & Noble, 675 Ave. of The Americas, NYC


 8. New Tool:  'C' Style Source Code Analysis for Clipper.
    -----------------------------------------------------------------------
    ReplyTo:   Steve Steiner, IDC 70441,2465
               Integrated Development Corp.
               Main Street, P.O. Box 592 Hampstead, NH 03841
               Ph: 603-329-5522,
               Fx: 603-329-4841
    Download:  CVRPR.TXT in LIB 7 for the full text of the press release.

    "We've often used coverage analysis tools in C and C++ to find 'hot-
    spots' and 'dead code'," says Steve Steiner.  "Coverage analysis is an
    important verification and fine tuning tool for since it records, at
    run-time, what parts of the application were actually executed.  Our
    early customers and testers are telling us that they've been able to
    deliver smaller, faster, more robust applications in less time, and
    with more confidence, with Coverage."

    Coverage records, at run-time, which lines of the application's source
    code are executed.  It can be embedded in delivered applications.  With
    this information, you can insure that test suites are properly designed
    to test all possible execution paths.  Coverage information can also be
    used to reduce memory requirements by helping you to find and remove
    unused code and pinpoint frequently used routines which are the best
    targets for optimization.

    With Coverage, you might even want to consider 'renting' your
    applications, charging customers on a 'per use' basis.  --Editor.


 9. UDFS:  FUNCTION mouseCoords(pn,pl, mvar)
    -----------------------------------------------------------------------
    ReplyTo:     Brian Hays <76004.3261@CompuServe.COM>
    Description: Displays screen coordinates like Wings on the mouse cursor.

    Remember when Craig Yellick did his Ruler.prg a thousand years ago?  I
    loved it at first but it was too unwieldy to link it in, so I did this
    routine that uses the Mouse to display screen coordinates.  I think of
    it as Mouse Wings (does that make it a bat?) because it turns on the
    mouse cursor and constantly displays the row/col as wings around the
    mouse!  Just assign to a SET KEY, and when done click to clear it.
    Requires Funcky.LIB.  Adjusts the wings when bumping into the edges of
    the screen....

    FUNCTION mouseCoords(pn,pl, mvar)
    local tscreen, tscreen2, row, mrow, mcol

    SAVE SCREEN TO tscreen
    DO WHILE ( button() == 0) .AND. LASTKEY() <> 27
       mrow = m_row()
       mcol = m_col()
       row = MAX(mrow -1,0)
       tscreen2 = savescreen(row, 0, row, 79)
       print(row, MIN(MAX(mcol-2, 0), 75), STR(mrow,2) +[ ]+ STR(mcol,2))
       m_csroff()
       m_csron()
          DO WHILE m_movement() = 0
             IF INKEY() = 27
                EXIT
             ENDIF
         ENDDO
        m_csroff()
       restscreen(row,0, row, 79, tscreen2)
    ENDDO
    RESTORE SCREEN FROM tscreen
    RETURN  NIL


10. Clipper Documentation Program:  DOC V3.10.
    -----------------------------------------------------------------------
    ReplyTo:   Terry Thalen <74660.2342@CompuServe.COM>
    Download:  DOC V3.10 on CIS 3rd Party Products Library.

    Just ran across probably the first good Clipper documentation program I
    have ever tested.  DOC V3.10 available in the clipper section (3rd
    Party Products).  Very accurate output.

    It reads the .rmk file to determine which files to include in the
    output and actually shows where each function comes from.  You can also
    set up .KEY files for any libraries you are linking and DOC will
    include them as a source when referring to a function call.

    There was a problem with the supplied Clipper5.Key file supplied with
    the shareware version, but just tonight I sent a comprehensive file to
    the author (at his request after reading my comments on C'Serve ).
    Also pointed out to him that any documentation program needs to take
    into account that FOR and WHILE are not always used in a loop ( i.e.,
    INDEX ON ......FOR....WHILE etc. )  Other than this little nuisance,
    program is excellent.  HIghly recommend it to all.  Registration is
    $70.00 compared to $179.00+ for commercial documentation programs.


11. *Special Meeting*  Gene Landy on Legal Issues for Software Developers.
    -----------------------------------------------------------------------
    ReplyTo:   Les Squires bcnn@world.std.com  [73020,3435]
    Date:      May 16, 7:00
    Location:  Microsoft, Waltham, Massachusetts.

    You are invited to join us on May 16th for a special, combined meeting
    of Fox, Access, and Clipper developers.   Be sure to invite your
    developer friends.  We have quite a few books from Addison-Wesley for
    door-prizes.


12. UDF@Showcase:  CF_DOS():  Check the Legality of DOS Main File Names.
    -----------------------------------------------------------------------
    ReplyTo: Patrick Naughton [100063,2106]

    FUNCTION CF_DOS(lFile)
    * Is this a valid DOS main file name.
    * If you want users to type in a name for file creation they can
    * easily type in strange, often illegal names. This simple UDF
    * validates main file names. Use IF !CF_DOS(lFile) ... <Error message>
    * etc. to validate what they type in.  This is a very simple UDF but I
    * find it very handy.

    LOCAL lOk := .T.
    LOCAL N   := 1

    lFile = ALLTRIM(lFile)

    DO WHILE (N <= LEN(lFile)) .AND. lOk
       IF !SUBSTR(lFile,N,1) ;
          $"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ;
          0123456789 ;
          _^$~!#%& -{}()@'`."
          lOk = .F.
       ENDIF
       N = N + 1
    ENDDO

    RETURN lOk


13. Another Chance to Publish.                                            $
    -----------------------------------------------------------------------
    ReplyTo: Yael Li-Ron <72241.2220@CompuServe.COM>
             Associate Editor, Help Section, PC/Computing

    PC/Computing wants you!  We pay $50-$125 per published tip, and any
    undocumented feature is more than welcome.  Also popular: UDFs, short
    procedures, and so on.  Up to 200 words per tip, please.  Send your
    tips to: yli-ron.Notes@mail.zd.ziff.com  or 72241,2220.

14. Developer Poll:  Advantage XBase Server.
    -----------------------------------------------------------------------
    ReplyTo:  George R. Ondovchak [72260,3160]
              American Micro Innovations.

    We are a couple of days into testing the Advantage Xbase Server for
    suitability to our application.  This product carries out many of the
    functions of the ntx &/or cdx RDDs at the server as opposed to the work
    station thus creating a client/server environment using the dbf file
    format.  The product seems to function smoothly so far.  We have
    concerns however about the performance compared to just using Clipper.
    We are only just beginning to evaluate the product so this situation
    could change.

    I scanned the Clipper forum for messages and found a couple of people
    who have the same concern as us as well as a couple who have
    experienced improved performance.  It should not be to difficult to put
    together a version of our application which we can test at a user sight
    so we will be able to get a real-world evaluation.

    The product is very exciting mainly because of the stability it
    promises for xbase files.  Our application is basically an Operations &
    Accounting Application for Computer Resellers and we have intermittent
    problems at some user sites with corrupted index and or database files.
    As I understand it this is not uncommon for Clipper applications (and
    Foxpro, etc. for that matter).  If performance is at least equal to the
    application without the server then it will be worthwhile for some of
    the larger installations we have (30-50+) users.

    Well I'll try to send some more quantitative information when I have
    it.  It might be interesting to see how other members have fared with
    this product.


15. PC-Databases for Windows.
    -----------------------------------------------------------------------
    ReplyTo: Mannsberger Franz-H. [100012,3304]
    Source:  CWO.  Austrian/German-based company, specializing in marketing
             and market-analysis and working for the top 500 companies in
             Austria and for government or government-related organizations.

    As per September 1993 - worldwide:
    --------------------------------------------
       1.        Paradox: 34.0 %  ######
       2. Lotus-Approach: 25,0 %  ####
       3.         Access: 24.0 %  ###
       4.  FileMaker Pro: 10,0 %  ##
       5.         FoxPro:  7,0 %  #


16. UDF@Showcase:  NW_INKEY().
    -----------------------------------------------------------------------
    ReplyTo: Norman McFarlane <100076.27@CompuServe.COM>

    I wrote NW_INKEY() to emulate the SOS_INKEY() function included in the
    SOS!Help library.  I only had Ver 1.5 and was finnishing a Clipper 5.2
    app and needed to do the help.  1.5 wouldn't work with Cl 5.2, so I had
    to write my own help system (quickly!).

    My problem was emulating a wait state using inkey(), which I use
    frequently.  Also I needed to be able to provide  context sensitive
    help for tbrowse columns, picklists, etc., hence NW_INKEY().  By the
    way, the entire help system which I wrote is quite slick.  After some
    minor tidying up, I might just post it on Compuserve.

    //-NW_INKEY() emulates a wait state without using a GET.
    //-Allows context specific help for tbrowse columns, achoices, etc,
    //-Syntax:   nVal:=NW_INKEY(cProcName, cVarName, nPause)
    //-Returns value of key pressed or NIL if timed out.
    //-All parameters are optional, as defaults will be assigned.
    //-Performs the same purpose as inkey(), so can be used instead.

    #include "Inkey.ch"
    #define P_DEFVAL(pn, def) iif(pn=NIL, def, pn)

    FUNCTION NW_INKEY(cProcName, cVarName, nPause)
    LOCAL nProcline:=ProcLine(1)          //-Line num of calling proc
    LOCAL	lKey                      //-Inkey value

    /* Assign defaults if no params passed */
    cProcName:=left(upper(P_DEFVAL(cProcName, ProcName(1)))+space(10),10)
    cVarName :=left(upper(P_DEFVAL(cVarName, "_INKEYVAR_"))+space(10),10)
    nPause   :=P_DEFVAL(nPause, 0)

    /* Create wait state with timer */
    do while .t.
    	lKey:=inkey(nPause)
    	do case
           case lKey==K_F1
    	        HELP(cProcName, nProcLine, cVarName)
    	   otherwise
    		exit
    	endcase
    enddo
    return lKey


17. UDF@Showcase:  Compile It and See!
    -----------------------------------------------------------------------
    ReplyTo:  Tom Leylan   tleylan@shell.portal.com

    FUNCTION Main()
       LOCAL nStr := REPL( "BCNN - Xbase Language Group ... o ... ", 3 )
       LOCAL nCnt

       FOR nCnt := 0 TO 24
          @ nCnt, 0 SAY SUBS( nStr, nCnt + 1, 80 )
       NEXT
       INKEY( 0 )
       Bye()
       RETURN NIL

    FUNCTION Bye()
       LOCAL nCnt, nSec

       FOR nCnt := 0 TO 24
          SCROLL( 0, 0, 24, 79, -1, 1 )
          nSec := (( SECONDS() + .01 ) % 86399 )
          WHILE ( SECONDS() <= nSec )
          ENDDO
       NEXT
       RETURN NIL


18. UDF@Showcase:  SELESEEK() and SELELOCA().
    -----------------------------------------------------------------------
    ReplyTo:  Frederick Chin <71740.3676@CompuServe.COM>
              C.T. Software

    *--------------------------------------
    Function SeleSeek(xValue,cAlias,cField)
    *------- Selects a work area, searches for and/or extracts field,
    * then returns to original area. Used in index databases.
    * Check if value exists: ? SELESEEK(value,'newalias')

    LOCAL nCurrec,nCurrSelect:=select(),;
          xRetval,;
          nNewSelect:=select(cAlias),;
          bFieldname

    sele (nNewSelect)
    nCurrec:=recn()
    seek xValue
    if cField==NIL
       xRetval:=(!eof())
    else
       bFieldname:=fieldblock(cField)
       xRetval:=eval(bFieldname)
    endif
    go nCurrec
    sele (nCurrSelect)
    return xRetval

    *--------------------------------------------------
    Function SeleLoca(xValue,cField2look,cAlias,cField)
    *------- Selects a work area, searches for and/or extracts field,
    * then returns to original area. Used in unindexed databases.
    * Check if value exists, ? SELELOCA(value,'field2look','newalias')
    * Extract field based on value, ? SELELOCA(value,'field2look',;
    * 'newalias','fieldname')

    LOCAL nCurrec,;
          nCurrSelect:=select(),;
          xRetval,;
          nNewSelect:=select(cAlias),;
          bFieldname,;
          bField2look

    sele (nNewSelect)
    nCurrec:=recn()
    bField2look:=fieldblock(cField2look)
    loca for eval(bField2look)==xValue
    if cField==NIL
       xRetval:=(!eof())
    else
       bFieldname:=fieldblock(cField)
       xRetval:=eval(bFieldname)
    endif
    go nCurrec
    sele (nCurrSelect)
    return xRetval

19. 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, 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 on their own BBS 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
    617-924-1023                  //-Boston Local Phone Number.
    603-253-6109                  //-Primary Phone & Messages 24 hours
    603-253-7214                  //-Messages Only 24 hours
    603-253-9864                  //-Fax 24 hours a day
    INTERENT:bcnn@World.Std.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:        @BCNN@ClipperYes to bcnn@World.Std.Com.
    Delete Subscribers:     @BCNN@ClipperNo  to bcnn@World.Std.Com.
    Address Change:         Email using OLD Address. Indicate New Address.
    Back Issues:            CompuServe CLIPPER Forum, LIBS 1 and 17.
                            FTP samba.iss.uw.edu.pl (CD pub/clipper/bcnn)

    BCNN Email Services donated by Word Jenny, Inc. LSquires@World.Std.Com

    (c) 1994 Boston Computer Society, Inc.
