2011年3月16日 星期三

SSRS2008 R2 Example DB and Reports

收集SSRS 2008 R2的測試資料和範例報表

AdventureWorks 2008R2 SR1 這是範例資料庫, 不過安裝時,有一個DB因為file group的設定我一直裝不起來...

SQL2008R2.Reporting_Services.Samples , 這是Rerporting Services RDL的範例, 里頭會用到的DB就是上面那個裝不起來的DB....嗟....


幸好還可以下載 AdventureWorks2008R2 without filestream ,  下載下來是一個mdf檔, 直接attach到你的R2 上就可以


他很好心的給你一段attach 的指令

 CREATE DATABASE AdventureWorks2008R2
      ON (FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008\MSSQL\DATA\AdventureWorks2008R2_Data.mdf')  -- change the drive and file path
      FOR ATTACH_REBUILD_LOG ;



快去下載

ps.參考Derek的enable filestream 說明

SQL Server各版本Sample

2011年3月13日 星期日

Stored Procedure中的temp table

前一陣子為了特殊目需要在stored procedure中依不同的原則來宣告table variable
由於無法達成,所以改成create temp table (#xxxTable)的方式然後依不同原則再用alter table drop column 的方式來做
寫在這篇 if .. else .. create table variable

今天在想,用temp table的方式除了是否因為有transaction可能會有performance的考量外, 如果是多人同時間呼叫 sp時, temp table的欄位數和資料內容會不會發瘋??

所以自己做了一個小小的測試, 用二個不同的session來執行以下的sp
 IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[zspBev]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[zspBev]
GO

create procedure zspBev (@type int)
as
begin
    IF  EXISTS (SELECT * FROM tempdb.sys.objects WHERE object_id = OBJECT_ID(N'tempdb..#tmpTable') AND type in (N'U'))
    drop table #tmpTable
    create table #tmpTable
    (col1 int,col2 int)
    begin transaction t1
    if @type = 1
    begin
    insert into #tmpTable values(1,2)
    commit transaction t1
    WAITFOR DELAY '00:00:05';
    select * from  #tmpTable
    end
    else
    begin
        insert into #tmpTable values(3,4)
        commit transaction t1
        WAITFOR DELAY '00:00:10';
        select * from  #tmpTable
    end

    select * from  #tmpTable
end



看來彼此間是不會影響到的. 
在tempdb中查看Temporary Tables目錄下的物件,同時間會有二個#tmpTable開頭的物件,但往後仔細看物件名稱, sql server自己已經有所區別,只是table名稱係漏漏等....
dbo.#tmpTable________________________________________________________________________________________________________000000000036
dbo.#tmpTable________________________________________________________________________________________________________000000000037

所以....就別擔心太多了



2011年3月9日 星期三

停用SSRS Designer Cache

VS2008設計RDL時,如果資料集的欄位有增減,而且增減前已經有做過報表預覽preview,常會讀 到之前cache住的資料,即使重新整理也沒用

通常我會直接刪掉RDL同目錄下副檔名為.rdl.data 的檔案.然後再preview一次就OK

如果每次都嫌麻煩, 那就直接改RS的設定檔

C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies\RSReportDesigner.config 把
<Add Key="CacheDataForPreview" Value="true" />
改成
<Add Key="CacheDataForPreview" Value="fasle" />

缺點是,如果 資料查詢很慢,那你就每次preview時都要等執行完畢才能看到結果囉

所以當你要連到正式資料庫設計時,利用cache data會比較好一些

2011年3月7日 星期一

if .. else .. create table variable

想要動依不同情況建立相同名稱的table variable,語法如下
 if @condition = '1'
begin
  declare @tmptable1 table (col1 int,col2 int)
end
else
begin
  declare @tmptable1 table (col1 int,col2 int, col3 int, col4 int)
end

出現以下錯誤
Msg 134, Level 15, State 1, Line 13
The variable name '@tmptable1' has already been declared. Variable names must be unique within a query batch or stored procedure.

改成用temp table 也不行
 if @condition = '1'
begin
    create table #tmptable1  (col1 int,col2 int)
end
else
begin
   create table #tmptable1  (col1 int,col2 int, col3 int, col4 int)
end


 出現以下錯誤
Msg 2714, Level 16, State 1, Line 15
There is already an object named '#tmptable1' in the database.

最後折衷好了...馬是口以啦...

 create table #tmptable1  (col1 int,col2 int, col3 int, col4 int)
 if @condition = '1'
begin
    alter table #tmptable1
    drop column col3,col4
end

 

2011年3月3日 星期四

SSRS 限定一頁顯示N筆資料

同事設計RDL想要一頁只顯示10筆清單資料就強迫換頁.

於在報表上,依這段Expression 建立一個群組Group,每頁顯示10筆後跳新分頁

=Fix((RowNumber("DataSet1")-1) /10)

預覽時,發生這個錯誤

 [rsInvalidGroupExpressionScope] A group expression for the grouping ‘Group1’ uses the RowNumber function with a scope parameter that is not valid.  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.   

大家在RowNumer的scope上測來測去都是同樣的錯,真不知該給什麼好....



最後是給上了nothing 就解決了  =Fix((RowNumber(nothing   )-1) /10)

查了MSDN上的說明, 有看沒有懂,

因為很直覺的是RowNumber的scope應該是dataset啊..不是嗎???

Scope

每個彙總函數都使用 Scope 參數,它用來定義彙總函數的執行範圍。有效範圍是群組、資料集或資料區域的名稱。只有直接或間接包含運算式的群組或資料區域可用來作為範圍。對於資料區域 內的運算式而言,所有彙總函數的 Scope 都是選擇性的。如果您省略 Scope 參數,彙總範圍便是報表項目所屬的最內層資料區域或群組。指定 Nothing 範圍會將範圍設為報表項目所屬的最外層資料區域。
對於資料區域之外的運算式,Scope 是指資料表或商務物件。如果報表包含多個資料集,Scope 就是必要的。如果報表只包含單一資料集,便會省略 Scope,範圍會設為資料集。您不能針對在資料區域之外的報表項目來指定 Nothing 關鍵字。
頁首或頁尾不能使用 Scope 參數。

2011年2月20日 星期日

asp.net menu 和 flash

在aspx上放了一個falsh object , 瀏覽時卻發現原本的sitemap menu下拉時, 卻被蓋在falsh下,
一直都把焦點放在z-index的修改上
看到 Tsung's Blog ...哈哈, 我也恍然大悟了. 感謝他

主要是在flash object加入一個設定

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%"
        codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0">
        <param name="MOVIE" value="../Yoshinoya/BrandSingleSeason.swf">
        <param name="PLAY" value="true">
        <param name="LOOP" value="true">
        <param name="WMODE" value="transparent">
        <param name="QUALITY" value="high">
        <embed src="BrandSingleSeason.swf" width="100%" height="100%" play="true" loop="true"
            wmode="transparent" quality="high" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">
    </embed>
    </object>

另外,由Tsung's Blog延伸找到的範例也有詳細的說明 Z-Index and Flash.


後來,又查得JQuery提供一個swf plugin的套件,使用這個插件就無menu被蓋住的問題了.
所以後來參考範例網站後,就改用這個方式 ,程式碼也很簡潔

    <script type="text/javascript" src="../Scripts/jquery.swfobject.1-1-1.min.js"></script>     
    <script type="text/javascript">
        function displayFlash(type) {
            $('#myFlash').flash({ swf: type, height: '100%', width: '100%' });
        }
    </script> 
    <div id="myFlash" >
    </div>

進階的使用方法可參考

jQuery SWFObject Plugin

2011年2月9日 星期三

取用BugNet的HtmlEditor Provider

在BugNet Issue維護中,Descriptioncomment是使用html編輯器的方式讓我們可以輸入html格式的文字,我覺得挺好用的.

在BugNet的source code查看這段的做法,發現是利用provider的方式做的,先把相關的srouce code 抽出來,試著放入自已專案用的程式碼中

1.下載最新的BugNet souce code, 目前版本是0.8.276.0, 解壓縮後,複製以下目錄
 \BugNET-0.8.276-Source\src\Library\Providers\HtmlEditorProviders 

2.建立一個新方案,把 \BugNET-0.8.276-Source\src\Library\Providers\HtmlEditorProviders\下的四個專案都加入, 如果有需要,可以修改一下專案的Assembly Name及相關的namespace,不然build出來的dll名稱會是BugNet開頭的dll

3.build 完後,分別將專案內的dll複製出來,add reference 到自已的website 專案中,
同時也複製 以下目錄檔案及檔案

 a. \BugNET-0.8.276-Source\src\BugNET_WAP\Providers\HtmlEditorProviders
 b. \BugNET-0.8.276-Source\src\BugNET_WAP\UserControls\HtmlEditor.ascxHtmlEditor.ascx.cs、HtmlEditor.ascx.designer.cs

3.開啟自已website專案的web.config檔, 加入以下

 <configSections>
<section name="HtmlEditorProvider" type="BugNET.Providers.HtmlEditorProviders.HtmlEditorConfiguration, BugNET.Providers.HtmlEditorProviders" requirePermission="false" allowDefinition="MachineToApplication" />
 </configSections>


<HtmlEditorProvider defaultProvider="CkHtmlEditorProvider">
    <providers>
      <add name="TextboxHtmlEditorProvider" type="BugNET.Providers.HtmlEditorProviders.TextboxHtmlEditorProvider, BugNET.Providers.TextboxHtmlEditorProvider" Height="250" Width="100%" />
      <add name="FckHtmlEditorProvider" type="BugNET.Providers.HtmlEditorProviders.FckHtmlEditorProvider, BugNET.Providers.FckHtmlEditorProvider" Height="250" Width="100%" ToolbarSet="Default" Skin="Silver" providerPath="~\Providers\HtmlEditorProviders\fckeditor\" />
      <add name="CkHtmlEditorProvider" type="BugNET.Providers.HtmlEditorProviders.CkHtmlEditorProvider, BugNET.Providers.CkHtmlEditorProvider" Height="250" Width="100%" Toolbar="Basic" providerPath="~\Providers\HtmlEditorProviders\CKEditor\" />
    </providers>
  </HtmlEditorProvider>


<pages enableSessionState="true" theme="Default">
      <controls>
          <add tagPrefix="bn" tagName="HtmlEditor" src="~/UserControls/HtmlEditor.ascx" />
 </controls>
    </pages>


以上紅字部份是依自已的需求做更改的

4.建立一個測試網頁testHtmlEditor.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="testHtmlEditor.aspx.cs" Inherits="Issues.testHtmlEditor" %>
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    test
  <bn:HtmlEditor id="EditCommentHtmlEditor" Height="200" runat="server" />       
</asp:Content>

執行後就可以看到html editor元件了.

BugNet預設的html editor toolbar是使用"Basic", 這個定義你可在
\BugNET-0.8.276-Source\src\BugNET_WAP\Providers\HtmlEditorProviders\CKEditor\config.js 自行修改,以下是原本的定義
config.toolbar_Basic =
[   
    ['Cut','Copy','Paste','PasteText','PasteFromWord','-','Print', 'SpellChecker', 'Scayt'],
    ['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],   
    '/',
    ['Bold','Italic','Underline','Strike','-','Subscript','Superscript'],
    ['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'],
    ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
    ['BidiLtr', 'BidiRtl' ],
    ['Link','Unlink','Anchor'],
    ['Image','Table','HorizontalRule'],
    '/',
    ['Styles','Format','Font','FontSize'],
    ['TextColor','BGColor'],
    ['Maximize', 'ShowBlocks','-','About']
];


BugNet中還有不少可學習的點,沒什麼想法的人可以玩看看

IIS 網站無法下載中文檔名檔案因為取消高位元字元

 網址+中文檔案名稱方式下載檔案顯示 404 - 找不到檔案或目錄。 但英數字檔案名稱則可下載。 因為設定GCB IIS,其中1項 將高位元字元預設取消勾選了。 27 TWGCB-04-014-0028 要求篩選與其他限制模組 允許高位元字元 這項原則設定決定查詢...