The road to C# master trapemiya

C#を中心に、.NETの話題を取り上げます。

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  241  : 記事  1  : コメント  585  : トラックバック  30

ニュース

Since 2005年10月26日

わんくま同盟

わんくま同盟

Microsoft MVP


Visual Developer - Visual C#

記事カテゴリ

書庫

日記カテゴリ

2010年1月8日 #

Blend 3のSketchFlowは、ユーザーと画面構成の打ち合わせをする際に大変重宝します。ボタンを押すことによって画面遷移もサポートされています。しかし残念ながらメッセージやダイアログを表示することは標準ではサポートされていないのです。しかし、これを実現する方法があります。メッセージボックスが表示されていない状態の画面と、メッセージボックスが表示された状態の画面を切り替えれば良いのです。

続きをよむ・・・

posted @ 15:24 | Feedback (0)

コメントのカラーをtransparentにします。わかってしまえば簡単なんですが、どうやって文字列を打つのがしばし悩みました。

posted @ 15:21 | Feedback (0)

2009年12月7日 #

Visual Studio 2010 のリリース時にVisual Studio with MSDN Subscription を所有していれば、その所有しているVisual Studio with MSDN Subscriptionのレベル以上の製品を手に入れることができるようです。ということはそれまでにVisual Studio with MSDN Subscriptionに登録しておくのが断然お得なようです。

Ultimate Offer ~Visual Studio 2010上位エディションへの道~ http://www.microsoft.com/japan/msdn/vstudio/2010/overview/compare.aspx

個人的にはVisual Studio 2010が標準でサポートしているUML作成機能がお気に入りなのですが、これは最上位エディションであるUltimateにしか付いてないんですよね。とりあえず今回のキャンペーンでUltimateはたまたま手に入るのですが、その次のバージョンのVisual Studioでも最上位エディションにしか付いていなかったらどうしよう?と心配になります。
(もちろん今回のようなキャンペーン無しで最上位エディションなんて買えませんよう)
たぶんUML作成機能はもっと強化されていくと思いますし、幅広いVisual StudioのエディションでUMLはサポートされるのではないかと想像はするのですが・・・。

あまり先のことを考えてもしょうがないですね。でも、Visual Studio 2010に付属しているUML作成機能をお気に入りと書きましたが、もうちょっといろんな表現力ができるようになって欲しいし、そうなるとVisioも捨てがたいわけで、でもVisual Studio 2010のUML作成機能は洗練されていてしかも表示も美しいし、う~ん、悩みますね・・・・・。

どっちでUML書こうかな・・・?

posted @ 12:00 | Feedback (0)

2009年11月30日 #

MVVMフレームワークの一覧が以下にまとまっています。

Discover and compare existing MVVM frameworks !
http://www.japf.fr/2009/11/discover-compare-existing-mvvm-frameworks/

紹介されているフレームワークはソースコードが公開されていたりするので、それを参考にして自分用のフレームワークを作るのもいいかもしれませんね。

posted @ 10:52 | Feedback (0)

2009年11月20日 #

あちこちで話題になっていますので、もうご存じの方もたくさんいらっしゃると思いますが、Silverlight 4 beta 英語版がリリースされました。日本語版は12月上旬頃になりそうです。間もなくですね。

Silverlight 4 ベータ開発環境
http://www.microsoft.com/japan/silverlight/development_sl4.aspx

しかし、びっくりしました。Silverlight 3からわずか数カ月後のリリースです。

さらに驚いたのはout-of-browser(OOB)のsandbox制限が緩められたことです。これによりローカルフォルダへのアクセスが可能になったりします。その他、機能てんこ盛りになっており、以下のブログがまとまっていて良い感じです。

Silverlight 4 Beta ? A guide to the new features
http://timheuer.com/blog/archive/2009/11/18/whats-new-in-silverlight-4-complete-guide-new-features.aspx

ExcelのCOMにアクセスできるようになったり、印刷をサポートするようになったり、はっきり言って業務アプリを作れるレベルまでなっちゃったと思います。WPFとの関係が微妙ですが、WPFはWPFで進化し続けています。

