4

SharePoint 2010 のリスト Web サービス UpdateList が「存在しなくなったオブジェクトを使用しようとしました」で失敗しますが、実際には存在します。

既存のフィールドの属性を更新したいと考えています。デモンストレーションの目的で、Description を簡単に更新できる必要があります。haufe.sharepoint 0.1.9 を使用して拡張すると、アイテムのクエリ/更新とフィールドの削除を行うことができます。更新および削除中に変更が観察されたため、リストに正しく対処していると確信しています。a) フィールドは削除可能であり、b) 「名前」または「ID」を変更すると、エラーは「その名前のフィールドが見つかりませんでした」に変わるため、フィールドも正確に対処されていると思います。

SUDS から SOAP メッセージをダンプすると、さまざまなメッセージと結果を表示できます。以下に 3 つのテスト ケースを示します。1つ目は失敗です。2 つ目は、名前が一致しないと別のエラーが発生することを示しています。3 つ目は、名前でフィールドを削除する方法を示しています。

次にどこに行くべきかについてのアイデアはありますか?同じフィールドを削除できるだけでなく、フィールドを更新するための特別な許可が存在する可能性はありますか? 私はサブサイトの所有者ですが、SharePoint 管理者でもサーバー管理者でもありません。そのため、ログを確認したり、カスタム コードをインストールしたりすることは困難です。そのため、私は Python Web サービス アプローチを使用しています。私はほぼ完全に困惑しています。

ありがとう、ロブ

メッセージ: これはフィールド「説明」を更新するために機能するはずですが、機能しません。フィールド ID の使用に加えて、Name、DisplayName、および StaticName を試してみましたが、役に立ちませんでした。MSFT リファレンス: http://msdn.microsoft.com/en-us/library/lists.lists.updatelist%28v=office.12%29.aspx

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <ns1:UpdateList>
         <ns1:listName>D538A29D-6DD4-423A-9E7D-2697917BDA78</ns1:listName>
         <ns1:updateFields>
            <Fields>
               <Method ID="1">
                  <Field ID="08d8fb05-0de8-4e19-988c-e204ade07f47" Description="new desc"/>
               </Method>
            </Fields>
         </ns1:updateFields>
      </ns1:UpdateList>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

フォルトは次のとおりです。

<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown.</faultstring>
<detail>
<errorstring xmlns="http://schemas.microsoft.com/sharepoint/soap/">Attempted to use an object that has ceased to exist. (Exception from HRESULT: 0x80030102 (STG_E_REVERTED))</errorstring>
<errorcode xmlns="http://schemas.microsoft.com/sharepoint/soap/">0x80030102</errorcode>
</detail>
</soap:Fault>

メッセージ: フィールドが見つからないことを期待していましたが、見つかりませんでした。基本的に、これは名前が間違っていると別のエラーになることを証明しています。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <ns1:UpdateList>
         <ns1:listName>D538A29D-6DD4-423A-9E7D-2697917BDA78</ns1:listName>
         <ns1:updateFields>
            <Fields>
               <Method ID="1">
                  <Field ID="q08d8fb05-0de8-4e19-988c-e204ade07f47" Description="new desc"/>
               </Method>
            </Fields>
         </ns1:updateFields>
      </ns1:UpdateList>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

メッセージ: このようにフィールドを削除できます。これは、フィールドを何らかの方法でうまく操作できることを証明しています。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <ns1:UpdateList>
         <ns1:listName>D538A29D-6DD4-423A-9E7D-2697917BDA78</ns1:listName>
         <ns1:deleteFields>
            <Fields>
               <Method ID="3">
                  <Field Name="myText"/>
               </Method>
            </Fields>
         </ns1:deleteFields>
      </ns1:UpdateList>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
4

1 に答える 1

2

これは機能します

フィールドの更新と追加が進みました! Lists.asmx Web サービスを説明する方法として「壊れやすい」という言葉が思い浮かびます。特に、フィールド属性は順序に依存します。型が最初に来る必要があります。Microsoft のコードには奇抜な "if-tree" があると思います。さらに、DisplayName のみを使用するとあいまいになる可能性がある場合は、DisplayName の後に Name が続く必要があります。

