For Programmers: Free Programming Magazines  


Home > Archive > Cobol > February 2006 > COBOL and dynamic SQL









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author COBOL and dynamic SQL
deny.wilson@gmail.com

2006-01-31, 6:55 pm

I'm running into a problem with running a certain type of dynamic
query. All the examples I've seen are for unknown numbers of columns
being returned. I have a situation where I have an unknown number of
where variables, but the columns being returned is always the same. I'm
using the SQLDA area to hold the where variables, but I don't think
it's used for that. At least, I can't find an example of a program
doing this anywhere on the internet. Here's an example program of what
I'm trying to do (I'm sure it probably won't compile because of some
syntax error, but I'm just trying to give the gist of what I'm trying
to do).

----- Begin Program -----

IDENTIFICATION DIVISION.
PROGRAM-ID. TEST1.
AUTHOR. D WILSON.

DATE-COMPILED.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL INCLUDE SQLCA
END-EXEC.

01 WHR-VARIABLES.
05 WHR-FIRST-NAME PIC X(30).
05 WHR-LAST-NAME PIC X(30).
05 WHR-MIDDLE-NAME PIC X(20).
05 WHR-START-SUBSCRIBE-DATE PIC X(10).
05 WHR-STOP-SUBSCRIBE-DATE PIC X(10).
10 WHR-RESTART-FIRST-NAME PIC X(30).
10 WHR-RESTART-MIDDLE-NAME PIC X(20).
10 WHR-RESTART-LAST-NAME PIC X(30).
10 WHR-RESTART-SUBSCRIBE-DATE PIC X(10).

01 DYNAMIC-VARIABLES.
05 STMTBUF.
49 STMTLEN PIC S9(4) COMP
VALUE +5000.
49 STMTCHAR PIC X(5000).
05 WS-VAR-COUNTER PIC 9(05).
05 ATTRVAR PIC X(21)
VALUE 'OPTIMIZE FOR 20 ROWS '.
*
01 STMTBLD-VARS.
05 STMT-WHERE PIC X(07).
05 STMT-FIRST-NAME PIC X(22).
05 STMT-MIDDLE-NAME PIC X(23).
05 STMT-LAST-NAME PIC X(21).
05 STMT-START-SUBSCRIBE-DATE PIC X(27).
05 STMT-STOP-SUBSCRIBE-DATE PIC X(27).
05 STMT-RESTART-BLOCK PIC X(240).
*
01 STMTBLD-SELECT.
02 FILLER PIC X(36)
VALUE 'SELECT A.FIRST_NAME, A.MIDDLE_NAME, '.
02 FILLER PIC X(28)
VALUE 'A.LAST_NAME, A.RES_BUS_IND, '.
02 FILLER PIC X(33)
VALUE 'A.PHONE_NUMBER, A.SUBSCRIBE_DATE '.
02 FILLER PIC X(21)
VALUE 'FROM CONTACT_TABLE A '.
*
01 STMTBLD-ORDER.
02 FILLER PIC X(36)
VALUE ' ORDER BY A.LAST_NAME, A.FIRST_NAME '.

