Wednesday, December 11, 2013

Using VLOOKUP function with datasource query in Excel

When using the VLOOKUP function on a table array with data returned from a data source query, I found it necessary to explicitly convert my lookup value to a text value. Failing to do so normally resulted in a error.


=VLOOKUP(TEXT(A1,0),Table_Query_from_My_Data_Source,2,FALSE)

Thursday, October 24, 2013

SharePoint Custom List web part template

A recent project involved adding the same navigation links to a couple of SharePoint blog sites. The navigation links must appear on the default.aspx, categories.aspx and post.aspx pages. Using a custom list in the parent site, we created a web part using SP Designer. Now, if we need another navigation web part for another set of blogs, we can simply export the web part and make the necessary changes. Below is the content of web part. Included is the xml definition of the view as well as the xsl to create the links.

<?xml version="1.0" encoding="utf-8" ?>
<webParts>
 <webPart xmlns="http://schemas.microsoft.com/WebPart/v3">
  <metaData>
   <type name="Microsoft.SharePoint.WebPartPages.XsltListViewWebPart, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
   <importErrorMessage>Cannot import this Web Part.</importErrorMessage>
  </metaData>
  <data>
   <properties>
    <property name="InitialAsyncDataFetch" type="bool">False</property>
    <property name="ChromeType" type="chrometype">None</property>
    <property name="Title" type="string" />
    <property name="Height" type="string" />
    <property name="CacheXslStorage" type="bool">True</property>
    <property name="XslLink" type="string" null="true" />
    <property name="AllowZoneChange" type="bool">True</property>
    <property name="AllowEdit" type="bool">True</property>
    <property name="XmlDefinitionLink" type="string" />
    <property name="DataFields" type="string" />
    <property name="Hidden" type="bool">False</property>
    <property name="ListName" type="string">{37683D39-B11D-4E11-8B1C-8C5421EDB458}</property>
    <property name="NoDefaultStyle" type="string">TRUE</property>
    <property name="ListDisplayName" type="string" null="true" />
    <property name="AutoRefresh" type="bool">False</property>
    <property name="ViewFlag" type="string">8388621</property>
    <property name="AutoRefreshInterval" type="int">60</property>
    <property name="AllowConnect" type="bool">True</property>
    <property name="Description" type="string" />
    <property name="AllowClose" type="bool">True</property>
    <property name="ShowWithSampleData" type="bool">False</property>
    <property name="ParameterBindings" type="string"></property>
     <property name="EnableOriginalValue" type="bool">False</property>
    <property name="CacheXslTimeOut" type="int">86400</property>
    <property name="WebId" type="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">ef069fb2-2b0b-4c00-ad1f-231d5485f963</property>
    <property name="ListUrl" type="string" null="true" />
    <property name="DataSourceID" type="string" />
    <property name="FireInitialRow" type="bool">True</property>
    <property name="ManualRefresh" type="bool">False</property>
    <property name="ViewFlags" type="Microsoft.SharePoint.SPViewFlags, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c">Html, TabularView, Hidden, Mobile</property>
    <property name="ChromeState" type="chromestate">Normal</property>
    <property name="AllowHide" type="bool">True</property>
    <property name="PageSize" type="int">-1</property>
    <property name="SampleData" type="string" null="true" />
    <property name="BaseXsltHashKey" type="string">/_layouts/xsl/vwstyles.xsl;#12/13/2011 02:25:36;#0;#/_layouts/xsl/fldtypes.xsl;#03/26/2010 21:24:40;#0;#/_layouts/xsl/fldtypes_Ratings.xsl;#03/14/2012 11:19:12;#0;#/_layouts/xsl/fldtypes_docicon.xsl;#09/07/2011 11:41:41;#0;# 1 100  14.0.6120.5000</property>
    <property name="AsyncRefresh" type="bool">False</property>
    <property name="HelpMode" type="helpmode">Modeless</property>
    <property name="ListId" type="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">37683d39-b11d-4e11-8b1c-8c5421edb458</property>
    <property name="DataSourceMode" type="Microsoft.SharePoint.WebControls.SPDataSourceMode, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c">List</property>
    <property name="AllowMinimize" type="bool">True</property>
    <property name="TitleUrl" type="string">/XXXXX/XXX/Lists/Navigation</property>
    <property name="CatalogIconImageUrl" type="string" />
    <property name="DataSourcesString" type="string" />
    <property name="PageType" type="Microsoft.SharePoint.PAGETYPE, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c">PAGE_NORMALVIEW</property>
    <property name="DisplayName" type="string">All Items</property>
    <property name="UseSQLDataSourcePaging" type="bool">True</property>
    <property name="Width" type="string" />
    <property name="ExportMode" type="exportmode">All</property>
    <property name="Direction" type="direction">NotSet</property>
    <property name="ViewContentTypeId" type="string">0x</property>
    <property name="HelpUrl" type="string" />
    <property name="XmlDefinition" type="string">
    &lt;View Name="{E9A835C7-4605-41BD-AA5E-50D9799DE2C9}" MobileView="TRUE" Type="HTML" Hidden="TRUE" DisplayName="All Items" Url="/academic-affairs/AFA/SitePages/Untitled_12.aspx" Level="1" BaseViewID="1" ContentTypeID="0x" ImageUrl="/_layouts/images/generic.png"&gt;
     &lt;Query/&gt;
     &lt;ViewFields&gt;
      &lt;FieldRef Name="LinkTitle"/&gt;
      &lt;FieldRef Name="URL"/&gt;
      &lt;FieldRef Name="Title" Explicit="TRUE"/&gt;
     &lt;/ViewFields&gt;
     &lt;/View&gt;
    </property>   
     <property name="Xsl" type="string">
    &lt;xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" version="1.0" exclude-result-prefixes="xsl msxsl ddwrt" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" xmlns:asp="http://schemas.microsoft.com/ASPNET/20" xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:SharePoint="Microsoft.SharePoint.WebControls" xmlns:ddwrt2="urn:frontpage:internal" xmlns:o="urn:schemas-microsoft-com:office:office" ddwrt:ghost="show_all"&gt;
    &lt;xsl:template match="dsQueryResponse" xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" xmlns:asp="http://schemas.microsoft.com/ASPNET/20" xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer" xmlns:SharePoint="Microsoft.SharePoint.WebControls" xmlns:o="urn:schemas-microsoft-com:office:office" ddwrt:ghost="" xmlns:ddwrt2="urn:frontpage:internal" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"&gt;       
     &lt;div class="AFANavigation"&gt;&lt;xsl:apply-templates select="/dsQueryResponse/Rows/Row"/&gt;&lt;/div&gt;
    &lt;/xsl:template&gt;
       &lt;xsl:template match="Row"&gt;
      &lt;xsl:choose&gt;
       &lt;xsl:when test="substring(@URL,2,3) = 'a h'"&gt;
        &lt;xsl:variable name="link" select="substring-after(substring-before(@URL,'&amp;lt;/a&amp;gt;'),'&amp;gt;')"/&gt;
        &lt;div&gt;&lt;a href="{$link}"&gt;&lt;xsl:value-of select="@Title"/&gt;&lt;/a&gt;&lt;/div&gt;
       &lt;/xsl:when&gt;
      &lt;xsl:otherwise&gt;
       &lt;div&gt;&lt;a href="{@URL}"&gt;&lt;xsl:value-of select="@Title"/&gt;&lt;/a&gt;&lt;/div&gt;
      &lt;/xsl:otherwise&gt;
     &lt;/xsl:choose&gt;
        &lt;/xsl:template&gt;
    &lt;/xsl:stylesheet&gt;
    </property>

    <property name="Default" type="string">FALSE</property>
    <property name="TitleIconImageUrl" type="string" />
    <property name="MissingAssembly" type="string">Cannot import this Web Part.</property>
    <property name="SelectParameters" type="string" />
   </properties>
  </data>
 </webPart>
