locked
ドキュメンライブラリからのアイテムの取得に関して悩 RRS feed

  • 質問

  • ドキュメンライブラリからのアイテムの取得に関して悩んでいます。

    Microsoftのサイトより、以下のソースを組んで試した見たところ、「ListItemCollection items = targetList.GetItems(CamlQuery.CreateAllItemsQuery());」の前では、ドキュメンライブラリに8アイテムあるのが後では0になってしまいます。何かしら指定方法が悪いのでしょうか?お気づきの点がありましたら、どうぞ
    よろしくお願いいたします。



            //サイトからドキュメンライブラリを探してアイテムを取得する
            private void mytest()
            {
                string siteUrl = "http://mySharePoint:1234";

                ClientContext clientContext = new ClientContext(siteUrl);
                Web site = clientContext.Web;
                ListCollection collList = site.Lists;

                clientContext.Load(collList);
                clientContext.ExecuteQuery();

                Console.WriteLine("Lists on the current site:\n\n");

                foreach (List targetList in collList)
                {
                    //Console.WriteLine(targetList.Title);
                    if (targetList.BaseType.ToString() == "DocumentLibrary")
                    {
                        //ここでは  targetList.ItemCount=8
                        ListItemCollection items = targetList.GetItems(CamlQuery.CreateAllItemsQuery());
                        clientContext.Load(items);
                        clientContext.ExecuteQuery();

                        //ここでは  items.ItemCount=0
                        foreach (SP.ListItem item in items)
                        {
                          //Do something
                        }
                    }
                }


            }
            //ドキュメンライブラリを指定してアイテムを取得する
            private void mytest2(String documentFolder)
            {
                // Starting with ClientContext, the constructor requires a URL to the 
                // server running SharePoint. 
                ClientContext context = new ClientContext("http://mySharePoint:1234");
                SP.List list = context.Web.Lists.GetByTitle(documentFolder);
                ListItemCollection items = list.GetItems(CamlQuery.CreateAllItemsQuery());

                context.Load(list);
    ing());
                context.Load(items);

                // We must call ExecuteQuery before enumerate list.Fields. 
                context.ExecuteQuery();
               
               //指定したドキュメントライブラリ8アイテムあるはずなのに  items.ItemCount=0

            }

    開発は以下にて行っています。
    CRMプラグイン用:C#(VS2012)
    WEBサイト用:JavaScript
    2013年12月27日 7:54

回答

  • 念のため確認ですが、ドキュメントライブラリに含まれるアイテムは、「フォルダー」ではなく「ファイル」ですか?もしも仮に、ドキュメントライブラリ内に、「フォルダー」のみが存在する場合は、「CamlQuery.CreateAllItemsQuery()」を利用した場合、「0」となるかもしれません。わざわざ別に、「createAllFoldersQuery()」 が用意されているので…。 SP.CamlQuery.createAllFoldersQuery() Method http://msdn.microsoft.com/en-us/library/office/ff407697.aspx
    • 回答の候補に設定 佐伯玲 2014年1月6日 0:21
    • 回答としてマーク kappado2001 2014年1月6日 1:42
    2013年12月27日 9:24
  • 手元で確認したところ、同じ処理内容で、ドキュメントライブラリからファイルの一覧を取得することができました。
    今回作成されているアプリでは、リンク先の設定は関係ないような気もします…。

    他のライブラリでは取得ができるとのことなので、疑わしいのは権限まわりでしょうか?アプリを実行している(SharePointへ要求を送っている)ユーザーが、ドキュメントライブラリ内のフォルダー配下に閲覧権限以上を有していないということはないですか?

    • 回答としてマーク kappado2001 2014年1月7日 14:38
    2014年1月7日 7:52