*
****************************************
*************
* SQL DESCRIPTOR AREA *
****************************************
*************
EXEC SQL INCLUDE SQLDA END-EXEC.
*
* DATA TYPES FOUND IN SQLTYPE
*
77 SQL-TYP-NULINC PIC S9(4) COMP-5 VALUE 1.
77 SQL-TYP-DATE PIC S9(4) COMP-5 VALUE +384.
77 SQL-TYP-NDATE PIC S9(4) COMP-5 VALUE +385.
77 SQL-TYP-TIME PIC S9(4) COMP-5 VALUE +388.
77 SQL-TYP-NTIME PIC S9(4) COMP-5 VALUE +389.
77 SQL-TYP-STAMP PIC S9(4) COMP-5 VALUE +392.
77 SQL-TYP-NSTAMP PIC S9(4) COMP-5 VALUE +393.
77 SQL-TYP-DATALINK PIC S9(4) COMP-5 VALUE +396.
77 SQL-TYP-NDATALINK PIC S9(4) COMP-5 VALUE +397.
77 SQL-TYP-CGSTR PIC S9(4) COMP-5 VALUE +400.
77 SQL-TYP-NCGSTR PIC S9(4) COMP-5 VALUE +401.
77 SQL-TYP-BLOB PIC S9(4) COMP-5 VALUE +404.
77 SQL-TYP-NBLOB PIC S9(4) COMP-5 VALUE +405.
77 SQL-TYP-CLOB PIC S9(4) COMP-5 VALUE +408.
77 SQL-TYP-NCLOB PIC S9(4) COMP-5 VALUE +409.
77 SQL-TYP-DBCLOB PIC S9(4) COMP-5 VALUE +412.
77 SQL-TYP-NDBCLOB PIC S9(4) COMP-5 VALUE +413.
77 SQL-TYP-VARCHAR PIC S9(4) COMP-5 VALUE +448.
77 SQL-TYP-NVARCHAR PIC S9(4) COMP-5 VALUE +449.
77 SQL-TYP-CHAR PIC S9(4) COMP-5 VALUE +452.
77 SQL-TYP-NCHAR PIC S9(4) COMP-5 VALUE +453.
77 SQL-TYP-LONG PIC S9(4) COMP-5 VALUE +456.
77 SQL-TYP-NLONG PIC S9(4) COMP-5 VALUE +457.
77 SQL-TYP-CSTR PIC S9(4) COMP-5 VALUE +460.
77 SQL-TYP-NCSTR PIC S9(4) COMP-5 VALUE +461.
77 SQL-TYP-VARGRAPH PIC S9(4) COMP-5 VALUE +464.
77 SQL-TYP-NVARGRAPH PIC S9(4) COMP-5 VALUE +465.
77 SQL-TYP-GRAPHIC PIC S9(4) COMP-5 VALUE +468.
77 SQL-TYP-NGRAPHIC PIC S9(4) COMP-5 VALUE +469.
77 SQL-TYP-LONGRAPH PIC S9(4) COMP-5 VALUE +472.
77 SQL-TYP-NLONGRAPH PIC S9(4) COMP-5 VALUE +473.
77 SQL-TYP-LSTR PIC S9(4) COMP-5 VALUE +476.
77 SQL-TYP-NLSTR PIC S9(4) COMP-5 VALUE +477.
77 SQL-TYP-FLOAT PIC S9(4) COMP-5 VALUE +480.
77 SQL-TYP-NFLOAT PIC S9(4) COMP-5 VALUE +481.
77 SQL-TYP-DECIMAL PIC S9(4) COMP-5 VALUE +484.
77 SQL-TYP-NDECIMAL PIC S9(4) COMP-5 VALUE +485.
77 SQL-TYP-ZONED PIC S9(4) COMP-5 VALUE +488.
77 SQL-TYP-NZONED PIC S9(4) COMP-5 VALUE +489.
77 SQL-TYP-BIGINT PIC S9(4) COMP-5 VALUE +492.
77 SQL-TYP-NBIGINT PIC S9(4) COMP-5 VALUE +493.
77 SQL-TYP-INTEGER PIC S9(4) COMP-5 VALUE +496.
77 SQL-TYP-NINTEGER PIC S9(4) COMP-5 VALUE +497.
77 SQL-TYP-SMALL PIC S9(4) COMP-5 VALUE +500.
77 SQL-TYP-NSMALL PIC S9(4) COMP-5 VALUE +501.
77 SQL-TYP-NUMERIC PIC S9(4) COMP-5 VALUE +504.
77 SQL-TYP-NNUMERIC PIC S9(4) COMP-5 VALUE +505.
*
****************************************
*************
* DECLARE CURSOR AND STATEMENT FOR DYNAMIC SQL
****************************************
*************
*
EXEC SQL DECLARE DT CURSOR FOR SEL END-EXEC.
EXEC SQL DECLARE SEL STATEMENT END-EXEC.

01 DB2-CURSOR-CONTROL.
05 CSELID-CONTACT-CURSOR-IND PIC X.
88 CSELID-CONTACT-CURSOR-OPEN VALUE 'Y'.

EJECT
EXEC SQL INCLUDE DB2STAT
END-EXEC.
EJECT
EXEC SQL INCLUDE CONTACT
END-EXEC.
01 CONTACT-REC
REDEFINES DCLCONTACT.
05 FIRST-NAME PIC X(30).
05 MIDDLE-NAME PIC X(20).
05 LAST-NAME PIC X(30).
05 RES-BUS-IND PIC X(01).
05 PHONE-NUMBER PIC X(12).
05 SUBSCRIBE-DATE PIC X(10).
EJECT

