SharePoint Business Data Catalog and Web Services



By Robert Houben CTO of FusionWare Corp. See end of article for his byline!

Date: January 30, 2008

SharePoint Business Data Catalog and Web Services

Table of Contents

SharePoint Business Data Catalog and Web Services. 1
Table of Contents. 2
1 Change Log. 3
2 Business Data Catalog (BDC) 4
2.1 Method Types. 4
2.1.1 Finder 4
2.1.2 SpecificFinder 4
2.1.3 IdEnumerator 5
2.1.4 ViewAccessor 5
2.1.5 Association. 5
3 BDC Application Definition/WSDL Requirements. 6
3.1 minOccurs/maxOccurs Issue. 6
3.2 One WSDL for all Methods. 6
3.3 One Application Definition for all Methods. 6
4 Debugging Tips. 7
4.1 Meaningful Error Messages. 7
4.2 Log File Locations. 7
4.3 Deploying Changes. 7
5 Merging WSDL From the Wizard. 8
6 Business Data Catalog Application Definition. 19

1 Change Log
Date
Who
Comments
October 16th 2007
R. Houben
Created.
November 14, 2007
R. Houben
Added more info based on Microsoft input.
January 30, 2008
R. Houben
Cleaned up for external publication.




2 Business Data Catalog (BDC)
Microsoft Office SharePoint Server (MOSS) 2007 is an incredibly powerful environment for building out a portal. Part of what makes it so powerful is a feature called the Business Data Catalog. This allows you to take data that can be accessed using ODBC, OLE DB or Web Services and have it participate in Search, Web Parts, and other aspects of the SharePoint environment.

BDC is dependent on the creation of a metadata record, called an Application Definition file, which is an XML file, to describe the data, how to access it, how it does security, etc… With the early versions of BDC, there was no tool for creating this, and the sample definition files, especially for Web Services, used examples for which no WSDL appears to be available, so that understanding how to create it for your own Web Services was difficult.

The latest version of the MOSS SDK includes a new tool called the Business Data Catalog Definition Editor. This tool makes the authoring of a definition for either relational data or Web Services much easier, but it only works if your WSDL “conforms” to certain requirements. These requirements and dependencies are not well documented, or the documentation has eluded my efforts to find it, so this document is my attempt to outline what these dependencies are, so that SharePoint developers can avoid the frustration of the pitfalls that I discovered.

These efforts were originally driven by our need to integrate BDC with Web Services exposed by our company’s product: The FusionWare Integration Server.
2.1 Method Types
BDC allows you to define the following method types. These are (partially, and mostly accurately) explained in this link:

http://msdn2.microsoft.com/en-us/library/ms519671.aspx
2.1.1 Finder
A Finder method is a special method that returns entity instances. Finder methods are static methods and do not take a key as an input parameter. Actually, they can. We needed to with the GetClaimLines method because we had to restrict it to the set of claimDetail rows that were for the master claim row.

If you do not define Finder methods, your entity cannot be used in a Business Data List Web Part.

To qualify for a Finder, the corresponding method must take filterable parameters as input and return collections of records, where each record must contain the key of the entity instance it represents.
2.1.2 SpecificFinder
A Specific Finder method is a special method that takes a key as input and returns exactly one entity instance.

If you do not define SpecificFinder methods, that entity cannot have actions on it, cannot be searched or indexed, and cannot be used in any of the Business Data features except the Related List Web Part.

To qualify as a SpecificFinder, the corresponding method must take the entity instance key as one of the input parameters and must return fields, of which one of the fields is the key.

Someone said:
“It is perceivable to have more than one specific finder because you may want to get to a specific record using different parameters, though I have not tried it myself. If it doesn't work then it is more an architectural design issue. You can always create one more entity and specify your additional specificfinder in there.”
2.1.3 IdEnumerator
An IdEnumerator method is a specialization of the Finder method that returns keys for entity instances.

There is no reason to have more than one IDEnumerator because its function is just to get all the unique records.
2.1.4 ViewAccessor
Someone said:
“I experimented and found that if I just copied the 'SpecificFinder' method and changed its type to 'ViewAccessor' then the method shows up in 'Business Data Item' web part. So in essence, ViewAccessor is just like SpecificFinder and as a result, an entity can have 1 SpecificFinder and 0 or many ViewAccessor(s) and therefore extending the power of an entity and that's good news.”