業務アプリをSilverlightで作るかWPFで作るか、この辺りの指標がわかる資料が出てきてほしいですね。

posted @ 15:56 | Feedback (3)

Forza Motorsport 3
http://forzamotorsport.net/ja-jp/game/default.htm

とにかくグラフィックが素晴らしいの一言です。車の描写は一見すると実写と間違えるほどです。もちろん風景も美しく描写されていて、見ていて飽きることがありません。車は自分でペイントすることが可能で、それこそ痛いペイント(痛車)だってできちゃいます。
圧倒的なスピード感で美しい景色を駆け抜けると気分が爽快になります。以下に実際のムービーがありますので、興味のある方はどうぞ。

最新のムービー
http://forzamotorsport.net/ja-jp/media/videos/default.htm#/video/2821/

前作のForza 2などあまり車のゲームはやったことがなかったんですが、ひょっとするとワイヤレス レーシング ホイール買ってしまうかもしれません・・・

posted @ 15:29 | Feedback (2)

2009年11月6日 #

昨日(11月5日)開催されたMicrosoft Developer Forum 2009の模様がSilverlightによってストリーミングで提供されています。地方にいる私にとってはありがたいことです。

Microsoft Developer Forum 2009
http://www.microsoft.com/japan/powerpro/mdflive/default.mspx

いずれの内容も面白くて大変参考になったのですが、中でもSharePoint Server 2010(※1)がかなり良くなったという印象を受けました。Visual Studio 2010から簡単に開発できそうです。前からずっと気になっていたんですが、もっと気になりだしました。今は時間が取れませんが、いずれは始めてみたいと思っています。

ところで上記のストリーミングでも触れられていましたが、昨日よりVisual Studio 2010 日本語版 Beta2がMSDNサブスクリプションで公開されています。今週末は時間が取れませんので、来週辺りからぼちぼち触ってみようかと思います。

MSDN サブスクライバ様向けに Visual Studio 2010 日本語版 Beta2 をリリースしましたhttp://blogs.msdn.com/dd_jpn/archive/2009/11/05/9917728.aspx

 

※1 もうすぐbeta 2がリリースとのこと。

posted @ 15:03 | Feedback (0)

2009年11月2日 #

【SQL】 SQL Server 2008のhierarchyidデータ型を使って階層毎に集計する。
http://blogs.wankuma.com/trapemiya/archive/2009/10/29/182544.aspx

の続きです。

前回はSumAllSalesUnderMeという関数を用意し、自分の下のノードにぶら下がっている売上を全て集計していました。
この関数を使うことによって任意のノードの総売り上げを簡単に求めることができます。これはこれは便利なのですが、組織全体について集計する際に、ノード毎にSumAllSalesUnderMeを用いて計算するのは非効率です。効率が良いのは、下の階層から上の階層に向かってノードの売上を順に足し込んでいくことでしょう。これを実現したのが以下になります。

 

/* ノード毎に売上を集計し、ノード毎に売上を保持する一時テーブルを作成する。 */
create table #temp
(
    TOrganizationID    int          not null,
    THierarchyid       hierarchyid  not null,
    THierarchyLevel    int          not null,
    TOrganizationName  nvarchar(30) not null,
    TSales             int          not null  --このノードにぶら下がっている売上合計
)

create unique clustered index tempIK01 on #temp(THierarchyLevel, THierarchyid);

declare @maxLevel int
declare @level int;

/* ノード毎に売上を集計し、#tempに放り込む。 */

select @maxLevel = MAX(OR01HierarchyLevel) from OR01Organization
set @level = 0;

while @level <= @maxLevel
begin
    insert into #temp (TOrganizationID, THierarchyid, THierarchyLevel, TOrganizationName, TSales)
        select OR01OrganizationID, OR01Hierarchyid, @level, OR01OrganizationName,
              (select isnull(SUM(SA01Sales),0) from SA01Sales where SA01OrganizationID = OR01OrganizationID)
        from OR01Organization
        where OR01HierarchyLevel = @level;

        set @level = @level + 1;
end

/* 下の階層から上に向かってノードを順に足し込んでいく。  */

set @level = @maxLevel;