LINKAGE SECTION.
EXEC SQL INCLUDE ABTLINK
END-EXEC.
EJECT
COPY LKSQLCA.
EJECT
01 TEST1-PARMS.
05 TEST1-IN-FIRST-NAME PIC X(30).
05 TEST1-IN-MIDDLE-NAME PIC X(20).
05 TEST1-IN-LAST-NAME PIC X(30).
05 TEST1-START-SUBSCRIBE-DATE PIC X(10).
05 TEST1-STOP-SUBSCRIBE-DATE PIC X(10).
05 TEST1-RESTART-BLOCK.
10 TEST1-RESTART-FIRST-NAME PIC X(30).
10 TEST1-RESTART-MIDDLE-NAME PIC X(20).
10 TEST1-RESTART-LAST-NAME PIC X(30).
10 TEST1-RESTART-DATE PIC X(10).
05 RETURN-LIST OCCURS 20 TIMES.
10 TEST1-RETURN-FIRST-NAME PIC X(30).
10 TEST1-RETURN-MIDDLE-NAME PIC X(20).
10 TEST1-RETURN-LAST-NAME PIC X(30).
10 TEST1-RETURN-RES-BUS-IND PIC X(01).
10 TEST1-RETURN-PHONE-NUMBER PIC X(12).
10 TEST1-RETURN-SUB-DATE PIC X(10).
EJECT

PROCEDURE DIVISION USING ABNORMAL-TERMINATION-AREA
LKSQLCA
TEST1-PARMS.

PERFORM 1000-INITIALIZE THRU 1000-INITIALIZE-EXIT.

PERFORM 2000-GET-SUBSCRIBERS THRU
2000-GET-SUBSCRIBERS-EXIT.
GOBACK.

1000-INITIALIZE.
INITIALIZE DB2-CURSOR-CONTROL.
MOVE SPACES TO WHR-VARIABLES
STMTBLD-VARS.
MOVE TEST1-START-SUBSCRIBE-DATE TO WHR-START-SUBSCRIBE-DATE.
MOVE TEST1-STOP-SUBSCRIBE-DATE TO WHR-STOP-SUBSCRIBE-DATE.
MOVE TEST1-IN-FIRST-NAME TO WHR-FIRST-NAME.
MOVE TEST1-IN-MIDDLE-NAME TO WHR-MIDDLE-NAME.
MOVE TEST1-IN-LAST-NAME TO WHR-LAST-NAME.

IF TEST1-RESTART-BLOCK = SPACE
MOVE SPACES TO WHR-RESTART-FIRST-NAME
MOVE SPACES TO WHR-RESTART-MIDDLE-NAME
MOVE SPACES TO WHR-RESTART-LAST-NAME
MOVE '0001-01-01' TO WHR-RESTART-DATE
ELSE
MOVE TEST1-RESTART-FIRST-NAME TO WHR-RESTART-FIRST-NAME
MOVE TEST1-RESTART-MIDDLE-NAME TO WHR-RESTART-MIDDLE-NAME
MOVE TEST1-RESTART-LAST-NAME TO WHR-RESTART-LAST-NAME
MOVE TEST1-RESTART-START-DATE TO WHR-RESTART-DATE
END-IF.
MOVE ZEROES TO SQLN
WS-VAR-COUNTER.
* NUMBER OF COLUMNS BEING RETURNED - HARDCODED
MOVE 4 TO SQLD.

1000-INITIALIZE-EXIT.
EXIT.
EJECT

2000-GET-SUBSCRIBERS.
SET DA-OK TO TRUE.
PERFORM VARYING SUB1 FROM 1 BY 1
UNTIL SUB1 > 20
OR DA-NOTFOUND
PERFORM 4000-STATEMENT-BUILDER THRU
4000-STATEMENT-BUILDER-EXIT
PERFORM U-100-CSELID-CONTACT
IF DA-OK
ADD 1 TO SUB
IF SUB1 > 20
MOVE FIRST-NAME TO TEST1-FIRST-NAME
MOVE MIDDLE-NAME TO TEST1-MIDDLE-NAME
MOVE LAST-NAME TO TEST1-LAST-NAME
MOVE SUBSCRIBE-DATE TO TEST1-RESTART-DATE
IF CSELLCID-CONTACT-CURSOR-OPEN
PERFORM U-100-CSELLCID-CONTACT-CLOSE
END-IF
ELSE
PERFORM 3000-MOVE-DATA THRU
3000-MOVE-DATA-EXIT
END-IF
SET DA-OK TO TRUE
END-IF
END-PERFORM.
2000-GET-SUBSCRIBERS-EXIT.
EXIT.
EJECT