すべての返信

  • ListItemCollection のリファレンスを確認すると、ItemCount というプロパティは存在せず、Count というプロパティがあるようですが、こちらを指定した場合は、どうなりますか?

    ListItemCollection members
    http://msdn.microsoft.com/en-us/library/office/microsoft.sharepoint.client.listitemcollection_members.aspx

    2013年12月27日 8:55
  • ListItemCollection のリファレンスを確認すると、ItemCount というプロパティは存在せず、Count というプロパティがあるようですが、こちらを指定した場合は、どうなりますか?

    ListItemCollection members
    http://msdn.microsoft.com/en-us/library/office/microsoft.sharepoint.client.listitemcollection_members.aspx

    OTA Hirofumiさん,

    すみません,ListItemCollectionの場合はCountですね。これも「0」でした。


    2013年12月27日 9:02
  • 念のため確認ですが、ドキュメントライブラリに含まれるアイテムは、「フォルダー」ではなく「ファイル」ですか?もしも仮に、ドキュメントライブラリ内に、「フォルダー」のみが存在する場合は、「CamlQuery.CreateAllItemsQuery()」を利用した場合、「0」となるかもしれません。わざわざ別に、「createAllFoldersQuery()」 が用意されているので…。 SP.CamlQuery.createAllFoldersQuery() Method http://msdn.microsoft.com/en-us/library/office/ff407697.aspx
    • 回答の候補に設定 佐伯玲 2014年1月6日 0:21
    • 回答としてマーク kappado2001 2014年1月6日 1:42
    2013年12月27日 9:24
  • 念のため確認ですが、ドキュメントライブラリに含まれるアイテムは、「フォルダー」ではなく「ファイル」ですか?もしも仮に、ドキュメントライブラリ内に、「フォルダー」のみが存在する場合は、「CamlQuery.CreateAllItemsQuery()」を利用した場合、「0」となるかもしれません。わざわざ別に、「createAllFoldersQuery()」 が用意されているので…。 SP.CamlQuery.createAllFoldersQuery() Method http://msdn.microsoft.com/en-us/library/office/ff407697.aspx

    OTA Hirofumiさん,RESをありがとうございます。

    全部フォルダの可能性があります。早速試してみます。

    ありがとうございました。

    2014年1月6日 1:20
  • CreateAllFoldersQuery()に変えても、アイテムが取れませんでした。

    構造として、以下のようになっており、FoldersA-xの中にファイルが
    入っている状態になります(実際にファイルはコンテンツDB内にある
    ようです)

    SharePointServer--FoldersA--FoldersA-1---FileA-1
                    |         |-FoldersA-2---FileA-2
                    |         |-FoldersA-3---:
                    |-FoldersB--FoldersA-1---:
                              |-FoldersB-1---:
                              |-FoldersB-2---:
                              |-FolderAB-3---:

     以下テストしたリストを転載します。

    //指定したドキュメントライブラリから、フォルダ一覧をログへ出力する。
            private void getDocumentLibFolders(String DocumentLibName)
            {
                logWrite("getsublist:" + DocumentLibName);
                // Starting with ClientContext, the constructor requires a URL to the 
                // server running SharePoint2013. 
                ClientContext context = new ClientContext("http://sp.local:4444");

                // Assume the web has a list named "Announcements". 
                List announcementsList = context.Web.Lists.GetByTitle(DocumentLibName);

                // This creates a CamlQuery that has a RowLimit of 100, and also specifies Scope="RecursiveAll" 
                // so that it grabs all list items, regardless of the folder they are in. 
                //CamlQuery query = CamlQuery.CreateAllItemsQuery(100);

                CamlQuery query = CamlQuery.CreateAllFoldersQuery();

                ListItemCollection items = announcementsList.GetItems(query);

                // Retrieve all items in the ListItemCollection from List.GetItems(Query). 
                context.Load(items);
                context.ExecuteQuery();
                logWrite("listsitems.Displaycount=" + items.Count.ToString())
          //↑指定したDocumentLibNameには複数のフォルダとその下にアイテムがある。

                foreach (ListItem listItem in items)
                {
                    // We have all the list item data. For example, Title. 
                    //label1.Text = label1.Text + ", " + listItem["Title"];
                    string names = (string)listItem["Title"];

                    if( names!=""){
                        logWrite("listsitems.DisplayName=[" +names+"]" );
                    }
                }


            }

    何かお気づきの点などありましたら、ご教示いただけると助かります。

                                
    2014年1月6日 3:10
  • 補足です。
    SharePointサーバー内の全部のドキュメントライブラリを
    検索したところ、「マスターページギャラリー」「スタイルライブラリ」
    「ソリューションギャラリー」などは、「items.Count」は
    0ではありませんでした。

    自分で作成したフォルダの中身が取得できない感じです。

    アプリのほかにCRMのプラグインも作成しようとしているのですが、
    以下の設定などが必要になってくるのでしょうか?

    http://rc.crm.dynamics.com/RC/2011/ja-jp/online/5.1_ctp/help/source_docmgm_use_sp_docs.htm 

    お気づきの点などありましたら、ご教示いただけると助かります。
    2014年1月7日 2:23
  • 手元で確認したところ、同じ処理内容で、ドキュメントライブラリからファイルの一覧を取得することができました。
    今回作成されているアプリでは、リンク先の設定は関係ないような気もします…。

    他のライブラリでは取得ができるとのことなので、疑わしいのは権限まわりでしょうか?アプリを実行している(SharePointへ要求を送っている)ユーザーが、ドキュメントライブラリ内のフォルダー配下に閲覧権限以上を有していないということはないですか?

    • 回答としてマーク kappado2001 2014年1月7日 14:38
    2014年1月7日 7:52
  • 手元で確認したところ、同じ処理内容で、ドキュメントライブラリからファイルの一覧を取得することができました。
    今回作成されているアプリでは、リンク先の設定は関係ないような気もします…。

    他のライブラリでは取得ができるとのことなので、疑わしいのは権限まわりでしょうか?アプリを実行している(SharePointへ要求を送っている)ユーザーが、ドキュメントライブラリ内のフォルダー配下に閲覧権限以上を有していないということはないですか?

    OTA Hirofumiさん,RESをありがとうございます。

    検証までしていただき、申し訳ございません。

    閲覧権限を付けているユーザーにて、アクセスしていたと思うのですが、再度確認させていただきます。

    お忙しいところ、申し訳ございませんでした、またありがとうございます。

    2014年1月7日 14:38