﻿TechSpoken - YAPS"Any ideas?" is the most frequently-asked question in technical forums. My answer is: yes.http://www.spacefold.com/lisa/
http://www.rssboard.org/rss-specificationBlogEngine.NET 3.3.5.0en-UShttp://www.spacefold.com/lisa/opml.axdhttp://www.dotnetblogengine.net/syndication.axd?format=rssLisa Slater NichollsTechSpoken38.107500-122.568600YAPS about SSRS Branding<p><a title="YAPS about ReportManager" href="http://www.spacefold.com/lisa/post/2018/04/28/yaps-about-report-manager-making-do-with-data-driven-subscriptions.aspx" target="_blank">Last time</a> I posted (and I can't believe it was several months ago), I indicated that I was done with writing about branding because it's so much easier in 2016 - and it is.</p>
<h3>Except...</h3>
<p>In the past couple of weeks I've had to downgrade a couple of servers from Enterprise to Standard Edition, including a server hosting SSRS 2016.&nbsp; I used <a title="The Rambling DBA downgrades SQL editions" href="https://www.sqlskills.com/blogs/jonathan/downgrading-sql-server-editions/" target="_blank">these instructions</a>, btw, which really work, although I've scripted and saved out every piece of server information/config I could think of, each server, just in case.</p>
<p>Until doing so, I hadn't realized that the Standard Edition doesn't have the nice branding capability found in Enterprise.&nbsp; It's actually <a title="SSRS edition differences" href="https://docs.microsoft.com/en-us/sql/reporting-services/reporting-services-features-supported-by-the-editions-of-sql-server-2016?view=sql-server-2017" target="_blank">documented</a>&nbsp;that the feature isn't supported in Standard, I just hadn't noticed.&nbsp; But I did, when I downgraded this instance.&nbsp; See?</p>
<p><img src="data:image/png;base64,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vBSwkiaSAAmQAAmQAAkkCwF68JJlJmgHCZAACZAACZAACcSJAAVenECyGRIgARIgARIgARJIFgIUeMkyE7SDBEiABEiABEiABOJEgAIvTiDZDAmQAAmQAAmQAAkkCwEKvGSZCdpBAiRAAiRAAiRAAnEiQIEXJ5BshgRIgARIgARIgASShQAFXrLMBO0gARIgARIgARIggTgRoMCLE0g2QwIkQAIkQAIkQALJQoACL1lmgnaQAAmQAAmQAAmQQJwIUODFCSSbIQESIAESIAESIIFkIUCBlywzQTtIgARIgARIgARIIE4EKPDiBJLNkAAJkAAJkAAJkECyEKDAS5aZoB0kQAIkQAIkQAIkECcCFHhxAslmSIAESIAESIAESCBZCFDgJctM0A4SIAESIAESIAESiBMBCrw4gWQzJEACJEACJEACJJAsBCjwkmUmaAcJkAAJkAAJkAAJxIkABV6cQLIZEiABEiABEiABEkgWAhR4yTITtIMESIAESIAESIAE4kSAAi9OINkMCZAACZAACZAACSQLAQq8ZJkJ2kECJEACJEACJEACcSLw/wPH58GcDFIXpgAAAABJRU5ErkJggg==" alt="" /></p>
<h3>Except...</h3>
<p>The astute among you may notice that, although the tab is missing, and although I didn't do anything to make this happen, the custom branding still appears to be in place, in the second screen shot.&nbsp;</p>
<h3>... Hmmm.</h3>
<p>Gives you something to think about.&nbsp; Although downgrading requires you to be very fastidious about keeping to the same folders for your replacement/downgraded installation, I doubt that this has anything to do with customized files left on disk by the Enterprise uninstall.</p>
<p>It's far more likely to be due to my use of the same ReportServer database after the downgrade.&nbsp; Take a look at the contents of the Catalog table, and you'll see that my uploaded zipfile from the Enterprise installation remains in the table:</p>
<p><img src="data:image/png;base64,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" alt="" /></p>
<p>... as do the contents of the zip file, as additional rows.&nbsp; The ParentID for DUoC.zip is still UniversalBrand.&nbsp; And the UniversalBrand rows' Property XML points to the DUoC.zip record, I guess, as the in-use branding:</p>
<p><img src="data:image/png;base64,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" alt="" /></p>
<p>... so it looks to me that, if you put the proper contents into a ReportServer db, even without downgrading, you can have custom branding according to the new/zipfile packaging system in SSRS 2016.</p>
<h3>What else is possible?</h3>
<p>I wonder if I could brand a Developer instance and then use that ReportServer catalog for a branded Standard instance?</p>
<p>Hmm.. maybe this is one of the reasons that upgrading a Developer instance is no longer supported to anything but an Enterprise edition.&nbsp; As recently as 2014, this was not the case.&nbsp; Here,&nbsp;<a title="supported edition upgrades" href="https://docs.microsoft.com/en-us/sql/database-engine/install-windows/supported-version-and-edition-upgrades?view=sql-server-2017" target="_blank">look for yourself</a> at the difference.</p>
<p>I hope somebody writes and tells me, if you've played with this.</p>http://www.spacefold.com/lisa/post/2018/07/18/yaps-about-ssrs-branding.aspx
lisa@spacefold.comhttp://www.spacefold.com/lisa/post/2018/07/18/yaps-about-ssrs-branding.aspx#commenthttp://www.spacefold.com/lisa/post.aspx?id=61761b95-2904-4eea-8fdd-1277a8baaa83Wed, 18 Jul 2018 04:52:00 -0600ReportingSQL ServerYAPSLSNhttp://www.spacefold.com/lisa/pingback.axdhttp://www.spacefold.com/lisa/post.aspx?id=61761b95-2904-4eea-8fdd-1277a8baaa830http://www.spacefold.com/lisa/trackback.axd?id=61761b95-2904-4eea-8fdd-1277a8baaa83http://www.spacefold.com/lisa/post/2018/07/18/yaps-about-ssrs-branding.aspx#commenthttp://www.spacefold.com/lisa/syndication.axd?post=61761b95-2904-4eea-8fdd-1277a8baaa83YAPS about Report Manager: Making Do with Data-Driven Subscriptions<p>I have often talked about how much I dislike the Report Manager and why I think it shouldn't be exposed to end-users, or be considered a proper UI for production work (see:&nbsp;<a title="I hope I gave enough reasons here" href="http://www.spacefold.com/lisa/post/2011/07/03/Nixing-the-Report-Manager.aspx" target="_blank">Nixing the Report Manager</a>&nbsp;for what I hope is my final word on that subject).&nbsp; I've also explained that I think the wizards for creating subscriptions as part of the Report Manager are somewhat ridiculous, and easily bested by a small amount of code. (See: <a title="non-standard SSRS subscriptions" href="http://www.spacefold.com/lisa/post/2012/09/06/When-standard-SSRS-subscriptions-are-not-enough.aspx" target="_blank">here</a> and <a title="more fun with custom-built subscriptions, for custom-built Excel" href="http://www.spacefold.com/lisa/post/2010/02/07/YAPS-on-Custom-Excel-for-RS-Drive-Subscriptions-with-a-Stick-Shift.aspx" target="_blank">here</a> for examples.)</p>
<p>But, at <a title="Dominican University of California, my day gig" href="http://www.dominican.edu/" target="_blank">Dominican</a>, the Report Manager is what we have, and we get quite a lot done with it.&nbsp; (For examples of how I try to wring the last bit of functionality out of the UI and its underlying capabilities, see <a title="validate report parameters without a custom UI to accept those parameters" href="http://www.spacefold.com/lisa/post/2017/01/22/Never-say-never-even-when-it-comes-to-the-Report-Manager-validating-parameters.aspx" target="_blank">here</a>, <a title="Report Manager usage logs" href="http://www.spacefold.com/lisa/post/2017/03/15/Analyzing-Report-Manager-Usage-As-If.aspx" target="_blank">here</a>, or <a title="Report Manager custom branding" href="http://www.spacefold.com/lisa/search.aspx?q=branding" target="_blank">search for branding</a> on this blog. I'd be updating that mini-series on Report Manager branding for 2016 if it wasn't so much easier that I didn't think it was worth a post... if you write and tell me differently, I'll post something.)</p>
<p>I've been finding, in fact, that some of my fancy-ass work to make data-driven subscriptions better can be done quicker by&nbsp;<em>not</em>&nbsp;avoiding that crappy wizard, and just writing the proper code in-situ.</p>
<h3>To review</h3>
<p>One of the best reasons to use a data-driven subscription is to obviate the sending of the subscription at all when it's not needed.</p>
<p>I've written about this before (for example, <a title="dynamic &quot;send&quot; results need dynamic recipients" href="http://www.spacefold.com/lisa/post/2011/05/17/Getting-there-from-here-is-a-game-of-inches-Self-service-data-cleansing-with-SSRS-subscriptions.aspx" target="_blank">here</a>) but I'll cut this down to the bare requirement:&nbsp; You don't want anything to go out when you're attempting to get somebody to perform a task by sending the report, but right now there is no task to perform.&nbsp; For example, no account out of balance, or no instance of a particular data anomaly to be listed in the report and cleaned up&nbsp;.</p>
<p>You accomplish this very simply in a data-driven subscription by defining the recipients as follows -- you can write this code directly in the stupid Wizard box, or write a stored procedure, doesn't matter:</p>
<pre class="brush:sql;auto-links:false;toolbar:false" contenteditable="false">declare @auditCount as int&nbsp; = 0;
-- get a count of the rows that would be contained in the
-- report you'd be sending via subscription:
-- this query should be a simplified version
-- of the results query in your report,
-- with parameters replaced by the values
-- you're actually using in your subscription,
-- whether default or derived by expression:
select @auditcount = count(*)
from&nbsp;whatever
join&nbsp;whatever
on&nbsp;x = y
where something;
-- here's the important bit:
select 'your recipient list' as EmailTo, 'your CCs' as EmailCC
-- add whatever other columns you wish to data-drive&nbsp;
-- in the subscription, here, and add this important clause:
where @auditcount &gt; 0 ;</pre>
<h3><br />Now extend that thought</h3>
<p>One of my persistent gripes about the stupid Wizard is the limited nature of the scheduler portion, which is not only&nbsp;<em>not&nbsp;</em>data-driven but also terminally inflexible.&nbsp;&nbsp;</p>
<p>I mean, come on, does anybody even think the Start time&nbsp; makes any sense, as implemented, for an hourly subscription?</p>
<p>&nbsp;<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAFyCAYAAAApuaQRAAAgAElEQVR4Ae29e6wk9Xnn/R3D4qwTY8lNEo7Xds+w4thedwax410KxhJMPG3jKQkmkZcez5qx8dsKG00Sn+O8yIMnLcTbZpkIr/s4CdKO1bFjSA7TyPIOI5UNbtuAlIEiC0GQxpdDwkzHjs+8yjR/YMcKvHjPq+dXt19VV1f1/fo90qjr8rs8z+dXl289z69qtm1tbW2BfyRAAiRAAiRAAiRAAkMj8IahtcSGSIAESIAESIAESIAEFAEKLB4IJEACJEACJEACJDBkAhRYQwbK5kiABEiABEiABEiAAovHAAmQAAmQAAmQAAkMmQAF1pCBsjkSIAESIAESIAESoMDiMUACJEACJEACJEACQyZAgTVkoGyOBEiABEiABEiABCiweAyQAAmQAAmQAAmQwJAJUGANGSibIwESIAESIAESIAEKLB4DJEACJEACJEACJDBkAhRYQwbK5kiABEiABEiABEiAAovHAAmQAAmQAAmQAAkMmQAF1pCBsjkSIAESIAESIAESoMDiMUACJEACJEACJEACQyZAgTVkoGyOBEiABEiABEiABCiweAyQAAmQAAmQAAmQwJAJUGANGSibIwESIAESIAESIAEKLB4DJEACJEACJEACJDBkAhf++Mc/HnKTbI4ESIAESIAESIAEFpvAtr17926lIVhfX08rwv0kQAIkQAIkQAIkQAIuAaYIeSiQAAmQAAmQAAmQwJAJUGANGSibIwESIAESIAESIAEKLB4DJEACJEACJEACJDBkAhRYQwbK5kiABEiABEiABEiAAovHAAmQAAmQAAmQAAkMmQAF1pCBsjkSIAESIAESIAESoMDiMUACJEACJEACJEACQyZAgTVkoGyOBEiABEiABEiABCiweAyQAAmQAAmQAAmQwJAJUGANGSibIwESIAESIAESIAEKLB4DJEACJEACJEACJDBkAhRYQwbK5kiABEiABEiABEiAAovHAAmQAAmQAAmQAAkMmQAF1pCBsjkSIAESIAESIAESoMDiMUACJEACJEACJEACQyZAgTVkoGyOBEiABEiABEiABCiweAyQAAmQAAmQAAmQwJAJUGANGSibIwESIAESIAESIAEKLB4DJEACJEACJEACJDBkAhRYQwbK5kiABEiABEiABEiAAovH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ARIgARKYPAEKrMmPAS0gARIgARIgARKYMwIUWHM2oHSHBEiABEiABEhg8gQosCY/BrSABEiABEiABEhgzghQYM3ZgNIdEiABEiABEiCByROgwJr8GNACEiABEiABEiCBOSNAgTVnA0p3SIAESIAESIAEJk+AAmvyY0ALSIAESIAESIAE5owABdacDSjdIQESIAESIAESmDwBCqzJjwEtIAESIAESIAESmDMCFFhzNqB0hwRIgARIgARIYPIEKLAmPwa0gARIgARIgARIYM4IUGDN2YDSHRIgARIgARIggckToMCa/BjQAhIgARIgARIggTkjQIE1ZwNKd0iABEiABEiABCZPgAJr8mNAC0iABEiABEiABOaMAAXWnA0o3SEBEiABEiABEpg8AQqsyY8BLSABEiABEiABEpgzAhRYczagdIcESIAESIAESGDyBC4cpwkXXjjW7sbpGvsiARIgARIgARKYEQKvv/76yC0dq+IZh0MjJ8YOSIAESIAESIAESCCFAFOEKYC4mwRIgARIgARIgAR6JUCB1SsxlicBEiABEiABEiCBFAIUWCmAuJsESIAESIAESIAEeiVAgdUrMZYnARIgARIgARIggRQCFFgpgLibBEiABEiABEiABHolQIHVKzGWJwESIAESIAESIIEUAhRYKYC4mwRIgARIgARIgAR6JUCB1SsxlicBEiABEiABEiCBFAIUWCmAuJsESIAESIAESIAEeiVAgdUrMZYnARIgARIgARIggRQCFFgpgLibBEiABEiABEiABHolQIHVKzGWJwESIAESIAESIIEUAhRYKYC4mwRIgARIgARIgAR6JUCB1SsxlicBEiABEiABEiCBFAIUWCmAuJsESIAESIAESIAEeiVAgdUrMZYnARIgARIgARIggRQCFFgpgLibBEiABEiABEiABHolQIHVKzGWJwESIAESIAESIIEUAhRYKYC4mwRIgARIgARIgAR6JUCB1SsxlicBEiABEiABEiCBFAIUWCmAuJsESIAESIAESIAEeiVAgdUrMZYnARIgARIgARIggRQCFFgpgLibBEiABEiABEiABHolQIHVKzGWJwESIAESIAESIIEUAhRYKYCGt7uBimHAkH8rFlrDa7jvllrWimOPYaDS6LuZLioO6vug9bswkUVIgARIgARIYIgEZl5gpYmEtP1DZMmmSIAE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" alt="" /></p>
<p>Hmph. My typical requirements for subscription scheduling are more like</p>
<blockquote>
<p>"For&nbsp;some months, run it every hour&nbsp;<strong>during business hours only</strong>, and for other months, run it once a day."&nbsp;</p>
</blockquote>
<p>&nbsp;</p>
<p>... this is usually added into the the instruction&nbsp;to suppress the email notification whenever&nbsp;there was no data to report -- which I'd easily be able to take care of in a wizard-based subscription, as sketched above.</p>
<p>Recently I had one of these requests, and I was about to spend some time putting together a custom subscription job, as I have in the past. Then I realized I only had to extend what I was already doing a little bit and I was there.&nbsp; I just needed to add a bit to the suppression criteria.</p>
<p>So, after evaluating the count of rows to be reported, in the code sketch above, and before the "important bit" that actually determines the recipients, insert the following code:</p>
<pre class="brush:sql;auto-links:false;toolbar:false" contenteditable="false">if @auditcount &gt; 0
begin
declare @today as datetime = getdate() ;
declare @thisHour as int = DatePart(hour,@today),
@thisMonth as int = DatePart(month,@today) ;
if @thisMonth in (1,2,3,9,10)
begin
if @thisHour != 8
begin
set @auditCount = 0 ;
end ;
end ;
else
begin
if @thisHour &lt; 8 or @thisHour &gt; 19
begin
set @auditCount = 0 ;
end ;
end
end ;
</pre>
<p>... now we've effectively suppressed the report, even if there is data, except when it is wanted.</p>
<p>If you've done this right, you'll see this type of result (not an error), when the subscription doesn't run because of your ever-more-complex criteria:</p>
<p><img src="data:image/png;base64,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" alt="" /></p>
<h3>For the purists among you...</h3>
<p>Well, yes, it's not gorgeous code, and I'm sure you could write it better.&nbsp;</p>
<p>And, again, nobody likes typing into those stupid subscription text boxes, but you can see how to&nbsp;add this in&nbsp;your stored procedure, can't you?</p>
<p>I think I'm done.</p>http://www.spacefold.com/lisa/post/2018/04/28/yaps-about-report-manager-making-do-with-data-driven-subscriptions.aspx
lisa@spacefold.comhttp://www.spacefold.com/lisa/post/2018/04/28/yaps-about-report-manager-making-do-with-data-driven-subscriptions.aspx#commenthttp://www.spacefold.com/lisa/post.aspx?id=615d9bb3-75c5-4b4a-bc3b-92967dbb6336Sat, 28 Apr 2018 02:47:00 -0600ReportingSQL ServerYAPSLSNhttp://www.spacefold.com/lisa/pingback.axdhttp://www.spacefold.com/lisa/post.aspx?id=615d9bb3-75c5-4b4a-bc3b-92967dbb63360http://www.spacefold.com/lisa/trackback.axd?id=615d9bb3-75c5-4b4a-bc3b-92967dbb6336http://www.spacefold.com/lisa/post/2018/04/28/yaps-about-report-manager-making-do-with-data-driven-subscriptions.aspx#commenthttp://www.spacefold.com/lisa/syndication.axd?post=615d9bb3-75c5-4b4a-bc3b-92967dbb6336Brevity is usually the Soul of Witless<h2>I really hate Twitter.</h2>
<p>&nbsp;</p>
<blockquote>
<p>Oh, but you know that.&nbsp; You've seen how long my blog posts are.</p>
</blockquote>
<p>&nbsp;</p>
<p>No, <strong>really</strong>.&nbsp; I'm tired not only of people who think deep and significant ideas can be reduced to a maximum number of characters, or that political discourse in this country should be reduced to that level, but also of all other twits who mistake vapid-and-incomplete for pithy-and-curated in the tech realm.</p>
<p>Complexity takes length and time, to consume as well as to create.&nbsp; &nbsp;</p>
<p>Deal with it, or you won't have a foundation for&nbsp;<em>whatever</em> you are trying to build.</p>
<h2>Shiny?</h2>
<p>I'm also not enamored of people who mistake form for substance.&nbsp;</p>
<p>OTOH, I just spent a lot of time upgrading my<a title="BlogEngine GitHub repository" href="https://github.com/rxtur/BlogEngine.NET" target="_blank"> BlogEngine</a> instance and I spent more time tweaking my styles and theme than anything else to do it.&nbsp;</p>
<p>Why? Because I'm willing to concede that&nbsp;enabling the consumer to get through a complex, wordy topic in an organized,&nbsp;engaging presentation&nbsp;is part of the creator's job.</p>
<p>So here's a short but maybe still&nbsp;substantial post, to test the new form.</p>
<h2>YAPS on Report Subscriptions: Moving an SSRS instance to another server</h2>
<p>The steps to move an SSRS instance are pretty straightforward, in the main, but in the midst of a production move, you may find yourself with two running instances temporarily.&nbsp; (Not talking about a desired scale-out, here.)&nbsp; Here's some simple code I use to generate statements that will disable all SSRS-owned subscriptions on a server.</p>
<pre class="brush:sql;auto-links:false;toolbar:false" contenteditable="false">use msdb
go
select 'exec dbo.sp_update_job @enabled = 0, @job_name = '''+ name + '''' as cmd
, * from sysjobs
where enabled = 1 and
(
&nbsp; &nbsp; &nbsp;try_convert(uniqueidentifier,name,0) is not null
&nbsp; &nbsp; &nbsp;--len(name) = len(replace(name,'-','')) + 4 if lower than 2012 is a hacky subst
&nbsp; &nbsp; &nbsp; or description like 'This job is owned by a report server process%'
) ;
</pre>
<p>&nbsp;</p>
<p>I save the generated statements to a file, so that I can re-enable exactly that set of jobs (or mark them in some other way) later.</p>
<p>I could go on here (what else is entailed in moving an SSRS instance?&nbsp; What are the soup-to-nuts steps?)... you know I'm good for it...</p>
<p>But this time, I won't.</p>
<p>And just to show you I'm not entirely a curmudgeon, I'm going to enable comments on this post, to see what happens.&nbsp;</p>
<p>Mind you, if I get blasted with cr*p, comments are going right back off.&nbsp;</p>http://www.spacefold.com/lisa/post/2017/11/19/brevity-is-usually-the-soul-of-witless.aspx
lisa@spacefold.comhttp://www.spacefold.com/lisa/post/2017/11/19/brevity-is-usually-the-soul-of-witless.aspx#commenthttp://www.spacefold.com/lisa/post.aspx?id=cea387f8-f59d-4814-a563-a460fbb8961fSat, 18 Nov 2017 17:26:00 -0600ReportingSQL ServerYAPSLSNhttp://www.spacefold.com/lisa/pingback.axdhttp://www.spacefold.com/lisa/post.aspx?id=cea387f8-f59d-4814-a563-a460fbb8961f0http://www.spacefold.com/lisa/trackback.axd?id=cea387f8-f59d-4814-a563-a460fbb8961fhttp://www.spacefold.com/lisa/post/2017/11/19/brevity-is-usually-the-soul-of-witless.aspx#commenthttp://www.spacefold.com/lisa/syndication.axd?post=cea387f8-f59d-4814-a563-a460fbb8961fEverything and nothing<p>Hello again.&nbsp; I know it's been a while.</p>
<p>Two days after I last wrote, <a title="introducing Ruby and Bustomer" href="http://spacefold.com/lisa/post/2012/03/20/The-One-Size-Fits-All-RDL.aspx" target="_blank">Ruby T. Kitten</a> went missing.&nbsp; I was on a business trip at the time, and when I came back, I just didn't have the heart to write about anything for a while.</p>
<p>When I came "back to it", the prospect was less and less inviting, somehow, as I battled wave after wave of spam comments and received more requests for having phony links removed from my site than requests for help from legitimate developers.</p>
<p>We even had our site hacked, briefly last year.</p>
<h2>I'm closing all comments on TechSpoken today.</h2>
<p>First, I house-cleaned a little and deleted more than 1000 fraudulent comments, a back-breaking task I've had to do regularly in the past year or so.&nbsp; If you had a legitimate comment here and I accidentally removed it at the same time, I do apologize.&nbsp; (OTOH, I'm sure I still <em>left</em> many spam comments in place.&nbsp; I used my best judgement, which is very far from perfect, that's all I can say.)</p>
<p>You are still welcome to email me with questions, and if there is a valuable insight I can provide to the developer community, based on your question, I'll post it here.</p>
<h4>Case in point:</h4>
<p>Dave wrote to ask about how to provide information to a report -- in his case, local time offset -- from the client browser without expecting the user to type it in.&nbsp; I've explained to Dave how to pass a parameter to a report, using standard SSRS URL Access, and provided him with some easy javascript code that will do the trick for him.</p>
<p>If you're interested, drop me a line, and I'll elucidate in a blog post.&nbsp;</p>
<p>Just keep in mind that this isn't something that Report Manager can, or should, handle for you.&nbsp; It's a sample UI, not the be-all and end-all of the SSRS product.&nbsp; I've already written here about <a href="http://spacefold.com/lisa/post/2011/07/03/Nixing-the-Report-Manager.aspx" target="_blank">nixing the Report Manager</a> and really this is the best approach in many scenarios.</p>
<h4>I've written a lot here already</h4>
<p>You'd be surprised how many times I answer somebody's SSRS query by pointing to something I've already written in the past, sometimes with a little extra explanation.&nbsp; That's where my YAPS blog post category came from.</p>
<h2>If and when I continue to post here, there will be some additional changes</h2>
<p>For one thing, now that I'm back to corporate, there are a bunch of things I have agreed not to write about, since there are some intellectual property issues involved, and (more important) there is a potential competitive advantage in practically anything I happen to know.</p>
<p>For another thing, I would be unlikely to have new insights into SSRS, since my job is once more XML- and Integration- centric, and not very concerned with SSRS reports.&nbsp;</p>
<p class="NB" style="padding-left: 30px;">I might want to write a lot more about SSIS, actually, NDA permitting.&nbsp; Anybody out there interested?&nbsp; Ask me a direct SSIS question, so that the problem and the illustrations don't come from my own work, and I will continue to have the same kinds of innovative solutions for you that have appeared here on TechSpoken in the past.</p>
<h2>I'm feeling rather curmudgeonly lately anyway.</h2>
<p>Don't take this as a reflection on my job, which I happen to love, or the people with whom I work there, because they're not the source of the following comments.&nbsp;&nbsp;This is just an&nbsp;observation about the developer&nbsp;community as I perceive it &nbsp;in the brave new world:</p>
<h4>Databases are not something to poke at with a stick</h4>
<p>I'm basically a database-centric developer, let's face it.&nbsp; In fact, I'll go as far as to say I have a deep feeling about beauty inherent in relational schemas and sql syntax, although I enjoy NoSQL dbs as well.</p>
<p>It's an almost physical pain for me to watch a .NET or perl or java team put a huge amount of effort into optimizing their code and making it as elegant in design as they possibly can... and then persist the results in sql databases that are poorly structured and not optimized at all, and&nbsp;accessed in agonizing <a title="Jeff Moden's phrase" href="https://www.simple-talk.com/sql/t-sql-programming/rbar--row-by-agonizing-row/" target="_blank">RBAR</a> syntax.</p>
<p>&nbsp;<em>I don't understand why the integration of the disciplines hasn't come further.&nbsp;</em> In fact, it seems to be&nbsp;much less far along&nbsp;than it used to be.</p>
<h4>FoxPro Nostalgia?</h4>
<p>There seem to be a lot of people (clothing designers, architects, TV shows) with nostalgia for a "simpler" past.&nbsp;A time and place&nbsp;where AIDS didn't exist, global warming hadn't become an obvious part of our future, people had expectations of a rising standard of living for their children without a huge struggle.</p>
<p>So I guess, as an older person, I'm just showing the same kind of feeling here.&nbsp;</p>
<p>I miss a time where the database was a live thing under my fingers, and part and parcel of every coding decision I made.&nbsp; I miss a developer community that would have fallen on the sword rather than waste a byte on disk or a cycle in the processor, and the fact that the database was not exempted from this care.</p>
<h2>I guess I wonder what <em>you </em>think about it...</h2>
<p>If you want to argue the point, or if you have convincing evidence that things are in fact better than they used to be, I'll be delighted.&nbsp; Don't be a stranger; write me an email.</p>
<p>I gotta admit, though: I don't wonder enough to re-open comments.&nbsp;&nbsp;</p>http://www.spacefold.com/lisa/post/2013/06/09/Everything-and-nothing.aspx
lisa@spacefold.comhttp://www.spacefold.com/lisa/post/2013/06/09/Everything-and-nothing.aspx#commenthttp://www.spacefold.com/lisa/post.aspx?id=81246db3-23a2-4b33-84aa-025c8979a886Sun, 9 Jun 2013 00:55:00 -0600ASP.NETGeneral TechSpeakLifeReportingSQL ServerSSISVFP-TMMVisual FoxProXML/XSLTxmlRSDocsYAPSLSNhttp://www.spacefold.com/lisa/pingback.axdhttp://www.spacefold.com/lisa/post.aspx?id=81246db3-23a2-4b33-84aa-025c8979a8860http://www.spacefold.com/lisa/trackback.axd?id=81246db3-23a2-4b33-84aa-025c8979a886http://www.spacefold.com/lisa/post/2013/06/09/Everything-and-nothing.aspx#commenthttp://www.spacefold.com/lisa/syndication.axd?post=81246db3-23a2-4b33-84aa-025c8979a886YAPS again about RS 2008 R2 Branding<p>Oh, all right.</p>
<p>I was not at all surprised when <a title="blog post helping Octoni do what s/he said, but with the sad feeling it wasn't what s/he needed, last time" href="http://spacefold.com/lisa/post/2012/10/31/YAPS-about-SSRS-Branding-in-2008-R2.aspx">Octoni wrote back to say</a> "but can't we just hide the right-side link to Home with CSS"?</p>
<p>Apparently s/he just noticed it. I did try to say.</p>
<p>Well, I don't think you can do this with CSS, because it's in a table cell with a bunch of other content.&nbsp; But below a quick and dirty sketch to show you how you can put a little javascript in the affected ASPX pages (look under ReportManager/Pages) to do what Octoni wants.</p>
<p class="NB">I still say this isn't going to work too well&nbsp;-- because users can still get to the Home page just by looking at&nbsp;the current&nbsp;URL in the Report Manager, wherever they happen to be,&nbsp;and slicing off the end of it.</p>
<p>I had to borrow some code to add load-time functionality into the Report Manager ASPX pages, which I got from <a title="handy dandy loader script" href="http://www.sitepoint.com/forums/showthread.php?645490-Run-Javascript-Only-After-Page-Finishes-Loading" target="_blank">here</a> -- because you need this code to run only after everything else is finished in the internal ASP.NET Report Manager code.&nbsp; If you don't delay this activity, there aren't any tables available for your javascript to see and adjust.</p>
<p>This quick and dirty&nbsp;example worked for me in the Folder.aspx page.</p>
<p class="code"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">script </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/javascript"</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="LSNClientSideSSRSReportManagerCode"&gt;</span> <br /><br />addLoadListener(HideRightSideHomeLink);<br /><br /><span style="color: #0000ff;">function</span> <span>HideRightSideHomeLink() {<br /><br /></span><span style="color: #0000ff;">&nbsp;&nbsp; var</span> bcTable = document.getElementsByTagName(<span style="color: #800000;">"table"</span> )[1];<br /><span style="color: #006400;">&nbsp;&nbsp; // you may not be able to depend on this explicit index, </span><span style="color: #006400;"><br />&nbsp;&nbsp; //you may need to iterate through and look for </span><span style="color: #006400;"><br />&nbsp;&nbsp; // the one with className = "msrs-topBreadcrumb"</span> <br />&nbsp;&nbsp; <span style="color: #006400;">// might be different for each ASPX page for all I know...</span>&nbsp;<br />&nbsp;&nbsp; <span style="color: #0000ff;">var</span> <span>td = bcTable.rows[0].cells[1];<br />&nbsp;&nbsp; </span>&nbsp;td.innerHTML = td.innerHTML.replace( <span style="color: #800000;">'Home'</span> , <span style="color: #800000;">''</span> );<br />&nbsp;} <br /><br /><span style="color: #006400;">// the following function from <br />// <a href="http://www.sitepoint.com/forums/showthread.php">http://www.sitepoint.com/forums/showthread.php</a>? <br />645490-Run-Javascript-Only-After-Page-Finishes-Loading</span> <br /><br /><span style="color: #0000ff;">function</span> <span>addLoadListener(fn) {</span> <br />&nbsp;&nbsp; <span style="color: #006400;">//mozilla and friends</span> <br />&nbsp;&nbsp; <span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">typeof</span> window.addEventListener != <span style="color: #800000;">'undefined'</span> ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;window.addEventListener( <span style="color: #800000;">'load'</span> , fn, <span style="color: #0000ff;">false</span> ); <br />&nbsp;&nbsp; } <br />&nbsp;&nbsp; <span style="color: #006400;">//opera</span> <br />&nbsp;&nbsp; <span style="color: #0000ff;">else</span><span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">typeof</span> document.addEventListener != <span style="color: #800000;">'undefined'</span> ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;document.addEventListener( <span style="color: #800000;">'load'</span> , fn, <span style="color: #0000ff;">false</span> ); <br />&nbsp;&nbsp; } <br />&nbsp;&nbsp; <span style="color: #006400;">//innernetz exploder</span> <br />&nbsp;&nbsp; <span style="color: #0000ff;">else</span><span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">typeof</span> window.attachEvent != <span style="color: #800000;">'undefined'</span> ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;window.attachEvent(<span style="color: #800000;">'onload'</span> , fn); <br />&nbsp;&nbsp; } <br />&nbsp;&nbsp; <span style="color: #006400;">//the rest is pretty much for browsers that I doubt your <br />&nbsp;&nbsp; </span><span style="color: #006400;">//CSS or anything else still supports like IE/Mac</span> <br />&nbsp;&nbsp; <span style="color: #0000ff;">else</span> {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<span style="color: #0000ff;">var</span> <span>oldfn = window.onload;</span> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">typeof</span> window.onload != <span style="color: #800000;">'function'</span> ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;window.onload = fn; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">else</span> {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;window.onload =<span style="color: #0000ff;">function</span> () {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;oldfn(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fn();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;} <br />&lt;/<span style="color: #800000;">script</span><span style="color: #0000ff;">&gt;</span></p>
<p>I imagine the *.aspx pages for Report Manager&nbsp;would all work similarly. And there's probably a better way to do this by subclassing the Report Manager UI classes, but I'm not going to go there, because I think the whole thing is a really bad idea.</p>
<h2>Repeat after me:</h2>
<p><em>I will not fight with the Report Manager UI.&nbsp; <a title="blog post on nixing the Report Manager" href="http://spacefold.com/lisa/post/2011/07/03/Nixing-the-Report-Manager.aspx">I will turn my back on it, and&nbsp;build a better one for my users</a>.</em></p>
<p>Only when you start talking about the Report Manager does the idea of mediocrity become inextricably associated with SQL Server Reporting Services.</p>
<p>Funny. I <a title="proto blog post about why I never used FPW" href="http://spacefold.com/lisa/oldsite/lisa_fox.aspx#no_fpw">used to say</a> something very similar about FoxPro for Windows, in a universe long ago and far away.&nbsp; Or, maybe not so funny.</p>
<p>I'm getting too old for this type of nonsense.</p>http://www.spacefold.com/lisa/post/2012/11/03/YAPS-again-about-RS-2008-R2-Branding.aspx
lisa@spacefold.comhttp://www.spacefold.com/lisa/post/2012/11/03/YAPS-again-about-RS-2008-R2-Branding.aspx#commenthttp://www.spacefold.com/lisa/post.aspx?id=8fa0cce5-14e5-44fb-bcfa-a77e6dea7f48Sat, 3 Nov 2012 08:55:00 -0600ASP.NETReportingSQL ServerYAPSLSNhttp://www.spacefold.com/lisa/pingback.axdhttp://www.spacefold.com/lisa/post.aspx?id=8fa0cce5-14e5-44fb-bcfa-a77e6dea7f480http://www.spacefold.com/lisa/trackback.axd?id=8fa0cce5-14e5-44fb-bcfa-a77e6dea7f48http://www.spacefold.com/lisa/post/2012/11/03/YAPS-again-about-RS-2008-R2-Branding.aspx#commenthttp://www.spacefold.com/lisa/syndication.axd?post=8fa0cce5-14e5-44fb-bcfa-a77e6dea7f48Duplexing... or YAPS on why pagination can't be fun<p>Chris wrote with the following intriguing question.</p>
<blockquote>
<p>Lisa, <br /> Hi...I've been scouring the web to find out how to force ssrs to insert a blank page when a group ends on an odd numbered page thus allowing the next group to start on an odd numbered page. This will allow us to print a large collection of reports double sided and guarantee that each group starts on the front of a new page. You seem to have a great deal of experience and expertise. Could you offer any suggestions? <br /> Thanks, Chris</p>
</blockquote>
<p>Well, I may have a lot of experience, but none of it suggests that this is going to be an easy task.</p>
<p>The problem with any question involving page breaks is that you have to consider (at least) the following potential dealbreakers:</p>
<ul>
<li><strong>Renderer differences. </strong>First, you may&nbsp;not even want the same behavior from one renderer to the next, or you may not want it when the report is running in the browser.&nbsp; For example, in Chris' case, he probably doesn't want this behavior if the report is exported to Excel.&nbsp; Second, if&nbsp;you need to evaluate the number of pages per group in some mechanical manner -- as I was forced to do here -- each renderer may have its own rules for white space, page margins, etc.&nbsp; <br />&nbsp;&nbsp; <br />In Chris' case, we need to get this to work when it's printed interactively. I'm not sure my solution will work without some information about printable area on different printers' pages, but&nbsp;that might be handleable, depending on environment. He also wants&nbsp;the behavior if the PDF output is printed, which does seems reasonable... &nbsp;but as everybody knows the PDF renderer has a pesky habit of changing the available space on the page from what you might expect.<br />&nbsp;&nbsp; <br /></li>
<li><strong>Version differences with respect to our <a title="blog post discussing sequence of events in reports" href="http://spacefold.com/lisa/post/2010/12/04/Everything-has-a-point-Part-Un.aspx">old friends&nbsp;Order O. Evaluation and his kissing cousin Sequence O. Execution</a>.&nbsp; </strong>Regardless of when you want to force a page break, if you involve any custom behavior or code, it's liable not to work the same way from version to version, as the RS gods attempt to optimize RDL behavior further.&nbsp; This goes double for code that also must work across multiple renderers, because anything involving page headers and footers will be handled separately by each renderer, as fits its needs, from the handling of the body collection.&nbsp; <br />&nbsp;&nbsp; <br />In Chris' case, he's using 2008 R2. Several tried-and-true methods I've used before to force a page break, using a special group that called some custom code, just didn't work.&nbsp; I'm not sure why and frankly am just not in the mood to figure out what exactly is different now.</li>
</ul>
<p>I struggled with this for several hours.</p>
<h2>Why bother?&nbsp; What's the excitement?</h2>
<p>I might not have been intrigued with this question except that R2 really does offer a couple of neat new features that looked like they might help, sorta.&nbsp; I don't mean the new reset pages for groups, although somebody else might figure out a way they're handy here (I couldn't).</p>
<p>Let's get started, and you'll see.</p>
<h2>Setup</h2>
<p>Further questions revealed that Chris' report has an outer group on Students with a pagebreak, and an inner group on Classes, which does not pagebreak.&nbsp; The Classes' details list assessments and scores.&nbsp; Maybe this is a Gradebook application or similar; I&nbsp; hope he's not working for one of the vendors I have to deal with at work &lt;sigh&gt;.</p>
<p>I'll mock up the data using a simple query with my usual MySQL World&nbsp;tutorial data:</p>
<p class="code">SELECT Continent AS Student, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Region AS Class,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name AS Assignment,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SurfaceArea AS Score<br /> FROM Country<br /> ORDER BY Student, Class, Assignment</p>
<p>My&nbsp;sample report is also very simple (read on-- I'm not sure how far you are going to be able to "stretch" this solution beyond a simple report, although more than this is definitely possible):</p>
<p>&nbsp;</p>
<p><img style="margin-right: auto; margin-left: auto; display: block;" src="http://www.spacefold.com/lisa/image.axd?picture=2011%2f11%2fDuplex2.png" alt="" /></p>
<p>The grpStudent group is the "real" group.&nbsp; It's got the pagebreak at end that we always want.</p>
<p>As&nbsp;you can see, I've got an extra group outside the "real" Student group.&nbsp; It's got a pagebreak at end also, we just need to figure out how to eliminate it for the groups that don't need it because they have an even number of pages.&nbsp;</p>
<p>Originally I thought I would do this the same way I have in the past, with a dynamic group break using a UDF.&nbsp; In R2, after some gnashing of teeth and the first couple of hours, I just couldn't get this to work.&nbsp; Instead of a UDF,&nbsp; I grouped on the same Student value and used the first of those cool new R2 features that looked so intriguing:</p>
<p>&nbsp;</p>
<p><img style="margin-right: auto; margin-left: auto; display: block;" src="http://www.spacefold.com/lisa/image.axd?picture=2011%2f11%2fDuplex1.png" alt="" /></p>
<p><br />Obviously this new capabiility is going to suppress only the pagebreak, not the entire extra group the way my dynamic group break expression would have done.&nbsp; So, with this technique we'll also need to suppress the group footer row (shown in my sample with the clever "this page intentionally left blank" textbox) whenever we don't need it.&nbsp; Otherwise, that group footer line&nbsp;would show up adjacent to the subsequent group.&nbsp;</p>
<p>The good news is that we'll be able to use exactly the same logic,&nbsp;in the Row Visibility expression, to hide the group footer row with the textbox, that we&nbsp;use in the PageBreak Disabled expression.</p>
<h2>Now, about that logic</h2>
<p>Here comes the really ugly part.</p>
<p>I haven't been able to figure out a way to use those tempting TotalPages values, reset on group, successfully for this purpose.&nbsp; I did try.&nbsp; Instead, I'll have to brute-force the evaluation.&nbsp;</p>
<p>The determination comes down to something like this:</p>
<p><strong><em>Using either a row count or a page height, and evaluating the contents of this group, how many pages does this group take?</em></strong></p>
<p>&nbsp;The required elements are going to be as follows:</p>
<ul>
<li>how many inner groups (in Chris' case, Classes) does this outer group (here, Students) have?&nbsp; How many rows of group header and footer information will each of these inner groups have, and how much space will they take up?</li>
<li>how many detail elements (in Chris' case, Assessments or Assignments and their Scores) are there in this outer group, total?&nbsp; How much space will they take up?</li>
<li>how many rows are needed to express the outer group's headers and footers? How much space will they take up for the group?</li>
<li>how much room is there on each report page ?</li>
</ul>
<p>Each of these elements can be expressed as a&nbsp;RowCount or as a Height.&nbsp; If you're using RowCount, as I am to keep the example simple, you will need to either figure fractional rows to handle rows of different heights (for example, a Class header with a different font), or (as I did in this sample report for simplicity), make all rows the same height.&nbsp; (Fractional rows is not a difficult, or even a wacky idea.&nbsp; Don't be afraid to try it.)</p>
<p>I'm sure you can spot the biggest limitation of this whole approach: <em><strong>I'm not accounting for rows that can grow or shrink.&nbsp; </strong></em></p>
<p class="NB">MAYBE it's possible to do this with code that feeds a code array with textbox heights over the course of the report, but based on my R2 experiments so far, I am not optimistic. I just turned off CanGrow for all the table rows, and left it at that, for now.</p>
<p>I'm <em>not</em> as sure you'll spot another potential difficulty, that we <em>can</em> actually take care of: my&nbsp;final required item is the number of rows, or height available, on a report page, but this is something that changes from renderer to renderer.&nbsp; Here's where another one of the exciting new features of R2 comes in:</p>
<p><img style="margin-right: auto; margin-left: auto; display: block;" src="http://www.spacefold.com/lisa/image.axd?picture=2011%2f11%2fDuplex3.png" alt="" /></p>
<p>Wow! We have access to this information! I don't have to <a title="blog post - watch how Export type is done!" href="http://spacefold.com/lisa/post/2008/03/04/Report-Preprocessing-SQL-Server-Reporting-Server-Group-PageTotals-Walkthrough-Part-I-the-RDL-and-the-Server.aspx">kludge this</a> anymore!&nbsp; I was so exited about this that I included the RenderFormat.Name value in the header of the report, as you can see in the first screenshot above.</p>
<p>So, with that exciting news, and keeping in mind the values we need to calculate, we can use the following expression in both the PageBreak. Disabled expression and the Row.Visibility.Hidden expression (for the extra group footer), passing in what the report can tell us at runtime:</p>
<p class="code">=Code.HideExtraGroup(<br />&nbsp;&nbsp;&nbsp; Globals!RenderFormat.Name,<br />&nbsp;&nbsp;&nbsp; Globals!RenderFormat.IsInteractive,<br />&nbsp;&nbsp;&nbsp; CountDistinct(Fields!Class.Value, <span style="color: #a31515;">"grpExtra"</span>),<br />&nbsp;&nbsp;&nbsp; Count(Fields!Assignment.Value,<span style="color: #a31515;">"grpExtra"</span>))</p>
<p>... and we're going to feed that expression to a function with a method signature that looks like this:</p>
<p class="code">Function HideExtraGroup( _<br />&nbsp;&nbsp; RenderType As String, IsInteractive As Boolean, _<br />&nbsp; &nbsp;InnerGroupCnt As Integer, GroupDetailCnt As Integer ) As Boolean</p>
<p>Now we need to use that information to evaluate each group.&nbsp;</p>
<p>There is at least one element that we should be able to declare once, for every group: that is the count of rows (or amount of space) required by the header(s) and footer(s) for grpStudent.&nbsp; I'll indicate that by declaring a variable I can use in the rest of my calculations.&nbsp; The value is 1 because (a) I'm counting rows, not measuring height, and (b) I only have one header row for each Student, and no footer rows:</p>
<p class="code">Dim OuterGroupHeaderAndFooterRowCount as Integer =1<br /><span style="color: #008000;">' this would be a static height value, instead of static row count,</span><br /><span style="color: #008000;">' if we were working that way for the other values</span></p>
<p>The actual code in the HideExtraGroup implementation I'll provide is pretty trivial, but it shows you all the elements you need to get the job done:</p>
<p class="code">Function HideExtraGroup( _<br />&nbsp;&nbsp; RenderType As String, IsInteractive As Boolean, _<br />&nbsp;&nbsp; InnerGroupCnt As Integer, GroupDetailCnt As Integer ) As Boolean<br />&nbsp;&nbsp;<span style="color: #008000;"> ' TBD: Should IsInteractive or some renderer types&nbsp;&nbsp;<br />&nbsp;&nbsp; ' automatically return True?</span><br /><span style="color: #008000;">&nbsp;&nbsp; ' should Excel renderer automatically return True, to avoid extra blank sheets?</span><br />&nbsp;<br />&nbsp;&nbsp;&nbsp; Dim countRowsInGroup as Integer = _<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InnerGroupCnt + GroupDetailCnt + _<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OuterGroupHeaderAndFooterRowCount<br />&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp; ' this is a very simple version of the calculation needed,&nbsp;</span><br /><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp; ' but it's okay for my simple report, which&nbsp; has only<br />&nbsp;&nbsp;&nbsp;&nbsp; ' one header row (and no footer rows) for each inner group, <br />&nbsp;&nbsp;&nbsp;&nbsp; ' and one detail row for each detail item.<br />&nbsp;&nbsp;&nbsp;&nbsp; ' If yours has more, perform some additional multiplications<br />&nbsp;&nbsp;&nbsp;&nbsp; ' before arriving at this&nbsp;value.<br /></span><br />&nbsp;&nbsp;&nbsp; Dim countRowsPerPage as Integer = _<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetRowsOnPage(RenderType, IsInteractive)<br /><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;This function&nbsp;stubbed in appropriately for my report,&nbsp;below.<br /></span><br />&nbsp;&nbsp;&nbsp; Dim pagesPerGroup as Integer = _<br />&nbsp;&nbsp;&nbsp;&nbsp; Ceiling(countRowsInGroup/countRowsPerPage)<br /><br />&nbsp;&nbsp;&nbsp; Return (pagesPerGroup Mod 2 =0)<br /><br />End Function<br /><br />Function GetRowsOnPage( RenderType As String, IsInteractive As Boolean) As Integer<br />&nbsp;&nbsp; Return 39&nbsp;<br /><br />&nbsp;&nbsp;<span style="color: #008000;"> ' Refine this with renderer type as needed, and </span><br /><span style="color: #008000;">&nbsp;&nbsp; ' add interactive calcs also if really needed <br />&nbsp;&nbsp; ' -- the actual value&nbsp;for each renderer&nbsp;is going to be <br />&nbsp;&nbsp; ' different for every report layout, obviously.<br /><br />&nbsp;&nbsp; ' As with the other calculations, you can do this<br />&nbsp;&nbsp;&nbsp;' in heights rather than row counts if it makes sense<br />&nbsp;&nbsp; ' for your layout.<br /></span><br />End Function</p>
<h2>Well.</h2>
<p>Here's <a href="http://www.spacefold.com/lisa/file.axd?file=2011%2f11%2fDuplexing.pdf">Duplexing.pdf (145.76 kb)</a>, &nbsp;an example of my output (again, using MySQL World to "stand in" for Students and the other values). I'm sure this solution isn't going to suit every case, but it will suit some.&nbsp;&nbsp; If Chris really does work for one of the Gradebook vendors I deal with, it would actually be fine for their reports, which are (to say the most) pedestrian in layout.&nbsp;</p>
<p>Chris may weigh in here with questions or additional requirements, or you might.</p>
<p>And I'll go back to scratching my head about what doesn't work the same way in R2 when I have a chance.</p>
<p>Meanwhile, I am chuffed about those new RDL features R2 gave us to play with.&nbsp; Aren't you?</p>
<p>Some more to be done with them, I'm sure.</p>http://www.spacefold.com/lisa/post/2011/11/11/Duplexing-or-YAPS-on-why-pagination-cant-be-fun.aspx
lisa@spacefold.comhttp://www.spacefold.com/lisa/post/2011/11/11/Duplexing-or-YAPS-on-why-pagination-cant-be-fun.aspx#commenthttp://www.spacefold.com/lisa/post.aspx?id=4893433b-035d-43d8-9e0b-c2d25d1f4215Thu, 10 Nov 2011 22:07:00 -0600ReportingSQL ServerYAPSLSNhttp://www.spacefold.com/lisa/pingback.axdhttp://www.spacefold.com/lisa/post.aspx?id=4893433b-035d-43d8-9e0b-c2d25d1f42150http://www.spacefold.com/lisa/trackback.axd?id=4893433b-035d-43d8-9e0b-c2d25d1f4215http://www.spacefold.com/lisa/post/2011/11/11/Duplexing-or-YAPS-on-why-pagination-cant-be-fun.aspx#commenthttp://www.spacefold.com/lisa/syndication.axd?post=4893433b-035d-43d8-9e0b-c2d25d1f4215YAPS on SSRS Documentation: the Lite version<p>The fully-loaded version of <a title="blog post on updated xmlRSDocs" href="http://spacefold.com/lisa/post/2011/02/27/What-a-difference-a-year-and-a-job-change-make.aspx">xmlRSDocs</a> is invaluable in my work, because it allows me to ferret out every last technical detail about the RDLs on an SSRS Server.&nbsp;</p>
<p>However, when I just want my users to have an idea of the reports available to them in Report Manager,&nbsp;running xmlRSDocs is&nbsp;overkill.&nbsp;&nbsp;I don't need to do an&nbsp;SSIS loop through all the reports in ReportServer.dbo.Catalog, to download the RDL file and parse it. &nbsp;I just want to list the available reports in some organized fashion.</p>
<p>If the report developers in my organization took the time to use the Description when they deployed reports, this generated list would probably have everything users needed... but they don't.</p>
<p>What I really need to do is provide a skeletal document, maybe in Excel or Word, or in HTML suitable for a wiki page. This generated document will get filled in with descriptive content by other personnel.&nbsp;</p>
<p>I can add a bit more generated content, including Description if there is one, and I can generate a formatted Parameters list, and page orientation (using dbo.Catalog's&nbsp;Property column).</p>
<h2>QnD SSRS User Docs: one query, a trivial xslt</h2>
<p>This idea turned out to be pretty easy to implement,&nbsp;using the following query, which translates the results into&nbsp;reasonably-formulated XML using the FOR XML PATH syntax in T-SQL:</p>
<p class="code">&nbsp;<br /> <span style="color: #0000ff;"> select </span> <br />&nbsp;&nbsp; u1<span style="color: #808080;">.</span>UserName <span style="color: #0000ff;">As</span> Creator<span style="color: #808080;">,</span> u2 <span style="color: #808080;">.</span>UserName <span style="color: #0000ff;">As</span> Modifier<span style="color: #808080;">,</span><br /> <span style="color: #0000ff;">&nbsp;&nbsp; Path</span><span style="color: #808080;">,</span> Name<span style="color: #808080;">,</span> ItemID<span style="color: #808080;">,</span> ParentID<span style="color: #808080;">,</span> <br /> <span style="color: #0000ff;">&nbsp;&nbsp; Type</span><span style="color: #808080;">,</span> <span style="color: #0000ff;">Description</span><span style="color: #808080;">,</span> Hidden<span style="color: #808080;">,</span> <br /> &nbsp;&nbsp; CreationDate<span style="color: #808080;">,</span> ModifiedDate<span style="color: #808080;">,</span> MimeType<span style="color: #808080;">,</span> <br /> &nbsp;&nbsp; ExecutionFlag <span style="color: #808080;">,</span> ExecutionTime<span style="color: #808080;">,</span> SubType<span style="color: #808080;">,</span><br /><span style="color: #ff00ff;"> <span style="color: #ff00ff;">&nbsp;&nbsp; cast</span><span style="color: #808080;">(</span>Property <span style="color: #0000ff;">as</span> <span style="color: #0000ff;">xml</span><span style="color: #808080;">),</span> <span style="color: #008000;"> &nbsp; <span style="color: #008000;">-- you need to cast to get rid of the&nbsp;</span><br /> <span style="color: #008000;"><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- yucky escaped text in the ntext column!!</span><span style="color: #008000;"><br /> <span style="color: #ff00ff;"><span style="color: #ff00ff;">&nbsp;&nbsp; cast</span><span style="color: #808080;">(</span>Parameter <span style="color: #0000ff;">as</span> <span style="color: #0000ff;">xml</span><span style="color: #808080;">)</span>&nbsp;&nbsp;&nbsp; <span style="color: #008000;"><span style="color: #008000;">-- ditto here</span><br /> <span style="color: #008000;"><span style="color: #0000ff;"> from</span></span> <span style="color: #0000ff;">Catalog</span> <br /> <span style="color: #808080;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; join </span></span> Users u1 <span style="color: #0000ff;">on</span> <span style="color: #0000ff;">Catalog</span><span style="color: #808080;">.</span>CreatedByID <span style="color: #808080;">=</span> u1<span style="color: #808080;">.</span>UserID<br /> <span style="color: #808080;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; join </span></span> <span style="color: #ff00ff;">Users u2 </span><span style="color: #0000ff;">on</span> <span style="color: #0000ff;">Catalog</span><span style="color: #808080;">.</span><span style="color: #ff00ff;">CreatedByID <span style="color: #808080;">=</span> u2<span style="color: #808080;">.</span>UserID</span><br /> <span style="color: #0000ff;"> for </span></span> <span style="color: #0000ff;">xml</span> <span style="color: #0000ff;">path </span><span style="color: #808080;">(</span><span style="color: #ff0000;">'row'</span><span style="color: #808080;">),</span> <span style="color: #0000ff;">root</span> <span style="color: #008000;"><span style="color: #008000;">-- row is actually the default, but</span><br /> <span style="color: #008000;"><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #008000;">-- I'm making it explicit because</span><br /> <span style="color: #008000;">&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- I'm using it explicitly in the xslt example.<br /> <span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- At no place in the xslt do I explicitly<br /> <span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- use the root node name, so I won't bother<br /> <span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- specifying that one.<br /> </span></span></span></span></span></span></span></span></span></span></span></p>
<p>This simple query plus a little XSLT for whatever output I want is enough to do the trick.&nbsp;</p>
<p>Here's a sample XSLT, showing you how to recursively "visit" all the reports in the server folders; here, we're nesting &lt;UL&gt; elements that would match the server folder organization for our wiki page:</p>
<p class="code"><span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c194KG"><span style="color: #602020;">?xml version="1.0"?</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> <span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:stylesheet </span></span><span class="c18YC0"><span style="color: #d00020;">version=</span></span><span class="c5M9S0"><span style="color: #000090;">"1.0"</span></span><span class="c18YC0"><span style="color: #d00020;"> xmlns:xsl=</span></span><span class="c5M9S0"><span style="color: #000090;">"http://www.w3.org/1999/XSL/Transform"</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span>&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:output </span></span><span class="c18YC0"><span style="color: #d00020;">method=</span></span><span class="c5M9S0"><span style="color: #000090;">"html"</span></span><span class="c18YC0"><span style="color: #d00020;">/</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;<br />&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:template </span></span><span class="c18YC0"><span style="color: #d00020;">match=</span></span><span class="c5M9S0"><span style="color: #000090;">"/"</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c69ORU"><span style="color: #aaaba0;">!-- we're going to recursively go through the tree starting from the root node --</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:apply-templates </span></span><span class="c18YC0"><span style="color: #d00020;">select=</span></span><span class="c5M9S0"><span style="color: #000090;">"/*/row[not(ParentID)]"</span></span><span class="c18YC0"><span style="color: #d00020;"> mode=</span></span><span class="c5M9S0"><span style="color: #000090;">"folder"</span></span><span class="c18YC0"><span style="color: #d00020;">/</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">/xsl:template</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> <br /> &nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:template </span></span><span class="c18YC0"><span style="color: #d00020;">mode=</span></span><span class="c5M9S0"><span style="color: #000090;">"folder"</span></span><span class="c18YC0"><span style="color: #d00020;"> match=</span></span><span class="c5M9S0"><span style="color: #000090;">"row"</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:param </span></span><span class="c18YC0"><span style="color: #d00020;">name=</span></span><span class="c5M9S0"><span style="color: #000090;">"thisFolder"</span></span><span class="c18YC0"><span style="color: #d00020;"> select=</span></span><span class="c5M9S0"><span style="color: #000090;">"./ItemID"</span></span><span class="c18YC0"><span style="color: #d00020;">/</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="cKJK"><span style="color: #006800;">ul</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="cKJK"><span style="color: #006800;">li</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:if </span></span><span class="c18YC0"><span style="color: #d00020;">test=</span></span><span class="c5M9S0"><span style="color: #000090;">"not(ParentID)"</span></span><span class="c9Y6TC"><span style="color: #0000ff;">&gt;</span></span>ROOT <span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">/xsl:if</span></span><span class="c9Y6TC"><span style="color: #0000ff;">&gt;</span></span>Folder <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:apply-templates </span></span><span class="c18YC0"><span style="color: #d00020;">mode=</span></span><span class="c5M9S0"><span style="color: #000090;">"item"</span></span><span class="c18YC0"><span style="color: #d00020;"> select=</span></span><span class="c5M9S0"><span style="color: #000090;">"."</span></span><span class="c18YC0"><span style="color: #d00020;">/</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:apply-templates </span></span><span class="c18YC0"><span style="color: #d00020;">select=</span></span><span class="c5M9S0"><span style="color: #000090;">"/*/row[ParentID=$thisFolder and Type='1']"</span></span><span class="c18YC0"><span style="color: #d00020;"> <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mode=</span></span><span class="c5M9S0"><span style="color: #000090;">"folder"</span></span><span class="c18YC0"><span style="color: #d00020;">/</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:if </span></span><span class="c18YC0"><span style="color: #d00020;">test=</span></span><span class="c5M9S0"><span style="color: #000090;">"/*/row[ParentID=$thisFolder and Type != '1']"</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="cKJK"><span style="color: #006800;">ul</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:apply-templates </span></span><span class="c18YC0"><span style="color: #d00020;">select=</span></span><span class="c5M9S0"><span style="color: #000090;">"/*/row[ParentID=$thisFolder and Type='2']"</span></span><span class="c18YC0"><span style="color: #d00020;"> <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mode=</span></span><span class="c5M9S0"><span style="color: #000090;">"report"</span></span><span class="c18YC0"><span style="color: #d00020;">/</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:apply-templates </span></span><span class="c18YC0"><span style="color: #d00020;">select=</span></span><span class="c5M9S0"><span style="color: #000090;">"/*/row[ParentID=$thisFolder and Type='5']"</span></span><span class="c18YC0"><span style="color: #d00020;"> <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mode=</span></span><span class="c5M9S0"><span style="color: #000090;">"datasource"</span></span><span class="c18YC0"><span style="color: #d00020;">/</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="cKJK"><span style="color: #006800;">/ul</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">/xsl:if</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="cKJK"><span style="color: #006800;">/li</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="cKJK"><span style="color: #006800;">/ul</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">/xsl:template</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> <br /> &nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:template </span></span><span class="c18YC0"><span style="color: #d00020;">match=</span></span><span class="c5M9S0"><span style="color: #000090;">"row"</span></span><span class="c18YC0"><span style="color: #d00020;"> mode=</span></span><span class="c5M9S0"><span style="color: #000090;">"report"</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="cKJK"><span style="color: #006800;">li</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="cLUY2"><span style="color: #ea8f0f;">font </span></span><span class="c18YC0"><span style="color: #d00020;">color=</span></span><span class="c5M9S0"><span style="color: #000090;">"green"</span></span><span class="c9Y6TC"><span style="color: #0000ff;">&gt;</span></span>Report<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="cLUY2"><span style="color: #ea8f0f;">/font</span></span><span class="c9Y6TC"><span style="color: #0000ff;">&gt;</span></span>: <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:apply-templates </span></span><span class="c18YC0"><span style="color: #d00020;">select=</span></span><span class="c5M9S0"><span style="color: #000090;">"."</span></span><span class="c18YC0"><span style="color: #d00020;"> mode=</span></span><span class="c5M9S0"><span style="color: #000090;">"item"</span></span><span class="c18YC0"><span style="color: #d00020;">/</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:apply-templates </span></span><span class="c18YC0"><span style="color: #d00020;">select=</span></span><span class="c5M9S0"><span style="color: #000090;">"./Parameters"</span></span><span class="c18YC0"><span style="color: #d00020;">/</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:apply-templates </span></span><span class="c18YC0"><span style="color: #d00020;">select=</span></span><span class="c5M9S0"><span style="color: #000090;">"./Properties"</span></span><span class="c18YC0"><span style="color: #d00020;">/</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="cKJK"><span style="color: #006800;">/li</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">/xsl:template</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> <br /> &nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:template </span></span><span class="c18YC0"><span style="color: #d00020;">match=</span></span><span class="c5M9S0"><span style="color: #000090;">"row"</span></span><span class="c18YC0"><span style="color: #d00020;"> mode=</span></span><span class="c5M9S0"><span style="color: #000090;">"datasource"</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c69ORU"><span style="color: #aaaba0;">!-- TBD: more detail --</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="cKJK"><span style="color: #006800;">li</span></span><span class="c9Y6TC"><span style="color: #0000ff;">&gt;&lt;</span></span><span class="cLUY2"><span style="color: #ea8f0f;">font </span></span><span class="c18YC0"><span style="color: #d00020;">color=</span></span><span class="c5M9S0"><span style="color: #000090;">"blue"</span></span><span class="c9Y6TC"><span style="color: #0000ff;">&gt;</span></span>Datasource<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="cLUY2"><span style="color: #ea8f0f;">/font</span></span><span class="c9Y6TC"><span style="color: #0000ff;">&gt;</span></span>: <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:apply-templates </span></span><span class="c18YC0"><span style="color: #d00020;">select=</span></span><span class="c5M9S0"><span style="color: #000090;">"."</span></span><span class="c18YC0"><span style="color: #d00020;"> mode=</span></span><span class="c5M9S0"><span style="color: #000090;">"item"</span></span><span class="c18YC0"><span style="color: #d00020;">/</span></span><span class="c9Y6TC"><span style="color: #0000ff;">&gt;&lt;</span></span><span class="cKJK"><span style="color: #006800;">/li</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">/xsl:template</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> <br /> &nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:template </span></span><span class="c18YC0"><span style="color: #d00020;">match=</span></span><span class="c5M9S0"><span style="color: #000090;">"row"</span></span><span class="c18YC0"><span style="color: #d00020;"> mode=</span></span><span class="c5M9S0"><span style="color: #000090;">"item"</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:value-of </span></span><span class="c18YC0"><span style="color: #d00020;">select=</span></span><span class="c5M9S0"><span style="color: #000090;">"./Name"</span></span><span class="c18YC0"><span style="color: #d00020;">/</span></span><span class="c9Y6TC"><span style="color: #0000ff;">&gt;</span></span> <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="cLUY2"><span style="color: #ea8f0f;">font </span></span><span class="c18YC0"><span style="color: #d00020;">size=</span></span><span class="c5M9S0"><span style="color: #000090;">"-1"</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:if </span></span><span class="c18YC0"><span style="color: #d00020;">test=</span></span><span class="c5M9S0"><span style="color: #000090;">"./Hidden='1'"</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="cLUY2"><span style="color: #ea8f0f;">font </span></span><span class="c18YC0"><span style="color: #d00020;">color=</span></span><span class="c5M9S0"><span style="color: #000090;">"red"</span></span><span class="c9Y6TC"><span style="color: #0000ff;">&gt;&lt;</span></span><span class="cKJK"><span style="color: #006800;">em</span></span><span class="c9Y6TC"><span style="color: #0000ff;">&gt;</span></span> Hidden<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="cKJK"><span style="color: #006800;">/em</span></span><span class="c9Y6TC"><span style="color: #0000ff;">&gt;&lt;</span></span><span class="cLUY2"><span style="color: #ea8f0f;">/font</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">/xsl:if</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="cKJK"><span style="color: #006800;">br/</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;created by <span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:value-of </span></span><span class="c18YC0"><span style="color: #d00020;">select=</span></span><span class="c5M9S0"><span style="color: #000090;">"./Creator"</span></span><span class="c18YC0"><span style="color: #d00020;">/</span></span><span class="c9Y6TC"><span style="color: #0000ff;">&gt;</span></span> on <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:value-of </span></span><span class="c18YC0"><span style="color: #d00020;">select=</span></span><span class="c5M9S0"><span style="color: #000090;">"substring-before(./CreationDate,'T')"</span></span><span class="c18YC0"><span style="color: #d00020;">/</span></span><span class="c9Y6TC"><span style="color: #0000ff;">&gt;&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c69ORU"><span style="color: #aaaba0;">!--&nbsp;etc&nbsp;--</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span></span><span style="color: #000000;">&nbsp;</span><br /></span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:if </span></span><span class="c18YC0"><span style="color: #d00020;">test=</span></span><span class="c5M9S0"><span style="color: #000090;">"string-length(normalize-space(./Description)) &amp;gt; 1"</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="cKJK"><span style="color: #006800;">br/</span></span><span class="c9Y6TC"><span style="color: #0000ff;">&gt;&lt;</span></span><span class="cKJK"><span style="color: #006800;">em</span></span><span class="c9Y6TC"><span style="color: #0000ff;">&gt;&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:value-of </span></span><span class="c18YC0"><span style="color: #d00020;">select=</span></span><span class="c5M9S0"><span style="color: #000090;">"Description"</span></span><span class="c18YC0"><span style="color: #d00020;">/</span></span><span class="c9Y6TC"><span style="color: #0000ff;">&gt;&lt;</span></span><span class="cKJK"><span style="color: #006800;">/em</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">/xsl:if</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="cLUY2"><span style="color: #ea8f0f;">/font</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">/xsl:template</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> <br /> &nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:template </span></span><span class="c18YC0"><span style="color: #d00020;">match=</span></span><span class="c5M9S0"><span style="color: #000090;">"Parameters"</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c69ORU"><span style="color: #aaaba0;">!-- TBD: more detail --</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">/xsl:template</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> <br /> &nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">xsl:template </span></span><span class="c18YC0"><span style="color: #d00020;">match=</span></span><span class="c5M9S0"><span style="color: #000090;">"Properties"</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c69ORU"><span style="color: #aaaba0;">!-- TBD: more detail --</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;<span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">/xsl:template</span></span><span style="color: #0000ff;"><span class="c9Y6TC">&gt;</span><br /></span> &nbsp;&nbsp;&nbsp;&nbsp;<br /> <span class="c9Y6TC"><span style="color: #0000ff;">&lt;</span></span><span class="c49DIK"><span style="color: #ac306d;">/xsl:stylesheet</span></span><span class="c9Y6TC"><span style="color: #0000ff;">&gt;</span></span> &nbsp;</p>
<p>As you see, I'm only handling content of Type 1 (folder), 2 (report), and 5 (datasource) -- and I may even opt to eliminate Type 5 for the user-friendly version -- but obviously if you want to handle all Types, including uploaded files, there is nothing more complicated to do.</p>
<h2>Gussy it up if you want</h2>
<p>A nice touch is a parameter to point to the Report Manager base&nbsp;url, so you can provide a link directly to each report <em>in situ</em>.</p>
<p><img style="margin-right: auto; margin-left: auto; padding: 20px; display: block; border: 1px solid silver;" title="Sample xslt output" src="http://www.spacefold.com/lisa/image.axd?picture=2011%2f5%2fQnDRSDocs.png" alt="Sample xslt output" /></p>
<p>&nbsp;</p>
<p>If you choose to do this, however, remember that not all your users have access to all your reports, so (depending on your user base) you may have some people who can read this document but experience frustration when they click the links.</p>
<h2>Making like Tina Turner</h2>
<p><em>"We never, ever do anything nice and easy."</em></p>
<p>I did run into one irritating "infelicity" in SQL Management Studio while thinking this through, FWIW.&nbsp;</p>
<p>It seems that Management Studio has exactly the same facility to test XSLT output of an XML file you're editing as <a title="blog post about attaching XSLT to an XML document in the VS editor" href="http://spacefold.com/lisa/post/2009/02/08/YAPS-Random-acts-of-kindness-regarding-Reports-Excel-XSLT-and-you.aspx">Visual Studio does</a>, so you&nbsp;should be able to&nbsp;perform the query above, open a Properties window, navigate to your XSLT, and immediately see the result.&nbsp; But <a title="MS Connect on this subject" href="https://connect.microsoft.com/SQLServer/feedback/details/362793/filenotfoundexception-when-you-try-to-show-xslt-output-in-ssms#tabs" target="_blank">it doesn't work, probably never did work, and maybe never will work</a>.&nbsp;</p>
<p>Oh well.&nbsp; If you have nothing else available, you can always&nbsp;<a title="Same blog post, more suggestions" href="http://spacefold.com/lisa/post/2009/02/08/YAPS-Random-acts-of-kindness-regarding-Reports-Excel-XSLT-and-you.aspx">apply the xslt&nbsp;at the command line</a>.</p>
<p>&nbsp;</p>http://www.spacefold.com/lisa/post/2011/05/30/YAPS-on-SSRS-Documentation-the-Lite-version.aspx
lisa@spacefold.comhttp://www.spacefold.com/lisa/post/2011/05/30/YAPS-on-SSRS-Documentation-the-Lite-version.aspx#commenthttp://www.spacefold.com/lisa/post.aspx?id=6346ce55-8feb-49f6-974e-f7376e7e05adSun, 29 May 2011 21:48:00 -0600ReportingSQL ServerXML/XSLTxmlRSDocsYAPSLSNhttp://www.spacefold.com/lisa/pingback.axdhttp://www.spacefold.com/lisa/post.aspx?id=6346ce55-8feb-49f6-974e-f7376e7e05ad3http://www.spacefold.com/lisa/trackback.axd?id=6346ce55-8feb-49f6-974e-f7376e7e05adhttp://www.spacefold.com/lisa/post/2011/05/30/YAPS-on-SSRS-Documentation-the-Lite-version.aspx#commenthttp://www.spacefold.com/lisa/syndication.axd?post=6346ce55-8feb-49f6-974e-f7376e7e05adWalkthrough on Blank/Null Multi-Value Parameters: The Quick and the Dead<p>Today I'm going to show you a simple trick that might help you out with multi-value parameters. Then I'll show you a bug with parameter deployment that you'll easily see as we walk through this trick.</p>
<p>The bug isn't specific to the trick, and in fact in the walkthrough scenario it doesn't do any real harm. However, in more complex real-life report deployments, you may find it bites you very hard in the rear end -- as I happened to find last week.</p>
<p>You may already know the trick (it's VERY simple), but read on anyway in case this deployment bug surfaces in your professional life.</p>
<p>I'm going to show you all this in 2008 R2. In production, where the bug showed up, we're not using R2 yet. When I easily duplicated the problem in R2, I thought I'd better show you. So let's get started.</p>
<p class="NB"><strong>A quick sidebar</strong> <br /><br />Speaking of versionitis, I was going to upload and discuss a bug-repro having to do with different optimizations of code attached to conditionally Hidden (or Toggled) objects done by different renderers, having found that <a title="blog post following up on the bug for the XML renderer" href="http://spacefold.com/lisa/post/2010/12/19/Blunted-points.aspx">neither the XML renderer</a>&nbsp;<a title="original blog post discussing the problem with the Excel renderer in focus" href="http://spacefold.com/lisa/post/2010/12/12/Everything-has-a-point-Part-Deux.aspx">nor the Excel renderer </a>faithfully reproduced the actual contents (never mind the formatting) of the interactive version. <br /><br />I haven't done so because I found that, in R2, the interactive version also &lt;cough&gt; optimized the code away.&nbsp; It didn't execute until you toggled the detail code visible -- at which time <strong>all</strong> the summary lines for details <strong>later</strong> than this one suddenly had the right contents (the summary lines <strong>above</strong>&nbsp;the toggled one remained incorrect).&nbsp; <br /><br />This was mildly amusing to watch... in a bitter sort of way.&nbsp; But, as a result, I was much less motivated to share the renderer-specific behavior with you, and much more motivated to come up with a completely different way to handle the original requirement.&nbsp; It's still in an SSRS format, of course, but the code is stripped out and placed&nbsp;in TSQL&nbsp;code that creates a DW table, refreshed nightly, with the results of all the calculations.<br /><br />For any of you that are in the California K12 world, you might be interested to know that the calculations in question evaluate a student's &nbsp;status with respect to state university entrance requirements, are non-trivial, and can be found <a title="California University Entrance Requirements - subject version" href="http://www.universityofcalifornia.edu/admissions/freshman/california-residents/statewide-path/subject-requirement/index.html" target="_blank">here</a>.</p>
<h2>Setup</h2>
<p>Suppose you have a report with a couple of cascading parameters, both derived from a query.&nbsp; In my example I'll use the Continent-&gt;Country-&gt;City relationship that exists in my standard SQLWorld database, borrowed from the MySQL tutorials.&nbsp; The sample report is simplicity itself.&nbsp; The cascading parameters part probably isn't even necessary, you just need a single parameter that derives from a query.&nbsp; We'll focus on the Country parameter here.</p>
<p style="text-align: center;"><img src="http://www.spacefold.com/lisa/image.axd?picture=2011%2f1%2fParamDeployOriginalReport.png" alt="" /></p>
<p>The Country parameter gets its default, as well as its available values, from the paramCountry query.&nbsp; When you first deploy it to the SSRS server, here's how the parameters look from the vantage point of the Report Manager interface.&nbsp; For our purposes it doesn't matter what method you use to deploy and, again, remember that while your interface might look different if you're not using R2, the results and behavior are the same:&nbsp;</p>
<p style="TEXT-ALIGN: center"><img src="http://www.spacefold.com/lisa/image.axd?picture=2011%2f1%2fParamDeploy1.png" alt="" /></p>
<p>... so far so good. Because you get the&nbsp;<strong>available</strong> values from the query, in this example, the list of values for Country will refresh each time the user chooses a different Continent.&nbsp; Because you get the <strong>default</strong> values from the query, all the Country values are initially selected after the refresh.</p>
<h2>Multi-value dilemma</h2>
<p>So now, for various reasons, let's say you don't want to rely on the Report Manager UI "select all" behavior. You want an explicit value that indicates what you want to do for country selection to the main query for the report.</p>
<p>In my case, it was because I wanted to call the report programmatically.&nbsp; There were also some security complications, not relevant here.&nbsp; The point is that a multi-valued param makes this all a bit difficult to do.&nbsp; As you know, they don't allow a null value, which would have been my first choice. for a revision of the main query...&nbsp;</p>
<p style="text-align: center;"><img src="http://www.spacefold.com/lisa/image.axd?picture=2011%2f1%2fParamDeployNullValue.png" alt="" />&nbsp;</p>
<p style="text-align: left;">... and, while they do seemingly allow blank values, this leads to awkward behavior in interactive use:</p>
<p style="TEXT-ALIGN: center">&nbsp;<img src="http://www.spacefold.com/lisa/image.axd?picture=2011%2f1%2fParamDeployBlankValue.png" alt="" /></p>
<h2>Here's the simple trick</h2>
<p>Instead of null or blank as a default&nbsp;value,&nbsp;define an explicit value (usually "All", but in my case "Any" seemed more appropriate), and add it to your parameter query, like this:</p>
<p>&nbsp;</p>
<p style="text-align: center;"><img src="http://www.spacefold.com/lisa/image.axd?picture=2011%2f1%2fParamDeployRevisedParameter.png" alt="" /></p>
<p style="text-align: left;">The added Priority column simply lets you position the special value wherever you want in the interactive list, in this case at the top:</p>
<p style="text-align: center;">&nbsp;<img src="http://www.spacefold.com/lisa/image.axd?picture=2011%2f1%2fParamDeployRevisedReport.png" alt="" /></p>
<p style="text-align: left;">While there isn't much difference between the query-based "All" and the explicit "Any" in this case, the simple trick is quite valuable all the same.&nbsp;</p>
<p style="text-align: left;">Remember what you really want is a NULL or BLANK in this value, to allow the main query to use a completely <strong>different</strong> parameter (based on security levels) to lock down to a specific Country list in some instances.&nbsp; The specific Country or Country list in the different parameter (which is hidden and usually blank) might not cascade from Continent, might be completely unrelated to the concerns or privileges of the standard user.&nbsp;</p>
<p style="text-align: left;">In other scenarios, what you really want is a NULL or BLANK for performance reasons.&nbsp; Ignoring the value of the parameter will turn out to be a good idea, as compared with an explicit IN list containing all possible values,&nbsp;where the list is large.</p>
<p style="text-align: left;">In such a case, the "All" or "Any" value might have a different visual token associated with it, such as "Unselected".&nbsp; It really doesn't matter.</p>
<p style="text-align: left;">The point is: this is how you get a functional NULL or BLANK for your multi-valued parameter.</p>
<p style="text-align: left;">You don't always realize you're going to need to do this, when you first design a report. In my recent case, you re-vamp the report to allow the functional NULL or BLANK later on.&nbsp; This brings me to the real point of my story.</p>
<h2>&nbsp;Here's the bug</h2>
<p>You go ahead and make this change, and then you redeploy the report.&nbsp; But here's what you (still)&nbsp;see after the redeploy:</p>
<p style="text-align: center;">&nbsp;<img src="http://www.spacefold.com/lisa/image.axd?picture=2011%2f1%2fParamDeployRevisedReportParameters.png" alt="" /></p>
<p style="text-align: left;">Changing the method of deriving the default value, in the RDL, does not alter the method of deriving the default value in the uploaded report.</p>
<p style="text-align: left;">I'm usually the first one to defend the behavior of Report Manager and the RS APIs when a report is re-deployed.&nbsp; It makes sense to me that a report deployed to production shouldn't automatically (for example) get its datasource revised every time a developer uploads a change.&nbsp; It even makes sense to me (unlike many other people) that the actual default value for a parameter doesn't change on a re-deploy; after all, production values may often be quite different.</p>
<p style="text-align: left;">But, in this case, if you need to fix the default value by hand in the deployed version, you really can't. You don't have any ability to alter the<strong> method of derivation</strong> (ie, explicit value/expression versus query-based) here. That's why I think this is a bug.</p>
<p style="text-align: left;">As far as I can see, your only choice is to delete the deployed report and re-introduce it to the installation with a fresh start.&nbsp;&nbsp;&nbsp;This workaround can have all kinds of other unintended consequences if your production deployment <strong>is</strong> significantly different from your development version, and you have a lot of parameters to adjust for production. And if you forget to make those adjustments, even once -- or if you don't even notice this weird behavior on the first re-deploy, as happened to me -- the report will definitely not run as intended.</p>
<p style="text-align: left;">You've been alerted.&nbsp; If you tend to use multi-valued parameters often, check this out.</p>http://www.spacefold.com/lisa/post/2011/01/17/Walkthrough-on-BlankNull-Multi-Value-Parameters-The-Quick-and-the-Dead.aspx
lisa@spacefold.comhttp://www.spacefold.com/lisa/post/2011/01/17/Walkthrough-on-BlankNull-Multi-Value-Parameters-The-Quick-and-the-Dead.aspx#commenthttp://www.spacefold.com/lisa/post.aspx?id=dab29962-4a5c-454a-84fc-1520ebcaebb0Sun, 16 Jan 2011 22:01:00 -0600ReportingSQL ServerYAPSLSNhttp://www.spacefold.com/lisa/pingback.axdhttp://www.spacefold.com/lisa/post.aspx?id=dab29962-4a5c-454a-84fc-1520ebcaebb03http://www.spacefold.com/lisa/trackback.axd?id=dab29962-4a5c-454a-84fc-1520ebcaebb0http://www.spacefold.com/lisa/post/2011/01/17/Walkthrough-on-BlankNull-Multi-Value-Parameters-The-Quick-and-the-Dead.aspx#commenthttp://www.spacefold.com/lisa/syndication.axd?post=dab29962-4a5c-454a-84fc-1520ebcaebb0YAPS on Why Groups don't make everything child's play in RDLs<p><a title="chat with Ramdas about your RS ideas!" href="mailto:ramdas.narayanan@avelomortgage.com" target="_blank">Ramdas</a> writes to ask about a visual effect, something&nbsp;we usually call the "greenbar style" report: alternating row colors.&nbsp; The name comes from the old greenbar printout paper, as you probably know.</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt; padding-left: 30px;">I have a question regarding background colrs in SSRS, I have a report which has three groups on the row groups section. I want to alternate the colors for the rows in the report. Any thoughts on this&hellip;</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">I was nonplussed to be asked about this greenbars are pretty simple to do, usually.&nbsp;&nbsp;They are a staple pattern in report design, and people come up with all kinds of simple ways to manage it (for the record <a title="wrox article on greenbar styling" href="http://www.wrox.com/WileyCDA/Section/Report-Solution-Patterns-and-Recipes-Greenbar-Reports.id-291857.html" target="_blank">this article</a> overcomplicates, you can often do it with a modulus operator and the RowNumber(&lt;proper scope&gt;) RDL function, with no code at all, but it presents a common method, read it for a complete discussion).</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">But Ramdas' case was a little different.&nbsp; As you see here, he's got two adjacent row groups, one of which has a child group (don't ask me the significance of the group names, these come from the actual report).&nbsp;</p>
<p style="text-align: center;"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f8%2fRamdasGreenbar1.png" alt="" /></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">The report row layout contains group summary lines, on the different levels.&nbsp; In the next screen shot I'll make the rowheight a little higher than it really is, to make this a bit easier to read:</p>
<p style="text-align: center;"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f8%2fRamdasGreenbar2.png" alt="" /></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0in 0in 0pt;">The problem that Ramdas wants to solve is to make all these different types of lines (not including the two empty separator lines you see above <strong>[RulePriority]</strong> in the layout) form a single, seamless greenbar table.&nbsp; To do this, he created some group variables, one for each row group&nbsp;level, and filled each one using a separate Code Variable and function (i'll show the entire technique for one of the three groups, with every place it "touches" the RDL in one not-very-attractive montage, to save time):</p>
<p style="TEXT-ALIGN: center"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f8%2fRamdasGreenbar3.png" alt="" /></p>
<table style="TEXT-ALIGN: center" border="0">
<tbody>
<tr>
<td width="50%" valign="top">
<p style="text-align: left;">With me so far?&nbsp; Unfortunately, the group variables aren't behaving as planned.&nbsp; Each of the groups is alternating rows on its own schedule, they're not all orchestrated as one greenbar list.</p>
<p style="text-align: left;">To make this easier for you to see, I doctored Ramdas's report simply by replacing the required columns with some random data from master.sys.all_objects and uploaded the 4 RDLs.&nbsp; In the first iteration I've only removed the nonessentials, Ramdas's original code and variables are intact but I've recreated the necessary data.&nbsp; You can see the issue in Group1, which uses the column RulePriority, here represented by type_desc in the all_objects view:</p>
<p style="text-align: left;">... while each Group1 row alternates with the last Group1 row, it doesn't flow smoothly with the Group3 rows that are its children.</p>
</td>
<td>
<p><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f8%2fRamdasGreenbar4.png" alt="" /></p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;So, okay.&nbsp; What to do?</p>
<h3>Wait. What exactly are group variables for?</h3>
<p>Group variables are relatively new, and they're .... nice but nubbly, in the immortal words of Rudyard Kipling.</p>
<p class="NB">Incidentally I was thrilled to see an <a href="http://www.nicebutnubbly.com/">http://www.nicebutnubbly.com/</a> and even more thrilled to read and see its lovely content, especially since it looks like the proprietress is a neighbor of mine here in Northern California. I do wish she'd name her source, though; that really is one of my favorite Just So Stories.</p>
<p>Ahem.&nbsp;&nbsp; The Help file has the following fascinating description of Group Variables:</p>
<p style="padding-left: 30px;">"A group variable is evaluated when the first group instance is processed and can be referenced from an expression in the scope of the group or its child groups. Because the variable is only calculated one time, each reference to the variable always uses the same value. "</p>
<p>When exactly is the first group instance processed? And where exactly is this processing, in relation to other processing that is done at runtime to calculate and run the report?</p>
<p>Do you know the answer?&nbsp; Because, so far, I don't.&nbsp; Even <a title="blog post about cool ways to use groups" href="http://www.spacefold.com/lisa/post/2009/05/31/Walkthrough-When-groups-behave-theyre-groovy-Multilinks!.aspx">when I'm using groups</a>, I have a hard time using group variables.</p>
<h3>The sequence at play&nbsp;is the thing</h3>
<p>Being the Humpty Dumpty of report authors, I'd rather use Code variables, and set their value exactly when I want to.&nbsp; At least I know what is going on, and I've done a fair amount of testing to verify it.</p>
<p>So, for iteration #2, I removed all the code in Ramdas's report and left only a single function:&nbsp;</p>
<p class="CodeSample"><span style="color: #0000ff; "><span style="color: #0000ff; "><span style="color: #0000ff; ">Public</span></span></span> EvenRow <span style="color: #0000ff; "><span style="color: #0000ff; "><span style="color: #0000ff; ">As</span></span></span> <span style="color: #0000ff; "><span style="color: #0000ff; "><span style="color: #0000ff; ">Boolean<br /></span></span></span></p>
<p><span style="color: #0000ff; "><span style="color: #0000ff; "><span style="color: #0000ff; ">Public</span></span></span> <span style="color: #0000ff; "><span style="color: #0000ff; "><span style="color: #0000ff; ">Function</span></span></span> AltRow() <span style="color: #0000ff; "><span style="color: #0000ff; "><span style="color: #0000ff; ">As</span></span></span> <span style="color: #0000ff; "><span style="color: #0000ff; "><span style="color: #0000ff; ">String<br />&nbsp;&nbsp; </span></span></span>EvenRow = <span style="color: #0000ff; "><span style="color: #0000ff; "><span style="color: #0000ff; ">Not&nbsp;</span></span></span> EvenRow<br /><span style="color: #0000ff; "><span style="color: #0000ff; "><span style="color: #0000ff; ">&nbsp;&nbsp; Return</span></span></span> <span style="color: #a31515; "><span style="color: #a31515; "><span style="color: #a31515; ">""<br /></span></span></span><span style="color: #0000ff; "><span style="color: #0000ff; "><span style="color: #0000ff; ">End</span></span></span> <span style="color: #0000ff; "><span style="color: #0000ff; "><span style="color: #0000ff; ">Function<br /></span></span></span></p>
<p>Then I overloaded the textboxes in column 1, attaching this function to it before the "real" label in the textbox, like so:</p>
<p class="CodeSample">=Code.AltRow() &amp; Fields!RulePriority.Value</p>
<p>Then I put a slightly different expression on BackgroundColor for the textboxes in the relevant rows:</p>
<p class="CodeSample">=iif(Code.EvenRow,"Gainsboro","White")</p>
<p>As you can see, it didn't exactly work, but it told me exactly what was going on:</p>
<p style="text-align: center;"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f8%2fRamdasGreenbar5.png" alt="" /></p>
<p style="text-align: left;">Yuck. The text for the textboxes in column 1, including the function, was being evaluated after the background color for that textbox, but before the background color for the rest of the columns.</p>
<p>Right?</p>
<h3>No problem, sez I...</h3>
<p>... All we have to do is reverse the expression for the textboxes in the first column, for all relevant rows:</p>
<p class="CodeSample">=iif(Code.EvenRow,"White","Gainsboro")</p>
<p>... and it was the morning and the evening of the third iteration.&nbsp; And we looked at what we had created, and saw that it was good.</p>
<p style="text-align: center;"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f8%2fRamdasGreenbar6.png" alt="" /></p>
<h3>Not so fast.</h3>
<p>(Be patient, you're learning something important here.)</p>
<p>When you count on the sequence of events in a report, you'd better make sure that the sequence will work the same way in all relevant renderers, or at least the ones you get in-the-box with SSRS.&nbsp; In this case, since it's a visual effect, we don't care what it looks like in CSV or XML; background color simply won't translate.&nbsp; PDF looked good when I tested... but Iteration 3 gave the same&nbsp;unfortunate results in Word and Excel renderers as you see above for Iteration 2.&nbsp;</p>
<p>What can we count on, what do we know will be evaluated at the right moment?&nbsp; That is: what will be evaluated by all renderers that have any use for background color, before any background color is rendered?</p>
<p>In this case, I chose the Visibility expression.</p>
<h3>Overloading the Visibility expression is as easy as overloading a textbox</h3>
<p>Here's the simple Visibility expression I used on the three rows that need to toggle the value of Code.EvenRow:'</p>
<p>=Code.AltRowVariant()</p>
<p>&nbsp;... and here's the simple variation on the code function:</p>
<p><span style="color: #0000ff; "><span style="color: #0000ff; "><span style="color: #0000ff; ">Public</span></span></span> <span style="color: #0000ff; "><span style="color: #0000ff; "><span style="color: #0000ff; ">Function</span></span></span> AltRowVariant() <span style="color: #0000ff; "><span style="color: #0000ff; "><span style="color: #0000ff; ">As</span></span></span> <span style="color: #0000ff; "><span style="color: #0000ff; "><span style="color: #0000ff; ">Boolean<br />&nbsp;&nbsp; </span></span></span>EvenRow = <span style="color: #0000ff; "><span style="color: #0000ff; "><span style="color: #0000ff; ">Not&nbsp;</span></span></span> EvenRow<br /><span style="color: #0000ff; "><span style="color: #0000ff; "><span style="color: #0000ff; ">&nbsp;&nbsp; Return</span></span></span> <span style="color: #a31515; "><span style="color: #a31515; ">False <span style="color: green; ">' no rows are hidden<br /></span></span></span><span style="color: #0000ff; "><span style="color: #0000ff; "><span style="color: #0000ff; ">End</span></span></span> <span style="color: #0000ff; "><span style="color: #0000ff; "><span style="color: #0000ff; ">Function<br /></span></span></span></p>
<p>... and our background color expressions go back to the consistent instruction we used in iteration 2, for all textboxes in all&nbsp;relevant rows:</p>
<p class="CodeSample">=iif(Code.EvenRow,"Gainsboro","White")</p>
<p>And whaddya know, Iteration 4 works fine in all the appropriate renderers: Word, Excel, Tiff, PDF, MHTML, the works.</p>
<p style="text-align: center;"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f8%2fRamdasGreenbar7.png" alt="" /></p>
<h3>The moral of this Just-So Formatting Story</h3>
<p>You knew I was going to say this, I hope, but just in case: I happened to be working in RS 2008 R2 here, and I don't guarantee the results in 2005 or even 2008 R1.&nbsp; Why not?&nbsp; <strong>Because I have not tested it there, that's why not.&nbsp; And the sequence of events in a report is not something to guarantee lightly or without testing.</strong></p>
<p>Until then,&nbsp;with apologies to <a title="Words to live by from E Starr, A Star" href="http://morris108.wordpress.com/2009/01/26/edwin-starr-lyrics-war-what-is-it-good-for-absolutely-nothing/" target="_blank">Edwin Starr</a>, I'll be singing</p>
<p style="padding-left: 30px;">Var, huh, group var<br />What is it good for<br />Absolutely nothing<br />Listen to me&nbsp;</p>
<p>And that, my children, is why I don't use group vars very much.&nbsp; At least for now.</p>
<p><a href="http://www.spacefold.com/lisa/file.axd?file=2010%2f8%2fRamdasGreenbar.zip"></a></p>
<p><a href="http://www.spacefold.com/lisa/file.axd?file=2010%2f8%2fRamdasGreenbar.zip">RamdasGreenbar.zip (30.64 kb)</a></p>http://www.spacefold.com/lisa/post/2010/08/02/YAPS-on-Why-Groups-dont-make-everything-childs-play-in-RDLs.aspx
lisa@spacefold.comhttp://www.spacefold.com/lisa/post/2010/08/02/YAPS-on-Why-Groups-dont-make-everything-childs-play-in-RDLs.aspx#commenthttp://www.spacefold.com/lisa/post.aspx?id=e2d42db9-29d5-4e86-8bdf-bb1c88908a14Mon, 2 Aug 2010 10:23:00 -0600ReportingSQL ServerYAPSLSNhttp://www.spacefold.com/lisa/pingback.axdhttp://www.spacefold.com/lisa/post.aspx?id=e2d42db9-29d5-4e86-8bdf-bb1c88908a142http://www.spacefold.com/lisa/trackback.axd?id=e2d42db9-29d5-4e86-8bdf-bb1c88908a14http://www.spacefold.com/lisa/post/2010/08/02/YAPS-on-Why-Groups-dont-make-everything-childs-play-in-RDLs.aspx#commenthttp://www.spacefold.com/lisa/syndication.axd?post=e2d42db9-29d5-4e86-8bdf-bb1c88908a14YAPS on Excel Tabs in SSRS: What a difference 2008 R2 makes... or doesn't<p>I was excited to see that RS 2008 R2 offered some new properties associated with pagination. While my unintended long-running series on <a title="blog post on QnD XSLT for Excel rename" href="http://spacefold.com/lisa/post/2007/10/03/Changing-the-Sheet-names-in-SQL-Server-RS-Excel-QnD-XSLT.aspx">renaming Excel Tabs using XML output and XSLT</a>&nbsp;has received a gratifying amount of attention, it's great that Microsoft has improved the product by providing a native way to do this simple task without heroic measures.&nbsp; "It's time," I thought, "to put this baby to rest forever, and let everybody know about it."</p>
<h2>First: the magic works!</h2>
<p>As you remember, the Excel rendering extension chooses to recognize explicit page breaks that you set, on a group&nbsp;or container object level, and to interpret them as separate tabs in the exported workbook.</p>
<p class="NB">If&nbsp; you don't recognize, or don't understand, the term "explicit page break", read another post first, such as <a title="Blog post on page breaking principles" href="http://spacefold.com/lisa/post/2009/03/08/Dynamic-Page-Breaks-in-SSRS-Going-to-Eleven.aspx">this one</a>.&nbsp; I'll assume that's water under the bridge. in the current context.</p>
<p>So, now you can define a page name expression at the same time as you are defining a page break.&nbsp; Brilliantly appropriate.</p>
<p>In the example I'll use to illustrate, I have a report on answers to questions in a survey.&nbsp; There is a container group on Question ID, and I am setting a page break on that group level.&nbsp; You can see the expression I'm using "attached" to the other Page Break attributes for the group, in this screen shot (which uses Report Builder 3.0, but you get the same thing in R2 BIDS Report Designer):</p>
<p style="text-align: center;"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f7%2f1-ExpressionPageNameDefinedInGroup.png" alt="" />&nbsp;</p>
<p>Great!&nbsp; And here's the result in the RB Preview export to Excel:</p>
<p style="text-align: center;"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f7%2f2-ExpressionPageNameFromGroup.png" alt="" /></p>
<h2>Second look: uh-oh...</h2>
<p>Hmmm.&nbsp; There are a couple of things wrong here.</p>
<p>First, you notice that there is a <strong>QID42 (2) </strong>tab.&nbsp; It's cool and all that the Export renderer "knew" that tabs have to have unique names, and added the (2) without direction.&nbsp; But why that name at all?</p>
<p>This isn't because Question #42 actually spans two pages; remember that Excel will only deal with explicit page breaks, and no matter how much data QID 42's group had, no matter how many pages it took to print or show in HTML, that group would all be on one Excel tab.</p>
<p>There does happen to be a second&nbsp;container, outside the one housing these question groups, which provides summary data.&nbsp; Here's what's actually on the QID42 (2) tab:</p>
<p style="text-align: center;"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f7%2f4-SummaryPage.png" alt="" /></p>
<p>... so the first thing to remember is: be very careful to assign PageName information for every page that is going to exist, or you're going to end up with some strange behavior.</p>
<p class="NB">In some quick tests, I saw some strange and inconsistent behavior even when I did remember to assign this information throughout -- in the test above I had an Initial PageName assigned, which I hoped would provide a global default for regions with no PageName assigned explicitly.&nbsp;Figuring out whether nested groups will concatenate their PageName info, etc, will take some time, and there may be some bugs in complex scenarios.&nbsp;</p>
<p>Next, of course you notice the weird effect of part of the table being "dropped" below the rest.&nbsp; While you can't see it in the page layout, the "Answers" table is actually two overlaid tables.&nbsp; (The initial values and percentages are in a separate table for reasons that have no bearing on our current discussion -- just take it as read that there is a good reason.)</p>
<p>Here's the intended result, as you would see it in HTML Print Layout display and also in a PDF, which is this report's intended output:</p>
<p style="text-align: center;"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f7%2f3-IntendedResult.png" alt="" /></p>
<h2>We'll always have plaster of paris</h2>
<p>So what went wrong here? The truth is that there are LOTS of things, not just tab names, that we need to do better than the Excel default renderer.</p>
<p>Luckily, XML output + XSLT are still going to provide the correct behavior for us when we need it. Getting the Initial values to show in the correct rows in the Answer table is no trick at all in SSML.</p>
<p>I guess I'll continue to use my original technique for its original purpose in this report. For others, of course, if tab name is the only issue, I'll be happy to switch.</p>
<h2>Reconsidering in depth</h2>
<p>If you are planning to use the new PageName feature, let me caution you about a couple of additional things.</p>
<p>1) As mentioned above regarding unique names, the Excel renderer is going to try to keep you out of trouble with tab names.&nbsp; In addition to a tie-breaking digit, it's going to ensure that <a title="Tom Xie on disallowed characters in a blog comment" href="http://spacefold.com/lisa/post/2008/04/18/YAPS-(Yet-another-postscript)-on-Custom-Excel-for-RS.aspx#id_a654072d-52a1-4cac-9bd4-555500e0177a">characters not allowed in a tab name</a> are removed from your expression, and also ensure that your tab names are not longer than allowed by Excel.&nbsp; Here's a bad example of a PageName expression, plus what you'll get in Excel as a result of this expression:</p>
<p style="text-align: center;">&nbsp;<img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f7%2f6-BadExample.png" alt="" /></p>
<p style="text-align: center;">&nbsp;<img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f7%2f7-ResultOfBadExample.png" alt="" /></p>
<p>&nbsp;... I am particularly interested in how StrDup(20,"This is a Test") became what you see above in the tab names.&nbsp; Really, I haven't a clue what logic they're using and am not in the mood to test exhaustively to find out.</p>
<p>2) It's a little annoying that the global PageNumber is not available in these expressions.&nbsp;</p>
<p style="text-align: center;"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f7%2f5-PageNumberUnavailable.png" alt="" /></p>
<p style="text-align: left;">... since "page number" would equate to "sheet or tab number" in Excel, really, I see no reason why the Excel renderer couldn't use this information safely.&nbsp; (Does anybody know a different way that PageName gets used outside the Excel renderer, so far,&nbsp;btw? Why give this error message, why not just provide a caveat for renderers that can't use it?)</p>
<p>Since, in my example, report, a page number&nbsp;equates to a group number, there are workarounds, of course.&nbsp; There are always work arounds.&nbsp; Wah.</p>
<h2>A small tear drop in a very big bucket of smiles</h2>
<p>R2 brings lots of goodies.&nbsp;I'm glad MS found time to throw this one into the mix, and it's for sure a welcome addition.</p>
<p>Not a game changer, as it happens.&nbsp; But R2 does bring us some of those.</p>http://www.spacefold.com/lisa/post/2010/07/26/YAPS-on-Excel-Tabs-in-SSRS-What-a-difference-2008-R2-makes-or-doesnt.aspx
lisa@spacefold.comhttp://www.spacefold.com/lisa/post/2010/07/26/YAPS-on-Excel-Tabs-in-SSRS-What-a-difference-2008-R2-makes-or-doesnt.aspx#commenthttp://www.spacefold.com/lisa/post.aspx?id=aa0df0d8-4faf-4386-9b86-aa71680d1e1cMon, 26 Jul 2010 07:50:00 -0600ReportingSQL ServerYAPSLSNhttp://www.spacefold.com/lisa/pingback.axdhttp://www.spacefold.com/lisa/post.aspx?id=aa0df0d8-4faf-4386-9b86-aa71680d1e1c0http://www.spacefold.com/lisa/trackback.axd?id=aa0df0d8-4faf-4386-9b86-aa71680d1e1chttp://www.spacefold.com/lisa/post/2010/07/26/YAPS-on-Excel-Tabs-in-SSRS-What-a-difference-2008-R2-makes-or-doesnt.aspx#commenthttp://www.spacefold.com/lisa/syndication.axd?post=aa0df0d8-4faf-4386-9b86-aa71680d1e1cOdds and Ends, and YAPS on VFP PDF<p>I've still got a bunch of questions tee'd up to answer, and no time to do it.&nbsp; Why?</p>
<p><a title="Blog post about Derek" href="http://spacefold.com/lisa/post/2007/07/29/Second-test-and-a-plug-for-my-inEFFable-second-son.aspx">Derek</a> and Lila got married two weeks ago!&nbsp; <a title="Blog post announcing Jonah's arrival" href="http://spacefold.com/lisa/post/2009/08/14/And-then-there-were-three.aspx">Jonah</a> continues to be absorbingly interesting!&nbsp;And Paul Zygielbaum turned 60 last week, which was a matter of great joy and moment to his family and friends<a title="A little bit about Paul and Michelle" href="http://mesothel.com/asbestos-cancer/legislation/victim-protest-letters/zygielbaum_essay.htm" target="_parent"> for many reasons</a>.</p>
<p class="NB">BTW, although I didn't publish any news about this when it happened, Derek doesn't work for EFF any more. <a title="Sample Derek interview" href="http://www.readwriteweb.com/archives/google_public_policy_interview.php" target="_blank">Here's a sample</a> of what he's up to now.&nbsp; Lots more where this one comes from.&nbsp; Derek and Lila, who is equally cool, prodigiously talented, and <a title="Lila at Creative Commons" href="http://creativecommons.org/about/people" target="_blank">committed to making the world a better place</a>, met during the EFF period, though, so that's just one more reason for me to <a title="eff.org" href="http://www.eff.org/" target="_blank">thank EFF </a>&nbsp;;-).</p>
<table border="0">
<tbody>
<tr>
<td>
<p>But mostly, my work hours <br />just don't permit much time here.<br /><br />I steal just enough time<br />for family events, <br />and a little gardening.</p>
</td>
<td>
<p><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f6%2fgardenStuff.jpg" alt="" width="264" height="125" /></p>
</td>
</tr>
</tbody>
</table>
<p>I am trying to do something about my work schedule, and&nbsp;I hope to start posting answers to your questions, especially Ehud's latest conundrum since he's come up with another <a title="Blog post answering Ehud's last corker" href="http://spacefold.com/lisa/post/2009/07/26/YAPS-about-Dynamic-Layouts.aspx">corker</a>, soon.</p>
<p>Here are a few random notes to grease the skids and get me back into practice.</p>
<h2>1. Adrian's helpful notes on PDFs</h2>
<p>Adrian H&nbsp;has <a title="Adrian's comment on PDF Power blog post" href="http://spacefold.com/lisa/post/2007/08/06/PDF-Power-Redux-Redacted-and-Reduced.aspx">written</a> to say:</p>
<blockquote>
<p>We had trouble when upgrading our installation to GS v8.71, using the "silent install" of GS from a DB table.<br />VFP adds a .txt extension to filenames with no extension, which made Ghostscript unhappy. <br />Here's a mod to Lisa's prg that creates/replaces the installer table directly in the DBC and nixes the bogus .txt extensions. <br /><br />GS v8.71, incidentally, allows copying text from the generated PDF. GS v7 produced garbled text on copy/paste.</p>
</blockquote>
<p>&nbsp;&nbsp;... and he includes a modification to the "quick and dirty CreateInstallDBF.PRG" program that I added to the article, to show the basic principle of what needs to be included in an Install.DBF for GhostScript.</p>
<p>Please do use Adrian's mods, in the <a title="Adrian's comment on PDF Power blog post" href="http://spacefold.com/lisa/post/2007/08/06/PDF-Power-Redux-Redacted-and-Reduced.aspx">blog post comment he wrote</a>, if you plan to use that particular PRG to create your install DBF -- actually I will repeat them here for the purposes of syntax coloring and stuff -- -- although there are many ways to do so.&nbsp;You may already have created your own method of defining the files that you wish to deploy in production and scarfing them up in a DBF/FPT form, my PRG was just supposed to describe the required steps briefly.</p>
<p class="code"><span style="color: #008000;">* CREATEINSTALLDBF.PRG<br />* &gt;L&lt;'s Q&amp;D program<br />* for gathering the GhostScript<br />* files required for installation<br />* (c) Lisa Slater Nicholls<br />* Modified by Adrian [adrianh at midcoast.com]<br /></span><span style="color: #0000ff;"><br />LOCAL</span> lcTopDir, lcFile<br /><span style="color: #0000ff;">PRIVATE ALL LIKE </span>j*<br /><span style="color: #0000ff;">CLOSE DATABASES<br /></span>= <span style="color: #0000ff;">MESSAGEBOX</span> ("Open the database and Specify the table in the next dialogs...")<br /><span style="color: #0000ff;">OPEN DATABASE<br /></span><br />? jcInstall= <span style="color: #0000ff;">PUTFILE</span> ("Install dbf...","GSinstall","dbf") <br /><span style="color: #0000ff;"><br />IF EMPTY<br /></span>&nbsp;&nbsp; (jcInstall) = <span style="color: #0000ff;">MESSAGEBOX</span> ("User cancelled") <br /><span style="color: #0000ff;">&nbsp;&nbsp; RETURN <br />ENDIF<br /><span style="color: #0000ff;"><br />DROP TABLE JUSTSTEM<span style="color: #000000;">(jcInstall)</span></span> </span><br /><span style="color: #0000ff;"><br />CREATE TABLE </span>(jcInstall) (filename c(120), DIR c(10), contents m <span style="color: #0000ff;">NOCPTRANS</span> ) <br /><br />= <span style="color: #0000ff;">MESSAGEBOX</span> ( "Find dir for GS Executable in next dialog...")<br />lcTopDir = <span style="color: #0000ff;">GETDIR</span> ()<br />lcTopDir = <span style="color: #0000ff;">ADDBS</span> (lcTopDir)<br /><span style="color: #0000ff;"><br />SET NOCPTRANS TO </span>contents<br /><span style="color: #0000ff;">DO </span>GetFiles <span style="color: #0000ff;">WITH </span>lcTopDir, ""<br /><span style="color: #0000ff;">DO </span>GetFiles <span style="color: #0000ff;">WITH </span>lcTopDir, "fonts\"<br /><span style="color: #0000ff;">DO </span>GetFiles <span style="color: #0000ff;">WITH </span>lcTopDir, "lib\"<br />jQuery1520962885844600045_1342192883884 <span style="color: #0000ff;">CHR</span> (7)<br />= <span style="color: #0000ff;">MESSAGEBOX</span> ("Mission accomplished...")<br /><span style="color: #0000ff;">RETURN<br /><br /><span style="color: #0000ff;">PROCEDURE<br /></span>&nbsp;&nbsp; GetFiles(<span style="color: #000000;">tTopDir, tSubDir</span>) </span><br /><span style="color: #0000ff;">&nbsp;&nbsp; LOCAL </span>lcFile, lcDir <br />&nbsp;&nbsp; lcDir = tTopDir + tSubDir&nbsp; <br />&nbsp;&nbsp; lcFile = <span style="color: #0000ff;">SYS</span>(2000,<span style="color: #0000ff;">FORCEPATH</span> ("*.*",lcDir)) <br /><span style="color: #0000ff;">&nbsp;&nbsp; DO WHILE </span>NOT <span style="color: #0000ff;">EMPTY</span> (lcFile) <br /><span style="color: #0000ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT INTO </span>(jcInstall)(filename, DIR) <span style="color: #0000ff;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUES </span>(<span style="color: #0000ff;">JUSTFNAME</span> (lcFile),tSubDir) <br /><span style="color: #0000ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; APPEND MEMO </span>contents ;<br /><span style="color: #0000ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM </span>(<span style="color: #0000ff;">FORCEPATH</span> (lcFile,lcDir)) <br /><br /><span style="color: #008000;"><span style="color: #008000;"><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *If the filename does not have an extension, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *VFP forces the file extension to ".txt" when<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*you COPY MEMO to create the files later. VFP will<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *not force a file extension when the name ends in "dot."<br /><span style="color: #008000;"><span style="color: #008000;"><span style="color: #008000;"><br /><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jcName= </span></span><span style="color: #0000ff;">JUSTFNAME</span><span style="color: #000000;"> (lcFile) </span></span></span><br /><span style="color: #0000ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF</span><span style="color: #000000;"> !("." $ jcName) </span></span></span><br /><span style="color: #0000ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REPLACE</span><span style="color: #000000;">filename</span> </span><span style="color: #0000ff;">WITH </span>jcName+"." <br /><span style="color: #0000ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENDIF<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcFile = </span><span style="color: #0000ff;">SYS</span>(2000,<span style="color: #0000ff;">FORCEPATH</span> ("*.*",lcDir),1) <br /><span style="color: #0000ff;">&nbsp;&nbsp; ENDDO<br />RETURN</span></p>
<h3>Crazy like a fox</h3>
<p>Notice&nbsp;Adrian's last recommendation, about GS v7 versus GS v8.71.</p>
<p>It's good advice... but don't throw away the GS v7 version. Consider the "garbled text" as a feature, not a limitation; it's a primitive way to make your PDF non-copy-able. There is a PDF switch for doing this, and it's probably possible to add that switch to the GS command line script that PDFClass and PDFListener build for you, but I don't off-hand know what it is, and it would take a bit of work and testing for you to incorporate it properly.</p>
<p>You can get both versions <a title="GS download page" href="http://pages.cs.wisc.edu/~ghost/" target="_blank">here</a>.</p>
<h2>2. When life, or your garden, hands you ornamental plums...</h2>
<p>That photograph at the top of this entry isn't cherries, but I decided to treat them that way anyway.&nbsp; It was a little extra work, but the result tastes like <a title="Lingonberry jam has its own site?!?" href="http://lingonberryjam.com/" target="_blank">lingonberry jam</a> and is great with yogurt.&nbsp;</p>
<p>Luckily I have a cherry pitter -- although I subscribe to <a title="Alton Brown's site" href="http://www.altonbrown.com/" target="_blank">Alton Brown</a>'s theory that no unitasking tool except a fire extinguisher should be permitted in a kitchen, cherry pitters don't count.&nbsp; They're in constant use in our house -- to pit olives.&nbsp; (FWIW: I understand that Alton eventually <a title="Alton at work, discussed in the comments on this page" href="http://unclutterer.com/2010/04/07/unitasker-wednesday-the-fire-extinguisher/" target="_blank">found a second use for fire extinguishers</a>, too.)</p>
<p class="NB">FYI: I make a mean tea from lavendar from our beautiful and decorative garden, too, but C and I are slowly adding intended-edibles to the landscape.&nbsp; I mean, fun is fun, but come on.</p>
<p>Did you know that, maybe a hundred years ago, you wouldn't have needed a cherry pitter at all?&nbsp; A <a title="buttonhook society site!" href="http://www.thebuttonhooksociety.com/mainpage.php" target="_blank">button hook </a>would have done.&nbsp; Just another example of technology deteriorating.</p>
<h2>3. Cherries no relation</h2>
<p>Speaking of technological devolution... don't get me started on Bing the Merciless.&nbsp; It's not only the name that comes up short.&nbsp; And it's not only my son's job that keeps me with Google.&nbsp; Sigh.</p>
<p>&nbsp;</p>http://www.spacefold.com/lisa/post/2010/06/22/Odds-and-Ends-and-YAPS-on-VFP-PDF.aspx
lisa@spacefold.comhttp://www.spacefold.com/lisa/post/2010/06/22/Odds-and-Ends-and-YAPS-on-VFP-PDF.aspx#commenthttp://www.spacefold.com/lisa/post.aspx?id=066eea3a-94e5-4a49-998e-e8b7bb47434bMon, 21 Jun 2010 21:25:00 -0600General TechSpeakLifeVisual FoxProYAPSLSNhttp://www.spacefold.com/lisa/pingback.axdhttp://www.spacefold.com/lisa/post.aspx?id=066eea3a-94e5-4a49-998e-e8b7bb47434b5http://www.spacefold.com/lisa/trackback.axd?id=066eea3a-94e5-4a49-998e-e8b7bb47434bhttp://www.spacefold.com/lisa/post/2010/06/22/Odds-and-Ends-and-YAPS-on-VFP-PDF.aspx#commenthttp://www.spacefold.com/lisa/syndication.axd?post=066eea3a-94e5-4a49-998e-e8b7bb47434bYAPS on Dynamic Reports and Parameters: Charts get into the act<p>Wow.&nbsp;I can't believe how long it's been since my last post here.</p>
<p>The questions are piling up, the garden wants attention, or at least serious admiration, and I'm travelling a bit more than I'd like for work. C and I keep stockpiling films we'd like to see... someday. And&nbsp;time really flies when you have a <a title="blog post about the perfect grandchild" href="http://spacefold.com/lisa/post/2009/08/14/And-then-there-were-three.aspx">Jonah</a>&nbsp;to play with.</p>
<p>It's getting more and more difficult to find time to sift through the compost, let alone the interesting requests for help that I get here.</p>
<p>Before getting on the next plane and making the next meeting, I'd like to answer at least one item of general interest, and it shouldn't take long. I'll give you the entire question in a short, separate text file, with no attribution, because there are some ins and outs that are not entirely relevant, and the question unfolded over several messages.</p>
<p><a href="http://www.spacefold.com/lisa/file.axd?file=2010%2f4%2fDynamicChartExpressionsQuestion.txt" target="_blank">DynamicChartExpressionsQuestion</a></p>
<p>In general, here are the requirements&nbsp; we have:</p>
<ul>
<li>Do something the same way in WebForm and WinForm.&nbsp; Well, ReportViewer certainly fits that bill. But the full question indicates that the person doesn't necessarily know that -- so I'd better mention it.</li>
<li>Do it with an RDLC. No problem there, in either environment.</li>
<li>Show a&nbsp;scatterplot several times on a page, each time using different columns of the same dataset for the axes, and potentially other aspects of the graph, such as titles.</li>
</ul>
<p>The request also specifies that the graphs are simple plots, nothing fancy, so I'm not going to worry much about the details of formatting a scatterplot.</p>
<p>In general, it's the dynamic&nbsp;data aspects that seem to be the issue.&nbsp; I'll excerpt: <em>"I can deal with the looping to add the graphs but the bit I can't get my head around is how to programmatically specify the x and y data source and also the axis titles using the headings. All my graphs will be the same layout and format so I can use a single rdlc file for that."</em>&nbsp;</p>
<h3>This question will remain anonymous</h3>
<p>I usually name the questioner, but in this case, he mentioned one detail&nbsp;about his work situation I'd like to share without causing him any work difficulties: for whatever reason, he's been stuck in VS and RS 2005.&nbsp; So that's what I'm going to use to illustrate, although I'm sure it's pretty much the same scenario in later versions.&nbsp; (At least I hope it is --<a title="blog post about RS versionitis" href="http://spacefold.com/lisa/post/2010/02/20/YAPS-on-Dynamic-PageBreaks-the-RS-2005-SQL-Sequel.aspx"> I've been wrong before</a>, please let me know if this is a technique that needs to be tweaked.&nbsp; Certainly charting changed a lot in RS 2008.)</p>
<p class="NB">I especially want to mention this version constraint because I'm seeing the same thing&nbsp;with a number of clients.&nbsp; For whatever reason -- hosted databases on a third-party provider, generally conservative habits, a huge backload of work that would need testing for a new version -- a lot of people are just beginning to move towards SQL Server 2008 now.&nbsp; It makes it difficult for me to get really excited about 2010 and all the truly gotta-have improvements it "must" be bringing.&nbsp; I guess I'm just getting old.</p>
<p>Now, about that question.</p>
<h3>Simple setup</h3>
<p>To simplify my own life, I'm going to fake the situation using a table from my usual SQLWorld database, with some random values in three columns (don't try to make sense of this data) that I'll specify dynamically for one axis.&nbsp; I'm sure you'll see how this could be extended to the other axis.&nbsp; I'll also dynamically determine the axis title using the name of the column I'm dynamically specifying, rather than considering this a separate problem, since we know this is different for each iteration of the graph.&nbsp; <br /><br /><span style="color: #0000ff; font-size: x-small;"><span style="color: #0000ff; font-size: x-small;">SELECT</span></span><span style="font-size: x-small;"> </span><span style="color: #0000ff; font-size: x-small;"><span style="color: #0000ff; font-size: x-small;">TOP</span></span><span style="font-size: x-small;"> 25 <br /></span><span style="color: #ff00ff; font-size: x-small;"><span style="color: #ff00ff; font-size: x-small;">&nbsp;&nbsp; RTRIM</span></span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">(</span></span><span style="font-size: x-small;">Country</span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">.</span></span><span style="font-size: x-small;">Name</span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">)</span></span><span style="font-size: x-small;"> </span><span style="color: #0000ff; font-size: x-small;"><span style="color: #0000ff; font-size: x-small;">AS</span></span><span style="font-size: x-small;"> Country </span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">,<br /></span></span><span style="color: #ff00ff; font-size: x-small;"><span style="color: #ff00ff; font-size: x-small;">&nbsp;&nbsp; ROW_NUMBER</span></span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">()</span></span><span style="font-size: x-small;"> </span><span style="color: #0000ff; font-size: x-small;"><span style="color: #0000ff; font-size: x-small;">OVER</span></span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">(</span></span><span style="font-size: x-small;"> </span><span style="color: #0000ff; font-size: x-small;"><span style="color: #0000ff; font-size: x-small;">ORDER</span></span><span style="font-size: x-small;"> </span><span style="color: #0000ff; font-size: x-small;"><span style="color: #0000ff; font-size: x-small;">BY</span></span><span style="font-size: x-small;"> Country</span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">.</span></span><span style="font-size: x-small;">Name</span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">)</span></span><span style="font-size: x-small;"> </span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">%</span></span><span style="font-size: x-small;"> 5 </span><span style="color: #0000ff; font-size: x-small;"><span style="color: #0000ff; font-size: x-small;">AS</span></span><span style="font-size: x-small;"> </span><span style="color: #0000ff; font-size: x-small;"><span style="color: #0000ff; font-size: x-small;">Sets</span></span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">,<br /></span></span><span style="color: #ff00ff; font-size: x-small;"><span style="color: #ff00ff; font-size: x-small;">&nbsp;&nbsp; SUM</span></span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">(</span></span><span style="font-size: x-small;">City</span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">.</span></span><span style="color: #0000ff; font-size: x-small;"><span style="color: #0000ff; font-size: x-small;">Population</span></span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">)</span></span><span style="font-size: x-small;"> </span><span style="color: #0000ff; font-size: x-small;"><span style="color: #0000ff; font-size: x-small;">AS</span></span><span style="font-size: x-small;"> RandomX1</span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">,<br /></span></span><span style="color: #ff00ff; font-size: x-small;"><span style="color: #ff00ff; font-size: x-small;">&nbsp;&nbsp; MIN</span></span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">(</span></span><span style="font-size: x-small;">City</span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">.</span></span><span style="color: #0000ff; font-size: x-small;"><span style="color: #0000ff; font-size: x-small;">Population</span></span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">)</span></span><span style="font-size: x-small;"> </span><span style="color: #0000ff; font-size: x-small;"><span style="color: #0000ff; font-size: x-small;">AS</span></span><span style="font-size: x-small;"> RandomX2</span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">,<br /></span></span><span style="color: #ff00ff; font-size: x-small;"><span style="color: #ff00ff; font-size: x-small;">&nbsp;&nbsp; MAX</span></span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">(</span></span><span style="font-size: x-small;">City</span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">.</span></span><span style="color: #0000ff; font-size: x-small;"><span style="color: #0000ff; font-size: x-small;">Population</span></span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">)</span></span><span style="font-size: x-small;"> </span><span style="color: #0000ff; font-size: x-small;"><span style="color: #0000ff; font-size: x-small;">AS</span></span><span style="font-size: x-small;"> RandomX3<br /></span><span style="color: #0000ff; font-size: x-small;"><span style="color: #0000ff; font-size: x-small;">FROM<br /></span></span><span style="font-size: x-small;">&nbsp;City </span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">JOIN</span></span><span style="font-size: x-small;"> Country </span><span style="color: #0000ff; font-size: x-small;"><span style="color: #0000ff; font-size: x-small;">on</span></span><span style="font-size: x-small;"> City</span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">.</span></span><span style="font-size: x-small;">CountryCode </span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">=</span></span><span style="font-size: x-small;"> Country</span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">.</span></span><span style="font-size: x-small;">Code<br /></span><span style="color: #0000ff; font-size: x-small;"><span style="color: #0000ff; font-size: x-small;">GROUP&nbsp;</span></span><span style="font-size: x-small;"> </span><span style="color: #0000ff; font-size: x-small;"><span style="color: #0000ff; font-size: x-small;">BY</span></span><span style="font-size: x-small;"> Country</span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">.</span></span><span style="font-size: x-small;">Name <br /></span><span style="color: #0000ff; font-size: x-small;"><span style="color: #0000ff; font-size: x-small;">ORDER</span></span><span style="font-size: x-small;"> </span><span style="color: #0000ff; font-size: x-small;"><span style="color: #0000ff; font-size: x-small;">BY</span></span><span style="font-size: x-small;"> Country</span><span style="color: #808080; font-size: x-small;"><span style="color: #808080; font-size: x-small;">.</span></span><span style="font-size: x-small;">Name</span></p>
<p>If you're playing along, just think "pivot table" in Excel and you'll have the right-shaped data.</p>
<p>&nbsp;</p>
<p style="TEXT-ALIGN: center"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f4%2fDCE1-Data.PNG" alt="" /></p>
<p>To be honest, I think if I was solving this problem, I'd use a different data structure.&nbsp; I wouldn't pivot the data, I'd use a key column to indicate what type of value each row was.&nbsp; Each graph would filter the results differently.&nbsp;</p>
<p>But, if the graph is doing the filtering, rather than the dataset doing it before the RDLC "sees" the dataset, you're still specifying something dynamically in the graph -- and you'll still be able to do it the way I'm showing you here.</p>
<p>There's nothing special about the layout, either:</p>
<p style="text-align: center;"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f4%2fDCE2-Layout.PNG" alt="" /></p>
<h3>Specifying dynamic behavior to a graph</h3>
<p>How do you normally give instructions to a report from the outside?&nbsp; You use a parameter, of course.&nbsp;</p>
<p>It's no different&nbsp;here.&nbsp;</p>
<p>&nbsp;</p>
<p style="text-align: center;"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f4%2fDCE3-Parameter.PNG" alt="" /></p>
<p class="NB">As I write this, I'm wondering if the person asking the question doesn't understand how to use parameters with an RDLC.&nbsp; If that's the case, he'll write and tell me, and I'll explain (probably by pointing him to a <a title="blog post on dynamic use of RDLCs with simple parameter adjustment example" href="http://spacefold.com/lisa/post/2007/09/19/Dynamically-loading-reports-in-ReportViewers.aspx">different post</a>).&nbsp;</p>
<p>In this example, I'm going to use a single parameter, shown above, to provide&nbsp;information for one axis and also the chart title. I'll use a direct expression for the former and a code function for the latter, just to illustrate the possibilities.&nbsp; Obviously, you can have additional parameters (and do more of the work outside the report, rather than writing a code function inside the report) if you want.</p>
<p>As you can see here, the code function shows up in the Chart Properties...</p>
<p>&nbsp;</p>
<p style="text-align: center;"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f4%2fDCE4-ChartProperties.PNG" alt="" /></p>
<p>... and the function itself is just for illustration purposes (it didn't matter what I used here, as long as you could see that the result was dynamic)...</p>
<p style="text-align: center;"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f4%2fDCE5-Code.PNG" alt="" /></p>
<p>Now we come to the axes.&nbsp; Forgive me for naming the columns incorrectly; by the time I whipped up the graph I'd decided to specify Y dynamically, instead of X (in real life, of course, you can do both), so I shouldn't have named them RandomX&lt;N&gt;.&nbsp; The X axies is really being specified as Country in this example:</p>
<p style="text-align: center;"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f4%2fDCE6-XAxes.PNG" alt="" /></p>
<p>... and, just to make sure you see everything, the Series in this graph are taken care of by the Sets column I added to the dataset:&nbsp;</p>
<p style="text-align: center;"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f4%2fDCE7-Series.PNG" alt="" /></p>
<p>... which just leaves us with the dynamic column.&nbsp; It's specified similarly to the other items you see above, by using an expression rather than a literal.&nbsp; You've already seen it in the layout above, but here it is up close and personal:</p>
<p style="text-align: center;"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f4%2fDCE8-DynamicValues.PNG" alt="" /></p>
<p>&nbsp;... pretty much as you would expect.&nbsp; For each iteration of the loop, your code is&nbsp;going to change the value of WhichColumn to match one of your field names in the dataset, and this is going to drive your graph...</p>
<table border="0">
<tbody>
<tr>
<td><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f4%2fDCE9-Results.PNG" alt="" /></td>
<td valign="top">
<p>... and that's all she wrote.&nbsp; If you have questions, or if there is a complexity I'm overlooking here, please let me know?</p>
<h3>Hmmmm.</h3>
<p>As I write this, I wonder if there is an obvious way to do this without iterating over the graphs in code that I'm not thinking about.</p>
<p>Why, for example, can't I use a code variable instead of a parameter here, and change the information in a function called between each graph?</p>
<p>That approach could be dangerous -- especially when we change versions -- but I might be able to group on a sequencing SQL column to do the same thing, or something similar.</p>
<p>And I still bet it would be easier without the&nbsp;table being pivotted, probably painfully, in preparation.</p>
<h3>Hard to get to !?!</h3>
<p>It bears thinking about. Maybe on the plane...</p>
</td>
</tr>
</tbody>
</table>
<h3>P.S.</h3>
<p>Yes I know that last line was a stretch, but I haven't paid my <a title="Serenity the movie" href="http://www.serenitymovie.com/" target="_blank">Serenity tax</a> in a while.</p>
<p>Wow, now, that's a cheery link to visit just before a plane trip...</p>
<p class="NB">"This is the captain, we may experience some turbulance, and then... explode."&nbsp; <br />"I don't wanna explode!" <br />"I think we better run..."</p>http://www.spacefold.com/lisa/post/2010/04/16/YAPS-on-Dynamic-Reports-and-Parameters-Charts-get-into-the-act.aspx
lisa@spacefold.comhttp://www.spacefold.com/lisa/post/2010/04/16/YAPS-on-Dynamic-Reports-and-Parameters-Charts-get-into-the-act.aspx#commenthttp://www.spacefold.com/lisa/post.aspx?id=1e59266c-2081-447b-bf77-c9a970c2b3e9Fri, 16 Apr 2010 10:50:00 -0600ReportingSQL ServerYAPSLSNhttp://www.spacefold.com/lisa/pingback.axdhttp://www.spacefold.com/lisa/post.aspx?id=1e59266c-2081-447b-bf77-c9a970c2b3e99http://www.spacefold.com/lisa/trackback.axd?id=1e59266c-2081-447b-bf77-c9a970c2b3e9http://www.spacefold.com/lisa/post/2010/04/16/YAPS-on-Dynamic-Reports-and-Parameters-Charts-get-into-the-act.aspx#commenthttp://www.spacefold.com/lisa/syndication.axd?post=1e59266c-2081-447b-bf77-c9a970c2b3e9YAPS on Dynamic PageBreaks: the RS 2005 SQL Sequel<h2>I am seriously annoyed.&nbsp;</h2>
<p>In <a href="http://spacefold.com/lisa/post/2010/02/14/YAPS-on-Dynamic-PageBreaks-Mixing-up-the-Groups.aspx">http://spacefold.com/lisa/post/2010/02/14/YAPS-on-Dynamic-PageBreaks-Mixing-up-the-Groups.aspx</a>&nbsp;I did a lot of work I didn't need to do.&nbsp; Karthik needed an RS 2005 solution and I gave him an RS 2008 solution, not having resources at hand to figure out that tables and tablixes (is that even a word?) behave entirely differently in this scenario.</p>
<p>As Karthik explains in his comments to that post, when he tried to use a "lower down" group, as I instructed, for the purpose of breaking on his break number, he got a page break every "outer" group (in my example, CountryCode), even though the outer group didn't specify a pagebreak on that level.&nbsp; This just doesn't happen with a tablix.</p>
<p>So, okay.&nbsp; What's a guy to do?&nbsp;</p>
<p>Follow a girl's earlier advice; see <a href="http://spacefold.com/lisa/post/2009/03/08/Dynamic-Page-Breaks-in-SSRS-Going-to-Eleven.aspx">http://spacefold.com/lisa/post/2009/03/08/Dynamic-Page-Breaks-in-SSRS-Going-to-Eleven.aspx</a>.&nbsp;&nbsp;</p>
<p><em>All together now:</em></p>
<h2>When groups aren't working... don't use 'em.</h2>
<p>The reason I'm annoyed is that the resolution I'm going to show you is what I expected to do for Karthik, but it didn't work in RS2008. It is much easier than what I ended up showing you, IMHO,&nbsp; easier to understand , and more conceptually pure. I'll implement it for all three inner groups at once, instead of just making it work for the outermost group (CountryCode, in my example),&nbsp;because it's actually easier to do it that way.</p>
<p>So, here's what we'll do.</p>
<h3>1. Get rid of the special mid-level group.</h3>
<p>&nbsp;Go back to the original dynamic group break, on the outside level, that Karthik had implemented.</p>
<h3>2. Get rid of the Report-level custom code functionality.</h3>
<p>We won't need to call a code function or keep track of the groups.&nbsp; Just&nbsp;use&nbsp;Karthik's&nbsp;standard expression for the outermost group's dynamic page break.&nbsp; While I left my rownum column in the SQL that you will see below, you can go back to RowNumber(Nothing) in the expression if you want.&nbsp; In this context they should work the same way.</p>
<p class="code"><strong>=Ceiling(Fields!rownum.value/Parameters!BreakOn.Value) <br /></strong><span style="color:green;">or</span><br /><strong>=Ceiling(RowNumber(Nothing)/Parameters!BreakOn.Value) </strong></p>
<h3>3. Get rid of the group footers!</h3>
<p>Yes, you heard me.&nbsp; We'll still get the sums on the group level that we want.</p>
<p align="center"><img style="border-top:1px;border-style:solid;border-color:silver;" src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f2%2fK20051.PNG" alt="" /></p>
<p>Instead, add three detail-level rows, below the "real" detail row, with expressions that look like this, one to a row:</p>
<p class="code"><strong><span style="background-color:#8fa0b0;color:white;"><strong>=Sum(Fields!Population.Value,"table1_NameInitial")</strong></span><br /><span style="background-color:SlateGray;color:white;"><br />=Sum(Fields!Population.Value,"table1_District")<br /></span><br /><span style="background-color:#6e9eca;color:white;">=Sum(Fields!Population.Value,"table1_CountryCode")</span></strong></p>
<p>... starting to see where we're going with this?&nbsp; We're simply going to put Visibility expressions on each of these detail rows.</p>
<p>Please notice the proper use of scope arguments on each expression above, which is critical for either the RS2005 or RS2008 solution.</p>
<h3>4. Make the SQL do most of the work</h3>
<p>This time, instead of making our SQL look "back" at the previous row's values, we'll just make it look "forward" to the next row's values.&nbsp; And this time, we'll include the group information for each of the three internal group levels explicitly, since it doesn't "cost" any more to do it:&nbsp;</p>
<p class="code"><span style="color: #0000ff;">SELECT&nbsp;</span>curr<span style="color: #808080;">.*,</span> <span style="color: #808080;">Left(</span>Name<span style="color: #808080;">,</span>1<span style="color: #808080;">)</span> <span style="color: #0000ff;">AS</span> NameInitial<span style="color: #808080;">,</span>&nbsp;<br /><span style="color: #0000ff;">&nbsp; next</span><span style="color: #808080;">.</span>CountryCode <span style="color: #0000ff;">AS</span> NextCountryCode <span style="color: #808080;">,</span>&nbsp;<br /><span style="color: #0000ff;">&nbsp; next</span><span style="color: #808080;">.</span>District <span style="color: #0000ff;">AS</span> NextDistrict<span style="color: #808080;">,</span>&nbsp;<br /><span style="color: #0000ff;">&nbsp; next</span><span style="color: #808080;">.</span>NextNameInitial<span style="color: #0000ff;"> FROM<br /></span><span style="color: #808080;">(</span><br /><span style="color: #0000ff;">&nbsp; SELECT</span> <span style="color: #0000ff;">TOP</span> 100 <span style="color: #0000ff;">PERCENT</span> <span style="color: #ff00ff;">ROW_NUMBER</span><span style="color: #808080;">()</span> <span style="color: #0000ff;">Over</span>&nbsp;<span style="color: #0000ff;">&nbsp;<br /></span><span style="color: #808080;">&nbsp;&nbsp;&nbsp; (</span><span style="color: #0000ff;">ORDER</span> <span style="color: #0000ff;">BY</span> CountryCode<span style="color: #808080;">,</span>District<span style="color: #808080;">,</span>Name<span style="color: #808080;">)</span> <span style="color: #0000ff;">AS</span> RowNum<span style="color: #808080;">,</span>&nbsp;<br /><span style="color: #ff00ff;">&nbsp;&nbsp;&nbsp; RTRIM</span><span style="color: #808080;">(</span>Name<span style="color: #808080;">)</span> <span style="color: #0000ff;">AS</span> Name<span style="color: #808080;">,</span>CountryCode<span style="color: #808080;">,</span> District<span style="color: #808080;">,</span> <span style="color: #0000ff;">Population</span><span style="color: #808080;">,</span> ID&nbsp;<br /><span style="color: #0000ff;">&nbsp; FROM</span> NewWorld<span style="color: #808080;">.</span>dbo<span style="color: #808080;">.</span>City&nbsp;&nbsp;<br /><span style="color: #0000ff;">&nbsp;&nbsp;&nbsp; ORDER</span> <span style="color: #0000ff;">BY</span> countrycode<span style="color: #808080;">,</span>district<span style="color: #808080;">,</span>name&nbsp;&nbsp;<br /><span style="color: #808080;">)</span> curr<span style="color: #808080;"> <br />LEFT&nbsp;</span><span style="color: #808080;">JOIN</span>&nbsp;<span style="color: #0000ff;">&nbsp;<br /></span><span style="color: #808080;">(</span><br /><span style="color: #0000ff;">&nbsp; SELECT</span> <span style="color: #0000ff;">TOP</span> 100 <span style="color: #0000ff;">PERCENT</span> <span style="color: #ff00ff;">ROW_NUMBER</span><span style="color: #808080;">()</span> <span style="color: #0000ff;">Over</span>&nbsp;<span style="color: #0000ff;">&nbsp;<br /></span><span style="color: #808080;">&nbsp;&nbsp;&nbsp; (</span><span style="color: #0000ff;">ORDER</span> <span style="color: #0000ff;">BY</span> CountryCode<span style="color: #808080;">,</span>District<span style="color: #808080;">,</span>Name<span style="color: #808080;">)</span> <span style="color: #0000ff;">AS</span> RowNum<span style="color: #808080;">,</span> <br />&nbsp;&nbsp;&nbsp; CountryCode <span style="color: #808080;">,</span> District<span style="color: #808080;">, Left(</span>Name<span style="color: #808080;">,</span>1<span style="color: #808080;">)</span> <span style="color: #0000ff;">AS</span> NextNameInitial<br />&nbsp;&nbsp; <span style="color: #0000ff;">FROM</span> NewWorld<span style="color: #808080;">.</span>dbo<span style="color: #808080;">.</span>City &nbsp;<br /><span style="color: #0000ff;">&nbsp;&nbsp;&nbsp; ORDER</span> <span style="color: #0000ff;">BY</span> countrycode<span style="color: #808080;">,</span>district<span style="color: #808080;">,</span>name &nbsp;<br /><span style="color: #808080;">)</span> <span style="color: #0000ff;">next <br />ON&nbsp;</span>&nbsp;<br />curr<span style="color: #808080;">.</span>RowNum<span style="color: #808080;">+</span>1 <span style="color: #808080;">=</span> <span style="color: #0000ff;">next</span><span style="color: #808080;">.</span> RowNum</p>
<h3>5. Ensure the ersatz group footers show up... only when you want 'em</h3>
<p>Now for those Visibility instructions on the three special detail rows.&nbsp; Each one is pretty much what you would expect, a comparison of the current row's grouping value to the next row's grouping value... just remember (counter-intuitively) that you want the expression to evaluate to true when the row should be Hidden, not Visible:</p>
<p class="code"><strong><span style="background-color:#8fa0b0;color:white;">=(Fields!NameInitial.Value=Fields!NextNameInitial.Value)</span><br /></strong><br /><strong><span style="background-color:SlateGray;color:white;">=(Fields!District.Value=Fields!NextDistrict.Value)</span><br /></strong><br /><strong><span style="background-color:#6e9eca;color:white;">=(Fields!CountryCode.Value=Fields!NextCountryCode.Value)</span></strong></p>
<p align="center"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f2%2fK20052.PNG" alt="" /></p>
<h2>The inevitable caveats&nbsp;</h2>
<p>I should&nbsp;point out that&nbsp;there's probably a way to do this without any fancy SQL at all, by comparing RunningValue with Sum in these Visibility expressions, and taking care to use the proper scope argument for each, similarly to how you see the Scope arguments being used in the displayed expressions for each textbox.&nbsp; This way, the report does more of the work and the SQL does less of the work.&nbsp;</p>
<p>The choice, and the testing,&nbsp;is up to you and your environment/results of performance tests, I'm not going to mess with any more variants here.</p>
<p>I should also point out that, if you review the comments on the previous post, I'm not convinced that this dynamic break approach is the right way to resolve Karthik's original problem, as he later explained it.&nbsp; I think there are some user-communication questions, an examination of the actual requirements and what best serves them from a usability issue, and probably a very happy user-developer combination, with less work, afterwards.</p>
<p>But if you do need to resolve the problem as originally presented, it is solvable.</p>
<h2>Bleh.</h2>
<p>I don't know about you, but this feels a lot more "natural" than the stunt I pulled to make this work in RS 2008.&nbsp; What you see here is honestly the first thing I tried, last time.&nbsp;Reading it over, I see I even alluded to that attempt in the earlier post.&nbsp; I wasn't kidding; it was a nightmare, and I wasted a lot of time on it.</p>
<p>I still don't know why it doesn't work as expected with a tablix. Tablix groupings (including the newfangled idea of "adjacent" groups along with "parent-child" groups, which don't quite match up to my expectations of&nbsp;how a&nbsp;<a title="blog post explaining about multi-detail-bands" href="http://spacefold.com/lisa/post/2007/08/09/Reporting-Convergences-Chapter-Multi-Detail-Bands-SQL-Reporting-Services-Style.aspx" target="_parent">multi-detail band</a>&nbsp;might be expected to work) are so much more complex.&nbsp; I suppose there's a good reason.</p>
<p>Or... maybe it's a bug in RS 2008 grouping, and the next iteration of RS will change the behavior entirely. I suggest we all re-group, and re-test, then.</p>http://www.spacefold.com/lisa/post/2010/02/20/YAPS-on-Dynamic-PageBreaks-the-RS-2005-SQL-Sequel.aspx
lisa@spacefold.comhttp://www.spacefold.com/lisa/post/2010/02/20/YAPS-on-Dynamic-PageBreaks-the-RS-2005-SQL-Sequel.aspx#commenthttp://www.spacefold.com/lisa/post.aspx?id=7802d2b0-6474-410e-b312-189ea3a0631eFri, 19 Feb 2010 21:04:00 -0600ReportingSQL ServerYAPSLSNhttp://www.spacefold.com/lisa/pingback.axdhttp://www.spacefold.com/lisa/post.aspx?id=7802d2b0-6474-410e-b312-189ea3a0631e3http://www.spacefold.com/lisa/trackback.axd?id=7802d2b0-6474-410e-b312-189ea3a0631ehttp://www.spacefold.com/lisa/post/2010/02/20/YAPS-on-Dynamic-PageBreaks-the-RS-2005-SQL-Sequel.aspx#commenthttp://www.spacefold.com/lisa/syndication.axd?post=7802d2b0-6474-410e-b312-189ea3a0631eYAPS on Dynamic PageBreaks: Mixing up the Groups<p><a title="Karthik's request as a comment on a blog post" href="http://spacefold.com/lisa/post/2009/03/08/Dynamic-Page-Breaks-in-SSRS-Going-to-Eleven.aspx#id_68c75b71-d808-4e25-9b63-87169c837813" target="_parent">Karthik asks</a></p>
<blockquote>
<p>My actual task is to display totals of each group at the end of page breaks which are further grouped on count of 1000. I don't know how to proceed with this issue. I have also queried the same at MSDN forums at the following links but haven't been getting any responses at all.</p>
<p>social.technet.microsoft.com/.../b3ea0253-bb5a-463d-82e8-4e9d1d9eed3a</p>
<p>Could you please provide any tips/suggestions on the way to deal with this task?</p>
</blockquote>
<p>This is actually a tough one, but luckily I brought grenades.&nbsp; Today's Karthik's day in TechSpoken Court...</p>
<h2>Why is this so hard?</h2>
<p>Let's &nbsp;quickly recap the problem.&nbsp; I will demonstrate Karthik's scenario using the City table in my standard SqlWorld sample db.&nbsp;</p>
<p class="code"><span style="color: #0000ff; ">SELECT </span>id, countrycode, district, name, LEFT(name,1) AS NameInitial, population<br /><span style="color: #0000ff;">FROM </span>city <br /><span style="color: #0000ff;">ORDER BY</span>countrycode,district,name</p>
<p>Karthik has three "real" groupings and aggregation levels in his report, which we will model using CountryCode, District, and the first initial of the city name (that's why the ORDER BY clause).</p>
<p>Typically, you put a conditional or dynamic page break instruction on an outer group.&nbsp; In this case Karthik has used <strong>CEILING(RowNumber(NOTHING)/1000)</strong> as his outermost group instruction.&nbsp;</p>
<p>When an outer group breaks, each inner group breaks too; they are "child" groups, or nested aggregates.&nbsp;&nbsp;Karthik's problem occurs when one of his "real" groups has more than 1000 rows. &nbsp;Karthik doesn't want to see his sums or other aggregates until the "real" groups are actually finished.</p>
<p>Since my sample doesn't really have more than 1000&nbsp;rows in any one set, and to test properly, I've made the "Break on" figure configurable, with a default value of 3 rows.&nbsp;&nbsp;I've illustrated the problem like this:</p>
<p>&nbsp;<img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f2%2fK1.PNG" alt="" /></p>
<p>The <strong>AGO</strong> country code grouping that starts on page 2 doesn't finish on page 2.&nbsp; Therefore, even though a group break is forced by the outer group every 3 detail rows, we shouldn't have totals for AGO on page 2.</p>
<p>The report is doing what we said, but it isn't doing what we meant.</p>
<h2>What not to try</h2>
<p>I first tried to solve this problem using a "remove the groups" strategy, which I've <a title="blog post on when not to use groups" href="http://spacefold.com/lisa/post/2009/03/08/Dynamic-Page-Breaks-in-SSRS-Going-to-Eleven.aspx" target="_parent">used successfully in other scenarios </a>before.&nbsp; It quickly turned into a nightmare.&nbsp; I'll cut to the chase and say... don't bother.</p>
<h2>Inner dynamic group breaks</h2>
<p>I realized that the right thing to do was to move the dynamic break group inside the ones that might have more members and shouldn't show aggregates until they legitimately ended.&nbsp; This is the right solution, but it turned out to be a little more complicated than expected.</p>
<p class="NB">Before I explain, the usual caveats.&nbsp; In this case, there are two things to keep in mind:<br /><br />1. My analysis may be better than my solution. Read what's involved, because I've done this part right. Maybe you'll think of a better way to handle what needs to be done.<br /><br />2. I'm only moving one level of grouping inwards, because that's all that's necessary to show you what's involved -- even though, as you'll see, the District group could also "overflow" the test break value&nbsp;of three rows&nbsp;that I'm using in these screen shots&nbsp;is&nbsp;so small. However, if Karthik or you have more than one additional level that could have more rows than the explicit page breaks you want to create, it doesn't change the problem. Whatever solution you use -- whether mine or your improved version -- the thing-to-fix, and how it works, remain exactly the same.</p>
<h3>The&nbsp;unkindest cut</h3>
<p>We start, as explained&nbsp;&nbsp;by moving the outermost group with the special "CEILING" expression one level inward.&nbsp; You can try taking Karthik's expression and just moving it, as-is, if you want to play along.&nbsp; Here's the error you'll get:</p>
<blockquote>
<p style="color:red;">A group expression for the grouping 'Standard Page Break' uses the RowNumber function with a scope that is not valid.&nbsp; When used in a group expression, the value of the scope parameter of RowNumber must equal the name of the group directly containing the current group.</p>
</blockquote>
<p>Ouch.&nbsp;Note: this is the error message I get in RS 2008 using the Report Designer; it might be slightly less explicit using ReportBuilder or RS 2005, but I imagine the engine rules are the same.</p>
<p>You can try to do the obvious thing and use the scope suggested in this error message (in my case, that would be <strong>RowNumber("table1_CountryCode")</strong>).&nbsp; This may seem to work for you -- for me, it didn't have the desired results.&nbsp;&nbsp;&nbsp;Maybe I should have perservered, but I think that different sort orders, on different levels, may interfere. So, instead, I thought about how I could mimic the desired behavior of <strong>RowNumber(Nothing)</strong> without actually using the forbidden syntax.</p>
<h3>The second cut</h3>
<p>I did a number of things with Code functions, counting rows myself, which seemed to sort-of-work.&nbsp; But the behavior seemed a bit flakey, especially when rendering to HTML and flipping back and forth between pages.&nbsp;</p>
<p>In the end, I took the more reliable route of creating my own row counter in SQL, like this:&nbsp;</p>
<p class="code"><span style="color: #0000ff;">SELECT</span> <br />Name,CountryCode, District, Population, ID,<br /><span style="color:#ff00ff;">ROW_NUMBER() </span><span style="color: #0000ff;">ORDER BY</span> CountryCode,District,Name) <br /><span style="color: #0000ff;">FROM</span> City<br /><span style="color: #0000ff;">ORDER BY</span> CountryCode,District,Name<br /><span style="color:green;"><br />-- the new group break expression is: <br />-- =CEILING(Fields!RowNum.Value/Parameters!BreakOn.Value)</span></p>
<p>... and that sort-of worked. I mean, it worked for most pages.</p>
<p>But now I had a new problem. On pages where the CountryCode (outer) group break and the pagebreak limit (Parameters!BreakOn.Value) coincided exactly, no page break occurred.&nbsp; Apparently, the fact that the outer group said "no page break" countermanded the inner group's explicit page break instructions.&nbsp;</p>
<p style="TEXT-ALIGN: center"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f2%2fK2.PNG" alt="" /></p>
<p>This behavior was consistent in different renderers, and seemed to have nothing to do with margins, sort orders, or anything else I could tweak.&nbsp; So, clearly, more effort was required.</p>
<h3>Giving myself a break</h3>
<p>By the time I figured out the pattern of the mysterious pages that didn't work as expected, I wanted to solve this in a very literal-minded fashion and get it over with already.&nbsp; I already had a way to say "do a page breaks without unwarranted group header and footers", that was inner.&nbsp; But now I needed to say "Also break at the same time as group headers and footers are warranted".&nbsp; So, I realized I needed a second way to break -- outermost, where it would be the highest-level authority on whether a page break was called for.</p>
<p>&nbsp;</p>
<p align="center"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f2%2fK3.PNG" alt="" /></p>
<p>What would be the proper group break expression for the new group, though?</p>
<p>I knew I wanted to to give the group these instructions: "Only break when (a) you've hit the right number of rows and (b) you've also hit the CountryCode group break".&nbsp;</p>
<p>Again, thinking literally, I knew that the second condition could be satisfied by checking the current CountryCode against the previous row's CountryCode.&nbsp; But, in using the Previous function,&nbsp;I ran into similar limitations in group expressions as I'd faced with the RowNumber() function:</p>
<blockquote>
<p style="color:red;">A group expression includes the aggregate function 'Previous'.&nbsp; Previous cannot be used in group expressions.</p>
</blockquote>
<p>Ouch squared.</p>
<p>I tried a lot of ways to get around this expression, as I did earlier (because I am stubborn), by writing code to compare the values myself, but in the end I took the somewhat more controllable path of adding the value directly into my SQL query, like this:</p>
<p class="code"><span style="color:#0000ff">SELECT&nbsp;</span>curr<span style="color:#808080">.*,</span> prev<span style="color:#808080">.</span>CountryCode <span style="color:#0000ff">AS</span> PrevCountryCode <br /><span style="color:#0000ff">FROM&nbsp;<br />&nbsp;&nbsp; </span><span style="color:#808080">(<br />&nbsp;&nbsp;&nbsp; <span style="color: #0000ff">S</span></span><span style="color:#0000ff">ELECT</span> <span style="color:#0000ff">TOP</span> 100 <span style="color:#0000ff">PERCENT</span> <span style="color:#ff00ff">ROW_NUMBER</span><span style="color:#808080">()</span> <span style="color:#0000ff">Over</span> &nbsp;<br /><span style="color:#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (</span><span style="color:#0000ff">ORDER</span> <span style="color:#0000ff">BY</span> CountryCode<span style="color:#808080">,</span>District<span style="color:#808080">,</span>Name<span style="color:#808080">)</span> <span style="color:#0000ff">AS</span> RowNum<span style="color:#808080">,</span>&nbsp;<br /><span style="color:#ff00ff">&nbsp;&nbsp;&nbsp;&nbsp;RTRIM</span><span style="color:#808080">(</span>Name<span style="color:#808080">)</span> <span style="color:#0000ff">AS</span> Name<span style="color:#808080">,</span>CountryCode<span style="color:#808080">,</span> District<span style="color:#808080">,</span> <span style="color:#0000ff">Population</span><span style="color:#808080">,</span> ID &nbsp;<br /><span style="color:#0000ff">&nbsp;&nbsp;&nbsp; FROM</span> City&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">ORDER</span> <span style="color:#0000ff">BY</span> countrycode<span style="color:#808080">,</span>district<span style="color:#808080">,</span>name<br />&nbsp;&nbsp; <span style="color:#808080">)</span> curr<br /><span style="color:#808080">LEFT</span> <span style="color:#808080">JOIN <br />&nbsp;&nbsp; (<br /></span><span style="color:#0000ff">&nbsp;&nbsp; SELECT</span> <span style="color:#0000ff">TOP</span> 100 <span style="color:#0000ff">PERCENT</span> <span style="color:#ff00ff">ROW_NUMBER</span><span style="color:#808080">()</span> <span style="color:#0000ff">Over</span> <br /><span style="color:#808080">&nbsp;&nbsp;&nbsp;&nbsp; (</span><span style="color:#0000ff">ORDER</span> <span style="color:#0000ff">BY</span> CountryCode<span style="color:#808080">,</span>District<span style="color:#808080">,</span>Name<span style="color:#808080">)</span> <span style="color:#0000ff">AS</span> RowNum<span style="color:#808080">,</span> CountryCode&nbsp;<br /><span style="color:#0000ff">&nbsp;&nbsp; FROM</span> City &nbsp;<br /><span style="color:#0000ff">&nbsp;&nbsp; ORDER</span> <span style="color:#0000ff">BY</span> countrycode<span style="color:#808080">,</span>district<span style="color:#808080">,</span>name<br />&nbsp;&nbsp; <span style="color:#808080">)</span> prev<br /><span style="color:#0000ff">ON </span>curr<span style="color:#808080">.</span>RowNum<span style="color:#808080">-</span>1 <span style="color:#808080">=</span> prev<span style="color:#808080">.</span> RowNum</p>
<p align="center"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f2%2fK4.PNG" alt="" /></p>
<p>... and, while it may be possible to handle the resulting evaluation in a direct group break expression, I found it easiest to set up a function to do it, like this:</p>
<p align="center"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f2%2fK5.PNG" alt="" /></p>
<p>Ignore the Intellisense failure (annoying isn't it?) which just indicates that Intellisense isn't very... intelligent... about custom code.&nbsp;</p>
<p>And you can ignore the ShowIssue parameter, which I only needed to show you the problem that occurs when this break behavior isn't included in&nbsp;my sample report.</p>
<p>The report script looks like this (as you can see it's very simple and literal-minded):</p>
<p class="code"><span style="color:#0000ff;">Dim</span> CurrBreakNum <span style="color:#0000ff;">As </span><span style="color:#0000ff;">Integer</span> = 0&nbsp;&nbsp;<br /><span style="color:#0000ff;">Dim</span> CurrCeiling <span style="color:#0000ff;">As </span><span style="color:#0000ff;">Integer</span> = 0&nbsp;&nbsp;<br />&nbsp;<br /><span style="color:#0000ff;">Function</span> GetBreak( _&nbsp;&nbsp;<br /><span style="color:#0000ff;">&nbsp;&nbsp; ByVal</span> showIssue <span style="color:#0000ff;">As </span><span style="color:#0000ff;">Boolean</span>, <span style="color:#0000ff;">ByVal</span>&nbsp;thisCeiling <span style="color:#0000ff;">As </span><span style="color:#0000ff;">Integer</span> , _&nbsp;&nbsp;<br /><span style="color:#0000ff;">&nbsp;&nbsp; ByVal</span> currCode <span style="color:#0000ff;">As </span><span style="color:#0000ff;">String</span>, <span style="color:#0000ff;">ByVal</span>&nbsp;prevCode <span style="color:#0000ff;">As </span><span style="color:#0000ff;">String</span>) <span style="color:#0000ff;">As </span><span style="color:#0000ff;">Integer</span><br />&nbsp;<br /><span style="color:#0000ff;">&nbsp;&nbsp; If</span> showIssue <span style="color:#0000ff;">Then</span><br /><span style="color:#008000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' never break, we want to show the issue</span><br /><span style="color:#0000ff;"><br />&nbsp;&nbsp; ElseIf</span>&nbsp;prevCode <span style="color:#0000ff;">Is </span><span style="color:#0000ff;">Nothing </span><span style="color:#0000ff;">OrElse</span> Len(prevCode) = 0 <span style="color:#0000ff;">Then</span><br /><span style="color:#008000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' first row, there is no previous value</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CurrBreakNum = 1<br /><span style="color:#0000ff;"><br />&nbsp;&nbsp; ElseIf</span> (CurrCeiling &lt;&gt; thisCeiling) <span style="color:#0000ff;">AndAlso</span> (currCode &lt;&gt; prevCode) <span style="color:#0000ff;">Then<br /></span><br /><span style="color:#008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' if we've hit the special situation where</span><br /><span style="color:#008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' a break is called for and the "outer" group</span><br /><span style="color:#008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' breaks on the same row, we have to force&nbsp;</span><br /><span style="color:#008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' an external break...</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CurrBreakNum += 1<br /><span style="color:#0000ff;"><br />&nbsp;&nbsp; End </span><span style="color:#0000ff;">If</span><br /><br />&nbsp;&nbsp; CurrCeiling =&nbsp;thisCeiling<br /><br /><span style="color:#0000ff;">&nbsp;&nbsp; Return</span> CurrBreakNum&nbsp;&nbsp;<br /><br /><span style="color:#0000ff;">End </span><span style="color:#0000ff;">Function</span></p>
<h2>See?</h2>
<p align="center"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f2%2fK6.PNG" alt="" /></p>
<p>Simple, literal-minded, and rather brute-force-ish.&nbsp; And of course I tried all kinds of ways to be clever first.</p>
<p>But... when you think about it,&nbsp;you'll see that this approach&nbsp;makes sense and fits "what's really going on" in the engine. And, more importantly, it works.</p>http://www.spacefold.com/lisa/post/2010/02/14/YAPS-on-Dynamic-PageBreaks-Mixing-up-the-Groups.aspx
lisa@spacefold.comhttp://www.spacefold.com/lisa/post/2010/02/14/YAPS-on-Dynamic-PageBreaks-Mixing-up-the-Groups.aspx#commenthttp://www.spacefold.com/lisa/post.aspx?id=081a9e22-a6be-48c5-9dea-8ce51a299789Sun, 14 Feb 2010 01:15:00 -0600ReportingSQL ServerYAPSLSNhttp://www.spacefold.com/lisa/pingback.axdhttp://www.spacefold.com/lisa/post.aspx?id=081a9e22-a6be-48c5-9dea-8ce51a29978936http://www.spacefold.com/lisa/trackback.axd?id=081a9e22-a6be-48c5-9dea-8ce51a299789http://www.spacefold.com/lisa/post/2010/02/14/YAPS-on-Dynamic-PageBreaks-Mixing-up-the-Groups.aspx#commenthttp://www.spacefold.com/lisa/syndication.axd?post=081a9e22-a6be-48c5-9dea-8ce51a299789YAPS on Custom-Excel-for-RS: Drive Subscriptions with a Stick Shift<p>&nbsp;</p>
<p>The title gives away the punchline on this one...</p>
<p><a title="Cliff extends the domain of a post with a question" href="http://spacefold.com/lisa/post/2007/10/03/Changing-the-Sheet-names-in-SQL-Server-RS-Excel-QnD-XSLT.aspx#id_6d680d9b-217c-404a-be1a-85ce1a14eb3f">Cliff Leighton asks</a></p>
<blockquote>
<p style="padding-left: 30px;">Also, does anyone know how to make the output filename end with .XLS in an emailed SSRS Subscription with the "XML file with report data" option? The emailed file from the Subscription comes out as *filename*.xml and my users will be very confused with an XML file versus a XLS file.</p>
</blockquote>
<p>and at least one other person (<a title="I bet Sanket wants the same thing" href="http://spacefold.com/lisa/post/2007/10/03/Changing-the-Sheet-names-in-SQL-Server-RS-Excel-QnD-XSLT.aspx#id_0600842f-458f-476d-a0b2-3b71e8795f31">Sanket</a>) appeared to have a similar problem last November:</p>
<blockquote>
<p style="padding-left: 30px;">Hi,I want to change name of report file when exporting to excel.<br />i have got no idea how to do it. <img class="flag" style="border: 0; margin: 0px;" src="http://spacefold.com/lisa/editors/tiny_mce3/plugins/emotions/img/smiley-frown.gif" alt="Frown" width="15" height="15" /><br />&nbsp;Please help <img class="flag" style="border: 0; margin: 0px;" src="http://spacefold.com/lisa/editors/tiny_mce3/plugins/emotions/img/smiley-smile.gif" alt="Smile" width="15" height="15" /></p>
</blockquote>
<p>...&nbsp;which certainly makes it a question worth answering. I asked Sanket this:</p>
<blockquote>
<p style="padding-left: 30px;">Sanket: are you exporting using an application?&nbsp;&nbsp;Or is the user doing the export from ReportViewer or Report Manager? Or what?</p>
</blockquote>
<p>... and you'll see why shortly.</p>
<h2>Before I answer, the inevitable caveat</h2>
<p>Folks, while an XML extension may be confusing, consider the following:</p>
<ul>
<li>If the user's computer has ever had Excel 2003 installed on it, chances are that a double-click will open the file in Excel by default, and the XML file will show an appropriate/specialized icon to show that it is an "Excel XML file", not a standard XML icon.&nbsp; Not terribly confusing.&nbsp; How does this work?&nbsp; It's all down to the processing instruction that we added to the SSML: <br /><span style="font-family: courier new,courier;"><strong>&lt;?mso-application progid="Excel.Sheet"?&gt;<br /></strong></span><br />This screen shot shows you what it looks like when it works as expected (remember, this will be different depending on the client computer; for example, the Standard XML file icon you see here belongs to <a title="Stylus Studio site" href="http://www.stylusstudio.com/" target="_blank">Stylus Studio</a>, because that's my default owner for this type of file on this computer):<br /><br />
<p><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f2%2fExcelIcons.PNG" alt="" /></p>
</li>
<li>If the user has&nbsp;Excel 2007 installed as the default owner for files&nbsp;with an XLS extension, and the file is really SSML rather than Excel binary, the result they will when they doubleclick is a&nbsp;warning&nbsp;like the following:<br />
<p><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f2%2fExcel2007Warning.png" alt="" /><br /><br />Naturally, you can tell your users to ignore this warning and answer "Yes" to the dialog.&nbsp; But it's not exactly what I would call un-confusing.</p>
</li>
</ul>
<p>So, IMHO... you pays your money and you takes your choice.&nbsp; With that understood, let's address the stated requirement.</p>
<h2>The short answer is "no", but we don't care.</h2>
<p>Try to remember that the default subscription interface you see in Report Manager is just a basic UI given to you by default.&nbsp;</p>
<p>Just like the parameters panel for ReportViewer, which we all love to hate, there's nothing intrinsically required about it.</p>
<p>Just like the Excel renderer can be obviated by creating our own SSML from the XML output, the base Excel rendition isn't the one we have to accept.</p>
<p>A subscription is just a timed task or job. If you look at SQL Agent, it looks something like this:&nbsp;</p>
<p style="text-align: center;"><img src="http://www.spacefold.com/lisa/image.axd?picture=2010%2f2%2fRSJob.PNG" alt="" /></p>
<p>The one step in the job looks something like this:&nbsp;</p>
<p class="code">exec ReportServer.dbo.AddEvent <br />&nbsp; @EventType='TimedSubscription', <br />&nbsp; @EventData='512f89b1-7dd8-4b2f-806b-29927da7a81e'</p>
<p>... and the code underneath is probably not very complicated either, although I've never looked.&nbsp; (That would be like trying to fix the default Excel renderer.)</p>
<p>Let's leave it alone, and think about the right way to fix our problem here, which (from Cliff's point of view) is that you are allowed to set the full name of the output file when it goes to a file share, but you're not allowed to set the extension when you send the subscription to an email address.</p>
<h2>We won't need any grenades</h2>
<p>This is actually an easy problem to solve, several different ways (remember the paying the money and taking the choice part?)</p>
<p>Here's a&nbsp;overview of how to do this thing.</p>
<p>Start with the knowledge that this is just a timed task, and write your own! It will be very simple, and SSIS is probably the most natural approach (but if you don't like it you don't have to use it, as you'll easily see).</p>
<ol style="list-style: decimal;">
<li style="list-style: decimal;">
<h3>Use a fileshare subscription, or...</h3>
<ol style="list-style: decimal;">
<li style="list-style: decimal;">If you're using SSIS, you can invoke the subscription yourself. Or use a file watcher task (these are available from better SSIS jockeys than me, so check it out) and stick with the standard subscription schedule.<br />Method notes: You don't need to use the code you see above, you can just <a title="How to send SSRS from SSIS using subscription" href="http://www.sql-server-performance.com/faq/How_to_send_a_SSRS_report_from_SSIS_p1.aspx" target="_blank">use <strong>exec sp_start_job</strong></a>.&nbsp; (That's one reference. You'll find others, I'm sure. It turns out this is pretty much an FAQ.)</li>
<li style="list-style: decimal;">Pick up the file and rename it.</li>
<li style="list-style: decimal;">Email it out.&nbsp;<ol>
<li style="list-style: decimal;">If your subscription was data driven, you should be able to look at the same data as RS does, to figure out to whom you email.&nbsp;</li>
<li style="list-style: decimal;">Emailing is simple, whether you use a purpose-built SSIS task or your own code.</li>
</ol></li>
</ol></li>
<li style="list-style: decimal;">
<h3>... Skip the subscription altogether. Create a timed task or SSIS job that does what you need, without one:</h3>
<ol style="list-style: decimal;">
<li style="list-style: decimal;">Retrieve the report yourself, with&nbsp;minimal code.&nbsp;<ol>
<li style="list-style: decimal;">You can use either SOAP or REST to do this.&nbsp;<br />Method notes: I've shown several examples of how to do this on this blog already, but I'll add another example here, which shows a Q&amp;D REST approach to doing this inside SSIS.&nbsp; It comes from my <a title="XMLRSDocs docs" href="http://spacefold.com/articles/XMLRSDocs.aspx">xmlRSDocs</a> processing code, but you should be able to see how to apply it.&nbsp; <br />I'm posting this bit because I think I remember having to help somebody with the correct classes to use for a low-level post approach like this, when working inside SSIS, once.</li>
<li style="list-style: decimal;">Here's <a title="Consuming RS in SSIS" href="http://mgarner.wordpress.com/2007/06/06/consuming-the-reporting-services-web-service-inside-ssis/" target="_blank">an alternative</a> -- you'll find many -- for invoking RS inside SSIS, and this one uses SOAP.&nbsp; I think this is a bit overcomplicated and I think you can apply some of my other instructions for SOAP invocations more easily, including <a title="blog post using SOAP API to grab a report" href="http://spacefold.com/lisa/post/2010/01/16/Walkthrough-Part-II-Dynamic-Interactive-Paging-and-another-fierce-look-at-parameters.aspx">one SOAP version done quite recently</a>. But maybe this one is more "orthodox", so I don't want to push my methods on you..</li>
</ol></li>
<li style="list-style: decimal;">Obviously when you're picking up the file yourself, name it anything you want.</li>
<li style="list-style: decimal;">As above, email it out.</li>
</ol></li>
</ol>
<p>That's about it.&nbsp; Here's the REST example I promised; this is the code from an SSIS script task.</p>
<p class="code">&nbsp;<br /><span style="color: #0000ff;">Public Sub</span> Main()&nbsp;&nbsp;<br /><span style="color: #008800;">&nbsp;&nbsp; ' a script task to grab an SSRS report <br />&nbsp;&nbsp; ' from within SSIS, based on some <br />&nbsp;&nbsp; ' specialized package variables that make<br />&nbsp;&nbsp;&nbsp;' sense in my scenario.&nbsp; Your scenario is<br />&nbsp;&nbsp; ' different, but the basic idea will work for you.</span><br />&nbsp;<br /><span style="color: #0000ff;">&nbsp;&nbsp; Dim</span> outputFile <span style="color: #0000ff;">As String</span>, requestURL <span style="color: #0000ff;">As String</span><br />&nbsp;<br /><span style="color: #0000ff;">&nbsp;&nbsp; If</span> Dts.Variables(<span style="color: #a31515;">"ExportRSType"</span>).Value.ToString().Length = 0 <span style="color: #0000ff;">Then</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dts.Variables(<span style="color: #a31515;"> "ExportRSType"</span>).Value = <span style="color: #a31515;">"PDF"</span><br />&nbsp;&nbsp; <span style="color: #0000ff;">End If</span> <br /><br /><span style="color: #0000ff;">&nbsp;&nbsp; </span>outputFile = Dts.Variables(<span style="color: #a31515;"> "ExportRSFilename"</span> ).Value.ToString()&nbsp;&nbsp;<br />&nbsp;<br /><span style="color: #0000ff;">&nbsp;&nbsp; If</span> System.IO.Path.GetDirectoryName(outputFile) = <span style="color: #a31515;">""</span> <span style="color: #0000ff;">Then</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outputFile = Dts.Variables(<span style="color: #a31515;">"InputDir"</span> ).Value.ToString() &amp; _&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outputFile&nbsp;<br />&nbsp;&nbsp; <span style="color: #0000ff;">End If</span><br /><br />&nbsp;&nbsp; outputFile = System.IO.Path.GetFullPath(outputFile)<br />&nbsp;&nbsp; requestURL = _<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dts.Variables(<span style="color: #a31515;">"ExportRSURL"</span> ).Value.ToString()&nbsp;<br />&nbsp;&nbsp; requestURL += _<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #a31515;">"&amp;rs:Command=Render"</span><br />&nbsp;&nbsp; requestURL += _<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #a31515;">"&amp;rs:Format="</span> &amp; Dts.Variables( <span style="color: #a31515;">"ExportRSType"</span> ).Value.ToString()&nbsp;&nbsp;<br /><br /><span style="color: #008800;">&nbsp;&nbsp; ' this part is a little kludge because of&nbsp;<br />&nbsp;&nbsp; ' how I set up my URL template variable&nbsp;<br />&nbsp;&nbsp; in the SSIS Package... not really germane:<br /></span><br />&nbsp;&nbsp; &nbsp;<span style="color: #0000ff;">If</span> Len(Dts.Variables( <span style="color: #a31515;">"ExportRSParams"</span>).Value.ToString()) &gt; 0 <span style="color: #0000ff;">Then</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; requestURL += _<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #a31515;">"&amp;" </span>&amp; Dts.Variables( <span style="color: #a31515;">"ExportRSParams"</span>).Value.ToString().Replace( <span style="color: #a31515;">"^"</span>, <span style="color: #a31515;">"&amp;"</span> )<br />&nbsp;&nbsp; <span style="color: #0000ff;">End If</span><br /><br />&nbsp;&nbsp; <span style="color: #0000ff;">Dim</span> ox <span style="color: #0000ff;">As</span> System.Net.WebRequest = _&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Net.WebRequest.Create(requestURL)<br />&nbsp;&nbsp; ox.UseDefaultCredentials =&nbsp; <span style="color: #0000ff;">True</span> <span style="color: #008000;">'TBD...</span><br />&nbsp;<br />&nbsp;&nbsp; <span style="color: #0000ff;">Dim</span> oy <span style="color: #0000ff;">As</span> System.Net.WebResponse = ox.GetResponse()&nbsp;&nbsp;<br />&nbsp;&nbsp; <span style="color: #0000ff;">Dim</span> raw <span style="color: #0000ff;">As</span> System.IO.FileStream = _&nbsp;&nbsp;<br />&nbsp;&nbsp; <span style="color: #0000ff;">New</span> System.IO.FileStream(outputFile, IO.FileMode.Create)&nbsp;&nbsp;<br />&nbsp;&nbsp; <span style="color: #0000ff;">Dim</span> buffer(1024) <span style="color: #0000ff;">As Byte </span><br />&nbsp;<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">Dim</span> rs <span style="color: #0000ff;">As</span> System.IO.Stream = oy.GetResponseStream()&nbsp;&nbsp;<br />&nbsp;&nbsp; <span style="color: #0000ff;">Dim</span> read <span style="color: #0000ff;">As</span> <span style="color: #0000ff;">Integer</span> = rs.Read(buffer, 0, buffer.Length)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; <span style="color: #0000ff;">While</span> (read &gt; 0) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raw.Write(buffer, 0, read)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; read = rs.Read(buffer, 0, buffer.Length)<br />&nbsp;&nbsp; <span style="color: #0000ff;">End While</span><br /><br />&nbsp;&nbsp; oy.Close()<br />&nbsp;&nbsp; raw.Close()<br />&nbsp;&nbsp; raw.Dispose()<br />&nbsp;&nbsp; rs.Close()<br />&nbsp;&nbsp; rs.Dispose()<br />&nbsp;&nbsp; oy =&nbsp;<span style="color: #0000ff;">Nothing</span><br />&nbsp;&nbsp; ox =&nbsp;<span style="color: #0000ff;">Nothing</span><br />&nbsp;&nbsp; raw =&nbsp;<span style="color: #0000ff;">Nothing</span><br />&nbsp;&nbsp; rs =&nbsp;<span style="color: #0000ff;">Nothing</span><br />&nbsp;&nbsp; Dts.TaskResult = ScriptResults.Success<br />&nbsp;<br /><span style="color: #0000ff;">End Sub</span></p>
<p>... OK?</p>
<p>None of this stuff is magic.</p>http://www.spacefold.com/lisa/post/2010/02/07/YAPS-on-Custom-Excel-for-RS-Drive-Subscriptions-with-a-Stick-Shift.aspx
lisa@spacefold.comhttp://www.spacefold.com/lisa/post/2010/02/07/YAPS-on-Custom-Excel-for-RS-Drive-Subscriptions-with-a-Stick-Shift.aspx#commenthttp://www.spacefold.com/lisa/post.aspx?id=81143414-186a-4ace-b650-5ddcb2af630fSat, 6 Feb 2010 21:02:00 -0600ReportingSQL ServerSSISXML/XSLTYAPSLSNhttp://www.spacefold.com/lisa/pingback.axdhttp://www.spacefold.com/lisa/post.aspx?id=81143414-186a-4ace-b650-5ddcb2af630f4http://www.spacefold.com/lisa/trackback.axd?id=81143414-186a-4ace-b650-5ddcb2af630fhttp://www.spacefold.com/lisa/post/2010/02/07/YAPS-on-Custom-Excel-for-RS-Drive-Subscriptions-with-a-Stick-Shift.aspx#commenthttp://www.spacefold.com/lisa/syndication.axd?post=81143414-186a-4ace-b650-5ddcb2af630f