3000-MOVE-DATA.
MOVE FIRST-NAME TO TEST1-RETURN-FIRST-NAME (SUB).
MOVE MIDDLE-NAME TO TEST1-RETURN-MIDDLE-NAME (SUB).
MOVE LAST-NAME TO TEST1-RETURN-LAST-NAME (SUB).
MOVE RES-BUS-IND TO TEST1-RETURN-RES-BUS-IND (SUB).
MOVE PHONE-NUMBER TO TEST1-RETURN-PHONE-NUMBER (SUB).
MOVE SUBSCRIBE-DATE TO TEST1-RETURN-SUB-DATE (SUB).
3000-MOVE-DATA-EXIT.
EXIT.
EJECT

4000-STATEMENT-BUILDER.
IF WHR-FIRST-NAME NOT = SPACES OR
WHR-LAST-NAME NOT = SPACES OR
WHR-MIDDLE-NAME NOT = SPACES OR
WHR-START-SUBSCRIBE-DATE NOT = SPACES OR
WHR-STOP-SUBSCRIBE-DATE NOT = SPACES
MOVE ' WHERE ' TO STMT-WHERE
END-IF.

IF WHR-FIRST-NAME NOT = SPACES
MOVE ' AND A.FIRST_NAME = ? ' TO STMT-FIRST-NAME
ADD 1 TO WS-VAR-COUNTER
SQLN
SET SQLDATA(WS-VAR-COUNTER) TO ADDRESS
OF WHR-FIRST-NAME
MOVE SQL-TYP-CHAR TO SQLTYPE(WS-VAR-COUNTER)
ELSE
MOVE SPACES TO STMT-FIRST-NAME
END-IF.

IF WHR-MIDDLE-NAME NOT = SPACES
MOVE ' AND A.MIDDLE_NAME = ? ' TO STMT-MIDDLE-NAME
ADD 1 TO WS-VAR-COUNTER
SQLN
SET SQLDATA(WS-VAR-COUNTER) TO ADDRESS
OF WHR-MIDDLE-NAME
MOVE SQL-TYP-CHAR TO SQLTYPE(WS-VAR-COUNTER)
ELSE
MOVE SPACES TO STMT-MIDDLE-NAME
END-IF.

IF WHR-LAST-NAME NOT = SPACES
MOVE ' AND A.LAST_NAME = ? ' TO STMT-LAST-NAME
ADD 1 TO WS-VAR-COUNTER
SQLN
SET SQLDATA(WS-VAR-COUNTER) TO ADDRESS
OF WHR-LAST-NAME
MOVE SQL-TYP-CHAR TO SQLTYPE(WS-VAR-COUNTER)
ELSE
MOVE SPACES TO STMT-LAST-NAME
END-IF.

IF WHR-START-SUBSCRIBE-DATE NOT = SPACES
MOVE ' AND A.SUBSCRIBE_DATE >= ? ' TO
STMT-START-SUBSCRIBE-DATE
ADD 1 TO WS-VAR-COUNTER
SQLN
SET SQLDATA(WS-VAR-COUNTER) TO ADDRESS
OF WHR-START-SUBSCRIBE-DATE
MOVE SQL-TYP-CHAR TO SQLTYPE(WS-VAR-COUNTER)
ELSE
MOVE SPACES TO STMT-START-SUBSCRIBE-DATE
END-IF.

IF WHR-START-SUBSCRIBE-DATE NOT = SPACES
MOVE ' AND A.SUBSCRIBE_DATE <= ? ' TO
STMT-STOP-SUBSCRIBE-DATE
ADD 1 TO WS-VAR-COUNTER
SQLN
SET SQLDATA(WS-VAR-COUNTER) TO ADDRESS
OF WHR-STOP-SUBSCRIBE-DATE
MOVE SQL-TYP-CHAR TO SQLTYPE(WS-VAR-COUNTER)
ELSE
MOVE SPACES TO STMT-STOP-SUBSCRIBE-DATE
END-IF.

