Thursday, November 20, 2008

Stock Ticker Web Part in SharePoint 2007 using web service

Requirement: To display our company stock quote details on a SharePoint HomePage

Solution:

Two ways:

1) Create web part to display the stock details in a Table,

i) Using rss feed url

ii) Using Web Service.

The sample code using Web Service is as follows:


StockQuote.StockQuote stkquote = new StockQuote.StockQuote();
string quote = stkquote.GetQuote("MCHP");//MCHP is the symbol for Microchip stock
XmlDocument xmldoc = new XmlDocument();
xmldoc.LoadXml(quote);
XmlNodeList nodelist = xmldoc.GetElementsByTagName("Stock");
XmlNode xmlnode = nodelist[0];
string symbol = "", last = "", date, time, change = "", open, high, low, volume = "", mktcap, prevclose, percentgechange = "", annrange, earns, pe, name;
for (int i = 0; i < xmlnode.ChildNodes.Count; i++)
{
XmlNode node = xmlnode.ChildNodes[i];
if (node.Name == "Symbol")
symbol = node.InnerText;
if (node.Name == "Last")
last = node.InnerText;
if (node.Name == "Volume")
volume = node.InnerText;
if (node.Name == "Change")
change = node.InnerText;
if (node.Name == "PercentageChange")
percentgechange = node.InnerText;
}
tblStockTicker = new Table();
TableRow trStockTicker = new TableRow();
TableCell tcStockQuote = new TableCell();
HyperLink hlStockQuote = new HyperLink();
hlStockQuote.Text = "MCHP Quote";
hlStockQuote.NavigateUrl = "http://quotes.nasdaq.com/asp/SummaryQuote.asp?symbol=MCHP&selected=MCHP";
tcStockQuote.Controls.Add(hlStockQuote);
trStockTicker.Cells.Add(tcStockQuote);
TableCell tcBlank = new TableCell();
tcBlank.Text = " ";
trStockTicker.Cells.Add(tcBlank);
TableCell tcQuoteText = new TableCell();
tcQuoteText.Text = "(NASDAQ Exchange - quotes delayed 15 min)";
trStockTicker.Cells.Add(tcQuoteText);
trStockTicker.Cells.Add(tcBlank);
TableCell tcVolume = new TableCell();
tcVolume.Text = "Volume: " + volume;
trStockTicker.Cells.Add(tcVolume);
trStockTicker.Cells.Add(tcBlank);
TableCell tcLast = new TableCell();
tcLast.Text = last;
trStockTicker.Cells.Add(tcLast);
trStockTicker.Cells.Add(tcBlank);
TableCell tcChange = new TableCell();
tcChange.Text = change;
trStockTicker.Cells.Add(tcChange);
trStockTicker.Cells.Add(tcBlank);
TableCell tcPercentageChange = new TableCell();
tcPercentageChange.Text = percentgechange;
trStockTicker.Cells.Add(tcPercentageChange);
trStockTicker.Cells.Add(tcBlank);
tblStockTicker.Rows.Add(trStockTicker);
this.Controls.Add(tblStockTicker);

