SSRS – “Jump to Report” in a different project

While working with a report for SSRS 2005, using the Business Intelligence Development Studio, I’ve used the option to “Jump to Report” very often. You can find this by going to the properties of an object (textbox, cell, etc) and the Navigation tab.

Navigation tab to jump to report

 

The problem I encountered today is that the drop down shown above only displays reports that existing within the current project loaded in Visual Studio. This means if you have a common report used as a drill through, a copy would need to be made inside this project which is obviously a bad idea since multiple copies would need to be updated.

 

However after a bit of searching I’ve found that you can specify the folder (as it appears on the Report Server) that your sub report exists in, and it will function correctly.

Specify subfolder for jump to report

By doing this, you can maintain one copy of your common reports, and just reference them from the folder name.

Note: this won’t work while previewing the master report in Visual Studio unless you have deployed the drill through report to the report server.

 

As a related aside, I have started organizing my reports all within one Solution in Visual Studio, each under separate projects. Prior to this I had one Solution and one Project for each set of reports, which didn’t scale very well and doesn’t allow for easy referencing. Now, I can get at them all at once:

Projects within a solution

Inject 3rd party drivers into WDS image

I use Windows Deployment Services (WDS) under Server 2008 to deploy images of Windows 7 x64 over PXE to my desktops and laptops.

I’ve standardized on Dell Latitude and Optiplex computers, so I want these drivers to remain in place after the sysprep, so they don’t need to be added later.

Apparently Server 2008 R2 WDS has the ability to add drivers through the GUI, but I don’t have that luxury yet. Here’s how I’ve gotten these drivers into my image.

 

The major prerequisite is that you’ll need the Windows AIK tools installed on your server. They can be found here:

http://www.microsoft.com/downloads/en/details.aspx?familyid=696DD665-9F76-4177-A811-39C26D3B3B34&displaylang=en

Note: you’ll need to have extracted folders of each driver you wish to inject, with the .INF file available. For each model, put all your drivers in it’s own folder under the master one. For example:

  • E5420
    • Video
    • LAN
    • Audio
    • Chipset

First, open the WDS console, and export the image you want to modify. Right click on the image, and choose Export. Export it to D:\ExportedImages

WDS Export image right click context menu

Then, from an elevated command prompt window, run the following (two separate lines):

"C:\program files\windows aik\tools\petools\copype.cmd" amd64 d:\windowspe-amd64
Imagex /mountrw D:\ExportedImages\Windows7-x64-Field.wim 1 mount

Then copy d:\windowspe-amd64\mount\windows\system32\dism.exe to d:\windowspe-amd64\mount\windows\system32\dism\

Use the following command template to inject the drivers for each system:

dism.exe  /image:d:\windowspe-amd64\mount /add-driver /driver:d:\drivers\E6420\ /recurse

When completed, run this command:

imagex /unmount /commit mount

Now re-import the image, either by adding, or replacing the existing one from the right click menu.

Replace WDS image

SSRS – Get date parameter as end of day

I’ve built a report within SQL Services Reporting Services 2005 (SSRS) that pulls its data based on a date range, chosen through start and end date parameters.

The problem is, if on those parameters I choose April 21st, it’s actually choosing April 21: 00:00. This means if there’s any data that is relevant during the day on April 21st, it wouldn’t be selected.

I needed a way to have my user select April 21st, but have it return values for end of day April 21st. The solution actually proved easier than I originally thought, as I was making it too complicated.

Full credit to Samson Loo who posted about this (outside of SSRS) here: http://justsamson.com/2010/09/19/date-parameters-and-things-to-consider/

 

My dataset and linked functions all reference the parameter @EndDate, so I didn’t want to go through and change all of that.

Instead, I created a new report parameter called @EndDateEOD, and set its properties to what @EndDate originally was.

Parameter for EndDateEOD

I made sure to place this new parameter above my existing @EndDate.

Then I modified @EndDate to make it hidden, and set this as the default value:

=DateAdd("d",1,Parameters!EndDateEOD.Value)

 

