搭配使用 SharePoint 與 Siebel 配接器時的考量
本主題包含使用 Microsoft BizTalk Adapter for Siebel eBusiness Applications 與 Microsoft Office SharePoint Server 時可能會遇到之問題的相關資訊,以及解決方法。 問題分為兩類:
一般問題
與自訂網頁元件相關的問題
一般問題
本節包含沒有解析的問題,或要求您修改解析的應用程式定義檔。
問題 1:不會顯示 WCF 服務傳回的簡單類型資料
說明:Microsoft Office SharePoint Server 預期 WCF 服務傳回的資料只有 DataSet 或集合類型。 如果 WCF 服務傳回的資料是簡單類型,Microsoft Office SharePoint Server 就不會顯示資料。
解決方案:沒有解析度。 這是 Microsoft Office SharePoint Server 的已知限制。
問題 2:如果 WCF 服務傳回的資料是 Null,就會顯示錯誤訊息
說明:如果 WCF 服務傳回的資料是 Null 值,Microsoft Office SharePoint Server 會顯示錯誤訊息。 例如,假設您是針對 Finder 方法實例使用商務資料清單網頁元件,並根據搜尋運算式搜尋 Siebel 系統中的客戶。 您指定的搜尋運算式會擷取 Null 值。 在此情況下,Microsoft Office SharePoint Server 會顯示錯誤訊息。
解決方案:沒有解析度。 這是 Microsoft Office SharePoint Server 的已知限制。
問題 3:不會顯示 WCF 服務所傳回之簡單類型的陣列
說明:如果 WCF 服務傳回的資料是簡單類型的陣列,Microsoft Office SharePoint Server 就不會顯示資料。 此外,當您在 Business 資料目錄 定義編輯器中執行傳回簡單類型陣列的方法實例時,會顯示下列錯誤訊息:「後端網路介面卡傳回的結構與對應的中繼資料不相容 (MethodInstance、Parameter 或 TypeDescriptor) 」。
解決方案:沒有解析度。 這是 Microsoft Office SharePoint Server 和 Business 資料目錄定義編輯器的已知限制。
問題 4:無法匯入包含複雜類型參數超過 300 個欄位的應用程式定義檔
說明:Microsoft Office SharePoint Server 無法匯入 WCF 服務所傳回複雜類型參數中超過 300 個欄位的應用程式定義檔,如果您嘗試這麼做,就會顯示錯誤訊息。 這是因為 Microsoft Office SharePoint Server 無法顯示複雜類型參數超過 300 個欄位的限制。
解決方案:使用商務資料目錄定義編輯器,將複雜類型參數的欄位數目限制為小於或等於 300。 視您的需求而定,您可以在商務資料目錄定義編輯器中刪除複雜類型參數的欄位,而不需要顯示在 Microsoft Office SharePoint Server 中。 或者,您也可以使用所有欄位從 Business 資料目錄 定義編輯器匯出應用程式定義檔,然後在記事本或任何 XML 撰寫應用程式中修改應用程式定義檔,以刪除不需要的欄位,以將欄位數目限制為 300。
與自訂網頁元件相關的問題
本節包含需要使用自訂網頁元件進行解決的問題。 如需使用自訂網頁元件來解決使用 Siebel 配接器和 Microsoft Office SharePoint Server 時可能發生的問題的詳細資訊,請參閱 搭配 Siebel 配接器使用自訂網頁元件。
問題 1:顯示列舉值的索引,而不是列舉資料類型的值
說明:如果 Microsoft Office SharePoint Server 中的商務資料清單或商務資料項目網頁元件包含列舉類型的資料, (由一組稱為列舉值的具名常數所組成,) ,則會在 Microsoft Office SharePoint Server 中顯示列舉值的索引,而不是其值。 這是因為商務資料清單和商務資料項目 Web 元件不正確地將列舉類型資料的值列印到 SharePoint 入口網站。
解決方案:使用自訂網頁元件列印列舉值,而不是索引。 如需使用自訂網頁元件的詳細資訊,請參閱 搭配 Siebel 配接器使用自訂網頁元件。 例如,您可以在網頁元件中使用下列程式碼範例,在 Microsoft Office SharePoint Server 上列印列舉類型資料的正確值。
namespace CustomWebpart
{
public class CustomWebPart : WebPart
{
private string displayText = "Hello World!";
[WebBrowsable(true), Personalizable(true)]
public string DisplayText
{
get { return displayText; }
set { displayText = value; }
}
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
string SearchExpr = "[Address Name] LIKE \"*\"";
object ElementType = null;
/***Step 1: Get the required entity and method.***/
LobSystem newSystem = ApplicationRegistry.GetLobSystems()["WebServiceLobSystem"]; // Name specified in application definition file
LobSystemInstance newSystemInstance = newSystem.GetLobSystemInstances()["Siebel_Instance"]; // Name specified in application definition file
Entity CategoryEntity = newSystem.GetEntities()["Siebel_Method_Name"]; // Name specified in application definition file
Method newMethod = CategoryEntity.GetMethods()["Query"]; // Name specified in application definition file
MethodInstance methodInstance = newMethod.GetMethodInstances()["MethodInstance0"]; // Name specified in application definition file
/***Step 2: Get the list of input parameters.***/
Object[] args = methodInstance.GetMethod().CreateDefaultParameterInstances(methodInstance); // Get default value of the input parameter
Object[] ArgsInput = new Object[args.Length];
/***Step 3: Assign them required values.***/
//Assigning values to a complex type parameter. Index of this parameter is 3rd in args array.
/*** Complex Type Parameter is defined as follows:
<Parameter Direction="In" Name="BusinessAddressQueryInputRecord">
<TypeDescriptor TypeName="BDC.BusinessAddressQueryInputRecord,WebServiceLobSystem" Name="BusinessAddressQueryInputRecord">
<TypeDescriptors>
<TypeDescriptor TypeName="System.String, ...." Name="SearchExpr"></TypeDescriptor>
<TypeDescriptor TypeName="System.String, ...." Name="SortSpec"></TypeDescriptor>
<TypeDescriptor TypeName="System.String[], ...." IsCollection="true" Name="QueryFields"></TypeDescriptor>
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
* We are assigning value to Parameter SearchExpr. ***/
Assembly asm = Assembly.GetAssembly(args[2].GetType());
Type t = asm.GetType(args[2].GetType().ToString()); // Get type of the parameter
FieldInfo[] FI = t.GetFields();
ElementType = Activator.CreateInstance(t);
ElementType.GetType().GetFields()[0].SetValue(ElementType, (Object)SearchExpr);
ArgsInput[2] = ElementType; // ArgsInput is fed as input while executing Method Instance.
/***Step 4: Execute the particular method instance using the required value.***/
IEntityInstanceEnumerator prodEntityInstanceEnumerator = (IEntityInstanceEnumerator)CategoryEntity.Execute(methodInstance, newSystemInstance, ref ArgsInput); //Method instance of type Finder is being used here.
/***Step 5: Display the output on the custom Web Part in Microsoft Office SharePoint Server.***/
writer.Write("<table>");
while (prodEntityInstanceEnumerator.MoveNext())
{
IEntityInstance IE = prodEntityInstanceEnumerator.Current;
writer.Write("<tr>");
foreach (Field f in CategoryEntity.GetFinderView().Fields)
{
writer.Write("<td>");
writer.Write(IE[f]);
writer.Write("</td>");
}
writer.Write("</tr>");
}
writer.Write("</table>");
}
}
}
問題 2:無法指定陣列元素的值
說明:如果 WCF 服務的輸入參數是陣列,您無法使用使用 Business 資料目錄 定義編輯器所建立之應用程式定義檔中定義的篩選來指定陣列元素的值。 這表示您無法在 Microsoft Office SharePoint Server 中使用商務資料清單或商務資料項目網頁元件來指定這些輸入參數的值, (陣列) 至 WCF 服務的專案。 這是因為陣列在應用程式定義檔中定義的方式。
解決方案:使用自訂網頁元件將值指派給陣列元素。 如需使用自訂網頁元件的詳細資訊,請參閱 搭配 Siebel 配接器使用自訂網頁元件。 例如,您可以在「問題 1:列舉值的索引」的步驟 3 中使用下列程式碼範例,而不是列舉資料類型的值,將值指派給陣列元素。
/***Assign required values to parameters of type array.***/
/***Assumption is that the ith parameter of Method is of type Array and all the simple type elements in the array are of type string***/
Type t = asm.GetType(args[i].GetType().ToString()); // Get type of the parameter
Type TElement = t.GetElementType(); // Getting type of element of array
int index = 5; //Size of Array
Array ElementArray = Array.CreateInstance(TElement, index); //Creating an array of length: index
for (int ind = 0; ind < index; ind++)
{
//Creating an instance of an element of array
object ElementType = Activator.CreateInstance(TElement);
FieldInfo[] FI = ElementType.GetType().GetFields();
for (int f = 0; f \< FI.Length; f++)
{
ElementType.GetType().GetFields()[f].SetValue(ElementType, (Object)"ElementValue");
}
ElementArray.SetValue(ElementType, ind);
}
ArgsInput[i] = (object)ElementArray; // As shown in sample, ArgsInput is fed as input while executing Method Instance
問題 3:對複雜類型參數指定 Null 值的限制
說明:如果您未為 Microsoft Office SharePoint Server 網頁元件中的複雜類型參數指定任何值,則 Null 應該以複雜類型參數的值傳遞至 WCF 服務。 不過,會針對複雜類型參數傳遞非 Null 值,而 Null 會針對其子專案傳遞 (簡單類型) 。 這會導致預期訊息架構與傳遞至 WCF 服務的訊息架構不符。 因此,Siebel 配接器可能會顯示錯誤訊息。
注意
若要在 Microsoft Office SharePoint Server 中的網頁元件未傳遞任何值時找出複雜類型參數的預設值,請使用「問題 1:列舉值索引會顯示,而不是列舉資料類型的值」中所述的程式碼範例中的步驟 2。
解決方式:當 Microsoft Office SharePoint Server 中的網頁元件未指定任何值時,使用自訂網頁元件將 Null 值指派給複雜類型參數。 如需使用自訂網頁元件的詳細資訊,請參閱 搭配 Siebel 配接器使用自訂網頁元件。
問題 4:根據多個值在 Microsoft Office SharePoint Server 中顯示單一記錄的限制
說明:如果您想要根據 Siebel 系統中 (輸入參數) 多個值,在 Microsoft Office SharePoint Server 中顯示單一記錄,則無法在教學課程 1: 建立 SharePoint 應用程式以從 Siebel 擷取資料 時,無法使用三個 Web 元件 (商務資料清單、商務資料項目和商務資料相關清單) : 在 SharePoint 網站上呈現 Siebel 系統的資料。
解決方案:您必須使用自訂網頁元件來執行此動作。 如需使用自訂網頁元件的詳細資訊,請參閱 搭配 Siebel 配接器使用自訂網頁元件。 例如,在「問題 1:顯示列舉值索引而非列舉資料類型的值」的步驟 3 中,您可以修改程式碼以提供多個參數的值,而不是提供單一商務元件參數的輸入。