I have been running Client Solutions since October and have found it is now a full replacement for Iseries Access and Ops Navigator. The last update added the last missing piece, Run SQL scripts.
For the most part I use Linoma's Surveyor/400 software which is awesome and I really miss it when I have to work on machine it is not licensed on. That's where Client Solutions comes to play, and play well, it now does.
I have to say even over remote VPN client it all works very well. I am starting to use Navigator i for all monitoring replacing green screen.
One gotcha to be aware of. I went to delete 125mb save file from IFS folder and the machine ground to a halt. Not a good thing in the middle of the day. Had to sweat it out for 20 minutes before the machine would respond.
I knew there was a December update that I had not loaded so I downloaded and installed. Install was painless and now have run SQL option.
Planning to wait until off hours on Sunday to try deleting from IFS and see if issue was resolved in last update.
Have a great day!
~Richard
IBM iSeries hardware, software and other day to day technical challenges. I am a problem solver and business analyst providing solutions to companies and assisting my peers.
Showing posts with label AS400. Show all posts
Showing posts with label AS400. Show all posts
Friday, January 29, 2016
IBM i Access Client Solutions, AWESOME!
Labels:
Access Solutions,
AS400,
IBMi,
iSeries Navigator
Sunday, November 23, 2014
Submit Job Schedule Entries Immediately
The AS/400 Job Scheduler will submit to job queue specified in Job Scheduled entry unless you manually submit with option 10. I found this link Submit Job Scheduled Entries that looks interesting.
Not something I need since it is easy to work around by manually submitting the job as I want with SBMJOB. Normally I handle Job Scheduler and many users are unaware. In the case where users need to be able to submit on demand this may be very useful.
Have your best day!
~Richard
Not something I need since it is easy to work around by manually submitting the job as I want with SBMJOB. Normally I handle Job Scheduler and many users are unaware. In the case where users need to be able to submit on demand this may be very useful.
Have your best day!
~Richard
Tuesday, August 6, 2013
We're not in Kansas anymore....
Web Services, SOA, SOAP, HTTP, C++, WSDL, DISCO, Lions, Tigers and Bears. I’m used to diving into the deep end of the pool but after two days I think I have fallen into the Marianas Trench still waiting to hit bottom.
My current challenge is to send Name, Order and Email for new orders to LISTRAK Email Marketing Services utilizing API and SOAP formatted XML from our IBMi.
A little lite reading.....
~Richard
If we are facing in the right direction, all we have to do is keep on walking. ~Buddhist Saying
Thursday, February 21, 2013
SQL Update a Multi-Table View using INSTEAD OF Triggers
Yesterday I added another SQL trick to my bag ‘o tricks. I am currently working on fixing EDI invoicing process and I needed a way to delete records from four files based on the same key. I could have wrote RPGLE Free Embedded SQL that would have been about 60 lines of code but wheres the fun in that.
I popped open the Google window and searched on “iseries sql delete from multiple tables”. the second hit directed me to IBM and the fourth to Preform the Impossible: Update a Multi-table View using INSTEAD OF Triggers. What did we did before Google, oh yeah, read a manual!
Impossible, that’s for me. It took me a few minutes to understand and a peek at IBM documentation I had to create a view and then the trigger. Once created any time I delete from the view all associated records in the four files are deleted. Very cool.
After view and trigger created I can run this SQL interactive or embedded.
delete from yourlib.ediinvw
where ihedoc = 0000046475
My new view is EDIINVW and I am deleting by EDI document control number.
To accomplish this I created the view with the below code using SQL Explorer.
create view yourlib.ediinvw as
select ih.ihedoc, id.idedoc, ss.iaedoc, si.isedoc
from yourlib.vedinih ih
join yourlib.vedinid id on id.idedoc = ih.ihedoc
join yourlib.vediniss ss on ss.iaedoc = ih.ihedoc
join yourlib.vedinis si on si.isedoc = ih.ihedoc
The four fields in the Select statement is the key field for each of the four files.
I then attempted to create the delete Trigger. SQL Explorer did not like the syntax so I copied and pasted into the green screen iSeries SQL interactive command line. My guess is that SQL Explorer has an issue with INSTEAD OF DELETE ON.
create trigger yourlib.ediinvdel
Instead of delete on yourlib.ediinvw
referencing old as EdiInvwOld
for each row mode DB2SQL
begin atomic
delete from yourlib.vedinih
where ihedoc = EdiInvwOld.ihedoc;
delete from yourlib.vedinid
where idedoc = EdiInvwOld.idedoc;
delete from yourlib.vedinid
where iaedoc = EdiInvwOld.iaedoc;
delete from yourlib.vedinid
where isedoc = EdiInvwOld.isedoc;
end;
I learned another very cool SQL trick, Thanks IT JUNGLE and Four Hundred Guru. This will come in handy over the next few weeks as I fix the EDI processes.
Have your best day!
~Richard
In programming, as in everything else, to be in error is to be reborn. ~Alan J. Perlis
I popped open the Google window and searched on “iseries sql delete from multiple tables”. the second hit directed me to IBM and the fourth to Preform the Impossible: Update a Multi-table View using INSTEAD OF Triggers. What did we did before Google, oh yeah, read a manual!
Impossible, that’s for me. It took me a few minutes to understand and a peek at IBM documentation I had to create a view and then the trigger. Once created any time I delete from the view all associated records in the four files are deleted. Very cool.
After view and trigger created I can run this SQL interactive or embedded.
delete from yourlib.ediinvw
where ihedoc = 0000046475
My new view is EDIINVW and I am deleting by EDI document control number.
To accomplish this I created the view with the below code using SQL Explorer.
create view yourlib.ediinvw as
select ih.ihedoc, id.idedoc, ss.iaedoc, si.isedoc
from yourlib.vedinih ih
join yourlib.vedinid id on id.idedoc = ih.ihedoc
join yourlib.vediniss ss on ss.iaedoc = ih.ihedoc
join yourlib.vedinis si on si.isedoc = ih.ihedoc
The four fields in the Select statement is the key field for each of the four files.
I then attempted to create the delete Trigger. SQL Explorer did not like the syntax so I copied and pasted into the green screen iSeries SQL interactive command line. My guess is that SQL Explorer has an issue with INSTEAD OF DELETE ON.
create trigger yourlib.ediinvdel
Instead of delete on yourlib.ediinvw
referencing old as EdiInvwOld
for each row mode DB2SQL
begin atomic
delete from yourlib.vedinih
where ihedoc = EdiInvwOld.ihedoc;
delete from yourlib.vedinid
where idedoc = EdiInvwOld.idedoc;
delete from yourlib.vedinid
where iaedoc = EdiInvwOld.iaedoc;
delete from yourlib.vedinid
where isedoc = EdiInvwOld.isedoc;
end;
I learned another very cool SQL trick, Thanks IT JUNGLE and Four Hundred Guru. This will come in handy over the next few weeks as I fix the EDI processes.
Have your best day!
~Richard
In programming, as in everything else, to be in error is to be reborn. ~Alan J. Perlis
Labels:
AS400,
DB2,
Eclipse,
EDI,
RPGLE Free,
RPGLE OAR,
SQL,
SQL Explorer,
System 2000,
VAI
Thursday, February 14, 2013
iSeries SQL Update multiple columns
SQL is cool s**t..I love this stuff.... Below SQL uses file created from spreadsheet and updates the min and max fields in the item balance file from one field from uploaded spreadsheet.
Spreadsheet fields VENDOR, VMFG, CAPITEM, LOC, MINMAX.
update b50files.vinitmb
set (ifsmin,ifsmax) = (select minmax, minmax from rbryant.upminmax
where ifcomp = 1 and ifloc = loc and ifitem = capitem)
where exists (select * from rbryant.upminmax where ifcomp = 1 and ifloc = loc
and ifitem = capitem)
Updated 04/29/15
I have a task to update several fields in file with calculated amount based on data from a different file. Since I do not write SQL everyday I do not try to remember and use Google. My google search took me to my blog from 2013. Just what I needed and now expanding complexity for future reference.
I need to take the location item price from item price file and reduce by 50% and update cost fields in item balance file. The real trick in my mind is the "exists". I fumbled around and could not get it work until I added the where select exists.
vinitmb is item balance file and vinpmat is item price file.
ifavg, ifoth and iflst are cost fields being updated.
ifdiv and ifcls are division class fields.
iflcgd, iflcgt and ifuslc are last change fields in case I screw up and need to back out. Of couse all of this is tested with Select statements and then updated test files to make sure.
set iflst = (select (j6lprc - (j6lprc * .50)) as ncost from r50files.vinpmat where j6cmp = ifcomp and ifloc = j6loc and J6PMAT = 'CAP' and ifitem = j6item),
ifavg = (select (j6lprc - (j6lprc * .50)) as ncost from r50files.vinpmat where j6cmp = ifcomp and ifloc = j6loc and J6PMAT = 'CAP' and ifitem = j6item),
ifoth = (select (j6lprc - (j6lprc * .50)) as ncost from r50files.vinpmat
where j6cmp = ifcomp and ifloc = j6loc and J6PMAT = 'CAP' and ifitem = j6item),
IFLCGD = 20150429,
IFLCGT = 080000,
IFUSLC = 'SQLRB'
where exists (select * from r50files.vinpmat where j6cmp = ifcomp and ifloc = j6loc and J6PMAT = 'CAP' and ifitem = j6item)
and ifdiv = 9999 and ifcls = 2
~Richard
One man's crappy software is another man's full time job. ~Jessica Gaston
Labels:
AS400,
DB2,
IBM,
RPGLE,
RPGLE Free,
SQL,
SQL Explorer
Clean iSeries output queue by days to keep
It’s has been a fast six months, new job has kept me hopping. One day I’m redesigning the EDI guidelines and RPGLE programming interfaces to the next day chasing Purchase order suggestions. Tape backup failing without notification to GL year end posting to rewriting code replacing OPNQRYF with embedded SQL. Point of Sale hiccups to AP check failure to working with eCommerce. Every single modification that the previous software vendor implemented has a problem one way or the other.
Basically I have not been happier than any other point in my career!
I ran across the need to automate purging old spool file records and could not find any code close enough to cut, paste, compile, run and free. In the past have used TAATOOL but is not currently an option.
My good buddy Rick Santiago has a purge out queue by date program that he wrote a while back. Short and sweet I quickly envision modifying for my needs.
Through iSeries navigator I created a table with four fields, out queue name, out queue library, number of days to keep spool file entries and user data.

