One more problem I can able to print only one record
You still have more problems than one, but glad you made it this far.
Code:
FDSPPF IF E K DISK
When you use SQL to do your file input, you wouldn't ordinarily code an F
spec for the file. SQL doesn't use it and you aren't using it in your
program. If you need the fields defined for some other purpose, use and
externally described data structure.
DDAT1 DS
DBYY 1 2
DBMM 4 5
DBDD 7 8
C*
DDAT2 DS
DEYY 1 2
DEMM 4 5
DEDD 7 8
C EXFMT FIRST
C MOVE FDATE DAT1
C MOVE TDATE DAT2
C*
C/EXEC SQL
C+ DECLARE A DYNAMIC SCROLL CURSOR FOR SELECT NAME FROM DSPPF WHERE
C+ FYY <= :BYY AND FYY >= :EYY AND FMM <= :BMM AND FMM >= :EMM AND
C+ FDD <= :BDD AND FDD >= :EDD
C/END-EXEC
As explained in other posts, this probably is not doing what you expect if
you are using different years or months. It looks like you are getting
YY-MM-DD from the screen. You should probably get used to using real date
data types to do comparisons (it is MY preference over using strings or
numbers that look like dates). You could easily change the screen fields to
real dates with something like this:
* define date fields
d fromDate s d datfmt(*iso)
d toDate s d datfmt(*iso)
* convert screen fields to dates
c eval fromDate = %date(fdate:*ymd)
c eval toDate = %date(tdate:*ymd)
Then change the file fields to real dates in the sql select (substitute for
your select above):
SELECT NAME
FROM DSPPF
WHERE DATE(CASE
WHEN FYY > 40 THEN '19'
ELSE '20'
END
||DIGITS(FYY)
||'-'
||DIGITS(FMM)
||'-'
||DIGITS(FDD))
BETWEEN :fromDate
AND :toDate
C/EXEC SQL WHENEVER NOT FOUND GO TO DONE1
C/END-EXEC
This is largely preference and discipline, but my SQL teacher led me to
believe that "whenevers" were used to catch global errors. Most loops (using
fetch) would check for SQLStt (SQLState) or SQLCOD (SQLCode). If it was my
code, I would take the "10" loop off and "dow *on" (or DOU sqlstt = '02000'
or some other looping construct). Then, after the fetch, check the sqlstt
for end of file or other error. There is a lot of information about SQLStt
on the web including some very good error message checks.
C*
C Z-ADD 1 I 2 0
C DOW I <= 10
C/EXEC SQL
C+ FETCH NEXT FROM A INTO :NAME1
C/END-EXEC
C*
*
C SELECT
* end of file
C WHEN %subst(sqlstt:1:2) = '02'
C LEAVE
C WHEN %subst(sqlstt:1:2) <> '00'
C 'SQLERR' DSPLY
C ENDSL
Good luck, embedded SQL can be very powerful and fun!
Mike Krebs
As an Amazon Associate we earn from qualifying purchases.