Solved

Sharepoint help

Posted on 2013-06-26
1
276 Views
Last Modified: 2013-07-30
Hi,

I am trying to use Javascript object model in SharePoint 2010 and here is my scenario. I have two lists with parent child relationship. Authors and books.

Now I want to retrive all the books that are published by a particular author. so assume we are in the context of the parent list Item (i,e a list Item in Authors) when writing the script to get all the books authored by a particular author.

So here is what I want to get the statistics using Javascript Client Object model:

-1) Count of All the books authored by a particular author

-2) Count of  All the books authored by a particular author but have a status = Not Started.

-3) 2 divided by 1  store in a variable so I can use this fraction for some display

-4)Count of  All the books authored by a particular author but have a status = In Progress.

-5) 4 divided by 1  store in a variable so I can use this fraction for some display

-6)Count of  All the books authored by a particular author but have a status = Complete.

-7) 6 divided by 1 and store in a variable so I can use this fraction for some display

Can anyone please help with the script please? I am new to Javascript and Javascript client object model in Sharepoint

Thanks in Advance,
0
Comment
Question by:Techsavy
1 Comment
 
LVL 44

Accepted Solution

by:
Rainer Jeschor earned 500 total points
ID: 39303106
Hi,
a good starting point is:
http://blogs.msdn.com/b/sharepointdev/archive/2011/07/19/working-with-the-ecmascript-client-object-model-jsom-in-sharepoint-2010-part-3-nikhil-sachdeva.aspx

Even if he does not post all his used scripts, the main idea beyond ECMAScript is understandable (please follow also part 4 of this series).

Here is some sample code I built on my dev environment where the books list is named "EEBooks" and has a lookup field in it named "Author". As the components used by ECMAScript needs the internal field names, the internal name of the Author field is "Author0" (thats a ZERO) as the SharePoint built-in field "Created by" has the internal name "Author".

<!-- HTML area for author search input box, action button and result output -->
<table>
<tr><td>Author Name:</td><td><input type="text" name="authname" id="authname" /></td></tr>
<tr><td colspan="2"><input type="button" text="Search..." onclick="javascript:GetBooksByAuthor();" value="Search ..." /></td></tr>
</table>
<div id="results"></div>
<script type="text/javascript" src="//ibms.gbi.msg.de/test/SiteAssets/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
<!-- Get book counts by author --> 
var bookItems;
var booksCount;
var booksCountNotStarted;
var booksCountInProgress;
var booksCountComplete;
var booksCountOther;
var booksPercentageComplete;
var booksPercentageNotStarted;
var booksPercentageInProgress;

// This is the main function.
function GetBooksByAuthor() 
{ 

  // Get the author from input box
  var selectedAuthor = jQuery("#authname").val();
  if (selectedAuthor == "") 
  { 
	// Do nothing if nothing entered
	alert('Please enter a value');
	return; 
  }

  // Create query string using CAML syntax 
  var myQueryString = '<View><Query><Where><Eq>' +
                  '<FieldRef Name=\'Author0\' />' +
                  '<Value Type=\'Lookup\'>'+ selectedAuthor +'</Value></Eq></Where>' +
                  '</Query></View>'; 
  // Create client context 
  var myContext = new SP.ClientContext.get_current(); 
  // Get current web (comparable to SPWeb) 
  var myWeb = myContext.get_web(); 
  // Get list by title (comparable to SPList) 
  var myList = myWeb.get_lists().getByTitle('EEBooks'); 
  // Create (empty) query (comparable to SPQuery) 
  var myQuery = new SP.CamlQuery(); 
  // Attach query string to query 
  myQuery.set_viewXml(myQueryString); 
  // Get items from list using query 
  bookItems = myList.getItems(myQuery); 

  // Declare what to load (bookItems with the fields ID, Title, Status
  myContext.load(bookItems,'Include(ID,Title,Status)'); 
  // Now execute the query. 
  myContext.executeQueryAsync(Function.createDelegate(
                                this, GetBooksByAuthorSuccess),
                     Function.createDelegate(
                                this, GetBooksByAuthorFail)); 
  jQuery("#results").html("Query is executed asynch ...");
}

