<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6255223495642099089</id><updated>2012-02-16T21:15:21.275+05:30</updated><category term='Command Line'/><category term='8.51'/><category term='8.50'/><category term='WSDL'/><category term='Integration Broker'/><category term='Application Engine'/><category term='Application Package'/><category term='SQL'/><category term='Access ID'/><category term='metadata API'/><category term='PeopleCode'/><category term='Logging'/><category term='DMS'/><category term='UDDI'/><category term='Java'/><category term='Integration Engine'/><category term='PeopleTools'/><category term='Yahoo Maps for PeopleSoft'/><category term='FSCM 9.0'/><title type='text'>PSFT_PP</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://psftpp.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://psftpp.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ciphersbak</name><uri>http://www.blogger.com/profile/01586158446874473262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://bp3.blogger.com/_us1mHob_dps/SB9X-oWAiLI/AAAAAAAAAsc/03Zt108NYoA/S220/2068438.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6255223495642099089.post-7619657459634824957</id><published>2011-03-20T19:30:00.006+05:30</published><updated>2011-03-20T20:02:56.858+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='PeopleCode'/><category scheme='http://www.blogger.com/atom/ns#' term='PeopleTools'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Extract Project PeopleCode and SQL</title><content type='html'>Sounds Interesting -- Decode PeopleCode from bytecode to text files. Also extract PeopleCode and SQL  definitions from PeopleTools projects.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;Credits to the original &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://sourceforge.net/projects/decodepcode/"&gt;uploader&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have uploaded a modified version of the Zip file for people who use MS SQL Server as their DB Server. For other databases please refer to "ReadMe.txt" in the zip file.&lt;br /&gt;&lt;br /&gt;Follow the following steps to extract PeopleCode and SQL definitions&lt;br /&gt;&lt;br /&gt;1. Download the attached &lt;a href="http://rapidshare.com/files/453481357/DecodePCODE-0.20-binary_2.zip"&gt;Zip File&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. Open &lt;a href="http://i585.photobucket.com/albums/ss293/ciphersbak/DecodePCproperties.jpg"&gt;DecodePC.properties&lt;/a&gt; and modify it as shown. You'll have to change the following:&lt;ul&gt;&lt;li&gt;user&lt;/li&gt;&lt;li&gt;password&lt;/li&gt;&lt;li&gt;url&lt;/li&gt;&lt;li&gt;DatabaseName&lt;/li&gt;&lt;/ul&gt;   Since, I've MSSQL Server and no Sub Version, I've commented rest of the lines.&lt;br /&gt;&lt;br /&gt;3. Ensure that you have sqljdbc.jar in your directory. I've included the sqljdbc.jar in the Zip file.&lt;br /&gt;&lt;br /&gt;4. Navigate to the directory via &lt;a href="http://i585.photobucket.com/albums/ss293/ciphersbak/DecodePCODE_ProjectName.jpg"&gt;Command Prompt&lt;/a&gt; where you have unzipped the earlier zip file.&lt;br /&gt;&lt;br /&gt;5. Once done check the &lt;a href="http://i585.photobucket.com/albums/ss293/ciphersbak/ExtractedPeopleCodenSQL.jpg"&gt;output directory&lt;/a&gt; in the path provided earlier&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;6. The files would be created under the &lt;a href="http://i585.photobucket.com/albums/ss293/ciphersbak/ExtractedPeopleCodenSQL_2.jpg"&gt;output folder&lt;/a&gt; in the directory of extraction&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Caveat - Does not extract Application Package PeopleCode as yet!!&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6255223495642099089-7619657459634824957?l=psftpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://psftpp.blogspot.com/feeds/7619657459634824957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6255223495642099089&amp;postID=7619657459634824957' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/7619657459634824957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/7619657459634824957'/><link rel='alternate' type='text/html' href='http://psftpp.blogspot.com/2011/03/extract-project-peoplecode-and-sql.html' title='Extract Project PeopleCode and SQL'/><author><name>Ciphersbak</name><uri>http://www.blogger.com/profile/01586158446874473262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://bp3.blogger.com/_us1mHob_dps/SB9X-oWAiLI/AAAAAAAAAsc/03Zt108NYoA/S220/2068438.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6255223495642099089.post-2379830873718432871</id><published>2010-09-11T01:05:00.002+05:30</published><updated>2010-09-11T01:10:17.370+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='8.51'/><category scheme='http://www.blogger.com/atom/ns#' term='PeopleTools'/><title type='text'>PeopleTools 8.51 GA</title><content type='html'>PeopleTools 8.51 are now available for download through &lt;a href="http://edelivery.oracle.com/"&gt;edelivery.oracle.com&lt;/a&gt;!!!&lt;br /&gt;&lt;br /&gt;Its surprising to note that PeopleTools Patch 8.51.01 is also available.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6255223495642099089-2379830873718432871?l=psftpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://psftpp.blogspot.com/feeds/2379830873718432871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6255223495642099089&amp;postID=2379830873718432871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/2379830873718432871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/2379830873718432871'/><link rel='alternate' type='text/html' href='http://psftpp.blogspot.com/2010/09/peopletools-851-ga.html' title='PeopleTools 8.51 GA'/><author><name>Ciphersbak</name><uri>http://www.blogger.com/profile/01586158446874473262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://bp3.blogger.com/_us1mHob_dps/SB9X-oWAiLI/AAAAAAAAAsc/03Zt108NYoA/S220/2068438.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6255223495642099089.post-998401286196003713</id><published>2010-05-13T16:56:00.019+05:30</published><updated>2010-05-31T09:42:53.763+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Command Line'/><category scheme='http://www.blogger.com/atom/ns#' term='Access ID'/><title type='text'>How to Retrieve AccessID &amp; AccessPWD for a PeopleSoft Environment</title><content type='html'>Most of us follow the &lt;a href="http://en.wikipedia.org/wiki/Software_development_process"&gt;&lt;span style="font-style: italic;"&gt;wa&lt;/span&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Software_development_process"&gt;terfall&lt;/a&gt;&lt;/span&gt; model of SDLC within the organizations we work. Various teams are involved at various stages of the model. Each Team has their set of environments where they are the superusers. If we extend this to PeopleSoft, post Unit Testing, developers are not needed/required to have write access in the rest of the environments of SDLC. But what if, you could actually retrieve the ACCESS ID &amp;amp; ACCESS PWD (RDBMS ID which has access to the PeopleSoft schema) without the PSAdmins/DBA being aware. What is needed is explained below.&lt;br /&gt;&lt;br /&gt;1. Create a &lt;a href="http://en.wikipedia.org/wiki/Batch_file"&gt;command/batch&lt;/a&gt; file with this line - "&lt;span style="font-weight: bold;"&gt;@echo %1&lt;/span&gt;"&lt;br /&gt;    Place this file under %PS_HOME%\bin\server\WINX86&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_us1mHob_dps/TAM2hn7-71I/AAAAAAAABKo/Gf9DH89wlHo/s1600/TestcmdPic.bmp"&gt;&lt;img style="cursor: pointer; width: 316px; height: 181px;" src="http://2.bp.blogspot.com/_us1mHob_dps/TAM2hn7-71I/AAAAAAAABKo/Gf9DH89wlHo/s320/TestcmdPic.bmp" alt="" id="BLOGGER_PHOTO_ID_5477281523096809298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;2. Create a new Process Type in PeopleSoft. Let's call it - "&lt;span style="font-weight: bold;"&gt;COMMANDLINE&lt;/span&gt;"&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_us1mHob_dps/S-14Fl3thLI/AAAAAAAABJw/N_M9eQWsvJ8/s1600/5-14-2010+9-48-17+PM.bmp"&gt;&lt;img style="width: 320px; height: 154px;" id="BLOGGER_PHOTO_ID_5471161159785481394" alt="" src="http://3.bp.blogspot.com/_us1mHob_dps/S-14Fl3thLI/AAAAAAAABJw/N_M9eQWsvJ8/s320/5-14-2010+9-48-17+PM.bmp" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;3. Create a Process "&lt;span style="font-style: italic; font-weight: bold;"&gt;RETPWD&lt;/span&gt;" which will have the Process Type as "&lt;span style="font-weight: bold;"&gt;COMMANDLINE&lt;/span&gt;". I'm using Microsoft as the Database type as the PS DB is hosted on MSSQL 2005 SP2 &lt;/p&gt;&lt;a href="http://i585.photobucket.com/albums/ss293/ciphersbak/CreateProcess.jpg"&gt;&lt;/a&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_us1mHob_dps/S-14tK5gJ9I/AAAAAAAABJ4/oOpciXe7XF8/s1600/ProcessName.bmp"&gt;&lt;img style="width: 320px; height: 160px;" id="BLOGGER_PHOTO_ID_5471161839740004306" alt="" src="http://4.bp.blogspot.com/_us1mHob_dps/S-14tK5gJ9I/AAAAAAAABJ4/oOpciXe7XF8/s320/ProcessName.bmp" border="0" /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;4. Add this Process Type to your Server definition. Say PSNT &lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5. &lt;strong&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Bounce the batch server&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;6. Run the process.&lt;br /&gt;7. The process may fail, do not panic, check the log if it has been posted to report repository or you could navigate to the prcs log directory for your batch server and locate the log. It should show you something like - "DBNAME/Access ID/Access PWD" &lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/_us1mHob_dps/S-15MLpYxxI/AAAAAAAABKA/dRI84bhiJPA/s1600/Result_AccessID%26PWD.bmp"&gt;&lt;img style="width: 320px; height: 75px;" id="BLOGGER_PHOTO_ID_5471162372516792082" alt="" src="http://4.bp.blogspot.com/_us1mHob_dps/S-15MLpYxxI/AAAAAAAABKA/dRI84bhiJPA/s320/Result_AccessID%26PWD.bmp" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://i585.photobucket.com/albums/ss293/ciphersbak/FinalOUTPUT.jpg"&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6255223495642099089-998401286196003713?l=psftpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://psftpp.blogspot.com/feeds/998401286196003713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6255223495642099089&amp;postID=998401286196003713' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/998401286196003713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/998401286196003713'/><link rel='alternate' type='text/html' href='http://psftpp.blogspot.com/2010/05/how-to-retrieve-accessid-acsesspwd-for.html' title='How to Retrieve AccessID &amp; AccessPWD for a PeopleSoft Environment'/><author><name>Ciphersbak</name><uri>http://www.blogger.com/profile/01586158446874473262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://bp3.blogger.com/_us1mHob_dps/SB9X-oWAiLI/AAAAAAAAAsc/03Zt108NYoA/S220/2068438.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_us1mHob_dps/TAM2hn7-71I/AAAAAAAABKo/Gf9DH89wlHo/s72-c/TestcmdPic.bmp' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6255223495642099089.post-8819655332727333604</id><published>2010-05-09T15:47:00.004+05:30</published><updated>2010-05-09T15:55:30.423+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Integration Broker'/><title type='text'>Integration Technology of PeopleSoft</title><content type='html'>&lt;p&gt;&lt;span style="font-family:Verdana;"&gt;PeopleSoft offers several application integration  solutions to integrate two different applications be it PeopleSoft  applications or third party systems. The release of PeopleTools 8.4 saw  the advent of a new integration tool called the Integration Broker,  which facilitates tightly coupled and loosely coupled integrations.  Tightly coupled integration, a feature made available through  Synchronous messaging, may be defined as a system that expects a  response before continuing further processing. Asynchronous messaging  provides loosely coupled integration, where the source system continues  with its processing without waiting for a response. The architecture that PeopleSoft adopts for either of the messaging formats (Loosely coupled or Tightly coupled) is where the difference lies. The manner in which the Integration Gateway and Integration Engine interact is almost the same, the difference lies in the content that is exchanged between the two. It is important to understand that, irrespective of the Transaction Type (Synch or Async) PeopleSoft Integration Engine (App Server) and Integration Gateway (Web Server) always communicate in a synchronous fashion. Apart from  messaging, Integration Broker also includes Connector development that  enables connectors to be customized for a particular integration  scenario. Besides Integration Broker, PeopleSoft integration  technologies also include Component Interface and Application Engine.  The purpose of these integration solutions has been explored here.&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:Verdana;"&gt;&lt;br /&gt;The following factors are to be considered  before an integration technique is chosen: &lt;/span&gt;&lt;ul&gt;&lt;span style="font-family:Verdana;"&gt;&lt;li&gt;A large amount of data is to be  transferred  &lt;/li&gt;&lt;li&gt;Whether the data is inbound or outbound.  &lt;/li&gt;&lt;li&gt;Whether the integration has to be real-time, near-real-time or  deferred.  &lt;/li&gt;&lt;li&gt;The time required to complete a transaction  &lt;/li&gt;&lt;li&gt;Message structure of data involved  &lt;/li&gt;&lt;li&gt;Technology of the participating systems. &lt;/li&gt; &lt;/span&gt;&lt;/ul&gt; &lt;span style="font-family:Verdana;"&gt;Each of these factors has been explained in detail in the  forthcoming sections.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;High Volume of Data&lt;/b&gt;&lt;br /&gt;The volume of data involved in a transaction is a crucial factor in  deciding the communication technology used. If a large volume of data is  to be transferred, the preferred integration techniques are  Asynchronous messaging and Application Engine.&lt;br /&gt;Asynchronous messaging mode allows a large volume of data to be pushed  into the subscribing systems. Since this does not wait for a response,  it can just publish the information and continue with its own  processing.&lt;br /&gt;In a scenario that requires a large volume of data to be transferred in  batch mode from an external system into the PeopleSoft Application,  Application Engine would be the preferred solution. It is quite often  used in combination with File interface provided by the PeopleCode in  Application Engine. A typical situation would be that of integrating  legacy systems with the PeopleSoft Application. As the amount of data  involved is huge, the information from the legacy systems is stored  temporarily in files. This data is then retrieved via the PeopleCode  section of the Application Engine using file operations and the  application can be populated using Component Interface.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Direction of Data&lt;/b&gt;&lt;br /&gt;The flow of data is classified as inbound or outbound depending on  whether the information flows into the system or away from the system.  If the flow of information were purely outbound, Asynchronous messaging  would be an ideal solution. An example would be that of keeping in sync,  the customer information present in Financials (FDM) with PeopleSoft  CRM. When a new customer is added in FDM, the information is sent to  PeopleSoft CRM. Here information only flows out of the Financials  system, hence Asynchronous messaging may be used for this scenario.&lt;br /&gt;When the flow of information is purely inbound, the business validations  are to be considered to ensure that the data entering the system is  correct. Component&lt;br /&gt;Interface (CI) provides this feature, as it invokes the business logic  before saving the data in the database. Thus CI takes care of the  necessary validations before committing the transaction. A typical  example where Component Interface is used is when the leads are loaded  in the sales module from an excel sheet. In certain cases Component  Interface is also used in combination with other technologies such as  Asynchronous messaging and Application Engine.&lt;br /&gt;In a scenario, where the integration involves both outbound as well as  inbound messaging, Asynchronous messaging, Synchronous messaging or  Application Engine may be used depending on whether the transaction is  loosely, tightly coupled or file based respectively. An example of  tightly coupled two way messaging would be the integration of Field  Service Order module of PeopleSoft CRM with the Inventory module of the  Supply Chain Management product line. In this integration, whenever the  inventory level for a product is required a request is issued with the  product information from the Field Service Module to the Inventory  module. The response message contains the inventory level of the  requested product. Thus Synchronous Message would cater to the needs of  such a transaction.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Application Behavior&lt;/b&gt;&lt;br /&gt;It depends on whether the integration is real-time or near-real-time or  Offline. Real-time integration may be achieved through Synchronous  Messaging and Component Interfaces. This type of integration is  preferred for critical applications such as billing involving credit  card authorization and crediting the amount. Before a bill is issued by  PeopleSoft Billing module the credit card number is authorized by third  party systems like CyberCash and eventually the amount is debited from  the customer’s account. The source system has to ensure that the data is  updated in all the participating systems. Thus the source system has to  wait for a response from each of the systems before committing the  transaction in its own system.&lt;br /&gt;The most common tool used for offline or deferred  processing is Application Engine using the File Interface.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Response Time&lt;/b&gt;&lt;br /&gt;If the processing of the received messages is going to consume  considerable amount of time it is advisable to go in for Asynchronous  messaging. If the processing time is small, then Synchronous Messaging  may be used. Nevertheless while designing Synchronous messaging it is  necessary to keep in mind the response time.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Compatible formats&lt;/b&gt;&lt;br /&gt;In any messaging, the data is passed through record structures embedded  in the messages. The receiving system may or may not require all the  fields contained in the message. Thus it is necessary to map the message  structures to those required by the destination system. This is where  connector development comes in, where custom connectors can be developed  for systems based on the record structure used by the destination  system. Moreover middleware software also aid in the mapping of data. A  common example is MQ Series an IBM product that uses a queue system to  pass information between PeopleSoft Application and any third party  system.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;APIs available&lt;/b&gt;&lt;br /&gt;An important aspect of connector development depends on the APIs  available in a third party system. It also depends on the integration  technology supported by the third party system. For example HTTP  Connectors may be used for a third party system that supports web  services.&lt;br /&gt;Enterprise Application Integration is gaining importance in the ERP  industry. It is a major cause of concern for companies that goes in for  application integration. PeopleSoft has ensured that it is not left out  of the race by providing several integration solutions. These  technologies cover almost all the integration scenarios.&lt;br /&gt;Therefore the choice of the right integration technology for the right  scenario lies at the discretion of the enterprises.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6255223495642099089-8819655332727333604?l=psftpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://psftpp.blogspot.com/feeds/8819655332727333604/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6255223495642099089&amp;postID=8819655332727333604' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/8819655332727333604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/8819655332727333604'/><link rel='alternate' type='text/html' href='http://psftpp.blogspot.com/2010/05/integration-technology-of-peoplesoft.html' title='Integration Technology of PeopleSoft'/><author><name>Ciphersbak</name><uri>http://www.blogger.com/profile/01586158446874473262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://bp3.blogger.com/_us1mHob_dps/SB9X-oWAiLI/AAAAAAAAAsc/03Zt108NYoA/S220/2068438.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6255223495642099089.post-3315012455213942984</id><published>2010-05-08T16:19:00.008+05:30</published><updated>2010-05-08T17:27:57.089+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Application Engine'/><title type='text'>Extract All Application Engine PeopleCode</title><content type='html'>Most of us do come across situations where we would like to see the actual usage of a function in PeopleCode. The standard feature of &lt;span style="font-weight: bold;"&gt;Find In&lt;/span&gt; with the &lt;span style="font-weight: bold; font-style: italic;"&gt;Save PeopleCode to File&lt;/span&gt; check-box checked is the most commonly used approach. However, I prefer the below approach. I'm guessing that this function is available from Tools 8.50 as I came across this in latest PeopleBooks. The function GetProgText() can retrieve PeopleCode from a step for an Application Engine program. This function, however, cannot be used online. Hence, I went ahead and created an Application Engine program to retrieve all the PeopleCode written in all the Application Engine programs in FSCM 91. Though I was surprised to see that there were certain Application Engine programs with PeopleCode actions, but no PeopleCode. What is also nice about the function is that while extracting, it actually compiles the PeopleCode. This was evident, when I received compilation errors for&lt;br /&gt;1. Fields not defined on State Records&lt;br /&gt;2. Incorrect reference of an Import statement&lt;br /&gt;etc.,&lt;br /&gt;&lt;br /&gt;----Sample Program----&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Do Select&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;SQL - Please be mindful, that the Do Select Type for this Action has to be set to Reselect&lt;/span&gt;&lt;br /&gt;%Select(AE_APPLID, AE_SECTION, MARKET, EFFDT, AE_STEP)&lt;br /&gt;SELECT AE_APPLID&lt;br /&gt;, AE_SECTION&lt;br /&gt;, A.MARKET&lt;br /&gt;, A.EFFDT&lt;br /&gt;, AE_STEP&lt;br /&gt;FROM PSAESTMTDEFN A&lt;br /&gt;WHERE AE_APPLID &gt; %Bind(AE_APPLID)&lt;br /&gt;AND AE_STMT_TYPE = 'P'&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PeopleCode Action&lt;/span&gt;&lt;br /&gt;import SCM_UTILITIES:ExceptionUtilities:ExceptionHandler;&lt;br /&gt;&lt;br /&gt;try&lt;br /&gt;If FileExists("D:\Temp\AllAEPC.out", %FilePath_Absolute) Then&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;      REM *** Coming in for the nth time ***;&lt;/span&gt;&lt;br /&gt;&amp;amp;fAEPCFile_ = GetFile("D:\Temp\AllAEPC.out", "A", "UTF8", %FilePath_Absolute);&lt;br /&gt;Else&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;      REM *** Coming in for the first time ***;&lt;/span&gt;&lt;br /&gt;&amp;amp;fAEPCFile_ = GetFile("D:\Temp\AllAEPC.out", "W", "UTF8", %FilePath_Absolute);&lt;br /&gt;End-If;&lt;br /&gt;&amp;amp;PeopleCodeText = GetProgText(PPAEPCEXT_AET.AE_APPLID.Value, PPAEPCEXT_AET.AE_SECTION.Value, PPAEPCEXT_AET.MARKET.Value, "default", PPAEPCEXT_AET.EFFDT.Value, PPAEPCEXT_AET.AE_STEP.Value, "OnExecute");&lt;br /&gt;&lt;br /&gt;&amp;amp;fAEPCFile_.WriteLine("REM *** Application Engine - " | PPAEPCEXT_AET.AE_APPLID.Value | " *** " | " Section - " | PPAEPCEXT_AET.AE_SECTION.Value | " *** " | " Step - " | PPAEPCEXT_AET.AE_STEP.Value | " ***");&lt;br /&gt;&lt;br /&gt;&amp;amp;fAEPCFile_.WriteLine("&gt;---------------------------------------------------------------&lt;");    &lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;REM *** Write only if there is something to write ***;&lt;/span&gt;&lt;br /&gt;If All(&amp;amp;PeopleCodeText) Then     &lt;br /&gt;   &amp;amp;fAEPCFile_.WriteLine(&amp;amp;PeopleCodeText);&lt;br /&gt; End-If;&lt;br /&gt;&lt;br /&gt;&amp;amp;fAEPCFile_.WriteLine("&gt;---------------------------------------------------------------&lt;");     &lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;REM *** Generic Exception Handling ***;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;catch Exception &amp;amp;ex&lt;br /&gt; Local SCM_UTILITIES:ExceptionUtilities:ExceptionHandler &amp;amp;handler = create SCM_UTILITIES:ExceptionUtilities:ExceptionHandler();&lt;br /&gt; REM *** Display the Message Text and Message Explain Text and then FAIL it!!! ***;  &lt;br /&gt;REM Error (&amp;amp;handler.getMessageText(&amp;amp;ex));&lt;br /&gt; REM Be careful, since you’re using the messagebox and it causes an implicit COMMIT in certain tools version;&lt;br /&gt; MessageBox(0, "", 0, 0, "Exception Logged &gt; " | &amp;amp;handler.getMessageText(&amp;amp;ex));&lt;br /&gt;Error (&amp;amp;handler.getMessageExplainText(&amp;amp;ex));&lt;br /&gt;end-try;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6255223495642099089-3315012455213942984?l=psftpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://psftpp.blogspot.com/feeds/3315012455213942984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6255223495642099089&amp;postID=3315012455213942984' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/3315012455213942984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/3315012455213942984'/><link rel='alternate' type='text/html' href='http://psftpp.blogspot.com/2010/05/extract-all-application-engine.html' title='Extract All Application Engine PeopleCode'/><author><name>Ciphersbak</name><uri>http://www.blogger.com/profile/01586158446874473262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://bp3.blogger.com/_us1mHob_dps/SB9X-oWAiLI/AAAAAAAAAsc/03Zt108NYoA/S220/2068438.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6255223495642099089.post-4838174302419268192</id><published>2010-05-05T09:51:00.003+05:30</published><updated>2010-05-05T23:55:57.131+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Integration Broker'/><category scheme='http://www.blogger.com/atom/ns#' term='8.50'/><title type='text'>Integration Broker 8.50 - UserName not defined in the database</title><content type='html'>While trying to integrate 8.49.xx and 8.50.01 - 07, I came across an unusual error "&lt;span style="font-weight: bold;"&gt;UserName not defined in the database&lt;/span&gt;" which I had never seen earlier. At that point I thought it was something to do with the PSFT Authentication, but did not see this in either 8.48.xx or 8.49.xx. This only came to light, since I was integrating a Tools only DB (8.50.01) and FSCM 9.0/8.49.27.&lt;br /&gt;Though the passwords and UserIDs for the four nodes were same, I still got this error. The reason for this anomaly was, that the UserID I was using to log in to the FSCM DB was VP1 and since, VP1 was not present in the tools only DB, the ping failed. The ping worked when I logged in with PSADMIN on the FSCM side, as this UserID existed in the Target DB.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;This error is the result of the signed  on UserID not being a valid UserID on the target database.   The Authentication token passed includes the signon UserId and after decryption  it is validated on the target database.&lt;br /&gt;&lt;br /&gt;This is different than what  happened on PeopleTools Release 8.48 and 8.49 where the UserID is not validated  after the Authentication Token is decrypted.&lt;br /&gt;&lt;br /&gt;Oracle claims to have fixed this in the latest tools patch 8.50.08. But even though, it has been fixed, It does rattle your basics around how a PING functions, and hence, Oracle has recently come out with a Support Case, which talks in detail about how a PING would/should work in Tools 8.50.08 onwards.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6255223495642099089-4838174302419268192?l=psftpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://psftpp.blogspot.com/feeds/4838174302419268192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6255223495642099089&amp;postID=4838174302419268192' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/4838174302419268192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/4838174302419268192'/><link rel='alternate' type='text/html' href='http://psftpp.blogspot.com/2010/05/integration-broker-850-username-not.html' title='Integration Broker 8.50 - UserName not defined in the database'/><author><name>Ciphersbak</name><uri>http://www.blogger.com/profile/01586158446874473262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://bp3.blogger.com/_us1mHob_dps/SB9X-oWAiLI/AAAAAAAAAsc/03Zt108NYoA/S220/2068438.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6255223495642099089.post-8978067388762866724</id><published>2010-05-02T17:41:00.007+05:30</published><updated>2010-05-03T20:54:57.093+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Application Engine'/><title type='text'>Error Handling for Online and Application Engine PeopleCode</title><content type='html'>Its a common practice across programming languages to protect ones' code (PeopleCode). However, the so called &lt;span style="font-weight: bold;"&gt;scenarios&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt; that one can think of is limited because of various reasons. Hence, developers (including me till now :)) would catch the exception(s) and display something like "&lt;span style="font-weight: bold;"&gt;Unhandled exceptions encountered in ... ...&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;Now coming to PeopleCode, be it the Application Engine or Online PeopleCode, we do, protect the PeopleCode we write appropriately. But wouldn't it be better if we allow PeopleCode itself to capture exceptions and display relevant text, since, PeopleSoft itself has captured all the possible scenarios that could occur, either while compiling or during execution.&lt;br /&gt;&lt;br /&gt;The exception handling that I'm referring to is already delivered by PeopleSoft as most of the &lt;span style="font-weight: bold;"&gt;exception classes&lt;/span&gt; in PeopleSoft extend &lt;span style="font-weight: bold;"&gt;Exception&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I created a sample Application Engine Program to demonstrate this further...I tried out code below in a PeopleCode Action ...&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import&lt;/span&gt; SCM_UTILITIES:ExceptionUtilities:ExceptionHandler;&lt;br /&gt;&lt;br /&gt;try&lt;br /&gt;&amp;amp;FileName_Path_ = "D:\Temp\PSOPTIONS_" | %Date | ".xls";&lt;br /&gt;/* Opening a CSV file */&lt;br /&gt;&amp;amp;GL_LEDFile_ = GetFile(&amp;amp;FileName_Path_, "W", %FilePath_Absolute);&lt;br /&gt;/* Checking whether the File if Opened Successfully */&lt;br /&gt;If &amp;amp;GL_LEDFile_.IsOpen Then&lt;br /&gt; &amp;amp;GL_QryObj_ = %Session.GetQuery();&lt;br /&gt; /* Initialising the Rowset &amp;amp; Values */&lt;br /&gt; &amp;amp;GL_LEDRS_ = CreateRowset(Record.PSOPTIONS);&lt;br /&gt; &amp;amp;GL_LEDRS_.Fill();&lt;br /&gt; &amp;amp;GL_CSVString_ = &amp;amp;GL_QryObj_.FormatResultString(&amp;amp;GL_LEDRS_, %Query_XLS, 1, &amp;amp;GL_LEDRS_.ActiveRowCount);&lt;br /&gt; /* Writing the file with the Location Data */&lt;br /&gt; &amp;amp;GL_LEDFile_.WriteLine(&amp;amp;GL_CSVString_);&lt;br /&gt;Else&lt;br /&gt; Error ("Error: Opening of File Failed");&lt;br /&gt;End-If;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;REM *** I've changed the variable name on purpose, so that a run time exception is generated as there is no file object as &amp;amp;GL_LEDFil_ ***&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;REM *** the correct statement is  &amp;amp;GL_LEDFile_.Close(); ***;&lt;/span&gt;&lt;br /&gt;&amp;amp;GL_LEDFil_.Close();&lt;br /&gt;&lt;br /&gt;catch Exception &amp;amp;ex&lt;br /&gt;Local SCM_UTILITIES:ExceptionUtilities:ExceptionHandler &amp;amp;handler = create SCM_UTILITIES:ExceptionUtilities:ExceptionHandler();&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 204, 0);"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;REM *** Display the Message Text and Message Explain Text and then FAIL it!!! ***;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;   REM Error (&amp;amp;handler.getMessageText(&amp;amp;ex));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;   REM Be careful, since you’re using the messagebox and it causes an implicit COMMIT in certain tools version;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;MessageBox(0, "", 0, 0, "Exception Logged &gt; " | &amp;amp;handler.getMessageText(&amp;amp;ex));&lt;br /&gt;Error (&amp;amp;handler.getMessageExplainText(&amp;amp;ex));&lt;br /&gt;end-try;&lt;br /&gt;&lt;br /&gt;The Application Engine did fail as expected, and the stdout showed the following error&lt;br /&gt;&lt;pre&gt;This is the messageText --&gt; &lt;span style="font-weight: bold;"&gt;Exception Logged &gt; First operand of . is not an object, so cannot access member Close. (0,0)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is the explanation for the messageText --&gt; &lt;span style="font-weight: bold;"&gt;The first operand of the dot operator must be a value of some object type to access the method or property, but the value found was not an object type.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Process 10356 ABENDED at Step PP_TEST_AE.MAIN.Step02 (PeopleCode) -- RC = 4 (108,524)&lt;br /&gt;&lt;/pre&gt;It also servers another purpose, we need not use the &lt;span style="font-weight: bold; font-style: italic;"&gt;Exit(1)&lt;/span&gt; feature and then set the Action &lt;span style="font-weight: bold; font-style: italic;"&gt;On Return&lt;/span&gt; property to &lt;span style="font-weight: bold; font-style: italic;"&gt;Abort&lt;/span&gt;&lt;br /&gt;The same PeopleCode can be used for online customizations as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6255223495642099089-8978067388762866724?l=psftpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://psftpp.blogspot.com/feeds/8978067388762866724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6255223495642099089&amp;postID=8978067388762866724' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/8978067388762866724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/8978067388762866724'/><link rel='alternate' type='text/html' href='http://psftpp.blogspot.com/2010/05/error-handling-for-online-and.html' title='Error Handling for Online and Application Engine PeopleCode'/><author><name>Ciphersbak</name><uri>http://www.blogger.com/profile/01586158446874473262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://bp3.blogger.com/_us1mHob_dps/SB9X-oWAiLI/AAAAAAAAAsc/03Zt108NYoA/S220/2068438.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6255223495642099089.post-2511626225228838138</id><published>2010-04-26T08:42:00.003+05:30</published><updated>2010-04-26T17:33:08.093+05:30</updated><title type='text'>Improve and Performance Tune your Application Engine Programs</title><content type='html'>&lt;meta equiv="Content-Type" content="text/html; charset=utf-8"&gt;&lt;meta name="ProgId" content="Word.Document"&gt;&lt;meta name="Generator" content="Microsoft Word 11"&gt;&lt;meta name="Originator" content="Microsoft Word 11"&gt;&lt;link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cprakasp1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:usefelayout/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Font Definitions */  @font-face 	{font-family:Wingdings; 	panose-1:5 0 0 0 0 0 0 0 0 0; 	mso-font-alt:Wingdings; 	mso-font-charset:2; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face 	{font-family:SimSun; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-alt:???¡ì??; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 135135232 16 0 262145 0;} @font-face 	{font-family:Verdana; 	panose-1:2 11 6 4 3 5 4 4 2 4; 	mso-font-alt:Verdana; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:536871559 0 0 0 415 0;} @font-face 	{font-family:"\@SimSun"; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 135135232 16 0 262145 0;} @font-face 	{font-family:"Arial\,BoldItalic"; 	panose-1:0 0 0 0 0 0 0 0 0 0; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-format:other; 	mso-font-pitch:auto; 	mso-font-signature:3 0 0 0 1 0;} @font-face 	{font-family:TimesNewRoman; 	panose-1:0 0 0 0 0 0 0 0 0 0; 	mso-font-charset:0; 	mso-generic-font-family:roman; 	mso-font-format:other; 	mso-font-pitch:auto; 	mso-font-signature:3 0 0 0 1 0;} @font-face 	{font-family:"TimesNewRoman\,Bold"; 	panose-1:0 0 0 0 0 0 0 0 0 0; 	mso-font-charset:0; 	mso-generic-font-family:roman; 	mso-font-format:other; 	mso-font-pitch:auto; 	mso-font-signature:3 0 0 0 1 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:Verdana; 	mso-fareast-font-family:"Times New Roman"; 	mso-bidi-font-family:"Times New Roman"; 	mso-ansi-language:EN-US; 	mso-fareast-language:EN-US;} @page Section1 	{size:21.0cm 842.0pt; 	margin:72.0pt 89.85pt 72.0pt 89.85pt; 	mso-header-margin:35.45pt; 	mso-footer-margin:35.45pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;}  /* List Definitions */  @list l0 	{mso-list-id:527718199; 	mso-list-template-ids:1625746890;} @list l0:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:36.0pt; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	mso-ansi-font-size:10.0pt; 	font-family:Symbol;} @list l1 	{mso-list-id:600769313; 	mso-list-template-ids:2052737034;} @list l1:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:36.0pt; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	mso-ansi-font-size:10.0pt; 	font-family:Symbol;} @list l2 	{mso-list-id:704448993; 	mso-list-template-ids:1852453478;} @list l2:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:36.0pt; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	mso-ansi-font-size:10.0pt; 	font-family:Symbol;} @list l3 	{mso-list-id:895354405; 	mso-list-template-ids:-1184494468;} @list l3:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:36.0pt; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	mso-ansi-font-size:10.0pt; 	font-family:Symbol;} @list l4 	{mso-list-id:954211626; 	mso-list-type:hybrid; 	mso-list-template-ids:1978572466 201916417 201916419 201916421 201916417 201916419 201916421 201916417 201916419 201916421;} @list l4:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:18.0pt; 	mso-level-number-position:left; 	margin-left:18.0pt; 	text-indent:-18.0pt; 	font-family:Symbol;} @list l4:level2 	{mso-level-number-format:bullet; 	mso-level-text:o; 	mso-level-tab-stop:54.0pt; 	mso-level-number-position:left; 	margin-left:54.0pt; 	text-indent:-18.0pt; 	font-family:"Courier New";} @list l5 	{mso-list-id:965624657; 	mso-list-type:hybrid; 	mso-list-template-ids:-1663291882 201916417 201916419 201916421 201916417 201916419 201916421 201916417 201916419 201916421;} @list l5:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:36.0pt; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:Symbol;} @list l5:level2 	{mso-level-number-format:bullet; 	mso-level-text:o; 	mso-level-tab-stop:54.0pt; 	mso-level-number-position:left; 	margin-left:54.0pt; 	text-indent:-18.0pt; 	font-family:"Courier New";} @list l6 	{mso-list-id:1021514523; 	mso-list-type:hybrid; 	mso-list-template-ids:991467440 201916417 201916419 201916421 201916417 201916419 201916421 201916417 201916419 201916421;} @list l6:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:36.0pt; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:Symbol;} @list l7 	{mso-list-id:1062485647; 	mso-list-template-ids:1974872210;} @list l7:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:36.0pt; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	mso-ansi-font-size:10.0pt; 	font-family:Symbol;} @list l8 	{mso-list-id:1584727004; 	mso-list-template-ids:2015129832;} @list l8:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:36.0pt; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	mso-ansi-font-size:10.0pt; 	font-family:Symbol;} @list l9 	{mso-list-id:1716739573; 	mso-list-template-ids:-2030545618;} @list l9:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:36.0pt; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	mso-ansi-font-size:10.0pt; 	font-family:Symbol;} @list l10 	{mso-list-id:1824738253; 	mso-list-template-ids:1962842200;} @list l10:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:36.0pt; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	mso-ansi-font-size:10.0pt; 	font-family:Symbol;} @list l11 	{mso-list-id:1876656073; 	mso-list-template-ids:587210040;} @list l11:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:36.0pt; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	mso-ansi-font-size:10.0pt; 	font-family:Symbol;} @list l12 	{mso-list-id:1907761068; 	mso-list-type:hybrid; 	mso-list-template-ids:1982898286 201916417 201916419 201916421 201916417 201916419 201916421 201916417 201916419 201916421;} @list l12:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:36.0pt; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:Symbol;} @list l13 	{mso-list-id:1949311675; 	mso-list-template-ids:682406468;} @list l13:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:36.0pt; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	mso-ansi-font-size:10.0pt; 	font-family:Symbol;} @list l14 	{mso-list-id:2144492798; 	mso-list-template-ids:-1767590662;} @list l14:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:36.0pt; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	mso-ansi-font-size:10.0pt; 	font-family:Symbol;} @list l15 	{mso-list-id:2146581794; 	mso-list-template-ids:606482306;} @list l15:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:36.0pt; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	mso-ansi-font-size:10.0pt; 	font-family:Symbol;} ol 	{margin-bottom:0cm;} ul 	{margin-bottom:0cm;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Table Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Times New Roman"; 	mso-ansi-language:#0400; 	mso-fareast-language:#0400; 	mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b style=""&gt;&lt;u&gt;&lt;span style=""&gt;Writing Efficient App Engine Programs&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;a) Apply Set Processing wherever it can be applied:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Use Group by,      Having, Exists clauses effectively&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Take extra care      while writing sub queries and complex joins&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Don't forget to      join PROCESS_INSTANCE, in case you've made it a key&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Fine tune the      SQL ( Refer: &lt;a href="http://download.oracle.com/docs/cd/B14117_01/server.101/b10752/sql_1016.htm#35171"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;Oracle Documentation&lt;/span&gt;&lt;/a&gt;) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;b) Use Temp Table&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;It improves AE      performance significantly- Best Suited for Set Based Processing&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Facilitates      parallel processing&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Custom Indexes      can be created to achieve faster result &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Practice to      make PROCESS_INSTANCE a key and employ the %Table meta-SQL&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Automatic data      cleanse &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Dedicated Temp      Table is preferred&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;c) Use Meta-SQL&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Make a habit of      using Meta-SQL like %Join, %CurrentDateIn, %Table. It gives program more      flexibility. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;It makes AE      program more robust and platform independent and improves performance. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Be aware of the      limitation of these Meta-SQL, e.g. %EffdtCheck doesn't work well with PS_JOB      table&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;%TruncateTable      is faster than bulk delete statement. In case of Temp table use      %TruncateTable(%Table(XXX_TAO))&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;d) Drop/Rebuild Indexes:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;If you're      planning for massive Insert, you may wish to drop indexes and triggers      from the table first and recreate them once the insert is done. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;It makes AE      processing much faster. Just be careful that dropping indexes makes it      prone to duplicate rows. (You may leave primary key untouched).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;e) Refrain from using PeopleCode&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;If the goal can      be achieved using SQL, do not use PeopleCode.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;f) Setting Commits&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;It's      recommended to use frequent and early Commit in case of Set based      processing. It reduces load from Database server and enhance performance.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;g) Reuse Statement&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Valid Only for      SQL actions&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;By dedicating a      persistent cursor to that statement we can reuse the SQL Statement.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;When we select      the ReUse property for a SQL action, %BIND fields is converted into real      bind variables (like :1,:2, etc). This enables PeopleSoft Application      Engine to compile the statement only once and dedicate a cursor, and      re-execute it with new data multiple times. This reduction in compile time      can result in dramatic improvements to performance. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;h) Use %UpdateStats&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;For better      performance, refresh statistics on temp tables using %UpdateStats(record      name ,[HIGH/LOW]) after each bulk load of data.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;i) Use CollectGarbage()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Specific to AE      using App Classes.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Use the      CollectGarbage function to remove any unreachable application objects      created by the Application Classes and hence release the memory. ( Also      Refer: &lt;a href="http://blog.psftdba.com/2007/06/unix-process-limits-for-peoplesoft.html"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;Unix Process Limit for PeopleSoft&lt;/span&gt;&lt;/a&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;However, my      tests suggest that this function does not cause any memory to be released      by the process.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;br /&gt;j) Use SQL Hints (Tuning SQL)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;SQL Hints e.g.      /* +APPEND */,/* +FIRST_ROWS(n), provides a mechanism which instruct the      CBO to choose a certain query execution plan based on the specific      criteria. ( Refer: &lt;a href="http://download.oracle.com/docs/cd/B14117_01/server.101/b10752/hintsref.htm#4894"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;Oracle Documentation&lt;/span&gt;&lt;/a&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;k) Streaming&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Streaming is a      process in which a large chunk of data is divided into multiple streams      and all the stream processes in parallel. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;l) Use Trace File&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Use trace file      generated by Trace/TOOLSTRACESQL/TOOLSTRACEPC advisably. Find out areas      where process is taking longer processing-time or where performance can be      improved.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b style=""&gt;&lt;u&gt;&lt;span lang="EN-US"&gt;Performance Considerations in Application Engine&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;It is always important to consider performance during design and development, but it is especially important when dealing with Application Engine programs. That is because AE programs often process a large number of transactions, and also because there are a number of fundamental design decisions that can have a dramatic affect on performance.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;Performance tuning is often more of an art than a science, and there are exceptions to every rule. Still, the following general guidelines can be useful in achieving optimum performance.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;Priority Considerations&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;These points should be on every designer’s and developer’s mind. They are given&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;priority because they can have a tremendous impact, and because it is much easier to implement them in the original design than it is to add them later.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;b style=""&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;Set-Based Processing:&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt; Instead of loop constructs such as Do Select, Do When, Do While,      or Do Until, consider using UPDATE or INSERT statements that will affect      many rows at once.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;b style=""&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;Temporary Tables:&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt; There are several reasons to consider using temporary tables in      your program:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 54pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;&lt;span style=""&gt;o&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;The transaction tables may be too large to process directly against them with efficiency. A temporary table can hold an extract of the necessary data.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 54pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;&lt;span style=""&gt;o&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;The transaction tables may not have the correct index structure to process joins efficiently. A temporary table can be created with a more optimal index structure.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 54pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;&lt;span style=""&gt;o&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;The normalized data structure of the transaction tables may make it&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;                difficult to access the required information. A temporary table can be&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;                used to denormalize or “flatten” the data.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 54pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;&lt;span style=""&gt;o&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;It may not be possible to construct a single SQL statement to implement set-based processing. The temporary table can be used to store intermediate results.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 54pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;&lt;span style=""&gt;o&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;Although a single SQL statement might be possible, it may have such&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;                complex joins that it performs badly. A temporary table again can be                 used to store intermediate results.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;b style=""&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;Write efficient SQL:&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt; Set-based processing often leads to SQL statements with lots of      joins. There are several techniques to keep in mind when writing or tuning      such statements, so that they run quickly:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal" style="margin-left: 18pt;"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 54pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;&lt;span style=""&gt;o&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;Use as many indexes as possible in the join criteria. In particular, don’t&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;                skip high-level keys.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 54pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;&lt;span style=""&gt;o&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;Avoid unnecessary joins. For example, when deriving SetID values from the business unit, use a separate select statement to find the SetID, and store it in the state record. Then it can be used as a bind variable in the main SQL statement.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 54pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;&lt;span style=""&gt;o&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;Avoid unnecessary subselects. For example, if all the rows selected from a table will have the same effective date, then use a separate select statement to find the effective date, and store it in the state record. Then it can be used as a bind variable in the main select.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 54pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;&lt;span style=""&gt;o&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;Join to the smallest table possible. For example, if effective-dated records exist in a parent-child relationship, then use the parent record for the effective date subselect.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt;"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 54pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;&lt;span style=""&gt;o&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;Use Oracle hints. This is appropriate when tuning a slow SQL statement. See the Oracle documentation for a complete list of hints, although two particularly useful ones are RULE (to force a statement to ignore statistics) and USE_INDEX (to force a statement to use a particular index). Generating the optimizer plan for the statement (see below) may help in selecting an appropriate hint.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;Other Considerations&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 14pt; font-family: &amp;quot;Arial,BoldItalic&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;These points can be important in certain contexts, but they either do not carry as universal or dramatic an impact as the above points, or they are easier to implement by “tweaking” an existing program.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt;"&gt;SQL in PeopleCode: &lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt;"&gt;When possible, avoid using SQL in      PeopleCode. It carries less overhead to use SQL actions instead.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt;"&gt;Mathematical Calculations in PeopleCode: &lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt;"&gt;When possible, avoid using SQL to perform      mathematical calculations. For example, it is more efficient to use PeopleCode      to increment a counter. The exception to this is if the same calculation      must be performed on many rows of a table – in that case, use setbased processing.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt;"&gt;Commits: &lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt;"&gt;When and where commits are done should      primarily be driven by restart logic. However, if doing commits within loop      structures, it is a good idea to specify the commit frequency, so that      commits may be done in sizable “chunks”.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt;"&gt;ReUse Statement: &lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt;"&gt;For SQL actions in loop structures, turn      on the “ReUse&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;           Statement” option. The exception to this is if dynamic SQL is being used.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt;"&gt;Bulk Insert: &lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt;"&gt;For INSERT statements in loop      structures, use the Bulk Insert option. Note that this will not help if      commits are done too frequently in the loop.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt;"&gt;%UpdateStats: &lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt;"&gt;After inserting a large amount of data      into a temporary table, use the %UpdateStats command. This will help the      Oracle optimizer process joins more intelligently. Note that this will      only work if commits are enabled.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt;"&gt;Tracing: &lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt;"&gt;To identify where a performance problem is,      run a trace of the&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;           program, using the timing options. There are two important points to            consider:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 54pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style=""&gt;o&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size: 10pt;"&gt;When trying to pinpoint the problem turn off all tracing options other than the timing options. The overhead involved in tracing every statement can skew your results.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 54pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;&lt;span style=""&gt;o&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size: 10pt;"&gt;If the problem has been narrowed down to a particularly complex SQL, it can help to generate the optimizer plan for that statement, using the DB Optimizer tracing option.&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6255223495642099089-2511626225228838138?l=psftpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://psftpp.blogspot.com/feeds/2511626225228838138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6255223495642099089&amp;postID=2511626225228838138' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/2511626225228838138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/2511626225228838138'/><link rel='alternate' type='text/html' href='http://psftpp.blogspot.com/2010/04/improve-and-performance-tune-your.html' title='Improve and Performance Tune your Application Engine Programs'/><author><name>Ciphersbak</name><uri>http://www.blogger.com/profile/01586158446874473262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://bp3.blogger.com/_us1mHob_dps/SB9X-oWAiLI/AAAAAAAAAsc/03Zt108NYoA/S220/2068438.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6255223495642099089.post-5212188554073270587</id><published>2010-04-14T11:39:00.007+05:30</published><updated>2010-04-24T12:23:39.962+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='PeopleCode'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Application Package'/><title type='text'>Java Logging for Application Engine Programs</title><content type='html'>Well we all write a lot of custom batch programs, and since, a lot goes on behind the scene, we as developers need to ensure that sufficient logging takes place to help identify the problem.&lt;br /&gt;For debugging, we normally make use of either a (Global or Component) file object or the famous but dreaded messagebox(). The problem with file object approach is that file handling adds an additional overhead of checking or making sure that we have opened it in the write mode and using the right charset.&lt;br /&gt;Another approach most commonly used be developers is by adding numerous messageboxes to the PeopleCode, but most of them are unaware of the inherent danger, as in most of the PeopleTools versions, messagebox() fires and implicit &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;COMMIT&lt;/span&gt;. This can create havoc if you have a restart enabled AE.&lt;br /&gt;&lt;br /&gt;(&lt;span style="font-weight: bold;"&gt;Credits to the Original Uploader&lt;/span&gt;) Jim Marion - &lt;a href="http://jjmpsj.blogspot.com/2008/05/appengine-output-tricks-reporting.html"&gt;http://jjmpsj.blogspot.com/2008/05/appengine-output-tricks-reporting.html&lt;/a&gt;&lt;br /&gt;came up with a wonderful solution of using the preloaded JVM on the Batch or App Server to serve as logging alternative. Please go through the above link for a detailed explanation.&lt;br /&gt;&lt;br /&gt;The only modifications that I did to that piece of code was to paste in an Application Package and use that in all custom built Application Engines. This approach has loads of advantages on the ones discussed above (File Object or messagebox)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;--The actual Application Package PeopleCode&lt;/span&gt;&lt;br /&gt;class AE_BATCH_LOG&lt;br /&gt;method AE_BATCH_LOG();&lt;br /&gt;&lt;br /&gt;method println_to_stdout(&amp;amp;message As string);&lt;br /&gt;method println_to_stderr(&amp;amp;message As string);&lt;br /&gt;rem This method may be used at the discretion of the User;&lt;br /&gt;method redirect_stdout(&amp;amp;fileName As string);&lt;br /&gt;rem Use the Redirect for stderr as PS by default creates an stdout for each process;&lt;br /&gt;method redirect_stderr(&amp;amp;fileName As string);&lt;br /&gt;&lt;br /&gt;end-class;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* The Constructor takes no arguments&lt;br /&gt;*/&lt;br /&gt;method AE_BATCH_LOG&lt;br /&gt;end-method;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* The println_to_stdout method is used to Print a line of text to Stdout.&lt;br /&gt;*&lt;br /&gt;* @param                 &amp;amp;message  - Text to be written to Stdout.&lt;br /&gt;*/&lt;br /&gt;method println_to_stdout&lt;br /&gt;/+ &amp;amp;message as String +/&lt;br /&gt;&lt;br /&gt;try&lt;br /&gt; Local string &amp;amp;sMethodName = "AE_BATCH_LOG:println_to_stdout";&lt;br /&gt; Local JavaObject &amp;amp;jSystem = GetJavaClass("java.lang.System");&lt;br /&gt; Local JavaObject &amp;amp;jOutStream = &amp;amp;jSystem.out;&lt;br /&gt; Local JavaObject &amp;amp;jCls = GetJavaClass("java.lang.Class");&lt;br /&gt; Local JavaObject &amp;amp;jStringClass = &amp;amp;jCls.forName("java.lang.String");&lt;br /&gt; Local JavaObject &amp;amp;jPrintStreamCls = &amp;amp;jOutStream.getClass();&lt;br /&gt; Local JavaObject &amp;amp;jPrintlnArgTypes = CreateJavaObject("java.lang.Class[]", &amp;amp;jStringClass);&lt;br /&gt;&lt;br /&gt; Local JavaObject &amp;amp;jPrintlnMethod = &amp;amp;jPrintStreamCls.getDeclaredMethod("println", &amp;amp;jPrintlnArgTypes);&lt;br /&gt;&lt;br /&gt; &amp;amp;jPrintlnMethod.invoke(&amp;amp;jOutStream, CreateJavaObject("java.lang.Object[]", &amp;amp;message));&lt;br /&gt; rem ** I didn't find flushing necessary, but here is where you would flush the buffer if desired;&lt;br /&gt; rem &amp;amp;jOutStream.flush();&lt;br /&gt;&lt;br /&gt;catch Exception &amp;amp;ex&lt;br /&gt; &amp;amp;ex.Output();&lt;br /&gt; Error (MsgGetText(18130, 15001, "Unhandled exception occurred in %1.", &amp;amp;sMethodName));&lt;br /&gt;end-try;&lt;br /&gt;&lt;br /&gt;end-method;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* The println_to_stderr method is used to Print a line of text to Stderr.&lt;br /&gt;* This method should be used with a combination of redirect_stderr as PS&lt;br /&gt;* maintains a single Stderr file for all processes.&lt;br /&gt;* @param                 &amp;amp;message  - Text to be written to Stdout.&lt;br /&gt;*/&lt;br /&gt;method println_to_stderr&lt;br /&gt;/+ &amp;amp;message as String +/&lt;br /&gt;&lt;br /&gt;try&lt;br /&gt; Local string &amp;amp;sMethodName = "AE_BATCH_LOG:println_to_stderr";&lt;br /&gt; Local JavaObject &amp;amp;jSystem = GetJavaClass("java.lang.System");&lt;br /&gt; Local JavaObject &amp;amp;jOutStream = &amp;amp;jSystem.err;&lt;br /&gt; Local JavaObject &amp;amp;jCls = GetJavaClass("java.lang.Class");&lt;br /&gt; Local JavaObject &amp;amp;jStringClass = &amp;amp;jCls.forName("java.lang.String");&lt;br /&gt; Local JavaObject &amp;amp;jPrintStreamCls = &amp;amp;jOutStream.getClass();&lt;br /&gt; Local JavaObject &amp;amp;jPrintlnArgTypes = CreateJavaObject("java.lang.Class[]", &amp;amp;jStringClass);&lt;br /&gt;&lt;br /&gt; Local JavaObject &amp;amp;jPrintlnMethod = &amp;amp;jPrintStreamCls.getDeclaredMethod("println", &amp;amp;jPrintlnArgTypes);&lt;br /&gt;&lt;br /&gt; &amp;amp;jPrintlnMethod.invoke(&amp;amp;jOutStream, CreateJavaObject("java.lang.Object[]", &amp;amp;message));&lt;br /&gt; rem ** I didn't find flushing necessary, but here is where you would flush the buffer if desired;&lt;br /&gt; rem &amp;amp;jOutStream.flush();&lt;br /&gt;&lt;br /&gt;catch Exception &amp;amp;ex&lt;br /&gt; &amp;amp;ex.Output();&lt;br /&gt; Error (MsgGetText(18130, 15001, "Unhandled exception occurred in %1.", &amp;amp;sMethodName));&lt;br /&gt;end-try;&lt;br /&gt;&lt;br /&gt;end-method;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* The redirect_stdout method is used to redirect a line of text to a Custom file (Not a PS File Object) for general message logs.&lt;br /&gt;* Use the this method prior to calling the println_to_stdout method.&lt;br /&gt;*&lt;br /&gt;* @param                 &amp;amp;fileName  - File name of Redirected File.&lt;br /&gt;*/&lt;br /&gt;method redirect_stdout&lt;br /&gt;/+ &amp;amp;fileName as String +/&lt;br /&gt;&lt;br /&gt;try&lt;br /&gt; Local string &amp;amp;sMethodName = "AE_BATCH_LOG:redirect_stdout";&lt;br /&gt; Local JavaObject &amp;amp;jSystem = GetJavaClass("java.lang.System");&lt;br /&gt; Local JavaObject &amp;amp;jfos_out = CreateJavaObject("java.io.FileOutputStream", &amp;amp;fileName, True);&lt;br /&gt; Local JavaObject &amp;amp;jps_out = CreateJavaObject("java.io.PrintStream", &amp;amp;jfos_out, True);&lt;br /&gt; &amp;amp;jSystem.setOut(&amp;amp;jps_out);&lt;br /&gt;&lt;br /&gt;catch Exception &amp;amp;ex&lt;br /&gt; &amp;amp;ex.Output();&lt;br /&gt; Error (MsgGetText(18130, 15001, "Unhandled exception occurred in %1.", &amp;amp;sMethodName));&lt;br /&gt;end-try;&lt;br /&gt;end-method;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* The redirect_stderr method is used to redirect a line of text to a Custom file (Not a PS File Object) for error logging.&lt;br /&gt;* Use the this method prior to calling the println_to_stderr method.&lt;br /&gt;*&lt;br /&gt;* @param                 &amp;amp;fileName  - File name of Redirected File.&lt;br /&gt;*/&lt;br /&gt;method redirect_stderr&lt;br /&gt;/+ &amp;amp;fileName as String +/&lt;br /&gt;&lt;br /&gt;try&lt;br /&gt; Local string &amp;amp;sMethodName = "AE_BATCH_LOG:redirect_stderr";&lt;br /&gt; Local JavaObject &amp;amp;jSystem = GetJavaClass("java.lang.System");&lt;br /&gt; Local JavaObject &amp;amp;jfos_out = CreateJavaObject("java.io.FileOutputStream", &amp;amp;fileName, True);&lt;br /&gt; Local JavaObject &amp;amp;jps_out = CreateJavaObject("java.io.PrintStream", &amp;amp;jfos_out, True);&lt;br /&gt; &amp;amp;jSystem.setErr(&amp;amp;jps_out);&lt;br /&gt;&lt;br /&gt;catch Exception &amp;amp;ex&lt;br /&gt; &amp;amp;ex.Output();&lt;br /&gt; Error (MsgGetText(18130, 15001, "Unhandled exception occurred in %1.", &amp;amp;sMethodName));&lt;br /&gt;end-try;&lt;br /&gt;end-method;&lt;br /&gt;-----------------------------------&lt;br /&gt;To use the logging feature all you need to do is to include the below lines in any PeopleCode action of yours in your Application Engine&lt;br /&gt;-----------------------------------&lt;br /&gt;import AE_BATCH_LOG:*;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/* Create Class Object for Logging */&lt;/span&gt;&lt;br /&gt;Local AE_BATCH_LOG:AE_BATCH_LOG &amp;amp;AEmsgLog_&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/* PeopleSoft prefers the Singleton apporach */&lt;/span&gt;&lt;br /&gt;If None(&amp;amp;AEmsgLog_) Then&lt;br /&gt;&amp;amp;AEmsgLog_  = create AE_BATCH_LOG:AE_BATCH_LOG();&lt;br /&gt;------------------------------------&lt;br /&gt;Once you have the class object, we need to redirect the stdout and stderr files. Its a good practice to redirect stdout, but you need to redirect the stderr always as the stderr is shared across processes.&lt;br /&gt;------------------------------------&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/* Create the error file in the following path */&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;rem Better to retrieve the path in an SQL action and store it in AET;&lt;/span&gt;&lt;br /&gt;SQLExec("SELECT PRCSOUTPUTDIR FROM PSPRCSPARMS WHERE PRCSINSTANCE = :1", &amp;amp;YourPIValueFromAET, &amp;amp;FileDir_);&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;rem PS does not attach all extension types under view log trace. extension *.err being one of them. Hence using *.log;&lt;/span&gt;&lt;br /&gt;&amp;amp;ErrSub_ = "AE_AENAME_" | &amp;amp;YourPIValuefromAET | ".log";&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/* Determine the file path separator character. First check for backslash then forwardslash. */&lt;/span&gt;&lt;br /&gt;&amp;amp;iTempPos = Find("\", &amp;amp;FileDir_);&lt;br /&gt;If &amp;amp;iTempPos = 0 Then&lt;br /&gt;&amp;amp;iTempPos = Find("/", &amp;amp;FileDir_);&lt;br /&gt;&amp;amp;strSlash = "/";&lt;br /&gt;Else&lt;br /&gt;&amp;amp;strSlash = "\";&lt;br /&gt;End-If;&lt;br /&gt;&amp;amp;ErrFile_ = &amp;amp;FileDir_ | &amp;amp;strSlash | &amp;amp;ErrSub_;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/* redirect stderr */&lt;/span&gt;&lt;br /&gt;&amp;amp;AEmsgLog_.redirect_stderr(&amp;amp;ErrFile_);&lt;br /&gt;&amp;amp;AEmsgLog_.println_to_stderr("=============================================");&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6255223495642099089-5212188554073270587?l=psftpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://psftpp.blogspot.com/feeds/5212188554073270587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6255223495642099089&amp;postID=5212188554073270587' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/5212188554073270587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/5212188554073270587'/><link rel='alternate' type='text/html' href='http://psftpp.blogspot.com/2010/04/java-logging-for-application-engine.html' title='Java Logging for Application Engine Programs'/><author><name>Ciphersbak</name><uri>http://www.blogger.com/profile/01586158446874473262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://bp3.blogger.com/_us1mHob_dps/SB9X-oWAiLI/AAAAAAAAAsc/03Zt108NYoA/S220/2068438.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6255223495642099089.post-1804852811887901389</id><published>2010-04-14T11:21:00.012+05:30</published><updated>2011-07-26T09:17:46.881+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='PeopleCode'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Handy SQLs &amp; PeopleCode</title><content type='html'>Hi,&lt;br /&gt;Below are few SQL's which one might find handy&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;--Drill down for a given Component&lt;/span&gt;&lt;br /&gt;SELECT DISTINCT C.PNLNAME, D.ADDSRCHRECNAME, D.SEARCHRECNAME ,R.RECNAME, DB.SUBRECORD AS 'IsSubRecord', P.OCCURSLEVEL AS 'REC OccursLevel', R.SQLTABLENAME AS 'Non STD SQL Name', R.BUILDSEQNO,&lt;br /&gt;R.AUDITRECNAME, DB.RECNAME_PARENT, P.FIELDNAME, P.OCCURSLEVEL AS 'FLD OccursLevel', DB.DEFFIELDNAME As 'Default Value', P.FIELDTYPE,&lt;br /&gt;(CASE FIELDTYPE WHEN 0 THEN 'Label' WHEN 6 THEN 'LongEditBox' WHEN 12 THEN 'PushButton' WHEN 1 THEN 'Frame' WHEN 7 THEN 'CheckBox' WHEN 13 THEN 'SecondaryPage (SUBPNLNAME)'&lt;br /&gt;WHEN 2 THEN 'GroupBox' WHEN 8 THEN 'RadioButton' WHEN 14 THEN 'TreeControl' WHEN 3 THEN 'StaticImage' WHEN 9 THEN 'Image' WHEN 15 THEN 'Gridcontrol' WHEN 4 THEN 'EditBox'&lt;br /&gt;WHEN 10 THEN 'ScrollBar' WHEN 16 THEN 'PushButton (GoToMenu, PNLGRPNAME)' WHEN 5 THEN 'ComboBox' WHEN 11 THEN 'SubPage' WHEN 18 THEN 'SecPage (SUBPNLNAME)' WHEN 19 THEN 'PSGrid'&lt;br /&gt;WHEN 20 THEN 'Tree' WHEN 21 THEN 'PushButton (calls SecondaryPage)' WHEN 23 THEN 'HorzRule (Horizontal Line)' WHEN 24 THEN 'TabSeperator' WHEN 25 THEN 'HTML Area'&lt;br /&gt;WHEN 26 THEN 'PushButton (Hyperlink to PromptAction)' WHEN 27 THEN 'Scroll Area' END) AS 'FLDType Descr',&lt;br /&gt;DB.EDITTABLE, DB.SETCNTRLFLD, P.LABEL_ID AS 'Label ID', P.LBLTEXT AS 'Label Text', P.SUBPNLNAME&lt;br /&gt;FROM PSPNLGROUP C INNER JOIN PSPNLFIELD P&lt;br /&gt;ON C.PNLNAME = P.PNLNAME&lt;br /&gt;INNER JOIN PSRECDEFN R&lt;br /&gt;ON R.RECNAME = P.RECNAME&lt;br /&gt;FULL OUTER JOIN PSRECFIELDDB DB&lt;br /&gt;ON R.RECNAME = DB.RECNAME&lt;br /&gt;AND P.FIELDNAME = DB.FIELDNAME&lt;br /&gt;INNER JOIN PSPNLGRPDEFN D&lt;br /&gt;ON C.PNLGRPNAME = D.PNLGRPNAME&lt;br /&gt;AND C.MARKET = D.MARKET&lt;br /&gt;WHERE C.PNLGRPNAME = '&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;%YOUR COMPONENT NAME%&lt;/span&gt;'&lt;br /&gt;ORDER BY P.OCCURSLEVEL&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;--Retrieve Project Objects&lt;/span&gt; ... &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;The Query below is for MSSQL&lt;/span&gt;&lt;br /&gt;SELECT (CASE OBJECTTYPE&lt;br /&gt;When '0' then 'Records'&lt;br /&gt;When '1' then 'Indexes'&lt;br /&gt;When '2' then 'Fields'&lt;br /&gt;When '3' then 'Field Formats'&lt;br /&gt;When '4' then 'Translate Values'&lt;br /&gt;When '5' then 'Pages'&lt;br /&gt;When '6' then 'Menus'&lt;br /&gt;When '7' then 'Components'&lt;br /&gt;When '8' then 'Record PeopleCode'&lt;br /&gt;When '9' then 'Menu PeopleCode'&lt;br /&gt;When '10' then 'Queries'&lt;br /&gt;When '11' then 'Tree Structures'&lt;br /&gt;When '12' then 'Trees'&lt;br /&gt;When '13' then 'Access Groups'&lt;br /&gt;When '14' then 'Colors'&lt;br /&gt;When '15' then 'Styles'&lt;br /&gt;When '16' then 'Business Process Maps'&lt;br /&gt;When '17' then 'Business Processes'&lt;br /&gt;When '18' then 'Activities'&lt;br /&gt;When '19' then 'Roles'&lt;br /&gt;When '20' then 'Process Definitions'&lt;br /&gt;When '21' then 'Server Definitions'&lt;br /&gt;When '22' then 'Process Type Definitions'&lt;br /&gt;When '23' then 'Job Definitions'&lt;br /&gt;When '24' then 'Recurrence Definitions'&lt;br /&gt;When '25' then 'Message Catalog Entries'&lt;br /&gt;When '26' then 'Dimensions'&lt;br /&gt;When '27' then 'Cube Definitions'&lt;br /&gt;When '28' then 'Cube Instance Definitions'&lt;br /&gt;When '29' then 'Business Interlink'&lt;br /&gt;When '30' then 'SQL'&lt;br /&gt;When '31' then 'File Layout Definitions'&lt;br /&gt;When '32' then 'Component Interfaces'&lt;br /&gt;When '33' then 'Application Engine Programs'&lt;br /&gt;When '34' then 'Application Engine Sections'&lt;br /&gt;When '35' then 'Message Nodes'&lt;br /&gt;When '36' then 'Message Channels'&lt;br /&gt;When '37' then 'Messages'&lt;br /&gt;When '38' then 'Approval Rule Sets'&lt;br /&gt;When '39' then 'Message PeopleCode'&lt;br /&gt;When '40' then 'Subscription PeopleCode'&lt;br /&gt;When '41' then 'unused'&lt;br /&gt;When '42' then 'Comp. Interface PeopleCode'&lt;br /&gt;When '43' then 'Application Engine PeopleCode'&lt;br /&gt;When '44' then 'Page PeopleCode'&lt;br /&gt;When '45' then 'Page Field PeopleCode'&lt;br /&gt;When '46' then 'Component PeopleCode'&lt;br /&gt;When '47' then 'Component Record PeopleCode'&lt;br /&gt;When '48' then 'Component Rec Fld PeopleCode'&lt;br /&gt;When '49' then 'Images'&lt;br /&gt;When '50' then 'Style Sheets'&lt;br /&gt;When '51' then 'HTML'&lt;br /&gt;When '52' then 'unused'&lt;br /&gt;When '53' then 'Permission Lists'&lt;br /&gt;When '54' then 'Portal Registry Definitions'&lt;br /&gt;When '55' then 'Portal Registry Structures'&lt;br /&gt;When '56' then 'URL Definitions'&lt;br /&gt;When '57' then 'Application Packages'&lt;br /&gt;When '58' then 'Application Package PeopleCode'&lt;br /&gt;When '59' then 'Portal Registry User Homepages'&lt;br /&gt;When '60' then 'Analytic Types'&lt;br /&gt;When '61' then 'Archive Templates'&lt;br /&gt;When '62' then 'XSLT'&lt;br /&gt;When '63' then 'Portal Registry User Favorites'&lt;br /&gt;When '64' then 'Mobile Pages'&lt;br /&gt;When '65' then 'Relationships'&lt;br /&gt;When '66' then 'CI Property PeopleCode'&lt;br /&gt;When '67' then 'Optimization Models'&lt;br /&gt;When '68' then 'File References'&lt;br /&gt;When '69' then 'File Type Codes'&lt;br /&gt;When '70' then 'Archive Object Definitions'&lt;br /&gt;When '71' then 'Archive Templates (Type 2)'&lt;br /&gt;When '72' then 'Diagnostic Plug-Ins'&lt;br /&gt;When '73' then 'Analytic Models'&lt;br /&gt;When '74' then 'unused'&lt;br /&gt;When '75' then 'Java Portlet User Preferences'&lt;br /&gt;When '76' then 'WSRP Remote Producers'&lt;br /&gt;When '77' then 'WSRP Remote Portlets'&lt;br /&gt;When '78' then 'WSRP Cloned Portlets Handles'&lt;br /&gt;When '79' then 'Services'&lt;br /&gt;When '80' then 'Service Operations'&lt;br /&gt;When '81' then 'Service Operation Handlers'&lt;br /&gt;When '82' then 'Service Operation Versions'&lt;br /&gt;When '83' then 'Service Operation Routings'&lt;br /&gt;When '84' then 'IB Queues'&lt;br /&gt;When '85' then 'XMLP Template Defn'&lt;br /&gt;When '86' then 'XMLP Report Defn'&lt;br /&gt;When '87' then 'XMLP File Defn'&lt;br /&gt;When '88' then 'XMLP Data Src Defn'&lt;br /&gt;Else 'Unknown'&lt;br /&gt;END) As 'Object Type', R.OBJECTVALUE1, R.OBJECTVALUE2, R.OBJECTVALUE3, R.OBJECTVALUE4,&lt;br /&gt;(CASE UPGRADEACTION WHEN 0 THEN 'Upgrade Action is Copy' WHEN 1 THEN 'Upgrade Action is Delete' WHEN 2 THEN 'Upgrade Action is None' WHEN 3 THEN 'Upgrade Action is CopyProp'&lt;br /&gt;ELSE 'Unknown' END) AS 'Upgrade Action',&lt;br /&gt;(CASE SOURCESTATUS WHEN 0 THEN 'Unknown' WHEN 1 THEN 'Absent' WHEN 2 THEN 'Changed' WHEN 3 THEN 'Unchanged' WHEN 4 THEN '*Changed' WHEN 5 THEN '*Unchanged' WHEN 6 THEN 'Same'&lt;br /&gt;ELSE 'Unknown' END) As 'SourceStatus',&lt;br /&gt;(CASE TARGETSTATUS WHEN 0 THEN 'Unknown' WHEN 1 THEN 'Absent' WHEN 2 THEN 'Changed' WHEN 3 THEN 'Unchanged' WHEN 4 THEN '*Changed' WHEN 5 THEN '*Unchanged' WHEN 6 THEN 'Same'&lt;br /&gt;ELSE 'Unknown' END) As 'TargetStatus'&lt;br /&gt;FROM PSPROJECTITEM R WHERE PROJECTNAME LIKE '&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;%YOUR PROJECT NAME%&lt;/span&gt;'&lt;br /&gt;ORDER BY OBJECTTYPE&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;---- Finding the Top n Tables in a Database as per Used Space&lt;/span&gt; - MSSQL ONLY&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;--Set @Count to whatever number you would like&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;--Set @ORDERBY to any of the four options - USED, DATA, RC - Row Count, RESD - Reserved&lt;/span&gt;&lt;br /&gt;DECLARE @COUNT INT;&lt;br /&gt;DECLARE @ORDERBY VARCHAR(4);&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;SET @COUNT = 50&lt;/span&gt;;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;SET @ORDERBY = 'USED'&lt;/span&gt;;&lt;br /&gt;BEGIN try&lt;br /&gt;IF ((SELECT CASE WHEN @ORDERBY in ('USED','DATA','RC','RESD') THEN 1 ELSE 0 END) = 0)&lt;br /&gt;BEGIN&lt;br /&gt;-- abort if invalid @ORDERBY parameter entered&lt;br /&gt;RAISERROR('@ORDERBY parameter not USED, DATA, RC or RESD',11,1)&lt;br /&gt;RETURN&lt;br /&gt;END&lt;br /&gt;SELECT TOP (@COUNT)&lt;br /&gt;--(row_number() over(order by a3.name, a2.name))%2 as l1,&lt;br /&gt;a2.name AS [TableName],&lt;br /&gt;sum(a1.rows) as row_count,&lt;br /&gt;sum((a1.reserved + ISNULL(a4.reserved,0))* 8) AS reserved,&lt;br /&gt;sum(a1.used * 8)[Used],&lt;br /&gt;sum(a1.data * 8) AS data,&lt;br /&gt;sum((CASE WHEN (a1.used + ISNULL(a4.used,0)) &amp;gt; a1.data THEN&lt;br /&gt;(a1.used + ISNULL(a4.used,0)) - a1.data ELSE 0 END) * 8 )AS index_size,&lt;br /&gt;sum((CASE WHEN (a1.reserved + ISNULL(a4.reserved,0)) &amp;gt; a1.used THEN&lt;br /&gt;(a1.reserved + ISNULL(a4.reserved,0)) - a1.used ELSE 0 END) * 8) AS unused&lt;br /&gt;FROM&lt;br /&gt;(SELECT ps.object_id, SUM (CASE WHEN (ps.index_id &amp;lt; object_id =" ps.object_id)" parent_id =" a1.object_id)" object_id =" a2.object_id" schema_id =" a3.schema_id)"&amp;gt; 'S' and a2.type &amp;lt;&amp;gt; 'IT'&lt;br /&gt;AND a1.used &amp;lt;&amp;gt; 0&lt;br /&gt;GROUP BY a2.name&lt;br /&gt;--ORDER BY a2.name&lt;br /&gt;ORDER BY CASE&lt;br /&gt;WHEN @ORDERBY = 'USED' THEN sum(a1.used * 8)&lt;br /&gt;WHEN @ORDERBY = 'DATA' THEN sum(a1.data * 8)&lt;br /&gt;WHEN @ORDERBY = 'RC' THEN sum(a1.rows)&lt;br /&gt;WHEN @ORDERBY = 'RESD' THEN sum((a1.reserved + ISNULL(a4.reserved,0))* 8)&lt;br /&gt;END DESC&lt;br /&gt;end try&lt;br /&gt;begin catch&lt;br /&gt;select&lt;br /&gt;-100 as l1&lt;br /&gt;, 1 as schemaname&lt;br /&gt;, ERROR_NUMBER() as tablename&lt;br /&gt;, ERROR_SEVERITY() as row_count&lt;br /&gt;, ERROR_STATE() as reserved&lt;br /&gt;, ERROR_MESSAGE() as data&lt;br /&gt;, 1 as index_size&lt;br /&gt;, 1 as unused&lt;br /&gt;end catch&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;--rem One of the better ways to write SaveEdit Validation for a Field. Only for Contextual Reference though;&lt;/span&gt;&lt;br /&gt;&amp;amp;err_style = "PSERROR";&lt;br /&gt;&amp;amp;normal_style = "PSEDITBOX";&lt;br /&gt;&amp;amp;field = GetField();&lt;br /&gt;If Not All(&amp;amp;field.Value) Then&lt;br /&gt;&amp;amp;label = &amp;amp;field.GetLongLabel(&amp;amp;field.Name);&lt;br /&gt;&amp;amp;field.Style = &amp;amp;err_style;&lt;br /&gt;rem Press SHIFT + ^ for the FieldName to appear in the SetCursorPos Function Below. Field shown is for reference ONLY;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;rem you only need to change the line below&lt;/span&gt;&lt;br /&gt;SetCursorPos(%Page, &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;USE SHIFT + 6 for the field&lt;/span&gt;);&lt;br /&gt;Error MsgGet(5930, 1, "", &amp;amp;label);&lt;br /&gt;Else&lt;br /&gt;&amp;amp;field.Style = &amp;amp;normal_style;&lt;br /&gt;End-If;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;-- Read an encrypted file and decrypt it. Good for stealing any document&lt;/span&gt;&lt;br /&gt;import TR:FileUtilities:*;&lt;br /&gt;&lt;br /&gt;Local JavaObject &amp;amp;psCYPHER = CreateJavaObject("psft.pt8.pshttp.PSCipher");&lt;br /&gt;&amp;amp;PPFile_ = GetFile("D:\temp\EncryptedFile.out", "R", "A", %FilePath_Absolute);&lt;br /&gt;&lt;br /&gt;Local TR:FileUtilities:Files &amp;amp;PPsSingleton_;&lt;br /&gt;If None(&amp;amp;PPsSingleton_) Then&lt;br /&gt;&amp;amp;PPsSingleton_ = create TR:FileUtilities:Files();&lt;br /&gt;End-If;&lt;br /&gt;&amp;amp;encPassword = &amp;amp;PPsSingleton_.GetFileAsString(&amp;amp;PPFile_);&lt;br /&gt;&amp;amp;DecPwd = &amp;amp;psCYPHER.decodePassword(&amp;amp;encPassword);&lt;br /&gt;&lt;br /&gt;&amp;amp;PPOutFile_ = GetFile("D:\temp\ActualDecryptedFile.out", "W", "A", %FilePath_Absolute);&lt;br /&gt;&amp;amp;PPOutFile_.WriteString(&amp;amp;DecPwd);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;amp;psCYPHER = Null;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;-- Nice use of MetaSQL in Application Engine Programs&lt;/span&gt;&lt;br /&gt;It's handy to keep a log of your batch programs, as the process scheduler tables get purged frequently. The SQL below shows a nice way of using the MetaSQL, and this can be used for any/all your custom App Engines. This can be used in the last SQL action before your Application Engine finishes.&lt;br /&gt;&lt;br /&gt;The MetaSQL - &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;AE$LOG$SQL&lt;/span&gt; only consists of '&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;%P(1)&lt;/span&gt;'&lt;br /&gt;&lt;br /&gt;INSERT INTO PS_AE_LOG_TBL (PROCESS_INST_STG&lt;br /&gt;,OPRID&lt;br /&gt;,RUN_CNTL_ID&lt;br /&gt;,AE_APPLID&lt;br /&gt;,ACTIONDTTM&lt;br /&gt;,ENDDTTM&lt;br /&gt;,DURATION_TIME)&lt;br /&gt;VALUES (%Sql(AE$LOG$SQL,%Bind(YOURAET.PROCESS_INST_STG) ,10)&lt;br /&gt;,%Sql(AE$LOG$SQL,%Bind(YOURAET.OPRID),30)&lt;br /&gt;,%Sql(AE$LOG$SQL,%Bind(YOURAET.RUN_CNTL_ID),30)&lt;br /&gt;,%AEProgram&lt;br /&gt;,%Sql(AE$LOG$SQL,%Bind(YOURAET.ACTIONDTTM),26)&lt;br /&gt;,%CurrentDateTimeIn&lt;br /&gt;,%DateTimeDiff(%Sql(AE$LOG$SQL,%Bind(YOURAET.ACTIONDTTM),26), %CurrentDateTimeIn))&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;-- Find the Navigation of a Process (AE &amp;amp; SQR)&lt;/span&gt;&lt;br /&gt;SELECT DISTINCT LTRIM(RTRIM(B.MENUGROUP)) +&lt;br /&gt;' &amp;gt; ' + LTRIM(RTRIM(B.MENULABEL)) +&lt;br /&gt;' &amp;gt; ' + LTRIM(RTRIM(BARLABEL)) +&lt;br /&gt;' &amp;gt; ' + LTRIM(RTRIM(A.ITEMLABEL)) +&lt;br /&gt;' &amp;gt; ' + LTRIM(RTRIM(D.PNLGRPNAME)) +&lt;br /&gt;' – ' + LTRIM(RTRIM(PRCSTYPE)) +&lt;br /&gt;' – ' + LTRIM(RTRIM(PRCSNAME)) NAVIGATION&lt;br /&gt;FROM PSMENUITEM A, PSMENUDEFN B, PS_PRCSDEFNPNL C, PSPNLGROUP D&lt;br /&gt;WHERE A.MENUNAME = B.MENUNAME&lt;br /&gt;AND A.PNLGRPNAME = C.PNLGRPNAME&lt;br /&gt;AND A.PNLGRPNAME = D.PNLGRPNAME&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;-- Substitute the PRCSNAME value with the Process Name that you are looking for&lt;/span&gt;&lt;br /&gt;AND PRCSNAME = 'POPO005'&lt;br /&gt;GROUP BY B.MENUNAME, B.MENUGROUP, B.MENULABEL, BARLABEL, A.ITEMLABEL,&lt;br /&gt;D.PNLGRPNAME, PRCSTYPE, PRCSNAME&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Caveat&lt;/span&gt; - No rows &lt;span style="font-weight: bold;"&gt;DOES NOT MEAN&lt;/span&gt; that the process is not used. It could either be called from an AE or be a part of a PSJob.&lt;br /&gt;&lt;br /&gt;   &lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;--Projects Items List via SQL for MSSQL&lt;/span&gt;&lt;br /&gt;Credits to the &lt;a href="http://www.pscustomizer.com/sql-examples/project-items-list-via-sql/"&gt;Original uploader&lt;/a&gt;&lt;br /&gt;SELECT OBJECTTYPE,&lt;br /&gt;CASE OBJECTTYPE&lt;br /&gt;  WHEN 0   THEN CASE ISNULL((SELECT RECTYPE FROM PSRECDEFN WHERE RECNAME = I.OBJECTVALUE1), 99)&lt;br /&gt;                           WHEN 0 THEN 'SQL Table in DB'&lt;br /&gt;                           WHEN 1 THEN 'SQL View in DB'&lt;br /&gt;                           WHEN 2 THEN 'Work Record'&lt;br /&gt;                           WHEN 3 THEN 'Sub Record'&lt;br /&gt;                           WHEN 5 THEN 'Dynamic View'&lt;br /&gt;                           WHEN 6 THEN 'Query View'&lt;br /&gt;                           WHEN 7 THEN 'Temporary Table'&lt;br /&gt;                           ELSE 'Other Record or Deleted' END&lt;br /&gt;&lt;br /&gt;  WHEN 1   THEN 'Index'&lt;br /&gt;  WHEN 2   THEN 'Field'&lt;br /&gt;  WHEN 3   THEN 'Field Format'&lt;br /&gt;  WHEN 4   THEN 'Translate Value'&lt;br /&gt;  WHEN 5   THEN 'Page'&lt;br /&gt;  WHEN 6   THEN 'Menu'&lt;br /&gt;  WHEN 7   THEN 'Component'&lt;br /&gt;  WHEN 8   THEN 'Record PeopleCode'&lt;br /&gt;  WHEN 9   THEN 'Menu PeopleCode'&lt;br /&gt;  WHEN 10  THEN 'Query'&lt;br /&gt;  WHEN 11  THEN 'Tree Structure'&lt;br /&gt;  WHEN 12  THEN 'Tree'&lt;br /&gt;  WHEN 13  THEN 'Access Group'&lt;br /&gt;  WHEN 14  THEN 'Color'&lt;br /&gt;  WHEN 15  THEN 'Style'&lt;br /&gt;  WHEN 16  THEN 'Business Process Map'&lt;br /&gt;  WHEN 17  THEN 'Business Process'&lt;br /&gt;  WHEN 18  THEN 'Activity'&lt;br /&gt;  WHEN 19  THEN 'Role'&lt;br /&gt;  WHEN 20  THEN 'Process Definition'&lt;br /&gt;  WHEN 21  THEN 'Process Server Definition'&lt;br /&gt;  WHEN 22  THEN 'Process Type Definition'&lt;br /&gt;  WHEN 23  THEN 'Process Job Definition'&lt;br /&gt;  WHEN 24  THEN 'Process Recurrence Definition'&lt;br /&gt;  WHEN 25  THEN 'Message Catalog'&lt;br /&gt;  WHEN 26  THEN 'Dimension'&lt;br /&gt;  WHEN 27  THEN 'Cube Definition'&lt;br /&gt;  WHEN 28  THEN 'Cube Instance Definition'&lt;br /&gt;  WHEN 29  THEN 'Business Interlink'&lt;br /&gt;  WHEN 30  THEN CASE OBJECTVALUE2&lt;br /&gt;                               WHEN '0' THEN 'SQL Object'&lt;br /&gt;                               WHEN '1' THEN 'App Engine SQL'&lt;br /&gt;                               WHEN '2' THEN 'Record View SQL'&lt;br /&gt;                               WHEN '5' THEN 'Query for DDAUDIT or SYSAUDIT'&lt;br /&gt;                               WHEN '6' THEN 'App Engine XML SQL'&lt;br /&gt;                               ELSE 'SQL' END&lt;br /&gt;  WHEN 31  THEN 'File Layout'&lt;br /&gt;  WHEN 32  THEN 'Component Interface'&lt;br /&gt;  WHEN 33  THEN 'Application Engine Program'&lt;br /&gt;  WHEN 34  THEN 'Application Engine Section'&lt;br /&gt;  WHEN 35  THEN 'Message Node'&lt;br /&gt;  WHEN 36  THEN 'Message Channel'&lt;br /&gt;  WHEN 37  THEN 'Message'&lt;br /&gt;  WHEN 38  THEN 'Approval rule set'&lt;br /&gt;  WHEN 39  THEN 'Message PeopleCode'&lt;br /&gt;  WHEN 40  THEN 'Subscription PeopleCode'&lt;br /&gt;  WHEN 41  THEN 'N/A'&lt;br /&gt;  WHEN 42  THEN 'Component Interface PeopleCode'&lt;br /&gt;  WHEN 43  THEN 'Application Engine PeopleCode'&lt;br /&gt;  WHEN 44  THEN 'Page PeopleCode'&lt;br /&gt;  WHEN 45  THEN 'Page Field PeopleCode'&lt;br /&gt;  WHEN 46  THEN 'Component PeopleCode'&lt;br /&gt;  WHEN 47  THEN 'Component Record PeopleCode'&lt;br /&gt;  WHEN 48  THEN 'Component Record Field PeopleCode'&lt;br /&gt;  WHEN 49  THEN 'Image'&lt;br /&gt;  WHEN 50  THEN 'Style sheet'&lt;br /&gt;  WHEN 51  THEN 'HTML'&lt;br /&gt;  WHEN 52  THEN 'Not used'&lt;br /&gt;  WHEN 53  THEN 'Permission List'&lt;br /&gt;  WHEN 54  THEN 'Portal Registry Definitions'&lt;br /&gt;  WHEN 55  THEN 'Portal Registry Structure'&lt;br /&gt;  WHEN 56  THEN 'URL Definitions'&lt;br /&gt;  WHEN 57  THEN 'Application Packages'&lt;br /&gt;  WHEN 58  THEN 'Application Package PeopleCode'&lt;br /&gt;  WHEN 59  THEN 'Portal Registry User Homepage'&lt;br /&gt;  WHEN 60  THEN 'Problem Type'&lt;br /&gt;  WHEN 61  THEN 'Archive Templates'&lt;br /&gt;  WHEN 62  THEN 'XSLT'&lt;br /&gt;  WHEN 63  THEN 'Portal Registry User Favorite'&lt;br /&gt;  WHEN 64  THEN 'Mobile Page'&lt;br /&gt;  WHEN 65  THEN 'Relationships'&lt;br /&gt;  WHEN 66  THEN 'Component Interface Property PeopleCode'&lt;br /&gt;  WHEN 67  THEN 'Optimization Models'&lt;br /&gt;  WHEN 68  THEN 'File References'&lt;br /&gt;  WHEN 69  THEN 'File Type Codes'&lt;br /&gt;  WHEN 70  THEN 'Archive Object Definitions'&lt;br /&gt;  WHEN 71  THEN 'Archive Templates (Type 2)'&lt;br /&gt;  WHEN 72  THEN 'Diagnostic Plug In'&lt;br /&gt;  WHEN 73  THEN 'Analytic Model'&lt;br /&gt;  WHEN 74  THEN 'unused'&lt;br /&gt;  WHEN 75  THEN 'Java Portlet User Preferences'&lt;br /&gt;  WHEN 76  THEN 'WSRP Remote Producers'&lt;br /&gt;  WHEN 77  THEN 'WSRP Remote Portlets'&lt;br /&gt;  WHEN 78  THEN 'WSRP Cloned Portlets Handles'&lt;br /&gt;  WHEN 79  THEN 'Service'&lt;br /&gt;  WHEN 80  THEN 'Service Operation'&lt;br /&gt;  WHEN 81  THEN 'Service Operation Handler'&lt;br /&gt;  WHEN 82  THEN 'Service Operation Version'&lt;br /&gt;  WHEN 83  THEN 'Service Operation Routing'&lt;br /&gt;  WHEN 84  THEN 'Info Broker Queues'&lt;br /&gt;  WHEN 85  THEN 'XLMP Template Definition'&lt;br /&gt;  WHEN 86  THEN 'XLMP Report Definition'&lt;br /&gt;  WHEN 87  THEN 'XMLP File Definition'&lt;br /&gt;  WHEN 88  THEN 'XMPL Data Source Definition'&lt;br /&gt;  WHEN 89  THEN 'WSDL'&lt;br /&gt;  WHEN 90  THEN 'Schema'&lt;br /&gt;  WHEN 91  THEN 'Connected Queries'&lt;br /&gt;  WHEN 92  THEN 'Logical Schema'&lt;br /&gt;  WHEN 93  THEN 'Physical Schema'&lt;br /&gt;  WHEN 94  THEN 'Relational Schema'&lt;br /&gt;  WHEN 95  THEN 'Logical Schema Dependancy'&lt;br /&gt;  WHEN 96  THEN 'Document Schema'&lt;br /&gt;  WHEN 97  THEN 'Essbase Cube Dimensions'&lt;br /&gt;  WHEN 98  THEN 'Essbase Cube Outlines'&lt;br /&gt;  WHEN 99  THEN 'Essbase Cube Connections'&lt;br /&gt;  WHEN 100 THEN 'Essbase Cube Templates'&lt;br /&gt;  ELSE 'Unknown '  END  AS Object_Type,&lt;br /&gt;  CASE OBJECTTYPE&lt;br /&gt;  WHEN 12  THEN OBJECTVALUE3&lt;br /&gt;  WHEN 30  THEN CASE WHEN OBJECTVALUE2 = 0 THEN OBJECTVALUE1&lt;br /&gt;                       WHEN OBJECTVALUE2 = 1 THEN SUBSTRING(OBJECTVALUE1, 1, 12)&lt;br /&gt;                       WHEN OBJECTVALUE2 = 2 THEN OBJECTVALUE1&lt;br /&gt;                       ELSE ' ' END&lt;br /&gt;  WHEN 34  THEN ltrim(RTRIM(OBJECTVALUE1)) + '.' + ltrim(RTRIM(OBJECTVALUE2))&lt;br /&gt;  WHEN 62  THEN ltrim(rTRIM(SUBSTRING(OBJECTVALUE1, 1, 12)))&lt;br /&gt;  ELSE OBJECTVALUE1 END AS NAME,&lt;br /&gt;  CASE&lt;br /&gt;  WHEN OBJECTTYPE = 1    THEN 'Index: ' + OBJECTVALUE2&lt;br /&gt;  WHEN OBJECTTYPE = 4    THEN 'XLAT: ' + OBJECTVALUE2 + '; Date: ' + OBJECTVALUE3 + '; ' +&lt;br /&gt;                             ISNULL((SELECT 'ShortName: ' + XLATSHORTNAME + '; LongName: ' +&lt;br /&gt;                                          XLATLONGNAME + '; Status: ' + EFF_STATUS&lt;br /&gt;                                  FROM PSXLATITEM&lt;br /&gt;                                  WHERE FIELDNAME = I.OBJECTVALUE1 AND FIELDVALUE = I.OBJECTVALUE2&lt;br /&gt;                                    AND EFFDT = I.OBJECTVALUE3), 'XLAT Deleted')&lt;br /&gt;  WHEN OBJECTTYPE = 7    THEN 'Market: ' + OBJECTVALUE2&lt;br /&gt;  WHEN OBJECTTYPE = 8    THEN OBJECTVALUE1 + '.' + OBJECTVALUE2 + '.' + OBJECTVALUE3&lt;br /&gt;  WHEN OBJECTTYPE = 9    THEN OBJECTVALUE2 + '.' + OBJECTVALUE3 + '.' + OBJECTVALUE4&lt;br /&gt;  WHEN OBJECTTYPE = 12   THEN 'EFFDT: ' + OBJECTVALUE4&lt;br /&gt;  WHEN OBJECTTYPE = 20   THEN 'Process Name: ' + OBJECTVALUE2&lt;br /&gt;  WHEN OBJECTTYPE IN(22, 40)   THEN OBJECTVALUE2 + '.' + OBJECTVALUE3&lt;br /&gt;  WHEN OBJECTTYPE = 25   THEN 'Message: ' + OBJECTVALUE2 + '(Message Set Descr: ' + ltrim(rtrim(OBJECTVALUE3)) + ')'&lt;br /&gt;  WHEN OBJECTTYPE = 30   THEN&lt;br /&gt;                         CASE WHEN OBJECTVALUE2 = 0 THEN ' '&lt;br /&gt;                              WHEN OBJECTVALUE2 = 1 THEN 'AE Progam: ' +&lt;br /&gt;                                           SUBSTRING(OBJECTVALUE1, 1, 12) + '  Section: ' +&lt;br /&gt;                                           SUBSTRING(OBJECTVALUE1, 13, 8) + '  Step: ' +&lt;br /&gt;                                           SUBSTRING(OBJECTVALUE1, 21, 8) + '  Type: ' +&lt;br /&gt;                                           CASE WHEN SUBSTRING(OBJECTVALUE1, 29, 1) = 'S' THEN 'SQL'&lt;br /&gt;                            WHEN SUBSTRING(OBJECTVALUE1, 29, 1) = 'D' THEN 'Do Select'&lt;br /&gt;                            WHEN SUBSTRING(OBJECTVALUE1, 29, 1) = 'W' THEN 'Do While'&lt;br /&gt;                            WHEN SUBSTRING(OBJECTVALUE1, 29, 1) = 'H' THEN 'Do When'&lt;br /&gt;                            WHEN SUBSTRING(OBJECTVALUE1, 29, 1) = 'N' THEN 'Do Until'&lt;br /&gt;                            Else 'Unknown' END                             &lt;br /&gt;                               WHEN OBJECTVALUE2 = 2 THEN ' '&lt;br /&gt;                               ELSE ' ' END&lt;br /&gt;  WHEN OBJECTTYPE = 38   THEN 'EFFDT: ' + OBJECTVALUE2&lt;br /&gt;  WHEN OBJECTTYPE IN(39, 42, 44)   THEN OBJECTVALUE2&lt;br /&gt;  WHEN OBJECTTYPE = 43   THEN&lt;br /&gt;                         CASE WHEN ltrim(rTRIM(OBJECTVALUE4)) = 'OnExecute' THEN&lt;br /&gt;                                     'Section: ' + SUBSTRING(OBJECTVALUE2, 1, 8) + '; Step: ' +&lt;br /&gt;                                     OBJECTVALUE3 + '; Market: ' + SUBSTRING(OBJECTVALUE2, 9, 3) +&lt;br /&gt;                                     '; Database: ' + ltrim(rTRIM(SUBSTRING(OBJECTVALUE2, 12, 8))) +&lt;br /&gt;                                     '; EFFDT: ' + ltrim(rTRIM(SUBSTRING(OBJECTVALUE2, 21, 10)))&lt;br /&gt;                              ELSE 'Section: ' + OBJECTVALUE2 + '; Market: ' + OBJECTVALUE3&lt;br /&gt;                                       + '; Database: ' + ltrim(rTRIM(SUBSTRING(OBJECTVALUE4, 12, 8))) +&lt;br /&gt;                                       '; EFFDT: ' + ltrim(rTRIM(SUBSTRING(OBJECTVALUE4, 21, 10))) END&lt;br /&gt;  WHEN OBJECTTYPE = 46   THEN 'Market: ' + OBJECTVALUE2 + '; Event: ' + OBJECTVALUE3&lt;br /&gt;  WHEN OBJECTTYPE = 47   THEN 'Market: ' + OBJECTVALUE2 + '; Record: ' + OBJECTVALUE3 + '; Event: ' + OBJECTVALUE4&lt;br /&gt;  WHEN OBJECTTYPE = 48   THEN 'Market: ' + OBJECTVALUE2 + '; Record: ' + OBJECTVALUE3&lt;br /&gt;                                         + '; Field: ' + ltrim(rTRIM(SUBSTRING(OBJECTVALUE4, 1, 18)))&lt;br /&gt;                                         + '; Event: ' + ltrim(rTRIM(SUBSTRING(OBJECTVALUE4, 19, 16)))&lt;br /&gt;  WHEN OBJECTTYPE = 55   THEN&lt;br /&gt;                         CASE WHEN ltrim(rtrim(OBJECTVALUE2)) = 'C' THEN 'CREF: ' ELSE 'Folder: ' END + OBJECTVALUE3&lt;br /&gt;  WHEN OBJECTTYPE = 57   THEN&lt;br /&gt;                         CASE WHEN ltrim(rTRIM(OBJECTVALUE4)) NOT IN(' ', ':', '.') THEN&lt;br /&gt;                                  'Subclass: ' + ltrim(rTRIM(OBJECTVALUE2)) + ':' + ltrim(rTRIM(OBJECTVALUE3))&lt;br /&gt;                                   + ':' + ltrim(rTRIM(OBJECTVALUE4))&lt;br /&gt;                              ELSE&lt;br /&gt;                                 CASE WHEN ltrim(rTRIM(OBJECTVALUE3)) NOT IN(' ', ':', '.') THEN&lt;br /&gt;                                           'Subclass: ' + ltrim(rTRIM(OBJECTVALUE2)) + ':' +&lt;br /&gt;                                           ltrim(rTRIM(OBJECTVALUE3))&lt;br /&gt;                                     ELSE&lt;br /&gt;                                         CASE WHEN ltrim(rTRIM(OBJECTVALUE2)) NOT IN(' ', ':', '.') THEN&lt;br /&gt;                                                  'Subclass: ' +  ltrim(rTRIM(OBJECTVALUE2))&lt;br /&gt;                                              ELSE ' '&lt;br /&gt;                                         END&lt;br /&gt;                                 END&lt;br /&gt;                         END&lt;br /&gt;  WHEN OBJECTTYPE IN(58, 63, 68, 81, 82, 83, 87, 88) THEN&lt;br /&gt;                         CASE WHEN ltrim(rTRIM(OBJECTVALUE4)) IS NOT NULL THEN&lt;br /&gt;                                   ltrim(rTRIM(OBJECTVALUE2)) + '.' + ltrim(rTRIM(OBJECTVALUE3))  + '.'&lt;br /&gt;                                   + ltrim(rTRIM(OBJECTVALUE4))&lt;br /&gt;                              ELSE&lt;br /&gt;                                  CASE WHEN ltrim(rTRIM(OBJECTVALUE3)) IS NOT NULL THEN&lt;br /&gt;                                            ltrim(rTRIM(OBJECTVALUE2)) + '.' + ltrim(rTRIM(OBJECTVALUE3))&lt;br /&gt;                                  ELSE&lt;br /&gt;                                      CASE WHEN ltrim(rTRIM(OBJECTVALUE2)) IS NOT NULL THEN&lt;br /&gt;                                                ltrim(rTRIM(OBJECTVALUE2))&lt;br /&gt;                                           ELSE ' '&lt;br /&gt;                                      END&lt;br /&gt;                                  END&lt;br /&gt;                              END&lt;br /&gt;  WHEN OBJECTTYPE = 59   THEN ltrim(rTRIM(OBJECTVALUE2))&lt;br /&gt;  WHEN OBJECTTYPE = 62   THEN 'AE Progam: ' + SUBSTRING(OBJECTVALUE1, 1, 12) + '  Section: ' +&lt;br /&gt;                              SUBSTRING(OBJECTVALUE1, 13, 8) + '  Step: ' + SUBSTRING(OBJECTVALUE1, 21, 8)&lt;br /&gt;  ELSE ' ' END AS EXTENDED_OBJ_NAME, &lt;br /&gt;  CASE OBJECTTYPE&lt;br /&gt;  WHEN 0    THEN ISNULL((SELECT RECDESCR FROM PSRECDEFN WHERE RECNAME = I.OBJECTVALUE1), ' ')&lt;br /&gt;  WHEN 1    THEN ISNULL((SELECT IDXCOMMENTS FROM PSINDEXDEFN WHERE RECNAME = I.OBJECTVALUE1 AND INDEXID = I.OBJECTVALUE2), ' ')&lt;br /&gt;  WHEN 2    THEN ISNULL((SELECT DESCRLONG FROM PSDBFIELD WHERE FIELDNAME = I.OBJECTVALUE1), ' ')&lt;br /&gt;  WHEN 3    THEN ISNULL((SELECT DESCR FROM PSFMTDEFN WHERE FORMATFAMILY = I.OBJECTVALUE1), ' ')&lt;br /&gt;  WHEN 5    THEN ISNULL((SELECT DESCR FROM PSPNLDEFN WHERE PNLNAME = I.OBJECTVALUE1), ' ')&lt;br /&gt;  WHEN 6    THEN ISNULL((SELECT DESCR FROM PSMENUDEFN WHERE MENUNAME = I.OBJECTVALUE1), ' ')&lt;br /&gt;  WHEN 7    THEN ISNULL((SELECT DESCR FROM PSPNLGRPDEFN WHERE PNLGRPNAME = I.OBJECTVALUE1 AND MARKET = I.OBJECTVALUE2), ' ')&lt;br /&gt;  WHEN 10   THEN ISNULL((SELECT DESCR FROM PSQRYDEFN WHERE QRYNAME = I.OBJECTVALUE1), ' ')&lt;br /&gt;  WHEN 12   THEN ISNULL((SELECT DESCR FROM PSTREEDEFN WHERE TREE_NAME = I.OBJECTVALUE3), ' ')&lt;br /&gt;  WHEN 13   THEN ISNULL((SELECT DESCR FROM PS_ACCESS_GRP_TBL WHERE ACCESS_GROUP = I.OBJECTVALUE1), ' ')&lt;br /&gt;  WHEN 17   THEN ISNULL((SELECT DESCR60 FROM PSBUSPROCDEFN WHERE BUSPROCNAME = I.OBJECTVALUE1), ' ')&lt;br /&gt;  WHEN 18   THEN ISNULL((SELECT DESCR60 FROM PSACTIVITYDEFN WHERE ACTIVITYNAME = I.OBJECTVALUE1), ' ')&lt;br /&gt;  WHEN 19   THEN ISNULL((SELECT DESCR FROM PSROLEDEFN WHERE ROLENAME = I.OBJECTVALUE1), ' ')&lt;br /&gt;  WHEN 20   THEN ISNULL((SELECT DESCR FROM PS_PRCSDEFN WHERE PRCSTYPE = I.OBJECTVALUE1 AND PRCSNAME = I.OBJECTVALUE2), ' ')&lt;br /&gt;  WHEN 23   THEN ISNULL((SELECT DESCR FROM PS_PRCSJOBDEFN WHERE PRCSJOBNAME = I.OBJECTVALUE1), ' ')&lt;br /&gt;  WHEN 21   THEN ISNULL((SELECT DESCR FROM PS_SERVERDEFN WHERE SERVERNAME = I.OBJECTVALUE1), ' ')&lt;br /&gt;  WHEN 25   THEN ISNULL((SELECT MESSAGE_TEXT FROM PSMSGCATDEFN WHERE MESSAGE_SET_NBR = I.OBJECTVALUE1 AND MESSAGE_NBR = I.OBJECTVALUE2), ' ')&lt;br /&gt;  WHEN 31   THEN ISNULL((SELECT DESCR FROM PSFLDDEFN WHERE FLDDEFNNAME = I.OBJECTVALUE1), ' ')&lt;br /&gt;  WHEN 32   THEN ISNULL((SELECT DESCR FROM PSBCDEFN WHERE BCNAME = I.OBJECTVALUE1), ' ')&lt;br /&gt;  WHEN 33   THEN ISNULL((SELECT DESCR FROM PSAEAPPLDEFN WHERE AE_APPLID = I.OBJECTVALUE1), ' ')&lt;br /&gt;  WHEN 34   THEN ISNULL((SELECT TOP 1 DESCR FROM PSAESECTDTLDEFN WHERE AE_APPLID = I.OBJECTVALUE1 AND AE_SECTION = I.OBJECTVALUE2), ' ')&lt;br /&gt;  WHEN 53   THEN ISNULL((SELECT CLASSDEFNDESC FROM PSCLASSDEFN WHERE CLASSID = I.OBJECTVALUE1), ' ')&lt;br /&gt;  WHEN 56   THEN ISNULL((SELECT URL FROM PSURLDEFN WHERE URL_ID = I.OBJECTVALUE1), ' ')&lt;br /&gt;  ELSE ' ' END AS DESCR&lt;br /&gt;FROM PSPROJECTITEM I&lt;br /&gt;WHERE PROJECTNAME = 'PPLTLS84CUR'&lt;br /&gt;ORDER BY OBJECTTYPE, 2, OBJECTVALUE1, OBJECTVALUE2, OBJECTVALUE3, OBJECTVALUE4&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6255223495642099089-1804852811887901389?l=psftpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://psftpp.blogspot.com/feeds/1804852811887901389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6255223495642099089&amp;postID=1804852811887901389' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/1804852811887901389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/1804852811887901389'/><link rel='alternate' type='text/html' href='http://psftpp.blogspot.com/2010/04/handy-sqls.html' title='Handy SQLs &amp; PeopleCode'/><author><name>Ciphersbak</name><uri>http://www.blogger.com/profile/01586158446874473262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://bp3.blogger.com/_us1mHob_dps/SB9X-oWAiLI/AAAAAAAAAsc/03Zt108NYoA/S220/2068438.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6255223495642099089.post-8544366813825279074</id><published>2009-07-20T00:02:00.008+05:30</published><updated>2010-05-11T12:14:56.347+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Logging'/><category scheme='http://www.blogger.com/atom/ns#' term='Application Engine'/><title type='text'>RealTime Message Log</title><content type='html'>&lt;div style="text-align: justify;"&gt;Most of us have gone through the pain of switching windows while debugging our Batch programs especially Application Engines (&lt;span style="font-weight: bold;"&gt;Actual Sequence - Click Run -&gt; Click OK -&gt; Click Process Monitor -&gt; Now Like a !#! keep clicking the Refresh Button or switch between details/message log and Process Monitor - So frustrating&lt;/span&gt;). It would have been a lot easier had PS provided a refresh button on the message log page.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;The Vanilla run control page for Voucher Build process has a solution to this problem. It has 2 delivered pages which the user can use to view the message log and actually refresh it whenever he/she wants it. Better than navigating to the Process Monitor page and waiting for the process to finish.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;I also came across PS delivered Component AE_LOG which is on the same lines. The design is far better than the existing one. It can even show you the Trace/Message Log for the current and previous process instances for the OPRID/RUN_CNTL_ID combination, but the only limitation I feel is that, it presently only looks at the AE Request component.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;I'm currently working on a page that combines both these functionalities. Once completed this can be extended to all custom run control components we create. Presently I'm testing this for Application Engines only (I HATE SQR's).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;All that the developer needs to ensure is that:&lt;br /&gt;&lt;br /&gt;1. Copy a bit of PeopleCode to import this functionality, and&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;2. Insert this page in his/her Run Control Component. All that is now required is to run the process and navigate to the this page rather than the process monitor page, as this will show you Real Time Message Logs.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Also trying to identify whether these reports will be accessible from the Run Control Page after the PRCSYSPURGE is run.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;I'll post more on this once I'm done&lt;br /&gt;&lt;br /&gt;Cheerz!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6255223495642099089-8544366813825279074?l=psftpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://psftpp.blogspot.com/feeds/8544366813825279074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6255223495642099089&amp;postID=8544366813825279074' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/8544366813825279074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/8544366813825279074'/><link rel='alternate' type='text/html' href='http://psftpp.blogspot.com/2009/07/realtime-message-log.html' title='RealTime Message Log'/><author><name>Ciphersbak</name><uri>http://www.blogger.com/profile/01586158446874473262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://bp3.blogger.com/_us1mHob_dps/SB9X-oWAiLI/AAAAAAAAAsc/03Zt108NYoA/S220/2068438.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6255223495642099089.post-392986620119161329</id><published>2009-07-19T23:54:00.006+05:30</published><updated>2010-04-14T13:46:25.530+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Application Package'/><title type='text'>The App Package TR</title><content type='html'>&lt;div style="text-align: justify;"&gt;This is by far one of the better App Packages that PS delivers in FSCM. Under the Package FileUtilities there are 2 App Classes FTP &amp;amp; Files.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;The app class &lt;span style="font-weight: bold; font-style: italic;"&gt;Files&lt;/span&gt; contains certain methods which are written in a very refined and polished manner. For example the method &lt;span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);"&gt;GetFileAsString&lt;/span&gt; is used to read a file in exactly the same manner in which it is stored in the File System. To do this PS does not use PeopleCode. Instead it uses JAVA, since it can retrieve the file in the same exact manner. Also, what one must note is that the method does take into account of reading/opening of large files as it has a check for the chunk size to prevent the dreaded Out of memory error.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;What is also strange is that even though PS provides a Function FindFiles() to retrieve all the files Names as string from a directory, it does not use it in the method &lt;span style="font-weight: bold; color: rgb(255, 0, 0); font-style: italic;"&gt;GetFileList&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;The method &lt;span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);"&gt;LoadCleanFile&lt;/span&gt; is also useful when you are trying to read through plain text files with out using a File Layout.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;This app package also contains certain interesting utilities under the Package &lt;span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);"&gt;Utilities&lt;/span&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6255223495642099089-392986620119161329?l=psftpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://psftpp.blogspot.com/feeds/392986620119161329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6255223495642099089&amp;postID=392986620119161329' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/392986620119161329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/392986620119161329'/><link rel='alternate' type='text/html' href='http://psftpp.blogspot.com/2009/07/app-package-tr.html' title='The App Package TR'/><author><name>Ciphersbak</name><uri>http://www.blogger.com/profile/01586158446874473262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://bp3.blogger.com/_us1mHob_dps/SB9X-oWAiLI/AAAAAAAAAsc/03Zt108NYoA/S220/2068438.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6255223495642099089.post-3158949028159215581</id><published>2009-07-19T23:39:00.008+05:30</published><updated>2010-04-14T13:46:06.555+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='DMS'/><title type='text'>Run DMS in Regular/Bootstrap mode from PIA</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ever wondered if you could run DMS scripts from PIA in regular mode.&lt;br /&gt;&lt;br /&gt;Well PS does deliver a Process Type of Data Mover, but I've rarely seen it being used.&lt;br /&gt;PS itself delivers a page to run the DMS from PIA in regular mode, but it can only be a single DMS file.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I extended that solution to suit my needs. Have the user upload (DMS)  as many as he/she wants and can then run DMS scripts in Regular/Bootstrap mode through the PIA. The DAT generated can then be downloaded from the View/Log Trace link and then can be emailed through the same page to the PSAdmins (You could even send it through your official mail. But what the @#@ I wanted the user to send it from the same page). The attachment functionality though commonly used by many people,  is always written by the developers. Rarely have I seen people using the delivered functionality. In FSCM PS delivers a generic Attachment functionality which covers the Life cycle of attachments. The App Class that has to use to achieve this is&lt;span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);"&gt; SCM_ARCH_ATTACH:UI:AttachmentHandler&lt;/span&gt;. The exhaustive comments in the class clearly detail what needs to be done by the developers to use it. It absolutely eliminates the need for users to write their own code. I really wouldn't repeat the steps out in my blog. I would suggest you go through the class and try it out.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The process type DATA Mover will always run in Regular mode since the command line always takes the &lt;span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);"&gt;%%OPRID%%&lt;/span&gt; and&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);"&gt;%%OPRPSWD%%&lt;/span&gt;, however, if you choose &lt;span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);"&gt;%%ACCESSID%%&lt;/span&gt; and &lt;span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);"&gt;%%ACCESSPSWD%%&lt;/span&gt;, then you can essentially log in in Bootstrap mode through the PIA. For this I suggest create a new Process Type rather than changing the existing one and for the new Process Type set the command line as&lt;br /&gt;"&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);"&gt;-CT %%DBTYPE%% -CD %%DBNAME%% -CO %%ACCESSID%% -CP %%ACCESSPSWD%% -I %%INSTANCE%%&lt;/span&gt;"&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Once done open the Process Definition and set the following for the PARMLIST - "&lt;span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);"&gt;-FP :Your run control record name.FieldName - which will store the file name&lt;/span&gt;"&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;One very good thing about all this is that the user need not write any code for error logging as internally PS calls psdmtx.exe, hence all the error logging will be identical to the way Data mover logs error.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;And the best part - The DAT &amp;amp; Log file(s) are attached automatically in the View/Log Trace. So the user irrespective of the SET OUTPUT &amp;amp; SET LOG commands can view/download the DAT files from the process monitor.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Another good part about all this is that the page allows the user to &lt;span style="font-style: italic; color: rgb(255, 0, 0);"&gt;simulate the DMS&lt;/span&gt;. This is what the SET NO DATA command does. It will run through the entire script but will neither export nor import, hence, no DB changes. So in case you have huge DMS files uploaded by the user and you are not too comfortable with the DDL and DML statements, you can Simulate the DMS&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_us1mHob_dps/SmNwMCsSHzI/AAAAAAAABBM/KknovcZ3iI0/s1600-h/RunDMS.GIF"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 155px;" src="http://4.bp.blogspot.com/_us1mHob_dps/SmNwMCsSHzI/AAAAAAAABBM/KknovcZ3iI0/s320/RunDMS.GIF" alt="" id="BLOGGER_PHOTO_ID_5360251333684371250" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6255223495642099089-3158949028159215581?l=psftpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://psftpp.blogspot.com/feeds/3158949028159215581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6255223495642099089&amp;postID=3158949028159215581' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/3158949028159215581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/3158949028159215581'/><link rel='alternate' type='text/html' href='http://psftpp.blogspot.com/2009/07/run-dms-in-regularbootstrap-mode-from.html' title='Run DMS in Regular/Bootstrap mode from PIA'/><author><name>Ciphersbak</name><uri>http://www.blogger.com/profile/01586158446874473262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://bp3.blogger.com/_us1mHob_dps/SB9X-oWAiLI/AAAAAAAAAsc/03Zt108NYoA/S220/2068438.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_us1mHob_dps/SmNwMCsSHzI/AAAAAAAABBM/KknovcZ3iI0/s72-c/RunDMS.GIF' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6255223495642099089.post-4190026489214652686</id><published>2009-07-19T23:11:00.008+05:30</published><updated>2010-04-14T13:45:54.294+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='metadata API'/><title type='text'>PeopleSoft's metadata API</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ever stumbled across a familiar statement&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;import %metadata:*;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Well PS itself rarely uses this. I was lucky enough to realize its potential during a Apps/Tools upgrade. We were moving from FSCM 8/8.21 to FSCM 8.9/8.48.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;This metadata API has not been documented anywhere in PeopleBooks. I feel this is by far the most robust API that PS has delivered till date. I actually went ahead and used this API as pilot to see the real benefits of it. The custom solution was designed to create PS Projects and migrate them from PIA itself. Though the script used to compare (Pre/Post) and migrate the project was courtesy &lt;span style="font-weight: bold;"&gt;Written by Praj Basnet &amp;amp; Copyright 2008  &lt;/span&gt;&lt;span&gt;the custom solution is totally original :)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The API can be extended as follows&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);"&gt;import %metadata:ProjectDefn:*;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);"&gt;import %metadata:RecordDefn:*;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;I only tried it for a few more objects, but  you realize it can be similarly extended for all other DEFN Tables (PeopleTools definition tables used for PS Objects)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;What is important to note is that to use this API you need to make sure you keep the following in mind&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt; For all imports like above, you need to define a &lt;span style="font-weight: bold;"&gt;manager object&lt;/span&gt;:&lt;/li&gt;&lt;/ol&gt;          For example - &lt;span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);"&gt;&amp;amp;mgr = create %metadata:ProjectDefn:ProjectDefn_Manager();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);"&gt;                          &amp;amp;mgrRec_ = create %metadata:RecordDefn:RecordDefn_Manager();&lt;/span&gt;&lt;br /&gt;   2.  A similar property also needs to be defined:&lt;br /&gt;&lt;br /&gt;        For example - &lt;span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);"&gt;property %metadata:ProjectDefn:ProjectDefn_Manager mgr;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);"&gt;                         property %metadata:RecordDefn:RecordDefn_Manager mgrRec_;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can then define your own methods like&lt;br /&gt;&lt;br /&gt;1. insertAppPackage&lt;br /&gt;2. insertRecord&lt;br /&gt;3. insertAE&lt;br /&gt;&lt;br /&gt;and so on to cover all/some PS Objects&lt;br /&gt;&lt;br /&gt;But the most important of all methods is the &lt;span style="font-weight: bold; color: rgb(51, 51, 255); font-style: italic;"&gt;insertItemToProject&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;Every method for an object will ultimately call this method. PS stores the values in PSPROJECTITEM as OBJECTVALUE#'s. The exhaustive list of the objects till date can be found at&lt;br /&gt;&lt;/div&gt;&lt;a href="http://jmcmahon33.blogspot.com/2007/12/objects-within-peoplesoft-projects.html"&gt;http://jmcmahon33.blogspot.com/2007/12/objects-within-peoplesoft-projects.html&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Some very basic PeopleCode to get you started -&lt;br /&gt;/******************************************/&lt;br /&gt;import %metadata:*;&lt;br /&gt;import %metadata:ProjectDefn:*;&lt;br /&gt;import %metadata:RecordDefn:*;&lt;br /&gt;&lt;br /&gt;class PPProject&lt;br /&gt;method PPProject();&lt;br /&gt;method CreateProject();&lt;br /&gt;method insertItemToProject(&amp;amp;iObjectType As integer, &amp;amp;iObjectID0 As integer, &amp;amp;sObjectValue0 As string, &amp;amp;iObjectID1 As integer, &amp;amp;sObjectValue1 As string, &amp;amp;iObjectID2 As integer, &amp;amp;sObjectValue2 As string, &amp;amp;iObjectID3 As integer, &amp;amp;sObjectValue3 As string, &amp;amp;iUpgradeAction As integer, &amp;amp;defn As %metadata:ProjectDefn:ProjectDefn);&lt;br /&gt;method insertAE(&amp;amp;sAEProgramName As string);&lt;br /&gt;method insertRecord(&amp;amp;sRecordName As string);&lt;br /&gt;method insertAppPackage(&amp;amp;sAppPackage As string);&lt;br /&gt;method initializeProjects();&lt;br /&gt;method getProject(&amp;amp;sProjectName As string) Returns %metadata:ProjectDefn:ProjectDefn;&lt;br /&gt;method getRecordDoNotUse(&amp;amp;sRecordName As string) Returns %metadata:RecordDefn:RecordDefn;&lt;br /&gt;property string sCreateProject;&lt;br /&gt;property %metadata:ProjectDefn:ProjectDefn_Manager mgr;&lt;br /&gt;property %metadata:RecordDefn:RecordDefn_Manager mgrRec_;&lt;br /&gt;end-class;&lt;br /&gt;&lt;br /&gt;method PPProject&lt;br /&gt;&amp;amp;mgr = create %metadata:ProjectDefn:ProjectDefn_Manager();&lt;br /&gt;&amp;amp;mgrRec_ = create %metadata:RecordDefn:RecordDefn_Manager();&lt;br /&gt;rem &amp;amp;sCreateProject = "PTPATCHIBCONVERT";&lt;br /&gt;%This.CreateProject();&lt;br /&gt;end-method;&lt;br /&gt;&lt;br /&gt;method CreateProject&lt;br /&gt;&lt;br /&gt;rem this class will be used to create Projects in App Designer;&lt;br /&gt;&amp;amp;sCreateProject = Z_LONG_TBL.EMPLID.Value;&lt;br /&gt;MessageBox(0, "", 0, 0, "&amp;amp;ProjectName_ " | &amp;amp;sCreateProject);&lt;br /&gt;&lt;br /&gt;end-method;&lt;br /&gt;&lt;br /&gt;method insertItemToProject&lt;br /&gt;/+ &amp;amp;iObjectType as Integer, +/&lt;br /&gt;/+ &amp;amp;iObjectID0 as Integer, +/&lt;br /&gt;/+ &amp;amp;sObjectValue0 as String, +/&lt;br /&gt;/+ &amp;amp;iObjectID1 as Integer, +/&lt;br /&gt;/+ &amp;amp;sObjectValue1 as String, +/&lt;br /&gt;/+ &amp;amp;iObjectID2 as Integer, +/&lt;br /&gt;/+ &amp;amp;sObjectValue2 as String, +/&lt;br /&gt;/+ &amp;amp;iObjectID3 as Integer, +/&lt;br /&gt;/+ &amp;amp;sObjectValue3 as String, +/&lt;br /&gt;/+ &amp;amp;iUpgradeAction as Integer, +/&lt;br /&gt;/+ &amp;amp;defn as %Metadata:ProjectDefn:ProjectDefn +/&lt;br /&gt;&lt;br /&gt;Local string &amp;sProjectName;&lt;br /&gt;&lt;br /&gt;/*Check to see if the item already exists in the project , modified the select to query only basd on keys*/&lt;br /&gt;rem SQLExec("SELECT PROJECTNAME FROM PSPROJECTITEM WHERE PROJECTNAME = :1 AND OBJECTTYPE = :2 AND OBJECTID1 = :3 AND OBJECTVALUE1 = :4 AND OBJECTID2 = :5 AND OBJECTVALUE2 = :6 AND OBJECTID3 = :7 AND OBJECTVALUE3 = :8", &amp;amp;defn.ProjectName, &amp;amp;iObjectType, &amp;amp;iObjectID0, &amp;amp;sObjectValue0, &amp;amp;iObjectID1, &amp;amp;sObjectValue1, &amp;amp;iObjectID2, &amp;amp;sObjectValue2, &amp;amp;sProjectName);&lt;br /&gt;SQLExec("SELECT PROJECTNAME FROM PSPROJECTITEM WHERE PROJECTNAME = :1 AND OBJECTTYPE = :2  AND OBJECTVALUE1 = :3  AND OBJECTVALUE2 = :4 AND OBJECTVALUE3 = :5", &amp;amp;defn.ProjectName, &amp;amp;iObjectType, &amp;amp;sObjectValue0, &amp;amp;sObjectValue1, &amp;amp;sObjectValue2, &amp;amp;sProjectName);&lt;br /&gt;&lt;br /&gt;If &amp;amp;sProjectName &lt;&gt; "" Then&lt;br /&gt;   Return;&lt;br /&gt;End-If;&lt;br /&gt;&lt;br /&gt;Local %metadata:ProjectDefn:PjmPit &amp;newPit;&lt;br /&gt;&lt;br /&gt;Local integer &amp;amp;iCount = &amp;amp;defn.Count_Pit;&lt;br /&gt;&lt;br /&gt;&amp;amp;newPit = &amp;amp;defn.Append_Pit(&amp;amp;iCount);&lt;br /&gt;&amp;amp;newPit.ObjectType = &amp;iObjectType;&lt;br /&gt;&amp;amp;newPit.ObjectID#0# = &amp;iObjectID0;&lt;br /&gt;&amp;amp;newPit.ObjectValue#0# = &amp;sObjectValue0;&lt;br /&gt;&amp;amp;newPit.ObjectID#1# = &amp;iObjectID1;&lt;br /&gt;&amp;amp;newPit.ObjectValue#1# = &amp;sObjectValue1;&lt;br /&gt;&amp;amp;newPit.ObjectID#2# = &amp;iObjectID2;&lt;br /&gt;&amp;amp;newPit.ObjectValue#2# = &amp;sObjectValue2;&lt;br /&gt;&amp;amp;newPit.ObjectID#3# = &amp;iObjectID3;&lt;br /&gt;&amp;amp;newPit.ObjectValue#3# = &amp;sObjectValue3;&lt;br /&gt;&amp;amp;newPit.TakeAction = True;&lt;br /&gt;/* 1 for Delete, 0 for Copy */&lt;br /&gt;&amp;amp;newPit.UpgradeAction = &amp;iUpgradeAction;&lt;br /&gt;&lt;br /&gt;If Not (&amp;amp;defn.UpdateDefn()) Then&lt;br /&gt;   /*Todo throw error */&lt;br /&gt;End-If;&lt;br /&gt;end-method;&lt;br /&gt;&lt;br /&gt;method insertAE&lt;br /&gt;/+ &amp;amp;sAEProgramName as String +/&lt;br /&gt;&lt;br /&gt;If &amp;amp;sCreateProject &lt;&gt; "" Then&lt;br /&gt;   Local %metadata:ProjectDefn:ProjectDefn &amp;defn;&lt;br /&gt;   &amp;amp;defn = %This.getProject(&amp;amp;sCreateProject);&lt;br /&gt;   rem By default insert all related definitions;&lt;br /&gt;   %This.insertItemToProject(33, 66, &amp;amp;sAEProgramName, 0, "", 0, "", 0, "", 0, &amp;amp;defn);&lt;br /&gt;   %This.insertItemToProject(34, 66, &amp;amp;sAEProgramName, 77, "MAIN", 0, "", 0, "", 0, &amp;amp;defn);&lt;br /&gt;   %This.insertItemToProject(43, 66, &amp;amp;sAEProgramName, 77, "MAIN    GBLdefault  1900-01-01", 78, "Step02", 12, "OnExecute", 0, &amp;amp;defn);&lt;br /&gt;End-If;&lt;br /&gt;&lt;br /&gt;end-method;&lt;br /&gt;&lt;br /&gt;method insertRecord&lt;br /&gt;/+ &amp;amp;sRecordName as String +/&lt;br /&gt;&lt;br /&gt;If &amp;amp;sCreateProject &lt;&gt; "" Then&lt;br /&gt;   Local %metadata:ProjectDefn:ProjectDefn &amp;defn;&lt;br /&gt;   Local %metadata:RecordDefn:RecordDefn &amp;amp;Recdefn_;&lt;br /&gt;   &amp;amp;defn = %This.getProject(&amp;amp;sCreateProject);&lt;br /&gt;   &amp;amp;Recdefn_ = %This.getRecordDoNotUse(&amp;amp;sRecordName);&lt;br /&gt;   rem &amp;amp;Recdefn_.RecDescr = "AE REN State Record";&lt;br /&gt;   %This.insertItemToProject(0, 1, &amp;amp;sRecordName, 0, "", 0, "", 0, "", 0, &amp;amp;defn);&lt;br /&gt;   %This.insertItemToProject(8, 1, &amp;amp;sRecordName, 0, "", 0, "", 0, "", 0, &amp;amp;defn);&lt;br /&gt;End-If;&lt;br /&gt;&lt;br /&gt;end-method;&lt;br /&gt;&lt;br /&gt;method insertAppPackage&lt;br /&gt;/+ &amp;amp;sAppPackage as String +/&lt;br /&gt;&lt;br /&gt;Local string &amp;amp;AppClassID_, &amp;amp;PckgRoot_, &amp;amp;QlfyPath_, &amp;amp;QlfyPath1_;&lt;br /&gt;If &amp;amp;sCreateProject &lt;&gt; "" Then&lt;br /&gt;   Local %metadata:ProjectDefn:ProjectDefn &amp;defn;&lt;br /&gt;   &amp;amp;defn = %This.getProject(&amp;amp;sCreateProject);&lt;br /&gt;   rem Ideally queries should be used to retrieve the defns from Object Defn Tables;&lt;br /&gt;   Local string &amp;amp;AppPackageSQL_ = "SELECT PACKAGEROOT, QUALIFYPATH FROM PSPACKAGEDEFN WHERE PACKAGEID = :1";&lt;br /&gt;   Local string &amp;amp;AppClassSQL_ = "SELECT APPCLASSID, PACKAGEROOT, QUALIFYPATH FROM PSAPPCLASSDEFN WHERE PACKAGEROOT = :1";&lt;br /&gt;   SQLExec(&amp;amp;AppPackageSQL_, &amp;amp;sAppPackage, &amp;amp;PckgRoot_, &amp;amp;QlfyPath_);&lt;br /&gt;   SQLExec(&amp;amp;AppClassSQL_, &amp;amp;sAppPackage, &amp;amp;AppClassID_, &amp;amp;PckgRoot_, &amp;amp;QlfyPath1_);&lt;br /&gt;   %This.insertItemToProject(57, 104, &amp;amp;sAppPackage, 116, &amp;amp;PckgRoot_, 117, &amp;amp;QlfyPath_, 0, "", 0, &amp;amp;defn);&lt;br /&gt;   %This.insertItemToProject(58, 104, &amp;amp;sAppPackage, 105, &amp;amp;QlfyPath1_, 107, &amp;amp;AppClassID_, 0, "", 0, &amp;amp;defn);&lt;br /&gt;   /*&lt;br /&gt;   %This.insertItemToProject(57, 104, &amp;amp;sAppPackage, 116, "Z_PSTOKEN", 117, ".", 0, "", 0, &amp;amp;defn);&lt;br /&gt;   %This.insertItemToProject(58, 104, &amp;amp;sAppPackage, 105, "PSToken", 107, "PSTOKEN", 0, "", 0, &amp;amp;defn);&lt;br /&gt;   */&lt;br /&gt;End-If;&lt;br /&gt;&lt;br /&gt;end-method;&lt;br /&gt;&lt;br /&gt;method initializeProjects&lt;br /&gt;Local %metadata:ProjectDefn:ProjectDefn &amp;amp;oCreateDefn, &amp;oDeleteDefn;&lt;br /&gt;&amp;amp;oCreateDefn = %This.getProject(&amp;amp;sCreateProject);&lt;br /&gt;end-method;&lt;br /&gt;&lt;br /&gt;/*******************************************************************************&lt;br /&gt;method:   getProject&lt;br /&gt;purpose:  Checks to see if the project already exists, if not it creates it&lt;br /&gt;*******************************************************************************/&lt;br /&gt;method getProject&lt;br /&gt;/+ &amp;amp;sProjectName as String +/&lt;br /&gt;/+ Returns %Metadata:ProjectDefn:ProjectDefn +/&lt;br /&gt;&lt;br /&gt;Local %metadata:Key &amp;amp;key = create %metadata:Key(Key:Class_Project, &amp;amp;sProjectName);&lt;br /&gt;Local %metadata:ProjectDefn:ProjectDefn &amp;amp;defn = &amp;amp;mgr.GetDefn(&amp;amp;key);&lt;br /&gt;&lt;br /&gt;If Not (&amp;amp;mgr.DefnExists(&amp;amp;key)) Then&lt;br /&gt;&lt;br /&gt;   &amp;amp;defn = &amp;amp;mgr.CreateDefn();&lt;br /&gt;   &amp;amp;defn.ProjectName = &amp;sProjectName;&lt;br /&gt;   &amp;amp;defn.ProjectDescr = "PPs code created project";&lt;br /&gt;   &amp;amp;defn.ReleaseDttm = "2009-04-13 15:52:19.000";&lt;br /&gt;   &amp;amp;defn.ObjectOwnerId = "PPT";&lt;br /&gt;   &amp;amp;defn.DescrLong = "This Project is created by PP's App Package to create Projects in Application Designer";&lt;br /&gt;   &amp;amp;defn.CommitLimit = 50;&lt;br /&gt;   If Not (&amp;amp;defn.SaveNewDefn()) Then&lt;br /&gt;      /*ToDo log error */&lt;br /&gt;   End-If;&lt;br /&gt;   Return &amp;defn;&lt;br /&gt;Else&lt;br /&gt;   Local %metadata:ProjectDefn:ProjectDefn &amp;amp;ProjectDefn = &amp;amp;mgr.GetPrivateDefn(&amp;amp;key);&lt;br /&gt;&lt;br /&gt;   Return &amp;ProjectDefn;&lt;br /&gt;End-If;&lt;br /&gt;end-method;&lt;br /&gt;/******************************************/&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;FYI&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There is a case on metalink3 about %metadata&lt;br /&gt;&lt;a class="linkification-ext" href="https://metalink3.oracle.com/od/faces/secure/km/DocumentDisplay.jspx?id=849911.1" title="Linkification: https://metalink3.oracle.com/od/faces/secure/km/DocumentDisplay.jspx?id=849911.1"&gt;https://metalink3.oracle.com/od/faces/secure/km/DocumentDisplay.jspx?id=849911.1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thanks!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6255223495642099089-4190026489214652686?l=psftpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://psftpp.blogspot.com/feeds/4190026489214652686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6255223495642099089&amp;postID=4190026489214652686' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/4190026489214652686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/4190026489214652686'/><link rel='alternate' type='text/html' href='http://psftpp.blogspot.com/2009/07/peoplesofts-metadata-api.html' title='PeopleSoft&apos;s metadata API'/><author><name>Ciphersbak</name><uri>http://www.blogger.com/profile/01586158446874473262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://bp3.blogger.com/_us1mHob_dps/SB9X-oWAiLI/AAAAAAAAAsc/03Zt108NYoA/S220/2068438.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6255223495642099089.post-7393163222286091177</id><published>2008-06-19T22:30:00.004+05:30</published><updated>2008-06-19T22:36:36.293+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Yahoo Maps for PeopleSoft'/><category scheme='http://www.blogger.com/atom/ns#' term='FSCM 9.0'/><title type='text'>Yahoo Maps for PeopleSoft</title><content type='html'>Its been some time since i visited my own blog...funny but true!!!.&lt;br /&gt;I recently stumbled upon this new feature in FSCM 9.0 for Customers/Vendors, where one can actually view the Customers/vendors address using Yahoo Maps from PeopleSoft...Let us see how...&lt;br /&gt;&lt;br /&gt;Yahoo resolves the address provided, you have entered these 5 fields for an address of any country which can possibly be located by Yahoo...&lt;br /&gt;1. Address1&lt;br /&gt;2. State&lt;br /&gt;3. City&lt;br /&gt;4. Country&lt;br /&gt;5. Postal&lt;br /&gt;&lt;br /&gt;Once this is done you can either place your custom hyper link or check this on Customers General Info page in FSCM 9.0...&lt;br /&gt;Click on View Map and it opens a New Window of Yahoo Maps with the Customers Address...Also trying to see, if i can make use of Google maps in a similar fashion.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6255223495642099089-7393163222286091177?l=psftpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://psftpp.blogspot.com/feeds/7393163222286091177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6255223495642099089&amp;postID=7393163222286091177' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/7393163222286091177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/7393163222286091177'/><link rel='alternate' type='text/html' href='http://psftpp.blogspot.com/2008/06/yahoo-maps-for-peoplesoft.html' title='Yahoo Maps for PeopleSoft'/><author><name>Ciphersbak</name><uri>http://www.blogger.com/profile/01586158446874473262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://bp3.blogger.com/_us1mHob_dps/SB9X-oWAiLI/AAAAAAAAAsc/03Zt108NYoA/S220/2068438.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6255223495642099089.post-1763531861975478614</id><published>2008-05-09T23:39:00.005+05:30</published><updated>2010-04-14T13:45:39.215+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Integration Broker'/><title type='text'>Use Web Services in PS without creating Service/Service Operation/Message and Routings</title><content type='html'>Hi,&lt;br /&gt;I just stumbled upon this very interesting App Package in FSCM 9.0 &gt; "SCM_UTILITIES"...&lt;br /&gt;Its a collection of some really amazing application classes, and over the last few days i was busy trying to use a few them...Of the couple of classes that i used, the best i found was to Integrate with external Web Services (implementing SOAP 1.1/1.2) without having the need to create&lt;br /&gt;1. Service&lt;br /&gt;2. Service Operation&lt;br /&gt;3. Message Defn&lt;br /&gt;4. Node Defn&lt;br /&gt;&lt;br /&gt;One can actually skip creating all these definitions and still integrate with External Web Services.&lt;br /&gt;The trick is to use the delivered App Class "XMLPoster"...&lt;br /&gt;All that is required is...&lt;br /&gt;1. URL (WSDL End Point...SOAP Address Location in WSDL...normally is same for both SOAP1.1/1.2)&lt;br /&gt;2. Request SOAP Structure&lt;br /&gt;3. HTML - This will store the SOAP Request (GETCOUNTRYNAME)&lt;br /&gt;Use the following piece of code to test it out!!!&lt;br /&gt;import SCM_UTILITIES:Integration:XMLPoster;&lt;br /&gt;Local SCM_UTILITIES:Integration:XMLPoster &amp;amp;XMLPost_ = create SCM_UTILITIES:Integration:XMLPoster();&lt;br /&gt;/* SOAPPost */&lt;br /&gt;Local string &amp;amp;TargetUrl_ = "&lt;a href="http://www.oorsprong.org/websamples.countryinfo/CountryInfoService.wso;"&gt;http://www.oorsprong.org/websamples.countryinfo/CountryInfoService.wso;&lt;/a&gt;&lt;br /&gt;Local string &amp;amp;soapstr = GetHTMLText(HTML.GETCOUNTRYNAME);&lt;br /&gt;Local string &amp;amp;SOAPResp_ = &amp;amp;XMLPost_.XMLPost(&amp;amp;TargetUrl_, &amp;amp;soapstr);&lt;br /&gt;MessageBox(0, "", 0, 0, "&amp;amp;SOAPResp_ " &amp;amp;SOAPResp_);&lt;br /&gt;&lt;br /&gt;!!!Happy Integrating!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6255223495642099089-1763531861975478614?l=psftpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://psftpp.blogspot.com/feeds/1763531861975478614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6255223495642099089&amp;postID=1763531861975478614' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/1763531861975478614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/1763531861975478614'/><link rel='alternate' type='text/html' href='http://psftpp.blogspot.com/2008/05/use-web-services-in-ps-without-creating.html' title='Use Web Services in PS without creating Service/Service Operation/Message and Routings'/><author><name>Ciphersbak</name><uri>http://www.blogger.com/profile/01586158446874473262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://bp3.blogger.com/_us1mHob_dps/SB9X-oWAiLI/AAAAAAAAAsc/03Zt108NYoA/S220/2068438.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6255223495642099089.post-8883581578878002498</id><published>2008-04-22T13:43:00.006+05:30</published><updated>2010-04-14T13:45:25.083+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Integration Broker'/><category scheme='http://www.blogger.com/atom/ns#' term='WSDL'/><title type='text'>Consume WSDL's via URL/UDDI - Tools 8.48/8.49</title><content type='html'>Over the past few days i was busy setting up a UDDI Repository for PeopleSoft...When the Repository was finally setup (BEA's Aqualogic Service Registry 3.0), i was excited to consume WSDL's via UDDI...But to my amazement i was unable to consume the WSDL (&lt;a href="http://ws.soatrader.com/easycfm.com/1.0/Captcha?WSDL"&gt;http://ws.soatrader.com/easycfm.com/1.0/Captcha?WSDL&lt;/a&gt;) either via URL/UDDI...After further analysis...&lt;br /&gt;This issue is caused by that we don't support all aspects of schema referencing. -&lt;br /&gt;1. "wsdl:import" statements that point to a external schema doc -&lt;br /&gt;2. "xsd:include" -&lt;br /&gt;3. "xsd:import".&lt;br /&gt;The import wizard will not recurse across nested import statements.&lt;br /&gt;&lt;br /&gt;This however has been refined in Tools 8.50...Interestingly the same WSDL which errored out while i was trying to consume it through UDDI...can be successfully consumed via URL in tools 8.46.19...&lt;br /&gt;Further analysis pointed it out that PeopleSoft uses different App Package(s) for WSDL in tools 8.48...&lt;br /&gt;So the bottom line is - "You would not be able to import WSDL's either via URL/UDDI which reference additional import statements like the ones that have been mentioned above. "&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6255223495642099089-8883581578878002498?l=psftpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://psftpp.blogspot.com/feeds/8883581578878002498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6255223495642099089&amp;postID=8883581578878002498' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/8883581578878002498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/8883581578878002498'/><link rel='alternate' type='text/html' href='http://psftpp.blogspot.com/2008/04/consume-wsdls-via-urluddi-tools-848849.html' title='Consume WSDL&apos;s via URL/UDDI - Tools 8.48/8.49'/><author><name>Ciphersbak</name><uri>http://www.blogger.com/profile/01586158446874473262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://bp3.blogger.com/_us1mHob_dps/SB9X-oWAiLI/AAAAAAAAAsc/03Zt108NYoA/S220/2068438.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6255223495642099089.post-2838339075460517075</id><published>2008-04-09T23:21:00.004+05:30</published><updated>2010-04-14T13:44:59.471+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Integration Broker'/><category scheme='http://www.blogger.com/atom/ns#' term='UDDI'/><title type='text'>PeopleSoft &amp; UDDI Config</title><content type='html'>With the release of PeopleTools 8.48, many of us have come across the Service Configuration page under Integration Broker. Though (Quote) PeopleSoft does not recommend any UDDI server(s) to be used (Unquote), but one can make definitely make use of the wide variety of Open Source (jUDDI) and bundled (Aqualogic Service Registry 3.0) UDDI Registeries.&lt;br /&gt;I did have initial problems configuring jUDDI &amp;amp; BEA's Aqualogic Service Registry, but once configured, we can post the WSDL's to the UDDI respository...&lt;br /&gt;If you also use JDev, then one can discover the installed UDDI Repositories and consume/provide WSDL's from JDev...Its a good option to start with BEA's Aqualogic, but it has a license limitation, the executable avialable for download from &lt;a href="http://www.bea.com/"&gt;http://www.bea.com/&lt;/a&gt; can have a maximum of 150 Business Services registered, and since this being a trial version I'hv another 63 days of free usage. So make sure you choose the best in the lot WSDL's to be posted to the repository...&lt;br /&gt;Happy Discovery and Integration...&lt;br /&gt;Stay tuned for new updates on WSRP 1.0/2.0 in PeopleSoft&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6255223495642099089-2838339075460517075?l=psftpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://psftpp.blogspot.com/feeds/2838339075460517075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6255223495642099089&amp;postID=2838339075460517075' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/2838339075460517075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/2838339075460517075'/><link rel='alternate' type='text/html' href='http://psftpp.blogspot.com/2008/04/peoplesoft-uddi-config.html' title='PeopleSoft &amp; UDDI Config'/><author><name>Ciphersbak</name><uri>http://www.blogger.com/profile/01586158446874473262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://bp3.blogger.com/_us1mHob_dps/SB9X-oWAiLI/AAAAAAAAAsc/03Zt108NYoA/S220/2068438.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6255223495642099089.post-6290248681869708976</id><published>2008-03-02T11:58:00.002+05:30</published><updated>2010-04-14T13:44:40.978+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Integration Broker'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration Engine'/><title type='text'>PeopleSoft's Integration  - ConnectorRequest</title><content type='html'>&lt;span style="font-family:georgia;"&gt;One can actually skip the integration Engine to integrate with Web Services (SOAP 1.1/1.2). PS internally does use it for both Tools and Apps (SCM). A few examples - PS UDDI Config, IB Pagelet config.&lt;br /&gt;&lt;br /&gt;Pros&lt;br /&gt;1. One can avoid setting up Nodes/Routings. Routings being the major culprit in Integration Setups.&lt;br /&gt;2. Also, one does not have to bother about Sync Logging..&lt;br /&gt;3. Best of All, difficult for someone to identify&lt;br /&gt;&lt;br /&gt;Cons&lt;br /&gt;1. Difficult for a person to troubleshoot. But, thats exactly the reason "ConnectorRequest" has been made.&lt;br /&gt;&lt;br /&gt;I have this code running for most of the Web Services available on XMethods and StrikeIron, and works like a Gem&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6255223495642099089-6290248681869708976?l=psftpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://psftpp.blogspot.com/feeds/6290248681869708976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6255223495642099089&amp;postID=6290248681869708976' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/6290248681869708976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/6290248681869708976'/><link rel='alternate' type='text/html' href='http://psftpp.blogspot.com/2008/03/peoplesofts-integration.html' title='PeopleSoft&apos;s Integration  - ConnectorRequest'/><author><name>Ciphersbak</name><uri>http://www.blogger.com/profile/01586158446874473262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://bp3.blogger.com/_us1mHob_dps/SB9X-oWAiLI/AAAAAAAAAsc/03Zt108NYoA/S220/2068438.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6255223495642099089.post-7985132212539696489</id><published>2008-03-02T00:05:00.000+05:30</published><updated>2008-03-02T00:06:15.909+05:30</updated><title type='text'>PSFT_PP</title><content type='html'>Hi,&lt;br /&gt;&lt;br /&gt;!!Welcome!! to my Blog...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6255223495642099089-7985132212539696489?l=psftpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://psftpp.blogspot.com/feeds/7985132212539696489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6255223495642099089&amp;postID=7985132212539696489' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/7985132212539696489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6255223495642099089/posts/default/7985132212539696489'/><link rel='alternate' type='text/html' href='http://psftpp.blogspot.com/2008/03/psftpp.html' title='PSFT_PP'/><author><name>Ciphersbak</name><uri>http://www.blogger.com/profile/01586158446874473262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://bp3.blogger.com/_us1mHob_dps/SB9X-oWAiLI/AAAAAAAAAsc/03Zt108NYoA/S220/2068438.jpg'/></author><thr:total>0</thr:total></entry></feed>