Somewhat explained within this article:

http://msdn2.microsoft.com/en-us/library/ms519671.aspx
2.1.5 Association
These are needed to link things together… The resulting output is actually stored at the top level of the application definition, since it uses data from multiple entities, although it is defined inside the specific method instance section in the BDC Application Defininition editor.

It turns out that the order in which things appear in the BDC definition file is important when importing into MOSS. The reason is that if you import an Association but the Entities it links have not both been already defined, it will fail. You must define the Association after all the related entities have been defined.

Order is important!

http://msdn2.microsoft.com/en-us/library/ms568144.aspx

3 BDC Application Definition/WSDL Requirements
3.1 minOccurs/maxOccurs Issue
Some WSDL creation tools create element definitions that include a maxOccurs=”unbounded” attribute but don’t create a minOccurs attribute. Most applications are OK with this, but it causes the BDC editor to fail to import the definition. It also causes problems with the latest version of Visual Studio Web Services. You should import the WSDL Definition and edit it so that if a maxOccurs attribute exists a minOccurs=”0” or minOccurs=”1” attribute is there, too.
3.2 One WSDL for all Methods
In order to be able to use multiple web services with the BDC, all services that you wish to expose in a manner that recognizes their relationships to one another must be in a single Application Definition file, and must also be defined in a single WSDL definition.

Microsoft Web Services are typically created around a class file and it is likely that all related methods are in a single class, so this may accidentally work when creating web services around well designed Microsoft class libraries. For other tools, it means you may need to merge the definitions that your tool creates into a single WSDL. We provide an example of a merged WSDL in section 5 below.

The other reason that this is important is that if you have multiple methods that share identifiers (foreign keys) you must use a single identifier (within an Entity) to define the key that links them. This only works if they all came from the same WSDL.
3.3 One Application Definition for all Methods
In our example, the claimid field is a key field (an identifier) that allows us to access all ClaimDetail rows for claim lines that are related to the claim row. In order for this to work, I had to add the claimid field as a filter parameter to the finder method for the ClaimLine entity so that the ClaimLine and Claim entities would share the key. For this to work, they had to be in the same application definition. To use methods and fields in an application definition, they must be in the same WSDL. That’s how SharePoint works. There is no mechanism to access methods from more than one WSDL.

4 Debugging Tips
4.1 Meaningful Error Messages
In order to facilitate debugging, and get even remotely useful error messages, go to the c:\inetpub\wwwroot\wss\VirtualDirectories directory and find all web.config files under it.

Edit these so that any line that starts:
<SafeMode MaxControls=”200” CallStack=”false” …

Change to: … CallStack=”true” …

Find the line that says <customerrors mode="”On”">
And set it to <customerrors mode="”Off”">

To find these files, I went to c:\inetpub\wwwroot\wss and ran this script:

for /r %f in (web.config) do @find “SafeMode” “%f”

This gave me a list of the files that I had to modify (there were 4). I probably only needed one, but I did them all, anyways…
4.2 Log File Locations
If the error message says to look at the server logs, these are located in the following path:

C:\Program Files\Common Files\Microsoft Share\web server extensions\12\LOGS

Sort the logs by date-time to find the one you need.

Search for the string “Metadata Exception” to find the actual error message text. There are usually several related lines. You will have to scroll right to see the text.
4.3 Deploying Changes
When you first deploy a changed BDC Application Definition, users trying to use it (including yourself) may encounter errors. With the above changes, these errors will indicate that an ID for the definition is not found. Go back and try the operation again. An old version is being cached somewhere.





5 Merging WSDL From the Wizard
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<wsdl:definitions
name="FW_ClaimSystem"
targetNamespace="http://fw-morpheus.fusionware.net/MOSS2007Demo/ClaimSystem"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdl_tns="http://fw-morpheus.fusionware.net/MOSS2007Demo/ClaimSystem"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/XMLSchema XMLSchema.xsd http://schemas.xmlsoap.org/wsdl/ wsdl.xsd">

