<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>computers should be less friendly &#187; ABAP</title>
	<atom:link href="http://blog.danmcweeney.com/category/abap/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.danmcweeney.com</link>
	<description></description>
	<lastBuildDate>Mon, 10 Aug 2009 20:38:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>SAP Web Services in Flex Builder</title>
		<link>http://blog.danmcweeney.com/57</link>
		<comments>http://blog.danmcweeney.com/57#comments</comments>
		<pubDate>Wed, 14 Nov 2007 19:52:43 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[ABAP]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[SDN blogger]]></category>

		<guid isPermaLink="false">http://blog.danmcweeney.com/57</guid>
		<description><![CDATA[SAP web services are really complex, tables inside rows inside tables inside structures.&#160; I&#8217;ve been fielding an increasing number of questions about using these in the forum so, instead of answering everyone separately here are a few examples from simple to complex. Let&#8217;s start off with one of the simpler examples just to get the [...]]]></description>
			<content:encoded><![CDATA[<p>SAP web services are really complex, tables inside rows inside tables inside structures.&nbsp; I&#8217;ve been fielding an increasing number of questions about using these in the forum so, instead of answering everyone separately here are a few examples from simple to complex.</p>
<p>Let&#8217;s start off with one of the simpler examples just to get the hang of it.&nbsp; Use SAPLink and install this <a href="http://zclguialvgrid.googlecode.com/files/FUGR_ZSDN_TESTS.slnk">function group</a> and generate a web service from the one function in it.&nbsp; Now, lets write some Flex code to call this.</p>
<h3>Import Statements</h3>
<p>A few people have asked me to add the import statements to this.&nbsp; For reference if you go to the object that has the error, move your cursor to the end of the word hold control and press space the import will be added for you automatically, welcome to the wonderful world of a good IDE.&nbsp; But the following in a &lt;mx:Script&gt; block between the &lt;mx:Application&gt; tags.</p>
<div class="wlWriterEditableSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:cfad4a30-9b29-416c-93d9-133e8c4b2b76" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color: white">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #000000">import mx.rpc.AbstractOperation;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.soap.LoadEvent;
import mx.rpc.soap.WebService;</span></div>
</pre>
</div>
<h2>Simplest Example</h2>
<h3>Step 1 &#8211; Get your WSDL</h3>
<div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:177a0323-a5da-495a-b187-ee5972c3502e" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; width: 703px; padding-top: 0px">
<pre style="background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #008080; ">1</span> <span style="color: #0000FF; ">private</span><span style="color: #000000; "> function callWebService():</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">{
</span><span style="color: #008080; ">2</span> <span style="color: #000000; ">    fooService </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> WebService();
</span><span style="color: #008080; ">3</span> <span style="color: #000000; ">    fooService.wsdl </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">http://localhost/sap/bc/srt/rfc/sap/Z_TEST_CHANGING_PARAM?sap-client=300&amp;wsdl=1.1</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">;
</span><span style="color: #008080; ">4</span> <span style="color: #000000; ">    fooService.addEventListener(LoadEvent.LOAD, loadListener);
</span><span style="color: #008080; ">5</span> <span style="color: #000000; ">    fooService.addEventListener(ResultEvent.RESULT, resultTrigger);
</span><span style="color: #008080; ">6</span> <span style="color: #000000; ">    fooService.addEventListener(FaultEvent.FAULT,fault);
</span><span style="color: #008080; ">7</span> <span style="color: #000000; ">    fooService.loadWSDL();
</span><span style="color: #008080; ">8</span> <span style="color: #000000; ">}</span></div>
</pre>
</div>
<p><strong>Line by Line:</strong></p>
<ol>
<li>Declare a function that will start the whole process</li>
<li>Create a WebService object, this should be global or at least visible to the other methods ( you&#8217;ll need it later )</li>
<li>Point the WS to the location of the WSDL</li>
<li>Add an EventListener for when the Loading of the WSDL is complete</li>
<li>Add an EventListener for the results coming back from the call</li>
<li>Add an EventListener for any errors that occur</li>
<li>Tell the WS to load the WSDL</li>
</ol>
<h3><font face="Verdana">Step 2 &#8211; Set Some Parameters</font></h3>
<p><div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:438555d6-8ee2-4317-b461-6b80d6189730" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; width: 694px; padding-top: 0px">
<pre style="background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #008080; ">1</span> <span style="color: #0000FF; ">private</span><span style="color: #000000; "> function loadListener(</span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">:LoadEvent):</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">{
</span><span style="color: #008080; ">2</span> <span style="color: #000000; ">    var op:AbstractOperation </span><span style="color: #000000; ">=</span><span style="color: #000000; "> fooService.getOperation(</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">Z_DOUBLE_ROWS</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">);
</span><span style="color: #008080; ">3</span> <span style="color: #000000; ">    var input:Object </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Object();
</span><span style="color: #008080; ">4</span> <span style="color: #000000; ">    input.TEST </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Array();
</span><span style="color: #008080; ">5</span> <span style="color: #000000; ">    input.TEST.push(</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">foo</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">);
</span><span style="color: #008080; ">6</span> <span style="color: #000000; ">    input.TEST.push(</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">bar</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">);
</span><span style="color: #008080; ">7</span> <span style="color: #000000; ">    op.arguments </span><span style="color: #000000; ">=</span><span style="color: #000000; "> input;
</span><span style="color: #008080; ">8</span> <span style="color: #000000; ">    op.send();
</span><span style="color: #008080; ">9</span> <span style="color: #000000; ">}</span></div>
</pre>
</div>
<p><strong>Line by Line:</strong></p>
<ol>
<li>Declare a function who handles the event you subscribed to in the Step&nbsp;1 line 4.</li>
<li>Get the Operation from the WSDL file.&nbsp; This is one of those &#8220;standard&#8221; ways of doing things.&nbsp; If you look at your WSDL file you will see that it could have more then one operation in it, this gets the particular operation you want to call.</li>
<li>Create a dynamic object that will hold the inbound parameters to your WS.&nbsp; In this case the parameter TEST is a table of strings.</li>
<li>Here we create what Flex builder thinks is how to hold&nbsp; a table, an Array.</li>
<li>Then we push each &#8220;row&#8221; of the table into the array again, in this case it&#8217;s just one string at a time.</li>
<li>See Line 5</li>
<li>We then map the input object to the arguments of the WS.</li>
<li>Send our request including all the input data to the server</li>
</ol>
<h3>Step 3 &#8211; Look at the Output</h3>
<p><div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:d2cd3332-1cb8-4784-b329-fe14eb61a44c" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; width: 694px; padding-top: 0px">
<pre style="background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #008080; ">1</span> <span style="color: #0000FF; ">private</span><span style="color: #000000; "> function resultTrigger(</span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">:ResultEvent):</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">{
</span><span style="color: #008080; ">2</span> <span style="color: #000000; ">    var item:String;
</span><span style="color: #008080; ">3</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> each(item </span><span style="color: #0000FF; ">in</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">.result){
</span><span style="color: #008080; ">4</span> <span style="color: #000000; ">        trace(item);
</span><span style="color: #008080; ">5</span> <span style="color: #000000; ">    }
</span><span style="color: #008080; ">6</span> <span style="color: #000000; ">}</span></div>
</pre>
</div>
<p><strong>Line by Line</strong></p>
<ol>
<li>Define a function to handle the event from section 1 line 5</li>
<li>Declare on object to hold each result</li>
<li>Loop at each item in the result list, which happen to be strings.</li>
<li>Print them out to the debug console</li>
</ol>
<p>I will talk about more advanced parsing of the result set later on.</p>
<h2>Inbound Table Parameter</h2>
<p>First, get your WSDL, in this case I will be using the FM BAPI_FLIGHT_GETLIST from the SFLIGHTS example we are all so fond of.&nbsp; You should run this FM a few times to make sure you have data on the ABAP side, I will be passing in a date range to this FM so, you might want to find two dates that return some data for you. ( I named my WebService &#8220;Z_GET_FLIGHT_LIST&#8221; )</p>
<h3>Step 1 &#8211; Get Your WSDL</h3>
<p>This is the same exact thing you did before, just with a different WSDL.</p>
<h3>Step 2 &#8211; Set some Parameters</h3>
<p>There is a strange behavior with ABAP WebServices where if you have a table that is both Input and Output you must pass it as part request to get it filled.&nbsp; You&#8217;ll see in a second:</p>
<div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:69c09289-32e6-49d6-bf4d-a6302ba552cb" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; width: 697px; padding-top: 0px">
<pre style="background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #008080; ">1</span> <span style="color: #0000FF; ">private</span><span style="color: #000000; "> function loadListener(</span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">:LoadEvent):</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">{
</span><span style="color: #008080; ">2</span> <span style="color: #000000; ">    var op:AbstractOperation </span><span style="color: #000000; ">=</span><span style="color: #000000; "> fooService.getOperation(</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">BAPI_FLIGHT_GETLIST</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">);
</span><span style="color: #008080; ">3</span> <span style="color: #000000; ">    var input:Object </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Object();
</span><span style="color: #008080; ">4</span> <span style="color: #000000; ">    input.FLIGHT_LIST </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Array();
</span><span style="color: #008080; ">5</span> <span style="color: #000000; ">    input.RETURN </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Array();
</span><span style="color: #008080; ">6</span> <span style="color: #000000; ">    op.arguments </span><span style="color: #000000; ">=</span><span style="color: #000000; "> input;
</span><span style="color: #008080; ">7</span> <span style="color: #000000; ">    op.send();
</span><span style="color: #008080; ">8</span> <span style="color: #000000; ">}</span></div>
</pre>
</div>
<p><strong>Line by Line</strong></p>
<ol>
<li>Define a function that handles the event</li>
<li>Get the right operation</li>
<li>Dynamic input object</li>
<li>You have to pass blank parameters to the WS so that the Web Application Server will fill them</li>
<li>See line 4</li>
<li>Same as last time</li>
<li>Same here</li>
</ol>
<p><strong><font face="Trebuchet MS"></font></strong></p>
<h3>Set Table Parameters</h3>
<div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:aa159222-3442-4c18-aa83-e3ec8a1d1097" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; width: 707px; padding-top: 0px">
<pre style="background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #008080; ">1</span> <span style="color: #000000; ">    var dateRangeRow:Object </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Object();
</span><span style="color: #008080; ">2</span> <span style="color: #000000; ">    input.DATE_RANGE </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Array();
</span><span style="color: #008080; ">3</span> <span style="color: #000000; ">    dateRangeRow.SIGN </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">I</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">;
</span><span style="color: #008080; ">4</span> <span style="color: #000000; ">    dateRangeRow.OPTION </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">EQ</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">;
</span><span style="color: #008080; ">5</span> <span style="color: #000000; ">    dateRangeRow.LOW </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">2002-12-20</span><span style="color: #000000; ">&quot;</span><span style="color: #000000; ">;
</span><span style="color: #008080; ">6</span> <span style="color: #000000; ">    dateRangeRow.HIGH </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">&quot;&quot;</span><span style="color: #000000; ">;
</span><span style="color: #008080; ">7</span> <span style="color: #000000; ">    input.DATE_RANGE.push(dateRangeRow);</span></div>
</pre>
</div>
<p><strong>Line by Line ( add this between lines 5 and 6 from the prior example )</strong></p>
<ol>
<li>Create a new dynamic object that holds a Row of the DATE_RANGE table</li>
<li>Create an array called DATE_RANGE which will map to the DATE_RANGE input parameter</li>
<li>Set each field dynamically</li>
<li>More fields</li>
<li>More fields</li>
<li>More fields ( don&#8217;t need to pass this one because it&#8217;s blank )</li>
<li>Push this row into the array</li>
</ol>
<h3>Step 3 &#8211; Look at the Output</h3>
<div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:75a8b0ec-b550-49fc-b543-b28156dc611e" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; width: 701px; padding-top: 0px">
<pre style="background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #008080; ">1</span> <span style="color: #0000FF; ">private</span><span style="color: #000000; "> function resultTrigger(</span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">:ResultEvent):</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">{
</span><span style="color: #008080; ">2</span> <span style="color: #000000; ">    var row:Object;
</span><span style="color: #008080; ">3</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> each (row </span><span style="color: #0000FF; ">in</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">.result.FLIGHT_LIST){
</span><span style="color: #008080; ">4</span> <span style="color: #000000; ">        trace(row.AIRLINE </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">&quot;</span><span style="color: #000000; "> </span><span style="color: #000000; ">&quot;</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; "> row.CITYFROM);
</span><span style="color: #008080; ">5</span> <span style="color: #000000; ">    }
</span><span style="color: #008080; ">6</span> <span style="color: #000000; ">}</span></div>
</pre>
</div>
<p><strong>Line by Line</strong></p>
<ol>
<li>Function, again.</li>
<li>Use a place holder dynamic object</li>
<li>Loop at the table called FLIGHT_LIST ( looks like ABAP doesn&#8217;t it? )</li>
<li>Print to the console the fields you want ( looks like ABAP doesn&#8217;t it? )</li>
</ol>
<p>Disclaimer: There are a number of ways to call WebServices in Flex, I believe this is the most complete and &#8220;standard&#8221; way to call them, if not someone please point me to Adobe docs that show the most correct way.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danmcweeney.com/57/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Secrets of the Subscription EULA</title>
		<link>http://blog.danmcweeney.com/49</link>
		<comments>http://blog.danmcweeney.com/49#comments</comments>
		<pubDate>Wed, 17 Oct 2007 10:33:13 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[ABAP]]></category>
		<category><![CDATA[SAP]]></category>
		<category><![CDATA[SDN blogger]]></category>

		<guid isPermaLink="false">http://blog.danmcweeney.com/49</guid>
		<description><![CDATA[I was able to ask Zia Yusuf this morning about some of the restrictions around the SAP Subscription License.&#160; paraphrasing his answer a bit: The license you are granted is a development license if you intend to resell or license any of your solutions you create you need to get a different license from SAP [...]]]></description>
			<content:encoded><![CDATA[<p>I was able to ask Zia Yusuf this morning about some of the restrictions around the SAP Subscription License.&nbsp; paraphrasing his answer a bit:</p>
<blockquote><p><font color="#333333">The license you are granted is a development license if you intend to resell or license any of your solutions you create you need to get a different license from SAP</font></p>
</blockquote>
<p>So what this means is that if you develop something on the subscription program you cannot resell it.&nbsp; The EULA is pretty clear in this regard:</p>
<blockquote><p>If You wish to use an Add-On or Consuming Product Application created by You in a production environment, or to otherwise commercialize and/or distribute that Add-On or Consuming Product Application, You must first enter into a separate agreement with SAP.&nbsp; Under this Agreement You are not entitled to: &#8230; license sell, offer to sell, transfer, rent, lease, distribute and/or otherwise make available the SAP Software and/or any Add-On to third parties. [source: <a href="https://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/webcontent/uuid/10436b59-dcf0-2910-e9bd-d839ceb83b6d?revisionid=3&amp;language=en" target="_blank">EULA</a>]</p>
</blockquote>
<p>Thanks to <a href="http://blog.ewherrmann.com/" target="_blank">Eddie</a> for the link to the EULA.
<p>Basically this means if you want to sell something you need a new license and probably any open source work would also meet with a cease and desist from the SAP legal team.&nbsp;
<p>To compare this to another player in the industry the <a href="http://download.microsoft.com/documents/useterms/MSDN%20Subscription_Premium%20Edition_English_36b85cb5-cdc0-43d8-90c1-fa168f15ee6d.pdf" target="_blank">EULA associated with the MSDN subscription</a> appears to not make any distinctions like this.&nbsp; Granted the <a href="http://msdn2.microsoft.com/en-us/vstudio/aa718657.aspx" target="_blank">pricing for the MSDN subscription</a> is a bit higher, New $10,939, then $3,499 / year thereafter.&nbsp; Compared to the <a href="https://www.sdn.sap.com/irj/sdn/subscriptions" target="_blank">SDN Subscription cost</a> which is $2,300 / year.&nbsp; I wonder how the MSDN numbers compare with the cost of the&nbsp;SAP license to resell your solutions.
<p>I think the subscription is a great idea and a big step forward for SAP but, to become a &#8220;platform company&#8221; they need to make it easier(cheaper being part of this) to get started in the ISV market.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danmcweeney.com/49/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ABAP Magic Models</title>
		<link>http://blog.danmcweeney.com/8</link>
		<comments>http://blog.danmcweeney.com/8#comments</comments>
		<pubDate>Sun, 26 Nov 2006 22:23:21 +0000</pubDate>
		<dc:creator>dan</dc:creator>
				<category><![CDATA[ABAP]]></category>
		<category><![CDATA[ABAP Magic Models]]></category>
		<category><![CDATA[RoR]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[SAP]]></category>
		<category><![CDATA[SDN blogger]]></category>

		<guid isPermaLink="false">http://blog.danmcweeney.com/?p=8</guid>
		<description><![CDATA[After reading a lot about Rails and it&#8217;s former inclusion (thanks to Tom and Ryan) of a bunch of REST functionality into the next release and a blog by Dr. Nic about his Magic Models project I&#8217;ve decided to embark on a new project. Simply put I want Dr. Nic&#8217;s magic models for ABAP. The [...]]]></description>
			<content:encoded><![CDATA[<p>After reading a lot about Rails and it&#8217;s <a href="http://dev.rubyonrails.org/changeset/5554" target="_blank">former inclusion</a> (thanks to <a href="http://atomgiant.com/articles/2006/11/19/active-resource-removed-from-rails-1-2" target="_blank">Tom</a><a href="http://feeds.feedburner.com/atomgiant" target="_blank"><img src="http://www.danmcweeney.com/images/feed-icon16x16.png" /></a> and <a href="http://www.ryandaigle.com/articles/2006/11/20/whats-new-in-edge-rails-activeresource-pulled-world-weeps" target="_blank">Ryan</a><a href="http://feeds.feedburner.com/RyansScraps" target="_blank"><img src="http://www.danmcweeney.com/images/feed-icon16x16.png" /></a>) of a bunch of REST functionality into the next release and a <a href="http://drnicwilliams.com/2006/08/10/bts-magic-models-class-creation/" target="_blank">blog by Dr. Nic</a> <a href="http://feeds.feedburner.com/DrNic" target="_blank"><img src="http://www.danmcweeney.com/images/feed-icon16x16.png" alt="feed" title="feed" /></a> about his <a href="http://magicmodels.rubyforge.org/" target="_blank">Magic Models project</a> I&#8217;ve decided to embark on a new project.</p>
<p>Simply put I want Dr. Nic&#8217;s magic models for ABAP.  The basic idea behind the project is that RoR developers should be able to easily consume ABAP objects.  Current solutions only create the ability to call RFCs, which if you are not an ABAP person are totally procedural elements so, this removes any of the beauty of OOP from systems you can build that interact with ABAP.  With this project I hope to put it back.  In the end what you should be able to do on the RoR side is create a config file to point to your SAP instance and then make calls like this:</p>
<blockquote style="font-family: monospace"><p>@abapObject = Zcl_foobar.new</p>
<p>@abapObject.callMethod( with, some, params )</p></blockquote>
<p>Where Zcl_foobar is the name of class that resides only on the ABAP system.  What this will allow a RoR developer to do is simply and quickly access classes from ABAP without having to have an ABAP person wrap every method call in a function module.  In the background Ruby is using the const_missing method to generate a generic class for Zcl_foobar.  When a method is called the call is converted into a specially formatted REST call to an ICF Node ( basically a servlet ) on the ABAP side and ABAP responds to the message with another XML document that the newly generated class understand and unpacks into more Ruby data objects.</p>
<p>For now I am only building a &#8220;connector&#8221; to the Ruby programming language but, there is nothing to prevent the addition of other scripting languages from using this method and the base ICF node to accomplish similar feats.  Over the next month or two I will be focusing almost all my time in taking this from it&#8217;s current stage, simply a proof of concept to a fully working system.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danmcweeney.com/8/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

