<?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-6297557</id><updated>2012-02-02T20:26:02.817Z</updated><category term='mobile'/><category term='control'/><category term='javascript'/><category term='tpvs'/><category term='news'/><category term='development'/><category term='apo'/><category term='perl'/><category term='quote'/><category term='apolemia'/><category term='rfc'/><category term='analytics'/><category term='SOA'/><category term='badi'/><category term='pal'/><category term='excel'/><category term='data visualization'/><category term='python'/><category term='rails'/><category term='concept'/><category term='userland'/><category term='saplink'/><category term='code'/><category term='mashup'/><category term='training'/><category term='blogs'/><category term='usability'/><category term='rant'/><category term='debug'/><category term='screen'/><category term='oss'/><category term='lego'/><category term='transaction'/><category term='geocoding'/><category term='java'/><category term='osx mac'/><category term='Funny SAP'/><category term='macros'/><category term='ppds'/><category term='dp'/><category term='scm'/><category term='atp'/><category term='abap'/><category term='enterprise2.0'/><category term='gardena'/><category term='django'/><category term='book'/><category term='sdn'/><category term='tip'/><category term='pass'/><category term='life'/><category term='sap'/><category term='jquery'/><category term='onsap'/><category term='interview'/><category term='web2.0'/><category term='hotoss'/><category term='microsoft'/><category term='modeling'/><category term='fun'/><category term='optimizers'/><category term='bop'/><category term='google'/><title type='text'>Apolemia</title><subtitle type='html'>On SAP SCM/APO, life and tech</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default?start-index=101&amp;max-results=100'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>145</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6297557.post-5594878623974795484</id><published>2012-02-02T16:18:00.003Z</published><updated>2012-02-02T16:24:12.039Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='abap'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><title type='text'>SAP development with jQuery Mobile</title><content type='html'>&lt;p&gt;One of the hot topics for me last year was doing SAP development for mobile platforms. There is a huge quantity and quality of enterprise information inside SAP servers and the new wave of mobile devices opens so many new ways of interacting with that data and business processes. I did not write much on that topic in the blog but on &lt;a href="http://www.onsap.com/"&gt;onsap&lt;/a&gt; you can find &lt;a href="http://www.onsap.com/users/2/pedrolima"&gt;many questions and answers&lt;/a&gt; related to the technologies I was using.&lt;/p&gt;&lt;p&gt;There are many platforms and toolkits for mobile development (and that is a good topic for another blog post that I hope to write one day). My choice of platform is &lt;a href="http://jquerymobile.com/"&gt;jQuery Mobile&lt;/a&gt; for the frontend development and business server pages (BSP) for the backend development. With this stack it is possible to develop solutions using the platforms companies already have (ECC and other solutions based on Netweaver) and using an open toolkit that is evolving quickly and at the same time is stable and tested in a &lt;a href="http://jquerymobile.com/gbs/"&gt;large number of devices&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;As a result of some of that work we, at &lt;a href="http://www.cognitiva.com/"&gt;Cognitiva&lt;/a&gt;, are releasing an &lt;a href="https://bitbucket.org/cogni/mobiweaver"&gt;open-source package&lt;/a&gt; with some utilities to help development of jQuery Mobile on SAP. It includes sample applications like the one show in action in the video below, and it also includes a search help widget that is described in detail in this SDN &lt;a href="http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/28495"&gt;blog post&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;If you have interest in mobile apps give this technology a try. The source code is available in &lt;a href="https://bitbucket.org/cogni/mobiweaver"&gt;this repository&lt;/a&gt; and it is possible to run a demo application with the free &lt;a href="http://www.sdn.sap.com/irj/scn/nw-downloads"&gt;Netweaver developer edition&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;object width="560" height="315"&gt;&lt;param name="movie" value="http://www.youtube.com/v/d11TsqY0p4s?version=3&amp;amp;hl=en_US"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/d11TsqY0p4s?version=3&amp;amp;hl=en_US" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-5594878623974795484?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/5594878623974795484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=5594878623974795484&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/5594878623974795484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/5594878623974795484'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2012/02/sap-development-with-jquery-mobile.html' title='SAP development with jQuery Mobile'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-2554770972788249901</id><published>2012-01-16T17:47:00.007Z</published><updated>2012-01-16T18:02:06.804Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='sap'/><category scheme='http://www.blogger.com/atom/ns#' term='interview'/><title type='text'>Interview with Tamás Holics</title><content type='html'>&lt;p&gt;Tamás Holics is manager at &lt;a href="http://www.hovitaga.com/"&gt;Hovitaga&lt;/a&gt;, a company in Budapest specialized in SAP development that is also bringing to market some SAP add-ons and applications. I asked Tamás if he could share his experience in a short interview, as I think this kind of experience is interesting for many of us running consulting companies or working as freelancers and also trying to market SAP applications or enhancements.&lt;br /&gt;&lt;br /&gt;[PL] Hi Tamás, can you tell us more about you, how you started with SAP and what areas of SAP you currently focus?&lt;br /&gt;&lt;br /&gt;[TH] I joined SAP Labs Budapest in 2006 as a junior ABAP developer. There I was working on IS-Oil projects for about one and a half years. Since then I've gained experience in the insurance industry, especially with the FS-CD module. Currently I work for a manufacturing company where I do ABAP development within core ERP modules like warehouse management, logistics, sales and distribution etc.&lt;br /&gt;&lt;br /&gt;[PL] In parallel with consulting your company is developing SAP applications. What fraction of the time do you invest in app development versus consulting work?&lt;br /&gt;&lt;br /&gt;[TH] That changes very often. There were some months when I could spend 10-12 days on the development of my apps, but lately only a few hours per day in my free time. This is also due to the fact that the activities have shifted from development to marketing.&lt;br /&gt;&lt;br /&gt;[PL] Can you tell us more about the products you are bringing to the market?&lt;br /&gt;&lt;br /&gt;[TH] Our first product was the Hovitaga &lt;a href="http://www.hovitaga.com/opensql-editor-overview"&gt;OpenSQL Editor&lt;/a&gt;, a tool which can execute SQL commands on the fly. The results of SQL queries are displayed immediately by an ALV grid or a hierarchical ALV tree. We've packed a lot of features that help developers to create Select statements quickly. The second product is based on the first one, it is called Hovitaga &lt;a href="http://www.hovitaga.com/report-generator-overview"&gt;Report Generator&lt;/a&gt;. The great feature of it is that it can generate standard SAP reports based on an SQL query. Depending on generation settings, 200-1000+ lines of code can be generated. You can imagine how much time you can spare with this. These tools can cut SAP IT costs by significantly reducing ABAP development, testing and maintenance time.&lt;br /&gt;&lt;br /&gt;Our current development is a radically new kind of business intelligence tool called Hovitaga Data Visualizer. It is unique because it is based on Microsoft Silverligt, but it actually runs in the traditional SAP Gui. It can visualize data coming from SQL statements, ALV reports, SAP Queries (SQ01) or tables and views. The added business value comes from the way how data is presented: instead of a simple ALV list, you can analyze business data with interactive charts, maps, pivot grids, treemaps etc. This product is still in development, we currently seek a pilot customer and/or a development company who would join the development. We have just uploaded the first &lt;a href="http://www.youtube.com/watch?v=MYC66eSSE2w&amp;hd=1"&gt;video&lt;/a&gt; to youtube.&lt;br /&gt;&lt;br /&gt;[PL] How did you come up with the idea of building those applications?&lt;br /&gt;&lt;br /&gt;[TH] The SQL editor was missing from the ABAP workbench:) I decided to write one. Again from a personal experience I wanted  to reduce the amount of repetitive coding so we came up with the Report Generator. As for the Data Visualizer, I was on the opinion that SAP and SAP customers have put so much effort in developing highly complex business logic to extract data from the database (in forms of reports, queries) that it's a shame that the results of them are analyzed with a simple ALV list. Actually none of these products were suggested by any customer. That would have been much easier if a company would have sponsored the development.&lt;br /&gt;&lt;br /&gt;[PL] Do you think the SAP platform is a good foundation for building a company that develops applications? What major strengths and weaknesses did you find?&lt;br /&gt;&lt;br /&gt;[TH] In general it is all right. However if you want to gain exposure, you have to invest a lot of money. Presenting at TechEd or SAPPHIRE Now costs a tens of thousands (USD), advertising in SAP related magazines and websites is also expensive. &lt;br /&gt;&lt;br /&gt;[PL] How do you distribute your applications? Do you use transports, saplink or something else?&lt;br /&gt;&lt;br /&gt;[TH] This depends on what we want to deliver. I think we are the first company in the world (of course I can't be sure) who offer a totally free trial version of their SAP software. Anybody can download a free version of the OpenSQL Editor and Report Generator tools. In order to make the installation even more simple, we have made them "self installing", which means that all you have to do is to copy and paste the downloaded sourcecode into a new report with SE38, activate and execute. It will create the necessary screens, GUI status, messages etc automatically. We consider making a SapLink version also available for download. As for the full version of the products, my experience shows that customers are fine with transport files.&lt;br /&gt;&lt;br /&gt;[PL] Are you planning to use WebDynpro for new developments?&lt;br /&gt;&lt;br /&gt;[TH] No, not at all. I believe not so many customers use it, and it's already an out-of-date technology.&lt;br /&gt;&lt;br /&gt;[PL] That's interesting. How do you see the future of GUI in SAP? Do you think classic Dynpro will be improved or do you think something else will become the SAP GUI of the future?&lt;br /&gt;&lt;br /&gt;[TH] I think the UI will not be unified in the short or middle-term future. The traditional SAP GUI will stay for a very long time, and SAP will continue coming up with new technologies. However I'm not sure if those will get the desired popularity. Maybe if they do something with HTML5. But anyway, new technology is only accepted if it adds something to the business.&lt;br /&gt;&lt;br /&gt;[PL] Are there some new SAP technologies do you think can be particularly interesting to independent developers?&lt;br /&gt;&lt;br /&gt;[TH] Yes, the Netweaver Gateway and mobile applications in general, for example. Nowadays everybody has a smartphone and tablets are very popular these days.&lt;br /&gt;&lt;br /&gt;[PL] What has been your experience with selling the applications to the customers? Do you think companies are open to evaluate applications from independent developers?&lt;br /&gt;&lt;br /&gt;[TH] Our free products have been downloaded more than 500 times since mid of September 2011. This makes me optimistic. Around 20% of website visitors end up downloading a trial product.&lt;br /&gt;&lt;br /&gt;[PL] Can you tell us more about your marketing channels? Do you get many inquiries from the website?&lt;br /&gt;&lt;br /&gt;[TH] Since we've made the free trials available we have received around ten quotes from the website, but I know the purchasing departments of big companies (big enough to run SAP) usually work slowly. If there is a download in January, I expect a quote no sooner than February and an actual purchase not before April. We are considering to place our products in online webshops, but I'm not sure how many visitors and quotes would that add. Naturally this again would cost thousands of Euros per year per product.&lt;br /&gt; &lt;br /&gt;[PL] I know many networks of companies focused on SAP consulting but so far I did not find any network of companies working on SAP applications. Do you know such networks?&lt;br /&gt;&lt;br /&gt;[TH] No, please tell me if you know one :)&lt;br /&gt;&lt;br /&gt;I will keep looking and let you know if I find one :-). Thanks, Tamás for this interview, I think it will be very interesting to many people and it is a great first post of 2012 for apolemia. I hope to have more post related to independent SAP developers during this year.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-2554770972788249901?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/2554770972788249901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=2554770972788249901&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/2554770972788249901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/2554770972788249901'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2012/01/interview-with-tamas-holics.html' title='Interview with Tamás Holics'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-1437402790419938201</id><published>2011-10-04T10:48:00.001+01:00</published><updated>2011-10-04T10:50:14.754+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='abap'/><category scheme='http://www.blogger.com/atom/ns#' term='saplink'/><title type='text'>Using ZAKE to export objects to the filesystem</title><content type='html'>&lt;p&gt;A script to use &lt;a href="http://saplink.org"&gt;ZAKE&lt;/a&gt; to export a package to the filesystem. I'm starting to use ZAKE and SAPLink to synchronize the ABAP repository with the mercurial version control system, so the default SVN object was not good for my goal. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1259508.js?file=z_zake_fs_from_package"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-1437402790419938201?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/1437402790419938201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=1437402790419938201&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/1437402790419938201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/1437402790419938201'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2011/10/using-zake-to-export-objects-to.html' title='Using ZAKE to export objects to the filesystem'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-2937256138854961050</id><published>2011-09-22T11:30:00.002+01:00</published><updated>2011-09-22T11:33:25.509+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='onsap'/><title type='text'>onsap.com update</title><content type='html'>I'm again using &lt;a href="http://www.onsap.com"&gt;onsap.com&lt;/a&gt; to record questions and answers. Now the site allows users to subscribe to email updates of individual questions or tags so it is more useful as a way to follow some topic. I still think it can be a good tool for SAP people. I will keep using it to record my questions (and perhaps later update it with answers) and to learn a bit more from trying to answer other questions. &lt;br /&gt;&lt;br /&gt;You can follow my activity &lt;a href="http://www.onsap.com/users/2/pedrolima"&gt;here&lt;/a&gt; and you're very welcome to &lt;a href="http://www.onsap.com/account/signin/"&gt;join&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-2937256138854961050?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/2937256138854961050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=2937256138854961050&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/2937256138854961050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/2937256138854961050'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2011/09/onsapcom-update.html' title='onsap.com update'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-5301996324208747830</id><published>2011-09-20T11:27:00.003+01:00</published><updated>2011-09-20T11:34:40.276+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='abap'/><title type='text'>Random element from a table in ABAP</title><content type='html'>One function I find myself using a lot in python is random.choice that gives me a random element from a list. Quick example in python:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; import random&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; for i in range(20):&lt;br /&gt;...    print random.choice(['A','B','C','D']),&lt;br /&gt;...&lt;br /&gt;C A D C C D A D C B B B B C B C A C D B&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It turns out it is not that difficult to do the same in ABAP.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;class lcl_random definition.&lt;br /&gt; public section.&lt;br /&gt;   class-methods choice importing it_table type standard table&lt;br /&gt;                        exporting es_row type any.&lt;br /&gt;endclass.&lt;br /&gt;&lt;br /&gt;class lcl_random implementation.&lt;br /&gt; method choice.&lt;br /&gt;   data: l_size type i,&lt;br /&gt;         l_index type i.&lt;br /&gt;&lt;br /&gt;   describe table it_table lines l_size.&lt;br /&gt;&lt;br /&gt;   call function 'QF05_RANDOM_INTEGER'&lt;br /&gt;     exporting&lt;br /&gt;       ran_int_max   = l_size&lt;br /&gt;       ran_int_min   = 1&lt;br /&gt;     importing&lt;br /&gt;       ran_int       = l_index&lt;br /&gt;     exceptions&lt;br /&gt;       invalid_input = 1&lt;br /&gt;       others        = 2.&lt;br /&gt; &lt;br /&gt;   if sy-subrc = 0.&lt;br /&gt;    read table it_table into es_row index l_index.&lt;br /&gt;   endif.&lt;br /&gt; endmethod.                   &lt;br /&gt;endclass.                   &lt;br /&gt;&lt;br /&gt;form test.&lt;br /&gt; data: lt_test type table of char1,&lt;br /&gt;       l_test type char1.&lt;br /&gt;&lt;br /&gt; l_test = 'A'.&lt;br /&gt; append l_test to lt_test.&lt;br /&gt; l_test = 'B'.&lt;br /&gt; append l_test to lt_test.&lt;br /&gt; l_test = 'C'.&lt;br /&gt; append l_test to lt_test.&lt;br /&gt; l_test = 'D'.&lt;br /&gt; append l_test to lt_test.&lt;br /&gt;&lt;br /&gt; do 20 times.&lt;br /&gt;   lcl_random=&amp;gt;choice( exporting it_table = lt_test importing es_row = l_test ).&lt;br /&gt;   write: l_test.&lt;br /&gt; enddo.&lt;br /&gt;endform.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-5301996324208747830?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/5301996324208747830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=5301996324208747830&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/5301996324208747830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/5301996324208747830'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2011/09/random-element-from-table-in-abap.html' title='Random element from a table in ABAP'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-1792652117900081275</id><published>2011-04-12T11:57:00.007+01:00</published><updated>2011-04-12T18:03:32.966+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='abap'/><title type='text'>Test functions in SE37 with commit execution</title><content type='html'>&lt;p&gt;A very simple trick that I only learned recently. A couple of times I faced the situation that I had a function that I could call to solve my problem. I would like to do it in SE37, but the function would need a COMMIT to be called after execution. I thought it was not possible to do in SE37 but it actually is. There is an option to test sequences:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 340px;" src="http://1.bp.blogspot.com/-iLpnejWAoB0/TaSFnvkAwGI/AAAAAAAAAeU/pvxUFPt-PJY/s400/se37a.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5594743554929901666" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;So I just need to put my function and to perform the commit I can use the standard function BAPI_TRANSACTION_COMMIT.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 340px; height: 400px;" src="http://4.bp.blogspot.com/-dLrOA7QNVZU/TaQwz4caY0I/AAAAAAAAAeM/fSmjBgWzRIw/s400/se37b.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5594650304984015682" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-1792652117900081275?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/1792652117900081275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=1792652117900081275&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/1792652117900081275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/1792652117900081275'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2011/04/test-functions-in-se37-with-commit.html' title='Test functions in SE37 with commit execution'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-iLpnejWAoB0/TaSFnvkAwGI/AAAAAAAAAeU/pvxUFPt-PJY/s72-c/se37a.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-5319640197038133890</id><published>2010-10-05T21:24:00.003+01:00</published><updated>2010-10-05T21:29:07.497+01:00</updated><title type='text'>How to see the number of objects in the Live Cache</title><content type='html'>&lt;p&gt;A quite useful report for checking the number of objects in the live cache is /SAPAPO/OM_LVC_OBJECTS. And since I only use it from time to time it's better to write something here so that I don't spend so much time searching for it the next time :-). More on the report in OSS 537210.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 305px;" src="http://4.bp.blogspot.com/_LUNtiAx0Y3E/TKuJ6OPWzMI/AAAAAAAAAbo/vElFr2VYi4k/s400/LC_objects.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5524661001247968450" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-5319640197038133890?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/5319640197038133890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=5319640197038133890&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/5319640197038133890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/5319640197038133890'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2010/10/how-to-see-number-of-objects-in-live.html' title='How to see the number of objects in the Live Cache'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_LUNtiAx0Y3E/TKuJ6OPWzMI/AAAAAAAAAbo/vElFr2VYi4k/s72-c/LC_objects.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-2236738441515696415</id><published>2010-10-05T21:09:00.008+01:00</published><updated>2010-10-05T21:24:03.483+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><title type='text'>Issue with scheduling in delivered sales items</title><content type='html'>&lt;p&gt;Just a note to myself as I know I will have to answer this again. After the sales order item is delivered (even partially) the item is no longer scheduled. So what happens: the material availability date is calculated and all other dates are set equal to the delivery date (see FAQ OSS note 547508 item 2). &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;For example this was the item with correct schedules (the item was partially delivered): &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 360px; height: 52px;" src="http://4.bp.blogspot.com/_LUNtiAx0Y3E/TKuILJJasgI/AAAAAAAAAbQ/3eEvpWlxpYI/s400/img1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5524659092915401218" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 327px; height: 88px;" src="http://1.bp.blogspot.com/_LUNtiAx0Y3E/TKuIazBkUjI/AAAAAAAAAbY/oqi0orqik2I/s400/img2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5524659361854804530" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;And after a change in the item the scheduling becomes:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 327px; height: 89px;" src="http://1.bp.blogspot.com/_LUNtiAx0Y3E/TKuIirhxppI/AAAAAAAAAbg/euFvY0QeYKM/s400/img3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5524659497281365650" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;So the goods issue date is not the most reliable date, better use the delivery date or material availability date. The code responsible for this behavior is in FV45VFMV_MVERF_AUFBAUEN_WMENG line 763.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  [...]&lt;br /&gt;    XVBEP-MBDAT = DA_DATUM.&lt;br /&gt;  ENDIF.                                    &lt;br /&gt;  XVBEP-LDDAT = DA_XVBEP-EDATU.&lt;br /&gt;  XVBEP-TDDAT = DA_XVBEP-EDATU.&lt;br /&gt;  XVBEP-WADAT = DA_XVBEP-EDATU.&lt;br /&gt;  [...]&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;There is a possible fix by applying OSS note 833272, but this note (at least currently) is a special development not something going into support packages.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-2236738441515696415?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/2236738441515696415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=2236738441515696415&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/2236738441515696415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/2236738441515696415'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2010/10/issue-with-scheduling-in-delivered_05.html' title='Issue with scheduling in delivered sales items'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_LUNtiAx0Y3E/TKuILJJasgI/AAAAAAAAAbQ/3eEvpWlxpYI/s72-c/img1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-2896530715043927188</id><published>2010-05-06T15:10:00.000+01:00</published><updated>2010-05-06T15:10:13.453+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Funny SAP'/><title type='text'>Funny SAP: Report /SAPAPO/SDORDER_DEL</title><content type='html'>&lt;div style="text-align: justify;"&gt;The program is useful and executing it in a systematic basis will make the database/livecache cleaner and faster.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_4UG5QDubemo/S-LNosxPfFI/AAAAAAAAABE/WIX70oIfWpg/s1600/SDORDER_DEL.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_4UG5QDubemo/S-LNosxPfFI/AAAAAAAAABE/WIX70oIfWpg/s320/SDORDER_DEL.png" wt="true" /&gt;&lt;/a&gt;&lt;/div&gt;No mercy with old data in SCM the system!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-2896530715043927188?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/2896530715043927188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=2896530715043927188&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/2896530715043927188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/2896530715043927188'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2010/05/funny-sap-report-sapaposdorderdel.html' title='Funny SAP: Report /SAPAPO/SDORDER_DEL'/><author><name>Lima da Silva</name><uri>http://www.blogger.com/profile/11031207537984580818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4UG5QDubemo/S-LNosxPfFI/AAAAAAAAABE/WIX70oIfWpg/s72-c/SDORDER_DEL.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-3602679620344007313</id><published>2010-04-19T22:59:00.004+01:00</published><updated>2010-04-20T17:58:13.019+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><title type='text'>ATP requirement type configuration flowchart</title><content type='html'>Time after time I find myself googling for some of my old posts. Most of the times for ABAP code related posts to copy the program, but I also look often for &lt;a href="http://apolemia.blogspot.com/2006/07/algorithm-for-requirement-typecheck.html"&gt;this one&lt;/a&gt; on the configuration of the requirement type in ATP. I recently created a flowchart with that information for a presentation, so I am now posting it here to make my life easier in the future (click to enlarge).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LUNtiAx0Y3E/S83cOm6XkLI/AAAAAAAAAVM/MYpodHbYzlU/s1600/large_flowchart.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand; " src="http://1.bp.blogspot.com/_LUNtiAx0Y3E/S83cOm6XkLI/AAAAAAAAAVM/MYpodHbYzlU/s400/large_flowchart.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5462264066591920306" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-3602679620344007313?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/3602679620344007313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=3602679620344007313&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/3602679620344007313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/3602679620344007313'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2010/04/atp-requirement-type-configuration.html' title='ATP requirement type configuration flowchart'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_LUNtiAx0Y3E/S83cOm6XkLI/AAAAAAAAAVM/MYpodHbYzlU/s72-c/large_flowchart.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-1531800965627791781</id><published>2010-04-19T22:50:00.005+01:00</published><updated>2010-04-20T17:57:34.652+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debug'/><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><title type='text'>Debugging ATP with print statements</title><content type='html'>I sure did my share of debugging using print statements (in basic, pascal, fortran, C, python, etc). But actually with ABAP that was not a common pattern, mainly because the debugger is so convenient and also because it is not so easy to print. But today I found myself debugging with print statement in global ATP programs and it turns out it can be simple using the ATP log. A short recipe bellow.&lt;br /&gt;&lt;br /&gt;1) Activate the ATP log&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 57px;" src="http://1.bp.blogspot.com/_LUNtiAx0Y3E/S8zRQ-OHztI/AAAAAAAAAU8/x8hsjtSE7zc/s400/print1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5461970537603911378" /&gt;&lt;br /&gt;&lt;br /&gt;2) Report to write to the bound ATP log object a generic message&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;report ylog.&lt;br /&gt;&lt;br /&gt;form print using m2 m3 m4.&lt;br /&gt;  data: l_msgv2 type symsgv,&lt;br /&gt;        l_msgv3 type symsgv,&lt;br /&gt;        l_msgv4 type symsgv.&lt;br /&gt;  l_msgv2 = m2.&lt;br /&gt;  l_msgv3 = m3.&lt;br /&gt;  l_msgv4 = m4.&lt;br /&gt;  if /sapapo/cl_log_atp=&gt;the_log is bound.&lt;br /&gt;    call method /sapapo/cl_log_atp=&gt;the_log-&gt;add_msg&lt;br /&gt;      exporting&lt;br /&gt;        im_msgty     = 'E'&lt;br /&gt;        im_msgid     = '/SAPAPO/AMON'&lt;br /&gt;        im_msgno     = '000'&lt;br /&gt;        im_msgv1     = 'DEBUG&gt;&gt;&gt;'&lt;br /&gt;        im_msgv2     = l_msgv2&lt;br /&gt;        im_msgv3     = l_msgv3&lt;br /&gt;        im_msgv4     = l_msgv4&lt;br /&gt;        im_probclass = 'X'&lt;br /&gt;        im_applclass = 'X'&lt;br /&gt;        im_repid     = sy-repid.&lt;br /&gt;  endif.&lt;br /&gt;endform.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;3) This report allows the writing of print-like statements in the code&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;   perform print(ylog) using 'some text' some_variable other_variable.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;4) It will show in the ATP log screen that opens in the end of the ATP process&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 164px;" src="http://1.bp.blogspot.com/_LUNtiAx0Y3E/S8zRa9vj9HI/AAAAAAAAAVE/SCC3Cm11pcE/s400/print2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5461970709274424434" /&gt;&lt;br /&gt;&lt;br /&gt;It was a quite effective tool for the job. I think I will use this again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-1531800965627791781?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/1531800965627791781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=1531800965627791781&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/1531800965627791781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/1531800965627791781'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2010/04/debugging-atp-with-print-statements.html' title='Debugging ATP with print statements'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_LUNtiAx0Y3E/S8zRQ-OHztI/AAAAAAAAAU8/x8hsjtSE7zc/s72-c/print1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-8664472126942469648</id><published>2010-03-24T17:12:00.003Z</published><updated>2010-03-24T17:15:41.566Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='apolemia'/><title type='text'>Facebook group for apolemia</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LUNtiAx0Y3E/S6pISGfhy1I/AAAAAAAAAUc/MF84tHyF-9A/s1600/Facebook-Buttons-64.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 60px; height: 60px;" src="http://2.bp.blogspot.com/_LUNtiAx0Y3E/S6pISGfhy1I/AAAAAAAAAUc/MF84tHyF-9A/s400/Facebook-Buttons-64.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5452249774703102802" /&gt;&lt;/a&gt;&lt;br /&gt;I thought it might be a good idea to have a facebook group for people sharing the apolemia interests (I mean SAP, APO and ABAP, not the occasional useless ramblings I sometimes post). So if you follow this blog and have a facebook user, consider joining the &lt;a href="http://www.facebook.com/group.php?gid=105314389499254"&gt;apolemia group&lt;/a&gt; to connect and share APO/ABAP magic. Hope to see you there.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.facebook.com/group.php?gid=105314389499254"&gt;Link to join the group&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-8664472126942469648?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/8664472126942469648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=8664472126942469648&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/8664472126942469648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/8664472126942469648'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2010/03/facebook-group-for-apolemia.html' title='Facebook group for apolemia'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_LUNtiAx0Y3E/S6pISGfhy1I/AAAAAAAAAUc/MF84tHyF-9A/s72-c/Facebook-Buttons-64.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-2698663261200897390</id><published>2010-03-22T19:14:00.000Z</published><updated>2010-03-23T19:05:33.815Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='sap'/><category scheme='http://www.blogger.com/atom/ns#' term='abap'/><title type='text'>Finding functions in SAP</title><content type='html'>In SAP world there is usually more than one way to do something. This is true in functional processes where several transactions can perform the same action. It is also true in the development area where one can find in the SAP database several functions that perform the same (or almost the same) action. &lt;br /&gt;&lt;br /&gt;When "shopping" for a function I usually check the number of times the function is used in the standard code. Since this information is available in a table it is easy to build a list the top used functions (in the picture a word map of the top used APO functions without the /SAPAPO/ prefix for easier readability).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LUNtiAx0Y3E/S4qI8ll6x5I/AAAAAAAAATU/Rzi0k7D7_x8/s1600-h/function_map.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 273px;" src="http://1.bp.blogspot.com/_LUNtiAx0Y3E/S4qI8ll6x5I/AAAAAAAAATU/Rzi0k7D7_x8/s400/function_map.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5443313674095347602" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bellow is a minimal report to query the functions and get the usage counter. I think such report is quite useful for day to day work. Consider the following sample case where I want to find a function to display a pop-up message. Using this report I do a query by *POPUP*.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LUNtiAx0Y3E/S6kQNyC7t1I/AAAAAAAAAUU/5aCOEJhOFNU/s1600-h/topused1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 180px;" src="http://2.bp.blogspot.com/_LUNtiAx0Y3E/S6kQNyC7t1I/AAAAAAAAAUU/5aCOEJhOFNU/s400/topused1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5451906652867114834" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It will display __ entries sorted by the number of times that function is used. As there are many possible functions it is nice to know the ones that are more often used, since those are more likely to work better.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LUNtiAx0Y3E/S6kNTeKJP7I/AAAAAAAAAT0/0ZD6QBP5YSs/s1600-h/topused2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 290px; height: 400px;" src="http://2.bp.blogspot.com/_LUNtiAx0Y3E/S6kNTeKJP7I/AAAAAAAAAT0/0ZD6QBP5YSs/s400/topused2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5451903452072984498" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The report code:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;report z_top_used_functions.&lt;br /&gt;&lt;br /&gt;tables cross.&lt;br /&gt;data:&lt;br /&gt;  gt_objs type table of ztopusedfunctions.&lt;br /&gt;&lt;br /&gt;selection-screen begin of block 0 with frame title text-002.&lt;br /&gt;select-options:&lt;br /&gt;  s_name for cross-name.&lt;br /&gt;selection-screen end of block 0.&lt;br /&gt;&lt;br /&gt;selection-screen begin of block 1 with frame title text-001.&lt;br /&gt;parameters:&lt;br /&gt;  p_type like cross-type default 'F',&lt;br /&gt;  p_max  type tbmaxsel default 200.&lt;br /&gt;selection-screen end of block 1.&lt;br /&gt;&lt;br /&gt;start-of-selection.&lt;br /&gt;  clear gt_objs.&lt;br /&gt;  refresh gt_objs.&lt;br /&gt;&lt;br /&gt;  select name count(*) as counter&lt;br /&gt;    from cross&lt;br /&gt;      up to p_max rows&lt;br /&gt;    into table gt_objs&lt;br /&gt;   where type = p_type&lt;br /&gt;     and name in s_name&lt;br /&gt;   group by name&lt;br /&gt;   order by counter descending.&lt;br /&gt;&lt;br /&gt;  call function 'REUSE_ALV_GRID_DISPLAY'&lt;br /&gt;    exporting&lt;br /&gt;      i_structure_name = 'ZTOPUSEDFUNCTIONS'&lt;br /&gt;    tables&lt;br /&gt;      t_outtab         = gt_objs.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The ztopusedfunctions structure is defined as follows.&lt;br /&gt;&lt;br /&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LUNtiAx0Y3E/S6kNtlhbXKI/AAAAAAAAAUE/CvGU_5fCRF8/s1600-h/topused3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 148px;" src="http://1.bp.blogspot.com/_LUNtiAx0Y3E/S6kNtlhbXKI/AAAAAAAAAUE/CvGU_5fCRF8/s400/topused3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5451903900726287522" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Happy coding.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-2698663261200897390?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/2698663261200897390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=2698663261200897390&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/2698663261200897390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/2698663261200897390'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2010/02/finding-functions-in-sap.html' title='Finding functions in SAP'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_LUNtiAx0Y3E/S4qI8ll6x5I/AAAAAAAAATU/Rzi0k7D7_x8/s72-c/function_map.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-4397714850950390055</id><published>2009-10-26T21:52:00.006Z</published><updated>2009-10-26T22:06:00.274Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><category scheme='http://www.blogger.com/atom/ns#' term='badi'/><title type='text'>Hidden BADIs</title><content type='html'>There is a very practical BADI in R3 for developing custom ATP scenarios, named ATP_PUBLISH_RESULTS. But one strange thing is this BADI does not show up in the SE18 queries, for example when doing a query for ATP*. So until recently I did not know about this BADI at all.&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 276px;" src="http://2.bp.blogspot.com/_LUNtiAx0Y3E/SuYb0FNRJAI/AAAAAAAAARU/nCkwWdY2gWM/s400/badi1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5397031785015092226" /&gt;&lt;br /&gt;&lt;br /&gt;But it will show when inputting the full name. &lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 226px;" src="http://2.bp.blogspot.com/_LUNtiAx0Y3E/SuYb_J8JbwI/AAAAAAAAARc/VMEBNxmf5J0/s400/badi2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5397031975264022274" /&gt;&lt;br /&gt;&lt;br /&gt;So why is it hidden in SE18 queries? With some debugging it is easy to see that a F4 query in SE18 will go to table SXS_ATTR with ATP* as the pattern for the EXIT_NAME field and with INTERNAL different from X. It turns out that this INTERNAL field marks the BADI as internal (only to be used by SAP) so it becomes hidden from the F4 query in SE18. &lt;br /&gt;&lt;br /&gt;So next question was: are there many internal BADIs? It turns out there are about 200 in APO and 400 in R3. So I suppose that it is well worth digging on this table if nothing can be found in the “external” BADIs and exits. Although one should avoid using the internal BADIs I suppose it makes a better option than standard code changes or some &lt;a href="http://apolemia.blogspot.com/2009/01/another-spell-for-hacker-book.html"&gt;extreme hacks&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-4397714850950390055?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/4397714850950390055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=4397714850950390055&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/4397714850950390055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/4397714850950390055'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2009/10/hidden-badis.html' title='Hidden BADIs'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_LUNtiAx0Y3E/SuYb0FNRJAI/AAAAAAAAARU/nCkwWdY2gWM/s72-c/badi1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-694598358859784089</id><published>2009-09-23T14:30:00.006+01:00</published><updated>2009-09-23T14:49:43.724+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sap'/><title type='text'>OnSAP.com - questions and answers on SAP topics</title><content type='html'>&lt;center&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.onsap.com"&gt;&lt;img style="display:block; border: 0px; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 280px;" src="http://2.bp.blogspot.com/_LUNtiAx0Y3E/SrolYC4NdsI/AAAAAAAAARM/RZeGjyptOFo/s400/onsap_screen.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5384657399494571714" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;I've been working on SAP for a long time. Of course there is still a lot to learn, but on the specific topics I specialize and focus most of my work on, after some time there is no book or SAP documentation with new knowledge. The best and maybe only way to continue learning is getting new challenges and finding solutions, and learning how other people solved hard problems. &lt;br /&gt;&lt;br /&gt;Internet forums are great places to find good questions and answers. Unfortunately sometimes the forums have too much noise, bad questions and bad answers. One site that I think does the right thing is &lt;a href="http://stackoverflow.com"&gt;stackoverflow&lt;/a&gt;. Although it is a forum, it has some mechanisms to increase visibility of the best questions, give credit to the right answers and to the people that write the good questions and answers. The &lt;a href="http://www.onsap.com"&gt;OnSAP&lt;/a&gt; website tries to be the same for &lt;a href="http://www.onsap.com"&gt;SAP questions and answers&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It is a place where I will post my questions and hopefully my answers when I find them. It starts with a small community but at least on APO and ABAP there will be enough knowledgeable people to make it a good place to discuss hard topics. I also invite all of you to post your questions there, and give some answers if you feel like helping and improving the open knowledge (both the software and the contents of the site are open licensed).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-694598358859784089?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/694598358859784089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=694598358859784089&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/694598358859784089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/694598358859784089'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2009/09/onsapcom-questions-and-answers-on-sap.html' title='OnSAP.com - questions and answers on SAP topics'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_LUNtiAx0Y3E/SrolYC4NdsI/AAAAAAAAARM/RZeGjyptOFo/s72-c/onsap_screen.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-3122839030303519139</id><published>2009-07-16T21:27:00.005+01:00</published><updated>2009-10-26T22:07:29.245Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='sap'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Typical projects</title><content type='html'>Typical project of the 90's: FI, CO, SD, MM, PP, sales organizations, warehouses, distribution centers and maybe factories. &lt;br /&gt;&lt;br /&gt;Typical project of this decade: trade company in Luxemburg, Switzerland or other low tax country; stocks owned by the trade company but physically in a different location; outsource production but control the planning of raw materials and possibly reorder from a central location; have the outsourcing partner stocks and in-process productions in the system as if it was a standard plant.  &lt;br /&gt;&lt;br /&gt;It's amazing the base model continues to be the same. But in the past it was clean and now it looks quite twisted.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-3122839030303519139?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/3122839030303519139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=3122839030303519139&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/3122839030303519139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/3122839030303519139'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2009/07/typical-projects.html' title='Typical projects'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-8139311246069499737</id><published>2009-04-25T23:04:00.003+01:00</published><updated>2009-04-25T23:12:42.141+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sap'/><title type='text'>And now? Going back to ABAP?</title><content type='html'>So &lt;a href="http://www.theregister.co.uk/2009/04/21/oracle_sun_open_source/"&gt;Oracle buys Sun&lt;/a&gt; and gets Solaris, Mysql, MaxDB and Java. The first is a very important database but not very relevant to enterprise and SAP world (although it is used in SAP xMII). The second (previously named SAP DB) is the core to SAP APO LiveCache. And the last, the Java programming language, is the programming environment on which most new SAP products are developed and is also used for the cross platform GUI. And I would guess a lot of customers run on Solaris.&lt;br /&gt;&lt;br /&gt;Before this purchase Oracle already had the most used database in SAP deployments. Is it me, or this is too much Oracle on SAP's backyard? If it was in my house, I would start doing some cleaning.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-8139311246069499737?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/8139311246069499737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=8139311246069499737&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/8139311246069499737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/8139311246069499737'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2009/04/and-now-going-back-to-abap.html' title='And now? Going back to ABAP?'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-4358312832714919977</id><published>2009-03-22T12:14:00.017Z</published><updated>2009-03-22T16:16:23.524Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='macros'/><category scheme='http://www.blogger.com/atom/ns#' term='dp'/><title type='text'>Marked Cell in Demand Planning Macros</title><content type='html'>I wanted to allow the users to choose a planning book cell, then click on a macro button to open a pop-up window with additional information related to the cell. But it does not seem to be possible to get the marked cell when developing planning book macros.&lt;br /&gt;&lt;br /&gt;The standard macro functions PLOB_MARKED and COLUMN_MARKED work when selecting full rows and columns. Consider the following example macro:&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 281px; height: 153px;" src="http://1.bp.blogspot.com/_LUNtiAx0Y3E/ScYuPVp3hNI/AAAAAAAAAPg/fnrf7yJagnY/s400/macro1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315987251203114194" /&gt;&lt;br /&gt;&lt;br /&gt;It is possible to use that macro to identify a cell if the user selects both the row and column (pressing the control key to allow that kind of selection). But that is very user-unfriendly.&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 180px;" src="http://3.bp.blogspot.com/_LUNtiAx0Y3E/ScYufLhCAxI/AAAAAAAAAPo/-QyexS0muC0/s400/macro2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315987523359605522" /&gt;&lt;br /&gt;&lt;br /&gt;It turns out that most of the functionality for getting the marked cell in the macros is already available in the lower level macro functions. The standard function /SAPAPO/MARKED_ELEMENTS is used in the macro functions that return the marked row and column. That function also has information on the marked cell, so with some simple modifications it can be used for returning the selected cell.&lt;br /&gt;&lt;br /&gt;It was easy to &lt;a href="http://apolemia.blogspot.com/2008/02/tutorial-on-abap-functions-for-dp.html"&gt;develop new functions&lt;/a&gt; to check the row (PLOB) for the marked cell and a function to check the column for the marked cell. Both call internally the modified /SAPAPO/MARKED_ELEMENTS and are based on the standard functions.&lt;br /&gt;&lt;br /&gt;Then it is possible to develop macros that act on cells, to put the toolbar button for the macro and to open an ALV with cell detail information.&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 313px; height: 201px;" src="http://4.bp.blogspot.com/_LUNtiAx0Y3E/ScYusqjJK-I/AAAAAAAAAPw/aT5-dG6pvEo/s400/macro3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315987755028261858" /&gt;&lt;br /&gt;&lt;br /&gt;I still find it strange that marked cell macro is not available in the standard. Perhaps it is in some recent release. IMHO is a must have for planning books.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-4358312832714919977?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/4358312832714919977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=4358312832714919977&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/4358312832714919977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/4358312832714919977'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2009/03/marked-cell-in-demand-planning-macros.html' title='Marked Cell in Demand Planning Macros'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_LUNtiAx0Y3E/ScYuPVp3hNI/AAAAAAAAAPg/fnrf7yJagnY/s72-c/macro1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-146257596922455139</id><published>2009-01-23T10:13:00.003Z</published><updated>2009-01-23T10:16:40.829Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><title type='text'>No more smiles</title><content type='html'>No more &lt;a href="http://apolemia.blogspot.com/2006/11/atp-fun-i-always-suspected-that-apo.html"&gt;smiles in ATP&lt;/a&gt;. Why SAP why?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LUNtiAx0Y3E/SXmYhy0-60I/AAAAAAAAAPY/Oc09b4X9F8s/s1600-h/sd21.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 381px; height: 149px;" src="http://1.bp.blogspot.com/_LUNtiAx0Y3E/SXmYhy0-60I/AAAAAAAAAPY/Oc09b4X9F8s/s400/sd21.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5294430543297833794" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-146257596922455139?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/146257596922455139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=146257596922455139&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/146257596922455139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/146257596922455139'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2009/01/no-more-smiles.html' title='No more smiles'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_LUNtiAx0Y3E/SXmYhy0-60I/AAAAAAAAAPY/Oc09b4X9F8s/s72-c/sd21.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-3204605079661289794</id><published>2009-01-12T19:01:00.007Z</published><updated>2009-10-26T22:04:56.535Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='abap'/><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><title type='text'>Another spell for the hacker book</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LUNtiAx0Y3E/SWuVPClpHfI/AAAAAAAAAOw/rYMC8sQPleg/s1600-h/hammer.gif"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 150px; height: 149px;" src="http://3.bp.blogspot.com/_LUNtiAx0Y3E/SWuVPClpHfI/AAAAAAAAAOw/rYMC8sQPleg/s400/hammer.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5290486272902110706" /&gt;&lt;/a&gt;&lt;br /&gt;The object oriented programming in APO uses in many cases the &lt;a href="http://en.wikipedia.org/wiki/Singleton_pattern"&gt;singleton pattern&lt;/a&gt;. An object static method (class method in standard object oriented talk) is used to obtain the object instance. If it is the first time the object is created and stored in a static attribute (class attribute). Then further calls to the method return the instance stored in the attribute. A practical result of this coding logic is that these objects become global structures of data because as long they were initialized at a given point of time, they are can be accessed at any later time just by calling the static method. For example, the object /SAPAPO/CL_ATPFIELD_BUF can be called in ATP user-exits to get the field catalog (some user-exits don’t have the field catalog available in the input parameters).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CALL METHOD /sapapo/cl_atpfield_buf=&gt;get_atpfield&lt;br /&gt;   EXPORTING&lt;br /&gt;      iv_ordid =  lv_ordid &lt;br /&gt;      iv_delps = lv_delps&lt;br /&gt;   IMPORTING&lt;br /&gt;      et_atpfield = lt_atpfield.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This works because the field catalog is stored in a static attribute of the object. &lt;br /&gt;&lt;br /&gt;For global classes (like /SAPAPO/CL_ATPFIELD_BUF) this is very simple, but ABAP also allows the definition of local classes. For example, the main objects for the ATP calculation (LCL_REQUIREMENT_ATP, etc) are classes defined inside program /SAPAPO/SAPLATPT. I always wanted to have access to these objects inside user-exits (because it means having access to all ATP information). Something like &lt;a href="http://apolemia.blogspot.com/2004/03/userexit-hacking-here-is-very-useful.html"&gt;this trick&lt;/a&gt; for global variables but able to access the objects.&lt;br /&gt;&lt;br /&gt;After many failed attempts, this one works fine.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;DATA:&lt;br /&gt;    l_name(150)    TYPE c,&lt;br /&gt;    l_tabtype(150) TYPE c,&lt;br /&gt;    ldr_reqref     TYPE REF TO data.&lt;br /&gt;&lt;br /&gt;  FIELD-SYMBOLS:&lt;br /&gt;    &amp;lt;reqref_t&amp;gt; TYPE ANY TABLE.&lt;br /&gt;&lt;br /&gt;  l_name = '\PROGRAM=/SAPAPO/SAPLATPT\CLASS=LCL_REQUIREMENT_ATP'.&lt;br /&gt;  l_tabtype = '\PROGRAM=/SAPAPO/SAPLATPT\TYPE=TBL_REQREF'.&lt;br /&gt;&lt;br /&gt;  CREATE DATA ldr_reqref TYPE (l_tabtype).&lt;br /&gt;  ASSIGN ldr_reqref-&amp;gt;* TO &amp;lt;reqref_t&amp;gt; CASTING TYPE (l_tabtype).&lt;br /&gt;&lt;br /&gt;  CALL METHOD (l_name)=&amp;gt;get_instances&lt;br /&gt;    RECEIVING rt_reqref = &amp;lt;reqref_t&amp;gt;.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now this pointer &amp;lt;reqref_t&amp;gt; is a pointer to a list of all LCL_REQUIREMENT_ATP object instances relevant for the current ATP check.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-3204605079661289794?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/3204605079661289794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=3204605079661289794&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/3204605079661289794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/3204605079661289794'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2009/01/another-spell-for-hacker-book.html' title='Another spell for the hacker book'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_LUNtiAx0Y3E/SWuVPClpHfI/AAAAAAAAAOw/rYMC8sQPleg/s72-c/hammer.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-5338834165606856421</id><published>2009-01-12T16:42:00.012Z</published><updated>2009-01-12T19:34:05.593Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='pal'/><category scheme='http://www.blogger.com/atom/ns#' term='control'/><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><title type='text'>A Simple Controller</title><content type='html'>There are many ways to &lt;a href="http://apolemia.blogspot.com/2008/09/modeling-limits-and-reservations-with.html"&gt;design a PAL model&lt;/a&gt;. The design that comes naturally to our minds is the one that splits the available quantity over a number of buckets (markets, plants, customers, etc).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LUNtiAx0Y3E/SLvZ4VkkKLI/AAAAAAAAAIk/DjS9hXYKOBc/s1600-h/pal1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_LUNtiAx0Y3E/SLvZ4VkkKLI/AAAAAAAAAIk/DjS9hXYKOBc/s400/pal1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5241022153262114994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This design is simple to understand, but from the point of view of automatic control it faces serious challenges. A control system would have to compute where to deallocate and where to allocate quantity. It becomes an optimization problem. &lt;br /&gt;&lt;br /&gt;But let's see a different design (that was also part of &lt;a href="http://apolemia.blogspot.com/2008/09/modeling-limits-and-reservations-with.html"&gt;this discussion&lt;/a&gt;). It checks first the capacity on the main buckets and then checks on a second level a capacity that is available for all orders (sequence of procedures).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_LUNtiAx0Y3E/SLvaqu-8CUI/AAAAAAAAAJE/J3v9IjrAQl0/s1600-h/pal5.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_LUNtiAx0Y3E/SLvaqu-8CUI/AAAAAAAAAJE/J3v9IjrAQl0/s400/pal5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5241023019077077314" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Let's suppose we use monthly buckets and that at the start of the month the first procedure has 100% of total capacity and the second procedure has zero capacity. This is exactly as having just one level. Then as time passes the control system can read each bucket and compare the available capacity to some expected target value. If there is more free capacity than the target the system can reduce the bucket capacity and allocate the remaining to the second procedure.&lt;br /&gt;&lt;br /&gt;The target open quantity can be one of many functions that return a profile of consumption over time. For example it could just be linear, linear within an internal interval or exponential as shown bellow.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LUNtiAx0Y3E/SWuZ0_LCBpI/AAAAAAAAAPA/hV70CmWIK-g/s1600-h/profiles.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 500px; height: 99px;" src="http://3.bp.blogspot.com/_LUNtiAx0Y3E/SWuZ0_LCBpI/AAAAAAAAAPA/hV70CmWIK-g/s400/profiles.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5290491322866730642" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This will make a control algorithm that is simple to understand and implement. And for many practical purposes it does what business expects (if a market is not consuming the quota, then it becomes available for the other markets).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-5338834165606856421?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/5338834165606856421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=5338834165606856421&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/5338834165606856421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/5338834165606856421'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2009/01/simple-controller.html' title='A Simple Controller'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_LUNtiAx0Y3E/SLvZ4VkkKLI/AAAAAAAAAIk/DjS9hXYKOBc/s72-c/pal1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-1722256242524957841</id><published>2009-01-12T16:32:00.002Z</published><updated>2009-01-12T16:41:38.554Z</updated><title type='text'>Happy Lunar New Year</title><content type='html'>Happy new year everybody!&lt;br /&gt;&lt;br /&gt;Yes I should have posted it in time, but hey, today is the &lt;a href="http://en.wikipedia.org/wiki/Lunar_New_Year"&gt;lunar new year&lt;/a&gt; and that makes a great excuse :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-1722256242524957841?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/1722256242524957841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=1722256242524957841&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/1722256242524957841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/1722256242524957841'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2009/01/happy-lunar-new-year.html' title='Happy Lunar New Year'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-5682322008236584404</id><published>2008-12-27T21:53:00.008Z</published><updated>2008-12-27T23:14:28.425Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='pal'/><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><title type='text'>From Water Distribution to Product Allocation</title><content type='html'>The &lt;a href="http://apolemia.blogspot.com/2008/12/similar-control-system.html"&gt;water distribution control system&lt;/a&gt; is quite similar to gATP product allocation. What is available in vanilla PAL is something like the open loop control system.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LUNtiAx0Y3E/SVaj-_17_MI/AAAAAAAAAOQ/7OBj0Uk-YAY/s1600-h/diag1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 247px;" src="http://3.bp.blogspot.com/_LUNtiAx0Y3E/SVaj-_17_MI/AAAAAAAAAOQ/7OBj0Uk-YAY/s400/diag1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5284591515450735810" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A common development in PAL implementations is to use sales forecast to create the allocation plan. By frequently updating the allocation plan, PAL will become a feedback controller. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LUNtiAx0Y3E/SValM6s6V1I/AAAAAAAAAOg/BwUr2uH14Cg/s1600-h/diag5.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 339px;" src="http://2.bp.blogspot.com/_LUNtiAx0Y3E/SValM6s6V1I/AAAAAAAAAOg/BwUr2uH14Cg/s400/diag5.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5284592854100498258" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The key piece of technology to have a good control system is the controller. In this case the controller is the logic that calculates the bucket capacities from the sales forecast and user defined constraints. It is a bit amazing that SAP APO, probably the most advanced supply chain planning system, left this key piece of technology out of the software. It is up to the people doing the implementation to build the controller. And that is something &lt;strike&gt;hard&lt;/strike&gt; interesting to do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-5682322008236584404?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/5682322008236584404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=5682322008236584404&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/5682322008236584404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/5682322008236584404'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2008/12/from-water-distribution-to-product.html' title='From Water Distribution to Product Allocation'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_LUNtiAx0Y3E/SVaj-_17_MI/AAAAAAAAAOQ/7OBj0Uk-YAY/s72-c/diag1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-7952487178914317937</id><published>2008-12-27T21:44:00.006Z</published><updated>2008-12-27T23:04:35.811Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='pal'/><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><title type='text'>Similar Control System</title><content type='html'>I tried to find some real work control problems that are similar in objective to PAL . So far, the one I like more is the control of water allocation in regions of limited water and power supply. &lt;br /&gt;&lt;br /&gt;The water distribution is done using a network of reservoirs. In dry regions, planning and controlling the level of water in each reservoir is quite important since it may not be possible to pump more water into each tank. For each time period (day, week, etc) there is a planned level of water for each tank in the network. If everybody tries to consume more water than available then all will have shortages. In that scenario the planned tank level corresponds to the fair share of water available for each node in the network.&lt;br /&gt;&lt;br /&gt;On the other hand, if there is some tank that experiences more consumption than planned and other tanks have excess capacity, then water needs to be pumped from one place to the other. If power is limited in the region it is also important to plan the pumping of water because it may be more expensive (or not possible at all) to transfer the water only when the tank becomes empty.&lt;br /&gt;&lt;br /&gt;The water network control system will probably plan the consumption of water in each node of the network based on historic values. Then, based of the available water capacity, will define the level that will be loaded on each tank (or the quantity to be pumped).&lt;br /&gt;&lt;br /&gt;The system could just wait for the end of the period and do the same operation again for the next period. Of course this will have the risk of unexpected consumption making some tanks empty. If that happens, and if water is available, someone will have to try to pump water from some node to the empty tanks. This is not a very good system because there will be a penalty for users that run out of water, it needs manual intervention, and it may be more expensive to pump water. This is like the &lt;a href="http://apolemia.blogspot.com/2008/12/open-loop-controller-at-home.html"&gt;open loop system&lt;/a&gt; described before.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_LUNtiAx0Y3E/SVaiNSN-YGI/AAAAAAAAAOA/c4gBHdeZpZY/s1600-h/diag2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 173px;" src="http://4.bp.blogspot.com/_LUNtiAx0Y3E/SVaiNSN-YGI/AAAAAAAAAOA/c4gBHdeZpZY/s400/diag2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5284589561878306914" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A more advanced system will do real-time monitoring of the water level in each tank. Using that information will recalculate the forecasted consumption. Using the new forecast it is possible to define the values for the tank levels so that quotas are enforced in case of drought but at the same time all available water will reach consumers. This is a supervisory control system with a feedback loop.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LUNtiAx0Y3E/SVaiTurSwuI/AAAAAAAAAOI/red0M7mYChQ/s1600-h/diag3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 244px;" src="http://1.bp.blogspot.com/_LUNtiAx0Y3E/SVaiTurSwuI/AAAAAAAAAOI/red0M7mYChQ/s400/diag3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5284589672596685538" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-7952487178914317937?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/7952487178914317937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=7952487178914317937&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/7952487178914317937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/7952487178914317937'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2008/12/similar-control-system.html' title='Similar Control System'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_LUNtiAx0Y3E/SVaiNSN-YGI/AAAAAAAAAOA/c4gBHdeZpZY/s72-c/diag2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-7136428601682910143</id><published>2008-12-21T18:22:00.003Z</published><updated>2008-12-21T18:35:34.966Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='pal'/><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><title type='text'>Product Allocation Controller</title><content type='html'>In &lt;a href="http://apolemia.blogspot.com/2008/12/open-loop-controller-at-home.html"&gt;this last post&lt;/a&gt; I wrote that &lt;a href="http://help.sap.com/saphelp_scm50/helpdata/en/7a/f1783739e6ff5de10000009b38f8cf/frameset.htm"&gt;PAL&lt;/a&gt; is an open loop controller. That statement implies that information from the evolution of the desired objective is not used to compute the control actions. At this stage I need to try to answer the question: what is the objective function for product allocation controlling? &lt;br /&gt;&lt;br /&gt;It is easier to start by looking at what comes with vanilla PAL (what comes with standard SAP). Many designs are possible (this &lt;a href="http://apolemia.blogspot.com/2008/09/modeling-limits-and-reservations-with.html"&gt;previous post&lt;/a&gt; shows some possibilities), but in each case there is a capacity that is constrained. For each time period and allocation characteristics (market, customer, etc) there is a bucket with a defined capacity. When the capacity is reached no more orders can be confirmed on the bucket. &lt;br /&gt;&lt;br /&gt;This control system is quite similar to something I have at home - the &lt;a href="http://en.wikipedia.org/wiki/Flush_toilet"&gt;flush toilet&lt;/a&gt;. When water reaches the capacity of the tank, the valve is closed and the inflow of water stops. Same with PAL, only that the tank capacity is defined by the user. &lt;br /&gt;&lt;br /&gt;The flush toilet is an &lt;a href="http://en.wikipedia.org/wiki/Control_system#On-off_control"&gt;on-off feedback controller&lt;/a&gt; (uses the information of water level to decide on closing the valve). So PAL should also be an on-off feedback controller if the objective was to control the maximal capacity of the bucket. &lt;br /&gt;&lt;br /&gt;But this is business software, the natural objective function should somehow relate to maximizing profit. And of course, it will always be profit related and only on few exceptions profit will be equivalent to bucket capacity limitation. &lt;br /&gt;&lt;br /&gt;If the goal is to split the available capacity and it is guaranteed that there will be demand to fill each bucket, then capacity limitation and profit are equivalent. This happens because sales profit is constant (all available capacity will be sold) and the additional strategic value related to allocating the products to the desired customers is maximized. This scenario happens, for example when new and over-hyped products are launched or when short time promotions are done. &lt;br /&gt;&lt;br /&gt;But it would be surprising, even in fast growing economies, that demand is always so much large than supply that whatever buckets are defined all capacity is sold. Because when that happens prices are increased to restore balance to the market and increase the profit. So most of the times, for sales allocation purpose, demand is only slightly larger than supply and the goal of PAL controlling has to be different - it must be maximizing capacity usage (all material must be sold) while minimizing the difference between actual and planned bucket allocation.&lt;br /&gt;&lt;br /&gt;So if the control objective is not used for the control actions, it is an open loop controller. At home I have to check the temperature and manually change the controller set-point for the inflow of energy. Some PAL users have to manually change the bucket capacities (quotas) to reach the objective.&lt;br /&gt;&lt;br /&gt;From experience I know that a vanilla PAL works quite well with peak demand (promotions, etc) and it is more problematic in the most common balanced market scenario. I find it interesting that it works well when it is a feedback controller and not so well when it is an open loop controller. So making sure that PAL is always a feedback controller should be a design goal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-7136428601682910143?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/7136428601682910143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=7136428601682910143&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/7136428601682910143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/7136428601682910143'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2008/12/product-allocation-controller.html' title='Product Allocation Controller'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-5556283824796038920</id><published>2008-12-18T23:13:00.004Z</published><updated>2008-12-18T23:44:22.584Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='pal'/><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><title type='text'>Open loop controller at home</title><content type='html'>In my house the heating system is made of electrical heaters that are mainly connected during the night (electricity is cheaper at night where I live). And during the day the heat accumulated in ceramic materials is slowly released. &lt;br /&gt;&lt;br /&gt;To control when the heater should be connected I have a clock timers in the electrical plugs with the scheduled night hours.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LUNtiAx0Y3E/SUreCHx40FI/AAAAAAAAAN4/Em4m_UDMPHo/s1600-h/timer.jpeg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://1.bp.blogspot.com/_LUNtiAx0Y3E/SUreCHx40FI/AAAAAAAAAN4/Em4m_UDMPHo/s400/timer.jpeg" border="0" alt=""id="BLOGGER_PHOTO_ID_5281277641074724946" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This clock device is an &lt;a href="http://en.wikipedia.org/wiki/Open-loop_controller"&gt;open loop controller&lt;/a&gt; (a controler that makes decisions without information of the controlled variable). It is also a good example of the disadvantages of such systems. Since there is no feedback loop, the temperature will vary depending on the external conditions, since the heat input will remain constant. Sometimes it becomes too cold in the house and I need to connect it manually some more hours. When the winter is coming to an end temperature increases, and then I know it is time to reduce the programmed number of hours. &lt;br /&gt;&lt;br /&gt;This system has some advantages but it's terrible if one wants to have good control of the temperature. And it would be expensive if I was to spend time analyzing the measured temperatures and manually trying to adjust the number of hours to adjust the system to the external conditions changes. It would be expensive because my time is limited. &lt;br /&gt;&lt;br /&gt;Looking at what comes with the SAP standard, gATP PAL is an open loop controller (to be continued).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-5556283824796038920?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/5556283824796038920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=5556283824796038920&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/5556283824796038920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/5556283824796038920'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2008/12/open-loop-controller-at-home.html' title='Open loop controller at home'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_LUNtiAx0Y3E/SUreCHx40FI/AAAAAAAAAN4/Em4m_UDMPHo/s72-c/timer.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-7690238173635302514</id><published>2008-12-18T23:11:00.003Z</published><updated>2008-12-18T23:44:10.475Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='pal'/><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><title type='text'>Product Allocation</title><content type='html'>When I think of science I always think of something exciting like invention. But truth is that many times it is not more than transfering knowledge between similar areas. Like moving furniture between rooms. It's not exciting but it is much more effective than building something new from scratch on the other room. &lt;br /&gt;&lt;br /&gt;So I've been moving some furniture between control theory and gATP product allocation. I'll try to write down my findings in a series of posts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-7690238173635302514?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/7690238173635302514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=7690238173635302514&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/7690238173635302514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/7690238173635302514'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2008/12/product-allocation.html' title='Product Allocation'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-2050466011088578770</id><published>2008-12-15T14:48:00.004Z</published><updated>2008-12-15T15:05:59.962Z</updated><title type='text'>Data references</title><content type='html'>The following is the data reference equivalent to the &lt;a href="http://apolemia.blogspot.com/2008/10/objects-instead-of-references.html"&gt;example code using an object&lt;/a&gt;. It's shorter but less clear (IMHO).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;TYPES:&lt;br /&gt;  BEGIN OF t_place,&lt;br /&gt;    place TYPE char30,&lt;br /&gt;  END OF t_place,&lt;br /&gt;  t_place_tab TYPE TABLE OF t_place,&lt;br /&gt;  BEGIN OF t_city,&lt;br /&gt;    city_name TYPE char20,&lt;br /&gt;    places_ref TYPE REF TO data,&lt;br /&gt;  END OF t_city.&lt;br /&gt;&lt;br /&gt;FIELD-SYMBOLS:&lt;br /&gt;  &amp;lt;ref&amp;gt; TYPE t_place_tab.&lt;br /&gt;&lt;br /&gt;DATA:&lt;br /&gt;  gt_city TYPE HASHED TABLE OF t_city WITH UNIQUE KEY city_name,&lt;br /&gt;  gs_city TYPE t_city,&lt;br /&gt;  gs_place TYPE t_place.&lt;br /&gt;&lt;br /&gt;START-OF-SELECTION.&lt;br /&gt;  gs_city-city_name = 'Porto'.&lt;br /&gt;  CREATE DATA gs_city-places_ref TYPE t_place_tab.&lt;br /&gt;  ASSIGN gs_city-places_ref-&amp;gt;* TO &amp;lt;ref&amp;gt;.&lt;br /&gt;  gs_place-place = 'Torre dos Clerigos'.&lt;br /&gt;  APPEND gs_place TO &amp;lt;ref&amp;gt;.&lt;br /&gt;  gs_place-place = 'Casa da Musica'.&lt;br /&gt;  APPEND gs_place TO &amp;lt;ref&amp;gt;.&lt;br /&gt;  gs_place-place = 'Serralves'.&lt;br /&gt;  APPEND gs_place TO &amp;lt;ref&amp;gt;.&lt;br /&gt;&lt;br /&gt;  INSERT gs_city INTO TABLE gt_city.&lt;br /&gt;&lt;br /&gt;  gs_city-city_name = 'New York'.&lt;br /&gt;  CREATE DATA gs_city-places_ref TYPE t_place_tab.&lt;br /&gt;  ASSIGN gs_city-places_ref-&amp;gt;* TO &amp;lt;ref&amp;gt;.&lt;br /&gt;  gs_place-place = 'Empire State Building'.&lt;br /&gt;  APPEND gs_place TO &amp;lt;ref&amp;gt;.&lt;br /&gt;  gs_place-place = 'Central Park'.&lt;br /&gt;  APPEND gs_place TO &amp;lt;ref&amp;gt;.&lt;br /&gt;&lt;br /&gt;  INSERT gs_city INTO TABLE gt_city.&lt;br /&gt;&lt;br /&gt;  READ TABLE gt_city INTO gs_city WITH KEY city_name = 'Porto'.&lt;br /&gt;  IF sy-subrc = 0.&lt;br /&gt;    ASSIGN gs_city-places_ref-&amp;gt;* TO &amp;lt;ref&amp;gt;.&lt;br /&gt;    SORT &amp;lt;ref&amp;gt; BY place.&lt;br /&gt;    LOOP AT &amp;lt;ref&amp;gt; INTO gs_place.&lt;br /&gt;      WRITE: / gs_city-city_name, gs_place-place.&lt;br /&gt;    ENDLOOP.&lt;br /&gt;  ENDIF.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-2050466011088578770?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/2050466011088578770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=2050466011088578770&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/2050466011088578770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/2050466011088578770'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2008/12/data-references.html' title='Data references'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-1656519646410961009</id><published>2008-10-31T19:11:00.002Z</published><updated>2008-10-31T19:21:36.463Z</updated><title type='text'>Objects instead of references</title><content type='html'>The ABAP syntax for working with tables is really good. But the syntax for working with references is crap.&lt;br /&gt;&lt;br /&gt;Many times, for the sake of efficiency, I need to mix references and tables. And I never found an easy way to do that in ABAP.&lt;br /&gt;&lt;br /&gt;For example, I want to have a table with thousands of city names and for each city I want to have a table of dozens of places. Then, for a given city I want to get the list of places and do some actions on that data (sorting, removing, changing, etc). Notice that it is not a good idea to have just one table with both cities and places because each sublist operation would have a big penalty because of the big size of the full table.&lt;br /&gt;&lt;br /&gt;In python it is so easy:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;cities = {'Porto':['Casa da Musica','Serralves','Torre dos Clerigos'],&lt;br /&gt;   'New York': ['Empire State Building','Central Park'] }&lt;br /&gt;&lt;br /&gt;#print the sorted list of places in Porto&lt;br /&gt;cities['Porto'].sort()&lt;br /&gt;print cities['Porto']&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;In ABAP I find myself using objects because the resulting syntax is cleaner. It looks something like this:  &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;TYPES:&lt;br /&gt;  BEGIN OF t_place,&lt;br /&gt;    place TYPE char30,&lt;br /&gt;  END OF t_place.&lt;br /&gt;&lt;br /&gt;TYPES:&lt;br /&gt;  t_tab_places TYPE TABLE OF t_place.&lt;br /&gt;&lt;br /&gt;CLASS place_obj DEFINITION.&lt;br /&gt;  PUBLIC SECTION.&lt;br /&gt;    DATA places_table TYPE t_tab_places.&lt;br /&gt;    METHODS add_place IMPORTING place_name TYPE char30.&lt;br /&gt;  PRIVATE SECTION.&lt;br /&gt;ENDCLASS.                    "place DEFINITION&lt;br /&gt;&lt;br /&gt;CLASS place_obj IMPLEMENTATION.&lt;br /&gt;  METHOD add_place.&lt;br /&gt;    DATA ls_place TYPE t_place.&lt;br /&gt;    ls_place-place = place_name.&lt;br /&gt;    APPEND ls_place TO places_table.&lt;br /&gt;  ENDMETHOD.                 &lt;br /&gt;ENDCLASS.                    &lt;br /&gt;&lt;br /&gt;TYPES:&lt;br /&gt;  BEGIN OF t_city,&lt;br /&gt;    city_name TYPE char20,&lt;br /&gt;    places_ref TYPE REF TO place_obj,&lt;br /&gt;  END OF t_city.&lt;br /&gt;&lt;br /&gt;DATA:&lt;br /&gt;  gt_city TYPE HASHED TABLE OF t_city WITH UNIQUE KEY city_name,&lt;br /&gt;  gs_city TYPE t_city,&lt;br /&gt;  gs_place TYPE t_place.&lt;br /&gt;&lt;br /&gt;DATA oref TYPE REF TO place_obj.&lt;br /&gt;&lt;br /&gt;START-OF-SELECTION.&lt;br /&gt;  gs_city-city_name = 'Porto'.&lt;br /&gt;  CREATE OBJECT oref.&lt;br /&gt;  gs_city-places_ref = oref.&lt;br /&gt;  CALL METHOD oref-&gt;add_place( 'Torre dos Clerigos' ).&lt;br /&gt;  CALL METHOD oref-&gt;add_place( 'Casa da Musica' ).&lt;br /&gt;  CALL METHOD oref-&gt;add_place( 'Serralves' ).&lt;br /&gt;  INSERT gs_city INTO TABLE gt_city.&lt;br /&gt;&lt;br /&gt;  gs_city-city_name = 'New York'.&lt;br /&gt;  CREATE OBJECT oref.&lt;br /&gt;  gs_city-places_ref = oref.&lt;br /&gt;  CALL METHOD oref-&gt;add_place( 'Empire State Building' ).&lt;br /&gt;  CALL METHOD oref-&gt;add_place( 'Central Park' ).&lt;br /&gt;  INSERT gs_city INTO TABLE gt_city.&lt;br /&gt;&lt;br /&gt;  READ TABLE gt_city INTO gs_city WITH KEY city_name = 'Porto'.&lt;br /&gt;  IF sy-subrc = 0.&lt;br /&gt;    oref = gs_city-places_ref.&lt;br /&gt;    SORT oref-&gt;places_table BY place.&lt;br /&gt;    LOOP AT oref-&gt;places_table INTO gs_place.&lt;br /&gt;      WRITE: / gs_city-city_name, gs_place-place.&lt;br /&gt;    ENDLOOP.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;But it's still far from perfect. Dear lazy web, is there a better way?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-1656519646410961009?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/1656519646410961009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=1656519646410961009&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/1656519646410961009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/1656519646410961009'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2008/10/objects-instead-of-references.html' title='Objects instead of references'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-1521387153482662489</id><published>2008-09-01T11:57:00.014+01:00</published><updated>2008-09-05T15:06:54.097+01:00</updated><title type='text'>Modeling Limits and Reservations with gATP Product Allocation</title><content type='html'>Product Allocation (PAL), is the APO tool that enables quota definition for the ATP process. With this tool it is possible, for example, to setup quotas for customers to have more control in the distribution of the stock or plant production capacity. For more on product allocation see &lt;a href="http://help.sap.com/saphelp_scm50/helpdata/en/26/c2d63b18bc7e7fe10000000a114084/frameset.htm"&gt;here&lt;/a&gt; and &lt;a href="http://help.sap.com/saphelp_scm50/helpdata/en/98/5ad83738c11613e10000009b38f8cf/frameset.htm"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Although PAL can be used to model quotas for any characteristic in the sales order, here I will use the simple scenario of modeling quotas for customers to highlight two major topics: limits and reservations.&lt;br /&gt;&lt;br /&gt;A very standard way of using the PAL tool is to set limits for the quantity a customer can buy in a given time period (for example month). Suppose we have a plant that can make 1000 M3 of material, and we have three main customers (A, B, and C) that every month need 400, 300 and 300 M3. We can define the quotas in a single procedure with a single step (the graphic represents a step and each color in the graphic a characteristic combination in the step).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LUNtiAx0Y3E/SLvZ4VkkKLI/AAAAAAAAAIk/DjS9hXYKOBc/s1600-h/pal1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_LUNtiAx0Y3E/SLvZ4VkkKLI/AAAAAAAAAIk/DjS9hXYKOBc/s400/pal1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5241022153262114994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This means that customer A can take at most 400 M3, but it also means that customer A will have reserved 400 M3 of production capacity, because all others together cannot take more than 600 M3.&lt;br /&gt;&lt;br /&gt;This last model works well when there is almost fixed demand. But it does not allow any new customer to place and order and have ATP confirmation. A different scenario for a company with many customers is to model two or three important customers and have some quota for all the others (PAL has a wildcard that represents all the other elements in the set). For example:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_LUNtiAx0Y3E/SLvaEQJlgJI/AAAAAAAAAIs/rsTHNkVs8t4/s1600-h/pal2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_LUNtiAx0Y3E/SLvaEQJlgJI/AAAAAAAAAIs/rsTHNkVs8t4/s400/pal2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5241022357965209746" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Again this model is a both a limit and a reservation of the quantity the customers can get. It works well when the demand is greater than the production capacity, so the result will be equal to the quotas and the excess orders will be rejected or postponed.&lt;br /&gt;&lt;br /&gt;Still with this simple model, it is possible to have some interesting variants. Let's suppose the company is interested in putting a limit on the quantity A and B can get in a given month, but it does not want to reserve them capacity. It should be possible for the other customers to take all the capacity. In this case quotas are defined as limits, and for each element we define the limit we want to impose. And for others we give the total plant capacity (this assumes there will be limitations on the ATP product check, or in alternative a new step can be added with the plant capacity constraint). &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_LUNtiAx0Y3E/SLvaOnBQpmI/AAAAAAAAAI0/rHGvsVRQz98/s1600-h/pal3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_LUNtiAx0Y3E/SLvaOnBQpmI/AAAAAAAAAI0/rHGvsVRQz98/s400/pal3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5241022535902996066" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But there are other common scenarios that this simple model does not represent well. Considering again the last model, let's say customer A is a good customer that usually buys from 200 M3 to 500 M3. The plant wants to reserve 200 M3 of capacity but wants to allow him to allocate up to 600 M3. And for customer B reserve 100 M3 and allow up to 500 M3. This kind of business rule is not modeled adequately by the single step, single procedure model we have been using.&lt;br /&gt;&lt;br /&gt;Product allocation modeling is done by a combination of procedures. Each procedure is made of one or several steps and each step has one or several characteristic combinations. These are the modeling building blocks of PAL and they allow a large number of possibilities.&lt;br /&gt;&lt;br /&gt;The characteristic combinations are the customers we have been using (A, B and others, for example). The sequence of steps means the PAL check will go to each step in sequence and will use the resulting quantity and date from one step as the input of the next step. On the other hand, when using several procedures the PAL check gets a confirmed quantity from each of the procedures and uses the one that first confirms the requested quantity or the one that allows a larger confirmation.&lt;br /&gt;&lt;br /&gt;I usually like to think of the steps as mathematical sets, the characteristics combinations are elements in the set. In this analogy the sequence of steps represent set intersections and the different procedures are set unions.&lt;br /&gt;&lt;br /&gt;Getting back to the modeling scenario, if we model each customer in a step, we can set the limit (the customer quota) and also reserve quantity (the difference between the "others" quota and the plant capacity).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_LUNtiAx0Y3E/SME82zVZCJI/AAAAAAAAAJM/oLlpVgdqcRk/s1600-h/pal4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_LUNtiAx0Y3E/SME82zVZCJI/AAAAAAAAAJM/oLlpVgdqcRk/s400/pal4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5242538353426499730" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For the last example, let's suppose the company just wants to have some minimal capacity reservations (100M3 for customer A and B). The remaining capacity is to be given on first come first served basis. This is better modeled as a sequence of procedures (set union). The first procedure has the capacities for A and B. The system first checks on the first procedure, if quantity is missing it goes to the second procedure, that, in this case has the quantities available for all customers.  &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_LUNtiAx0Y3E/SLvaqu-8CUI/AAAAAAAAAJE/J3v9IjrAQl0/s1600-h/pal5.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_LUNtiAx0Y3E/SLvaqu-8CUI/AAAAAAAAAJE/J3v9IjrAQl0/s400/pal5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5241023019077077314" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Although the documentation only highlights the standard "limits" model definition, with PAL it's possible to design many different allocation strategies.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-1521387153482662489?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/1521387153482662489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=1521387153482662489&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/1521387153482662489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/1521387153482662489'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2008/09/modeling-limits-and-reservations-with.html' title='Modeling Limits and Reservations with gATP Product Allocation'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_LUNtiAx0Y3E/SLvZ4VkkKLI/AAAAAAAAAIk/DjS9hXYKOBc/s72-c/pal1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-2441734541844023789</id><published>2008-04-29T20:47:00.001+01:00</published><updated>2008-04-29T21:49:23.840+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='osx mac'/><title type='text'>SAP on Mac</title><content type='html'>SAP with that annoying windows bug fixed.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LUNtiAx0Y3E/SBd9lNnFSQI/AAAAAAAAAGw/ltD8GdHqXMo/s1600-h/mac1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_LUNtiAx0Y3E/SBd9lNnFSQI/AAAAAAAAAGw/ltD8GdHqXMo/s400/mac1.jpg" alt="" id="BLOGGER_PHOTO_ID_5194758773457373442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LUNtiAx0Y3E/SBd9qtnFSRI/AAAAAAAAAG4/7W_LrKlMwDk/s1600-h/mac2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_LUNtiAx0Y3E/SBd9qtnFSRI/AAAAAAAAAG4/7W_LrKlMwDk/s400/mac2.jpg" alt="" id="BLOGGER_PHOTO_ID_5194758867946653970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;* Not really fixed, windows is running inside a virtual machine (VMWare). But since it allows to run applications outside the VM box, SAP feels like a OSX application.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-2441734541844023789?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/2441734541844023789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=2441734541844023789&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/2441734541844023789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/2441734541844023789'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2008/04/sap-on-mac.html' title='SAP on Mac'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_LUNtiAx0Y3E/SBd9lNnFSQI/AAAAAAAAAGw/ltD8GdHqXMo/s72-c/mac1.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-8171824355947673191</id><published>2008-02-20T15:09:00.008Z</published><updated>2008-02-20T15:37:59.365Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='abap'/><category scheme='http://www.blogger.com/atom/ns#' term='macros'/><category scheme='http://www.blogger.com/atom/ns#' term='dp'/><title type='text'>Tutorial on ABAP functions for DP macros</title><content type='html'>It seems that there is no standard function to calculate the statistical mode. So I thought it would make a good example for a short tutorial on creation of ABAP functions to be used in planning macros.&lt;br /&gt;&lt;br /&gt;The macro functions are standard functions created with SE37 that must have a specific call signature (input and output parameters and tables). The base parameters are the ones shown in the following figure (later other options are presented).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LUNtiAx0Y3E/R7xDNUha3WI/AAAAAAAAAF4/wWQv72NuBFA/s1600-h/macro0.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_LUNtiAx0Y3E/R7xDNUha3WI/AAAAAAAAAF4/wWQv72NuBFA/s400/macro0.png" alt="" id="BLOGGER_PHOTO_ID_5169080368440728930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The VALUE_TAB structure has two fields, one for numbers and one for strings. All input parameters set in the macro are added to this table in the same order as defined in the macro, in the number or string field depending on the data type.&lt;br /&gt;&lt;br /&gt;For our exemple the function will receive a list of numbers. The goal is to calculate the mode of the integer part of the numbers. Since the mode can be a list of several numbers, we intend to return the largest integer number of the list.&lt;br /&gt;&lt;br /&gt;Bellow is the code for such a function. It just counts the frequency of the numbers (after convertion to integers). The final list is sorted and the mode (or maximum of modes) is returned on the output parameter field F_ARGUMENT. The other parameter F_CALC_ERROR is a flag that should be set in case of errors that cannot be handled (the equivalent of raising an exception).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;FUNCTION z_macro_maxmode .&lt;br /&gt;*"----------------------------------------------------------------------&lt;br /&gt;*"*"Local interface:&lt;br /&gt;*"  TABLES&lt;br /&gt;*"      VALUE_TAB STRUCTURE  /SAPAPO/VALUE_TAB&lt;br /&gt;*"  CHANGING&lt;br /&gt;*"     REFERENCE(F_CALC_ERROR) TYPE  C&lt;br /&gt;*"     REFERENCE(F_ARGUMENT) TYPE  /SAPAPO/MXSOP-V&lt;br /&gt;*"----------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt; TYPES:&lt;br /&gt;   BEGIN OF t_histogram,&lt;br /&gt;     value   TYPE i,&lt;br /&gt;     counter TYPE i,&lt;br /&gt;   END OF t_histogram.&lt;br /&gt;&lt;br /&gt; DATA:&lt;br /&gt;   lv_value TYPE i,&lt;br /&gt;   ls_hist  TYPE t_histogram,&lt;br /&gt;   lt_hist  TYPE TABLE OF t_histogram WITH KEY value.&lt;br /&gt;&lt;br /&gt; LOOP AT value_tab.&lt;br /&gt;   IF value_tab-string IS INITIAL.&lt;br /&gt;     CLEAR ls_hist.&lt;br /&gt;*     just truncated integers to make it simpler&lt;br /&gt;     lv_value = trunc( value_tab-value ).&lt;br /&gt;     READ TABLE lt_hist WITH TABLE KEY value = lv_value INTO ls_hist.&lt;br /&gt;     IF sy-subrc = 0.&lt;br /&gt;*     already in the table, increase the counter&lt;br /&gt;       ls_hist-counter = ls_hist-counter + 1.&lt;br /&gt;       MODIFY TABLE lt_hist FROM ls_hist TRANSPORTING counter.&lt;br /&gt;     ELSE.&lt;br /&gt;*     insert value for the first time in the table&lt;br /&gt;       ls_hist-value = lv_value.&lt;br /&gt;       ls_hist-counter = 1.&lt;br /&gt;       INSERT ls_hist INTO TABLE lt_hist.&lt;br /&gt;     ENDIF.&lt;br /&gt;   ENDIF.&lt;br /&gt; ENDLOOP.&lt;br /&gt;&lt;br /&gt;* return the integer with largest counter (if more than one return the&lt;br /&gt;* largest integer)&lt;br /&gt; SORT lt_hist BY counter DESCENDING value DESCENDING.&lt;br /&gt; READ TABLE lt_hist INDEX 1 INTO ls_hist.&lt;br /&gt;&lt;br /&gt; f_argument = ls_hist-value.&lt;br /&gt;&lt;br /&gt;ENDFUNCTION.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now this function can be added to the macro builder (/sapapo/advm). First one registers the function using the following menu option.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_LUNtiAx0Y3E/R7xD90ha3XI/AAAAAAAAAGA/AMdX6S2Lo8g/s1600-h/macro3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_LUNtiAx0Y3E/R7xD90ha3XI/AAAAAAAAAGA/AMdX6S2Lo8g/s400/macro3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5169081201664384370" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LUNtiAx0Y3E/R7xEWEha3YI/AAAAAAAAAGI/a979HSWJpJo/s1600-h/macro4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_LUNtiAx0Y3E/R7xEWEha3YI/AAAAAAAAAGI/a979HSWJpJo/s400/macro4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5169081618276212098" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A list of parameters is shown. The previous macro only uses the base parameters so no other checkbox is flagged, but here is the place to  choose the parameter options.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_LUNtiAx0Y3E/R7xEu0ha3ZI/AAAAAAAAAGQ/iaqlhv29hUg/s1600-h/macro5.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_LUNtiAx0Y3E/R7xEu0ha3ZI/AAAAAAAAAGQ/iaqlhv29hUg/s400/macro5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5169082043477974418" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Then the macro is created with the new function being called like the standard ones.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LUNtiAx0Y3E/R7xFYEha3aI/AAAAAAAAAGY/xBUF89bNnoU/s1600-h/macro6.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_LUNtiAx0Y3E/R7xFYEha3aI/AAAAAAAAAGY/xBUF89bNnoU/s400/macro6.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5169082752147578274" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've found that moving logic to ABAP functions can be a good way to simplify complex macros.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-8171824355947673191?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/8171824355947673191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=8171824355947673191&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/8171824355947673191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/8171824355947673191'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2008/02/tutorial-on-abap-functions-for-dp.html' title='Tutorial on ABAP functions for DP macros'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_LUNtiAx0Y3E/R7xDNUha3WI/AAAAAAAAAF4/wWQv72NuBFA/s72-c/macro0.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-3257284119335702574</id><published>2007-12-15T18:57:00.000Z</published><updated>2007-12-15T19:07:23.521Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>I'm using the wrong APO</title><content type='html'>First &lt;a href="http://abaplog.wordpress.com/2007/12/09/new-frontiers-of-apo/"&gt;this post&lt;/a&gt; opened my eyes. Maybe I was using the wrong APO. Then Google sent me the answer on an adsense link (I'm both amazed and scared on how Google makes these guesses). I should be using &lt;a href="http://whc.unesco.org/en/tentativelists/5033/"&gt;APO reef&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LUNtiAx0Y3E/R2QkfDTs7uI/AAAAAAAAAFw/g6djfmWtsFM/s1600-h/apo_reef.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_LUNtiAx0Y3E/R2QkfDTs7uI/AAAAAAAAAFw/g6djfmWtsFM/s400/apo_reef.jpg" alt="" id="BLOGGER_PHOTO_ID_5144276790246436578" 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/6297557-3257284119335702574?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/3257284119335702574/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=3257284119335702574&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/3257284119335702574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/3257284119335702574'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/12/im-using-wrong-apo.html' title='I&apos;m using the wrong APO'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_LUNtiAx0Y3E/R2QkfDTs7uI/AAAAAAAAAFw/g6djfmWtsFM/s72-c/apo_reef.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-8107397873258640411</id><published>2007-12-07T11:20:00.001Z</published><updated>2009-03-22T12:48:42.007Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='abap'/><category scheme='http://www.blogger.com/atom/ns#' term='macros'/><category scheme='http://www.blogger.com/atom/ns#' term='dp'/><title type='text'>On Debugging Planning Macros</title><content type='html'>Lately I have been dealing with some planning macros. I am a newbie with these macros but I have a lot of experience with ABAP debugging. That's why I was quite happy with the following trick that allows ABAP debugging of planning macros.&lt;br /&gt;&lt;br /&gt;In the macro builder, for a given macro just put the command ADVA in the command window.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LUNtiAx0Y3E/R1kvUYAmEFI/AAAAAAAAAEs/PoFYw2GqChc/s1600-h/adva_1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_LUNtiAx0Y3E/R1kvUYAmEFI/AAAAAAAAAEs/PoFYw2GqChc/s400/adva_1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5141192476708966482" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It will jump to the ABAP source generated for the macro.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LUNtiAx0Y3E/R1kvj4AmEGI/AAAAAAAAAE0/WMTXWYn10XI/s1600-h/adva_2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_LUNtiAx0Y3E/R1kvj4AmEGI/AAAAAAAAAE0/WMTXWYn10XI/s400/adva_2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5141192742996938850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It is a big source file so it may be hard to find the right section to place the breakpoint. I found it helpful to set a stop point in the macro in the step I want to debug.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_LUNtiAx0Y3E/R1kvuoAmEHI/AAAAAAAAAE8/-0_0yUkiCwM/s1600-h/adva_3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_LUNtiAx0Y3E/R1kvuoAmEHI/AAAAAAAAAE8/-0_0yUkiCwM/s400/adva_3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5141192927680532594" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Then I search the code for PERFORM RESULTS_SHOW.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LUNtiAx0Y3E/R1kv6YAmEII/AAAAAAAAAFE/eZKWf2gCV1c/s1600-h/adva_4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_LUNtiAx0Y3E/R1kv6YAmEII/AAAAAAAAAFE/eZKWf2gCV1c/s400/adva_4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5141193129543995522" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That's it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-8107397873258640411?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/8107397873258640411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=8107397873258640411&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/8107397873258640411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/8107397873258640411'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/12/on-debugging-planning-macros.html' title='On Debugging Planning Macros'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_LUNtiAx0Y3E/R1kvUYAmEFI/AAAAAAAAAEs/PoFYw2GqChc/s72-c/adva_1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-4385680747639118257</id><published>2007-11-20T15:47:00.000Z</published><updated>2007-11-20T16:05:52.536Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>Quickies</title><content type='html'>From searchSAP a very useful &lt;a href="http://go.techtarget.com/r/2570137/1689974"&gt;tip to find BADIs&lt;/a&gt; (quick instructions: break on SXV_GET_CLIF_BY_NAME, use the TA and check the name in EXIT_NAME when it stops).&lt;br /&gt;&lt;br /&gt;I have to highlight &lt;a href="http://apolemia.blogspot.com/2006/11/atp-fun-i-always-suspected-that-apo.html#comments"&gt;this comment&lt;/a&gt; posted by Zoltan with a finding in the BOP source code. I won't say more, you must check it :-)&lt;br /&gt;&lt;br /&gt;In the same spirit, this &lt;a href="http://nigeljames.wordpress.com/2007/07/18/crm-and-le-tour/"&gt;post by Nigel James&lt;/a&gt; has a funny finding on CRM source.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-4385680747639118257?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/4385680747639118257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=4385680747639118257&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/4385680747639118257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/4385680747639118257'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/11/quickies.html' title='Quickies'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-4774241667851369315</id><published>2007-10-11T16:08:00.000+01:00</published><updated>2007-10-11T16:18:44.746+01:00</updated><title type='text'>Hello World</title><content type='html'>One of the joys of having a blog is being able to connect to people all over the world. Today I checked the blog statistics (more or less one year of data since I installed google analytics), and it made be very happy. No less than 98 countries, including some exotic places I would really like to visit some day: Mauritius, Trinidad and Tobago, Yemen, Namibia, Uruguay, Peru, Moldova, Panama, and many others (click to enlarge the picture). &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LUNtiAx0Y3E/Rw4-cA2GetI/AAAAAAAAAEM/Qu2d12Bt-QA/s1600-h/apolemia_world.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_LUNtiAx0Y3E/Rw4-cA2GetI/AAAAAAAAAEM/Qu2d12Bt-QA/s320/apolemia_world.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5120098477351008978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The world is a great place.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-4774241667851369315?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/4774241667851369315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=4774241667851369315&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/4774241667851369315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/4774241667851369315'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/10/hello-world.html' title='Hello World'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_LUNtiAx0Y3E/Rw4-cA2GetI/AAAAAAAAAEM/Qu2d12Bt-QA/s72-c/apolemia_world.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-31901936506659542</id><published>2007-09-29T19:30:00.000+01:00</published><updated>2007-10-10T12:46:25.226+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='abap'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>How to use ABAP  HTTP_POST</title><content type='html'>SAP has the function modules HTTP_GET and HTTP_POST to call remote urls. With HTTP_GET one can just had parameters in the URL to send information to the external system. For example, setting the url to&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;http://myserver.com/mypage?x=1&amp;y=10&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;sends x=1 and y=10 as parameters to mypage. The problem with HTTP GET is that there is a limit on the ammount of data that can be sent (technically it is unlimited in the new specification, but there are still servers that impose the old limit).&lt;br /&gt;&lt;br /&gt;To send large ammounts of data using HTTP one should use the POST method (ABAP function HTTP_POST). To accomplish the same call with HTTP_POST first the length of the data must be calculated&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;len("x=1&amp;y=10") = 8&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;then the function must be called with the following parameters&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ABSOLUTE_URI                  http://myserver.com/mypage&lt;br /&gt;REQUEST_ENTITY_BODY_LENGTH    8&lt;br /&gt;REQUEST_ENTITY_BODY           x=1&amp;y=10&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The function group URL_GENERATION has some data quoting functions to help build valid URLs. Also, the introspector tool is helpful to debug the HTTP calls.&lt;br /&gt;&lt;br /&gt;PS. This post was originally in pvl.freezope.org, but that site is down most of the time so I'm moving it here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-31901936506659542?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/31901936506659542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=31901936506659542&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/31901936506659542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/31901936506659542'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/09/how-to-use-abap-httppost.html' title='How to use ABAP  HTTP_POST'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-3571389773022443305</id><published>2007-09-28T09:17:00.000+01:00</published><updated>2007-09-28T10:15:43.838+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pass'/><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><title type='text'>Very interesting new ATP BADI</title><content type='html'>The &lt;a href="http://help.sap.com/saphelp_scm50/helpdata/en/22/977941a51a1809e10000000a155106/frameset.htm"&gt;parameter dependent safety stock &lt;/a&gt; (PASS) is a very interesting functionality introduced in SCM 5. In  its standard form one can use the forecasted demand to calculate a safety stock requirement during the ATP process. But the calculation of the safety stock value can use any other logic we want if we use the extension BADI /SAPAPO/ATP_PSS.&lt;br /&gt;&lt;br /&gt;The process flow is very simple: &lt;br /&gt;&lt;br /&gt;1) In the sales order we make sure that all information need for the calculation is transfered to APO through the field catalogue. &lt;br /&gt;&lt;br /&gt;2) In the BADI we calculate the value we want for the PASS. &lt;br /&gt;&lt;br /&gt;3) The ATP introduced the PASS dummy requirement as the first requirement in the list .&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LUNtiAx0Y3E/RvzDigbySwI/AAAAAAAAACs/ZfKXeogmgA8/s1600-h/pass0.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_LUNtiAx0Y3E/RvzDigbySwI/AAAAAAAAACs/ZfKXeogmgA8/s400/pass0.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5115178274375486210" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4) The ATP information returned to the user shows the amount of PASS that was used (which the user should read as: there is this amount of product/capacity, but its reserved for other kind of orders)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LUNtiAx0Y3E/RvzDsAbySxI/AAAAAAAAAC0/nb3OL2dKS0c/s1600-h/pass1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_LUNtiAx0Y3E/RvzDsAbySxI/AAAAAAAAAC0/nb3OL2dKS0c/s400/pass1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5115178437584243474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;5) At the end of the ATP process the PASS requirement is removed.&lt;br /&gt;&lt;br /&gt;This functionality has many use cases. The one described in the documentation is quite typical. The company wants to keep some quantity always available for rush orders, so a PASS value is defined and the user exit changes the PASS value to zero when the order type is of type "rush order". &lt;br /&gt;&lt;br /&gt;A slightly more complex use case is to use PASS to enforce the allocation quotas at the product availability level. Product allocation is decoupled from the product availability check in ATP, so if a customer has consumed all allocation for the current period the system will shift the availability date to first day of the next period. But it will still be consuming stock/receipts from the previous period if such elements exist. For example, in the picture bellow the red customer places two orders of 100 in month 1. Since he only has 100 of allocation in each month the second order date is shifted for the first day of month 2. But it still uses the receipt from month 1.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LUNtiAx0Y3E/RvzD4QbySyI/AAAAAAAAAC8/3AcYGLJ2yb0/s1600-h/pass2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_LUNtiAx0Y3E/RvzD4QbySyI/AAAAAAAAAC8/3AcYGLJ2yb0/s400/pass2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5115178648037640994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When the orange customer places an order of 200 on month 1 it fails. It is possible from the point of view of allocation, but since the red customer orders are both using the receipt of month 1 the system can only confirm the orange order in month 2.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LUNtiAx0Y3E/RvzEAgbySzI/AAAAAAAAADE/NP6wo4siRoU/s1600-h/pass3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_LUNtiAx0Y3E/RvzEAgbySzI/AAAAAAAAADE/NP6wo4siRoU/s400/pass3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5115178789771561778" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is the typical problem and with PASS this scenario can be improved. Based on the   allocation data (quota and consumption) a PASS value can be calculated to protect the allocation receipts. That way, when the latter customers place their orders the system will still have both allocation and receipts to confirm the orders in the expected periods. The picture bellow shows the same process when using PASS to protect the open allocation of the orange customer.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_LUNtiAx0Y3E/RvzEHwbyS0I/AAAAAAAAADM/u0u1Ec2dTPM/s1600-h/pass4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_LUNtiAx0Y3E/RvzEHwbyS0I/AAAAAAAAADM/u0u1Ec2dTPM/s400/pass4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5115178914325613378" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A last remark on using PASS with the R3. The &lt;a href="http://help.sap.com/saphelp_scm50/helpdata/en/b2/887941a51a1809e10000000a155106/frameset.htm"&gt;documentation &lt;/a&gt;makes a reference that it is only supported by CRM and it seems to be because there is no user interface to define the PASS type parameter that APO is expecting to receive from R3. But using the BADI APO_BAPI_BUS10400 we can change the parameters coming from R3 and, in this case, we just need to put something like:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;METHOD if_ex_apo_bapi_bus10400~change_inputparamextern.&lt;br /&gt;  DATA: ls_req TYPE bapi10400req.&lt;br /&gt;  LOOP AT requirements INTO ls_req.&lt;br /&gt;    ls_req-safety_stock_parameter = 'P'.&lt;br /&gt;    MODIFY requirements INDEX sy-tabix FROM ls_req.&lt;br /&gt;  ENDLOOP.&lt;br /&gt;ENDMETHOD.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-3571389773022443305?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/3571389773022443305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=3571389773022443305&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/3571389773022443305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/3571389773022443305'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/09/very-interesting-new-atp-badi.html' title='Very interesting new ATP BADI'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_LUNtiAx0Y3E/RvzDigbySwI/AAAAAAAAACs/ZfKXeogmgA8/s72-c/pass0.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-6520832068700317419</id><published>2007-09-20T10:59:00.000+01:00</published><updated>2007-09-20T13:11:31.502+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sap'/><title type='text'>Quick Update</title><content type='html'>First, time to say goodbye to SAP. There is not much to tell, the company did a reorganization that ended the Hubs and working for the local consulting office was never in my plans. So it's time for a change. I still think the Hub concept is a great idea and I'm happy to have been part of the SCM Hub. Walldorf is a great technology campus, full of youth and energy (more on my view of the company in a latter post). &lt;br /&gt;&lt;br /&gt;SAP also announced yesterday it's secret weapon. TechnologyDriven makes a &lt;a href="http://technologydriven.wordpress.com/2007/09/19/a1s-is-sap-business-bydesign/"&gt;good review &lt;/a&gt;of what can be &lt;span style="font-style:italic;"&gt;the most important product for SAP since R/3&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-6520832068700317419?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/6520832068700317419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=6520832068700317419&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/6520832068700317419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/6520832068700317419'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/09/quick-update.html' title='Quick Update'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-5074720623210257180</id><published>2007-08-23T15:54:00.000+01:00</published><updated>2007-08-23T15:56:14.000+01:00</updated><title type='text'>No way. That could never be true ;-)</title><content type='html'>&lt;a href="http://www1.juiceanalytics.com/writing/2007/08/centralized-confusion/#c1"&gt;Quote&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;"Sometimes it seems that BI databases have a development cycle of two years and a half life of 12 months."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-5074720623210257180?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/5074720623210257180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=5074720623210257180&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/5074720623210257180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/5074720623210257180'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/08/no-way-that-could-never-be-true.html' title='No way. That could never be true ;-)'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-5951002879907787909</id><published>2007-08-23T14:55:00.000+01:00</published><updated>2007-08-23T15:58:26.769+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><title type='text'>Why so much blue?</title><content type='html'>I'm not very critic of the SAP standard GUI. Sure it doesn't look as cool as the Apple OSX, but, on the other hand, it's great the consistency between the thousands of applications running inside the ERP.&lt;br /&gt;&lt;br /&gt;But there are clearly some usability issues like the debug screen bellow. It uses a fixed (and small) portion of the screen to display the table data. But since the table has many columns one has to navigate right and left by clicking several times a small button. It's a pain.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LUNtiAx0Y3E/Rs2afechPzI/AAAAAAAAACY/O6eW9kXIn6s/s1600-h/debug_screen.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_LUNtiAx0Y3E/Rs2afechPzI/AAAAAAAAACY/O6eW9kXIn6s/s400/debug_screen.png" alt="" id="BLOGGER_PHOTO_ID_5101903818419945266" 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/6297557-5951002879907787909?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/5951002879907787909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=5951002879907787909&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/5951002879907787909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/5951002879907787909'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/08/why-so-much-blue.html' title='Why so much blue?'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_LUNtiAx0Y3E/Rs2afechPzI/AAAAAAAAACY/O6eW9kXIn6s/s72-c/debug_screen.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-2364701357867123129</id><published>2007-07-18T10:51:00.000+01:00</published><updated>2007-07-18T11:10:21.885+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bop'/><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><title type='text'>Three stages BOP model</title><content type='html'>Users expect a lot from backorder processing (BOP). Since this is the transaction that will change dates and confirmations in the sales orders, it’s one of the major interfaces between planning and execution. A good plan will make users happy; a bad plan can ruin the orderbook. Being so, sometimes planners want BOP to make a miracle, that won't happen. But sometimes times they are not taking the most of it.&lt;br /&gt;&lt;br /&gt;One common request is to have stability and still improve dates whenever possible. To have stability is important to check the plan on the confirmed date, but to have improvements the check must be made against requested date. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_LUNtiAx0Y3E/Rp3jio_6SEI/AAAAAAAAABU/ewt6b8TO29k/s1600-h/bop1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_LUNtiAx0Y3E/Rp3jio_6SEI/AAAAAAAAABU/ewt6b8TO29k/s400/bop1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5088473338259064898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The many options used in practice comprise:&lt;br /&gt;&lt;br /&gt;1) BOP checking always on the requested date&lt;br /&gt;2) BOP checking the confirmed date and manual selective improvements by doing new ATP checks in the sales orders&lt;br /&gt;3) Run BOP on the confirmed date and give dispatching users tools (based on pegging for example) to ship before the confirmed date if the material is ready&lt;br /&gt;4) Run BOP on confirmation date with the flag of checking the first version (this essentially makes the check on the first confirmed date and not on the current confirmed date)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LUNtiAx0Y3E/Rp3kQ4_6SFI/AAAAAAAAABc/cRNha0umzOE/s1600-h/bop2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_LUNtiAx0Y3E/Rp3kQ4_6SFI/AAAAAAAAABc/cRNha0umzOE/s400/bop2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5088474132828014674" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;5)BOP running in two stages, first based on confirmation and after based on requested date&lt;br /&gt;&lt;br /&gt;This post is about this last option. Although there is nothing hard on that strategy it’s use is not always obvious.&lt;br /&gt;&lt;br /&gt;By running BOP based on confirmation date, and with the typical settings of new distribution one is able to solve negative ATP issues, with rescheduling typically based on delivery priorities or/and requested date. If there is no negative ATP problem for the material (during the time line the available receipts are able to always satisfy the requirement dates) then nothing will change in the confirmation, the stability property much desired for the operation.   &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LUNtiAx0Y3E/Rp3koY_6SGI/AAAAAAAAABk/SSnZzRlErCA/s1600-h/bop3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_LUNtiAx0Y3E/Rp3koY_6SGI/AAAAAAAAABk/SSnZzRlErCA/s400/bop3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5088474536554940514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On the other hand some receipts may be available earlier than when the first confirmation was defined. Since in these cases the first BOP run will maintain the confirmation date, a second BOP run is needed to improve those cases. This second run should check by the requested date and not have new distribution settings.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LUNtiAx0Y3E/Rp3kxY_6SHI/AAAAAAAAABs/NJn1KZqWaZE/s1600-h/bop4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_LUNtiAx0Y3E/Rp3kxY_6SHI/AAAAAAAAABs/NJn1KZqWaZE/s400/bop4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5088474691173763186" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;By not setting the new distribution flags the system will check each order without setting free the receipts for the other orders in the BOP run. Since a previous run was performed that solved all negative ATP issues, this second run will check each order against the same receipt of the previous ATP and will move the confirmed date closer to the requested date whenever possible.&lt;br /&gt;&lt;br /&gt;The third stage is to run BOP for the unconfirmed orders. By excluding unconfirmed orders from the first and second step the available ATP quantities will not be used by unconfirmed orders of high priority customers, which would result in a less stable result.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LUNtiAx0Y3E/Rp3k64_6SII/AAAAAAAAAB0/FKOj0FVedHA/s1600-h/bop5.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_LUNtiAx0Y3E/Rp3k64_6SII/AAAAAAAAAB0/FKOj0FVedHA/s400/bop5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5088474854382520450" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Regarding the other strategies that only execute BOP based on confirmed date, this three staged strategy has some obvious advantages. There is less workload to manually improve orders and there is an overall visibility improvement by having confirmed dates close to the real dispatching date. &lt;br /&gt;&lt;br /&gt;Running based on the first confirmed date can be seen as a compromise between stability and improvement. Nonetheless, it has still the stability issues of running on a date different from the confirmation and will not give the full improvement possible. The three staged approach will generally give a better combination of stability and improvement. It’s possible that in some cases the customer as agreed to the first confirmed date in a way that the system should never try to improve that date. In those cases the second step should check under these conditions. &lt;br /&gt;&lt;br /&gt;Regarding the strategy to run BOP on the requested date, this strategy also has some advantages. It enables more stability both on the first confirmation date, and in all BOP runs. Running BOP on requested date is more used for industries that are often faced with the issue of distributing limited supply giving priority to special customers. This strategy is not so adequate for industries trying to apply a policy of “first in first served”, with emphasis with reliability on the first confirmation result. &lt;br /&gt;&lt;br /&gt;Music playing: Kill Bill OST&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-2364701357867123129?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/2364701357867123129/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=2364701357867123129&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/2364701357867123129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/2364701357867123129'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/07/three-stages-bop-model.html' title='Three stages BOP model'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_LUNtiAx0Y3E/Rp3jio_6SEI/AAAAAAAAABU/ewt6b8TO29k/s72-c/bop1.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-2049264114908672775</id><published>2007-07-13T11:32:00.000+01:00</published><updated>2007-07-13T11:47:32.234+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debug'/><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><title type='text'>Places to take a break</title><content type='html'>Just a list of places for break-points in ATP processes:&lt;br /&gt;&lt;br /&gt;In APO: /sapapo/rrp_atp_check (for CTP), /sapapo/quota_check (PAL), /sapapo/avail_check_controller (ATP and BOP).&lt;br /&gt;&lt;br /&gt;In R3: saplvo3c_apoint has the call to bapi_apo_scheduling; saplatpc has the call to bapi_apoatp_check.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-2049264114908672775?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/2049264114908672775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=2049264114908672775&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/2049264114908672775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/2049264114908672775'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/07/places-to-take-break.html' title='Places to take a break'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-8989229484562563329</id><published>2007-07-13T10:40:00.000+01:00</published><updated>2007-07-13T11:32:14.793+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>Strange Industry</title><content type='html'>In a recent post from &lt;a href="http://theotherthomasotter.wordpress.com/"&gt;Vendorprisey&lt;/a&gt; Thomas shared some marketing numbers for the software industry:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Salesforce.com’s sales and marketing costs, for example, typically hover between 50% and 70% of revenue, according to past financial statements. That’s huge compared to traditional software vendors where sales and marketing costs typically run between 20% and 25% of revenue&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;You are the customer. They sell you software for $$$. Then if you find problems using the product they ask you to create a bug report, and pay you zero for that work. Then they go and spend $ of your money on mailing you some half plastic paper ads. Then they ask you on ways to improve the product, features you are missing, etc (again zip for that work of helping develop the product). And they go spend more of your $ on leaflets or TV commercials. The time comes and you are told: your software is not longer supported, either upgrade to be safe (and pay us $$$) or be aware that your product might blow-up and kill your pet. And they go spend $ of your money on some magazine ad.&lt;br /&gt;&lt;br /&gt;It's a strange industry. Basically sells brainwashing with software as byproduct. Then again, if that is what the customer wants, so be it.&lt;br /&gt;&lt;br /&gt;Don't like it? Then take some &lt;a href="http://www.flickr.com/photos/pedrolima/797211477/" title="Photo Sharing"&gt;fresh air with linux. &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-8989229484562563329?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/8989229484562563329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=8989229484562563329&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/8989229484562563329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/8989229484562563329'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/07/strange-industry.html' title='Strange Industry'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-1158658848429657230</id><published>2007-05-28T21:05:00.000+01:00</published><updated>2007-05-28T21:28:52.054+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><category scheme='http://www.blogger.com/atom/ns#' term='apo'/><title type='text'>Force ATP on R3</title><content type='html'>With the move of the sales orders ATP into APO, one also has to move all other ATPs for  that material. It's logical, but the change can be a pain. Sometimes developments exist in deliveries during the batch determination and it would be so much easier for the ATP to stay in R3 for the delivery check.&lt;br /&gt;&lt;br /&gt;The function AVAILABILITY_CHECK has a very interesting parameter P_ATPCA-FORCE_R3 that gives credit to the name. If it is flagged it forces the ATP to be performed in R3. It can be changed from EXIT_SAPLATPC_001 with that common &lt;a href="http://apolemia.blogspot.com/2004/03/userexit-hacking-here-is-very-useful.html"&gt;trick&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Dear lazy web, is there a better way to do it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-1158658848429657230?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/1158658848429657230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=1158658848429657230&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/1158658848429657230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/1158658848429657230'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/05/force-atp-on-r3.html' title='Force ATP on R3'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-1391175578352831382</id><published>2007-04-10T19:39:00.000+01:00</published><updated>2007-04-10T19:50:31.637+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><title type='text'>ATP quickies</title><content type='html'>Some quick notes, all regarding the ATP process. First some tables that I had to dig for recently: //SCHEDLIN and //OBREF. In the first one we can find the first confirmed date  of an order item. The second has the link between orders and deliveries.&lt;br /&gt;&lt;br /&gt;Then OSS note 987299 that includes some major enhancements to report //SDRQCR21, namely the possibility of running in iteration mode (like the delta report), running just for a specific sales order, do the PAL check just for the open orders (no more major shift of orders between PAL buckets) and some other things. As this report is a known pain, this is good news.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-1391175578352831382?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/1391175578352831382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=1391175578352831382&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/1391175578352831382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/1391175578352831382'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/04/atp-quickies.html' title='ATP quickies'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-8668176746499217952</id><published>2007-03-24T16:18:00.000Z</published><updated>2007-03-24T20:56:41.988Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><title type='text'>It's hard to sail against the ATP wind</title><content type='html'>&lt;span style="font-style:italic;"&gt;I really don't know why I keep coming with the sailing theme when I want to talk about the ATP process.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Anyhow, when using APO there is a direction that can make life easier. A direction related to the change of sales orders confirmed delivery dates. This is mainly true in industries doing assemble-to-order, configure-to-order, etc. For pure make-to-stock the confirmed date does not matter. Either there is stock or the order will most probably be lost.&lt;br /&gt;&lt;br /&gt;What means going with the wind?&lt;br /&gt;&lt;br /&gt;Suppose an ATP system that gives a first confirmed date that is a bit optimistic. For example, a customer requests a product for a date 20 days from now and the ATP system says it can be done in 30 days and let's say there is 30% probability that this data will have a delay (that's why I call it optimistic). In this case the automatic planning (heuristics and optimizer) will work to minimize the delays. Planners may do some high level actions, like over-time shifts, but the system will mostly work alone to move the dates that cannot be fulfilled into a future date.&lt;br /&gt;&lt;br /&gt;So what does it mean to go against the wind?&lt;br /&gt;&lt;br /&gt;Suppose that ATP gives a first confirmed date that is pessimistic. For example, for the same order the ATP system gives a date 50 days in the future and there is a 99% chance of delivering in that date (although there is a good chance of delivering earlier). For a constant process variability, this extra reliability is achieved by having some empty plan space between the present and the confirmed date. But since no company will stop production having orders in the future something must be done to remove those empty spaces, which means increasing stock, or most likely improve the confirmed dates to something closer to the date requested by the customer. Unfortunately, automatic planning is mostly oriented to fulfill the confirmed dates, and thus it becomes manual work for the planner. Moving confirmed dates in the direction of the present is hard, like sailing a against the wind.&lt;br /&gt;&lt;br /&gt;The bottom line: there are good reasons to be optimistic, not only in life (less diseases, etc) but also in ATP.&lt;br /&gt;&lt;br /&gt;How to be optimistic?&lt;br /&gt;&lt;br /&gt;There are many decisions that go along the optimistic path. When using CTP with PPDS, using finite planning in as few bottleneck resources as possible. With block planning using CTP bucket capacity. With product allocation (PAL) having few structures with very restrictive segment capacities (and going more for sequence of flat structures than for deep hierarchical ones). Also avoid modeling several times the same capacity constraints. The ATP checking horizon also goes well in the optimistic direction.  &lt;br /&gt;&lt;br /&gt;Music theme for this post: &lt;a href="http://en.wikipedia.org/wiki/Always_Look_on_the_Bright_Side_of_Life"&gt;always look on the bright side of life&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-8668176746499217952?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/8668176746499217952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=8668176746499217952&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/8668176746499217952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/8668176746499217952'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/01/its-hard-to-sail-against-atp-wind.html' title='It&apos;s hard to sail against the ATP wind'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-7954744195088742541</id><published>2007-03-04T20:04:00.000Z</published><updated>2007-07-13T18:13:07.386+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='quote'/><title type='text'>It's all about damage control</title><content type='html'>&lt;blockquote&gt;"The fundamental function of 95% of the IT executives I’ve met is damage control."&lt;/blockquote&gt;&lt;br /&gt;from &lt;a href="http://www.mikestopforth.com/2007/02/17/lessons-learned-from-social-software-implementations/"&gt;Mike Stopforth's blog&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-7954744195088742541?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/7954744195088742541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=7954744195088742541&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/7954744195088742541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/7954744195088742541'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/03/its-all-about-damage-control.html' title='It&apos;s all about damage control'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-466296602099021791</id><published>2007-02-17T11:12:00.000Z</published><updated>2007-02-17T11:43:50.302Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='tpvs'/><category scheme='http://www.blogger.com/atom/ns#' term='abap'/><title type='text'>Quick links</title><content type='html'>A nice &lt;a href="http://www.inboundlogistics.com/digital/tms_chart.pdf"&gt;comparative chart of TMS solutions&lt;/a&gt;, including TP/VS, from &lt;a href="http://www.inboundlogistics.com"&gt;inbound logistics &lt;/a&gt;(via &lt;a href="http://at-scm.com/index.php/2007/02/12/supply-chain-management/a-review-of-transportation-management-system-tms-players/"&gt;@scm&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;A &lt;a href="https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/5861"&gt;simple function &lt;/a&gt;module to export any internal table to MS Excel.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-466296602099021791?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/466296602099021791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=466296602099021791&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/466296602099021791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/466296602099021791'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/02/quick-links.html' title='Quick links'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-6918350798334148074</id><published>2007-02-06T14:07:00.000Z</published><updated>2007-02-06T14:15:55.215Z</updated><title type='text'>As cool as it can get</title><content type='html'>&lt;a href="http://shop.lego.com/Product/?p=EL502"&gt;&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_LUNtiAx0Y3E/RciMmBFNAfI/AAAAAAAAABA/O0e_aLIvaug/s400/lego_ice_cube.jpg" border="0" alt="" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;via &lt;a href="http://blog.karlus.net/archives/2007/02/06/1649"&gt;ramblings&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-6918350798334148074?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/6918350798334148074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=6918350798334148074&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/6918350798334148074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/6918350798334148074'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/02/as-cool-as-it-can-get.html' title='As cool as it can get'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_LUNtiAx0Y3E/RciMmBFNAfI/AAAAAAAAABA/O0e_aLIvaug/s72-c/lego_ice_cube.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-7697889111936303693</id><published>2007-02-05T18:20:00.000Z</published><updated>2007-02-05T18:24:44.244Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='sdn'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>SDN Pirates</title><content type='html'>This video by some of the SDN team members is way ahead (original SDN post &lt;a href="https://weblogs.sdn.sap.com/pub/wlg/5752"&gt;here&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/rOQvn-ivthw"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/rOQvn-ivthw" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-7697889111936303693?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/7697889111936303693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=7697889111936303693&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/7697889111936303693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/7697889111936303693'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/02/sdn-pirates.html' title='SDN Pirates'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-292890814276417334</id><published>2007-02-03T17:38:00.000Z</published><updated>2007-02-03T17:50:30.342Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='sap'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Freaking coincidence</title><content type='html'>Today I went to &lt;a href="http://portolinux.pbwiki.com/"&gt;Porto Linux Users Group&lt;/a&gt; to make a presentation on &lt;a href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt;. And there was also a presentation of &lt;a href="http://www.rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt; by &lt;a href="http://mywheel.net/blog/"&gt;Mário Lopes&lt;/a&gt;. It happens that I've joined SAP this month (SCM EMEA Hub) and it turns out that Mário will join SAP at Palo Alto next month. &lt;br /&gt;&lt;br /&gt;I would rather have won the lottery, but this is also something very unlikely to happen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-292890814276417334?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/292890814276417334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=292890814276417334&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/292890814276417334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/292890814276417334'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/02/freaking-coincidence.html' title='Freaking coincidence'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-2673989397405419866</id><published>2007-01-26T11:31:00.000Z</published><updated>2007-01-26T12:32:56.277Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='analytics'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>Reading Freakonomics</title><content type='html'>I spent this last weekend with a small but juicy book named &lt;a href="http://www.freakonomics.com/thebook.php"&gt;Freakonomics&lt;/a&gt;. Freakonomics is about society and economy but it's also about knowledge extracted from data. It's a book clearly about data mining results but the authors make a clear efford to remove the focus from data mining, machine learning, statistics, etc. One can just find some timid references like "algorithm" and "data to be mined here". Instead, there is a strong focus on the making of interesting questions and getting the correct data to answer the questions. &lt;br /&gt;&lt;br /&gt;Although my work is not directly related to analytics, I've  always made some effort to include data analysis in my APO related work (perhaps because I used it a lot in college research). And that last conclusion goes along with my experience over the years. In a couple of situations I was able to get interesting results from data, but in most cases the techniques were not so important. After the right data for a good question reveals unexpected results, everything else is just easy. &lt;br /&gt;&lt;br /&gt;Looking back in time, I think knowing more about analytics has helped me in a different way. Knowing the data and making good questions is an iterative process. Having some tools to do experiments is a good way to keep the loop running and the more time spent with the data, the higher is the probability of making the "golden" question.&lt;br /&gt;&lt;br /&gt;Freakonomics was a pleasure to read.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-2673989397405419866?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/2673989397405419866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=2673989397405419866&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/2673989397405419866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/2673989397405419866'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/01/reading-freakonomics.html' title='Reading Freakonomics'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-6111811673320496202</id><published>2007-01-05T18:02:00.000Z</published><updated>2007-01-12T22:24:25.745Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='scm'/><category scheme='http://www.blogger.com/atom/ns#' term='excel'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Microsoft SCM</title><content type='html'>SAP, I2, Oracle and others fight hard to be the second most important tool in the supply chain management business. Yes, the second, because we all know that Excel is the software that runs most supply chains (sometimes alone, sometimes together with an ERP/APS). &lt;br /&gt;&lt;br /&gt;So it was with interest that I checked &lt;a href="http://msdn2.microsoft.com/en-us/architecture/aa702528.aspx"&gt;this Microsoft initiative&lt;/a&gt; to build SCM toolsets based on Office software.&lt;br /&gt;&lt;br /&gt;After reading &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/obarapscm.asp"&gt;the story&lt;/a&gt; I got two feelings. First, they are right. Second, it seems something from the past. If it was done 10 years ago it could make a difference, but now it seems to lack the magic ingredient of internet collaboration (the social buzz).&lt;br /&gt;&lt;br /&gt;But again, it's interesting and I will try the toolkit one of these days. I can easily imagine the best of supply chain planning being done on an improved Excel based framework. &lt;br /&gt;&lt;br /&gt;I cannot resist making a quote from the document:&lt;br /&gt;&lt;br /&gt;"That said, an OBA is a great way to surface information out of a SOA, and having LOB applications exposed as services makes it easier to build support for cross-functional processes into an OBA."&lt;br /&gt;&lt;br /&gt;When I read this stuff, I can't take my mind from this cartoon. Damm, bad cartoon, go away please. Let me be a grown-up.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;img src="http://3.bp.blogspot.com/_LUNtiAx0Y3E/RagJ8GqQP9I/AAAAAAAAAAM/QO3vGrRSW08/s320/Mauve+has+the+most+RAM2.JPG" border="0" alt="" /&gt;&lt;br /&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-6111811673320496202?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/6111811673320496202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=6111811673320496202&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/6111811673320496202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/6111811673320496202'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/01/microsoft-scm.html' title='Microsoft SCM'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_LUNtiAx0Y3E/RagJ8GqQP9I/AAAAAAAAAAM/QO3vGrRSW08/s72-c/Mauve+has+the+most+RAM2.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-7074619548687759654</id><published>2007-01-03T14:36:00.000Z</published><updated>2007-01-03T14:39:49.562Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='concept'/><title type='text'>The SOA thing as I would explain to my mother</title><content type='html'>Take SAP SCM tool as an example. To be able to do transportation planning the addresses of customers, vendors and plants need to be defined in geographical coordinates, so that it becomes possible to define and optimize the distance between places. This task of finding the latitude and longitude from the address data is called geocoding. &lt;br /&gt;&lt;br /&gt;With SCM comes a plug-in software that one can install to do the geocoding. Of course this is not a very powerful tool, it comes with a limited database of addresses and just for some countries. This is the traditional architecture, the software has some plug-in that solves a particular need.&lt;br /&gt;&lt;br /&gt;But with &lt;a href="http://apolemia.blogspot.com/2006/08/goodbye-mapguide-hello-google-geocoder.html"&gt;some little work&lt;/a&gt; one can plug the SCM to use the geocoding web service provided by Yahoo or Google. That way one can get very good geocoding without the burden of having to buy, install and update a large geocoding address database. This is the SOA architecture. The software uses a stand-alone webservice internal or external to the company.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-7074619548687759654?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/7074619548687759654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=7074619548687759654&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/7074619548687759654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/7074619548687759654'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/01/soa-thing-was-i-would-explain-to-my.html' title='The SOA thing as I would explain to my mother'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-8658976115397969327</id><published>2007-01-03T12:07:00.000Z</published><updated>2007-01-03T12:16:04.928Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='sap'/><category scheme='http://www.blogger.com/atom/ns#' term='transaction'/><title type='text'>OY19 - Customizing Cross-System Viewer</title><content type='html'>Only recently I was told about this transaction. With OY19 one can check customizing between systems (for example compare contents of transports or a list of tables to see data differences). It would have saved me time in the past, so maybe you can also find it useful.&lt;br /&gt;&lt;br /&gt;PS. Humm, happy new year!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-8658976115397969327?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/8658976115397969327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=8658976115397969327&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/8658976115397969327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/8658976115397969327'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2007/01/oy19-customizing-cross-system-viewer.html' title='OY19 - Customizing Cross-System Viewer'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-7646051994800957248</id><published>2006-12-29T17:15:00.000Z</published><updated>2006-12-29T17:24:13.778Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='data visualization'/><title type='text'>Pacman chart</title><content type='html'>I'm going to join the anti pie chart crusade showing this cool chart from &lt;a href="http://www.boingboing.net"&gt;boing boing&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.boingboing.net/2006/11/02/hilarious_piechartvi.html"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://craphound.com/images/pacmancharthumor.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sure pie charts are bad charts. If you like good data visualization, then see &lt;a href="http://video.google.com/videoplay?docid=7996617766640098677"&gt;this  presentation&lt;/a&gt; from &lt;a href="http://gapminder.org/"&gt;gapminder&lt;/a&gt;. Highly recommended.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-7646051994800957248?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/7646051994800957248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=7646051994800957248&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/7646051994800957248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/7646051994800957248'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/12/pacman-chart.html' title='Pacman chart'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-3390377313100094668</id><published>2006-12-29T11:43:00.000Z</published><updated>2006-12-29T11:45:53.970Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='bop'/><category scheme='http://www.blogger.com/atom/ns#' term='training'/><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><title type='text'>Teaching Backorder Processing with Cards</title><content type='html'>The backorder processing (BOP) is the process that takes into account the supply chain plan and updates the promised dates in the sales orders. Although BOP concepts are simple, the results are often hard for planners to understand. There are some BOP parameters that have a large influence in the results, and unless users really understand these parameters they will always feel uncomfortable when looking at the results.&lt;br /&gt;&lt;br /&gt;Some of these BOP concepts are easier to explain by playing with some cards. Here is my proposal after having done some work with users to improve this process on SCM 4.1. &lt;br /&gt;&lt;br /&gt;The types of cards include:  "sales", "stock and "planned productions". &lt;br /&gt;&lt;br /&gt;The sales have order entry date, order requested date, order confirmed date, material and quantity. The stock cards have material and quantity. The planned orders have material, quantity, completion date.&lt;br /&gt;&lt;br /&gt;Some simple exercises:&lt;br /&gt;&lt;br /&gt;1) Do a BOP with sort by confirmed date and check by confirmed date&lt;br /&gt;&lt;br /&gt;2) Do a BOP with sort by requested date and check by requested date&lt;br /&gt;&lt;br /&gt;The planners are expected to split the sales cards by materials, then for each material sort according to the sort date. Do the same sorting for the planned orders cards and put the stock cards in the top. Then they should match the requirements and receipts. As a final result they record in a piece a paper the order number and an up, horizontal or down arrow for improved, maintained and delayed dates.&lt;br /&gt;&lt;br /&gt;Some other exercises:&lt;br /&gt;&lt;br /&gt;3) A BOP with sort by save date and check by requested date (simulation of the ATP done when saving the orders).&lt;br /&gt;&lt;br /&gt;4) A BOP with sort by confirmed date and check by requested date (planners are sometimes surprised how this can have results so different from the ones of exercise 2).&lt;br /&gt;&lt;br /&gt;Then some more complex experiments can be done. For example, removing one planned order and doing the simulation exercise with the "new distribution" option set and unset. &lt;br /&gt;&lt;br /&gt;These exercises there will probably trigger some discussion about the sort criteria, for example on using order priority or other new fields. It is also good to discuss the trade-offs of confirmation date stability and improvements on the first confirmed date.&lt;br /&gt;&lt;br /&gt;And finally, but also very important, your users will thank you for some training time spent away from the computer screen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-3390377313100094668?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/3390377313100094668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=3390377313100094668&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/3390377313100094668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/3390377313100094668'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/12/teaching-backorder-processing-with.html' title='Teaching Backorder Processing with Cards'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-116591550391294533</id><published>2006-12-12T09:18:00.000Z</published><updated>2006-12-17T22:55:11.151Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='lego'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='gardena'/><title type='text'>The Lego Analogy</title><content type='html'>Very interesting &lt;a href="http://theotherthomasotter.wordpress.com/2006/12/11/lego-enterprise-apps-design-soa-and-hasso-plattner-2/"&gt;this post&lt;/a&gt; about the use of the Lego analogy when presenting enterprise software. The Lego analogy is an old pal. I remember it in Visual Basic, then I remember seeing it in Zope talks. I never saw it in SOA, but then, I don't pay a lot of attention to the SOA thing.&lt;br /&gt;&lt;br /&gt;I also think Lego is a bad analogy for enterprise software. From my experience with computers, the closest to the Lego would be a scripting language with a large object oriented library. One can just start assembling a bunch of pieces, no previous design needed, and in a reasonable amount of time get the wanted result.&lt;br /&gt;&lt;br /&gt;When I think of SOA I usually think more of something in the line of the &lt;a href="http://www.gardena.com/servlet/CategoryDisplay?catalogId=10052&amp;storeId=10052&amp;amp;amp;amp;categoryId=12552&amp;amp;langId=10"&gt;Garderna system&lt;/a&gt;. In most of these accessories water is meant to flow, so hoses of different dimensions are needed to connect the pieces. Since all pieces connect using the same standard, it becomes really easy to plug and unplug equipments to the hoses.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;img src="http://photos1.blogger.com/x/blogger/7520/22/400/319845/00976-50_kl.jpg" alt="" border="0" /&gt;&lt;br /&gt;&lt;img src="http://photos1.blogger.com/x/blogger/7520/22/400/438375/00915-50_kl.jpg" alt="" border="0" /&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;But people are not expected to build the equipments, each piece is already a fully working product. People just have to think what are the pieces they need for their garden (or they start by buying the basic and then add more when budget allows).&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;img src="http://photos1.blogger.com/x/blogger/7520/22/400/459311/08125-20_kl.jpg" alt="" border="0" /&gt;&lt;br /&gt;&lt;img src="http://photos1.blogger.com/x/blogger/7520/22/400/148035/01825-20_kl.jpg" alt="" border="0" /&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;And of course, like models, all analogies are wrong, but some may be useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-116591550391294533?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/116591550391294533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=116591550391294533&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/116591550391294533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/116591550391294533'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/12/lego-analogy-very-interesting-this.html' title='The Lego Analogy'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-116422862529065387</id><published>2006-11-22T20:33:00.000Z</published><updated>2006-12-26T11:20:51.657Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='enterprise2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='mashup'/><title type='text'>Google Calendar for Enterprise Mashups?</title><content type='html'>Enterprise software houses have done a lot to put web based collaboration tools in their software. My feeling is that the business-business (B2B) web collaboration revolution is yet to happen. But it may happen with what is being called the enterprise mashups (something that I understand as meaning data flowing from and into simple and collaborative web applications). This post is a ramble on enterprise mashups with an example based on Google Calendar.&lt;br /&gt;&lt;br /&gt;I remember that in &lt;a href="http://www.amazon.com/Adapt-Die-Transforming-Adaptive-Business/dp/0471265438"&gt;Adapt or Die&lt;/a&gt;, Claus Heinrich described the major blocking factors for company-company web interaction. The key factor was to put people working together on some numbers. To be able to effectively start the company-company talk he advised against starting with complex software (surprising coming from a high executive of SAP). His advice was to use a spreadsheet in a shared folder, where people from different companies can update the data. Then he expanded to some more software based portal solutions, but for me, the "step one", the shared data somewhere in between two companies is still the vision I retain from the book. In this step one, people would share simple numbers from inventory and production dates from both companies.&lt;br /&gt;&lt;br /&gt;For some companies the step one is still a lot of integration. Let’s consider the step zero, something with very low commitment and very low workload, the automatic email to the vendor/customer. For example, company A buys raw materials and wants to know the dates they will receive the goods. If changes happen in the planned dates, they want to know the new dates. So the raw material company B sends an automatic email to the purchase responsible (PR) of company A every time the order confirmed date changes. Taking this as step zero, something that works and is being used worldwide, assuming step one is still hard to reach, what could be step 0.5? Here is an idea.&lt;br /&gt;&lt;br /&gt;Google calendar is a web application, very suitable for collaboration and with a programmable API. So, company B could maintain a shared calendar for his customer A, having some interface to automatically maintain the calendar events corresponding to the days the customer would receive the goods. It would still send the mails and the mails can have a direct link to the calendar.&lt;br /&gt;&lt;br /&gt;Why this can be a good solution?&lt;br /&gt;&lt;br /&gt;There is still very little commitment and workload in the interaction. The PR gets a simple way to access an overview of planned receipts without having to work on the other company software system (this is important because of logins and passwords, learning how to use the tool, etc). And the PR can see several vendors together if they all make their data available for this web calendar system (for sure it would be feasible to offer the data in N possible calendar applications).&lt;br /&gt;&lt;br /&gt;At last, and also important, company A can use the API to fetch the data and make it available in their system for further use (for example in the planning). It's quite simple to put and query data in the calendar (but I think currently the Google calendar API does not allow edits or deletes).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/7520/22/1600/calendar1.1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/7520/22/400/calendar1.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The web calendar is interesting. A web spreadsheet having a programmable API could open the door to even more interesting scenarios.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Update&lt;/span&gt;: I just saw this &lt;a href="http://ajaxian.com/archives/tasks-added-to-google-calendar-by-milkers"&gt;link&lt;/a&gt; about the integration between the a task management application (Remember the Milk) and Google Calendar. It is a great example of data flow, even simpler than what I was thinking when I wrote this post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-116422862529065387?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/116422862529065387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=116422862529065387&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/116422862529065387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/116422862529065387'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/11/google-calendar-for-enterprise-mashups.html' title='Google Calendar for Enterprise Mashups?'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-116411149687625006</id><published>2006-11-21T12:15:00.000Z</published><updated>2006-12-17T22:55:58.391Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='oss'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>One million and counting</title><content type='html'>Just a small note (pun) to celebrate OSS having reached 1000000 notes.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;img style="display: block;" src="http://photos1.blogger.com/blogger/7520/22/320/1000000.png" alt="" border="0" /&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;Image done with the cool &lt;a href="http://metaatem.net/words/"&gt;spell with flickr&lt;/a&gt; tool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-116411149687625006?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/116411149687625006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=116411149687625006&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/116411149687625006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/116411149687625006'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/11/one-million-and-counting-just-small.html' title='One million and counting'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-116345954890515235</id><published>2006-11-13T23:03:00.000Z</published><updated>2006-12-17T22:53:36.017Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Quick links</title><content type='html'>Ankur Gupta has a &lt;a href="https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/4915"&gt;new post&lt;/a&gt; on transportation management.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://webservice.sdn.sap.com/irj/sdn/thread?threadID=112105"&gt;People discuss&lt;/a&gt; if ABAP is a "relict from the past". I don't think so, when I see someone writing a &lt;a href="http://code.google.com/p/abap-flickr/"&gt;flickr API for ABAP&lt;/a&gt;, I don't see a dead language.&lt;br /&gt;&lt;br /&gt;SAP &lt;a href="https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/1851"&gt;has a new project named Sagres&lt;/a&gt;, as Oliver Mainka says: "We started a project at SAP dubbed Sagres (we want to show the world how to make better use of geography, as good old Prince Henry the Navigator did).". Cool! If you guys need some inspiration you can always have some Sagres beer!&lt;br /&gt;&lt;br /&gt;&lt;img style="display: block;" src="http://photos1.blogger.com/blogger/7520/22/400/sagres.jpg" alt="" border="0" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-116345954890515235?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/116345954890515235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=116345954890515235&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/116345954890515235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/116345954890515235'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/11/quick-links-ankur-gupta-has-new-post.html' title='Quick links'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-116303126748183008</id><published>2006-11-09T00:12:00.000Z</published><updated>2006-12-17T22:56:15.561Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='pal'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>The Zen of PAL</title><content type='html'>The &lt;a href="http://en.wikipedia.org/wiki/Python_philosophy"&gt;Zen of Python&lt;/a&gt; is a very cool set of design rules collected by Tim Peters (the infamous timbot). Some of the rules are good design rules even outside of Python's universe. I personally borrowed some of these rules for what I consider good PAL (product allocation in global ATP) design.&lt;br /&gt;&lt;br /&gt;Simple is better than complex.&lt;br /&gt;Explicit is better than implicit.&lt;br /&gt;Flat is better than nested.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-116303126748183008?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/116303126748183008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=116303126748183008&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/116303126748183008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/116303126748183008'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/11/zen-of-pal-zen-of-python-is-very-cool.html' title='The Zen of PAL'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-116303022854696024</id><published>2006-11-08T23:50:00.000Z</published><updated>2006-12-17T22:56:46.691Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><title type='text'>ATP fun</title><content type='html'>I always suspected that APO ATP was something special. And I don't mean the technology, I mean the people behind the technology. See for example, the first comment in the BOP code:&lt;br /&gt;&lt;br /&gt;&lt;img style="display: block;" src="http://photos1.blogger.com/blogger/7520/22/400/report_bop.png" alt="" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;They are inviting us to some kind of psychedelic party, isn't it?&lt;br /&gt;&lt;br /&gt;And check the configuration table of check modes. See the smile? Extreme isn't it? I mean, putting a check mode 666 or 069 would be wild, but putting a :-) is from a different universe.&lt;br /&gt;&lt;br /&gt;&lt;img style="display: block;" src="http://photos1.blogger.com/blogger/7520/22/400/checkmode_smile.png" alt="" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;And we have ABAP code that smiles!&lt;br /&gt;&lt;br /&gt;&lt;img style="display: block;" src="http://photos1.blogger.com/blogger/7520/22/400/code_with_smiles.png" alt="" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;This is the coolest of APO teams (and maybe they also have the best pot in SAPland :-)&lt;br /&gt;&lt;br /&gt;Music Playing: Vampyrus Lesbos, Sexadelic Dance Party&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-116303022854696024?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/116303022854696024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=116303022854696024&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/116303022854696024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/116303022854696024'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/11/atp-fun-i-always-suspected-that-apo.html' title='ATP fun'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-116110636611458794</id><published>2006-10-17T18:32:00.000+01:00</published><updated>2007-09-29T19:43:17.416+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tpvs'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>More TP/VS hacking</title><content type='html'>There is an icon column in the orders list in TPVS, it is used to exclude some orders from the optimizer. If you have used VS01 this screen is familiar for sure.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LUNtiAx0Y3E/Rv6cjgbyS3I/AAAAAAAAADk/7zr1t9H-EPk/s1600-h/tpvs_icon1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_LUNtiAx0Y3E/Rv6cjgbyS3I/AAAAAAAAADk/7zr1t9H-EPk/s400/tpvs_icon1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5115698360555293554" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Users love to have some visual tips for some special cases they need to take extra attention. And with this icon it's so easy to give then what they love. To put a flag on the icon for some small orders we just need this on exit EXIT_/SAPAPO/SAPLVS_VSGUI_005.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;LOOP AT ct_funit.&lt;br /&gt;  IF ct_funit-rcap_cap1 &lt; lc_low_limit.&lt;br /&gt;     CT_FUNIT-ICON = '@F1@'.&lt;br /&gt;  ENDIF.&lt;br /&gt;ENDLOOP.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The result is something like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LUNtiAx0Y3E/Rv6cpwbyS4I/AAAAAAAAADs/M7MvJ3ehr2U/s1600-h/tpvs_icon2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_LUNtiAx0Y3E/Rv6cpwbyS4I/AAAAAAAAADs/M7MvJ3ehr2U/s400/tpvs_icon2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5115698467929475970" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is good for display, but one may want to use this field to exclude some orders from processing. A quick description of the scenario is to have some coded rules that, based on some configuration, puts alert icons in some orders and excludes them from the optimizer. The planners need to review manually those orders with alerts.&lt;br /&gt;&lt;br /&gt;It would be good to be able to just lock the order in the EXIT_/SAPAPO/SAPLVS_VSGUI_005 exit, but the lock field is not available at that stage. There is one workaround I use that is good enough for the job. With exit EXIT_/SAPAPO/SAPLVS_VSGUI_005 I put some rules that set some icons for those special cases. By default any order that has an icon will be excluded from the optimizer run. That is made by having some coding to delete items in BADI /SAPAPO/VS_OPT_PREP (after starting optimization in VS01 but before sending the data to the optimizer). Something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;DATA: ls_orders_free TYPE /sapapo/vsr_g_funit,&lt;br /&gt;      ls_order       TYPE /sapapo/vsr_o_i_order,&lt;br /&gt;      ls_ord_servicetime TYPE /sapapo/vsr_o_i_order_s_time,&lt;br /&gt;      ls_ord_quan    TYPE /sapapo/vsr_o_i_order_quantity,&lt;br /&gt;      l_tabix        LIKE sy-tabix.&lt;br /&gt;&lt;br /&gt;  LOOP AT it_orders_free INTO ls_orders_free.&lt;br /&gt;    IF NOT ls_orders_free-icon IS INITIAL.&lt;br /&gt;      READ TABLE ct_order INTO ls_order&lt;br /&gt;           WITH KEY guid = ls_orders_free-orderid.&lt;br /&gt;      l_tabix = sy-tabix.&lt;br /&gt;      IF sy-subrc = 0.&lt;br /&gt;        DELETE ct_order INDEX l_tabix.&lt;br /&gt;      ENDIF.&lt;br /&gt;      LOOP AT ct_ord_servicetime INTO ls_ord_servicetime&lt;br /&gt;        WHERE order_id = ls_order-opt_id.&lt;br /&gt;        l_tabix = sy-tabix.&lt;br /&gt;        DELETE  ct_ord_servicetime INDEX l_tabix.&lt;br /&gt;      ENDLOOP.&lt;br /&gt;      LOOP AT ct_ord_quan INTO ls_ord_quan&lt;br /&gt;        WHERE order_id = ls_order-opt_id.&lt;br /&gt;        l_tabix = sy-tabix.&lt;br /&gt;        DELETE  ct_ord_quan INDEX l_tabix.&lt;br /&gt;      ENDLOOP.&lt;br /&gt;    ENDIF.&lt;br /&gt;  ENDLOOP.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;With this logic, if the user sees some order with an alert (with an icon) he may want to remove the icon to include the order in the optimizer run. To do that he can choose the order, then choose the "lock from the optimizer" option, and then remove the "lock from the optimizer" by clicking the button again. This has the side effect of removing the icon.&lt;br /&gt;&lt;br /&gt;It's not 100% clean, but overall I find this a simple solution to a much demanded request. If it can be made simpler, I would be very interested in knowing :-).&lt;br /&gt;&lt;br /&gt;PS. There are probably better ways to see the ID codes of the icons, one way is to use transaction ICON that shows all the icons and then look in debug the EXTRACT[]-ID value for the icon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-116110636611458794?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/116110636611458794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=116110636611458794&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/116110636611458794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/116110636611458794'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/10/more-tpvs-hacking-there-is-icon-column.html' title='More TP/VS hacking'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_LUNtiAx0Y3E/Rv6cjgbyS3I/AAAAAAAAADk/7zr1t9H-EPk/s72-c/tpvs_icon1.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-115957189231930715</id><published>2006-09-30T00:15:00.000+01:00</published><updated>2006-12-17T23:01:31.206Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='sdn'/><title type='text'>SAP Facts Chuck Norris style</title><content type='html'>The &lt;a href="https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/4516"&gt;cool contest&lt;/a&gt; has some winners.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-115957189231930715?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/115957189231930715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=115957189231930715&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115957189231930715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115957189231930715'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/09/sap-facts-chuck-norris-style-cool.html' title='SAP Facts Chuck Norris style'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-115375453015540988</id><published>2006-09-15T23:17:00.000+01:00</published><updated>2006-12-17T23:02:30.165Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='bop'/><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><title type='text'>Some extra BOP filtering</title><content type='html'>The backorder processing (BOP) takes all the orders resulting from the filter application and does the sequential ATP check to determine and update the order confirmation status. I suppose the BOP philosophy is to put all orders available for new ATP so that, eventually, confirming some orders and unconfirming some other orders, a better overall result can be obtained. But this has an obvious disavantage. Orders that are already produced, and are in stock waiting to be delivered to the customer, show up in the BOP result, making the analysis of the information harder for the planner. &lt;br /&gt;&lt;br /&gt;As far as I know there is no easy way to exclude from the list the orders that are produced. One possible way, using the BOP filter user-exit, is the following:&lt;br /&gt;&lt;br /&gt;1) Create a new flag to activate the new filtering logic and add it to the BOP filter as documented in the OSS &lt;a href="http://hotoss.uatki.com/376773"&gt;376773&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2) In the filter user-exit (ZXBOPUSERU02), if the flag is set apply the following logic:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   for each entry in ct_buffer&lt;br /&gt;     call /SAPAPO/OM_ORDER_GET_DATA to get the order pegging data&lt;br /&gt;     from inputs get the total order quantity&lt;br /&gt;     for each pegging entry&lt;br /&gt;        build the total pegged with stock elements (atpcat CC)&lt;br /&gt;     endfor&lt;br /&gt;     if total pegged &gt;= total order quantity&lt;br /&gt;        exclude from BOP&lt;br /&gt;     endif&lt;br /&gt;   endfor&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Running with such a filter, BOP becomes a more conservative tool that only works with planned and production orders. This can be more or less useful depending on the planning scenario, nevertheless it something simple, worth having as an option.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-115375453015540988?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/115375453015540988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=115375453015540988&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115375453015540988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115375453015540988'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/09/some-extra-bop-filtering-backorder.html' title='Some extra BOP filtering'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-115806636937185266</id><published>2006-09-12T14:03:00.000+01:00</published><updated>2006-12-17T23:03:16.319Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='web2.0'/><title type='text'>The computing world of tomorrow</title><content type='html'>From &lt;a href="http://www.forbes.com/2006/09/07/web-based-resources-cx_bn_0907smallbizresource_print.html"&gt;Forbes&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Welcome, boys and girls, to the computing world of tomorrow! Desktop programs are a thing of the past, replaced by free, simple, Web-based apps that do everything from spreadsheets to e-mail--and more!&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Google ERP? Well, there are some &lt;a href="http://www.roughtype.com/archives/2006/05/is_sap_for_sale.php"&gt;interesting rumors&lt;/a&gt; out there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-115806636937185266?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/115806636937185266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=115806636937185266&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115806636937185266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115806636937185266'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/09/computing-world-of-tomorrow-from.html' title='The computing world of tomorrow'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-115470885198639880</id><published>2006-08-04T17:25:00.000+01:00</published><updated>2006-12-17T23:04:05.572Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='tpvs'/><category scheme='http://www.blogger.com/atom/ns#' term='geocoding'/><title type='text'>Goodbye Map&amp;Guide, hello Google Geocoder</title><content type='html'>Geocoding is an important function for transportation planning (for distance calculation in transport optimization). SAP SCM comes with a geocoding tool called Map&amp;Guide that is far from what can be considered an industrial strength geocoder. It's true that for normal transportation planning there is no need to have street level accuracy, but it's not difficult to find cases where the M&amp;G gives coordinates very far away from the target. Not a wrong street, I mean a wrong continent (one that I could never understand was why some Moscow locations were geocoded in the US).&lt;br /&gt;&lt;br /&gt;Recently Google &lt;a href="http://googlemapsapi.blogspot.com/2006/06/geocoding-at-last.html"&gt;released&lt;/a&gt; a geocoding service (as part of google maps). Well, Yahoo already had such a service, but only available for US, AFAIK. On the other hand, the service from Google works with many european countries.&lt;br /&gt;&lt;br /&gt;Using the service is as simple as making an HTTP call (&lt;a href="http://www.google.com/apis/maps/documentation/#Geocoding_HTTP_Request"&gt;example&lt;/a&gt;). Making an HTTP call is also simple in ABAP (&lt;a href="http://pvl.freezope.org/writings/http_post"&gt;example&lt;/a&gt;). And making a geocoder wrapper object for SCM is not very hard (it's just copying the standard CL_GEOCODER_SAP0 object and using the HTTP call instead of the table reads). &lt;br /&gt;&lt;br /&gt;Humm ... something to be tried one of these days.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-115470885198639880?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/115470885198639880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=115470885198639880&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115470885198639880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115470885198639880'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/08/goodbye-mapguide-hello-google-geocoder.html' title='Goodbye Map&amp;Guide, hello Google Geocoder'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-115331598985592011</id><published>2006-07-19T14:32:00.000+01:00</published><updated>2006-12-17T23:05:20.796Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='tpvs'/><title type='text'>A must have for TP/VS</title><content type='html'>The new note &lt;a href="http://hotoss.uatki.com/961601"&gt;961601&lt;/a&gt;, although being a customer modification, is in my opinion a must have for TP/VS implementations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-115331598985592011?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/115331598985592011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=115331598985592011&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115331598985592011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115331598985592011'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/07/must-have-for-tpvs-new-note-961601.html' title='A must have for TP/VS'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-115331589165095636</id><published>2006-07-19T14:30:00.000+01:00</published><updated>2006-12-17T23:06:29.853Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='oss'/><category scheme='http://www.blogger.com/atom/ns#' term='hotoss'/><title type='text'>Making links to OSS notes</title><content type='html'>I added a functionality to &lt;a href="http://hotoss.uatki.com"&gt;hotoss&lt;/a&gt; to solve something that should be easy out-of-the-box: to make a link to the OSS note page. For example, for note 961601, if one writes http://hotoss.uatki.com/961601, clicking the link will redirect to the OSS note page (of course a OSS login will be necessary). &lt;br /&gt;&lt;br /&gt;Music playing: Legendary Tiger Man&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-115331589165095636?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/115331589165095636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=115331589165095636&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115331589165095636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115331589165095636'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/07/making-links-to-oss-notes-i-added.html' title='Making links to OSS notes'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-115280539598593579</id><published>2006-07-16T16:43:00.000+01:00</published><updated>2006-12-17T23:07:03.792Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='oss'/><category scheme='http://www.blogger.com/atom/ns#' term='hotoss'/><title type='text'>Announcement (although a timid one)</title><content type='html'>I have been working on making a web service for saving and organizing links to OSS notes. &lt;br /&gt;&lt;br /&gt;Why such a service? I don't know if it is just me, but I always find the need to have fast access to some important OSS notes. Mostly those FAQ or consulting OSS notes that explain those difficult aspects of the system. &lt;br /&gt;&lt;br /&gt;I know that I can save bookmarks in the OSS service. But I use OSS accounts related to the projects, and those change, so it is not that useful. I need something more personal.&lt;br /&gt;&lt;br /&gt;I already tried saving the notes as text in my computer disk. This works, but it needs some effort in order to maintain things organized. Also, in order to have an overview of the information I had to write some index files. And I sometimes need to access the information from different computers (I could have a CD with the data, but then I would have to be a lot more organized than I am).&lt;br /&gt;&lt;br /&gt;I also tried saving the note numbers in a private web page with some comments. It also works, but it needs some effort to maintain organization.&lt;br /&gt;&lt;br /&gt;So that is why I started this &lt;a href="http://hotoss.uatki.com"&gt;HotOSS webservice&lt;/a&gt;. It's a lot like the social bookmarking concept of del.icio.us. Being in a OSS note page I can save OSS bookmarks with just a button click. And I can keep the bookmark with some tags and comments for later search. &lt;br /&gt;&lt;br /&gt;And also related to social bookmarking, this service could have some community benefits. One could find interesting notes by looking at other person list of bookmarks.&lt;br /&gt;&lt;br /&gt;Well, that's the announcement. I don't want to shout it to the world because I'm still testing and doing quality checks on the code (&lt;a href="http://pvl.freezope.org/code"&gt;also open-source&lt;/a&gt;). But for you three readers of this blog ;-), I would really like if you could give a try to the service.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-115280539598593579?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/115280539598593579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=115280539598593579&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115280539598593579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115280539598593579'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/07/announcement-although-timid-one-i-have.html' title='Announcement (although a timid one)'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-115306481898119709</id><published>2006-07-16T16:40:00.000+01:00</published><updated>2006-12-17T23:07:37.002Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='sdn'/><title type='text'>New blog posts on APO</title><content type='html'>&lt;a href="https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/3920"&gt;This one&lt;/a&gt; on TPVS. Also on &lt;a href="https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/3923"&gt;demand planning&lt;/a&gt; and &lt;a href="https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/3837"&gt;new&lt;/a&gt; &lt;a href="https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/3732"&gt;features&lt;/a&gt; of SCM 5.&lt;br /&gt;&lt;br /&gt;It's time to put SDN again in my radar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-115306481898119709?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/115306481898119709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=115306481898119709&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115306481898119709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115306481898119709'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/07/new-blog-posts-on-apo-this-one-on-tpvs.html' title='New blog posts on APO'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-115228451904446594</id><published>2006-07-07T16:01:00.000+01:00</published><updated>2006-12-17T23:08:09.417Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><title type='text'>"Algorithm" for requirement type/check instruction determination</title><content type='html'>&lt;pre&gt;&lt;br /&gt;material Master -&gt; MRP type&lt;br /&gt;sales order -&gt; item category&lt;br /&gt;OVZI: item category, MRP type -&gt; search strategy&lt;br /&gt;&lt;br /&gt;if search strategy is 0 or not defined:&lt;br /&gt;&lt;br /&gt;  material master -&gt; material type &lt;br /&gt;&lt;br /&gt;  MRP group:&lt;br /&gt;     1) material master -&gt; MRP group&lt;br /&gt;     2) SPRO for MRP groups: material type -&gt; MRP group&lt;br /&gt;  &lt;br /&gt;  strategy group from:&lt;br /&gt;     1) the material master -&gt; strategy group&lt;br /&gt;     2) OPPU: MRP group -&gt; strategy group&lt;br /&gt; &lt;br /&gt;  OPPS: strategy group -&gt; requirement type&lt;br /&gt;&lt;br /&gt;else if Search strategy is 1 or 2:&lt;br /&gt;&lt;br /&gt;  OVZI: item category, MRP type -&gt; requirement type&lt;br /&gt;&lt;br /&gt;endif  &lt;br /&gt;&lt;br /&gt;OVZH: requirement type -&gt; requirement class&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;OVZI, OVZH, etc are transaction names. &lt;br /&gt;&lt;br /&gt;What is the difference between strategy 1 and 2 in OVZI? If one uses strategy 2 a check is made that the requirement type is in the list of allowed req. types. That list is built with all the values of requirement types set in the planning strategies included in the planning strategy group (as from the algorithm, the planning strategy group can be defined in the material master or in the MRP group).&lt;br /&gt;&lt;br /&gt;One other thing is tricky. Although the item category/MRP type configuration for the requirement type is done in SPRO section:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Sales and Dist. &gt; Basic Functions &gt; Availability check&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;there is the need to assign the item category/MRP type to schedule line categories in section:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Sales and Dist. &gt; Sales &gt; Sales Documents &gt; Schedule lines&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;This is core SD configuration. But it's also the basic for modeling the GATP in APO.&lt;br /&gt;&lt;br /&gt;Also check OSS &lt;a href="http://hotoss.uatki.com/547277"&gt;547277&lt;/a&gt; point 7.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-115228451904446594?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/115228451904446594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=115228451904446594&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115228451904446594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115228451904446594'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/07/algorithm-for-requirement-typecheck.html' title='&quot;Algorithm&quot; for requirement type/check instruction determination'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-115108087622730261</id><published>2006-07-04T20:41:00.000+01:00</published><updated>2006-12-17T23:09:02.503Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='modeling'/><title type='text'>External storage location in APO</title><content type='html'>Consider this generic scenario:&lt;br /&gt;&lt;br /&gt;A plant has an external warehouse. The products are planned and produced in the plant and after are transported to the external warehouse. Later they will be transported to the final customer (customer picks the goods or there is another transport).&lt;br /&gt;&lt;br /&gt;For example, a specific scenario:&lt;br /&gt;The plant has a warehouse in the harbor for storing materials to be included in a ship transport.&lt;br /&gt;&lt;br /&gt;The most obvious way to model this external warehouse in APO is as a location. But then, having a location for each external warehouse has many disadvantages:&lt;br /&gt;&lt;br /&gt;- a lot of master data must be created and maintained (if there are 10 plants, each having 10000 materials, and 10 external locations, there will be one million more location-materials in APO).&lt;br /&gt;&lt;br /&gt;- demands would have to be created for the external warehouse, and the decision on which warehouse to use may not be available at that time. &lt;br /&gt;&lt;br /&gt;Another way (that I'm not sure if it is a supported scenario, but seems to work well) is to model the external warehouse as a storage location of the plant. To transfer goods one has to create STOs having the same supplying and receiving plant (with the storage location address being the base for the address in the delivery). There are some gotchas with this approach:&lt;br /&gt;&lt;br /&gt;- the address for TP/VS transport planning is not relevant, so some hacking it's needed to change the destination location for planning the transports&lt;br /&gt;&lt;br /&gt;- if using make to stock production, something must be done to avoid the material in the external location being used for other orders&lt;br /&gt;&lt;br /&gt;This last approach is bit hackish, but other than that it works and makes the model simpler and more flexible. In my opinion, the overhead for using a location in APO is too large and that reduces it's practical application scope.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-115108087622730261?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/115108087622730261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=115108087622730261&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115108087622730261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115108087622730261'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/07/external-storage-location-in-apo.html' title='External storage location in APO'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-115107882960670757</id><published>2006-06-23T17:05:00.000+01:00</published><updated>2006-12-17T23:10:13.501Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='analytics'/><title type='text'>Number of backward edges</title><content type='html'>This is one of my favourite planning indicators from /SAPAPO/PMON. It's very simple, just a count of pegging delays, but it has a strong correlation with planning caos (or people screaming). This graphic shows the average indicator for serveral plants already using APO and for a new plant rollout. The first month was problematic then it became stable.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/7520/22/1600/chart.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7520/22/320/chart.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Music playing: Cranes&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-115107882960670757?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/115107882960670757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=115107882960670757&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115107882960670757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115107882960670757'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/06/number-of-backward-edges-this-is-one.html' title='Number of backward edges'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-115107542197690308</id><published>2006-06-23T16:08:00.000+01:00</published><updated>2006-12-17T23:10:52.507Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='web2.0'/><title type='text'>Web spreadsheet</title><content type='html'>Yesterday the webmail and calendar, today the &lt;a href="http://spreadsheets.google.com/"&gt;spreadsheet&lt;/a&gt; and &lt;a href="http://www.writely.com"&gt;word processor&lt;/a&gt;, tomorrow the web ERP.&lt;br /&gt;&lt;br /&gt;Today Microsoft is becoming obsolete. Tomorrow, will it be SAP?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-115107542197690308?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/115107542197690308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=115107542197690308&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115107542197690308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/115107542197690308'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/06/web-spreadsheet-yesterday-webmail-and.html' title='Web spreadsheet'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-114987046083504956</id><published>2006-06-09T17:20:00.000+01:00</published><updated>2006-12-17T23:11:52.604Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><title type='text'>Open source software and music</title><content type='html'>Some years ago, it was through an open source software project named &lt;a href="http://www.plone.org"&gt;Plone&lt;/a&gt; that I discovered the &lt;a href="http://en.wikipedia.org/wiki/Plone_(band)"&gt;Plone band&lt;/a&gt;. And it become one of my favourites. Now it happened again, the project &lt;a href="http://www.djangoproject.com"&gt;Django&lt;/a&gt; lead me to the great &lt;a href="http://www.redhotjazz.com/django.html"&gt;Django Reinhardt&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Open source is good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-114987046083504956?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/114987046083504956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=114987046083504956&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/114987046083504956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/114987046083504956'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/06/open-source-software-and-music-some.html' title='Open source software and music'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-114986997772003593</id><published>2006-06-09T17:14:00.000+01:00</published><updated>2006-12-17T23:12:23.303Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='atp'/><title type='text'>Sailing the ATP storm</title><content type='html'>ATP integration between APO and R3 is a mess. Whenever possible, following this simple recipe avoids many problems:&lt;br /&gt;&lt;br /&gt;1) Don't set any restriction on receiving hours at the customer&lt;br /&gt;2) Change the default requested time in sales orders to some normal value like 9 am.&lt;br /&gt;&lt;br /&gt;In sales order the proposed delivery time can be changed on exit MV45AFZZ, in userexit_move_field_to_vbep. For stock transport orders it can be changed in BADI ME_PROCESS_PO_CUST.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-114986997772003593?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/114986997772003593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=114986997772003593&amp;isPopup=true' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/114986997772003593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/114986997772003593'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/06/sailing-atp-storm-atp-integration.html' title='Sailing the ATP storm'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-114891560441953554</id><published>2006-05-29T16:05:00.000+01:00</published><updated>2006-12-17T23:13:04.974Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='tpvs'/><title type='text'>Mass delete of lanes</title><content type='html'>Although trivial, it wasted me a lot of time. First check that OSS 880126 is installed; then use MASSD to set the block indicator (sprkz) equal to D on the lanes that you want to remove; then use report /SAPAPO/TR_TRPROD_DELETE to remove.&lt;br /&gt;&lt;br /&gt;Music playing: Tarrega&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-114891560441953554?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/114891560441953554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=114891560441953554&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/114891560441953554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/114891560441953554'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/05/mass-delete-of-lanes-although-trivial.html' title='Mass delete of lanes'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-114228861699949195</id><published>2006-03-13T22:20:00.000Z</published><updated>2006-12-17T23:13:50.662Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='web2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>The intergalatic company</title><content type='html'>&lt;a href="http://www.google.com/mars/"&gt;Google Mars&lt;/a&gt;. Very cool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-114228861699949195?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/114228861699949195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=114228861699949195&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/114228861699949195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/114228861699949195'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/03/intergalatic-company-google-mars.html' title='The intergalatic company'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-114029336201377187</id><published>2006-02-18T19:58:00.000Z</published><updated>2006-12-17T23:14:42.629Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='tpvs'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>More on TPVS</title><content type='html'>&lt;img src="http://pvl.freezope.org/img/hammer.gif" align="right" width="120" height="119"&gt;There are not many options to analyse the results of automatic planning in TPVS. The shuffler shipments tab is good to check the capacity used by the trucks that result from planning. And the orders tab is good to check what are the locations and dates of the orders combined in each transport. The orders tab would be more useful if there was a column with the shipment number, so that all shipments could be checked at once. It is a simple enhancement to make. Here goes a quick recipe.&lt;br /&gt;&lt;br /&gt;1) Add a new field to the append of structure /SAPAPO/VSR_G_FUNIT (for example named ZZ_SHIPNUM)&lt;br /&gt;&lt;br /&gt;2) In exit EXIT_/SAPAPO/SAPLVS_VSGUI_005 use something like this code&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;LOOP AT ct_funit.&lt;br /&gt;  l_tabix = sy-tabix.&lt;br /&gt;* Only the orders already planned&lt;br /&gt;  IF ct_funit-state &lt;&gt; 0.&lt;br /&gt;    CALL FUNCTION 'Z_TPGET_SHIPNUM'&lt;br /&gt;      EXPORTING&lt;br /&gt;        p_orderid  = ct_funit-orderid&lt;br /&gt;      IMPORTING&lt;br /&gt;        p_shipment = ct_funit-zz_shipnum&lt;br /&gt;      EXCEPTIONS&lt;br /&gt;        failed     = 1&lt;br /&gt;        OTHERS     = 2.&lt;br /&gt;&lt;br /&gt;    IF sy-subrc = 0.&lt;br /&gt;      MODIFY ct_funit INDEX l_tabix TRANSPORTING zz_shipnum.&lt;br /&gt;    ENDIF.&lt;br /&gt;  ENDIF.&lt;br /&gt;ENDLOOP.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3) The function Z_TPGET_SHIPNUM&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;FUNCTION z_tpget_shipnum.&lt;br /&gt;*"----------------------------------------------------------------------&lt;br /&gt;*"*"Local Interface:&lt;br /&gt;*"  IMPORTING&lt;br /&gt;*"     REFERENCE(P_ORDERID) TYPE  /SAPAPO/ORDERID&lt;br /&gt;*"  EXPORTING&lt;br /&gt;*"     REFERENCE(P_SHIPMENT) TYPE  /SAPAPO/VS_G_DISPSID&lt;br /&gt;*"  EXCEPTIONS&lt;br /&gt;*"      FAILED&lt;br /&gt;*"----------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;  DATA: l_simsessid        TYPE /sapapo/om_simsession,&lt;br /&gt;        l_simverid         TYPE /sapapo/vrsioid,&lt;br /&gt;        ls_gen_params      TYPE /sapapo/om_gen_params,&lt;br /&gt;        lt_shipments       TYPE /sapapo/vsr_ship_tab,&lt;br /&gt;        ls_shipments       TYPE /sapapo/vsr_ship_str,&lt;br /&gt;        lt_orders          TYPE /sapapo/vsr_funit_id_tab,&lt;br /&gt;        l_shipment_no      TYPE /sapapo/vs_g_dispsid.&lt;br /&gt;&lt;br /&gt;  CALL FUNCTION '/SAPAPO/RRP_SIMSESSION_GET'&lt;br /&gt;    IMPORTING&lt;br /&gt;      es_gen_params = ls_gen_params.&lt;br /&gt;&lt;br /&gt;  CALL FUNCTION '/SAPAPO/TSIM_SIMULATION_GET'&lt;br /&gt;    IMPORTING&lt;br /&gt;      e_simsessid = l_simsessid&lt;br /&gt;      e_simverid  = l_simverid.&lt;br /&gt;&lt;br /&gt;  CALL FUNCTION '/SAPAPO/DM_VS_SHIPMENT_READ'&lt;br /&gt;    EXPORTING&lt;br /&gt;      is_gen_params            = ls_gen_params&lt;br /&gt;      iv_simsession            = l_simsessid&lt;br /&gt;      iv_orderid               = p_orderid&lt;br /&gt;    IMPORTING&lt;br /&gt;      et_assigned_order        = lt_orders&lt;br /&gt;      et_shipments             = lt_shipments&lt;br /&gt;    EXCEPTIONS&lt;br /&gt;      lc_connect_failed        = 1&lt;br /&gt;      lc_com_error             = 2&lt;br /&gt;      lc_appl_error            = 3&lt;br /&gt;      not_found                = 4&lt;br /&gt;      wrong_inputs             = 5&lt;br /&gt;      internal_structure_error = 6&lt;br /&gt;      invalid_resource         = 7&lt;br /&gt;      timestamp_error          = 8&lt;br /&gt;      invalid_pegarea          = 9&lt;br /&gt;      invalid_order            = 10&lt;br /&gt;      OTHERS                   = 11.&lt;br /&gt;&lt;br /&gt;  IF sy-subrc &lt;&gt; 0.&lt;br /&gt;    RAISE failed.&lt;br /&gt;  ENDIF.&lt;br /&gt;&lt;br /&gt;  READ TABLE lt_shipments INTO ls_shipments INDEX 1.&lt;br /&gt;&lt;br /&gt;  IF sy-subrc = 0.&lt;br /&gt;    CALL FUNCTION '/SAPAPO/VS_SHIPMENT_GET_TEXT'&lt;br /&gt;      EXPORTING&lt;br /&gt;        is_gen_params        = ls_gen_params&lt;br /&gt;        iv_simsession        = l_simsessid&lt;br /&gt;        iv_shipment_guid     = ls_shipments-shipment_guid&lt;br /&gt;      IMPORTING&lt;br /&gt;        ev_text              = l_shipment_no&lt;br /&gt;      EXCEPTIONS&lt;br /&gt;        shipment_read_failed = 1&lt;br /&gt;        OTHERS               = 2.&lt;br /&gt;&lt;br /&gt;    IF sy-subrc &lt;&gt; 0.&lt;br /&gt;      RAISE failed.&lt;br /&gt;    ENDIF.&lt;br /&gt;&lt;br /&gt;    p_shipment = l_shipment_no.&lt;br /&gt;&lt;br /&gt;  ENDIF.&lt;br /&gt;&lt;br /&gt;ENDFUNCTION.&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-114029336201377187?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/114029336201377187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=114029336201377187&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/114029336201377187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/114029336201377187'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/02/more-on-tpvs-there-are-not-many.html' title='More on TPVS'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-113718915498343301</id><published>2006-01-13T21:44:00.000Z</published><updated>2006-12-17T23:15:32.402Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>There are few</title><content type='html'>So if FI consultants are called FICO, I guess APO consultants are called APOCO. And APOCO kind of reads like "there are few" in portuguese. &lt;br /&gt;&lt;br /&gt;Moment of nonsense courtesy of Super Bock.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-113718915498343301?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/113718915498343301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=113718915498343301&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/113718915498343301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/113718915498343301'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/01/there-are-few-so-if-fi-consultants-are.html' title='There are few'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-113638564606298701</id><published>2006-01-04T14:26:00.000Z</published><updated>2007-09-29T19:38:50.702+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tpvs'/><title type='text'>A good idea for TPVS</title><content type='html'>In a recent project we added a new column to the transport planning transaction showing the percentage of the order that is already available as stock. It is a very simple enhancement and users like it a lot. The logic is very simple. We appended a new field to the display structure and used EXIT_/SAPAPO/SAPLVS_VSGUI_005 to fill the data. For each entry we get the pegged stock with function /SAPAPO/OM_ORDER_GET_DATA. This indicator is good because you can open the transport plan and identify the loadings that may become problematic. And you can optimize the transport plan allowing earlier delivery only for orders that already have 100% stock.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LUNtiAx0Y3E/Rv6bogbyS1I/AAAAAAAAADU/TLSY73wuZMM/s1600-h/tpvs_stock.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_LUNtiAx0Y3E/Rv6bogbyS1I/AAAAAAAAADU/TLSY73wuZMM/s400/tpvs_stock.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5115697346943011666" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-113638564606298701?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/113638564606298701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=113638564606298701&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/113638564606298701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/113638564606298701'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/01/good-idea-for-tpvs-in-recent-project.html' title='A good idea for TPVS'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_LUNtiAx0Y3E/Rv6bogbyS1I/AAAAAAAAADU/TLSY73wuZMM/s72-c/tpvs_stock.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-113638607554519441</id><published>2006-01-01T14:46:00.000Z</published><updated>2006-12-17T23:16:50.830Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>Happy 2006!</title><content type='html'>May 2006 bring us many new and exciting APO projects. And beer. Preferably beer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-113638607554519441?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/113638607554519441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=113638607554519441&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/113638607554519441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/113638607554519441'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2006/01/happy-2006-may-2006-bring-us-many-new.html' title='Happy 2006!'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-112988268003271445</id><published>2005-10-21T09:14:00.000+01:00</published><updated>2006-12-17T23:17:42.176Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='abap'/><title type='text'>Use the source Luke!</title><content type='html'>From Andrew Barnard comment in &lt;a href="http://www.piersharding.com/blog/archives/2005/07/sap_a_closed_cu.html#comments"&gt;Piers blog&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;In the former times, SAP's application logic was written in ABAP - open source - in the sense that anybody could understand it. Now I obverse, despite the benefits of open source - SAP is tending to hide the source in Java classes. The newer product offerings are more closed than the "closed" ABAP applications ever were.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is a very good point. SAP was open source (meaning open knowledge) even before open source become popular. I'm not sure if they realize how important this was for their success. From my experience, good SAP implementations depend a lot on the ingenuity of consultants that hack the user-exits and BADIs. No matter how clever the consultants are, if they cannot read the source code they cannot invent those hacks (I wonder if APO would not be much more successful if it did not hide so much in the COM routines and optimizers binaries).&lt;br /&gt;&lt;br /&gt;Source code, plus the integrated debugger and /h is the gem of SAP. Going away from it is a BAD decision.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-112988268003271445?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/112988268003271445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=112988268003271445&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/112988268003271445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/112988268003271445'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2005/10/use-source-luke-from-andrew-barnard.html' title='Use the source Luke!'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-112970752658201862</id><published>2005-10-19T08:35:00.000+01:00</published><updated>2006-12-17T23:18:32.974Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='quote'/><title type='text'>Productivity Oh Productivity</title><content type='html'>&lt;span style="font-style:italic;"&gt;Productivity ought to mean achieving more in an hour of work, but all too often it has come to mean extracting more for an hour of pay. [...] managers dream of attaining new productivity levels through the simple mechanism of unpaid overtime. They divide whatever work is done in a week by forty hours, not by the eighty or ninety hours that the worker actually put in. That's not exactly productivity — it's more like fraud — but it's the state of the art for many American managers. (from Peopleware)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-112970752658201862?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/112970752658201862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=112970752658201862&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/112970752658201862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/112970752658201862'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2005/10/productivity-oh-productivity.html' title='Productivity Oh Productivity'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-112835322239027298</id><published>2005-10-03T16:14:00.000+01:00</published><updated>2007-09-29T19:49:10.799+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='screen'/><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><title type='text'>Caught for the second time</title><content type='html'>For the second time, when searching for user-exits, I failed to find&lt;br /&gt;the exit I wanted because in the SMOD screen I never remember to &lt;br /&gt;try the up/down arrows. In this case, the exit I needed was 005. I was in&lt;br /&gt;this screen, I tried 001, 002 and 003. But I for my brain it was &lt;br /&gt;clear that only those three existed. That would be understandable if&lt;br /&gt;it was the first time. But no, it was the second time. This screen sucks!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LUNtiAx0Y3E/Rv6dgAbyS6I/AAAAAAAAAD8/q7ILd2H7Oac/s1600-h/screen_smod.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_LUNtiAx0Y3E/Rv6dgAbyS6I/AAAAAAAAAD8/q7ILd2H7Oac/s400/screen_smod.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5115699399937379234" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Music playing: Uakti&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-112835322239027298?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/112835322239027298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=112835322239027298&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/112835322239027298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/112835322239027298'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2005/10/caught-for-second-time-for-second-time.html' title='Caught for the second time'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_LUNtiAx0Y3E/Rv6dgAbyS6I/AAAAAAAAAD8/q7ILd2H7Oac/s72-c/screen_smod.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-112833806517974379</id><published>2005-10-03T12:13:00.000+01:00</published><updated>2006-12-17T23:20:03.244Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='sdn'/><title type='text'>SAP developer network forum for SCM</title><content type='html'>Another &lt;a href="https://forums.sdn.sap.com/forum.jspa?forumID=144"&gt;SAP forum&lt;/a&gt; for APO/SCM talk. There was already one in the SAP community.&lt;br /&gt;&lt;br /&gt;Music playing: Pram&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-112833806517974379?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/112833806517974379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=112833806517974379&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/112833806517974379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/112833806517974379'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2005/10/sap-developer-network-forum-for-scm.html' title='SAP developer network forum for SCM'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-112833796303022304</id><published>2005-10-03T11:59:00.000+01:00</published><updated>2007-09-29T19:40:30.680+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>New kind of science</title><content type='html'>I've been reading the &lt;a href="http://www.wolframscience.com"&gt;New Kind of Science&lt;/a&gt; book of Stephen Wolfram. &lt;br /&gt;It's a punch in the stomach. Complex, almost random, behaviour resulting from simple rules. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LUNtiAx0Y3E/Rv6cBwbyS2I/AAAAAAAAADc/hiiNlunLIuc/s1600-h/rule30steps250.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_LUNtiAx0Y3E/Rv6cBwbyS2I/AAAAAAAAADc/hiiNlunLIuc/s400/rule30steps250.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5115697780734708578" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Music playing: Pram&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-112833796303022304?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/112833796303022304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=112833796303022304&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/112833796303022304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/112833796303022304'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2005/10/new-kind-of-science-ive-been-reading.html' title='New kind of science'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_LUNtiAx0Y3E/Rv6cBwbyS2I/AAAAAAAAADc/hiiNlunLIuc/s72-c/rule30steps250.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-112628769346595037</id><published>2005-09-09T18:39:00.000+01:00</published><updated>2006-12-17T23:21:26.849Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>SAP on Rails</title><content type='html'>Piers Harding &lt;a href="https://www.sdn.sap.com/sdn/weblogs.sdn?blog=/pub/wlg/2111"&gt;posted a very cool use&lt;/a&gt; of the web framework  &lt;a href="http://www.rubyonrails.org"&gt;Ruby on Rails&lt;/a&gt; with SAP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-112628769346595037?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/112628769346595037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=112628769346595037&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/112628769346595037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/112628769346595037'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2005/09/sap-on-rails-piers-harding-posted-very.html' title='SAP on Rails'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-112532073240629067</id><published>2005-08-29T14:03:00.000+01:00</published><updated>2006-12-17T23:21:58.117Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='debug'/><title type='text'>Using the SAP logging features</title><content type='html'>&lt;img src="http://www.allfloyd.com/images/the_wall/hammer.gif" align="right" width="120"&gt;Very quick instructions:&lt;br /&gt;&lt;br /&gt;1) create a log object and subobject in SLG0&lt;br /&gt;2) initialize the log object/subobject (g_loghandle is a global variable)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  DATA: l_loghead TYPE bal_s_log.&lt;br /&gt;&lt;br /&gt;  IF w_loghandle IS INITIAL.&lt;br /&gt;    l_loghead-object     = 'ZMYOBJ'.&lt;br /&gt;    l_loghead-subobject  = 'MYSUBOBJ'.&lt;br /&gt;    l_loghead-aldate_del = sy-datum + 90. "expires in 90 days&lt;br /&gt;&lt;br /&gt;    CALL FUNCTION 'BAL_LOG_CREATE'&lt;br /&gt;      EXPORTING&lt;br /&gt;        i_s_log      = l_loghead&lt;br /&gt;      IMPORTING&lt;br /&gt;        e_log_handle = g_loghandle&lt;br /&gt;      EXCEPTIONS&lt;br /&gt;        OTHERS       = 1.&lt;br /&gt;  ENDIF.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3) add the messages to the log&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;DATA: ls_logmsg    TYPE bal_s_msg.&lt;br /&gt;&lt;br /&gt;ls_logmsg-msgty = msg_type.&lt;br /&gt;ls_logmsg-msgid = msg_id.&lt;br /&gt;ls_logmsg-msgno = msg_number.&lt;br /&gt;ls_logmsg-msgv1 = msg_v1.&lt;br /&gt;ls_logmsg-msgv2 = msg_v2.&lt;br /&gt;ls_logmsg-msgv3 = msg_v3.&lt;br /&gt;ls_logmsg-msgv4 = msg_v4.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CALL FUNCTION 'BAL_LOG_MSG_ADD'&lt;br /&gt;    EXPORTING&lt;br /&gt;      i_log_handle = g_loghandle&lt;br /&gt;      i_s_msg      = ls_logmsg&lt;br /&gt;    EXCEPTIONS&lt;br /&gt;      OTHERS       = 1.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;4) save the log&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  DATA: lt_log_handle TYPE bal_t_logh,&lt;br /&gt;        ls_log_handle LIKE LINE OF lt_log_handle.&lt;br /&gt;&lt;br /&gt;  ls_log_handle = w_loghandle.&lt;br /&gt;  APPEND ls_log_handle TO lt_log_handle.&lt;br /&gt;&lt;br /&gt;  CALL FUNCTION 'BAL_DB_SAVE'&lt;br /&gt;    EXPORTING&lt;br /&gt;      i_t_log_handle = lt_log_handle&lt;br /&gt;    EXCEPTIONS&lt;br /&gt;      OTHERS         = 1.&lt;br /&gt;&lt;br /&gt;  COMMIT WORK.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;5) see the results with SLG1&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-112532073240629067?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/112532073240629067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=112532073240629067&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/112532073240629067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/112532073240629067'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2005/08/using-sap-logging-features-very-quick.html' title='Using the SAP logging features'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-112495747298541682</id><published>2005-08-25T09:06:00.000+01:00</published><updated>2007-09-29T19:48:03.231+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='tpvs'/><title type='text'>Hidden Configuration</title><content type='html'>I knew it was possible to configure stop-offs costs in APO TP/VS. But I could not find where. Damm! It was in the cost profile, but I had to open the select box. Humm ... it was hidden quite well.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LUNtiAx0Y3E/Rv6d1gbyS7I/AAAAAAAAAEE/Y8WcCZ08hII/s1600-h/costprog2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_LUNtiAx0Y3E/Rv6d1gbyS7I/AAAAAAAAAEE/Y8WcCZ08hII/s400/costprog2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5115699769304566706" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-112495747298541682?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/112495747298541682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=112495747298541682&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/112495747298541682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/112495747298541682'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2005/08/hidden-configuration-i-knew-it-was.html' title='Hidden Configuration'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_LUNtiAx0Y3E/Rv6d1gbyS7I/AAAAAAAAAEE/Y8WcCZ08hII/s72-c/costprog2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-112369000529834783</id><published>2005-08-09T23:03:00.000+01:00</published><updated>2006-12-17T23:23:06.931Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>Are you doing job interviews?</title><content type='html'>From Paul Graham in Hackers and Painters (a great book, by the way):&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;It seems surprising to me that any employer would be reluctant to let hackers work on open source projects. At Viaweb, we would have been reluctant to hire anyone who didn't. When we interviewed programmers, the main thing we cared about was what kind of software they wrote in their spare time. You can't do anything really well unless you love it, and if you love to hack you'll inevitably be working on projects of your own.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-112369000529834783?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/112369000529834783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=112369000529834783&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/112369000529834783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/112369000529834783'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2005/08/are-you-doing-job-interviews-from-paul.html' title='Are you doing job interviews?'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-112298514130572416</id><published>2005-08-02T13:15:00.000+01:00</published><updated>2006-12-17T23:23:39.433Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='optimizers'/><title type='text'>Working with optimizers - quick tips</title><content type='html'>&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Test and check that versions match with /SAPAPO/OPT_INST&lt;br /&gt;&lt;li&gt;Use /SAPAPO/OPT11 to see the optimizer trace file&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-112298514130572416?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/112298514130572416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=112298514130572416&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/112298514130572416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/112298514130572416'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2005/08/working-with-optimizers-quick-tips.html' title='Working with optimizers - quick tips'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-111902632802679906</id><published>2005-06-17T17:34:00.000+01:00</published><updated>2006-12-17T23:24:23.722Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Create a purchase order with configuration using the BAPI</title><content type='html'>This took some time to figure out how to setup. It may be useful.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;call function 'BAPI_CFG_CREATE'&lt;br /&gt;  exporting&lt;br /&gt;    object_id     = 'MYMATCODE'&lt;br /&gt;    root_type     = 'MARA'&lt;br /&gt;    root_name     = 'MYMATCODE'&lt;br /&gt;    plant         = 'MYPLANT'&lt;br /&gt;  importing&lt;br /&gt;    cfg_handle    = l_handle&lt;br /&gt;    root_instance = l_instance&lt;br /&gt;  exceptions&lt;br /&gt;    error         = 1&lt;br /&gt;    others        = 2.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;l_characts_vals-atnam = 'WIDTH'.&lt;br /&gt;l_characts_vals-atwtb = '500'.&lt;br /&gt;&lt;br /&gt;append l_characts_vals to it_characts_vals.&lt;br /&gt;&lt;br /&gt;call function 'BAPI_CFGINST_CHARCS_VALS_SET'&lt;br /&gt;  exporting&lt;br /&gt;    object_id         = 'MYMATCODE'&lt;br /&gt;    instance          = l_instance&lt;br /&gt;  tables&lt;br /&gt;    characts_vals     = it_characts_vals&lt;br /&gt;    characts_vals_err = it_characts_vals_err.&lt;br /&gt;&lt;br /&gt;call function 'CE_C_SET_CBASE'.&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;l_poitem-int_obj_no = l_handle.&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;call function 'BAPI_PO_CREATE1'&lt;br /&gt;   exporting&lt;br /&gt;    poheader  = l_poheader&lt;br /&gt;    poheaderx = l_poheaderx&lt;br /&gt;   importing&lt;br /&gt;    expheader = l_expheader&lt;br /&gt;    exppurchaseorder = l_exppurchaseorder&lt;br /&gt;   tables&lt;br /&gt;    poitem      = lt_poitem&lt;br /&gt;    poitemx     = lt_poitemx&lt;br /&gt;            poschedule  = lt_poschedule&lt;br /&gt;            poschedulex = lt_poschedulex&lt;br /&gt;    return      = lt_return.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;call function 'BAPI_TRANSACTION_COMMIT'.&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-111902632802679906?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/111902632802679906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=111902632802679906&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/111902632802679906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/111902632802679906'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2005/06/create-purchase-order-with.html' title='Create a purchase order with configuration using the BAPI'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-111542507250132966</id><published>2005-05-07T01:15:00.000+01:00</published><updated>2006-12-17T23:24:57.877Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogs'/><title type='text'>SAP versus Oracle Blogs</title><content type='html'>In &lt;a href="http://www.oracleappsblog.com/index.php/weblog/sap-versus-oracle-blog/"&gt;this post&lt;/a&gt; Richard Byrom compared the blogging activity in SAP and Oracle.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;A Google search for "SAP Blog" returned 319 results whilst a search for "oracle blog" returned 1,790 results.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I happen to have to work with the Oracle Databases and as a result I have a strong opinion(TM) on this technology. But I'm going to keep it to myself as Richard's post was an example of fairplay (BTW, do not expect unbiased opinions on my blog! never!)&lt;br /&gt;&lt;br /&gt;But returning to his conclusion:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;SAP has strong blogging strategy within their own organisation and would appear to be taking a more strategic approach, however, the blog offerings outside of their organisation are some what non existent.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I have to agree. There are few community websites related to SAP technologies, and for sure there are many thousands consultants working with these tools. I suppose that one reason is that people don't love SAP technology. ABAP works, but is ugly. The integrated debugger is great, but debugging the applications is often a nightmare of spaghetti code. The client GUI works well, but it's also unapealing. &lt;br /&gt;&lt;br /&gt;I like the concept of APO (the object memory database together with those great optimizers from ILOG). I suppose that's why I write this blog. But there is a lot of stuff that I don't like in APO, starting with the way livecache is implemented as SAPDB dlls, and the the fact that optimizer calls are not explict, and, and, and.&lt;br /&gt;&lt;br /&gt;But the nicest of his post was a list of SAP related blogs (and apolemia was in the list, yehhh!). It's time to add a new column to this blog with links to those brave SAP bloggers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-111542507250132966?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/111542507250132966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=111542507250132966&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/111542507250132966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/111542507250132966'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2005/05/sap-versus-oracle-blogs-in-this-post.html' title='SAP versus Oracle Blogs'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-111542489061948424</id><published>2005-05-07T00:47:00.000+01:00</published><updated>2006-12-17T23:25:58.958Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='apo'/><title type='text'>Is it a joke?</title><content type='html'>From this &lt;a href="http://www.apobootcamp.com/"&gt;apobootcamp&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;This unique browser-based multimedia presentation brings you the widely acclaimed APO Bootcamp seminar that was recorded live in front of an audience of customers who use SAP software. This full 15-hour program, created by the editors of SAP Insider, includes streaming video of all of the presenters, complete with their slides, demos, and all of the bonus materials that attendees received.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Huau, 15 hours of slides! This reminded me of a SAP employee that went to our company last month to encourage us to upgrade our system. Didn't know anything about SAP, but was good with powerpoint slides, together with doing 100 mentions to SOA in less than an hour (I admit I was a SOA ignorant, but not anymore! ;-) )&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;YES! I want my own copy of this important event. Rush my APO Bootcamp CD set immediately, for only $995.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Man, only $995 ?! That's less than 70 bucks for each hour of slides!&lt;br /&gt;&lt;br /&gt;This is almost as cool as Monty Python's &lt;a href="http://www.univie.ac.at/cga/art/tv.html"&gt;ministry of silly walk&lt;/a&gt;. Thanks guys!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-111542489061948424?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/111542489061948424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=111542489061948424&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/111542489061948424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/111542489061948424'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2005/05/is-it-joke-from-this-apobootcamp-this.html' title='Is it a joke?'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-111542312473791475</id><published>2005-05-07T00:40:00.000+01:00</published><updated>2006-12-17T23:26:36.283Z</updated><title type='text'>Time flys</title><content type='html'>Geeee, already in May!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-111542312473791475?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/111542312473791475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=111542312473791475&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/111542312473791475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/111542312473791475'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2005/05/time-flys-geeee-already-in-may.html' title='Time flys'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6297557.post-110875392423134143</id><published>2005-02-18T19:10:00.000Z</published><updated>2006-12-17T23:27:20.035Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='debug'/><title type='text'>Source search</title><content type='html'>To search source code in R3 there is RPR_ABAP_SOURCE_SCAN. Unfortunately not in APO. Use RSRSCAN1 instead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6297557-110875392423134143?l=apolemia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apolemia.blogspot.com/feeds/110875392423134143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6297557&amp;postID=110875392423134143&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/110875392423134143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6297557/posts/default/110875392423134143'/><link rel='alternate' type='text/html' href='http://apolemia.blogspot.com/2005/02/to-search-source-code-in-r3-there-is.html' title='Source search'/><author><name>pvl</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