</webParts>

Wednesday, October 9, 2013

Sharing variables between a subreport and the main report in Crystal Reports

In a recent  Crystal Report I was working on, I had a need to share a variable between a subreport and the main report so I could suppress rows based upon the value returned in the subreport. Normally, any value within a subreport is not visible to the Formula Editor. The key is to then to use a shared variable to pull the data into the main report where it's visible within the editor.

Because in the normal processing flow, subreports are exectuted in the 2nd pass, after record retrieval,

Friday, September 20, 2013

Using the following-sibling to compare node-sets in a SharePoint list


In a table I need to display items from a SharePoint custom list grouped by a column. For styling purposes, I need to identify the last row of each grouping. Using the following-sibling axis, I can look ahead to see if the group value will change. If so, I apply a class to the current table row.

<xsl:template match='Row'>
<tr>
<xsl:if test="@Group != following-sibling::Row[1]/@Group or position() = last()">
     <xsl:attribute name="class">lastItem</xsl:attribute>
 </xsl:if>
....
</tr>
...
</xsl:template>

In my stylesheet, I can then apply rules to the lastItem class:

table  tr { border-bottom: 2px #707070 dotted; }
table tr.lastItem { border-bottom: none; }

Wednesday, July 31, 2013

Displaying multiple parameter values in a Crystal Report

When a Crystal report user chooses multiple values for a parameter, sometime it's nice to display all those parameter values in the report header. The following code can be added to a function for displaying in the header.

WhilePrintingRecords;
StringVar Array term := {?Term};
StringVar terms := term[1];
Local NumberVar i;
For i := 2 To count(term) Do
(
   terms := terms + ", " + term[i];
);
terms

Tuesday, July 2, 2013

Including a link to a javascript file in XSLT

In SharePoint 2010, I was updating a custom version of the ContentQueryMain.xsl file, needing to include javascript for the page. When I added the following code, the layout of the page changed, the ribbon stopped responding and the page would not respond when in edit mode.

<script type="text/javascript" src="/Script%20Files/myjavascript.js"></script> 

Turns out, the XSLT processor didn't care for the empty script tag. Adding the space entity &#160; fixed the problem.

<script type="text/javascript" src="/Script%20Files/myjavascript.js">&#160;</script>

 

Tuesday, May 7, 2013

Using VLOOKUP in a Google Spreadsheet for adding new rows through form submission


In order to have a VLOOKUP formula apply to new rows added to a Google spreadsheet through form submission, add the following formula to a 2nd row column (below the header).

=arrayformula(vlookup(B2:B,Names!$A$1:$B$360,{2}*sign(row(B2:B)),FALSE))

The first argument of vlookup is the range of cells for your lookup values.
The second argument is your table array. This example uses a 2-column table array.
The third argument is the column index number. The use of the formula 'sign' is key to make an array that is the same length as the first argument.
The fourth argument is a boolean value that specifies whether you want vlookup to find an exact match or an approximate match.

Monday, April 22, 2013

Using CSS Direct Descendant Selector with Tables

Recently I was attempting to use a  CSS 'direct descendant' selector (>) to set a bottom border on rows in a table. Because there were rows buried deeper in nested tables, I didn't want those to have the border. When I used the following CSS selector, it didn't work.

   table.employee > tr

Turns out, I needed to add a TBODY between the TABLE and TR, even though a TBODY was not showing in the page source because the TBODY is implictly added.


table.employee > tbody > tr
 
 

Thursday, April 4, 2013

Using Request.QueryString in Page_Load in SharePoint page layout


Below is an example of using the Request.QueryString collection in the Page_Load method in a SharePoint page layout. In this case we're looking for the variable named 'tab' and checking for various conditions.


try
{
  int index = System.Convert.ToInt32(Request.QueryString["tab"]);
  if (index > 1 && index < 5)
  {
    if (RadTabStrip1.Tabs[index-1].Visible)
    {
       RadTabStrip1.Tabs[index-1].Selected = true;
       RadMultiPage1.PageViews[index-1].Selected = true;
    }
  }
}
catch (Exception ex)
{
  //    Response.Write(ex.Message);
}

Thursday, March 28, 2013

Using word-wrap for an AspMenu SharePoint web control with long menu items

I have an AspMenu SharePoint web control with long menu items that do not respect the width of the table cell that I've set even though I have the property 'ItemWrap' set to 'True'. The biggest culprit is users wanting to use a series of  underscores to separate one group od links from another. To keep an extra long series of underscores from pushing the table cell wider, I'm using the stylesheet rule 'word-wrap' as shown below.

The ASPMenu control creates this hierarchy of tables. 

div#s4-leftpanel table tr td table
{
       table-layout:fixed;
}
div#s4-leftpanel table tr td table tr td
{
       word-wrap:break-word;
}

Monday, March 11, 2013

Hiding SharePoint list columns from NewForm.aspx using JavaScript

There are times I create a column in a SharePoint custom list and I don't want anyone with Contribute rights to alter the default value. In the NewForm.aspx and EditForm.aspx pages I add the following script to a CEWP on the page.

<script type="text/javascript">
  function HideField(title){
   var header_h3 = document.getElementsByTagName("h3");
   for (var i = 0; i < header_h3.length; i++)
   {
       var el = header_h3[i];
       var foundField;
       if (el.className=="ms-standardheader")
       {
           for (var j=0; j<el.childNodes.length; j++)
           {
              if (el.childNodes[j].innerHTML == title || el.childNodes[j].nodeValue == title)
             {
                 var elRow = el.parentNode.parentNode;
                 elRow.style.display = "none"; //and hide the row
                 foundField = true;
                 break;
         }
      }       
    }
     if (foundField)
  break;
 }
}
HideField("Workspace");
HideField("Remote Item ID");
</script>

Thursday, February 21, 2013

Content Query Web Part using Custom ItemStyle.xsl


To set an existing Content Query Web part to use a custom ItemStyle.xsl file for custom styling list entries, we need to update the following property in the Content Query Web Part.webpart file after exporting to the Desktop.
<property name="ItemXslLink" type="string">/Style Library/XSL Style Sheets/ItemStyleCustom.xsl</property>
After uploading back to the page, the web part now allows you to choose custom item templates in the ItemStyleCustom.xsl file you've created.

Friday, February 15, 2013

SPDataSource and the CrossList DataSourceMode


I was recently searching for how to construct an SPDataSource using a Crosslist or Union of two or more SharePoint lists. Not finding the answer in one place, I was able to piece together the answer. Because we're doing a union of lists, the column names and type in each list must match.


<SharePointWebControls:SPDataSource
runat="server"
ID="spDataSource1"
DataSourceMode="CrossList"
SelectCommand="<Webs Scope='SiteCollection'></Webs>
  <Lists>
    <List ID='XXXXXXXX-XXXX-4499-91F3-359A463EB89F'></List>
    <List ID='XXXXXXXX-XXXX-4EBE-9801-8751A076F069'></List>
  </Lists>
  <View>
    <ViewFields><FieldRef Name='Title' /><FieldRef Name='EventDate' /><FieldRef Name='EndDate' /></ViewFields>
    <Query>
      <Where><Geq><FieldRef Name='EndDate'/><Value  Type='DateTime'><Today/></Value></Geq>
      </Where>
      <OrderBy><FieldRef Name='EventDate' Ascending='True'/></OrderBy>
    </Query>
    <RowLimit>5</RowLimit>
  </View>"

</SharePointWebControls:SPDataSource>