This is adding one day to what the user selects. At first glance this seems like it would produce incorrect information, however in reality, if a user selects April 21st (in reality April 21 00:00:00), then this will use the date April 22 00:00:00 in the dataset, which is what we want.

Searching folder across VPN produces no results

I came across an issue where a user on Windows XP was using Windows Explorer to search within a folder located in a branch office across a VPN. However, their search produced no results, even when it was confirmed there should be.

After some digging I found a Microsoft hotfix that fixed this, but it wasn’t easy to find so hopefully this post may help others find it sooner.

The hotfix is available from this article:

http://support.microsoft.com/kb/885843

 

When you run a search for files or for folders across a slow network link in Microsoft Windows Server 2003 or in Microsoft Windows XP, the search result set is empty. This symptom occurs even though the files or the folders in question actually exist. Additionally, you receive the following message:

"Search is complete. There are no results to display."

For example, you may experience this problem when you search a remote mapped drive over a wide area network (WAN) link.

BigBlueButton

BigBlueButtonA quick review of BigBlueButton, and how I customized it for our corporate purposes.

 

I’ve been looking for a good web conference and desktop sharing application for a while now. We used to use DimDim, until it got bought out by Salesforce and shutdown.

I briefly used Mikogo, and really liked its scheduling features. However, the performance was poor and it was limited to 10 attendees. Also, it didn’t provide audio or video functionality. This wasn’t a deal breaker, however it sucks to have to use multiple tools for related purposes.

I finally stumbled upon BigBlueButton. This is an open source project originally designed for Academia; it is very feature rich and was relatively easy to set up (for an open source project). One of its most attractive features to me is the fact that it sits in my LAN, instead of a provided service. Since we’ll be using this to communicate between departments and branch offices, the latency is MUCH lower across our VPN’s rather than to an outside service. This gives much better performance than anything we’ve tried yet.

Some of the things it does, and we’ll be using it for:

  • Multiple meeting rooms for separate groups of users
  • Document sharing and whiteboard
  • Audio & video conferencing
  • Public and private chat
  • Desktop sharing (full screen or region)

I set up my environment from the VMware image, but I’ll be trying to convert that vmdk to a VHD for Hyper-V soon so it can run in my Hyper-V cluster.

I only ran into a couple problems (audio application freeswitch didn’t install correctly) but the documentation wiki was very helpful in getting those problems resolved. Overall the support resources are excellent.

 

My first real issue with BigBlueButton (and the ultimate reason for this blog post) was that the default installation is very “demo” oriented. This is what the default screen appears like:

DemoScreen

The obvious problem with this screen is that it seems “temporary”, unfinished and unsuited for our organization. It is targeted at someone like myself, who is interested in the latest features and the API examples.

However, I needed a default interface that made it simple for my users to join a meeting room, with a clean looking page and helpful information. Here’s what I’ve ended up with:

Customized company portal for virtual boardrooms

Other than the obvious cosmetic changes, the primary changes I’ve made showing a list of meeting rooms available, and displaying those currently in a meeting. The code for these two features comes from two of the demo.jsp pages provided with BigBlueButton.
On your site you can find them by navigating to http://yoursite/bigbluebutton/demo/demo2.jsp.

These jsp files are located at var/lib/tomcat6/webapps/bigbluebutton/demo

These are the demo page purposes:

  • Demo2.jsp – Join a selected course from a list
  • Demo3.jsp – Join a course from a list with a password
  • Demo4.jsp – Activity monitor

The index page that needs to be modified is located here: /var/www/bigbluebutton-default/index.html

To redesign my index.html page I took the form from demo2.jsp, and inserted it into the “Join” div; I then copied the demo4.jsp page, stripped out the header and extra content, and then made an iframe on my index.html to point to this new .jsp page.

I then added a bit of text as a description for my users, in an collapsible div for a clean look, and modified the design of the page to fit our company design.

Update: here’s the actual code behind the index.html file:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>BigBlueButton -- Open Source Web Conferencing</title>
<link rel="stylesheet" href="css/style.css" type="text/css" />
</head>
 