IF TEST1-RESTART-BLOCK NOT = SPACES
STRING ' AND (A.FIRST_NAME > ? ' DELIMITED BY SIZE
' OR (A.FIRST_NAME = ? ' DELIMITED BY SIZE
' AND A.MIDDLE_NAME > ?) ' DELIMITED BY SIZE
' OR (A.FIRST_NAME = ? ' DELIMITED BY SIZE
' AND A.MIDDLE_NAME = ? ' DELIMITED BY SIZE
' AND A.LAST_NAME > ?) ' DELIMITED BY SIZE
' OR (A.FIRST_NAME = ? ' DELIMITED BY SIZE
' AND A.MIDDLE_NAME = ? ' DELIMITED BY SIZE
' AND A.LAST_NAME = ? ' DELIMITED BY SIZE
' AND A.SUBSCRIBE_DATE >= ?)) ' DELIMITED BY SIZE
INTO STMT-RESTART-BLOCK

ADD 1 TO WS-VAR-COUNTER
SQLN
SET SQLDATA(WS-VAR-COUNTER) TO ADDRESS
OF WHR-RESTART-FIRST-NAME
MOVE SQL-TYP-CHAR TO SQLTYPE(WS-VAR-COUNTER)

ADD 1 TO WS-VAR-COUNTER
SQLN
SET SQLDATA(WS-VAR-COUNTER) TO ADDRESS
OF WHR-RESTART-FIRST-NAME
MOVE SQL-TYP-CHAR TO SQLTYPE(WS-VAR-COUNTER)

ADD 1 TO WS-VAR-COUNTER
SQLN
SET SQLDATA(WS-VAR-COUNTER) TO ADDRESS
OF WHR-RESTART-MIDDLE-NAME
MOVE SQL-TYP-CHAR TO SQLTYPE(WS-VAR-COUNTER)

ADD 1 TO WS-VAR-COUNTER
SQLN
SET SQLDATA(WS-VAR-COUNTER) TO ADDRESS
OF WHR-RESTART-FIRST-NAME
MOVE SQL-TYP-CHAR TO SQLTYPE(WS-VAR-COUNTER)

ADD 1 TO WS-VAR-COUNTER
SQLN
SET SQLDATA(WS-VAR-COUNTER) TO ADDRESS
OF WHR-RESTART-MIDDLE-NAME
MOVE SQL-TYP-CHAR TO SQLTYPE(WS-VAR-COUNTER)

ADD 1 TO WS-VAR-COUNTER
SQLN
SET SQLDATA(WS-VAR-COUNTER) TO ADDRESS
OF WHR-RESTART-LAST-NAME
MOVE SQL-TYP-CHAR TO SQLTYPE(WS-VAR-COUNTER)

ADD 1 TO WS-VAR-COUNTER
SQLN
SET SQLDATA(WS-VAR-COUNTER) TO ADDRESS
OF WHR-RESTART-FIRST-NAME
MOVE SQL-TYP-CHAR TO SQLTYPE(WS-VAR-COUNTER)

ADD 1 TO WS-VAR-COUNTER
SQLN
SET SQLDATA(WS-VAR-COUNTER) TO ADDRESS
OF WHR-RESTART-MIDDLE-NAME
MOVE SQL-TYP-CHAR TO SQLTYPE(WS-VAR-COUNTER)

ADD 1 TO WS-VAR-COUNTER
SQLN
SET SQLDATA(WS-VAR-COUNTER) TO ADDRESS
OF WHR-RESTART-LAST-NAME
MOVE SQL-TYP-CHAR TO SQLTYPE(WS-VAR-COUNTER)

ADD 1 TO WS-VAR-COUNTER
SQLN
SET SQLDATA(WS-VAR-COUNTER) TO ADDRESS
OF WHR-RESTART-SUBSCRIBE-DATE
MOVE SQL-TYP-DATE TO SQLTYPE(WS-VAR-COUNTER)
ELSE
MOVE SPACES TO STMT-RESTART-BLOCK
END-IF.