while @level > 0
begin
    with CTE as
    (
        select p.TSales pSales, c.ChildrenSales cSales
        from #temp p
        join (select t.THierarchyid.GetAncestor(1) hid, SUM(t.TSales) ChildrenSales
              from #temp t
              where t.THierarchyLevel = @level
              group by t.THierarchyid.GetAncestor(1)) c
        on p.THierarchyLevel =@level - 1 and p.THierarchyid = hid
  )
  update CTE set pSales = pSales + cSales;
  SET @level = @level - 1;
end

/* 集計結果を表示する。 */

select THierarchyid.ToString(),
       space(THierarchyLevel * 5) + TOrganizationName,
       THierarchyLevel,
       TSales
    from #temp
    order by THierarchyid;

drop table #temp;

go


前回と全く同じ結果が得られます。

Path Name Level SubTotal
/ 全社 0 110000
/1/      東京支社 1 60000
/1/1/          統括事業部 2 60000
/1/1/1/              営業1課 3 10000
/1/1/2/              営業2課 3 50000
/2/        大阪支社 1 50000
/2/1/          営業部 2 50000
/2/1/1/              第1営業課 3 20000
/2/1/2/              第2営業課 3 30000

本当はCTEの再帰でやりたかったんですが、CTEの再帰部分ではsumなどの集計関数が使えないため断念しました。orz
CTEの再帰部分で集計関数とか外部結合とかできるようになるといいなぁ。細かい制約については以下を読んでください。

WITH common_table_expression (Transact-SQL)
http://msdn.microsoft.com/ja-jp/library/ms175972.aspx

posted @ 16:17 | Feedback (0)

2009年10月29日 #

RDBのデータ型
http://blogs.wankuma.com/ognac/archive/2009/10/28/182484.aspx

で、ついhierarchyid型について口走ってしまったので、以下にまとめてみました。どうせまとめようと思っていたので、良いきっかけになって良かったです。

SQL Server 2008でhierarchyid型が追加されました。これによってレコードを階層構造で管理できるようになります。
ここでは詳しく説明しませんので、ご存じない方はまず以下をご覧になると良いと思います。

hierarchyid データ型の使用 (データベース エンジン)
http://msdn.microsoft.com/ja-jp/library/bb677173.aspx

ここではhierarchyid型によって管理された階層構造毎に集計するデモを掲載します。ある会社の営業売上を階層毎に集計してみましょう。以下のような売上があるとします。

全社 支社 売上
全社        
  東京支社      
    統括事業部    
      営業1課 10000
      営業2課 50000
  大阪支社      
    営業部    
      第1営業課 20000
      第2営業課 30000

目標は以下のように階層毎に集計することです。

全社 支社 売上 集計
全社         110000
  東京支社       60000
    統括事業部     60000
      営業1課 10000 10000
      営業2課 50000 50000
  大阪支社       50000
    営業部     50000
      第1営業課 20000 20000
      第2営業課 30000 30000

 

以上を実現するために組織と組織の売上という二つのテーブルを作成します。

まずは組織テーブルからです。hierarchyid型を使用して作成します。

create table OR01Organization
(
    OR01OrganizationID       int            identity (1,1)        not null  primary key,  
    OR01Hierarchyid            hierarchyid                          not null,  
    OR01HierarchyLevel       as OR01Hierarchyid.GetLevel() ,         
    OR01OrganizationName   nvarchar(30)                        not null  
)


ここではOR01Hierarchyidを主キーにしていませんので、インデックスを作成しておきます。


create unique index OR01OrganizationIK01 on OR01Organization (OR01Hierarchyid)


続いて売上テーブルを作成します。組織テーブルとの間に参照整合性制約を作成しています。


create table SA01Sales
(
    SA01SalesID            int  identity (1,1)  not null primary key,  
    SA01OrganizationID   int                  not null,
    SA01Sales               int  
)

alter table SA01Sales
add constraint SA01SalesFK01 foreign key (SA01OrganizationID)
    references OR01Organization(OR01OrganizationID)


データを作成します。