主要なデバッグ トリックは、同様の GUI で追加されたフィールドの後に、プログラムで追加されたフィールドをモデル化します。適切なパラメータを見つけるには:

  1. GUI を使用して同様のフィールドを作成する
  2. suds ログをデバッグ レベルに設定します。
  3. haufe.sharepoint の「service = Connector(url, username, password, list_id)」を使用してリストを開き、返された SOAP メッセージでフィールドのパラメーターを調べます。
  4. これらの属性を使用して、一部のフィールドが読み取り専用であるか、Microsoft によって定義されているように外部での使用を意図していないことに留意して実験を進めてください。

テキスト フィールドの更新、計算式フィールドの更新、テキスト フィールドの追加、計算フィールドの追加の 4 つの成功例を次に示します。うまくいけば、これは私と他の人が構築するのに十分です. 注: haufe.sharepoint は、これらの追加のメソッドや結果の返却をサポートしていません。だから...いくつかのハッキングが必要です。

テキスト フィールドを更新する

タイプは最初の属性でなければなりません。DisplayName の後に Name を使用して、他のフィールドとのあいまいさを回避します。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <ns1:UpdateList>
         <ns1:listName>D538A29D-6DD4-423A-9E7D-2697917BDA78</ns1:listName>
         <ns1:updateFields>
            <Fields>
               <Method ID="1">
                  <Field Type="Text" Name="myText" DisplayName="myText" Description="new desc"/>
               </Method>
            </Fields>
         </ns1:updateFields>
      </ns1:UpdateList>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

計算フィールドを更新する

タイプは最初の属性でなければなりません。最初に DisplayName を使用し、次に Name を使用して、他のフィールドとのあいまいさを回避します。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <ns1:UpdateList>
         <ns1:listName>D538A29D-6DD4-423A-9E7D-2697917BDA78</ns1:listName>
         <ns1:updateFields>
            <Fields>
               <Method ID="1">
                  <Field Type="Calculated" DisplayName="myCalcAdd" Name="myCalcAdd" ResultType="Number" ReadOnly="TRUE">
                     <Formula>=Jan*0.5</Formula>
                     <FormulaDisplayNames>=Jan*0.5</FormulaDisplayNames>
                     <FieldRefs>
                        <FieldRef Name="Jan"/>
                     </FieldRefs>
                  </Field>
               </Method>
            </Fields>
         </ns1:updateFields>
      </ns1:UpdateList>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

テキストフィールドを追加

タイプは最初に来る必要があります。DisplayName と Name は、2 つの属性の中でより重要なようです。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <ns1:UpdateList>
         <ns1:listName>D538A29D-6DD4-423A-9E7D-2697917BDA78</ns1:listName>
         <ns1:newFields>
            <Fields>
               <Method ID="1">
                  <Field Type="Text" Name="myTextAdd" DisplayName="myTextAdd" Description="My first added field"/>
               </Method>
            </Fields>
         </ns1:newFields>
      </ns1:UpdateList>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

計算フィールドを追加

タイプは最初に来る必要があります。DisplayName は必要ですが、Name は必要ありません。ResultType も、少なくとも以下の場合に必要です。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <ns1:UpdateList>
         <ns1:listName>D538A29D-6DD4-423A-9E7D-2697917BDA78</ns1:listName>
         <ns1:newFields>
            <Fields>
               <Method ID="1" AddToView="">
                  <Field Type="Calculated" DisplayName="myCalcAdd" ResultType="Number">
                     <Formula>=Jan*0.5</Formula>
                     <FormulaDisplayNames>=Jan*0.5</FormulaDisplayNames>
                     <FieldRefs>
                        <FieldRef Name="Jan"/>
                     </FieldRefs>
                  </Field>
               </Method>
            </Fields>
         </ns1:newFields>
      </ns1:UpdateList>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
于 2012-11-25T02:28:40.690 に答える