STRING STMTBLD-SELECT DELIMITED BY SIZE
STMT-WHERE DELIMITED BY SIZE
STMT-FIRST-NAME DELIMITED BY SIZE
STMT-MIDDLE-NAME DELIMITED BY SIZE
STMT-LAST-NAME DELIMITED BY SIZE
STMT-START-SUBSCRIBE-DATE DELIMITED BY SIZE
STMT-STOP-SUBSCRIBE-DATE DELIMITED BY SIZE
STMT-RESTART-BLOCK DELIMITED BY SIZE
STMTBLD-ORDER DELIMITED BY SIZE
INTO STMTCHAR.

4000-STATEMENT-BUILDER-EXIT.
EXIT.
EJECT

U-100-USER-IO SECTION.

****************************************
*************************
* *
****************************************
*************************

U-100-CSELID-CONTACT.
EXEC SQL
PREPARE STMT INTO :SQLDA FROM :STMTBUF
END-EXEC.
IF SQLCODE NOT = 0
PERFORM U-100-SET-DA-STATUS-DB2
MOVE 3601 TO DA-CALL-SEQUENCE
MOVE 'PREPARE' TO DA-CALL-TYPE
MOVE 'CONTACT' TO DA-TABLE
PERFORM DB2-STATUS.

EXEC SQL
DECLARE CSELLCID_CONTACT
CURSOR FOR STMT
END-EXEC.
IF SQLCODE NOT = 0
PERFORM U-100-SET-DA-STATUS-DB2
MOVE 3602 TO DA-CALL-SEQUENCE
MOVE 'DECLARE' TO DA-CALL-TYPE
MOVE 'CONTACT' TO DA-TABLE
PERFORM DB2-STATUS.

IF NOT CSELLCID-CONTACT-CURSOR-OPEN
PERFORM U-100-CSELID-CONTACT-OPEN.
EXEC SQL
FETCH CSELLCID_CONTACT
INTO
:CONTACT.FIRST-NAME ,
:CONTACT.MIDDLE-NAME ,
:CONTACT.LAST-NAME ,
:CONTACT.RES-BUS-IND ,
:CONTACT.PHONE-NUMBER ,
:CONTACT.SUBSCRIBE-DATE
END-EXEC.
PERFORM U-100-SET-DA-STATUS-DB2.
IF SQLCODE = +100
PERFORM U-100-CSELID-CONTACT-CLOSE
ELSE
IF SQLCODE NOT = 0
MOVE 3603 TO DA-CALL-SEQUENCE
MOVE 'READNEXT' TO DA-CALL-TYPE
MOVE 'CONTACT' TO DA-TABLE
PERFORM DB2-STATUS.

U-100-CSELID-CONTACT-OPEN.
EXEC SQL
OPEN CSELLCID_CONTACT USING :SQLDA
END-EXEC.
SET CSELLCID-CONTACT-CURSOR-OPEN TO TRUE.
IF SQLCODE NOT = 0 AND -502
PERFORM U-100-SET-DA-STATUS-DB2
MOVE 3604 TO DA-CALL-SEQUENCE
MOVE 'OPEN' TO DA-CALL-TYPE
MOVE 'CONTACT' TO DA-TABLE
PERFORM DB2-STATUS.

U-100-CSELID-CONTACT-CLOSE.
EXEC SQL
CLOSE CSELLCID_CONTACT
END-EXEC.
MOVE SPACE TO CSELLCID-CONTACT-CURSOR-IND.
IF SQLCODE NOT = 0 AND -501
PERFORM U-100-SET-DA-STATUS-DB2
MOVE 3605 TO DA-CALL-SEQUENCE
MOVE 'CLOSE' TO DA-CALL-TYPE
MOVE 'CONTACT' TO DA-TABLE
PERFORM DB2-STATUS.

COPY UPD2STAT.
COPY DB2STATM.

---- End Program ----

deny.wilson@gmail.com

2006-02-02, 6:55 pm

Found the answer to my question. After hours of googling, I found an
IBM redbook that shows me how to do the exact thing that I want to do.
Here's a link for anyone that is curious.

http://www.redbooks.ibm.com/redbooks/pdfs/sg246418.pdf

AgustinZabala

2006-02-08, 8:52 am

Dear deny.wilson
Thank you very much by the Link to
http://www.redbooks.ibm.com/redbooks/pdfs/sg246418.pdf
Best Regards.!

Arq. Agustin Zabala
http://www.cobol.com.ar

Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com