insert into OR01Organization (OR01Hierarchyid, OR01OrganizationName) values
(hierarchyid::GetRoot(), '全社'),
('/1/', '東京支社'),
('/1/1/', '統括事業部'),
('/1/1/1/', '営業1課'),
('/1/1/2/', '営業2課'),
('/2/', '大阪支社'),
('/2/1/', '営業部'),
('/2/1/1/', '第1営業課'),
('/2/1/2/', '第2営業課')

ここまで出来たら一度組織図を表示してみましょう。

select OR01Hierarchyid.ToString() as Path,
       OR01OrganizationName as Name,
       OR01HierarchyLevel as Level
  from OR01Organization order by OR01Hierarchyid


以下のように表示されればOKです。


Path       Name            Level
/            全社               0
/1/         東京支社          1
/1/1/       統括事業部       2
/1/1/1/    営業1課          3
/1/1/2/    営業2課          3
/2/          大阪支社         1
/2/1/       営業部            2
/2/1/1/    第1営業課        3
/2/1/2/    第2営業課        3


Nameにインデントが無くて見難い場合には、以下のようにLevel毎に適当に頭に空白を入れると良いでしょう。

space(OR01HierarchyLevel * 5) + OR01OrganizationName as Name


では次に売上データを作成していきます。

SA01OrganizationIDはOR01OrganizationIDを指定しますが、OR01OrganizationIDは自動インクリメント(オートナンバー)なので、レコードが追加された順に1, 2, 3, ・・・となります。


insert into SA01Sales (SA01OrganizationID, SA01Sales) values
(4, 10000),   --東京支社 営業1課
(5, 50000),   --東京支社 営業2課
(8, 20000),   --大阪支社 第1営業課
(9, 30000)    --大阪支社 第2営業課


さて、いよいよ階層毎の集計をします。階層の集計は、自分にぶら下がっている全ての子供の売上データの合計になります。OR01Hierarchyidというhierarchyid型を辿れば、自分にぶら下がっている全ての子供である組織データが見つかります。
その見つかった組織データにぶら下がっている売上データを合計すれば目的が達せられます。
これを実現した関数が以下になります。
CTE内では外部結合ができませんので、select文を使って売上データを求めています。

create function SumAllSalesUnderMe
(
    @hierarchyid as hierarchyid
)
returns bigint
as
begin

declare @compwk bigint;

with CTE(CTEHierarchyid, CTESales)
AS
(
    select  OR01Hierarchyid, (select SA01Sales from SA01Sales as Sa1 where Sa1.SA01OrganizationID = OR01OrganizationID)
                                    from OR01Organization
                                    where OR01Hierarchyid = @hierarchyid
    union all
    select  OR01Hierarchyid, (select SA01Sales from SA01Sales as Sa2 where Sa2.SA01OrganizationID = Or1.OR01OrganizationID)
                                    from OR01Organization as Or1
                                    inner join CTE as c on c.CTEHierarchyid = Or1.OR01Hierarchyid.GetAncestor(1)
)

select @compwk = sum(CTESales) from CTE

return @compwk

end


これで全ての準備が整いました。以下のようにselect文を発行すれば、階層毎に集計された結果が得られます。


select OR01Hierarchyid.ToString() as Path,
       space(OR01HierarchyLevel * 5) + OR01OrganizationName as Name,
       OR01HierarchyLevel as Level,
       dbo.SumAllSalesUnderMe(OR01Hierarchyid) as SubTotal
  from OR01Organization order by OR01Hierarchyid

 

Path Name Level SubTotal
/ 全社 0 110000
/1/      東京支社 1 60000
/1/1/          統括事業部 2 60000
/1/1/1/              営業1課 3 10000
/1/1/2/              営業2課 3 50000
/2/        大阪支社 1 50000
/2/1/          営業部 2 50000
/2/1/1/              第1営業課 3 20000
/2/1/2/              第2営業課 3 30000
posted @ 15:05 | Feedback (6)

2009年10月28日 #

私自身が忙しくてなかなかVS2010に触れていないのですが、VS2010 Beta2に対応したWPFのサンプルがCode Galleryにアップされています。

WPF samples now available at Code Gallery
http://blogs.msdn.com/wpfsdk/archive/2009/10/23/wpf-samples-now-available-at-code-gallery.aspx

posted @ 13:24 | Feedback (0)