<wsdl:documentation>Return claims-related data for Business Data Catalog and other applications.</wsdl:documentation>

<!--
This is where the content components of the soap bodies are defined
-->
<wsdl:types>
<!--
You can actually have more than one schema in here, but I like to keep it to one...
Warning, if you have a maxOccurs you MUST have a minOccurs or BDC Definition Editor
and BDC itself will both choke with odd error messages.

Merge these parts in from the wsdl generated by the WSDL Generated by your tool.
Remember to add minOccurs attributes wherever a maxOccurs happens.
-->
<xsd:schema elementFormDefault="qualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--
GetClaimIDs elements
-->
<xsd:element name="GetClaimIDs">
<xsd:complexType />
</xsd:element>
<xsd:element name="GetClaimIDsResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1"
minOccurs="0"
name="GetClaimIDsResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="unbounded"
minOccurs="0"
name="claimid"
nillable="true"
type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<!--
GetClaimForID elements
-->
<xsd:element name="GetClaimForID">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="claimid"
type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Result">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="claim">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="claimid"
type="xsd:string"/>
<xsd:element name="claimstatus"
type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<!--
GetClaims elements
-->
<xsd:element name="GetClaims">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="claimstatus"
type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="GetClaimsResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="GetClaimsResult"
maxOccurs="unbounded"
minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="claimid"
type="xsd:string"/>
<xsd:element name="claimstatus"
type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<!--
GetClaimLines elements
-->
<xsd:element name="GetClaimLines">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="claimid"
type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="GetClaimLinesResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="GetClaimLinesResult"
minOccurs="0"
maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="claimid"
type="xsd:string"/>
<xsd:element name="claimline"
type="xsd:int"/>
<xsd:element name="status"
type="xsd:string"/>
<xsd:element name="amountpaid"
type="xsd:decimal"/>
<xsd:element name="deductible"
type="xsd:decimal"/>
<xsd:element name="copay"
type="xsd:decimal"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<!--
GetClaimLineIDs elements
-->
<xsd:element name="GetClaimLineIDs">
<xsd:complexType />
</xsd:element>
<xsd:element name="GetClaimLineIDsResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="GetClaimLineIDsResult"
minOccurs="0"
maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="claimid"
type="xsd:string"/>
<xsd:element name="claimline"
type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<!--
GetClaimLineForID elements
-->
<xsd:element name="GetClaimLineForID">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="claimid" type="xsd:string"/>
<xsd:element name="claimline" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="GetClaimLineForIDResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="GetClaimLineForIDResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="claimid" type="xsd:string"/>
<xsd:element name="claimline" type="xsd:int"/>
<xsd:element name="status" type="xsd:string"/>
<xsd:element name="amountpaid" type="xsd:decimal"/>
<xsd:element name="deductible" type="xsd:decimal"/>
<xsd:element name="copay" type="xsd:decimal"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<!--
GETClaimStatuses elements
-->
<xsd:element name="GetClaimStatuses">
<xsd:complexType/>
</xsd:element>
<xsd:element name="GetClaimStatusesResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="GetClaimStatusesResult" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="claimstatus" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>

<!--
Merge these parts in from the wsdl generated by your tool.
-->
<wsdl:message name="GetClaimIDsSoapIn">
<wsdl:part element="GetClaimIDs"
name="parameters"/>
</wsdl:message>
<wsdl:message name="GetClaimIDsSoapOut">
<wsdl:part element="GetClaimIDsResponse"
name="parameters"/>
</wsdl:message>

<wsdl:message name="GetClaimForIDSoapIn">
<wsdl:part element="GetClaimForID"
name="parameters"/>
</wsdl:message>
<wsdl:message name="GetClaimForIDSoapOut">
<wsdl:part element="Result"
name="parameters"/>
</wsdl:message>

<wsdl:message name="GetClaimsSoapIn">
<wsdl:part name="parameters"
element="GetClaims"/>
</wsdl:message>
<wsdl:message name="GetClaimsSoapOut">
<wsdl:part name="parameters"
element="GetClaimsResponse"/>
</wsdl:message>

