====================================================================== USE SSUB ON VARIABLES THAT HOLD MULTIPLE CHECKBOX PICKS ====================================================================== PRODUCT : R:BASE VERSION : 3.1B or Higher CATEGORY : PROGRAMMING SUBCATEGORY : CHOOSE, SSUB ====================================================================== When the CHOOSE command presents you with a checkbox menu (CHKBOX), you can check off more than one item on the menu list. R:BASE puts all the items you choose into a single choose variable, separating items with commas. Then you can use the SSUB function in a WHILE loop to pull apart the resulting choose variable to use or count the individual choices. Here are two examples. Both use the concomp sample database, and in both, VCHKBOX is the choose variable that holds all the checked items. The code changes the delimiter to an @ symbol for both the CHOOSE command and the SSUB command. This is so the listed items will be separated by the @ symbol, thus allowing the code to extract data that might have embedded commas. Counting the Number of Items ============================ This example counts the number of items chosen from a CHKBOX menu. *(CNTPICKS.CMD -- Count the CHKBOX items that were chosen. ) *( Saves current delimit setting. ) SET VAR vdelsave TEXT = (CVAL('delimit')) LABEL rechoose CLS CLEAR VAR vchkbox, vcount, vitem, vyn, vend SET VAR vchkbox TEXT, vyn TEXT, vend TEXT *( Change the delimiter to account for data values that ) *( might have commas embedded within. ) SET DELIMIT=NULL SET DELIMIT='@' CHOOSE vchkbox FROM #VALUES FOR company FROM customer FOOTING CHKBOX SET DELIMIT=NULL SET DELIMIT=.vdelsave *( Check for HELP or the absence of a selection ) IF vchkbox = 'HELP' OR vchkbox = '[ESC]' THEN DIALOG 'No selection was made. Try again?' vyn vend YES IF vyn = 'YES' THEN PAUSE FOR 1 USING 'Remember to Press F2 when your selection is made' GOTO rechoose ELSE GOTO the_end ENDIF ENDIF SET VAR vcount INTEGER = 1 SET DELIMIT=NULL SET DELIMIT='@' *( Since we have changed the delimiter symbol, any command ) *( that requires a delimiter must reflect the current ) *( setting. That is why the @ symbol appears in the SSUB ) *( function on the next line. ) SET VAR vitem = (SSUB(.vchkbox@.vcount)) SET DELIMIT=NULL SET DELIMIT=.vdelsave WHILE vitem IS NOT NULL THEN *( Insert code here to utilize the extracted item. ) SET VAR vcount = (.vcount + 1) SET DELIMIT=@ SET VAR vitem = (SSUB(.vchkbox@.vcount)) SET DELIMIT=.vdelsave ENDWHILE SET VAR vcount = (.vcount - 1) CLS WRITE 'You chose',.vcount,'items.' LABEL the_end CLEAR VAR vchkbox, vcount, vitem, vyn, vend, vdelsave. vchkbox RETURN The IF block at the top ensures that you choose at least one item. Then the WHILE loop keeps adding one to VCOUNT until VCOUNT is larger than the total number of items in the CHOOSE variable (VCHKBOX in this example). At that point, R:BASE sets VITEM to a null value and breaks out of the WHILE loop. You therefore know that the CHOOSE variable (VCHKBOX) contains (.VCOUNT-1) items when the WHILE loop finishes. Building an IN List =================== You can build an IN list from the CHOOSE variable by using the SSUB function in a WHILE loop to pull out each item and enclose it in single quotation marks. Quotation marks are required if an item might contain more than one word. This code is very similar to the previous code; the bold characters show the small additions. *( MAKEIN.CMD - Make an "IN" list out of the checked items.) *( Saves current delimiter setting. ) SET VAR vdelsave TEXT = (CVAL('delimit') LABEL rechoose CLS CLEAR VAR vchkbox, vcount, vitem, vyn, vend, vinlist SET VAR vchkbox TEXT, vyn TEXT, vend TEXT *( Change the delimiter to account for data values that ) *( might have commas embedded within. ) SET DELIMIT=NULL SET DELIMIT='@' CHOOSE vchkbox FROM #VALUES FOR company FROM customer FOOTING CHKBOX SET DELIMIT=NULL SET DELIMIT=.vdelsave *( Check for HELP or the absence of a selection ) IF vchkbox = 'HELP' OR vchkbox = '[ESC]' THEN DIALOG 'No selection was made. Try again?' vyn vend YES IF vyn = 'YES' THEN PAUSE FOR 1 USING 'Remember to Press F2 when your selection is made' GOTO rechoose ELSE GOTO the_end ENDIF ENDIF SET VAR vcount INTEGER = 1 SET DELIMIT=NULL SET DELIMIT='@' SET VAR vitem TEXT = (SSUB(.vchkbox@.vcount)) SET DELIMIT=NULL SET DELIMIT=.vdelsave *( Put quotes around it ) SET VAR vinlist = (CHAR(39)+.vitem+CHAR(39)) WHILE vitem IS NOT NULL THEN SET VAR vcount = (.vcount + 1) SET DELIMIT=NULL SET DELIMIT='@' SET VAR vitem = (SSUB(.vchkbox@.vcount)) SET DELIMIT=NULL SET DELIMIT=.vdelsave IF vitem IS NOT NULL THEN *( Add the new item to the list ) SET VAR vinlist = (.vinlist+','+CHAR(39)+.vitem+CHAR(39)) ENDIF ENDWHILE *( Enclose the "IN" list in parentheses. ) SET VAR vinlist = (CHAR(40)+.vinlist+CHAR(41)) CLS *( Use "IN" list in WHERE clause ) PRINT customer WHERE company IN &vinlist LABEL the_end CLEAR VAR vchkbox, vcount, vitem, vyn, vend, vinlist RETURN Now you can add &VINLIST to any WHERE clause, as shown in the following example. SELECT * FROM customer WHERE custid IS NOT NULL AND company IN &vinlist