Solved

As400 - reports

Posted on 2013-05-10
9
111 Views
Last Modified: 2016-07-05
Hi,

In my application currently we are printing the reports in RPGLE using program described printer files concepts. once the reports are generated then we are copying spool file into physical file using CPYSPLF command with control as *FCFC.

now currently I am planning to build the reports into physical file member instead of generate spool file and copy the spool file. my intention is without changing the program logic i.e) instead of write the data into spool file , reroute printer data into physical file.

currently i didn't know how to route the printer data into physical file. the data in physical file should be as cpysplf command *FCFC way.

could you please help on me.
0
Comment
Question by:Vsomepalli
  • 4
  • 3
9 Comments
 
LVL 34

Expert Comment

by:Gary Patterson
ID: 39167840
If you don't want to change the program, why don't you just do what you are currently doing, adding one step: deleting the spooled file.

Write to the printer file
Copy the spooled file to a database file
Delete the spooled file

The other option is to OVRDBF to a database file.  There are a few restrictions, and if you run into one you can just use the CPYSPLF and Delete technique,.

http://iprodeveloper.com/rpg-programming/faster-way-grab-print-file-data

- Gary Patterson

- Gary Patterson
0
 

Author Comment

by:Vsomepalli
ID: 39169234
Hi Patterson,

Thanks for help. but here the problem.

I am using OVRDBF command to write data into database file instead of printer file but i am missing the printer control characters ( i.e) *FCFC values in CPYSPLF command ) . I didn't want to change program logic. but using OVRDBF only but I need control characters.

Thanks,
Venkat
0
 
LVL 34

Expert Comment

by:Gary Patterson
ID: 39169500
Venkat,

Unfortunately, I think you are at the mercy of the program that is doing the printing.

Programs can specify forms control information several different ways.  One of those ways is by putting an ANSI forms control character in the first byte of each row.  If that was happening, you'd see those in the first byte of the database file output when you do an OVRDBF.

Most programs don't generate FCFC, however.  So you are probably seeing something else, like SCS control codes.

I don't know of any better option than to override the spooled file to HOLD and use CPYSPLF and then DLTSPLF.

If isn't a great solution from a performance standpoint, but if you can't change the underlying program, I think it is probably tour best alternative.

I'm assuming this is an SCS print file.  IF it isn't you may have some other options.  What is the format of the spooled file you are capturing?

- Gary
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 

Author Comment

by:Vsomepalli
ID: 39177446
Hi Gray,

Thanks for info.  But in my applications we have 100 programs to generate SCS printer files.

In my project, we are running batch process. In this batch process we are generating reports i.e) printer files. once report is generated then we are coping report into spool files into database file using CPYSPLF command.  due to above two steps the batch process running long time. so now I am thinking to remove the CPYSPLF execution i.e) redirecting printer data into disk file using OVRDBF. but once the program done, I am missing the *FCFC character.

Based on above solution if I need to get *FCFC then, I need to change 100 programs to write *FCFC character.

Could you please suggest the best solution.
Is any other way is their to capturing the printer using the RPG Open access then write data into disk file instead of printer file.
 

Thanks,
Venkat
0
 
LVL 34

Expert Comment

by:Gary Patterson
ID: 39177902
Hi Venkat,

I can' think of a way to do this without changing all your programs.  Here's a suggestion, though:

If your problem is the long runtime, why not run the CPYSPLF processes in a separate job?

In your primary process, instead of issuing the CPYSPLF, create a data queue, and put an entry on the data queue containing the name of each spooled file you want to copy.  Start a second job that processes the data queue, which performs a CPYSPLF for each file it reads from the data queue.

Data queue "sends" and "receives" (QSNDDTAQ/QRCVDTAQ apis) are really fast, and this way your CPYSPLF operations can run in parallel with you main batch job.

If you are running on an old single-CPU system, or if your are running on a multi-CPU system that is CPU bound or I/O bound during your batch process, then this might not produce much overall runtime improvement.  On most systems, though, it will help a lot.

- Gary Patterson
0
 

Author Comment

by:Vsomepalli
ID: 39178516
Hi Gray,

Thanks for the help.  It will work. Instead of this RPG OA handler will work on printer file handler or not?   My idea is RPG OA handler capture the IO feedback so in case printer file if I capture the record data then I will include the *FCFC character then write data into disk file.
could you please let me know this solution will work or not.

Thanks,
Venkat
0
 
LVL 34

Accepted Solution

by:
Gary Patterson earned 500 total points
ID: 39179884
Venkat,

SCS spooled files, by default, contain SCS control codes, not ANSI FCFC control codes:

http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Frzalu%2Frzaluscs.htm

Here is a table that lists the valid ANSI FCFC codes:

http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Frzau6%2Frzau6ansi.htm

If desired, a programmer can choose to use ANSI FCFC codes in a program, but if so, must code explicitly to write the correct control code in the first byte of each row written to the printer file.  

If your programs aren't coded to do that (it is not a common RPG printing technique), then there ARE NO FCFC CODES IN THE SPOOLED FILE DATA - there are only SCS codes.

SCS codes are stored in the spooled output file.  If the file is printed on an SCS printer, then the spooled file data is sent intact.  If the file is printed on a non-SCS printer, the SCS codes are converted on the fly depending on the outq and or printer configuration.

So how do you get FCFC data if the program isn't coded to generate it?

Answer: You have to write a program or use a tool to create it yourself.

The most common way is to use the CPYSPLF command.  CPYSPLF can dynamically converts the SCS control codes it finds to ANSI FCFC codes - if you specify CTLCHAR(*FCFC).

You could certainly write a program to do the same thing yourself - and yes, RPG Open Access might be a nice way to do that.  I looked at the data available for Printer files in Open Access, and the QrnPrtctl_T data structure contains PRTCTL-style printer spacing control information.  

Looks like your HANDLER program will have to read the PRTCTL data structure for each row and convert it to FCFC.  You'll have to code that logic yourself in your RPG OA HANDLER program.

Refer to the Open Access manual for more information:

http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/topic/books/rzasm.pdf

Of course, that is going to mean modifying every one of your report programs to add the HANDLER directive, but that is a lot better than some of the other options.

- Gary Patterson
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Displaying an arrayList in a listView using the default adapter is rarely the best solution. To get full control of your display data, and to be able to refresh it after editing, requires the use of a custom adapter.
Since upgrading to Office 2013 or higher installing the Smart Indenter addin will fail. This article will explain how to install it so it will work regardless of the Office version installed.
An introduction to basic programming syntax in Java by creating a simple program. Viewers can follow the tutorial as they create their first class in Java. Definitions and explanations about each element are given to help prepare viewers for future …
In this fourth video of the Xpdf series, we discuss and demonstrate the PDFinfo utility, which retrieves the contents of a PDF's Info Dictionary, as well as some other information, including the page count. We show how to isolate the page count in a…

863 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

24 Experts available now in Live!

Get 1:1 Help Now