Newsletters   Subscriptions  Forums  Store   Career  Media Kit  About Us  Contact  Search   Home 
fhg
Volume 5, Number 40 -- October 26, 2005

Those Stupid Quotation Marks!


Hey, Ted:


I am attempting to use QCMDEXC to run Open Query File within an RPG IV program but the compiler generates errors RNF0312 (A right parenthesis is expected but is not found) and RNF5347 (An assignment operator is expected with the EVAL operation). Do you see anything wrong with my code?

--PG


Here's the free-format RPG code PG sent me. (The file and field names have been changed to protect the guilty.)

@qcmdexec('OPNQRYF FILE((MYFILE)) QRYSLT('FLD *EQ %WLDCRD("*AA*")')');

PG is trying to select all records in file MYFILE that have AA anywhere in field FLD. PG's problem is that he (she?) has embedded single quotation marks (or "quotes," as they're often called, or "tick marks," as a former associate of mine referred to them) within single quotation marks. I get lots and lots of complaints about the use of quotes, almost always from people who complain that they don't like CL. But PG's case shows that it's not just CL that suffers from this problem. My email and my experience on the job show that it's not just newbies who don't understand how to use quotes.

To use quotes properly in CL, RPG, and DDS, follow these simple rules.

Rule 1: You must always have an even number of quotes in a character string, including the quotes that delimit the string.

If you have an even number of quotes, you may or may not have a problem. If you have an odd number of quotes, you've definitely got a problem somewhere.

Rule 2: You must place two adjacent quotes inside a string in order to store one quote.

Since the quote character delimits a character literal, IBM had to come up with a special way to indicate that a quote is part of a literal. Look at this:

eval ClubName = 'The Ladies' Red Rubber Ball Society'

How is the RPG compiler to know that the string doesn't stop after the final letter of the second word?

Here's the example I always use. If the message you want to get across is that people should dine at your friend Joseph's food emporium, you might write code like the following:

/* CL */
chgvar  var(&Message)  value('Eat at Joe''s!')

/* RPG IV */
eval Message = 'Eat at Joe''s!'

/* DDS */
A                             2 34'Eat at Joe''s!'

In all these cases, the message is the same: Eat at Joe's!

Rule 3: Some people like to use a one-byte identifier that contains a quote in order to avoid doubled quotes. (Well, it's not really a rule, but it's still useful information.)

/* CL */
dcl  &Quote       *char    1    value('''')
dcl  &Message     *char   80

chgvar var(&Message) +
       value('Eat at Joe' *cat &Quote *cat 's!')

/* RPG IV */

D Quote           c                   const('''')
D Message         s             80a

C                   eval      Message = 'Eat at Joe' +
C                               Quote + 's!'

You don't avoid doubled quotes completely, as the initial value of the Quote constant or variable has four quotes. The outer two delimit the string. The inner two signify one quote. But you don't have to use a doubled quote anywhere else in the program.


Now back to PG's question. All he (she?) has to do is double the embedded single quotes.

@qcmdexec('OPNQRYF FILE((MYFILE)) QRYSLT(''FLD *EQ %WLDCRD("*AA*")'')');

I'm glad PG took the time to write. I see this mistake and many imaginative work-arounds quite often, but it had never occurred to me to write about the "tick-mark" problem in Four Hundred Guru. Thanks.

--Ted

Sponsored By
LINOMA SOFTWARE

Revolutionary Solutions for Your World

TRANSFER ANYWHERE -- Affordable Encryption & Distribution

* Secure your internet transmissions with Open PGP Encryption
* Automate FTP & email distributions of information
* Convert to Excel, XML and text formats
* Connects to DB2, SQL Server, Oracle and Informix
* Runs natively on iSeries or NT
* Compress/decompress up to 9 exabytes

Affordably priced at only $3,995 for a P05!

AXES - web-enable ALL your iSeries screens with no programmer intervention and no interactive. Load & Go! Be web-enabled in less than 30 minutes.

RPG TOOLBOX - convert to RPG IV and free-form. Includes 70+ predefined SEU commands.

SURVEYOR/400 - graphically edit database files, import, export, convert spooled files to PDF, run SQL and more!

Purchase a new iSeries and get an IBM rebate to purchase
Linoma's IBM ServerProven tools!

Get more information and download your FREE trials today at
www.LinomaSoftware.com


Technical Editors: Howard Arner, Joe Hertvik, Ted Holt,
Shannon O'Donnell, Kevin Vandever
Contributing Technical Editors: Joel Cochran, Wayne O. Evans, Raymond Everhart,
Bruce Guetzkow, Marc Logemann, David Morris
Publisher and Advertising Director: Jenny Thomas
Advertising Sales Representative: Kim Reed
Contact the Editors: To contact anyone on the IT Jungle Team
Go to our contacts page and send us a message.


THIS ISSUE
SPONSORED BY:

Advanced Systems Concepts
Linoma Software
WorksRight Software


Four Hundred Guru

BACK ISSUES

TABLE OF
CONTENTS
How to Count with SQL

Those Stupid Quotation Marks!

Admin Alert: New TCP/IP Functions to Check Out When Upgrading to i5/OS V5

Correction: Bugged by the Bugged by Interactive Debugger Tip


The Four Hundred
Behind the Scenes at the Award-Winning iSeries Support Center

iSeries Sales Rebound 25 Percent in Q3

Sometimes You Have to Think--and Look--Inside the Box

As I See It: Listen Up, Kids

Four Hundred Stuff
iTera Says Out-of-Synch Conditions are a Thing of the Past

Raz-Lee Developing Native iSeries Antivirus Software

The Real World, Versus Real-World Load Testing

For LANSA, 3-Way Product Data Synch is as Easy as ABI EC

Four Hundred Monitor


Copyright © 1996-2008 Guild Companies, Inc. All Rights Reserved.
Guild Companies, Inc. (formerly Midrange Server), 50 Park Terrace East, Suite 8F, New York, NY 10034
Privacy Statement