<script type="text/javascript">
        function autoFocus() {
                document.getElementById("username").focus();
        }
</script>
<script language="javascript">
             function toggleDiv(divid) {
                 if (document.getElementById(divid).style.display == 'none') {
                     document.getElementById(divid).style.display = 'block';
                 } else {
                     document.getElementById(divid).style.display = 'none';
                 }
             }
</script>
 
<body onload="autoFocus();" class="nobackground">
 
        <div id="login"> 
 
        	<h1 class="logo"> 
            	<a href="">Login Page</a> 
            </h1> 
            <h1 class="loginheading">Virtual Boardrooms</h2> 
             <div id="login-form">
                    <h2>Introduction</h2>
                    <p><a class="speciallink" href="javascript:;" onmousedown="toggleDiv('description');">Click twice to expand introduction</a></p>
                    <div id="description">
                        <p>Using BigBlueButton, we have set up a central site to provide web conferencing access.  This is primarily used for:</p>
                            <p> - Document & whiteboard sharing<br />
                             - Presenting what is on the screen to attendees<br />
                             - One-to-many audio conference (ie: a single presenter with limited audience interaction)</p>
                        <p>This tool is not as effective for video and audio conferencing together, as they typically aren't synchronized together. A future version of BigBlueButton is addressing this problem, so in the future this may be the only tool we need.</p>
                        <p>To facilitate video conferencing, we recommend you use the video conferencing information on the wiki <a href="http://wiki/resources/virtual_boardrooms">here</a>.</p>
 
                    </div>
					<div id="join">
					    <h2>Join a Meeting Room</h2>
                            <FORM NAME="form1" METHOD="GET" action="/bigbluebutton/demo/demo2.jsp">
                                <p>Enter your name:</p>
                                <input type="text" id="username"  name="username" size="29" /><br /><br />
						        <p>Select a meeting room:</p>
						        <select name="meetingID">
				                    <option value="BrownBag">Brown Bag Sessions</option>
				                    <option value="BusDev">Business Development</option>
				                    <option value="Geomatics">Engineering</option>
				                    <option value="Geomatics">Geomatics</option>
				                    <option value="General">General</option>
			                    </select>	
						        <input type="submit" value="Join"/> 
                                <input TYPE="hidden" NAME="action" VALUE="create">
 
                            </form>
				        <br /><br />
						<p>For <b>multi-party video conferencing</b>, you can use this <a href="http://vbr/mpvideo.html">virtual boardroom</a>.
					    <p>If you have a regularly scheduled meeting and would like a specific virtual boardroom added, please email <a href="mailto:"> Jeff Miles</a></p>
					    <br />
					    <p>For a tutorial on using certain features of this tool, <a href="http://www.bigbluebutton.org/overview">click here</a></p>
				   </div>
		           <div id="currentactivity">
                        <h2>Current Activity</h2>
                        <iframe src="http://vbr/bigbluebutton/demo/activity.jsp" width="490" height="400" frameborder="0" scrolling="no" />		
                   </div>				      
            </div>
        <div id="footer">
                        <div id="footCenter">
                        <p>Copyright © 2010 <a href="http://bigbluebutton.org/">BigBlueButton Inc.</a></p></div>
 
                </div><!--end footer-->
</body>
</html>

I haven’t modified the actual BBB client, as this requires recompiling the swf files. It’s pretty brand neutral as it is, so I don’t think I’ll be doing anything there.

 

Overall the performance of BigBlueButton has been great. Document and screen sharing is crisp and smooth, and the video looks great. This is something we’re going to begin using immediately, especially since it is leagues ahead of other tools in features and performance.

My only complaint, and it is a deal breaker for certain uses, is that the audio and video don’t sync up. The audio is typically 2-3 seconds behind the video, which makes it unusable for video conferencing. For now we will be using the opentok basic embed to facilitate video conferencing.

I have heard from the mailing list that version .80 will have a different method of providing audio, one that doesn’t have the lag the current version does. Once this is released we will be trying that out and hopefully dumping opentok and use BigBlueButton exclusively.