What's Up, DOCumentation? Robelle Consulting Ltd. Unit 201, 15399-102A Ave. Surrey, B.C. Canada V3R 7K1 Toll-free: 1-888-ROBELLE (1-888-762-3553) Phone: (604) 582-1700 Fax: (604) 582-1799 E-mail: support@robelle.com Web: www.robelle.com Date: August 1997 From: Robert M. Green, CEO David J. Greer, President Hans Hendriks, Editor pro tem To: Users of Robelle Software Re: News of the HP 3000 and of HP-UX, 1997 #4 What You Will Find in This News Memo: HP World Debut of Qedit for Windows Year 2000 Video Conference SmartDate from Robelle: Part of the Year 2000 Cure Character Set Confusion New Schedule for Suprtool Training Suprtool DEFINEs Selecting a Range of Non-Collating Dates Compatibility with MPE/iX 5.5 Looper: Qedit's Best Command File HP World ========= It's August, which means that it is HP World month at Robelle. HP World is the premier event organized by Interex, the International Association of Hewlett Packard Computing Professionals. This year's conference runs from August 25 - 29 at the Navy pier in Chicago, Illinois, and as always, it looks like there will be more to see and learn than any mortal can possibly absorb in the few days of the conference. (See http://www.hpworld.com for details.) Attached to this newsletter is an information sheet showing what we at Robelle have planned for this conference. Visit our booth for a personal demonstration of Qedit for Windows, or pick up a schedule of the papers and tutorials we'll be presenting this year. We'll also be celebrating our 20th birthday, so be sure to enter our prize draw and enjoy some birthday cake. Our technical presentations this year include Bob Green's paper on some of the design decisions made for Qedit for Windows, Neil Armstrong's Introduction to HP-UX for MPE Users, Francois Desrochers' tutorial on creating Web pages with Suprtool, the Suprtool Developers' Forum, as well as David Greer's collaboration with Alfredo Rego in How Messy is My Database. David will also be a panelist in the Application Development in a Multi- Platform Environment discussion. Mike Shumko will be presenting an updated version of our Ensuring Data Integrity Using Suprtool tutorial. Trade Shows: A Behind the Scenes Look Anyone who has ever attended an Interex or HP World vendor show area and has never been involved with setting up a booth for an attending company may wonder what is involved. It looks like magic as workers and company staff assemble the booth in a matter of hours. What you are watching is the culmination of approximately one full year of planning. At the Chicago show this year, we will have to choose a booth for the 1998 show in San Diego. This year's conference is where the planning for the next year begins. Once we get back to the office we review what we liked about the equipment, our presentations, booth layout, staffing levels, etc., and also what we didn't like. All this information gets fed into the planning loop for next year as part of the iterative process. One of the next things we do is plan our presentations for next year. All of this information gets passed to Interex, which either accepts or rejects our submissions. The support staff attending the show is chosen based partly on the selections made by Interex. The other parts of planning include shipping support materials, such as manuals, copies of papers and tutorials, supplies, promotions, etc. If we're going to have a contest, the forms and prizes have to be prepared and purchased, plus our pre-show mailings need to mention the contest so that people know about it. When we are in a new city, we can't count on all the things we take for granted at home and in the office. The items we may miss can be as simple as felt pens, wrapping paper, tape, ruler, scissors, etc. That's why planning for every possibility before we leave is so important. Just as when we go on vacation, we may know there is something we missed, but we just don't know what it is until we get there. This year we distributed the conference workload as follows: two staff members working out the technical details for the show, one person in charge of papers and tutorials, two people working on shipping, two people on promotions, and two people working on all the other details. This is a major team effort. Our booth number this year is #1519--hope to see you there! [Marie Reimer] Debut of Qedit for Windows ========================== "When will Qedit for Windows be ready?" We're hearing this question frequently these days at Robelle. Here's a quick update. Qedit for Windows (QWIN) alpha test tapes were sent out at the end of June -- many thanks to our alpha testers! By the time you receive this edition of What's Up DOCumentation?, we should be into our second round of alpha testing. We are still enhancing QWIN's functions and features, but our #1 priority is exterminating any last bugs in the alpha versions. We plan to make QWIN as robust and reliable as our other products! We will be unveiling QWIN at HP World in Chicago, August 25 - 29. And for those attending this year, we look forward to giving you a personal QWIN demo. Also, be sure to catch Bob Green's presentation, Converting Qedit to the Client/Server Model. We're not quite ready to send out evaluation copies of QWIN, but we are certainly getting close. Our sales department is keeping a running list of people who have expressed interest. And as soon as QWIN is officially released, we will be contacting you to arrange a demo. For more information on QWIN, visit our QWIN Web page at http://www.robelle.com/products/qeditwin.html [Nicky Gunther] Year 2000 Video Conference ========================== Marie attended the "Cure2000" video conference hosted by HP at their Richmond, B.C. office in June. For this presentation George Stachnick was an excellent host, and attendees each received a copy of the HP White Paper entitled Cure2000 for the HP3000, which is full of recommendations, products, and services to help in the conversion process. HP expects that there are 150 billion lines of code written and being used by HP computers. If companies start converting today to become compliant, it will cost them $1-2 per line of code, and the cost increases as time runs out. The status of the HP operating systems was laid out as follows: - MPE V 3.0 and 4.0 are ready and the patches are available by calling the Response Center. - MPE/iX 5.5 with Xpress 4 is year-2000 compliant. - MPE/iX 6.0 will be available in the first half of 1998. The follow-up video conference scheduled for September will provide more information about the availability of these developments. Also detailed were the changes HP has made to its own software such as the various new date handling intrinsics. Pre-release versions of these are available from the Jazz Web site at jazz.external.hp.com. HP is urging customers to contact all their solution vendors directly to ascertain the state of year-2000 readiness in their applications. Included in the handout was a list of on-line resources. Some of the most comprehensive sites are the Year 2000 Information Center at www.year2000.com and the HP sites at www.hp.com/go/year2000. Also worth a visit is Robelle's site of frequently asked questions: www.robelle.com/faq/year2000.html [Marie Reimer and Robyn Rennie] SmartDate from Robelle: Part of the Year 2000 Cure =================================================== If you're currently working on your year 2000 conversion or are planning to start soon, consider using SmartDate from Robelle. How does SmartDate help with year-2000 conversions? One of the problems with converting a program to make it year-2000 compliant is dealing with the differences between dates in external, human-readable format, and dates in internal, computer-friendly format. SmartDate helps by providing a number of features that allow users to enter dates in convenient formats. SmartDate easily converts those dates into whatever format the data structures require. For example, users may be accustomed to entering dates in month-day-year format, specifying only two digits for the year, and not typing a leading zero on a day or month that has only one digit. But you may have converted the database to store dates in an I2 field (4-byte integer) as 8-digit values in century-year-month-day format. SmartDate can do all this in one call: - accept free-format input - verify that a valid date was entered - apply a 2-digit to 4-digit cutoff rule on the year - convert to CCYYMMDD format for the program An example of the year cutoff rule would be, "any 2-digit years between 80 and 99 should be interpreted as 19xx, and 2-digit years between 00 and 79 should be interpreted to be 20xx." In SmartDate this would be a "cutoff" value of 80. Sample COBOL source code: accept input-date move RdtXnMMDDCCYY to rdt-from-type move RdtI32CCYYMMDD to rdt-to-type add RdtYearCutoff to rdt-from-type move 80 to rdt-aux-result call "RDTCONVERT" using input-date , output-date, rdt-control if rdt-status <> 0 then call "RDTERROR" using rdt-control, msg-buffer, msg-buf-length display msg-buffer. SmartDate can also format dates for human-readable output, so that they look good on reports. For example, Jul 14, 1997 Mon, Jul 14, 1997 JUL14 97 SmartDate accepts dates in any of 24 formats, including 3 free-form formats, converting them to any of 28 formats. SmartDate handles years from 1583 to 2583 and knows about leap years (yes, 2000 is a leap year). Visit our Web site or call us to receive your free 30-day SmartDate trial package. [Mike Shumko] Character Set Confusion ======================= One perennial issue in the lives of computer folks is that of character sets. This came up again recently in the HP3000-L Internet discussion list, where the following question appeared: Date: Mon, 23 Jun 1997 21:04:20 -0400 Subject: How to use FTP transfer French characters from HP3000 to NT server? We have a MPE file on HP3000 which has some info in French. When I use FTP to transfer it from HP3000 to NT server. Those French characters changed. For example, the 3rd character of "QUEBEC" should be a prime on top of "E". But it changed to two "." on top of "U" after file transfer. I tried to set FTP into ASCII, BINARY and BYTESTREAM mode. It doesn't help. And I tried to send this file to HP9000 UNIX server and then send it from UNIX to NT server. It doesn't help too. But if I use Reflection to transfer this file, all those French characters transferred correctly. But I don't want to use Reflection to do it because Reflection transfer cannot write into a MPE job. That file changes everyday. I don't want to do this transfer manually every day. If anybody has experiences in special characters transfer with FTP, please give me some suggestions. David Greer replied to this as follows: I don't have a specific answer to the question, but I can give some background on the problem. Characters on MPE (and HP-UX) are stored using the HP Roman-8 character set. Characters on Windows NT are generally stored as UNICODE (or the MS Windows character set). Characters in both character sets are represented as a digit number. Every number corresponds to an individual letter and visa-versa (at least as far as Latin-ISO-1 characters are concerned). For the ASCII characters (letters, numbers, and North American special symbols), the numeric representation is the same in both HP's Roman-8 character set, UNICODE, and the MS Windows character set. But for Latin-ISO-1 characters with a numeric value greater than 127, there are differences between these character sets. When you transfer a file with FTP, the numeric values are correctly transferred to Windows NT. But on MPE lower-e-accent is represented by the numeric value 197, and in Windows NT the value 197 is a capital-A with a circle above it. So why does the transfer work with Reflection? The reason is that Reflection is aware of these character differences and does a good job of doing the necessary translations as part of the file transfer. My guess is that you won't be able to use FTP to transfer the file and get character translation. You could use FTP, if you were willing to write either: 1. A program on MPE that pre-translated the file before transferring it with FTP, or 2. A program on Windows NT that post-translated the file after transferring it with FTP. For more information about character sets see our SMUG Book entry: http://www.robelle.com/smugbook/char.html [David Greer] New Schedule for Suprtool Training =================================== Here is Robelle's new schedule of in-house courses for Suprtool in 1997-98: October 16 - 17, 1997 January 23 - 24, 1998 May 28 - 29, 1998 October 15 - 16, 1998 For more information about the schedule or to arrange a private session at your site, call Rosemary Van Poelgeest or Fran Glasgow at 1-888-ROBELLE. Robelle Products: Problems, Solutions and Suggestions ------------------------------------------------------ Suprtool DEFINEs ================= A recent question on the Robelle-L mailing list prompted a discussion of Suprtool's Define command: Question: I have an I1 item in a set and I need to check the value of the first digit of each number in each entry. The maximum number for the item is 9999. I have tried to convert the I1 to a byte field then test the value using the offset. Campus-bldg is the I1 item. def a,campus-bldg,6,byte def b,a[2],1 if b = ("2","3,"4") ext campus-bldg output campbldg I'm getting junk for some reason even if I output as ASCII. Answer: What is not obvious at first is that Define commands are just redefinitions of the input record. Defines do not create new storage, and they do not convert data from one format to another. If you are a COBOL programmer, think of the REDEFINES clause. Therefore your Define commands told Suprtool this: def a,campus-bldg,6,byte Hey, Suprtool, I want to give the six bytes of my input record, starting at the same position as campus-bldg, a name of A. If campus-bldg started at byte 37 of the input record (for a length of 2 bytes because it is an I1), the field A will also start at byte 37, but will go for a length of 6. The thing called A will have all 16 bits of campus-bldg plus the next 4 bytes. This definitely won't work. def b,a[2],1 Now you're telling Suprtool to treat the second byte of A (which is the second byte or rightmost eight bits of campus-bldg) as a field called B. This still doesn't work. The standard answer to the generic question, "How do I test a single digit of a binary number" is, "You need to use two passes." Let's see how to do this the standard way, then let's see some one-pass solutions for this specific case. Two passes: get extract output ,ascii xeq input define a,,1,byte if a = "2","3","4" ... The downside of this approach is that all the numeric fields that you extracted are now in ASCII format. The resulting file may not be compatible with whatever program is supposed to read the output. Three(!) passes: get define a,1,,byte extract a extract campus-bldg output ,ascii xeq input define b,,1,byte if b = "2","3","4" extract a output input = ... With this approach the output record produced by the second pass still has all the input fields in their original format. The input filename=dataset syntax tells Suprtool to trust you that the input file has the same layout as the dataset. That way you can use all the dataset's fieldnames when reading the file. One pass (style A): Assuming that I understand correctly that you have an I1 field whose values never exceed 9999, and you want to select records if the thousands digit is a 2, 3, or 4, you could just do this: input if campus-bldg >= 2000 and campus-bldg <=4999 ... This works only because we are testing the high-order or most-significant digit. This wouldn't work if we were trying to test for one of the other digits. One pass (style B): input if campus-bldg / 1000 = 2,3,4 ... Again, this works only for testing the most significant digit. [Mike Shumko] Selecting a Range of Non-Collating Dates ========================================= Almost all of Suprtool's date selection functionality relies on converting a date value to a numeric constant, and using that for selection against the (numeric) date field. For example, > item sale-date,date,yymmdd > if sale-date = $today is logically identical to entering > if sale-date = 970805 assuming, of course, that today is 5 August 1997. Notice that Suprtool converts the selection criteria to match the data format, rather than reformatting each data record to do the comparison. This works well for all date formats when testing for equivalence, but fails for range testing in non-collating date formats. For example, if a date is stored in MMDDYY format, any December date will always have a higher numeric value than any January date, irrespective of the year value. If you try to do a range selection on a non-collating date field, Suprtool will return an error: >item purch-date,date,mmddyy >if purch-date < $today Error: Invalid date format for the comparison Question: So how can I select a range of non-collating dates? Answer: By testing for equivalence to each date that falls in the range. Question: How can I test for all those values? Answer: Load a table of qualified date values. Question: How can I get the qualified values? Answer: With Suprtool, of course! First, create a file of all unique date values in the dataset and include a new field with the date value in Display format: >base store.db.sales,1,password >get d-sales >sort purch-date {purch-date is in MMDDYYYY format} >define new-date,1,8,display >extract purch-date, new-date = purch-date >output datefil1,link >duplicate none keys {only 1 record per unique field} >xeq You now have a file with the date field represented twice, once in original format, and once in Display format. Now convert the Display field to a collating date format: >input datefil1 >define year,new-date[5],4,display >define monthday,new-date[1],4,display >extract year, monthday, purch-date >output datefil2,link >xeq Now that we have the date values in a collating format, we can select the range of dates we require: >input datefil2 >define colldate,1,8,display >item colldate,date,YYYYMMDD >if colldate >= $date(*-1/*/01) & and colldate <= $date(*-1/*/last) >extract purch-date >sort purch-date >output datefil3,link We can now use datefil3 to load a table of valid dates: >get d-sales >table datetabl,purch-date,sorted,datefil3 >if $lookup(datetabl,purch-date) ... If you need to do this on a regular basis, it makes sense to create a permanent "translation file", rather than regenerating it each time. [Hans Hendriks] Compatibility with MPE/iX 5.5 ============================== One of the most frequently asked questions is: What version of Qedit and Suprtool do I need for MPE/iX 5.5? We recommend Qedit version 4.4 or later, and Suprtool version 3.8 or later. Remember that when you upgrade your operating system you may need to stream some Robelle jobs to integrate Qedit or Suprtool into the new system. For example, stream Qcompxl.Qeditjob.Robelle to let your native mode compilers read Qedit-format source files, or re-install the Speed Demon or Suprtool2 routines if you need them in SL.Pub.Sys. See the installation section of your user manuals for details. Looper: Qedit's Best Command File ================================== We occasionally get customers asking how to change or delete lines based on the existence of a string in a neighboring line. This usually means setting up a command file that does While loop processing. You can find a great example of a command file called Looper in the Qedit manual under the While command, but here is a variation that came up recently. The customer wanted to print any lines in which the first 3 characters were the same as the previous line's. HPVariables can be used to store the value of each line for comparison to the next, but how can you set a variable to the contents of the line? We created the command file Qsetvar.Cmd to accept a variable name as a parameter, then prompt for the variable's value: Qsetvar.Cmd: parm varname input !varname setvar !varname rtrim(!varname) This way, the contents of a line can be saved in the Hold file, and the contents of the Hold file can be passed to the command file by means of I/O redirection: qsetvar myvar < hold Our second command file saves the contents of each line, compares it to the next, then saves the contents of that line for comparison to the subsequent line, and so on: /set window (up) {ignore case for strings} setjcw cierror = 0 {initialize variables to predictable values} setvar prev,"#" setvar curr," " continue /set right 3 {edit only columns 1 to 3 of each line} /list first {go to top of file} while cierror=0 do /holdq * {copy current line to Hold file} /qsetvar curr < hold (set variable "curr" to whatever is in Hold} if prev = curr then {compare current line to previous} /list * lp {if same, send to printer} endif setvar prev,curr {update value of prev} /lq*+1 {move forward one line} endwhile [Paul Gobes] Qedit, Suprtool, SmartDate, and Xpress are trademarks of Robelle Consulting Ltd. Windows is a trademark of Microsoft Corporation. Other product and company names mentioned herein may be the trademarks of their respective owners.