× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



On 6/19/2012 8:16 AM, Jeff Young wrote:
With Scotts' help I was able to get the file created properly and able to
read it in Notepad.

In fairness, Eric DeLong suggested this about 10 hours before I did.


However, when I view it with Option 5 under WRKLNK or open it with Notepad,
I noticed that my data is not aligned properly.
The data consists of 2 records, each a maximum of 50 bytes.
What I am seeing is:
123456179,THIS IS A TEST ITEM
787898779,This is a new item

You've got a bunch of blanks after the CRLF.

It's important to remember that stream files are just that -- streams! They are not a fixed-length record like you are used to. The data is one long string, it is not a collection of records.

The display program (Notepad or DSPF/EDTF) will split the line on your screen when it encounters the CRLF characters. It doesn't matter if they are in the middle of the data you pass to write() or at the end.

So if you have this:

D MyData S 100A

MyData = 'TEST' + CRLF;
callp write( fd: %addr(MyData): %Size(MyData))

After the "MyData=" line of the code, you might be _thinking_ that MyData is only 4 (or 6 with CRLF) bytes long. You're wrong. It's a fixed-length field, so it's 100 bytes long. You have 6 bytes of non-blank data followed by 94 blanks. And you'll write all 100 bytes to the file. Since the CRLF is in the middle of the data, the 94 blanks will "appear" to be on the 2nd line of the file, because they're after the CRLF.

If you insist on using (YUCK!) fixed-length variables, then please supply a length to the write() API that does not include the blanks. i.e.

callp write( fd: %addr(MyData): %len(%trimr((MyData)));

Remember, the 2nd parm to write is just the ADDRESS of the data, so trimming that parameter accomplishes absolutely nothing... it only knows the spot in memory in that parameter, not the length.

The 3rd parameter is where you need to pass a shorter length so it'll not write the whole contents of the variable.

If you use VARYING you can omit the %trim in the length calculation, but then you use %addr(MyData:*data) so you don't get VARYING's 2 byte prefix.

Good luck






The second record is starting under the H ot THIS in the first record.
The code below shows how I am writting the data.

What am I missing now???

Thanks,


<snip>

D Test_Data S 50A

Test_Data = '123456179,THIS IS A TEST ITEM' + CRLF;

Bytes_Loaded = // Bytes written

Write (FileDS // File Descriptor

: %Addr(Test_Data ) // Data to write

: %Size(Test_Data ) // Length of data

);

Test_Data = '787898779,This is a new item ' + CRLF;

Bytes_Loaded = // Bytes written

Write (FileDS // File Descriptor

: %Addr(Test_Data ) // Data to write

: %Size(Test_Data ) // Length of data

);
</snip>

On Tue, Jun 19, 2012 at 9:00 AM, Jeff Young<jyoung0950@xxxxxxxxx> wrote:

Scott,
Thanks!
The problem was that I did not trim the trailing blanks from the file name
on the Open.

I appreciate you taking the time to help with this.



On Tue, Jun 19, 2012 at 6:39 AM, Dennis Lovelady<iseries@xxxxxxxxxxxx>wrote:

This is a variation on a theme, but to add on to Scott's possibilities:

In a filesystem where case matters, it is possible that you have two files
with the same name - but the name cases don't match. This can cause
Windoze
to do some strange things, like showing you only one of the files when
there
are clearly two.

If your intended file is /path/to/file/filename.csv, then on your IBM i,
do

qsh

ls -l /path/to/file' | grep -i '*filename.csv*'

This may reveal something to you.

Dennis Lovelady
http://www.linkedin.com/in/dennislovelady
--
"Tact is the ability to describe others as they see themselves."
-- Abraham Lincoln



Yes, the IFS e-book on my web site was written for v4r5... The
O_TEXT_DATA feature (and it's corresponding 5th parameter) was added
to the OS in V5R2. You can get the current copy of IFSIO_H here:

http://scottklement.com/rpg/copybooks/ifsio_h.rpgle.txt

It's still unclear to me what the actual cause of the problem is...
Here's how I'd call the open() API... maybe that'll help.

IFS_File_Name = '/excel/xml/I12456_0.csv';

FileDs = open( %trimr(IFS_File_Name)
: O_CREAT + O_WRONLY + O_TEXTDATA + O_CCSID
+ O_TEXT_CREAT + O_INHERITMODE
: 0
: 1208
: 0 );

The fact that the file shows up on IBM i, but not on Windows is not a
commonplace error. It implies (as I said before) that there are two
copies of the file.

Two possibilities:

1) That there are two locations, and you're viewing different
locations from each source.

2) That you didn't trim the trailing blanks from the filename, and so
you have two copies, one with blanks in the filename, and one without.


On 6/18/2012 2:07 PM, Jeff Young wrote:
Scott,
1. The proper number of bytes for the file is 100. This shows in
the WRKLNK option 8 on the i. The file consists of 2 records each
50
bytes.

2. In Windows (XP Pro) when I view the list of files on the mapped
drive,
it shows 1K.
When I double click on the file name, nothing happens. The file
does
not open and no error is issued.

3. When viewing the properties in Windows, the file shows as 0 bytes.


I am using the IFSIO_H copy book from your book, although it may be
an
older copy as I had to modify the Open prototype to add the fifth
parm
required for O_TEXT_CREAT.

The code I use for the Open of the file is shown in my original post.

--
This is the RPG programming on the IBM i / System i (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 IBM i / System i (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.




--
Jeff Young
Sr. Programmer Analyst






As an Amazon Associate we earn from qualifying purchases.

This thread ...

Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

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.