------------------------------------------------------------------------------ ------------------------------------------------------------------------------ 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 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' . 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) ... * 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.