(Note: I added a web referrence named "Stock Quote" to refer to the web service, http://www.webservicex.net/stockquote.asmx )


The sample code using RSS Feed is as follows:


XmlTextReader rssReader;
XmlDocument rssDoc;
XmlNode nodeRss = null;
XmlNode nodeChannel = null;
XmlNode nodeItem;
rssReader = new XmlTextReader("http://www.nasdaq.com/aspxcontent/NasdaqRSS.aspx?data=quotes&symbol=MCHP");
rssDoc = new XmlDocument();
// Load the XML content into a XmlDocument
rssDoc.Load(rssReader);
XmlNodeList nodelist = rssDoc.GetElementsByTagName("description");
string description = string.Empty;
for (int i = 0; i < nodelist.Count; i++)
{
description = Convert.ToString(nodelist[i].InnerText).Trim();
}
// Loop for the tag
for (int i = 0; i < rssDoc.ChildNodes.Count; i++)
{
// If it is the rss tag
if (rssDoc.ChildNodes[i].Name == "rss")
{
// tag found
nodeRss = rssDoc.ChildNodes[i];
}
}
// Loop for the tag
for (int i = 0; i < nodeRss.ChildNodes.Count; i++)
{
// If it is the channel tag
if (nodeRss.ChildNodes[i].Name == "channel")
{
// tag found
nodeChannel = nodeRss.ChildNodes[i];
}
}
for (int i = 0; i < nodeChannel.ChildNodes.Count; i++)
{
// If it is the item tag, then it has children tags which we will add as items to the ListView
if (nodeChannel.ChildNodes[i].Name == "item")
{
nodeItem = nodeChannel.ChildNodes[i];
//string cdata = nodeItem.Attributes["CDATA"].Value;
string desc = nodeItem["description"].InnerXml;
string decstext = nodeItem["description"].InnerText;
string[] sep = { "\table" };
string[] str = decstext.Split(sep, StringSplitOptions.None);
string strFinal = str[0].Replace("\r\n ", "");
strFinal = strFinal.Replace("\r\n ", "");
strFinal = strFinal.Replace("MCHP", "MCHP quote");
strFinal = strFinal.Replace("% Change", "");
strFinal = strFinal.Replace("Change", "");
strFinal = strFinal.Replace("Last", "(NASDAQ Exchange - quotes delayed by 15 min) ");
strFinal = strFinal.Replace("#DDDDDD", "");
//strFinal = strFinal.Replace("red", "white");
//string strRemove = strFinal.Substring(strFinal.IndexOf("/table"), strFinal.Length);
//strFinal = strFinal.Remove(strFinal.IndexOf("/table"), strFinal.);
Literal lt = new Literal();
lt.Text = strFinal;
//this.Controls.Add(lt);
Table tb = new Table();
TableRow tr = new TableRow();
TableCell tc = new TableCell();
tc.Controls.Add(lt);
tr.Cells.Add(tc);
tb.Rows.Add(tr);
tb.BackColor = Color.Silver;
tb.ForeColor = Color.White;
this.Controls.Add(tb);
}
}
}
}

(Note: I used NASDAQ RSS Feed (http://www.nasdaq.com/aspxcontent/NasdaqRSS.aspx?data=quotes&symbol=MCHP) to get the Microchip Stock details.


2) Deploy the web part to your Sharepoint Site.

3) Modify the SharePoint HomePage to include the above stock web part.


i) Open SharePoint Designer and open your site form "Open Site".
ii) Checkout your home page and open it.
iii) From the top menu, Select "Task Panes" and selct "Web Parts", which will open the web parts available for the site in the right side window.
iv) Select the Stockticker Web Part from the web parts list and drag and drop in the home page where eber required.
v) Add the following Javascript to refresh the Stock Ticker every 15 minutes.



vi) Check in the file and check your site home page to see the Stock details.

Javascrip in SharePoint

To refer Javascript file in Sharepoint 2007,

1) Go to "1033" folder in Layouts folder( c:\program files\common files\microsoft shared\web server extensions\12\template\Layouts\1033). This is the default folder that Sharepoint 2007 refers for Javascript files.


2) Add your custom javascript file in the folder ( for example, StockTicker.js file to refresh the control, with code as
var intervalID;
intervalID = window.setInterval("refreshStockTicker()",3000);
function refreshStockTicker() {document.execCommand("Refresh");};

3) To refer that javascript file in SharePoint, go to the sharepoint page using SharePoint Designer. And, refer it with the "SharePoint:ScriptLink" and "Name" as Javascript file name like,


if (!StockTicker1.IsClientScriptBlockRegistered("refreshCode"))
{ StockTicker1.RegisterClientScriptBlock("refreshCode", code); }


In above, StockTicker1 is the name of the control to be refreshed for every 3 seconds.

Thursday, November 06, 2008

How To Deploy Web Parts in MOSS 2007

Requirement: Deploy Web Part to SharePoint Site.