I also added the following key constraints, C_OUTQUE, C_OUTLIB and C_USRDTA as unique.
Follow your nose and instructions in the comments of the CL and you’ll have a quick little program you can add to your nightly process.
Hopefully this help some other poor one man band quickly solve a minor annoyance programmatically.
CLNOUTQ is the driver and CLNOUTQ2 exists due to only being able to use one RCVF in a CL in a read loop and detect end of file.
CLNOUTQ
CLNOUTQ2
And you'll seek but never find,
But blaze your own path
And the road to success
Will trail right behind.
~Robert Brault, www.robertbrault.com
Basically I have not been happier than any other point in my career!
I ran across the need to automate purging old spool file records and could not find any code close enough to cut, paste, compile, run and free. In the past have used TAATOOL but is not currently an option.
My good buddy Rick Santiago has a purge out queue by date program that he wrote a while back. Short and sweet I quickly envision modifying for my needs.
Through iSeries navigator I created a table with four fields, out queue name, out queue library, number of days to keep spool file entries and user data.
I also added the following key constraints, C_OUTQUE, C_OUTLIB and C_USRDTA as unique.
Follow your nose and instructions in the comments of the CL and you’ll have a quick little program you can add to your nightly process.
Hopefully this help some other poor one man band quickly solve a minor annoyance programmatically.
CLNOUTQ is the driver and CLNOUTQ2 exists due to only being able to use one RCVF in a CL in a read loop and detect end of file.
CLNOUTQ
CLNOUTQ2
~Richard
Try to discover
The road to successAnd you'll seek but never find,
But blaze your own path
And the road to success
Will trail right behind.
~Robert Brault, www.robertbrault.com
Labels:
AS400,
IBM,
iSeries Navigator,
OUTQUE,
Spool File
Tuesday, February 5, 2013
Top 10 Reasons to Switch from IBM iSeries to Oracle and .Net
- Your IT budget is small and you want to triple it.
- You have large empty room and can not justify hiring more RPGLE programmers to fill it.
- Your CEO likes pretty GUI interface. (Who cares if its productive? So what if it takes 20 pretty screens to fill one ugly green screen.)
- You have lots of empty rack space for MS servers or want to build out additional rack space. (One Power 7 rack is not impressive enough to show visitors how important you are.)
- Your part time iSeries operator is bored and needs company. (He'll have at least three new friends that will spend days preparing Oracle fixes and nights applying them.)
- You need to be seen as an humanitarian and hire a dozens under paid Indian H1B visa holders to fill your empty cubes.
- You have the need to field a Cricket team. (You'll have one with all the Indian .net programmers you hired.)
- Your bored with RPGLE because it works so well and feel the need to chase .NET bugs for the next 10 years. RPGLE Development is to fast.
- You need to feel wanted by causing as much production downtime as possible. (You can always blame the third party software vendor.)
And the number one reason to switch from iSeries to
Oracle……..
You need 50
programmers to worship you and IT budget bigger than some countries GDP. You
are a God!
~Richard
Sunday, July 29, 2012
iSeries SQL Function Proper Case.....
One of my clients asked me to update the tax processing currently working in VAI System 2000 on the iSeries. The requirement is set up the county tax file and update the customer master with the proper county code based on the city field in the customer master.
Challenges abound, the city field in the customer file is mixed with all capitals, all lower case, proper case and misspellings. And yes, I have to learn how to fill out Florida sales tax form, which is where we find a $5000.00 limit on county tax. Always a twist somewhere.
First I looked for availability of current taxes for the State of Florida with city, county and current tax. I found Tax-Rates.org and for 39.00 bucks with the information needed, I downloaded CSV, changed to Excel and uploaded to the iSeries using Data Transfer To IBM i. This enables me to create the file on the IBM i automatically during the upload.
Once I have the file on the IBM i I have to overcome the case problem with the RMCITY field. There should be a way to do this without any code. I can do it in RPGLE using embedded SQL no problem but know there must be a way with just an SQL UPDATE statement.
Well, sort of correct, SQL does not have a PROPER function but I found this code about Functions with downloadable code, cool. First brush up on Control Statements and Create Function article by Scott Klement. It did not take me to long to figure out. I was tripped up on the definition of the inbound field but soon realized @TCSTRING VARCHAR(100) is the data field being returned.
I opened System i Navigator and expanded Databases so I can see Functions.

Right click and select New - SQL and the following is displayed -
Change the following -
Function = PROPER,
Description = Change Case To Proper
Type = VARCHAR,
Length = 100
Check = Same result returned from …....(Deteministic)
Data access = Modifies SQL data
Specific name = PROPER

Select the Parameters tab and then Insert, the following is displayed -

Change the Parameter Name to @TCSTRING, change Type to VARCHAR, Length to 100 and check of Return Null on Null input.

I downloaded the code and opened in notepad. Copied from BEGIN to END. I left out the SQL parameters since we are selecting them in the wizard. There are easier ways to just create the Function from the copied code, but the wizard breaks it out and explains it a little better.

Click on OK and the Wizard closes and the following should be displayed.

Now we can generate the SQL, right click on PROPER and select Generate.
If I need to change a field to be consistent like the city field in customer master I just run the following SQL statement.
update transfer.VARCUST
set rmcity = qgpl.proper(rmcity)
Several things to figure out, why library where the function is located in has to be specified, I thought it would come from the library list. And I did not take to the time to understand all the checkboxes in the wizard. The function performed as I needed and enabled me to continue on with my project.
I finished identifying the missing city county combinations and update the list.
The following SQL updated the county code field in the customer master based on the cross reference FL_CTYTXa file. There is a little problem with the SQL and I am looking for how it should be done correctly but what I created worked and updated the field as desired.
update transfer.varcust set rmcnty =
(select rkcnty
from transfer.VARCNTY, transfer.FL_CTYTXa
where city = rmcity
and salestaxregion = rkdesc
and rmstat = 'FL'
)
where exists
(select *
from transfer.VARCNTY, transfer.FL_CTYTXa
where city = rmcity
and salestaxregion = rkdesc
and rmstat = 'FL'
)
Previously I update the VARCNTY county tax file with the Florida taxes.
Now on to identifying where to put the hook in tax processing to only charge county tax on the first $5000.00 and testing.
Any suggestions or questions, please send them on.
~Richard
Talk doesn't cook rice. ~Chinese Proverb
Challenges abound, the city field in the customer file is mixed with all capitals, all lower case, proper case and misspellings. And yes, I have to learn how to fill out Florida sales tax form, which is where we find a $5000.00 limit on county tax. Always a twist somewhere.
First I looked for availability of current taxes for the State of Florida with city, county and current tax. I found Tax-Rates.org and for 39.00 bucks with the information needed, I downloaded CSV, changed to Excel and uploaded to the iSeries using Data Transfer To IBM i. This enables me to create the file on the IBM i automatically during the upload.
Once I have the file on the IBM i I have to overcome the case problem with the RMCITY field. There should be a way to do this without any code. I can do it in RPGLE using embedded SQL no problem but know there must be a way with just an SQL UPDATE statement.
Well, sort of correct, SQL does not have a PROPER function but I found this code about Functions with downloadable code, cool. First brush up on Control Statements and Create Function article by Scott Klement. It did not take me to long to figure out. I was tripped up on the definition of the inbound field but soon realized @TCSTRING VARCHAR(100) is the data field being returned.
I opened System i Navigator and expanded Databases so I can see Functions.
Right click and select New - SQL and the following is displayed -
Change the following -
Function = PROPER,
Description = Change Case To Proper
Type = VARCHAR,
Length = 100
Check = Same result returned from …....(Deteministic)
Data access = Modifies SQL data
Specific name = PROPER
Select the Parameters tab and then Insert, the following is displayed -
Change the Parameter Name to @TCSTRING, change Type to VARCHAR, Length to 100 and check of Return Null on Null input.
I downloaded the code and opened in notepad. Copied from BEGIN to END. I left out the SQL parameters since we are selecting them in the wizard. There are easier ways to just create the Function from the copied code, but the wizard breaks it out and explains it a little better.
Click on OK and the Wizard closes and the following should be displayed.
Now we can generate the SQL, right click on PROPER and select Generate.
If I need to change a field to be consistent like the city field in customer master I just run the following SQL statement.
update transfer.VARCUST
set rmcity = qgpl.proper(rmcity)
Several things to figure out, why library where the function is located in has to be specified, I thought it would come from the library list. And I did not take to the time to understand all the checkboxes in the wizard. The function performed as I needed and enabled me to continue on with my project.
I finished identifying the missing city county combinations and update the list.
The following SQL updated the county code field in the customer master based on the cross reference FL_CTYTXa file. There is a little problem with the SQL and I am looking for how it should be done correctly but what I created worked and updated the field as desired.
update transfer.varcust set rmcnty =
(select rkcnty
from transfer.VARCNTY, transfer.FL_CTYTXa
where city = rmcity
and salestaxregion = rkdesc
and rmstat = 'FL'
)
where exists
(select *
from transfer.VARCNTY, transfer.FL_CTYTXa
where city = rmcity
and salestaxregion = rkdesc
and rmstat = 'FL'
)
Previously I update the VARCNTY county tax file with the Florida taxes.
Now on to identifying where to put the hook in tax processing to only charge county tax on the first $5000.00 and testing.
Any suggestions or questions, please send them on.
~Richard
Talk doesn't cook rice. ~Chinese Proverb
Labels:
AS400,
IBM,
iSeries Navigator,
SQL,
SQL Explorer,
System 2000,
VAI
Tuesday, June 26, 2012
Moving on to next contract....
After four and half months I have completed 99% of the interfaces between iSeries Island Pacific ERP and MidRetial Allocation application running on SQL.
I created over 52 programs and/or files that either send or retrieve data in XML using RPGLE, SQLRPGLE and IFS API’s. One of the best aspects of this project is that I was able to teach myself how to read and write directly to the windows file shares. Utilizing embedded SQL is also a lot of fun, the more I coded without the RPG cycle the simpler tasks became.
I think the best aspect of using SQL is the ability quickly adjust the SQL select statements as needs change.
The generic interface map.

The project went live over the weekend with some minor tweaks but overall a success!
Today I start a new contract as EDI Lead / Developer for a large retail chain. I am really looking forward to increasing my EDI skills in a retail environment. My previous EDI experience revolves around distribution and manufacturing supplying the retail vendors with ASN and Warehousing data.
~Richard
There are two ways to write error-free programs; only the third one works. ~Alan J. Perlis
I created over 52 programs and/or files that either send or retrieve data in XML using RPGLE, SQLRPGLE and IFS API’s. One of the best aspects of this project is that I was able to teach myself how to read and write directly to the windows file shares. Utilizing embedded SQL is also a lot of fun, the more I coded without the RPG cycle the simpler tasks became.
I think the best aspect of using SQL is the ability quickly adjust the SQL select statements as needs change.
The generic interface map.
The project went live over the weekend with some minor tweaks but overall a success!
Today I start a new contract as EDI Lead / Developer for a large retail chain. I am really looking forward to increasing my EDI skills in a retail environment. My previous EDI experience revolves around distribution and manufacturing supplying the retail vendors with ASN and Warehousing data.
~Richard
There are two ways to write error-free programs; only the third one works. ~Alan J. Perlis
Labels:
AS400,
Eclipse,
IBM,
MidRetail,
QNTC,
RPGLE,
RPGLE Free,
RPGLE OAR,
SQL,
SQL Explorer
Thursday, June 7, 2012
Two more weeks to go.....
We are almost done with implementing Midretail, I have been extremely busy coding and testing. The SQL works beautifully and is absolutely amazing. Learning embedded SQL and RPG Free has been exciting and challenging. I would have never been able to pull this off without the help of Google and all the wonderful people posting hints, tricks and code examples. I hope to find time to pay it forward and post more snip-its of code I created for interfacing the systems.
Special thanks to -
www.scottklement.com/
www.itjungle.com
www.iprodeveloper.com
www.code400.com
www.rpg-xml.com
www.bmeyers.net
www.ilerpgprogramming.com
www.winautomation.com
and many more....
I am starting to look forward to my new position as EDI Lead/Developer at a large retailer here in Jacksonville. I am hopeful for a long term relationship with challenging opportunities to work with different hardware / software platforms in a fast paced environment.
~Richard
A handful of patience is worth more than a bushel of brains. ~Dutch Proverb
Special thanks to -
www.scottklement.com/
www.itjungle.com
www.iprodeveloper.com
www.code400.com
www.rpg-xml.com
www.bmeyers.net
www.ilerpgprogramming.com
www.winautomation.com
and many more....
I am starting to look forward to my new position as EDI Lead/Developer at a large retailer here in Jacksonville. I am hopeful for a long term relationship with challenging opportunities to work with different hardware / software platforms in a fast paced environment.
~Richard
A handful of patience is worth more than a bushel of brains. ~Dutch Proverb
Thursday, April 26, 2012
Extended contract and new task coming
Great day, contract extended for another 12 weeks. I have been really busy finishing up my current project which I am a week behind schedule. I hope to make up some time this weekend. The heavy coding is completed just need to tie up the loose ends and automate.
I am using Winautomation on the Windows server to watch for data in folders and initiate jobs on the iSeries based on responses from the jobs executed on the Windows server.
The next project sounds exciting, creating a data warehouse on the iSeries. I have never had the chance to work on putting together a data warehouse but understand the concepts. I may take a closer look at what Rodin has to offer.
Any other suggestions will be greatly appreciated.
Have your best day,
Richard
Try not to become a man of success, but rather try to become a man of value. ~Albert Einstein
I am using Winautomation on the Windows server to watch for data in folders and initiate jobs on the iSeries based on responses from the jobs executed on the Windows server.
The next project sounds exciting, creating a data warehouse on the iSeries. I have never had the chance to work on putting together a data warehouse but understand the concepts. I may take a closer look at what Rodin has to offer.
Any other suggestions will be greatly appreciated.
Have your best day,
Richard
Try not to become a man of success, but rather try to become a man of value. ~Albert Einstein
Tuesday, April 24, 2012
RPGLE SQL0511 for Update error.
Just when I think I have a handle on RPGLE Embedded SQL, SQL reaches out and slaps me silly.
I created a daily sales retrieval program using RPGLE Free and Embedded SQL which writes XML data to the /QNTC file system (windows share). I wanted to update the status and date field after I write out the XML. I thought a simple to do, I have already done something similar with no problem. Then.....
Explanation:
The result table of the SELECT or VALUES statement cannot be updated.
On the database manager, the result table is read-only if the cursor is based on a VALUES statement or the SELECT statement contains any of the following:
The statement cannot be processed.
User response:
Do not perform updates on the result table as specified.
Federated system users: isolate the problem to the data source failing the request (see the problem determination guide for procedures to follow to identify the failing data source). If a data source is failing the request, examine the restrictions for that data source to determine the cause of the problem and its solution. If the restriction exists on a data source, see the SQL reference manual for that data source to determine why the object is not updatable.
sqlcode: -511
sqlstate: 42829
Oh me oh my. I don’t have any more time to spend on this and decided to skip the update of the status and data field at this time. The program is called remotely from a batch file that will also run a step that processes the XML into the Midretail allocation program. I will capture the result of the update to Midretail in the batch program and if successful will send another remote command to update the status and date of the records processed.
Exec SQL declare mainCursor cursor
for Select stat, vstr, vdte, sum(vqty), vcls, vven, +
vsty, vclr, vstp, vdtp
from MidSalesPF
where vdte = :yesterday
group by stat, vstr, vdte, vcls, vven, vsty, vclr, vstp, vdtp
order by vstr, vdte, vdte, vcls, vven, vsty, vclr, vstp;
Exec SQL open mainCursor; // SQL open cursor
Exec SQL fetch next from mainCursor // Load data Structure
into :mainds;
exsr ClrHdr; // Clear or create XML header record
dow sqlstt = '00000' ; // Continue if no SQL error [DO Loop]
exsr Load_SSColSR; // Write detail XML records to IFS
Exec SQL fetch next from mainCursor // Get next record
into :mainds;
enddo ;
Exec SQL close mainCursor; // Close SQL file
I created a daily sales retrieval program using RPGLE Free and Embedded SQL which writes XML data to the /QNTC file system (windows share). I wanted to update the status and date field after I write out the XML. I thought a simple to do, I have already done something similar with no problem. Then.....
SQL0511
SQL0511N
The FOR UPDATE clause is not allowed because the table specified by the cursor cannot be modified.Explanation:
The result table of the SELECT or VALUES statement cannot be updated.
On the database manager, the result table is read-only if the cursor is based on a VALUES statement or the SELECT statement contains any of the following:
- The DISTINCT keyword
- A column function in the SELECT list
- A GROUP BY or HAVING clause
- A FROM clause that identifies one of the following:
- More than one table or view
- A read-only view
- An OUTER clause with a typed table or typed view
- A set operator (other than UNION ALL).
- A FROM clause that identifies one of the following:
- More than one table or view
- A read-only view
- An OUTER clause with a typed table or typed view
- A data change statement
The statement cannot be processed.
User response:
Do not perform updates on the result table as specified.
Federated system users: isolate the problem to the data source failing the request (see the problem determination guide for procedures to follow to identify the failing data source). If a data source is failing the request, examine the restrictions for that data source to determine the cause of the problem and its solution. If the restriction exists on a data source, see the SQL reference manual for that data source to determine why the object is not updatable.
sqlcode: -511
sqlstate: 42829
Oh me oh my. I don’t have any more time to spend on this and decided to skip the update of the status and data field at this time. The program is called remotely from a batch file that will also run a step that processes the XML into the Midretail allocation program. I will capture the result of the update to Midretail in the batch program and if successful will send another remote command to update the status and date of the records processed.
Exec SQL declare mainCursor cursor
for Select stat, vstr, vdte, sum(vqty), vcls, vven, +
vsty, vclr, vstp, vdtp
from MidSalesPF
where vdte = :yesterday
group by stat, vstr, vdte, vcls, vven, vsty, vclr, vstp, vdtp
order by vstr, vdte, vdte, vcls, vven, vsty, vclr, vstp;
Exec SQL open mainCursor; // SQL open cursor
Exec SQL fetch next from mainCursor // Load data Structure
into :mainds;
exsr ClrHdr; // Clear or create XML header record
dow sqlstt = '00000' ; // Continue if no SQL error [DO Loop]
exsr Load_SSColSR; // Write detail XML records to IFS
Exec SQL fetch next from mainCursor // Get next record
into :mainds;
enddo ;
Exec SQL close mainCursor; // Close SQL file
~Richard
The road to success is dotted with many tempting parking places. ~Author Unknown
Friday, April 20, 2012
DB2 SQL Where Timestamp field = Date
My SQL challenge this morning required me to write a SQL select to select a date from a Timestamp field. I have started playing around with WDSC 7.0 Data perspective. I did not take to long to figure out, I am really digging SQL on the iSeries!
IVDTE is my Timestamp defined field in MIDINVPF.
SELECT *
FROM rbryant.MIDINVPF
where CHAR(DATE(ivdte), ISO) = '2012-04-12'
~Richard
People who look through keyholes are apt to get the idea that most things are keyhole shaped. ~Author Unknown
IVDTE is my Timestamp defined field in MIDINVPF.
SELECT *
FROM rbryant.MIDINVPF
where CHAR(DATE(ivdte), ISO) = '2012-04-12'
~Richard
People who look through keyholes are apt to get the idea that most things are keyhole shaped. ~Author Unknown
Saturday, March 24, 2012
RPGLE Free array and external data structure
My current task is to write an ETL program to extract on hand inventory from Island Pacific DB2 table, transform data to XML, load MIDRetail API, process MID job on MS Server to update MIDRetail tables, retrieve status of MID job to iSeries. Depending on status additional workflow jobs are initiated.
The first challenge is to extract inventory from Island Pacific. This is a little unique and I have not seen inventory stored like this before. Each record contains 100 fields (BSTK01 thru BSTK00) where each field represents a particular store on hand quantity. If there is more than 100 stores for an item the record identifier field(BRID) is incremented.
BRID = 0 BSTK01 thru BSTK00 = Store 001 thru 100
BRID = 1 BSTK01 thru BSTK00 = Store 101 thru 200
BRID = 2 BSTK01 thru BSTK00 = Store 201 thru 300
Island Pacific supports a maximum of 900 stores. So record ID only 0 thru 8 could be used.
After a brief call to my buddy Rick I have an idea of how to pivot the data to the required format. I refreshed my knowledge with the FOR loop earlier in the week but unsure of how. A search of the net revealed a way to use an external data structure to load an array based on pointer. I caught a break in that the inventory fields are contiguous.
I have been working with full procedural files lately staying away from the RPG cycle. Ooops, no *LR = on, dummy! Sometimes the cycle comes in handy and I really never understood why most programmers have moved away from using it.
fipbsdtl ip e
k disk
fmidinvpf o a e disk
d myFileRec e ds
extname(ipbsdtl)
d myFilePtr s * inz(%addr(bstk01)) Pointer start
d MYFILEMap ds
based(MYFILEPtr)
d storeAry like(bstk01)
dim(100)
d strIdx s 3 0 Store index
******************************************************************
* Main Routine
******************************************************************
/free
for strIdx = 1 to 100 by 1;
ivstr = strIdx + (brid * 100);
ivqty = storeAry(strIdx);
ivcls = %editc(bcls:'X');
ivven = %editc(bven:'X');
ivsty = %editc(bsty:'X');
ivclr = %editc(bclr:'X');
ivsiz = %editc(bsiz:'X');
ivdiv = bdiv;
ivdep = bdpt;
write mdinvr;
endfor;
/end-free
As you can see my output now has the Store(IVSTR) and On hand quanity(IVQTY) for each item. Item = IVCLS,IVEN,IVSTY, IVCLR,IVSIZ.
When the record id and item changed(key), it starts all over again. I did notice the quantities looked like the are duplicating but a quick check and they are correct.
I have to do some more data checking but I think I have the solution. If anyone spot an issue or has question or suggestion please comment.
So I accomplished reeducating myself this week with replacing DO loop from RPGIV to FOR loop in RPG Free, external data structures and array's.
Great fun and I finished of another week successfully advancing my skills and completing another interface program.
~Richard
Beta. Software undergoes beta testing shortly before it's released. Beta is Latin for "still doesn't work." ~Author Unknown
Labels:
AS400,
iSeries,
Island Pacific,
MidRetail,
RPGLE,
RPGLE Free
Subscribe to:
Posts (Atom)