tag:blogger.com,1999:blog-78633340554851654892024-02-19T01:39:42.611-05:00Silent ExcellenceI'm a Principal Software Architect at Sage and I live in Toronto. With Sage since the late 1990s I have had the opportunity to work on a wide variety of projects including a proprietary programming language & IDE based on Eclipse. I'm currently working on & writing about RESTful web services, MVC .NET, Google Web Toolkit (GWT), JavaScript & JavaJaretthttp://www.blogger.com/profile/07278460105911902002noreply@blogger.comBlogger9125tag:blogger.com,1999:blog-7863334055485165489.post-58574126709955024242012-09-17T11:31:00.001-04:002012-09-17T11:36:28.119-04:00John Cleese on Creativity<br />
<div class="MsoNormal" style="text-align: justify;">
<span style="font-size: 13.5pt; line-height: 115%;">When
I talk about my job and software development in general I find there's a common
misperception, even among fellow engineers & architects. </span><span style="font-size: 13.5pt; line-height: 115%;">People think being
a software engineer, designing and writing good software is a methodical,
clinical endeavor practiced by mathematicians working in perhaps tense environment
with little humor.</span></div>
<div class="MsoNormal" style="text-align: justify;">
<span style="font-size: 13.5pt; line-height: 115%;"><br /></span></div>
<div class="MsoNormal" style="text-align: justify;">
<span style="font-size: 13.5pt; line-height: 115%;">In
fact software development is mostly about creativity. The best engineers &
architects are extremely creative people. The most successful software teams
are teams that understand how to harness the creativity of the group. <o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify;">
<span style="font-size: 13.5pt; line-height: 115%;"><br /></span></div>
<div class="MsoNormal" style="text-align: justify;">
<span style="font-size: 13.5pt; line-height: 115%;">Success
is only mostly about creativity because once you have arrived at that elegant
solution/design you must implement it. This means transitioning from that
pondering state of mind to a purposeful, focused somewhat closed state required
to turn that vision into functioning software.<o:p></o:p></span></div>
<div class="MsoNormal" style="text-align: justify;">
<span style="font-size: 13.5pt; line-height: 115%;"><br /></span></div>
<div class="MsoNormal" style="text-align: justify;">
</div>
<div style="text-align: start;">
<span style="font-family: Calibri, sans-serif; font-size: 13.5pt; line-height: 20.909090042114258px;"></span></div>
<div>
<span style="font-size: 13.5pt; line-height: 20.909090042114258px;">John Cleese is fantastic in this absolutely brilliant talk on creativity. The video is very entertaining and provides great insight and tips on how to be creative and improve the creativity of organizations. Everyone in R&D should see it:</span></div>
<br />
<br />
<br />
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/VShmtsLhkQg?feature=player_embedded' frameborder='0'></iframe></div>
Jaretthttp://www.blogger.com/profile/07278460105911902002noreply@blogger.com1tag:blogger.com,1999:blog-7863334055485165489.post-22825448862643274082012-06-28T12:09:00.002-04:002012-06-28T12:52:16.930-04:00SData JSON Payloads & MVC .NET Web API<div style="text-align: justify;">
</div>
<div class="MsoNormal">
<span style="font-family: inherit;">In a previous post I discussed handling SData URLs in MVC
.NET Web API. It’s easy to support most of the SData query language in a Web
API project if you use my SDataHandler library. The SDataHandler class library is
a POC I’ve developed to illustrate how to add SData support to MVC .NET Web API
projects.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: inherit;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: inherit;">The SDataHandler class provides/returns JSON payloads
including some of the metadata specified by SData 2.0 specification. I should
note the SData 2.0 specification has not been ratified yet so some of this
might change a bit in the final SData 2.0 release. <o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: inherit;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: inherit;">If you’re not familiar with JSON or JSON in SData here’s a
quick overview of how we represent data in SData with JSON:<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: inherit;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: inherit;">A
simple <span style="font-size: 10pt; line-height: 115%;">Customer </span>object with following structure and values: <o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: inherit;"><br /></span></div>
<div class="MsoNormal" style="margin-bottom: 3.15pt;">
<span style="font-family: inherit;">customername
-> American Business Futures <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 3.15pt;">
<span style="font-family: inherit;">addressline1
-> 123 Main Street <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 3.15pt;">
<span style="font-family: inherit;">city
-> Milwaukee<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 3.15pt;">
<span style="font-family: inherit;">state
-> WI<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 3.15pt;">
<span style="font-family: inherit;">zipcode
-> 90210<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">telephoneno -> (414) 555-4787<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">openorderamt -> 0<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">A JSON representation of this Customer would look
something like:<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">“Customer”: <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">{ <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"customername": "American Business Futures",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"addressline1": "2131 N. 14th Street",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"city": "Milwaukee",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"state": "WI",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"zipcode": "53205-1204",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"telephoneno": "(414) 555-4787",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"openorderamt": 0<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">}<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">A collection of Customers would be returned as a JSON
array, so if a client requests a list of all Customers the payload returned would
look like this:<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">{<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"$resources":<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> [<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"customername": "American Business Futures",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"addressline1": "2131 N. 14th Street",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"city": "Milwaukee",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"state": "WI",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"zipcode": "53205-1204",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"telephoneno": "(414) 555-4787",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"openorderamt": 0,<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> },<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"customername": "Dell Computers",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"addressline1": "1st street",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"city": "Irvine",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"state": "CA",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"zipcode": "92614",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"telephoneno": "(414) 555-1234",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"openorderamt": 0,<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> },<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"customername": "Jaretts Hardware",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"addressline1": "2nd street",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> "city": "Irvine",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"state": "MI",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"zipcode": "92614",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"telephoneno": "(414) 555-5678",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"openorderamt": 0,<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">]}<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">Notice the “$resources” array in the payload, SData keywords
within the payload always start with a “$”. SData allows services to provide
additional metadata like paging information, etc., along with the payload too. If
you’re not familiar with paging in SData see the <a href="http://interop.sage.com/daisy/sdata/AnatomyOfAnSDataFeed/PagingInformation.html" target="_blank">paging section of the SData web site</a> <o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">An SData collection
payload with paging metadata like counts, and links would look like this:<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">{<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-family: inherit;"> "$totalResults": 1,<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-family: inherit;"> "$startIndex": 1,<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-family: inherit;"> "$itemsPerPage": 26,<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-family: inherit;"> "$next":
"http://localhost:1698/sdata/Customers",<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-family: inherit;"> "$previous": "",<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-family: inherit;"> "$first":
"http://localhost:1698/sdata/Customers",<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-family: inherit;"> "$last":
"http://localhost:1698/sdata/Customers",<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"$resources":<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> [<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"customername": "American Business Futures",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"addressline1": "2131 N. 14th Street",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"city": "Milwaukee",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"state": "WI",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"zipcode": "53205-1204",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"telephoneno": "(414) 555-4787",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"openorderamt": 0,<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> },<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"customername": "Dell Computers",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"addressline1": "1st street",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"city": "Irvine",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"state": "CA",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"zipcode": "92614",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> "telephoneno":
"(414) 555-1234",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"openorderamt": 0,<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> },<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"customername": "Jaretts Hardware",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"addressline1": "2nd street",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"city": "Irvine",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"state": "MI",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"zipcode": "92614",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"telephoneno": "(414) 555-5678",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"openorderamt": 0,<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">]}<br />
<br />
Typically SData providers will also return information like the URL for this
collection/resource and an entry might also indicate a key. E.G:<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">{<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-family: inherit;"> "$baseurl":
"http://localhost:1698/sdata/Customers",<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"$totalResults": 1,<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"$startIndex": 1,<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"$itemsPerPage": 26,<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"$next": "http://localhost:1698/sdata/Customers",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"$previous": "",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"$first": "http://localhost:1698/sdata/Customers",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"$last": "http://localhost:1698/sdata/Customers",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"$resources":<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> [<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"customername": "American Business Futures",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"addressline1": "2131 N. 14th Street",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"city": "Milwaukee",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> "state": "WI",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"zipcode": "53205-1204",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"telephoneno": "(414) 555-4787",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"openorderamt": 0,<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-family: inherit;"> "$url":
"Customer(303130303030303035)",<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-family: inherit;"> "$key":
"303130303030303035"<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> },<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"customername": "Dell Computers",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"addressline1": "1st street",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"city": "Irvine",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"state": "CA",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"zipcode": "92614",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"telephoneno": "(414) 555-1234",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"openorderamt": 0,<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-family: inherit;"> "$url":
"Customer(303130303030303033)",<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-family: inherit;"> "$key":
"303130303030303033"<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> },<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> {<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"customername": "Jaretts Hardware",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"addressline1": "2nd street",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"city": "Irvine",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"state": "MI",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> "zipcode":
"92614",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"telephoneno": "(414) 555-5678",<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">
"openorderamt": 0,<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-family: inherit;"> "$url":
"Customer(303130303030303036)",<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="font-family: inherit;"> "$key":
"303130303030303036"<o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"> },<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;">The SDataHandler class will decorate your model and add
this metadata to payloads return by your Web API project. As indicated in my
post on SData URLs in MVC .NET Web API you can download and add my SDataHandler
class to a Web API project and it will add support for SData queries and JSON
payloads.<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: inherit;"><span style="background-color: white; color: #222222;">The
source code and a build of Sage.SDataCommon is available on GitHub. Download the</span>
<a href="https://github.com/jaretts/Sage.SDataHandler/downloads" target="_blank"><span style="background-color: white; color: #888888; text-decoration: none;">Sage.SDataCommon.dll
from GitHub</span></a><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="background: white; line-height: 13.5pt; margin-bottom: .0001pt; margin-bottom: 0in;">
<span style="color: #222222;"><span style="font-family: inherit;">Then just add
a reference to the Sage.SDataCommon in your Web API
project, and<span style="background-color: white;"> add the following code to your
project's Global.asax.cs:</span><o:p></o:p></span></span></div>
<div class="MsoNormal" style="background: white; line-height: 13.5pt; margin-bottom: 5.0pt;">
<blockquote class="tr_bq">
<span style="color: #222222;"><span style="font-family: inherit;">using
Sage.SData.CommonComponents;</span></span></blockquote>
<span style="background-color: white; color: #222222; font-family: inherit; line-height: 13.5pt;">In the
"Application_Start()" method somewhere after the Registering the
routes add the following one line of code:</span></div>
<div class="MsoNormal" style="background: white; line-height: 13.5pt; margin-bottom: 5.0pt;">
<br /></div>
<div class="MsoNormal" style="background: white; line-height: 13.5pt; margin-bottom: 5.0pt;">
<span style="color: #222222;"><span style="font-family: inherit;">GlobalConfiguration.Configuration.MessageHandlers.Add(new
SDataTransformHandler());<o:p></o:p></span></span></div>
<div class="MsoNormal" style="background: white; line-height: 13.5pt; margin-bottom: .0001pt; margin-bottom: 0in;">
<span style="color: #222222;"><span style="font-family: inherit;">The
"Application_Start()" method should look like:<o:p></o:p></span></span></div>
<div class="MsoNormal" style="background: white; line-height: 13.5pt; margin-bottom: 5.0pt;">
<span style="color: #222222;"><span style="font-family: inherit;">protected void
Application_Start()<br />
{<br />
....<o:p></o:p></span></span></div>
<div class="MsoNormal" style="background: white; line-height: 13.5pt; margin-bottom: 5.0pt;">
<span style="color: #222222;"><span style="font-family: inherit;">
RegisterRoutes(RouteTable.Routes);<o:p></o:p></span></span></div>
<div class="MsoNormal" style="background: white; line-height: 13.5pt; margin-bottom: 5.0pt;">
<span style="color: #222222;"><span style="font-family: inherit;">
<b>GlobalConfiguration.Configuration.MessageHandlers.Add</b><br />
<b>new SDataHandler()<span style="background-color: white;">);</span></b><o:p></o:p></span></span></div>
<div class="MsoNormal" style="background: white; line-height: 13.5pt; margin-bottom: 5.0pt;">
<span style="color: #222222;"><span style="font-family: inherit;"> ...<br />
}<o:p></o:p></span></span><br />
<span style="color: #222222;"><span style="font-family: inherit;"><br /></span></span></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="background-color: white; color: #222222;"><span style="font-family: inherit;">Now run your Web API service, open it in a web
browser and request a resource. The SDataHandler class will return SData 2.0
JSON.</span></span><span style="font-family: Consolas;"><o:p></o:p></span></div>Jaretthttp://www.blogger.com/profile/07278460105911902002noreply@blogger.com1tag:blogger.com,1999:blog-7863334055485165489.post-63269696068991120842012-05-10T15:42:00.002-04:002012-05-10T15:46:36.215-04:00SData Solutions within Sage<br />
<div class="MsoNormal" style="text-align: justify;">
In this post I list of some Sage products currently leveraging SData.<o:p></o:p></div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>
<div class="MsoNormal" style="text-align: justify;">
These products are
using SData to solve a variety of problems. SData provides: <o:p></o:p></div>
<div class="MsoNormal">
</div>
<ul>
<li style="text-align: justify;">REST Web Services</li>
<li style="text-align: justify;">Integrations for
Sage to Sage and Sage to 3rd party products</li>
<li style="text-align: justify;">Mobility/Browser
based access</li>
</ul>
<br />
<div class="MsoNormal">
<o:p></o:p></div>
<h3 style="text-align: justify;">
SData Glossary</h3>
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal" style="text-align: justify;">
</div>
<ul>
<li style="text-align: justify;"><b>SData Provider</b> –
Server side component that “provides” a web services API. E.G: Web Server</li>
<li style="text-align: justify;"><b>SData Consumer</b> –
Client side component that interacts with Sage SData Providers. E.G: Web
Browser</li>
<li style="text-align: justify;"><b>SData Sync Provider</b> –
component used to synchronize changes to common data across multiple Sage
products</li>
<li style="text-align: justify;"><b>Contracts </b>–
agreed upon format of data used in SData web service calls. The most commonly used SData Contract is the Global CRM
Integration contract which I'll discuss in great detail in a future post.<div class="MsoNormal">
<o:p></o:p></div>
</li>
</ul>
<o:p></o:p><br />
<div class="MsoNormal" style="text-align: justify;">
<o:p></o:p></div>
<div class="MsoNormal" style="text-align: justify;">
<o:p></o:p></div>
<div class="MsoNormal" style="text-align: justify;">
<o:p></o:p></div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>
<h3 style="text-align: left;">
SData Solutions within Sage:</h3>
<div class="MsoNormal">
<o:p></o:p></div>
<div style="text-align: justify;">
<div style="text-align: left;">
<table border="0" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-collapse: collapse; width: 538px;">
<tbody>
<tr style="height: 18.8pt; mso-yfti-firstrow: yes; mso-yfti-irow: 0;">
<td style="background: #024731; border-bottom: solid white 3.0pt; border: solid white 1.0pt; height: 18.8pt; padding: .05in .1in .05in .1in; width: 146.7pt;" valign="top" width="196">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<b><span style="color: white; font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 14.0pt; mso-fareast-font-family: "MS PGothic"; mso-font-kerning: 12.0pt;">Product</span></b><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #024731; border-bottom: solid white 3.0pt; border-left: none; border-right: solid white 1.0pt; border-top: solid white 1.0pt; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 76.5pt;" valign="top" width="102">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<b><span style="color: white; font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 14.0pt; mso-fareast-font-family: "MS PGothic"; mso-font-kerning: 12.0pt;">Consumer</span></b><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #024731; border-bottom: solid white 3.0pt; border-left: none; border-right: solid white 1.0pt; border-top: solid white 1.0pt; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<b><span style="color: white; font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 14.0pt; mso-fareast-font-family: "MS PGothic"; mso-font-kerning: 12.0pt;">Provider</span></b><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #024731; border-bottom: solid white 3.0pt; border-left: none; border-right: solid white 1.0pt; border-top: solid white 1.0pt; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 45.0pt;" valign="top" width="60">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<b><span style="color: white; font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 14.0pt; mso-fareast-font-family: "MS PGothic"; mso-font-kerning: 12.0pt;">Sync</span></b><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #024731; border-bottom: solid white 3.0pt; border-left: none; border-right: solid white 1.0pt; border-top: solid white 1.0pt; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<b><span style="color: white; font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 14.0pt; mso-fareast-font-family: "MS PGothic"; mso-font-kerning: 12.0pt;">Contract</span></b><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
</tr>
<tr style="height: 21.3pt; mso-yfti-irow: 1;">
<td style="background: #CBCFCD; border-top: none; border: solid white 1.0pt; height: 21.3pt; mso-border-top-alt: solid white 3.0pt; padding: .05in .1in .05in .1in; width: 146.7pt;" valign="top" width="196">
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Sage SalesLogix</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 21.3pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 3.0pt; padding: .05in .1in .05in .1in; width: 76.5pt;" valign="top" width="102">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 21.3pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 3.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 21.3pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 3.0pt; padding: .05in .1in .05in .1in; width: 45.0pt;" valign="top" width="60">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 21.3pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 3.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">GCRM</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
</tr>
<tr style="height: 19.25pt; mso-yfti-irow: 2;">
<td style="background: #E7E9E8; border-top: none; border: solid white 1.0pt; height: 19.25pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 146.7pt;" valign="top" width="196">
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Sage CRM</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 19.25pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 76.5pt;" valign="top" width="102">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 19.25pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">No</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 19.25pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 45.0pt;" valign="top" width="60">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 19.25pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">GCRM</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
</tr>
<tr style="height: 18.8pt; mso-yfti-irow: 3;">
<td style="background: #CBCFCD; border-top: none; border: solid white 1.0pt; height: 18.8pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 146.7pt;" valign="top" width="196">
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Sage ACT!</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 76.5pt;" valign="top" width="102">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">No</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 45.0pt;" valign="top" width="60">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">No</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">GCRM</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
</tr>
<tr style="height: 18.8pt; mso-yfti-irow: 4;">
<td style="background: #E7E9E8; border-top: none; border: solid white 1.0pt; height: 18.8pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 146.7pt;" valign="top" width="196">
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Sage 50 (UK)</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 76.5pt;" valign="top" width="102">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">No</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 45.0pt;" valign="top" width="60">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">No</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">GCRM</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
</tr>
<tr style="height: 18.8pt; mso-yfti-irow: 5;">
<td style="background: #CBCFCD; border-top: none; border: solid white 1.0pt; height: 18.8pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 146.7pt;" valign="top" width="196">
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Sage 200 (UK)</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 76.5pt;" valign="top" width="102">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">No</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 45.0pt;" valign="top" width="60">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">No</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90"></td>
</tr>
<tr style="height: 18.8pt; mso-yfti-irow: 6;">
<td style="background: #E7E9E8; border-top: none; border: solid white 1.0pt; height: 18.8pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 146.7pt;" valign="top" width="196">
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Sage 1000 (UK)</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 76.5pt;" valign="top" width="102">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 45.0pt;" valign="top" width="60">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">GCRM</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
</tr>
<tr style="height: 18.8pt; mso-yfti-irow: 7;">
<td style="background: #CBCFCD; border-top: none; border: solid white 1.0pt; height: 18.8pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 146.7pt;" valign="top" width="196">
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Sage X3</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 76.5pt;" valign="top" width="102">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 45.0pt;" valign="top" width="60">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">GCRM</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
</tr>
<tr style="height: 14.3pt; mso-yfti-irow: 8;">
<td style="background: #E7E9E8; border-top: none; border: solid white 1.0pt; height: 14.3pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 146.7pt;" valign="top" width="196">
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Office Line</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 14.3pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 76.5pt;" valign="top" width="102">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 14.3pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 14.3pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 45.0pt;" valign="top" width="60">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 14.3pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">GCRM</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
</tr>
<tr style="height: 17.0pt; mso-yfti-irow: 9;">
<td style="background: #CBCFCD; border-top: none; border: solid white 1.0pt; height: 17.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 146.7pt;" valign="top" width="196">
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Logic Class ERP/Murano</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 17.0pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 76.5pt;" valign="top" width="102">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 17.0pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 17.0pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 45.0pt;" valign="top" width="60">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 17.0pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">GCRM</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
</tr>
<tr style="height: 18.8pt; mso-yfti-irow: 10;">
<td style="background: #E7E9E8; border-top: none; border: solid white 1.0pt; height: 18.8pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 146.7pt;" valign="top" width="196">
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Sage Mobile</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 76.5pt;" valign="top" width="102">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">No</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 45.0pt;" valign="top" width="60">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">No</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 18.8pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90"></td>
</tr>
<tr style="height: 17.9pt; mso-yfti-irow: 11;">
<td style="background: #CBCFCD; border-top: none; border: solid white 1.0pt; height: 17.9pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 146.7pt;" valign="top" width="196">
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Sage 300 ERP </span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 17.9pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 76.5pt;" valign="top" width="102">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 17.9pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 17.9pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 45.0pt;" valign="top" width="60"></td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 17.9pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90"></td>
</tr>
<tr style="height: 30.9pt; mso-yfti-irow: 12;">
<td style="background: #E7E9E8; border-top: none; border: solid white 1.0pt; height: 30.9pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 146.7pt;" valign="top" width="196">
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Sage 300 Construction and Real Estate</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 30.9pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 76.5pt;" valign="top" width="102">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 30.9pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 30.9pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 45.0pt;" valign="top" width="60">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">No</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 30.9pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Native</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
</tr>
<tr style="height: 30.9pt; mso-yfti-irow: 13;">
<td style="background: #CBCFCD; border-top: none; border: solid white 1.0pt; height: 30.9pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 146.7pt;" valign="top" width="196">
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Billing Boss/Sage 50 (Canadian Edition)</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 30.9pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 76.5pt;" valign="top" width="102">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 30.9pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 30.9pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 45.0pt;" valign="top" width="60">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #CBCFCD; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 30.9pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">GCRM + </span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
</tr>
<tr style="height: 19.25pt; mso-yfti-irow: 14; mso-yfti-lastrow: yes;">
<td style="background: #E7E9E8; border-top: none; border: solid white 1.0pt; height: 19.25pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 146.7pt;" valign="top" width="196">
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Sage 100 ERP</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 19.25pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 76.5pt;" valign="top" width="102">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">No</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 19.25pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Yes</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 19.25pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 45.0pt;" valign="top" width="60">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">No </span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
<td style="background: #E7E9E8; border-bottom: solid white 1.0pt; border-left: none; border-right: solid white 1.0pt; border-top: none; height: 19.25pt; mso-border-left-alt: solid white 1.0pt; mso-border-top-alt: solid white 1.0pt; padding: .05in .1in .05in .1in; width: 67.5pt;" valign="top" width="90">
<div align="center" class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center;">
<span style="font-family: Arial, sans-serif; font-size: 12pt;">Native</span><span style="font-family: "Arial","sans-serif"; font-size: 12.0pt; mso-bidi-font-size: 18.0pt; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
</div>
<div style="text-align: left;">
<br /></div>
<div class="MsoNormal" style="text-align: left;">
<br /></div>
</div>
<div class="MsoNormal" style="text-align: left;">
<br /></div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>Jaretthttp://www.blogger.com/profile/07278460105911902002noreply@blogger.com1tag:blogger.com,1999:blog-7863334055485165489.post-80355570226510399632012-05-10T10:53:00.000-04:002012-05-10T15:44:37.529-04:00Validating SData Providers<br />
<div class="MsoNormal" style="text-align: justify;">
</div>
<div class="MsoNormal">
In this post I discuss:</div>
<div class="MsoNormal">
</div>
<ul>
<li>Opportunity SData provides</li>
<li>Problem/Challenge of building an SData provider that’s compliant with the SData specification</li>
<li>Solution is the SData Validation Tool</li>
</ul>
<br />
<br />
<h3 style="text-align: justify;">
Opportunity - Broad Common Interface</h3>
<div class="MsoNormal" style="text-align: justify;">
In a previous post I discussed how SData can provide a broad
common interface for all Sage products. The SData specification defines a
common language for integrating with Sage applications. <o:p></o:p></div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>
<div class="MsoNormal" style="text-align: justify;">
There’s growing commercial interest in SData and many
success stories, <a href="http://silentexcellence.blogspot.ca/2012/05/sdata-solutions-within-sage.html" target="_blank">here’s a list of SData solutions</a> and a Glossary of SData terms.<o:p></o:p></div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>
<div class="MsoNormal" style="text-align: justify;">
Sage 100 and Sage 300 teams are building and/or improving their SData services. I’m not sure of the exact release dates for these services
but I’ll provide an update as soon as that information is available.<o:p></o:p></div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>
<div class="MsoNormal" style="text-align: justify;">
If Sage 100 and Sage 300 both provide valid SData web
services then an ISV will have a common method for accessing Sage business logic
and data. ISVs can request a representation of a resource and/or delete, update
and create resources. <o:p></o:p></div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>
<div class="MsoNormal" style="text-align: justify;">
Sage 100 and Sage 300 currently don’t implement a common
SData contract so the representation of a resource might be different; for
example a Sales Order resource might have different elements, smaller or longer
address fields, etc. Nevertheless, there will at least be a common language for
CRUD operations on resources. <o:p></o:p></div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>
<div class="MsoNormal" style="text-align: justify;">
Having a common language means large parts of integrations
between Sage 100 and Sage 300 can be common. An R&D team working in .NET could
use our .NET SData client libraries as a common data access layer for both Sage
100 and Sage 300; they don’t need to know or think about the fact that Sage 100
is written in ProvideX and Sage 300’s SData provider is written in Java. This
will reduce the cost of developing and maintaining integrations with Sage
products.<o:p></o:p></div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>
<h3 style="text-align: justify;">
Problem/Challenge - Compliance with the SData Specification</h3>
<div class="MsoNormal" style="text-align: justify;">
Unfortunately, the potential of SData is significantly
diminished when providers deviate from the <a href="http://interop.sage.com/daisy/sdata/Introduction.html" target="_blank">SData specification</a>. If Sage 100 and Sage
300 interpret and implement the SData specification differently or there’re
bugs in their provider’s that cause deviation from the SData specification then
client libraries and data access logic will require special conditions for
specific providers. For example:</div>
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>
<div class="MsoNormal" style="text-align: justify;">
Frequently teams will develop an SData provider without an
external partner/consumer. An R&D team will build both an SData provider
and consumer to solve a business problem. They think they’re also laying the
ground work for future integrations. SData enables fantastic accessibility so they
know eventually someone else will come along and utilize those feeds; maybe a
solution they haven’t considered, like an Excel Plug-in, or Mobile Client that’s
driven by SData will utilize their SData feeds.<o:p></o:p></div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>
<div class="MsoNormal" style="text-align: justify;">
However, if they have not validated their compliance with
the SData specification using the Validation Tool there’s a good chance that
SData provider is not 100% SData compliant so the emerging ecosystem of SData
consumers is not available to them.<o:p></o:p></div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>
<div class="MsoNormal" style="text-align: justify;">
If an R&D team undertakes to build an SData provider
they must validate their provider is compliant with the SData specification. If
an SData provider is not compliant then that project does not meet requirements
even if their SData consumer works and meets the business case requirements.<br />
<br /></div>
<h3 style="text-align: justify;">
Solution - SData Validation Tool</h3>
<div class="MsoNormal" style="text-align: justify;">
Fortunately there’s a great tool for validating SData
providers. The SData Validation Tool has been around for several years. It’s
free, easy to use and comprehensive. Currently Sage 100 and Sage 300 are validating their SData providers with this tool. <o:p></o:p></div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>
<div class="MsoNormal" style="text-align: justify;">
Download the SData Validation Tool from the SData web site and
run the installer. The installer asks for a valid email address and then it immediately
emails an activation code. <o:p></o:p></div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>
<div class="MsoNormal" style="text-align: justify;">
Once installed simply enter the URL of an SData provider and
the Validation Tool will run hundreds of tests. The results are presented in a Grid
or Tree view that indicated the number of test performed and status for each; each
test results in a status of: Error, Warning, Successful or Not Executable.<o:p></o:p></div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>
<h3 style="text-align: justify;">
Where to get the SData Validation Tool</h3>
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal">
</div>
<ul>
<li style="text-align: justify;">The tools is discussed on the <a href="http://sdata.sage.com/sdatacore_showcases.html" target="_blank">Showcase section of the SData website</a></li>
<li style="text-align: justify;"><a href="http://sdata.sage.com/downloads/SDataFeedValidator.zip" target="_blank">Download the SData Validation Tool </a></li>
<li style="text-align: justify;"><a href="http://sdata.sage.com/downloads/SData_Validation.pdf" target="_blank">Download the documentation</a> </li>
</ul>
<br />
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal" style="text-align: justify;">
<br /></div>Jaretthttp://www.blogger.com/profile/07278460105911902002noreply@blogger.com1tag:blogger.com,1999:blog-7863334055485165489.post-72979795510381220092012-05-01T11:40:00.001-04:002012-05-01T12:29:04.811-04:00SData with Entity Framework (EF) Model & Database First<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="MsoPlainText" style="text-align: justify;">
The SIF is a great framework for building SData providers, see my <a href="http://silentexcellence.blogspot.com/2012/04/sage-integration-framework-sif.html">previous post</a> on the SIF for more about it.<br />
<br />
In this post I'm going to provide complete instructions on how to generate a RESTful web service <i>starting with the Northwind sample database. </i> The web service will be able to handle SData or OData URLs/Queries.<br />
<br />
With Visual Studio (VS) it's easy to build a RESTful web service starting Model & Database and adding support for SData URLs is easy too.<br />
<br />
<span style="text-align: center;">I'm going to do this with Visual Studio 11 Beta,</span> Entity Framework (EF) 5 and EF 5.x DbContext Generator for C#. I'll generate my Model from SQL Server and the Northwind sample database.<br />
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
<h3>
Video Tutorial</h3>
I provide instructions below the video if you prefer. The Video will show:</div>
<div class="MsoPlainText" style="text-align: justify;">
</div>
<ul>
<li style="text-align: justify;">Creating the MVC .NET 4 Web API project from the Northwind database</li>
<li style="text-align: justify;">Routes for handling SData Single and Collection URLs</li>
<li style="text-align: justify;">Referencing the SDataTransformHandler which handles complex SData queries</li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: justify;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dznrgzfQOXQz3YczsEFz3QI-lSO4ttPRrjq9sjfghrL-pQi7vbzVhnxCA3RbRTqtQdtxhdzHIuWPyF9wk0qSw' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div>
<div class="MsoPlainText" style="text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
<h3>
Instructions for
generating a RESTful web service from the Northwind Demo database. </h3>
<div>
<br /></div>
</div>
<div class="MsoPlainText" style="text-align: justify;">
<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
Follow my instruction or this Microsoft tutorial:<br />
<blockquote class="tr_bq">
<a href="http://blogs.msdn.com/b/adonet/archive/2011/09/28/ef-4-2-model-amp-database-first-walkthrough.aspx">EF 4.2 Model & Database First Walkthrough</a></blockquote>
</div>
<div class="MsoPlainText" style="text-align: justify;">
<h3>
<b>Create Web API project in VS</b></h3>
</div>
<div class="MsoPlainText" style="text-align: justify;">
1. File
New Project<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
2. APS.NET
MVC 4Web Application (Wizard)<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
3. Web
API (Wizard)<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
Build Solution!<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
You should now be able to run default wizard generated Web
API project and make a REST request like:<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
<a href="http://localhost:49068/api/values/1">http://localhost:49068/api/values/1</a><o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
To see a JSON content type returned add the ACCEPT header
and JSON type: E.G, Add Header:<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
Accept application/json<br />
</div>
<div class="MsoPlainText" style="text-align: justify;">
<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
<h3>
<b>Add database connection</b></h3>
</div>
<div class="MsoPlainText" style="text-align: justify;">
1. Open
Server Explorer View<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
2. Right
click Data Connections -> Select “Add Connection” wizard<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
3. Select
Server Name and then select database name<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
4. Test
Connection<br />
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
<h3>
<b>Add model from database</b></h3>
</div>
<div class="MsoPlainText" style="text-align: justify;">
1. Right
Click “Models”, select: Add -> New Item<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
2. Select
“ADO.NET Entity Data Model from the list<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
3. In
Entity Data Model Wizard select “Generate
from database”<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
4. Select
Connection (E.G. onm512295.Northwind.dbo)<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
5. Click
Next button and then select all tables from the “Entity Data Model Wizard”<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
6. Finish<br />
Build Solution!</div>
<div class="MsoPlainText" style="text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
<h3>
<b>Generate the code from the model</b></h3>
</div>
<div class="MsoPlainText" style="text-align: justify;">
If using VS 11 then install the EF 5.x DbContext
Generator for C#:<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
<a href="http://visualstudiogallery.msdn.microsoft.com/da740968-02f9-42a9-9ee4-1a9a06d896a2">http://visualstudiogallery.msdn.microsoft.com/da740968-02f9-42a9-9ee4-1a9a06d896a2</a><o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
1. Right
click on the model_name.edmx diagram/editor and click “Add Code Generation
Item…”<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
2. Select
“Code” from the left hand list<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
3. Select
“EF 5.x DbContext Generator” and click Add<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
4. Click
ok if you get a warning<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
There will now be a node called [some name].tt within Models in
Solution Explorer. Within [some name].tt there will be all of the Entities. E.g.
Customer, Order, etc.</div>
<div class="MsoPlainText" style="text-align: justify;">
<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
There should also be a [some name].Context.tt node under
the Models node in Solution Explorer. This is required later (see below).<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
<i>Important warning: If the keyword “<b>virtual</b>” appears</i> in the Entities
(E.G. in Order.cs, etc.) then delete it. If the virtual keyword exists on an entities member then the entity will
not be serialized; an error like the following will appear at runtime when you eventually
execute a GET: </div>
<blockquote class="tr_bq">
<div style="text-align: justify;">
Exception Details: System.Xml.XmlException: You must
write an attribute 'type'='object' after writing the attribute with local name
'__type'.</div>
<o:p></o:p><br />
<div style="text-align: justify;">
</div>
</blockquote>
<div class="MsoPlainText" style="text-align: justify;">
<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
Build Solution!<br />
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
<h3>
<b>Generate Controller for each the Entity</b></h3>
</div>
<div class="MsoPlainText" style="text-align: justify;">
<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
</div>
<ol>
<li style="text-align: justify;">Right
Click “Controllers” folder and “Add Controller”</li>
<li style="text-align: justify;">The Add Controller Wizard will popup enter the following: </li>
<li style="text-align: justify;">Specify
Controller name that matches target Entity, E.G: "CustomerController" for the Customer model class</li>
<li style="text-align: justify;"><i>Template</i>:
drop box select “<i>API controller with empty read/write actions</i>".</li>
<li style="text-align: justify;"><i>Model
class</i>: Select the Model class, e.g. "Customer"</li>
<li style="text-align: justify;"><i>Data
context class</i>: Select the DbContext created in step 3 of <i>Generate the code from the model </i>instructions above. E.G: "NorthwindEntities"</li>
</ol>
<div class="MsoPlainText" style="text-align: justify;">
<h3>
<b>Add logic to the controller class to read
data</b></h3>
</div>
<div class="MsoPlainText" style="text-align: justify;">
public class
CustomerController : ApiController<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
{<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
NorthwindEntities db = new NorthwindEntities();<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
// GET
/api/customer<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
public
IQueryable<Customer> Get()<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
{<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
IQueryable<Customer> retVal = db.Customers.AsQueryable();<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
if
(retVal == null)<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
throw
new HttpResponseException(HttpStatusCode.NotFound);<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
return
retVal;<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
}<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
// GET
/api/customer/5<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
public
Customer Get(string selector)<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
{<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
Customer retValue = db.Customers.Single(o => o.CustomerID == selector);<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
if
(retValue == null)<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
{<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
throw new HttpResponseException(HttpStatusCode.NotFound);<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
}<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
return
retValue;<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
}<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
}<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
Now run the project, open a web browser and request
customer resource, e.g:<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
<a href="http://localhost:1489/sdata/contract/customer(ALFKI)">http://localhost:1489/sdata/contract/customer(ALFKI)</a><o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
If you hit the following error:</div>
<blockquote class="tr_bq">
"Exception Details: System.Xml.XmlException: You
must write an attribute 'type'='object' after writing the attribute with local
name '__type'."<br />
<o:p> </o:p>It’s because you did not remove the “virtual” keyword
from the generated entities classes as indicated above. This is a bug in MS's
framework.</blockquote>
<div class="MsoPlainText" style="text-align: justify;">
<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
<o:p></o:p></div>
<div class="MsoPlainText" style="text-align: justify;">
At this point you should have a RESTful web service that can handle simple HTTP GETs with SData Single or Collections URLs. To add support for complex SData URLs/Queries follow the instructions I provided in my post:<br />
<blockquote class="tr_bq">
<a href="http://silentexcellence.blogspot.com/2012/04/sdata-urls-in-mvc-net-web-api.html">SData URLs in MVC .NET Web API</a></blockquote>
</div>
<div class="MsoPlainText" style="text-align: justify;">
<h4>
<span style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="font-size: 22px;"><br /></span></span></h4>
</div>
<div class="MsoPlainText" style="text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
<br /></div>
<div class="MsoPlainText" style="text-align: justify;">
<br /></div>Jaretthttp://www.blogger.com/profile/07278460105911902002noreply@blogger.com0tag:blogger.com,1999:blog-7863334055485165489.post-33511217397649635692012-04-30T15:10:00.002-04:002012-04-30T15:46:22.505-04:00REST Clients<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
There're a bunch of helpful web clients (or REST clients) for testing RESTful web services. I mostly use a Firefox Add on called RESTClient.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
REST clients are essential when developing RESTful web services. Obviously you can just use any web browser to test GETs, but REST clients also provide formatted views of XML and JSON payloads which is helpful. With a REST client it's also easy to perform all of the HTTP verbs/actions and hit a web service's POST, PUT and DELETE methods.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
For example to test PUT and POST, I'll use RESTClient to perform a GET on an SData resource and then I'll copy and paste the payload that was returned into the payload field and make a change. Then I'll do a POST or PUT back to the RESTful web service to create a new resource or change an existing resource.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
There’re REST clients for most browsers, here're a few:</div>
<ul>
<li style="text-align: justify;">Opera: <a href="https://addons.opera.com/en/addons/extensions/details/simple-rest-client/1.4/" target="_blank">Simple REST Client</a></li>
<li style="text-align: justify;">Chrome: <a href="https://chrome.google.com/webstore/detail/hgmloofddffdnphfgcellkdfbfbjeloo" target="_blank">Advanced REST client Application</a></li>
<li style="text-align: justify;">Firefox: <a href="https://addons.mozilla.org/en-US/firefox/addon/restclient/" target="_blank">RESTClient</a></li>
</ul>
<div style="text-align: justify;">
Firefox RESTClient illustration:</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOOVVSKDkLdC297H3TuSnQpdVIJJrJjc97YaU2Q2IakfJ8KfH5C7JbjXy-DrgzbWT40uqvrsW5bXD7SZK3N-eEBhzZp9OkpKcdgtdTv8M4jLURZx3sB3wNqObXR1jQPnVuNA2pZZK90saD/s1600/27623.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="315" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOOVVSKDkLdC297H3TuSnQpdVIJJrJjc97YaU2Q2IakfJ8KfH5C7JbjXy-DrgzbWT40uqvrsW5bXD7SZK3N-eEBhzZp9OkpKcdgtdTv8M4jLURZx3sB3wNqObXR1jQPnVuNA2pZZK90saD/s400/27623.png" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>SData Client</b></div>
<div style="text-align: justify;">
<b><br /></b></div>
<div style="text-align: justify;">
For testing SData web services there's a good Windows application available on <a href="https://github.com/Sage/SDataCSharpClientLib/tree/master/demos" target="_blank">GitHub called SDataClientApp</a> that was built by the SalesLogix team to demonstrate the use of the .NET SData client libraries. This Windows application is focused on SData, for example it can display SData XML or JSON payloads in a Grid. SDataClientApp does everything and more then the browser based clients above.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The SData client libraries for .NET and JavaScript are also available on GitHub. The client libraries are available here:</div>
<div style="text-align: justify;">
</div>
<ul>
<li><a href="https://github.com/Sage/SDataCSharpClientLib">.NET</a></li>
<li><a href="https://github.com/Sage/SDataJavaScriptClientLib" target="_blank">JavaScript</a></li>
</ul>
<br />
<div style="text-align: justify;">
I'll write more about the SData client libraries soon.
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>Jaretthttp://www.blogger.com/profile/07278460105911902002noreply@blogger.com0tag:blogger.com,1999:blog-7863334055485165489.post-67380487885138154292012-04-20T13:01:00.002-04:002012-06-28T10:37:04.100-04:00SData URLs in MVC .NET Web API<div style="text-align: justify;">
In this post I'm going to explain how to build RESTful Web Services with ASP .NET Web API and support SData:<br />
<ul>
<li>Single Resource and Collection URLs (via Web API Routes)</li>
<li>Queries
(E.G: where, orderby) </li>
<li>Paging (E.G: startIndex, count)</li>
<li>Payloads</li>
</ul>
</div>
<div style="text-align: justify;">
I mentioned in a <a href="http://silentexcellence.blogspot.ca/2012/04/sage-integration-framework-sif.html" target="_blank">previous post</a> that currently the SIF is the de facto standard for building SData web services in .NET. The SIF is a very good framework for building SData web services. I have participated in three projects where we used the SIF to provide SData. The SIF is a good foundation for building SData web services, but there're other options you might want to explore too.</div>
<div style="text-align: justify;">
<br />
<h3>
RESTful Web Services With ASP .NET Web API</h3>
</div>
<div style="text-align: justify;">
<br />
One of the projects I'm working on right now is a Mobile web application that we're building with Microsoft's ASP .NET MVC framework. I really like ASP .NET MVC; I like:</div>
<div style="text-align: justify;">
</div>
<ul>
<li>Model, view, controller pattern is implemented well in the framework, the clear separation of concerns</li>
<li>Tool support with Visual Studio is excellent</li>
<li>Documentation and tutorials are abundant</li>
<li>Open source under Apache 2.0 license</li>
</ul>
<br />
I'll write more about building web pages with ASP .NET MVC in the future, but today I want to discuss building SData web/HTTP services with ASP .NET MVC 4 Web API.<br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Building webservices and/or pages with ASP .NET MVC is really easy. There're a large number of tutorials available from Microsoft and others. For example <a href="http://www.asp.net/web-api/videos/getting-started/your-first-web-api" target="_blank">this Microsoft tutorial </a>will walk you through creating a simple REST web service in Visual Studio with MVC 4 Web API in just four minutes. With just a couple of mouse clicks you can have a simple REST web service that returns either XML or JSON content. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
I also provide complete instructions on how to generate a RESTful web service with Visual Studio 11 and MVC 4 Web API. See my blog <a href="http://silentexcellence.blogspot.ca/2012/05/sif-is-great-framework-for-building.html" target="_blank">SData with Entity Framework (EF) Model & Database First</a>. </div>
<div style="text-align: justify;">
<br />
<h3>
Supporting SData URLs</h3>
</div>
<div style="text-align: justify;">
It's really easy to add support for SData URLs to a Web API service. Follow the Microsoft tutorial or my tutorial mentioned above so you understand the basics of creating a Web API project, and so you have simple project in Visual Studio and then just do the following to add support for SData Single resource and Collection URLs:</div>
<div style="text-align: justify;">
<br />
<h4>
Web API SData Routes</h4>
<br /></div>
<div style="text-align: justify;">
The Web API new Project Wizard creates Global.asax.cs file with standard MVC routes and Web API routes. Open the Global.asax.cs file. The standard Web API route is something like:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
</div>
routes.MapHttpRoute(<br />
name: "DefaultApi",<br />
routeTemplate: "api/{controller}/{id}",<br />
defaults: new { id = RouteParameter.Optional }<br />
);<br />
<br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>1. Add a route for <a href="http://interop.sage.com/daisy/sdata/AnatomyOfAnSDataURL/SingleResourceURL.html" target="_blank">SData Single Resouce URL</a></b></div>
<div style="text-align: justify;">
E.G:<i> http://www.example.com/sdata/accounts('A001')</i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
</div>
routes.MapHttpRoute( name: "SDataSingleResourceKind",<br />
routeTemplate: "sdata/{controller}({selector})",<br />
defaults: new { selector = RouteParameter.Optional });<br />
<br />
<br />
<div style="text-align: justify;">
The route above tells a Web API message handler that when a user agent requests/GETs a single resource called "accounts" with the ID "A011", find the controller called "AccountsController", and then find the "Get" method within the controller that accepts one argument called "selector" and pass "A001" as the value for that argument. E.G. The "AccountsController" requires roughly the following method to handle this request and return the account with the specified ID:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
</div>
// GET <b>http://www.example.com/sdata/accounts('A001')</b><br />
public Account Get(string selector) {<br />
return db.Accounts.Single(o => o.AccountID == selector);<br />
}<br />
<br />
<div style="text-align: justify;">
</div>
<b>2. Add a route for <a href="http://interop.sage.com/daisy/sdata/AnatomyOfAnSDataURL/ResourceCollectionURL.html" target="_blank">SData Resouce Collection URL</a></b><br />
E.G:<i> http://www.example.com/sdata/accounts</i><br />
<br />
<br />
routes.MapHttpRoute( name: "SDataCollection",<br />
routeTemplate: "sdata/{controller}/{query}",<br />
defaults: new { query = RouteParameter.Optional }<br />
<div>
<br /></div>
<br />
Basically route 2 above tells a Web API message handler that when a user agent requests/GETs a collection of resources (an SData feed) called "accounts" find the controller called "AccountsController", and then find the "Get" method within the controller that requires NO arguments. E.G. The "AccountsController" requires roughly the following method to handle this request:<br />
<br />
<blockquote class="tr_bq">
// GET http://www.example.com/sdata/accounts<br />
public IQueryable<Customer> Get() {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>return db.Customers.AsQueryable();<br />
}</blockquote>
At this point you should have a basic Web API web service that can handle a request for an SData single resource really well and simple SData Collection request like:<br />
<blockquote class="tr_bq">
<span style="text-align: -webkit-auto;">http://www.example.com/sdata/accounts</span></blockquote>
<h4>
SData Queries</h4>
<br />
<div style="text-align: -webkit-auto;">
However, SData includes a very complete <a href="http://interop.sage.com/daisy/sdata/Queries/Example.html" target="_blank">query language</a> which is NOT supported by the Web API routing. In SData you can do far more then just request a collection of resources; you can filter, page, sort, etc. The following URL:</div>
<blockquote class="tr_bq">
sdata/salesOrders?<b>where=subTotal gt 1500.0 </b><b>&orderBy=orderDate </b><b>&startIndex=21&count=10</b></blockquote>
Requires the service to response with all of the SalesOrders:<br />
<div style="text-align: -webkit-auto;">
</div>
<ul>
<li><b>Where </b>the subTotal is greater then $1500</li>
<li><b>Ordered </b>by the date</li>
<li><b>Starting </b>with the twenty first resource</li>
<li>Including a maximum of ten resources (results 21 - 31)</li>
</ul>
Adding support for the SData query language would require complex controllers that included multiple overloaded GET methods which accepted a different number of method arguments. The methods would require logic that parsed the <i>where</i>, <i>orderby, </i>etc. and<i> </i>executed LINQ/query's.<br />
<div style="text-align: -webkit-auto;">
<br /></div>
<div style="text-align: -webkit-auto;">
Fortunately, there's a simple shortcut. If your resource collection method (the NO argument GET) returns IQueryable like the example above then you simply have to reference our Sage.SDataHandler Library in your Web API project. The SDataHandler class library is a POC I developed to illustrate how easy it is to add SData support to MVC .NET Web API projects. The SDataHandler enables even complex SData queries.<br />
<br />
The source code and a build of Sage.SDataHandler is available on GitHub. Download the <a href="https://github.com/jaretts/Sage.SDataHandler/downloads" target="_blank">Sage.SDataHandler.dll from GitHub</a> t<span style="background-color: white;">hen just add a reference to the Sage.SDataCommon in your Web API project and</span><span style="background-color: white;"> add the following code to your project's Global.asax.cs:</span></div>
<blockquote class="tr_bq">
using Sage.SDataHandler;</blockquote>
<div style="text-align: -webkit-auto;">
In the "Application_Start()" method somewhere after the Registering the routes add the following one line of code:</div>
<blockquote class="tr_bq">
GlobalConfiguration.Configuration.MessageHandlers.Add(new SDataHandler());</blockquote>
<div style="text-align: -webkit-auto;">
The "Application_Start()" method should look like:</div>
<div style="text-align: -webkit-auto;">
</div>
<blockquote class="tr_bq">
protected void Application_Start()<br />
{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>....</blockquote>
<blockquote class="tr_bq">
RegisterRoutes(RouteTable.Routes);</blockquote>
<blockquote class="tr_bq">
<b>GlobalConfiguration.Configuration.MessageHandlers.Add</b><br />
<b>new SDataHandler()</b><b style="background-color: white;">);</b></blockquote>
<blockquote class="tr_bq">
<span class="Apple-tab-span" style="white-space: pre;"> </span>...<br />
}</blockquote>
Now run your Web API service, open it in a web browser and try some complex SData URLs. The
<b>SDataHandler</b> will handle the complex SData queries. I'll explain how the
<b>SDataHandler</b> class works in a future post.<br />
<div style="text-align: -webkit-auto;">
<br /></div>
<div style="text-align: -webkit-auto;">
<h3>
SData Payloads</h3>
<br />
To create a complete SData provider you still have to generate and return SData compliant payloads; the service must respond with valid SData XML (based on ATOM) or JSON. The SDataHandler class will provide JSON payloads which will be compliant with SData 2.0.</div>
<div style="text-align: -webkit-auto;">
<br /></div>
<div style="text-align: -webkit-auto;">
<br /></div>
<div style="text-align: -webkit-auto;">
<br /></div>
<div style="text-align: justify;">
<br /></div>Jaretthttp://www.blogger.com/profile/07278460105911902002noreply@blogger.com0tag:blogger.com,1999:blog-7863334055485165489.post-4953108738676135712012-04-19T15:25:00.000-04:002012-05-10T11:03:02.387-04:00Brief Description of SData<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Over the last four years I have been working with other Architects, Engineers and product leaders from Sage North America and Europe on a key strategic initiative called <a href="http://sdata.sage.com/index.html">Sage Data (SData)</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
SData is a communication protocol based on REST, HTTP, ATOM and JSON which will improve interoperability between Sage products and access to Sage data and business logic.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Problem: Across Sage there are many completely different SDKs:</div>
<div style="text-align: justify;">
<br /></div>
<ul>
<li style="text-align: justify;">Many integrations to build and maintain</li>
<li style="text-align: justify;">Most of the current SDKs are for desktop development only; they do NOT enable web or mobile access to Sage data & logic</li>
</ul>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Solution: SData, a modern, REST communication protocol developed by Sage that could provide the basis for all future integration work between Sage products, Connected Services and third party ISV products.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
SData enables:</div>
<div style="text-align: justify;">
<br /></div>
<ul>
<li style="text-align: justify;">Communication between desktop, server, web & cloud applications </li>
<li style="text-align: justify;">Broad common interface for all Sage products</li>
<li style="text-align: justify;">HTTP/Web access to data & business logic for web & mobile clients</li>
</ul>
<div style="text-align: justify;">
<br /></div>
<div>
<div class="MsoNormal">
<div style="text-align: justify;">
There are many potential benefits for our customers, for example:<o:p></o:p></div>
</div>
<div class="MsoNormal">
<div style="text-align: justify;">
<br />
<ul>
<li>Sharing information within their organizations, for example, to let everyone who needs to know that a new order has been placed</li>
<li>Eliminating the need to re-enter information more than once</li>
<li>Combining data in Sage applications with info from other sources, such as spreadsheets or the web</li>
<li>Providing information to people outside the business, such as customers and suppliers</li>
</ul>
</div>
</div>
</div>
<div>
<div style="text-align: justify;">
<br />
I discuss the Opportunity and Challenges of building SData services in more detail in my post: <a href="http://validating%20sdata%20providers/" target="_blank">Validating SData Providers</a><br />
<div class="MsoNormal">
<o:p></o:p></div>
<br /></div>
<div style="text-align: justify;">
See
<a href="http://sdata.sage.com/sdatacore_business.html">SData for your Business</a> for more examples. My Colleague Stephen Smith also writes about SData frequently on his blog:</div>
</div>
<div>
<div style="text-align: justify;">
<br /></div>
</div>
<div>
<div style="text-align: justify;">
<a href="http://smist08.wordpress.com/2012/02/25/a-roadmap-for-sdata-integration-to-sage-products/" style="font-family: 'Times New Roman', serif;">Stephen Smith's Blog: A Roadmap for SData Integration to Sage Products</a></div>
</div>
<div>
<div style="text-align: justify;">
<br /></div>
</div>Jaretthttp://www.blogger.com/profile/07278460105911902002noreply@blogger.com0tag:blogger.com,1999:blog-7863334055485165489.post-5986309992605538662012-04-19T11:02:00.001-04:002012-04-20T10:06:01.706-04:00Sage Integration Framework (SIF)<div style="text-align: justify;">
A proprietary framework called the Sage Integration Framework (SIF) is currently the de facto standard foundation for building SData web services in .NET; within Sage most teams developing SData services <b>in .NET</b> use the SIF.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The SIF handles parsing URIs, serialization, etc., and makes it easy to provide SData feeds without actually having to know much about the specifics of the SData protocol. The SIF can provide XML or JSON content.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Developers plug-in to the SIF by registering "Adapters" that handle requests for specific resources. The SIF packages up incoming requests for those resources, deserialize the SData XML and/or JSON payloads and passes the request to the Adapter. When the Adapters done with the request and has read data, etc., it passes Entity objects back to the SIF which creates a valid SData response; the SIF serializes the data model, creating valid SData payload, error responses, etc.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
There's a reference implementation of the SIF and a sample Adapter that provides SData web services for the Northwind sample database.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Example SIF Project:</div>
<div class="separator" style="clear: both; text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHY5jhg8OaXtGOWoLkNR9g4B9aVaZweIX3VbIWihZ_9WeMP0WQ6n67OB5jV4igYzNVYRfSz0CihKaBqtdMR2Ir8aesGQGHHZAaNqoNoABwXLWOjRaB5Oeij_RS8uf7dMKQZdHkdrNOwX6R/s1600/Slide7.GIF" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHY5jhg8OaXtGOWoLkNR9g4B9aVaZweIX3VbIWihZ_9WeMP0WQ6n67OB5jV4igYzNVYRfSz0CihKaBqtdMR2Ir8aesGQGHHZAaNqoNoABwXLWOjRaB5Oeij_RS8uf7dMKQZdHkdrNOwX6R/s400/Slide7.GIF" width="400" /></a> </div>
<div class="separator" style="clear: both; text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGEJ1JfaEJo7jyetF-Cd1YOzuSBWyrwZc7NgB8TMeuhT22vlgQWAIa9R2G_Wt6CjYPMutbCAzGo7Mc-fz7wqT-rIhD5oo6RP52eysiiGO_XoMwRKELTMDUyv-2PUM3CxVDGGXEvhWAqfDg/s1600/Slide4.GIF" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGEJ1JfaEJo7jyetF-Cd1YOzuSBWyrwZc7NgB8TMeuhT22vlgQWAIa9R2G_Wt6CjYPMutbCAzGo7Mc-fz7wqT-rIhD5oo6RP52eysiiGO_XoMwRKELTMDUyv-2PUM3CxVDGGXEvhWAqfDg/s400/Slide4.GIF" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvOpHCcT4N7CFGgbdruLPKMWd4-JvJo4JP29oPlVeokVureH9kPA0ZfRPD_lT1KIMWZiHNOKRZEikv8iiAWyeA_Q_ZqojoRUpmxPPBk1vCjmgYWTXsymg6aFOZ4am1ny6E3QLzAybp9IXE/s1600/Slide5.GIF" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvOpHCcT4N7CFGgbdruLPKMWd4-JvJo4JP29oPlVeokVureH9kPA0ZfRPD_lT1KIMWZiHNOKRZEikv8iiAWyeA_Q_ZqojoRUpmxPPBk1vCjmgYWTXsymg6aFOZ4am1ny6E3QLzAybp9IXE/s400/Slide5.GIF" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJZUcPSSdTpVzUIzlGyoQpJLPxbCjvvfTir9mAioqz6gWlAT75Dxg9Jk1f5MC9-l2XYKsQiF1sMf3SMWpZp_waj1Uv6Oyv5O_CZ4W_cXkYsODAQtrMpz_aks2qnXZLR2YSxLyL1ub-ZuQ3/s1600/Slide6.GIF" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJZUcPSSdTpVzUIzlGyoQpJLPxbCjvvfTir9mAioqz6gWlAT75Dxg9Jk1f5MC9-l2XYKsQiF1sMf3SMWpZp_waj1Uv6Oyv5O_CZ4W_cXkYsODAQtrMpz_aks2qnXZLR2YSxLyL1ub-ZuQ3/s400/Slide6.GIF" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKnrL6FLOiK5qtJiNDKK7C-Tf4_dm9C1pn2z85YahUF28QrWP-_ZgiGbHyQp5Ic5h37d0NBSTXmZ5bfJHmpkFpxJ0DW_pOKYgOpTgCqt1sWkH1WzMcsdlPTexidCLLwXI83lAm-2YJV31H/s1600/Slide8.GIF" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKnrL6FLOiK5qtJiNDKK7C-Tf4_dm9C1pn2z85YahUF28QrWP-_ZgiGbHyQp5Ic5h37d0NBSTXmZ5bfJHmpkFpxJ0DW_pOKYgOpTgCqt1sWkH1WzMcsdlPTexidCLLwXI83lAm-2YJV31H/s400/Slide8.GIF" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAcDgBMueASGlFeOJDUf6b8mzm4erIYhwiFGETtJErmwewbKfCe41vbBGTECVCLN-lrk64Glraegb5OoYcrt5WqkAS95PbR7ulcF-lpyAxlBqKoBnnEFDkIrFRukjvAMg50x5pnDb_I3o3/s1600/Slide9.GIF" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAcDgBMueASGlFeOJDUf6b8mzm4erIYhwiFGETtJErmwewbKfCe41vbBGTECVCLN-lrk64Glraegb5OoYcrt5WqkAS95PbR7ulcF-lpyAxlBqKoBnnEFDkIrFRukjvAMg50x5pnDb_I3o3/s400/Slide9.GIF" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNx9wtUOi8Go7-lRi51DQOHSKiRWODdPue4GYLr66hglY97o5-QqlaqMzINhb7nxR9zeQhL_C3SHxSDG8H5YdN1ivz9MVyU7sBmltjaNR6T8KxhMmIhK4Xg8b7AuV-yMm-nnSE5T_JtVXX/s1600/Slide10.GIF" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNx9wtUOi8Go7-lRi51DQOHSKiRWODdPue4GYLr66hglY97o5-QqlaqMzINhb7nxR9zeQhL_C3SHxSDG8H5YdN1ivz9MVyU7sBmltjaNR6T8KxhMmIhK4Xg8b7AuV-yMm-nnSE5T_JtVXX/s400/Slide10.GIF" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv0oxGtKIMSKM_DMOJyk63pxruiMQkO6t81xq08BafoX3JaPD5sd25NaVmEX6mbu7LQBUMfsXbetGtJy_AIEStQP29JCjVVJjqd9UBjIS_WxwG1x7HN1m-pEv_ka6egLmFp0tASd72ncZg/s1600/Slide11.GIF" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv0oxGtKIMSKM_DMOJyk63pxruiMQkO6t81xq08BafoX3JaPD5sd25NaVmEX6mbu7LQBUMfsXbetGtJy_AIEStQP29JCjVVJjqd9UBjIS_WxwG1x7HN1m-pEv_ka6egLmFp0tASd72ncZg/s400/Slide11.GIF" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSz1vJ2RNrHAVclPVtZh8v3nMWI_LwBtlhE0yDa-oOVGK3yLIFx9jYWd5HVtMFU5PPF3wlXhr9XYjRNi-uTazh3rT7Q7EWYF9g_ItRpm1_CzInY4igoVyb5xi4qJw1dV3DpPbMxbZTfjx7/s1600/Slide12.GIF" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSz1vJ2RNrHAVclPVtZh8v3nMWI_LwBtlhE0yDa-oOVGK3yLIFx9jYWd5HVtMFU5PPF3wlXhr9XYjRNi-uTazh3rT7Q7EWYF9g_ItRpm1_CzInY4igoVyb5xi4qJw1dV3DpPbMxbZTfjx7/s400/Slide12.GIF" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsAfikAp2IvsNqJt0sK_A63oOVSq63mNkcZhNO8j0z25QKxaLbEMVY8wYnDdQHb6ffbgBqJpi4VeLhfz2mBK-THo9vf0FjOGvp2tC4Aze63Un7uTCMvy2wQtGKp9vtZPIhTYg1k8lthAVG/s1600/Slide13.GIF" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsAfikAp2IvsNqJt0sK_A63oOVSq63mNkcZhNO8j0z25QKxaLbEMVY8wYnDdQHb6ffbgBqJpi4VeLhfz2mBK-THo9vf0FjOGvp2tC4Aze63Un7uTCMvy2wQtGKp9vtZPIhTYg1k8lthAVG/s400/Slide13.GIF" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkVjZYVluxAJjmML931ON52faoO-Ak1QeRrGE7ngExtnXWFdcLN3D9xTcmyFKzxZwe7BQvfSOQXYuOil3yVv6aJVdQlJTQgrJXF5iiml4WRSbpl_nh-0-_0yU2hyWwF_IUQLeuvBduYsQY/s1600/Slide14.GIF" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkVjZYVluxAJjmML931ON52faoO-Ak1QeRrGE7ngExtnXWFdcLN3D9xTcmyFKzxZwe7BQvfSOQXYuOil3yVv6aJVdQlJTQgrJXF5iiml4WRSbpl_nh-0-_0yU2hyWwF_IUQLeuvBduYsQY/s320/Slide14.GIF" width="320" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The SIF is a great framework for providing SData:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span lang="EN-GB" style="color: #1f497d; font-family: Calibri, sans-serif; font-size: 11pt;"><a href="https://github.com/Sage/SIF">https://github.com/Sage/SIF</a></span></div>Jaretthttp://www.blogger.com/profile/07278460105911902002noreply@blogger.com4