### Example: Using LineDataRecordWriter to create a line data spooled file

Note: Read the Code example disclaimer for important legal information.

    /////////////////////////////////////////////////////////////////////
    //
    // LineDataRecordWriter example.  This program uses the line data
    // record writer access class to create a line data spooled file
    // on the system.
    //
    // This source is an example of using the IBM Toolbox for Java
    // "LineDataRecordWriter" class.
    //
    ////////////////////////////////////////////////////////////////////////

    import com.ibm.as400.access.*;
    import java.io.*;
    import java.math.BigDecimal;

    public class TestA {

        //Private
        private static int ccsid_           = -1;       // local ccsid variable
        private static AS400 system_        = null;     // the system
        private static SequentialFile file_ = null;     // the file

        /**
         **  Create the record field descriptions and record format.
         **/
        public static RecordFormat initializeRecordFormat()
        {
            // Create the record format.
            RecordFormat qcustcdt = new RecordFormat();

            // Create record field descriptions for the record format.
            ZonedDecimalFieldDescription customerNumber =
                              new ZonedDecimalFieldDescription(new AS400ZonedDecimal(6,0),
                                                               "CUSNUM");
            CharacterFieldDescription lastName =
                              new CharacterFieldDescription(new AS400Text(8, ccsid_, system_), "LSTNAM");

            CharacterFieldDescription initials =
                              new CharacterFieldDescription(new AS400Text(3, ccsid_, system_), "INIT");

            CharacterFieldDescription street =
                              new CharacterFieldDescription(new AS400Text(13, ccsid_, system_), "STREET");

            CharacterFieldDescription city =
                              new CharacterFieldDescription(new AS400Text(6, ccsid_, system_), "CITY");

            CharacterFieldDescription state =
                              new CharacterFieldDescription(new AS400Text(2, ccsid_, system_), "STATE");

            ZonedDecimalFieldDescription zipCode =
                              new ZonedDecimalFieldDescription(new AS400ZonedDecimal(5,0),
                                                               "ZIPCOD");
            ZonedDecimalFieldDescription creditLimit =
                              new ZonedDecimalFieldDescription(new AS400ZonedDecimal(4,0),
                                                               "CDTLMT");
            ZonedDecimalFieldDescription chargeCode =
                              new ZonedDecimalFieldDescription(new AS400ZonedDecimal(1,0),
                                                               "CHGCOD");
            ZonedDecimalFieldDescription balanceDue =
                              new ZonedDecimalFieldDescription(new AS400ZonedDecimal(6,2),
                                                               "BALDUE");
            ZonedDecimalFieldDescription creditDue =
                              new ZonedDecimalFieldDescription(new AS400ZonedDecimal(6,2),
                                                               "CDTDUE");

            // assign constants from FieldDescription class
            int justLeft = FieldDescription.ALIGN_LEFT;
            int justRight = FieldDescription.ALIGN_RIGHT;

            // set the length and alignment attributes for writing the fields
            // The length indicates how many characters the field is, and
            // justification indicates where in the layout field the data
            // should be placed.
            customerNumber.setLayoutAttributes(10,justLeft);
            lastName.setLayoutAttributes(10,justLeft);
            initials.setLayoutAttributes(4,justLeft);
            street.setLayoutAttributes(15,justLeft);
            city.setLayoutAttributes(10,justLeft);
            state.setLayoutAttributes(3,justLeft);
            zipCode.setLayoutAttributes(5,justLeft);
            creditLimit.setLayoutAttributes(10,justRight);
            chargeCode.setLayoutAttributes(3,justRight);
            balanceDue.setLayoutAttributes(10,justRight);
            creditDue.setLayoutAttributes(10,justRight);

            // set the record format ID
            String d = "CUSTRECID";
            qcustcdt.setRecordFormatID(d);

            // if this were a variable field length record,
            // we would set the type and delimiter accordingly.  We
            // also would not have needed to specify layoutLength and
            // layoutAlignment values.
            // qcustcdt.setRecordFormatType(RecordFormat.VARIABLE_LAYOUT_LENGTH);
            // qcustcdt.setDelimiter(';');

            // set the record type to fixed field length
            qcustcdt.setRecordFormatType(RecordFormat.FIXED_LAYOUT_LENGTH);

            // add the field descriptions to the record format.
            qcustcdt.addFieldDescription(customerNumber);
            qcustcdt.addFieldDescription(lastName);
            qcustcdt.addFieldDescription(initials);
            qcustcdt.addFieldDescription(street);
            qcustcdt.addFieldDescription(city);
            qcustcdt.addFieldDescription(state);
            qcustcdt.addFieldDescription(zipCode);
            qcustcdt.addFieldDescription(creditLimit);
            qcustcdt.addFieldDescription(chargeCode);
            qcustcdt.addFieldDescription(balanceDue);
            qcustcdt.addFieldDescription(creditDue);

            return qcustcdt;
        }

        /**
         ** Creates the actual record with data
         **/
        public static void createRecord(Record record)
        {
            record.setField("CUSNUM", new BigDecimal(323));
            record.setField("LSTNAM", "Johnson");
            record.setField("INIT", "B E");
            record.setField("STREET", "5234 Elm St");
            record.setField("CITY", "Rchstr");
            record.setField("STATE", "MN");
            record.setField("ZIPCOD", new BigDecimal(55901));
            record.setField("CDTLMT", new BigDecimal(5000.00));
            record.setField("CHGCOD", new BigDecimal(3));
            record.setField("BALDUE", new BigDecimal(25.00));
            record.setField("CDTDUE", new BigDecimal(0.00));
        }

        public static void main(String[]args) {

            // create an instance of the system
            system_ = new AS400("SYSTEMA", "JOE", "PGMR");

            // create a ccsid
            ccsid_ = system_.getCcsid();

            // create output queue and specify spooled file data to be *LINE
            OutputQueue outQ = new OutputQueue(system_, "/QSYS.LIB/QUSRSYS.LIB/LDRW.OUTQ");
            PrintParameterList parms = new PrintParameterList();
            parms.setParameter(PrintObject.ATTR_PRTDEVTYPE, "*LINE");
            parms.setParameter(PrintObject.ATTR_PAGDFN,"/QSYS.LIB.QUSRSYS.LIB/LDRW.PAGDFN");
            parms.setParameter(PrintObject.ATTR_CONVERT_LINEDATA,"*YES");

            // initialize the record format for writing data
            RecordFormat recfmt = initializeRecordFormat();

            // create a record and assign data to be printed...
            Record record = new Record(recfmt);
            createRecord(record);

            SpooledFileOutputStream os = null;

            try {
                // create the output spooled file to hold the record data
                os = new SpooledFileOutputStream(system_, parms, null, outQ);
            }

            if (os != null) { // Output stream was created successfully!
                LineDataRecordWriter ldw;
                try {
                    // create the line data record writer
                    ldw = new LineDataRecordWriter(os, ccsid_, system_);

                    // write the record of data
                    ldw.writeRecord(record);
                }
                catch (IOException e) {
                    System.out.println("Error occurred writing record data");
                }

                // close the output stream (spooled file)
                try {
                    os.close();
                }
                catch (Exception e) {
                    System.out.println("Error occurred closing output stream.");
                }
            }
        }
    }