Procedure:
  1. Build your Web Part with Strong Name: Create a ClassLibrary Project.
  2. Drag and Drop the CustomWebPart.dll to GAC (C:\Windows\Assembly).
  3. Open the VirtualDirectories Folder (C:\Inetpub\wwwroot\wss\VirtualDirectories) and go to the Root Folder of your site. ( For Example your site is "http://localhost:801/sites/TestSite", then open the folder "801".)
  4. Open web.config file and add an SafeControl entry for your web part like, (Note: PublicKeyToken can be copied from GAC).
  5. Reset IIS
  6. Go to your site and Click on "Site Settings" => "Web parts".
  7. Click on "New" web part and Select your Web part and click on "Populate Gallary".
  8. Now go to your site and click on edit page. Click "Add a Web part". Select your web part under "Miscellaneous" section and click on "Add".
  9. You can see your web part now.
Deploy Web part by building Cab file.
  1. Build your Web Part with Strong Name: Create a ClassLibrary Project.
  2. Drag and Drop the CustomWebPart.dll to GAC (C:\Windows\Assembly).
  3. Add "CustomWepPartCab" cab project to the above solution(File => New => Project => Other Project Types => Setup and Deployment Project => Cab Project => "CustomWepPartCab")
  4. Add "Project Output.." by right click on cab project.
  5. Select "Primary output" and "Content Files".
6. Add a new file "manifest.xml" to the cab project as follows:
Note: Please make sure that file name(manifest.xml) is not changed

"











"

7. Add another file with name "CustomWebPart.dwp", the name given in the maifest.xml file as follows:
"

Custom Webpart
Custom Webpart
CustomWebpart, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b6ad7af95de74642 publickeytoken value from GAC
CustomWebpart.CustomWebpart

"

Deploying the Cab file:
  1. Go to command prompt(Start => Run => Cmd)
  2. Change the directory to the location where cab file(CustomWebPart.cab) is build.
  3. Execute the following command
  4. stsadm.exe -o addwppack -filename WebPartCab.CAB -url http://SiteUrltoInstallWebPart -globalinstall -force

Wednesday, November 05, 2008

Limiting Search Scope to Wiki Page Library(Document Library) AND Hiding Scope Drop Down

Hi,

I want to search a single Wiki Page Library(or Document Library) and I want to hide the Scope DropDown in UI.

For this, I found some solutions:

1)Create a Wiki Page Library(or Document Library) and note down the URL for later use.(For ex: "http://idc-dk-is:44510/sites/TestSite/WikiPageLibrary", Don't forget to remove the "/Forms/AllPages.aspx" from the URL).

2)Open SharePoint Designer and Open your master page where youwant to include this search.

3) From the main Menu, select "Task Panes" and Check/Select "Web Parts". It will open "Web Parts" task pane on the right hand side of the designer.

4) From the "Web Part List", Filter by "Search" and drag and drop "Search Box" web part to your master page.

5) Select "Code" view for the master page.
To hide the Scope Drop Down, set the following property:
<DropDownModeEx xmlns="urn:schemas-microsoft-com:SearchBoxEx">HideScopeDD

6) To specify search in the specific document library, you need to set two properties, "AppendToQuery" to false and "AppQueryTerms" to the Document Library Url (from step 1) as follows in the Search Webpart.

In spswc:searchboxex, AppendToQuery="false" AppQueryTerms="site:http://idc-dk-is:44510/sites/TestSite/WikiPageLibrary"


Another Solution:


1) Follow the Step 1 specified above to create Wiki Page Library

2)Create a Search Scope For the Document Library and note down the Scope name(For example: WikiSearch with scope rule ( Type = Web Address and Web Address = Folder,"http://idc-dk-is:44510/sites/TestSite/WikiPageLibrary")

3)Follow the steps from 2 to 5 specified in above solution.

4)To specify search in the specific document library, you need to set two properties, "AppendToQuery" to false and "AppQueryTerms" to "Scope:DocLibrarySearchScopeName" as follows.

In spswc:searchboxex webpart,
AppendToQuery="false" AppQueryTerms
Scope:WikiSearch"

Save the modified Master Page and publish it to see the Search returning results from the Doc Library only.

Happy Searching...
Yasovardhan.