0

VB.net を使用して Windows フォーム アプリケーションを設計しています。アプリケーションが特定の SharePoint リストの行数を返すようにしようとしています。ndQuery.InnerXml コードを削除すると、すべてが完全に機能します。ただし、カウントを取得する前にリストをフィルター処理したいと考えています。フィルタリングしたい 2 つの列は、「Assigned Employee」と「status」です。ここでスタック ( GetListItems Web サービスを呼び出す SharePoint SoapServerException ) に関するさまざまな投稿を見ましたが、私の例外はクエリに関連しています。soapserverException の詳細は次のとおりです。「1 つ以上のフィールド タイプが正しくインストールされていません。リスト設定ページに移動して、これらのフィールドを削除してください: 0x81020014。」

関係ページにアクセスしようとしましたが、参照できませんでした:

(url)/Relationships%20List/allitems.aspx

クエリ コードに問題がある人はいますか?

Imports System
Imports System.IO
Imports System.Net
Imports System.Xml
Imports <xmlns="rs">
Public Class Form1

Dim i As Integer

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim listService As New getListItems.Lists
    listService.Credentials = CredentialCache.DefaultCredentials
    listService.Url = "http://(servername)/_vti_bin/Lists.asmx"
    Dim xmlDoc = New System.Xml.XmlDocument()

    Dim ndQuery As XmlNode =
    xmlDoc.CreateNode(XmlNodeType.Element, "Query", "")
    Dim ndViewFields As XmlNode =
        xmlDoc.CreateNode(XmlNodeType.Element, "ViewFields", "")
    Dim ndQueryOptions As XmlNode =
        xmlDoc.CreateNode(XmlNodeType.Element, "QueryOptions", "")

    ndQueryOptions.InnerXml =
        "<IncludeMandatoryColumns>FALSE</IncludeMandatoryColumns>"
    ndViewFields.InnerXml = "<FieldRef Name='Assigned Employee'/><FieldRef Name='Status'/>"
    ndQuery.InnerXml = "<Where><And><Contains><FieldRef Name ='Assigned Employee'/><Value Type='Text'>Engineer</Value></Contains><Contains><FieldRef Name='Status'/><Value Type='Text'>New</Value></Contains></And></Where>"

    Try

        Dim ndListItems As XmlNode =
                listService.GetListItems("Requests", Nothing, ndQuery, _
                ndViewFields, Nothing, ndQueryOptions, Nothing)

        Dim n1 As XmlNode = ndListItems.Item("rs:data")
        Dim a As String = n1.Attributes("ItemCount").InnerText

        'Attempted For each loop, but not needed:
        'Dim listItemCount As String
        'Dim innerXML = New System.Xml.XmlDocument
        'innerXML.LoadXml(ndListItems.InnerXml)
        'Dim rows As XmlNodeList = innerXML.GetElementsByTagName("rs:data")

        'For Each (XmlNode Attribute In rows)
        'Next


        Label1.Text = a

    Catch ex As System.Web.Services.Protocols.SoapException

        Label1.Text = ("Message:" + ControlChars.Lf + ex.Message +
            ControlChars.Lf +
        "Detail:" + ControlChars.Lf + ex.Detail.InnerText +
            ControlChars.Lf +
        "StackTrace:" + ControlChars.Lf + ex.StackTrace)

    End Try
End Sub
End Class
4

3 に答える 3

1

_x0020_フィールド名のスペースを次のように置き換える必要がある場合があります。

<FieldRef Name='Assigned_x0020_Employee'/>

Name属性はフィールドの内部名を取得するため、それが使用しているものであることを再確認してください。

于 2012-08-02T12:37:49.460 に答える
0

過去に「1つ以上のフィールドタイプが正しくインストールされていません」という楽しいエラーに遭遇したとき、それは通常、フィールドが特定のタイプではないのに特定のタイプであることを示すCAML WHERE基準が原因でした(たとえば、Value type =実際にルックアップである場合の「テキスト」)。

U2UからCAMLQueryBuilder(無料)を入手した場合は、(SharePointの組み込みWebサービスを使用して)サイトにポイントし、ドラッグアンドドロップデザイナーを使用してCAMLクエリを作成できます。そこでクエリを機能させたら、[編集]タブをクリックするだけで、SharePointが期待する正確なCAMLが表示されます。私の推測では、フィールドタイプが正しく設定されていないことがわかります。インストール後、プロセス全体で約10分かかります。

于 2012-08-01T19:36:38.680 に答える
0

クエリステートメントを 2 つの部分に分割したときに問題を発見しました。

'ndQuery.InnerXml = "<Where><Eq><FieldRef Name ='Assigned_x0020_Employee'/><Value Type='Text'>Engineer</Value></Eq></Where>"
'ndQuery.InnerXml = "<Where><Eq><FieldRef Name ='Status'/><Value Type='Text'>New</Value></Eq></Where>"

SP リストの列の 1 つに「Assigned Employee」という名前が付けられていましたが、実際の FieldRef Name は単に従業員であることがわかりました。それを含めるようにコードを変更すると、エラーはなくなりました。FieldRef Name を見るのではなく、Value Type を変更することに時間を費やしていました。

最終的な結論: 「1 つ以上のフィールド タイプが正しくインストールされていません」というエラーは、「値のタイプ」が正しくない場合だけでなく、「FieldRef 名」に間違ったラベルが含まれている場合にも返されます。

最終的な作業コード行:

ndQuery.InnerXml = "<Where><And><Eq><FieldRef Name ='Employee'/><Value Type='Text'>Engineer</Value></Eq><Eq><FieldRef Name='Request_x0020_Status'/><Value Type ='Text'>New</Value></Eq></And></Where>"
于 2012-08-03T15:24:36.747 に答える