<wsdl:message name="GetClaimLinesSoapIn">
<wsdl:part name="parameters" element="GetClaimLines"/>
</wsdl:message>
<wsdl:message name="GetClaimLinesSoapOut">
<wsdl:part name="parameters" element="GetClaimLinesResponse"/>
</wsdl:message>

<wsdl:message name="GetClaimLineIDsSoapIn">
<wsdl:part name="parameters" element="GetClaimLineIDs"/>
</wsdl:message>
<wsdl:message name="GetClaimLineIDsSoapOut">
<wsdl:part name="parameters" element="GetClaimLineIDsResponse"/>
</wsdl:message>

<wsdl:message name="GetClaimLineForIDSoapIn">
<wsdl:part name="parameters" element="GetClaimLineForID"/>
</wsdl:message>
<wsdl:message name="GetClaimLineForIDSoapOut">
<wsdl:part name="parameters" element="GetClaimLineForIDResponse"/>
</wsdl:message>

<wsdl:message name="GetClaimStatusesSoapIn">
<wsdl:part name="parameters" element="GetClaimStatuses"/>
</wsdl:message>
<wsdl:message name="GetClaimStatusesSoapOut">
<wsdl:part name="parameters" element="GetClaimStatusesResponse"/>
</wsdl:message>

<!--
This is a genericized version of the portType element - don't touch it. You will merge
operation elements into it from your tool's generated WSDL.
-->
<wsdl:portType name="Claim">
<!--
Merge these parts in from the wsdl generated by your WSDL generation tool.
-->
<wsdl:operation name="GetClaimIDs">
<wsdl:input message="wsdl_tns:GetClaimIDsSoapIn"/>
<wsdl:output message="wsdl_tns:GetClaimIDsSoapOut"/>
</wsdl:operation>

<wsdl:operation name="GetClaimForID">
<wsdl:input message="wsdl_tns:GetClaimForIDSoapIn"/>
<wsdl:output message="wsdl_tns:GetClaimForIDSoapOut"/>
</wsdl:operation>

<wsdl:operation name="GetClaims">
<wsdl:input message="wsdl_tns:GetClaimsSoapIn"/>
<wsdl:output message="wsdl_tns:GetClaimsSoapOut"/>
</wsdl:operation>

<wsdl:operation name="GetClaimLines">
<wsdl:input message="wsdl_tns:GetClaimLinesSoapIn"/>
<wsdl:output message="wsdl_tns:GetClaimLinesSoapOut"/>
</wsdl:operation>

<wsdl:operation name="GetClaimLineIDs">
<wsdl:input message="wsdl_tns:GetClaimLineIDsSoapIn"/>
<wsdl:output message="wsdl_tns:GetClaimLineIDsSoapOut"/>
</wsdl:operation>

<wsdl:operation name="GetClaimLineForID">
<wsdl:input message="wsdl_tns:GetClaimLineForIDSoapIn"/>
<wsdl:output message="wsdl_tns:GetClaimLineForIDSoapOut"/>
</wsdl:operation>

<wsdl:operation name="GetClaimStatuses">
<wsdl:input message="wsdl_tns:GetClaimStatusesSoapIn"/>
<wsdl:output message="wsdl_tns:GetClaimStatusesSoapOut"/>
</wsdl:operation>
</wsdl:portType>

<!--
This is a genericized version of the binding element - don't touch it. You will merge
soap:operation elements in from your WSDL.
-->
<wsdl:binding name="ClaimSoapHTTPBinding"
type="wsdl_tns:Claim">
<!--
This indicates that the operations are bound using SOAP 1.1
-->
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>

<!--
Merge these parts in from the wsdl generated by your WSDL generation tool.
-->
<wsdl:operation name="GetClaimForID">
<soap:operation
soapAction="http://fw-morpheus.fusionware.net/MOSS2007Demo/ClaimSystem/GetClaimForID"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>

<wsdl:operation name="GetClaimIDs">
<soap:operation
soapAction="http://fw-morpheus.fusionware.net/MOSS2007Demo/ClaimSystem/GetClaimIDs"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>

