|
Very cool that this topic just came up. I'm real new to SQL of any type, in fact you helped me not long ago Tracy. Yesterday I stumbled upon the 'prepare' SQL and figured I'd give it a shot. The term spaghetti code comes to mind when looking at what I'm doing, but I didn't know how to attack this any other way but to build the entire statement. I have a selection screen where I can enter 0-20 store#'s, a date range, 0-5 divisions and 0-5 seasons. I'm building the SQL statement the way I used to fumble around with OPNQRYF. You'll see in the attached! Mike -----Original Message----- From: Tracy Ball [mailto:TBall@xxxxxxxxxxxxxxxx] Sent: Tuesday, February 25, 2003 12:48 PM To: RPG programming on the AS400 / iSeries Subject: RE: SQLRPGLE - Dynamic selection Does the nulls field have any bearing on the syntax here at all? This is a great example. From what I can see, I am doing pretty much all these things in just a much simpler text, yet don't get the results. I will use this as a model. Thank you very much!! -Tracy Ext. 3107 -----Original Message----- From: MWalter@xxxxxxxxxxxxxxx [mailto:MWalter@xxxxxxxxxxxxxxx] Sent: Tuesday, February 25, 2003 12:39 PM To: RPG programming on the AS400 / iSeries Subject: Re: SQLRPGLE - Dynamic selection something like this: DgetItemData PR 40 D itnbr 15 CONST D year 4 0 CONST PgetItemData B Export DgetItemData PI 40 D itnbr 15 CONST D year 4 0 CONST ditemDS ds D itdsc 30 overlay(itemDs:*next) D itcls 4 overlay(itemds:*next) D itacim 3 overlay(itemDs:*next) D unmsr 2 overlay(itemDs:*next) D valuc 1 overlay(itemDs:*Next) Dnulls S 5i 0 DsqlStmt S 250 DfileName S 21 c reset itemDs c eval fileName = 'Yearend/Itemasa' + c %subst(%editc(year:'X'):3:2) c eval sqlStmt = 'SELECT itdsc, itcls, itacim, + c unmsr, valuc + C FROM ' + %trim(fileName) + C ' WHERE itnbr = ''' + C %trim(itnbr) + '''' C/exec sql C+ PREPARE stmt from :sqlStmt c/end-exec c/exec sql c+ DECLARE c CURSOR FOR stmt c/end-exec c/exec sql c+ OPEN c c/end-exec c/exec sql C+ FETCH c INTO :itemDS :nulls c/end-exec c/exec sql c+ CLOSE c c/end-exec c return itemDs P E Thanks, Mark Mark Walter Sr. Programmer/Analyst Hanover Wire Cloth a div of CCX, Inc. mwalter@xxxxxxxxxxxxxxx http://www.hanoverwire.com 717.637.3795 Ext.3040 /"\ \ / X / \ _______________________________________________ This is the RPG programming on the AS400 / iSeries (RPG400-L) mailing list To post a message email: RPG400-L@xxxxxxxxxxxx To subscribe, unsubscribe, or change list options, visit: http://lists.midrange.com/mailman/listinfo/rpg400-l or email: RPG400-L-request@xxxxxxxxxxxx Before posting, please take a moment to review the archives at http://archive.midrange.com/rpg400-l. _______________________________________________ This is the RPG programming on the AS400 / iSeries (RPG400-L) mailing list To post a message email: RPG400-L@xxxxxxxxxxxx To subscribe, unsubscribe, or change list options, visit: http://lists.midrange.com/mailman/listinfo/rpg400-l or email: RPG400-L-request@xxxxxxxxxxxx Before posting, please take a moment to review the archives at http://archive.midrange.com/rpg400-l.
***************************************************************** compile with option: Delay PREPARE . . . . . . . . . DLYPRP *yes ***************************************************************** Here's the sql statement before it's executed: > EVAL sql_statement SQL_STATEMENT = ....5...10...15...20...25...30...35...40...45...50...55...60 1 'select * from ediinvl5 where insol in ( 'H449 ', 'H440 ', 'H' 61 '436 ' ) and indiv in ( '3T', '1E', '1C' ) and insea in ( 'H'' 121 ' ) ' ***************************************************************** * get edi inventory data d #getInventory pr * get edi sales data d #getSales pr * for sql statements d wrkediinv e ds extname( EDIINVL5 ) d wrkedisls e ds extname( EDISLSL5 ) d alist ds d pstr 100 d pwedt1 8 0 d pwedt2 8 0 d pDivisions 10a d pSeasons 5a d alist2 ds d store# 1 100 dim( 20 ) inz( *hival ) d descend d division 117 126 dim( 5 ) inz( *hival ) d descend d season 127 131 dim( 5 ) inz( *hival ) d descend d apos c const( X'7D' ) d comma c const( ',' ) d i s 5i 0 d nbrDivisions s 5i 0 d nbrSeasons s 5i 0 d nbrStores s 5i 0 d sql_statement s 1024a varying d begin s d d d s 7s 0 d end s d d hlddiv s 2a d hlddpt s 4a d hldsol s 4a d invend s 8s 0 d kendt s 6s 0 d kendt@ s 2s 0 d myDate s d d nbrTimes s 7s 0 d runtim s 6s 0 d user s 10a d wkdpt s 4a d wkpf1 s 10a d wkpf2 s 10a d wkpf3 s 10a d wkpf4 s 10a d wkpf5 s 10a ********************************************************************** * mainline logic * ********************************************************************** * check sales c callp #getSales * check inventory c callp #getInventory /eject ********************************************************************** * Procedure: #getInventory * * Useage: * ********************************************************************** p #getInventory b d #getInventory pi /free // start to build the sql statement sql_statement = 'select * from ediinvl5'; // if store numbers are passed build selection statement nbrStores = %lookup( *blanks : store# ) - 1; if nbrStores > 0; sql_statement = sql_statement + ' where insol in ('; for i = 1 to nbrStores; if i > 1; sql_statement = sql_statement + comma; endif; sql_statement = sql_statement + ' ' + apos + store#(i) + apos; endfor; sql_statement = sql_statement + ' )'; endif; // week ending date range if nbrStores = 0; sql_statement = sql_statement + ' where inend between ' + %editc( pwedt1 : 'X' ) + ' and ' + %editc( pwedt2 : 'X' ); else; sql_statement = sql_statement + ' and inend between ' + %editc( pwedt1 : 'X' ) + ' and ' + %editc( pwedt2 : 'X' ); endif; // if divisions are passed add to selection statement nbrDivisions = %lookup( *blanks : division ) - 1; if nbrDivisions > 0; sql_statement = sql_statement + ' and indiv in ('; for i = 1 to nbrDivisions; if i > 1; sql_statement = sql_statement + comma; endif; sql_statement = sql_statement + ' ' + apos + division(i) + apos; endfor; sql_statement = sql_statement + ' )'; endif; // if seasons are passed add to selection statement nbrSeasons = %lookup( *blanks : season ) - 1; if nbrSeasons > 0; sql_statement = sql_statement + ' and insea in ('; for i = 1 to nbrSeasons; if i > 1; sql_statement = sql_statement + comma; endif; sql_statement = sql_statement + ' ' + apos + season(i) + apos; endfor; sql_statement = sql_statement + ' )'; endif; /end-free * prepare sql statement c/exec sql c+ prepare sql from :sql_statement c/end-exec * declare cursor c/exec sql c+ declare c1 cursor for sql c/end-exec * open cursor c/exec sql c+ open c1 c/end-exec * fetch cursor c/exec sql c+ fetch c1 into :wrkediinv c/end-exec /free dow ( sqlcod >= 0 ) and ( sqlcod <> 100 ); chain deptKey2 CHKDPTWF; if %found( CHKDPTWF ); cdwinv = 'X'; cdwict = cdwict + 1; update DPTREC; else; cdwsol = insol; cdwdiv = indiv; cdwdpt = indpt; cdwsls = *blanks; cdword = *blanks; cdwinv = 'X'; cdwsct = 0; cdwict = 1; write DPTREC; endif; /end-free * fetch cursor c/exec sql c+ fetch next from c1 into :wrkediinv c/end-exec /free enddo; /end-free * close cursor c/exec sql c+ close c1 c/end-exec p #getInventory e /eject ********************************************************************** * Procedure: #getSales * * Useage: * ********************************************************************** p #getSales b d #getSales pi /free // start to build the sql statement sql_statement = 'select * from edislsl5'; // if store numbers are passed build selection statement nbrStores = %lookup( *blanks : store# ) - 1; if nbrStores > 0; sql_statement = sql_statement + ' where wksol in ('; for i = 1 to nbrStores; if i > 1; sql_statement = sql_statement + comma; endif; sql_statement = sql_statement + ' ' + apos + store#(i) + apos; endfor; sql_statement = sql_statement + ' )'; endif; // week ending date range if nbrStores = 0; sql_statement = sql_statement + ' where wkend between ' + %subst( %editc( pwedt1 : 'X' ) : 3 : 6 ) + ' and ' + %subst( %editc( pwedt2 : 'X' ) : 3 : 6 ); else; sql_statement = sql_statement + ' and wkend between ' + %subst( %editc( pwedt1 : 'X' ) : 3 : 6 ) + ' and ' + %subst( %editc( pwedt2 : 'X' ) : 3 : 6 ); endif; // if divisions are passed add to selection statement nbrDivisions = %lookup( *blanks : division ) - 1; if nbrDivisions > 0; sql_statement = sql_statement + ' and wkdiv in ('; for i = 1 to nbrDivisions; if i > 1; sql_statement = sql_statement + comma; endif; sql_statement = sql_statement + ' ' + apos + division(i) + apos; endfor; sql_statement = sql_statement + ' )'; endif; // if seasons are passed add to selection statement nbrSeasons = %lookup( *blanks : season ) - 1; if nbrSeasons > 0; sql_statement = sql_statement + ' and wksea in ('; for i = 1 to nbrSeasons; if i > 1; sql_statement = sql_statement + comma; endif; sql_statement = sql_statement + ' ' + apos + season(i) + apos; endfor; sql_statement = sql_statement + ' )'; endif; /end-free * prepare sql statement c/exec sql c+ prepare sql2 from :sql_statement c/end-exec * declare cursor c/exec sql c+ declare c2 cursor for sql2 c/end-exec * open cursor c/exec sql c+ open c2 c/end-exec * fetch cursor c/exec sql c+ fetch c2 into :wrkedisls c/end-exec /free dow ( sqlcod >= 0 ) and ( sqlcod <> 100 ); wkdpt = %subst( alphf1 : 1 : 4 ); chain deptKey1 CHKDPTWF; if %found( CHKDPTWF ); cdwsls = 'X'; cdwsct = cdwsct + 1; update DPTREC; else; cdwsol = wksol; cdwdiv = wkdiv; cdwdpt = wkdpt; cdwsls = 'X'; cdwinv = *blanks; cdword = *blanks; cdwsct = 1; cdwict = 0; write DPTREC; endif; /end-free * fetch cursor c/exec sql c+ fetch next from c2 into :wrkedisls c/end-exec /free enddo; /end-free * close cursor c/exec sql c+ close c2 c/end-exec p #getSales e
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.