// This function will be called if the
// "executeQueryAsync" failed
// (e.g. list not available, query string wrong or anything else) 
function GetBooksByAuthorFail(sender, args) 
{ 
  // Show error message
  alert('GetBooksByAuthor() failed:' + args.get_message()); 
}

// This function will be called if the "executeQueryAsync"
// succeeded 
function GetBooksByAuthorSuccess(sender, args) 
{
  // Initialize counters
  booksCountNotStarted = 0;
  booksCountInProgress = 0;
  booksCountComplete = 0;
  booksCountOther = 0;
  booksPercentageComplete = 0;
  booksPercentageNotStarted = 0;
  booksPercentageInProgress = 0;
 
  // Now we can use the data retrieved from SharePoint! 
  // Get number of items 
  var booksCount = bookItems.get_count(); 

  
  // Get the enumerator to be able to loop through the items
  var booksEnumerator = bookItems.getEnumerator(); 
  // Declare temporary variable for output 
  var outputDetails = '';

  // Loop through all items 
  while (booksEnumerator.moveNext()) 
  {  
    // Get current item 
    var currentBook = booksEnumerator.get_current(); 
    
    // Update Counter based on status 
    switch (currentBook.get_item("Status")) {
      case "Complete":
        booksCountComplete += 1;
        break;
      case "In progress":
        booksCountInProgress += 1;
        break;
      case "Not started":
        booksCountNotStarted += 1;
        break;
      default:
        booksCountOther += 1;
        break;
    } 
  } 

  // Build percentages and update result div
  if ( booksCount > 0 )
  {
    booksPercentageComplete = booksCountComplete / booksCount;
    booksPercentageNotStarted = booksCountNotStarted / booksCount;
    booksPercentageInProgress = booksCountInProgress / booksCount;    
  }
  outputDetails = 'Results:<br/><br/>Total books: ' + booksCount + '<br/>' 
                + 'Books not started:' + booksCountNotStarted +' / Percentage ' + booksPercentageNotStarted +'<br/>'
                + 'Books in progress:' + booksCountInProgress +' / Percentage ' + booksPercentageInProgress +'<br/>'
                + 'Books completed:' + booksCountComplete +' / Percentage ' + booksPercentageComplete +'<br/>';  
  jQuery("#results").html(outputDetails);
}
</script> 

Open in new window


Some comments from my experience:
ECMAScript is sometimes really complex compared to e.g. using the SPServices library (available on Codeplex). Also debugging is really hard ...
An additional tip would be to create a dynamic drop-down list (SELECT element in HTML) to choose an author from and add the options also via COM (Client Object Model) with one additional (first) entry: "Please select an author ...".

Instead of editing the SharePoint page in SharePoint designer, I normally use one text file containing all the HTML and script stuff, upload this to a document library and use then a Content Editor Web Part to link to this file. Then changes can simply be done by uploading a new version of this text file.

HTH
Rainer
0

Featured Post

Enabling OSINT in Activity Based Intelligence

Activity based intelligence (ABI) requires access to all available sources of data. Recorded Future allows analysts to observe structured data on the open, deep, and dark web.

Join & Write a Comment

Nothing in an HTTP request can be trusted, including HTTP headers and form data.  A form token is a tool that can be used to guard against request forgeries (CSRF).  This article shows an improved approach to form tokens, making it more difficult to…
This article demonstrates how to create a simple responsive confirmation dialog with Ok and Cancel buttons using HTML, CSS, jQuery and Promises
The viewer will learn the basics of jQuery, including how to invoke it on a web page. Reference your jQuery libraries: (CODE) Include your new external js/jQuery file: (CODE) Write your first lines of code to setup your site for jQuery.: (CODE)
The viewer will learn the basics of jQuery including how to code hide show and toggles. Reference your jQuery libraries: (CODE) Include your new external js/jQuery file: (CODE) Write your first lines of code to setup your site for jQuery…

760 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

19 Experts available now in Live!

Get 1:1 Help Now