<wsdl:operation name="GetClaims">
<soap:operation
soapAction="http://fw-morpheus.fusionware.net/MOSS2007Demo/ClaimSystem/GetClaims"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>

<wsdl:operation name="GetClaimLines">
<soap:operation
soapAction="http://fw-morpheus.fusionware.net/MOSS2007Demo/ClaimSystem/GetClaimLines"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>

<wsdl:operation name="GetClaimLineIDs">
<soap:operation
soapAction="http://fw-morpheus.fusionware.net/MOSS2007Demo/ClaimSystem/GetClaimLineIDs"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>

<wsdl:operation name="GetClaimLineForID">
<soap:operation
soapAction="http://fw-morpheus.fusionware.net/MOSS2007Demo/ClaimSystem/GetClaimLineForID"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>

<wsdl:operation name="GetClaimStatuses">
<soap:operation
soapAction="http://fw-morpheus.fusionware.net/MOSS2007Demo/ClaimSystem/GetClaimStatuses"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>

<!--
This is the service definition with its bindings. We've genericized this so that it
can be reused as we merge multiple operations and portTypes in.
-->
<wsdl:service name="ClaimService">
<wsdl:port binding="wsdl_tns:ClaimSoapHTTPBinding"
name="Claim">
<soap:address
location="http://fw-morpheus.fusionware.net:10080/ClaimService"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

6 Business Data Catalog Application Definition
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<LobSystem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.microsoft.com/office/2006/03/BusinessDataCatalog BDCMetadata.xsd" Type="WebService" Version="1.0.0.21" Name="FWClaimService" xmlns="http://schemas.microsoft.com/office/2006/03/BusinessDataCatalog">
<Properties>
<Property Name="WsdlFetchUrl" Type="System.String">http://fw-morpheus.fusionware.net:10080/wsdl/wsdlfiles/ClaimSystem.wsdl</Property>
<Property Name="WebServiceProxyNamespace" Type="System.String">BDC</Property>
<Property Name="WildcardCharacter" Type="System.String"></Property>
</Properties>
<LobSystemInstances>
<LobSystemInstance Name="FWClaimService_Instance">
<Properties>
<Property Name="LobSystemName" Type="System.String">FWClaimService</Property>
<Property Name="WebServiceAuthenticationMode" Type="Microsoft.Office.Server.ApplicationRegistry.SystemSpecific.WebService.HttpAuthenticationMode">PassThrough</Property>
</Properties>
</LobSystemInstance>
</LobSystemInstances>
<Entities>
<Entity EstimatedInstanceCount="10000" Name="ClaimStatuses">
<Identifiers>
<Identifier TypeName="System.String" Name="claimstatus" />
</Identifiers>
<Methods>
<Method Name="GetClaimStatuses">
<Parameters>
<Parameter Direction="Return" Name="Return">
<TypeDescriptor TypeName="BDC.GetClaimStatusesResponseGetClaimStatusesResult[],FWClaimService" IsCollection="true" Name="Return">
<TypeDescriptors>
<TypeDescriptor TypeName="BDC.GetClaimStatusesResponseGetClaimStatusesResult,FWClaimService" Name="Item">
<TypeDescriptors>
<TypeDescriptor TypeName="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IdentifierName="claimstatus" Name="claimstatus" />
</TypeDescriptors>
</TypeDescriptor>
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
</Parameters>
<MethodInstances>
<MethodInstance Type="Finder" ReturnParameterName="Return" ReturnTypeDescriptorName="Return" ReturnTypeDescriptorLevel="0" Name="GetClaimStatuses" />
</MethodInstances>
</Method>
</Methods>
</Entity>
<Entity EstimatedInstanceCount="10000" Name="Claim">
<Identifiers>
<Identifier TypeName="System.String" Name="claimid" />
</Identifiers>
<Methods>
<Method Name="GetClaimIDs">
<Parameters>
<Parameter Direction="Return" Name="Return">
<TypeDescriptor TypeName="System.String[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IsCollection="true" Name="Return">
<TypeDescriptors>
<TypeDescriptor TypeName="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IdentifierName="claimid" Name="Item" />
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
</Parameters>
<MethodInstances>
<MethodInstance Type="IdEnumerator" ReturnParameterName="Return" ReturnTypeDescriptorName="Return" ReturnTypeDescriptorLevel="0" Name="GetClaimIDs" />
</MethodInstances>
</Method>
<Method Name="GetClaimForID">
<FilterDescriptors>
<FilterDescriptor Type="Wildcard" Name="FilterClaimByID" />
</FilterDescriptors>
<Parameters>
<Parameter Direction="In" Name="claimid">
<TypeDescriptor TypeName="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IdentifierName="claimid" Name="claimid" />
</Parameter>
<Parameter Direction="Return" Name="Return">
<TypeDescriptor TypeName="BDC.ResultClaim,FWClaimService" Name="Return">
<TypeDescriptors>
<TypeDescriptor TypeName="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IdentifierName="claimid" Name="claimid" />
<TypeDescriptor TypeName="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="claimstatus" />
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
</Parameters>
<MethodInstances>
<MethodInstance Type="SpecificFinder" ReturnParameterName="Return" ReturnTypeDescriptorName="Return" ReturnTypeDescriptorLevel="0" Name="GetClaimForID" />
</MethodInstances>
</Method>
<Method Name="GetClaims">
<Parameters>
<Parameter Direction="In" Name="claimstatus">
<TypeDescriptor TypeName="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IdentifierEntityName="ClaimStatuses" IdentifierName="claimstatus" Name="claimstatus" />
</Parameter>
<Parameter Direction="Return" Name="Return">
<TypeDescriptor TypeName="BDC.GetClaimsResponseGetClaimsResult[],FWClaimService" IsCollection="true" Name="Return">
<TypeDescriptors>
<TypeDescriptor TypeName="BDC.GetClaimsResponseGetClaimsResult,FWClaimService" Name="Item">
<TypeDescriptors>
<TypeDescriptor TypeName="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IdentifierName="claimid" Name="claimid" />
<TypeDescriptor TypeName="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IdentifierEntityName="ClaimStatuses" IdentifierName="claimstatus" Name="claimstatus" />
</TypeDescriptors>
</TypeDescriptor>
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
</Parameters>
<MethodInstances>
<MethodInstance Type="Finder" ReturnParameterName="Return" ReturnTypeDescriptorName="Return" ReturnTypeDescriptorLevel="0" Name="GetClaims" />
</MethodInstances>
</Method>
</Methods>
</Entity>
<Entity EstimatedInstanceCount="10000" Name="ClaimLine">
<Identifiers>
<Identifier TypeName="System.String" Name="claimid" />
<Identifier TypeName="System.Int32" Name="claimline" />
</Identifiers>
<Methods>
<Method Name="GetClaimLineIDs">
<Parameters>
<Parameter Direction="Return" Name="Return">
<TypeDescriptor TypeName="BDC.GetClaimLineIDsResponseGetClaimLineIDsResult[],FWClaimService" IsCollection="true" Name="Return">
<TypeDescriptors>
<TypeDescriptor TypeName="BDC.GetClaimLineIDsResponseGetClaimLineIDsResult,FWClaimService" Name="Item">
<TypeDescriptors>
<TypeDescriptor TypeName="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IdentifierName="claimid" Name="claimid" />
<TypeDescriptor TypeName="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IdentifierName="claimline" Name="claimline" />
</TypeDescriptors>
</TypeDescriptor>
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
</Parameters>
<MethodInstances>
<MethodInstance Type="IdEnumerator" ReturnParameterName="Return" ReturnTypeDescriptorName="Return" ReturnTypeDescriptorLevel="0" Name="GetClaimLineIDs" />
</MethodInstances>
</Method>
<Method Name="GetClaimLineForID">
<FilterDescriptors>
<FilterDescriptor Type="Comparison" Name="FilterClaimLineByID">
<Properties>
<Property Name="Comparator" Type="System.String">Equals</Property>
</Properties>
</FilterDescriptor>
</FilterDescriptors>
<Parameters>
<Parameter Direction="In" Name="claimid">
<TypeDescriptor TypeName="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IdentifierName="claimid" Name="claimid" />
</Parameter>
<Parameter Direction="In" Name="claimline">
<TypeDescriptor TypeName="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IdentifierName="claimline" Name="claimline" />
</Parameter>
<Parameter Direction="Return" Name="Return">
<TypeDescriptor TypeName="BDC.GetClaimLineForIDResponseGetClaimLineForIDResult,FWClaimService" Name="Return">
<TypeDescriptors>
<TypeDescriptor TypeName="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IdentifierName="claimid" Name="claimid" />
<TypeDescriptor TypeName="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IdentifierName="claimline" Name="claimline" />
<TypeDescriptor TypeName="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="status" />
<TypeDescriptor TypeName="System.Decimal, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="amountpaid" />
<TypeDescriptor TypeName="System.Decimal, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="deductible" />
<TypeDescriptor TypeName="System.Decimal, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="copay" />
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
</Parameters>
<MethodInstances>
<MethodInstance Type="SpecificFinder" ReturnParameterName="Return" ReturnTypeDescriptorName="Return" ReturnTypeDescriptorLevel="0" Name="GetClaimLineForID" />
</MethodInstances>
</Method>
<Method Name="GetClaimLines">
<Parameters>
<Parameter Direction="In" Name="claimid">
<TypeDescriptor TypeName="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IdentifierEntityName="Claim" IdentifierName="claimid" Name="claimid" />
</Parameter>
<Parameter Direction="Return" Name="Return">
<TypeDescriptor TypeName="BDC.GetClaimLinesResponseGetClaimLinesResult[],FWClaimService" IsCollection="true" Name="Return">
<TypeDescriptors>
<TypeDescriptor TypeName="BDC.GetClaimLinesResponseGetClaimLinesResult,FWClaimService" Name="Item">
<TypeDescriptors>
<TypeDescriptor TypeName="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IdentifierName="claimid" Name="claimid" />
<TypeDescriptor TypeName="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IdentifierName="claimline" Name="claimline" />
<TypeDescriptor TypeName="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="status" />
<TypeDescriptor TypeName="System.Decimal, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="amountpaid" />
<TypeDescriptor TypeName="System.Decimal, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="deductible" />
<TypeDescriptor TypeName="System.Decimal, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="copay" />
</TypeDescriptors>
</TypeDescriptor>
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
</Parameters>
<MethodInstances>
<MethodInstance Type="Finder" ReturnParameterName="Return" ReturnTypeDescriptorName="Return" ReturnTypeDescriptorLevel="0" Name="GetClaimLines" />
</MethodInstances>
</Method>
</Methods>
</Entity>
</Entities>
<Associations>
<Association Name="AssociateClaimToClaimStatuses" AssociationMethodEntityName="Claim" AssociationMethodName="GetClaims" AssociationMethodReturnParameterName="Return" AssociationMethodReturnTypeDescriptorName="Return" AssociationMethodReturnTypeDescriptorLevel="0" IsCached="true">
<SourceEntity Name="ClaimStatuses" />
<DestinationEntity Name="Claim" />
</Association>
<Association Name="AssociateClaimLineToClaim" AssociationMethodEntityName="ClaimLine" AssociationMethodName="GetClaimLines" AssociationMethodReturnParameterName="Return" AssociationMethodReturnTypeDescriptorName="Return" AssociationMethodReturnTypeDescriptorLevel="0" IsCached="true">
<SourceEntity Name="Claim" />
<DestinationEntity Name="ClaimLine" />
</Association>
</Associations>
</LobSystem>




Robert Houben is CTO of FusionWare and the chief architect for its products. His 20 years of expertise working with technology-driven companies includes an in-depth knowledge of middleware and applications, database technologies and Web services. Robert was a key driving force in the development of the ODBC standards in1992 and actively participates in the promotion of open standards technologies. Robert has authored a number of patent filings for the FusionWare Integration Server and has published numerous articles related to database technologies and legacy integration solutions.

Comments

Popular posts from this blog

Robocopy Error 31 A device attached to the system is not functioning

"The following factors also affect the level of access for" user with excess permissions

Unknown server tag 'AdminControls:MigrationToolPromotionTip'. in Central Admin after installing SharePoint 2013 security update KB4482464