<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlserver-indo.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Cahyo drop in {here}</title><link>http://sqlserver-indo.net/blogs/cahyo/default.aspx</link><description>SQL as breakfast, BI for lunch and dinner with MDX</description><dc:language>en</dc:language><generator>CommunityServer 2007 (Build: 20416.853)</generator><item><title>{CTE} Mendapatkan Top Parent dari sebuah Hirarki</title><link>http://sqlserver-indo.net/blogs/cahyo/archive/2011/06/20/cte-mendapatkan-top-parent-dari-sebuah-hirarki.aspx</link><pubDate>Mon, 20 Jun 2011 04:10:00 GMT</pubDate><guid isPermaLink="false">3a6a675a-da36-4e91-95d9-8d13c1c22109:709</guid><dc:creator>cahyo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlserver-indo.net/blogs/cahyo/rsscomments.aspx?PostID=709</wfw:commentRss><comments>http://sqlserver-indo.net/blogs/cahyo/archive/2011/06/20/cte-mendapatkan-top-parent-dari-sebuah-hirarki.aspx#comments</comments><description>&lt;p&gt;Sudah sangat amat lama sekali rasanya saya tidak menulis blog. Padahal banyak sekali ide/bahan saat sedang menemui kasus2 aneh di klien. Dari pada blognya sepi mending saya ngeblog jawaban pertanyaan di milis mumpung lagi g males nulis :D&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Tulisan kali ini berisi tentang bagaimana cara mendapatkan Top Parent dari sebuah hirarki.&lt;/p&gt;&lt;p&gt;Berikut adalah contoh data berikut skrip yang dapat dipelajari.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;span style="font-family:courier new,monospace;"&gt;declare @Source table(&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;
&lt;span style="font-family:courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID char(4),&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;&lt;span style="font-family:courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ParentID char(4)&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;
&lt;span style="font-family:courier new,monospace;"&gt;)&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;&lt;br style="font-family:courier new,monospace;" /&gt;&lt;span style="font-family:courier new,monospace;"&gt;insert into @Source values &lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;
&lt;span style="font-family:courier new,monospace;"&gt;(&amp;#39;as01&amp;#39;,NULL),&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;&lt;span style="font-family:courier new,monospace;"&gt;(&amp;#39;as02&amp;#39;,&amp;#39;as01&amp;#39;),&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;
&lt;span style="font-family:courier new,monospace;"&gt;(&amp;#39;as03&amp;#39;,&amp;#39;as02&amp;#39;),&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;&lt;span style="font-family:courier new,monospace;"&gt;(&amp;#39;as04&amp;#39;,&amp;#39;as03&amp;#39;)&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;
&lt;br style="font-family:courier new,monospace;" /&gt;&lt;span style="font-family:courier new,monospace;"&gt;;WITH CSource&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;&lt;span style="font-family:courier new,monospace;"&gt;AS&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;
&lt;span style="font-family:courier new,monospace;"&gt;(&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;&lt;span style="font-family:courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp; SELECT e.ID,e.ParentID,&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;
&lt;span style="font-family:courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 AS Level,&lt;/span&gt;&lt;b style="font-family:courier new,monospace;"&gt; e.ID as TopParent&lt;/b&gt;&lt;br style="font-family:courier new,monospace;" /&gt;&lt;span style="font-family:courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM @Source AS e&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;
&lt;span style="font-family:courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE e.ParentID IS NULL&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;&lt;span style="font-family:courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UNION ALL&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;
&lt;span style="font-family:courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT e.ID,e.ParentID,&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;&lt;span style="font-family:courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Level + 1,&lt;/span&gt;&lt;b style="font-family:courier new,monospace;"&gt; d.TopParent&lt;/b&gt;&lt;br style="font-family:courier new,monospace;" /&gt;
&lt;span style="font-family:courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM @Source AS e&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;&lt;span style="font-family:courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; INNER JOIN CSource AS d&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;
&lt;span style="font-family:courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ON e.ParentID = d.ID&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;&lt;span style="font-family:courier new,monospace;"&gt;)&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;
&lt;br style="font-family:courier new,monospace;" /&gt;&lt;span style="font-family:courier new,monospace;"&gt;SELECT ID,TopParent&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;&lt;span style="font-family:courier new,monospace;"&gt;FROM CSource&lt;/span&gt;&lt;br style="font-family:courier new,monospace;" /&gt;
&lt;span style="font-family:courier new,monospace;"&gt;WHERE ID=&amp;#39;as04&amp;#39;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Logikanya ada pada bagian yang dicetak tebal. &lt;/p&gt;&lt;p&gt;Jika ingin mencari Parent pada level tertentu juga bukanlah hal yang sulit. Berikut contoh jika ingin mendapatkan Parent Level 1(Level kedua karena dimulai dari 0).&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new,monospace;"&gt;WITH CSource&lt;br /&gt;AS&lt;br /&gt;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT e.ID,e.Parent,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 AS Level, cast(NULL as CHAR(4)) as Root1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM @Source AS e&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE e.Parent IS NULL&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UNION ALL&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT e.ID,e.Parent,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Level + 1, case when &lt;b&gt;Level + 1=1 then e.ID else d.Root1&lt;/b&gt; end&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM @Source AS e&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; INNER JOIN CSource AS d&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ON e.Parent = d.ID&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;SELECT *&lt;br /&gt;FROM CSource&lt;br /&gt;--WHERE ID=&amp;#39;as04&amp;#39;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Cukup mudah bukan? &lt;/p&gt;&lt;p&gt;Sampai jumpa pada coretan selanjutnya :) &lt;br /&gt;&lt;/p&gt;&lt;img src="http://sqlserver-indo.net/aggbug.aspx?PostID=709" width="1" height="1"&gt;</description><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/CTE/default.aspx">CTE</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/T-SQL/default.aspx">T-SQL</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/Hierarchy/default.aspx">Hierarchy</category></item><item><title>{SSRS} Fitur baru untuk Reporting Services di SQL Server 2008 R2 (August and November CTP)</title><link>http://sqlserver-indo.net/blogs/cahyo/archive/2010/02/11/ssrs-fitur-baru-untuk-reporting-services-di-sql-server-2008-r2-august-and-november-ctp.aspx</link><pubDate>Wed, 10 Feb 2010 13:46:00 GMT</pubDate><guid isPermaLink="false">3a6a675a-da36-4e91-95d9-8d13c1c22109:506</guid><dc:creator>cahyo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlserver-indo.net/blogs/cahyo/rsscomments.aspx?PostID=506</wfw:commentRss><comments>http://sqlserver-indo.net/blogs/cahyo/archive/2010/02/11/ssrs-fitur-baru-untuk-reporting-services-di-sql-server-2008-r2-august-and-november-ctp.aspx#comments</comments><description>

&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;Jadi gak sabar
nungguin final release dari SQL Server 2008 R2 especially untuk Reporting
Servicesnya. &lt;/p&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;Banyak peningkatan2 dan penambahan fitur yang membuat proses
development report menjadi jauh lebih simple dan efisien.&lt;/p&gt;

&lt;p style="margin:0in;"&gt;&amp;nbsp;&lt;/p&gt;

&lt;ol style="margin-left:0.3125in;direction:ltr;unicode-bidi:embed;margin-top:0in;margin-bottom:0in;font-family:Calibri;font-size:11pt;"&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:17pt;"&gt;&lt;b&gt;&lt;span style="font-family:Calibri;font-size:17pt;"&gt;November CTP :&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;"&gt;&lt;b&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;Report Part Gallery&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;Komponen2 yang ada
 di report kita seperti tablix, matrix, chart, dll bisa kita publish ke server
 dan kita pakai berulang2 untuk report yg lainnya baik untuk development
 menggunakan BIDS maupun report builder 3.0&lt;/p&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;"&gt;&lt;b&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;Shared Datasets&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;Datasets yg kita
 buat bisa di share seperti halnya datasource .&lt;/p&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;Fitur ini yg saya
 nanti2kan karna sering kali saya harus membuat datasource yg sama berulang2
 untuk report yg saya buat. Dataset ini biasanya berupa dataset untuk
 parameter. Ketika ada perubahan untuk satu dataset, saya juga harus merubah
 dataset yg sama di report2 yg lain. Sungguh hal yg membuang banyak waktu dalam
 proses development report.&lt;br /&gt;
  &amp;nbsp;&lt;/p&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;"&gt;&lt;b&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;Enhanced SharePoint
     Integration for SharePoint 2007 and 2010&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;Adanya dukungan
 untuk multiple SharePoint Zones, the SharePoint Universal Logging service, dan
 Report Parts.&lt;/p&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;Selain itu, kita
 bisa mengquery List yang ada di SharePoint menggunakan query designer.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Salah satu data source yg mungkin nanti akan
 sering saya gunakan selain datasource menggunakan query SQL dan MDX.&lt;/p&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;"&gt;&lt;b&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;New Data Visualisation Report
     Items&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;Ini fitur yang
 menjengkelkan buat saya :D karna beberapa bulan sebelum ini saya harus memutar
 otak untuk menghasilkan hal serupa dan setelah mau saya blog bagaimana caranya
 ternyata eh ternyata malah dijadikan fitur tambahan di SQL Server R2.&lt;/p&gt;&lt;p style="margin:0in;"&gt;&lt;img width="163" height="73" alt="" /&gt;&lt;/p&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;&lt;img src="http://sqlserver-indo.org/blogs/cahyo/SSRS%202008%20R2/new%20databar,sparkline,indicator.png" width="163" height="73" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;list-style-type:disc;"&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;&lt;b&gt;Data Bars&lt;/b&gt; : Sama
     halnya dengan databar yg ada di excel. Skala panjang bar berdasarkan
     prosentasenya terhadap nilai maksimal data pada grup tempat komponen ini.
     Sebelum ini,untuk menghasilkan hal serupa saya menggunakan gauge dan
     menghilangkan semua componennya kecuali komponen range untuk barnya.
     Dengan itu, saya tidak hanya bisa menentukan batas maksimum bahkan bisa
     menentukan batas minimum dan membuat databar yg mulai dari tengah kemudian
     barnya ke arah kanan dan kiri untuk nilai positif dan negatif. Untuk
     databars di R2 ini saya belum mencoba apakah bisa digunakan untuk hal
     serupa :)&lt;br /&gt;
          &lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;list-style-type:disc;"&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;&lt;b&gt;Sparklines&lt;/b&gt; :
     Sebuah grafik garis&lt;span&gt;&amp;nbsp; &lt;/span&gt;yg biasanya
     digunakan untuk melihat gambaran tren naik turun suatu data. Dahulu kala
     saya membuat sparkline ini di dalam suatu matrix menggunakan line chart
     kemudian membuang semua komponennya seperti axis, legend , dll kecuali
     line chartnya itu sendiri.&lt;/span&gt;&lt;/li&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;list-style-type:disc;"&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;&lt;b&gt;Indicators&lt;/b&gt; : Ikon
     kecil ini biasa digunakan untuk menggambarkan status suatu data. Pada
     jaman reporting services sebelumnya untuk membuat indicators kita harus
     menempelkan suatu gambar di dalam komponen kemudian menentukan gambarnya
     di value expression dari kompenen gambar tersebut. &lt;/span&gt;&lt;/li&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;Contoh data
 visualisation tricky yg pernah saya buat:&lt;/p&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;img src="http://sqlserver-indo.org/blogs/cahyo/SSRS%202008%20R2/my%20databar,indicator.png" alt="" /&gt;&lt;img src="http://sqlserver-indo.org/blogs/cahyo/SSRS%202008%20R2/my%20databar1.png" alt="" /&gt;&lt;img src="http://sqlserver-indo.org/blogs/cahyo/SSRS%202008%20R2/my%20indicator,sparklines.png" alt="" /&gt;&lt;/p&gt;&lt;p style="margin:0in;"&gt;&lt;img width="172" height="213" alt="" /&gt;&lt;/p&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;&amp;nbsp; &lt;br /&gt;&lt;/p&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;"&gt;&lt;b&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;Enhanced Business
     Intelligence Development Studio&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;BIDS Mendukung
 format report dan report projects untuk versi 2008 dan 2008 R2&lt;/p&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;"&gt;&lt;b&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;Aggregates of Aggregates&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;Salah satu hal yg
 cukup sulit kita lakukan di versi sebelumnya adalah melakukan agregasi di
 dalam agregasi. Sekarang di 2008 R2 kita bisa menggunakan expression seperti
 =Avg(Sum(Sales, &amp;quot;Month&amp;quot;), &amp;quot;Year&amp;quot;) untuk mendapatkan rata2
 penjualan perbulan langsung di komponen reporting services tanpa harus
 menghitungnya terlebih dahulu di level dataset.&lt;/p&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;"&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;&lt;b&gt;Other RDL Expression Language
     enhancements&lt;/b&gt; &lt;/span&gt;&lt;/li&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;list-style-type:disc;"&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;Expression untuk
     mengetahui format rendering (=Globals!RenderFormat.Name) &lt;/span&gt;&lt;/li&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;list-style-type:disc;"&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;Penamaan halaman,
     termasuk penamaan worksheets untuk report yg diekspor ke format excel.
     Sebelumnya worksheets di excel hanya bisa kita beri nama sesuai nama
     report. Kalau kita menggunakan page break untuk membuat report yg kita
     eskpor ke excel bisa menjadi lebih dari 1 worksheet tidak ada menu atau
     properties untuk merubah nama worksheet tersebut.&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;list-style-type:disc;"&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;Group.DomainScope
     cukup berguna untuk sinkronisasi data secara visual antar grafik /
     sparklines dan&lt;span&gt;&amp;nbsp; &lt;/span&gt;tablix yang berbeda
     bahkan jika data hanya tersedia pada group yg berbeda.&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;list-style-type:disc;"&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;Proses baca/tulis
     variabel di report ada secara otomatis dan rapi. Ini untuk memudahkan kita
     mengelola variabel di report yg kita buat sendiri.&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;list-style-type:disc;"&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;Kita bisa memutar
     teks 270 Derajat di dalam kolom. Saya sempat mencari2 untuk hal ini di
     versi sebelumnya dan ternyata sekarang ada di versi R2 :)&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;list-style-type:disc;"&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;Ada dynamic page
     breaks, dan juga kita bisa mereset kembali nomor halaman pada page breaks&lt;/span&gt;&lt;/li&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;"&gt;&lt;b&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;New 2010 SOAP Endpoint &lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;SOAP yang ada saat
 ini yaitu 2005/2006 masih didukung, tapi di 2010 dukungan dijadikan satu baik
 untuk mode native maupun SharePoint integrated dan menambahkan fungsionalitas
 untuk area baru seperti shared datasets, cache refresh plans, and report
 parts.&lt;/p&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;"&gt;&lt;b&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;Improved Browser and
     Standards Mode Support&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;Saya pernah melihat
 reporting services 2008 R2 didemokan oleh Om MCA saat mengikuti monthly
 meeting sql server user groupnya singapore lewat firefox dan tampilannya tidak
 berantakan. &lt;/p&gt;&lt;/ol&gt;

&lt;p style="margin:0in;"&gt;&amp;nbsp;&lt;/p&gt;

&lt;ol style="margin-left:0.3125in;direction:ltr;unicode-bidi:embed;margin-top:0in;margin-bottom:0in;font-family:Calibri;font-size:11pt;"&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:17pt;"&gt;&lt;span style="font-family:Calibri;font-size:17pt;"&gt;August CTP :&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;"&gt;&lt;b&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;Map and spatial data
     visualization&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;Fitur baru untuk
 visualisasi data spatial.Visualisasi data ini juga bisa menggunakan bing maps.&lt;/p&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;"&gt;&lt;b&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;Report Builder 3.0 &lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;Report builder yang
 baru ini punya banyak fitur yang hampir mirip dengan proses development report
 menggunakan BIDS.&lt;/p&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;list-style-type:disc;"&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;Bisa digunakan
     untuk membuat embedded datasource credentials, relative references, dan
     subreport references ketika tehubung ke sebuah report server.&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;list-style-type:disc;"&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;Hasil dari
     dataset juga dichache ketika terhubung ke report server sehingga
     mempercepat preview report ketika kita melakukan perubahan2 terhadap
     layout/design report.&lt;/span&gt;&lt;/li&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;"&gt;&lt;b&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;ATOM data feeds&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;Report yang kita
 buat sekarang juga tersedia dalam format ATOM yang bisa kita ambil dengan
 menggunakan PowerPivot a.k.a. Gemini atau tools lain yg bisa kita gunakan
 untuk membaca ATOM.&lt;/p&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;"&gt;&lt;b&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;AJAX Report Viewer &lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;Navigasi yang kita
 lakukan di report viewer akan lebih lancar karna versi 2008 R2 nantinya
 menggunakan teknologi AJAX&lt;/p&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;"&gt;&lt;b&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;Report Manager &lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;Interaksi kita ke
 report manager nantinya akan terasa seperti di SharePoint dan akan ada menu2
 tambahan.&lt;/p&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;"&gt;&lt;b&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;RDL Expression Language
     enhancements &lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;Penambahan dukungan
 untuk fungsionalitas dan data geospatial, juga untuk 3 tipe fungsi lookup
 yaitu Lookup, LookupSet dan MultiLookup.&lt;/p&gt;&lt;/ol&gt;

&lt;p style="margin:0in;"&gt;&amp;nbsp;&lt;/p&gt;

&lt;ol style="margin-left:0.2729in;direction:ltr;unicode-bidi:embed;margin-top:0in;margin-bottom:0in;font-family:Calibri;font-size:11pt;"&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11pt;"&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;References:&lt;/span&gt;&lt;/p&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;list-style-type:disc;"&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;Monthly meeting
     SQL Server User Group Singapore. Thx to Om MCA(Choirul Amri) as the
     speaker and thx for the walk :)&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;list-style-type:disc;"&gt;&lt;a href="http://blogs.msdn.com/sqlrsteamblog/archive/2009/11/09/sql-server-2008-r2-november-ctp-what-s-new-in-reporting-services.aspx"&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;http://blogs.msdn.com/sqlrsteamblog/archive/2009/11/09/sql-server-2008-r2-november-ctp-what-s-new-in-reporting-services.aspx&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;list-style-type:disc;"&gt;&lt;a href="http://blogs.msdn.com/sqlrsteamblog/archive/2009/08/11/sql-server-2008-r2-august-ctp-what-s-new-in-reporting-services.aspx"&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;http://blogs.msdn.com/sqlrsteamblog/archive/2009/08/11/sql-server-2008-r2-august-ctp-what-s-new-in-reporting-services.aspx&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top:0pt;margin-bottom:0pt;vertical-align:middle;list-style-type:disc;"&gt;&lt;a href="http://blogs.msdn.com/robertbruckner/archive/2009/08/11/rs-maps-with-spatial-data-and-bing-maps.aspx"&gt;&lt;span style="font-family:Calibri;font-size:11pt;"&gt;http://blogs.msdn.com/robertbruckner/archive/2009/08/11/rs-maps-with-spatial-data-and-bing-maps.aspx&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;

&lt;img src="http://sqlserver-indo.net/aggbug.aspx?PostID=506" width="1" height="1"&gt;</description><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/SSRS/default.aspx">SSRS</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/November+CTP/default.aspx">November CTP</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/2008+R2/default.aspx">2008 R2</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/August+CTP/default.aspx">August CTP</category></item><item><title>MDX - SSRS - Time Dimension Parameter Desc Order</title><link>http://sqlserver-indo.net/blogs/cahyo/archive/2009/10/29/mdx-ssrs-time-dimension-parameter-desc-order.aspx</link><pubDate>Wed, 28 Oct 2009 03:24:00 GMT</pubDate><guid isPermaLink="false">3a6a675a-da36-4e91-95d9-8d13c1c22109:481</guid><dc:creator>cahyo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlserver-indo.net/blogs/cahyo/rsscomments.aspx?PostID=481</wfw:commentRss><comments>http://sqlserver-indo.net/blogs/cahyo/archive/2009/10/29/mdx-ssrs-time-dimension-parameter-desc-order.aspx#comments</comments><description>&lt;p&gt;Saat sedang membuat sebuah report menggunakan SSRS 2008 saya menemukan sebuah kasus dimana saya perlu membuat parameter dimensi waktu diurutkan secara descending. Parameter disini menggunakan dataset dari cube sehingga querynya menggunakan MDX. By default ketika kita membuat dataset menggunakan cube(SSAS) query untuk parameter akan digenerate secara otomatis. Berikut adalah query hasil generate otomatis untuk parameter bulan:&lt;/p&gt;&lt;p&gt;&lt;i&gt;WITH &lt;br /&gt;MEMBER [Measures].[ParameterCaption] AS [Time].[Month Prod].CURRENTMEMBER.MEMBER_CAPTION &lt;br /&gt;MEMBER [Measures].[ParameterValue] AS [Time].[Month Prod].CURRENTMEMBER.UNIQUENAME &lt;br /&gt;MEMBER [Measures].[ParameterLevel] AS [Time].[Month Prod].CURRENTMEMBER.LEVEL.ORDINAL &lt;br /&gt;SELECT &lt;br /&gt;{[Measures].[ParameterCaption], [Measures].[ParameterValue], [Measures].[ParameterLevel]} ON COLUMNS , &lt;br /&gt;[Time].[Month Prod].ALLMEMBERS ON ROWS &lt;br /&gt;FROM [Comp Cube]&lt;br /&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Seperti yang dapat anda baca dari query diatas, saya mengambil data dari atribut [Month Prod] dari dimensi [Time]. Hasil query ini diurutkan secara ascending menggunakan composite key dari atribut [Month Prod] yaitu tahun dan bulan. Contoh dari uniquename dari membernya [Month Prod] adalah [Time].[Month Prod].&amp;amp;[2009]&amp;amp;[10]. Untuk menghasilkan hasil dari query tersebut diurutkan secara descending, anda bisa menggunakan query seperti berikut:&lt;/p&gt;&lt;p&gt;&lt;i&gt;WITH &lt;br /&gt;MEMBER [Measures].[ParameterCaption] AS [Time].[Month Prod].CURRENTMEMBER.MEMBER_CAPTION &lt;br /&gt;MEMBER [Measures].[ParameterValue] AS [Time].[Month Prod].CURRENTMEMBER.UNIQUENAME &lt;br /&gt;MEMBER [Measures].[ParameterLevel] AS [Time].[Month Prod].CURRENTMEMBER.LEVEL.ORDINAL &lt;br /&gt;MEMBER [Measures].[DateOrder] as &lt;br /&gt;[Time].[Month Prod].CurrentMember.Properties(&amp;quot;Key0&amp;quot;) + vba!right(&amp;quot;0&amp;quot; +&lt;br /&gt;[Time].[Month Prod].CurrentMember.Properties(&amp;quot;Key1&amp;quot;) ,2)&lt;br /&gt;SELECT &lt;br /&gt;{[Measures].[ParameterCaption], [Measures].[ParameterValue], [Measures].[ParameterLevel]} ON COLUMNS , &lt;br /&gt;ORDER([Time].[Month Prod].[All].Children ,[Measures].[DateOrder],bdesc)&lt;br /&gt;ON ROWS &lt;br /&gt;FROM [Comp Cube]&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Pada query diatas saya membuat calculated measure bernama [DateOrder] yang menggabungkan key tahun dan bulan yang bisa diakses menggunakan properties key0 dan key1. Setelah itu dengan menggunakan fungsi ORDER kita bisa mengurutkan hasil dari query untuk mendapatkan bulan dengan menggunakan measure [DateOrder] sebagai kriteria untuk dasar pengurutannya.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://sqlserver-indo.net/aggbug.aspx?PostID=481" width="1" height="1"&gt;</description><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/MDX/default.aspx">MDX</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/SSRS/default.aspx">SSRS</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/Order/default.aspx">Order</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/Time/default.aspx">Time</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/Dimension/default.aspx">Dimension</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/Date/default.aspx">Date</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/Desc/default.aspx">Desc</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/Parameter/default.aspx">Parameter</category></item><item><title>DW - DimTime for Production Calendar Hierarchy 4-4-5</title><link>http://sqlserver-indo.net/blogs/cahyo/archive/2009/10/08/dw-dimtime-for-production-calendar-hierarchy-4-4-5.aspx</link><pubDate>Wed, 07 Oct 2009 04:04:00 GMT</pubDate><guid isPermaLink="false">3a6a675a-da36-4e91-95d9-8d13c1c22109:479</guid><dc:creator>cahyo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlserver-indo.net/blogs/cahyo/rsscomments.aspx?PostID=479</wfw:commentRss><comments>http://sqlserver-indo.net/blogs/cahyo/archive/2009/10/08/dw-dimtime-for-production-calendar-hierarchy-4-4-5.aspx#comments</comments><description>&lt;p&gt;Di suatu project BI yang saya kerjakan ada permintaan dari klien agar dimensi waktu yang dibuat nantinya punya hierarchy dengan format kalendar 4-4-5.Kalender 4-4-5 disini berarti dalam satu bulan ada 4-5 minggu. Kala u kita melihat kalender yg sebenarnya, akan ada 1 minggu yang terletak di antara 2 bulan. Pada contoh kasus kali ini, hari jumat adalah hari pertama dalam 1 minggu produksi. Untuk lebih jelas ilustrasinya seperti di bawah ini:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;1 Okt 2009 adalah  Minggu ke-4 bulan Sept&lt;/li&gt;&lt;li&gt;2 Okt 2009-8 Okt 2009 adalah Minggu ke-1 bulan Okt&lt;/li&gt;&lt;li&gt;9 Okt 2009-15 Okt 2009 adalah Minggu ke-2 bulan Okt&lt;/li&gt;&lt;li&gt;16 Okt 2009-22 Okt 2009 adalah Minggu ke-3 bulan Okt&lt;/li&gt;&lt;li&gt;23 Okt 2009-30 Okt 2009 adalah Minggu ke-4 bulan Okt&lt;/li&gt;&lt;li&gt;31 Okt 2009-6 Nov 2009 adalah Minggu ke-5 bulan Okt&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Untuk Mendapatkan Minggu tersebut saya menggunakan hari pertama pada suatu minggu sebagai acuan. Sesuai permintaan, hari pertama suatu minggu disini adalah hari jumat bukan hari minggu. Untuk lebih jelasnya sintaks pembuatan tabel dimensi waktu ini adalah sbb:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;i&gt;&amp;nbsp;CREATE TABLE DimTime (&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;TimeKey int IDENTITY PRIMARY KEY,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;AlternateKey AS year(TheDate)*10000+month(TheDate)*100+day(TheDate),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;TheDate datetime NOT NULL,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Year AS datepart(year,TheDate),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Quarter AS datepart(quarter,TheDate),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;QuarterName AS &amp;#39;Q&amp;#39;+datename(quarter,TheDate)+&amp;#39; &amp;#39;+datename(year,TheDate),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Month AS datepart(month,TheDate),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;MonthName AS LEFT(datename(month,TheDate),3)+&amp;#39; &amp;#39;+datename(year,TheDate),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Week AS datepart(week,TheDate),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;WeekName AS &amp;#39;Week &amp;#39;+datename(week,TheDate)+&amp;#39; &amp;#39;+datename(year,TheDate),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DateName AS datename(day,TheDate)+&amp;#39; &amp;#39;+LEFT(datename(month,TheDate),3)+&amp;#39; &amp;#39;+datename(year,TheDate),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;WeekDayProd AS datepart(dw,dateadd(day,-5,TheDate)),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;FirstWeekDayProd AS dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;YearProd AS datepart(year,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate)),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;QuarterProd AS datepart(quarter,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate)),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;QuarterProdName AS &amp;#39;Q&amp;#39;+datename(quarter,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate))+&amp;#39; &amp;#39;+datename(year,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate)),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;MonthProd AS datepart(month,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate)),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;MonthProdName AS LEFT(datename(month,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate)),3)+&amp;#39; &amp;#39;+datename(year,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate)),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;WeekProd AS (DATEPART(day,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate))-1)/7+1,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;WeekProdName AS &amp;#39;Week &amp;#39;+cast((DATEPART(day,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate))-1)/7+1 AS char(1))+&amp;#39; &amp;#39;+LEFT(datename(month,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate)),3)+&amp;#39; &amp;#39;+datename(year,dateadd(day,1-datepart(dw,dateadd(day,-5,TheDate)),Thedate))&lt;br /&gt;)&lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp; Untuk mencoba mengisi data dan melihat hasil pada DimTime ini anda bisa gunakan script berikut:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;i&gt;DECLARE @startdate datetime,@enddate datetime&lt;br /&gt;SET @startdate=&amp;#39;20090801&amp;#39;&lt;br /&gt;SET @enddate=&amp;#39;20090930&amp;#39;&lt;br /&gt;&lt;br /&gt;TRUNCATE TABLE DimTime&lt;br /&gt;WHILE (@startdate&amp;lt;=@enddate)&lt;br /&gt;BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; INSERT INTO DimTime VALUES(@startdate)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @startdate=dateadd(day,1,@startdate)&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;SELECT * FROM DimTime t&lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Saya sudah membuat contoh production calendar hierachy pada SSAS menggunakan DimTime ini. Hierarchynya urut dari tahun-kuarter-bulan-minggu-tanggal. Screenshotnya seperti gambar di bawah:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://sqlserver-indo.org/blogs/cahyo/4-4-5.png" title="Production Calendar Hierarchy" alt="Production Calendar Hierarchy" width="390" height="471" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Kalau kita perhatikan tanda berwarna merah pada gambar di atas adalah tanggal pada bulan september yang dimasukan ke minggu di bulan agustus untuk keperluan kalender produksi ini.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://sqlserver-indo.net/aggbug.aspx?PostID=479" width="1" height="1"&gt;</description><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/SSAS/default.aspx">SSAS</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/DW/default.aspx">DW</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/Hierarchy/default.aspx">Hierarchy</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/4-4-5/default.aspx">4-4-5</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/Calendar/default.aspx">Calendar</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/DimTime/default.aspx">DimTime</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/OLAP/default.aspx">OLAP</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/Production+Calendar/default.aspx">Production Calendar</category></item><item><title>[T-SQL] DW Constraint Generator</title><link>http://sqlserver-indo.net/blogs/cahyo/archive/2009/07/18/t-sql-dw-constraint-generator.aspx</link><pubDate>Fri, 17 Jul 2009 09:54:00 GMT</pubDate><guid isPermaLink="false">3a6a675a-da36-4e91-95d9-8d13c1c22109:445</guid><dc:creator>cahyo</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlserver-indo.net/blogs/cahyo/rsscomments.aspx?PostID=445</wfw:commentRss><comments>http://sqlserver-indo.net/blogs/cahyo/archive/2009/07/18/t-sql-dw-constraint-generator.aspx#comments</comments><description>&lt;p&gt;Saat sedang membantu teman kantor yang progress projectnya dah mau kelar saya sedikit terkejut dengan DW(Datawarehouse) yang beliau bikin. Ternyata dari awal project sampai project hampir selesai dia belum memasang constraint(foreign key dan unique key) di DW. Awalnya memang sengaja tidak beliau pasang dengan alasan agar tidak lemot mengingat data yang dihandle cukup besar dengan resource yang kurang. Tetapi saya kurang setuju dengan alasan tersebut.&lt;/p&gt;&lt;p&gt;Constraint di DW sangatlah penting apalagi saat proses development untuk memastikan data yang masuk ke DW adalah data yang clean dan tidak redundan.&lt;/p&gt;&lt;p&gt;Akhirnya beliau minta saya untuk memasang constraint yang dibutuhkan di DW. Pada mulanya saya bermaksut membuat constraint yg dibutuhkan satu2 secara manual. Tapi beliau menyarankan untuk membuat generator saja mengingat jumlah constraint yang dibutuhkan lumayan banyak.&lt;/p&gt;&lt;p&gt;Untuk membuat generator ini tentunya ada beberapa aturan yang harus diperhatikan yaitu standarisasi penamaan tabel dan kolom pada DW. pada kesempatan kali ini saya sudah menyesuaikan generator yg telah saya buat dengan standar dari AdventureWorksDW dimana nama tabel diawali dengan kata Dim dan Fact untuk tabel dimensi dan fact. kemudian untuk kolom primary key dan foreign key di belakang nama kolomnya ada tambahan kata2 Key&lt;/p&gt;&lt;p&gt;Karena dibutuhkan 2 tipe constraint yaitu constraint untuk foreign key dan unique key maka saya membuat ke dua generatornya secara terpisah.&lt;/p&gt;&lt;p&gt;Berikut adalah script untuk men-generate constraint foreign key:&lt;/p&gt;&lt;p&gt;&lt;i&gt;DECLARE @MainTable NVARCHAR(50)&lt;br /&gt;DECLARE @ReferenceTable NVARCHAR(50)&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;DECLARE @sqlFK varchar(max)&lt;br /&gt;DECLARE @ColumnName NVARCHAR(50)&lt;br /&gt;DECLARE @Count int&lt;br /&gt;DECLARE @dummy int&lt;br /&gt;&lt;br /&gt;DECLARE curCreateFK CURSOR &amp;nbsp;&lt;br /&gt;FOR&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT so.name,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sc.name&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&amp;nbsp;&amp;nbsp; sysobjects so,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; syscolumns sc&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE&amp;nbsp; so.id = sc.id&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND&amp;nbsp; so.type = &amp;#39;U&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND&amp;nbsp; so.name LIKE &amp;#39;Fact%&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND&amp;nbsp; RIGHT(sc.name,3) = &amp;#39;Key&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ORDER BY&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; so.name,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sc.colorder&lt;br /&gt;OPEN curCreateFK&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;FETCH NEXT FROM curCreateFK INTO @MainTable, @ColumnName&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;WHILE @@FETCH_STATUS = 0&lt;br /&gt;BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @Count = 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT @Count = count(so.name)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&amp;nbsp;&amp;nbsp; sysobjects so,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; syscolumns sc&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE&amp;nbsp; so.id = sc.id&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND&amp;nbsp; so.type = &amp;#39;U&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND&amp;nbsp; so.name LIKE &amp;#39;Dim%&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; AND&amp;nbsp; sc.isnullable=0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND&amp;nbsp; sc.name = @ColumnName&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF @Count = 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT @ReferenceTable = so.name&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&amp;nbsp;&amp;nbsp; sysobjects so,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; syscolumns sc&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE&amp;nbsp; so.id = sc.id&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND&amp;nbsp; so.type = &amp;#39;U&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND&amp;nbsp; so.name LIKE &amp;#39;Dim%&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; AND&amp;nbsp; sc.isnullable=0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND&amp;nbsp; sc.name = @ColumnName&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;SET @sqlFK =&amp;nbsp; &amp;#39;ALTER TABLE [dbo].[&amp;#39; + @MainTable + &amp;#39;]&amp;nbsp; WITH CHECK ADD&amp;nbsp; CONSTRAINT [FK_&amp;#39; + @MainTable +&amp;#39;_&amp;#39;+@ColumnName+&amp;#39;] FOREIGN KEY([&amp;#39;+@ColumnName+&amp;#39;])&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;REFERENCES [dbo].[&amp;#39; + @ReferenceTable + &amp;#39;] ([&amp;#39; + @ColumnName +&amp;#39;])&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;#39;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;IF @Count=0 &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;IF @ColumnName LIKE &amp;#39;%Date%&amp;#39; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;SET @sqlFK = &amp;#39;ALTER TABLE [dbo].[&amp;#39; + @MainTable + &amp;#39;]&amp;nbsp; WITH CHECK ADD&amp;nbsp; CONSTRAINT [FK_&amp;#39; + @MainTable +&amp;#39;_&amp;#39;+@ColumnName+&amp;#39;] FOREIGN KEY([&amp;#39;+@ColumnName+&amp;#39;])&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;REFERENCES [dbo].[DimTime] ([TimeKey])&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;END&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ELSE&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;BEGIN &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;-- Do it manually for different column name&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;PRINT &amp;#39;Match Not Found: &amp;#39; + @MainTable + &amp;#39;-&amp;#39; + @ColumnName +&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;SET @sqlFK=&amp;#39;&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;END &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;END &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ELSE &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;BEGIN &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;-- Found more than 1 primary key with the same name&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;PRINT &amp;#39;Double: &amp;#39; + @MainTable + &amp;#39;-&amp;#39; + @ColumnName +&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN TRY&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXEC (@sqlFK)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PRINT &amp;#39;Success &amp;#39; + @sqlFK&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; END TRY&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN CATCH&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PRINT &amp;#39;Already Exists &amp;#39; + @sqlFK&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; END CATCH&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FETCH NEXT FROM curCreateFK INTO @MainTable, @ColumnName&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;CLOSE curCreateFK&lt;br /&gt;&lt;br /&gt;DEALLOCATE curCreateFK&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Dan ini generator untuk unique constraintnya:&lt;/p&gt;&lt;p&gt;&lt;i&gt;&amp;nbsp;DECLARE curTable CURSOR FOR&lt;br /&gt;SELECT so.name&lt;br /&gt;FROM&amp;nbsp;&amp;nbsp; sysobjects so&lt;br /&gt;WHERE&amp;nbsp; so.type = &amp;#39;U&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;AND&amp;nbsp; so.name LIKE &amp;#39;Fact%&amp;#39;&lt;br /&gt;ORDER BY&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;so.name&lt;br /&gt;&lt;br /&gt;DECLARE @tablename varchar(50),@UQ_Query varchar(max),@columnname varchar(50),@columncount int&lt;br /&gt;&lt;br /&gt;OPEN curTable&lt;br /&gt;FETCH NEXT FROM curTable INTO @tablename&lt;br /&gt;WHILE @@fetch_status=0&lt;br /&gt;BEGIN &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @columncount=0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @UQ_Query=&amp;#39;ALTER TABLE [&amp;#39;+@tablename+&amp;#39;] ADD CONSTRAINT [UQ_&amp;#39;+@tablename+&amp;#39;] UNIQUE (&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DECLARE curColumn CURSOR FOR&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;SELECT sc.name&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;FROM sysobjects so,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;syscolumns sc&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;WHERE&amp;nbsp; so.id = sc.id&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;AND RIGHT(sc.name,3) = &amp;#39;Key&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;AND so.name LIKE @tablename&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ORDER BY&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;sc.colorder&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; OPEN curColumn &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FETCH NEXT FROM curColumn INTO @columnname&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHILE @@fetch_status=0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @columncount=@columncount+1&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF @columncount=1 &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN&lt;/i&gt;&lt;i&gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/i&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/i&gt;&lt;i&gt;SET @UQ_Query=@UQ_Query+@columnname&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @UQ_Query=@UQ_Query+&amp;#39;,&amp;#39;+@columnname&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FETCH NEXT FROM curColumn INTO @columnname&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CLOSE curColumn&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DEALLOCATE curColumn&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;--Exception Goes Here&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IF @tablename=&amp;#39;FactInternetSales&amp;#39; OR @tablename=&amp;#39;FactResellerSales&amp;#39; OR @tablename=&amp;#39;FactInternetSalesReason&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @UQ_Query=@UQ_Query+&amp;#39;,SalesOrderNumber,SalesOrderLineNumber&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;END&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @UQ_Query=@UQ_Query+&amp;#39;)&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN TRY&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXEC (@UQ_Query)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PRINT &amp;#39;Success &amp;#39;+@UQ_Query&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; END TRY&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN CATCH&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PRINT &amp;#39;Already Exists &amp;#39;+@UQ_Query&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; END CATCH&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FETCH NEXT FROM curTable INTO @tablename&lt;br /&gt;END&lt;br /&gt;CLOSE curTable&lt;br /&gt;DEALLOCATE curTable&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://sqlserver-indo.net/aggbug.aspx?PostID=445" width="1" height="1"&gt;</description><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/T-SQL/default.aspx">T-SQL</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/Constraint+Generator/default.aspx">Constraint Generator</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/DW/default.aspx">DW</category></item><item><title>The way I used CTE....</title><link>http://sqlserver-indo.net/blogs/cahyo/archive/2009/04/18/the-way-i-used-cte.aspx</link><pubDate>Fri, 17 Apr 2009 08:40:00 GMT</pubDate><guid isPermaLink="false">3a6a675a-da36-4e91-95d9-8d13c1c22109:375</guid><dc:creator>cahyo</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlserver-indo.net/blogs/cahyo/rsscomments.aspx?PostID=375</wfw:commentRss><comments>http://sqlserver-indo.net/blogs/cahyo/archive/2009/04/18/the-way-i-used-cte.aspx#comments</comments><description>&lt;p&gt;Dalam tulisan kali ini saya ingin berbagi pengalaman saya tentang penggunaan CTE. dan pengalaman ini membuat saya CTE minded &lt;img src="http://sqlserver-indo.org/emoticons/emotion-2.gif" alt="Big Smile" /&gt;...&lt;/p&gt;&lt;p&gt;I love CTE&amp;nbsp;&lt;img src="http://sqlserver-indo.org/emoticons/emotion-10.gif" alt="Embarrassed" /&gt; &lt;/p&gt;&lt;p&gt;Sebelumnya saya sudah mengajarkan jurus ini kepada beberapa teman. Pada umumnya mereka bilang jurus ini ampuh. Tapi bagi saya jurus ini MTV Ampuh Banget.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Saya akan berbagi tentang jurus ini dengan menggunakan skenario pembuatan report untuk data penjualan.Pada report ini kita akan melihat penjualan untuk 1 bulan, penjualan pada bulan sebelumnya, penjualan dari awal kuartal sampai bulan sekarang, penjualan dari kuartal sebelumnya, dan penjualan dari awal tahun sampai bulan skarang.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Supaya lebih sederhana dan mudah dimengerti saya buat tabel Sales dengan 3 kolom saja yaitu Product, SalesDate dan Quantity. Berikut script untuk tabelnya:&lt;/p&gt;&lt;p&gt;CREATE TABLE #Sales (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product varchar(20),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SalesDate datetime,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Quantity int&lt;br /&gt;)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Setelah itu kita buat beberapa data dummy data untuk table tersebut&lt;/p&gt;&lt;p&gt;&lt;i&gt;INSERT INTO #Sales&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT &amp;#39;CD&amp;#39;,cast(&amp;#39;20080101&amp;#39; AS datetime),1 UNION &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT &amp;#39;DVD&amp;#39;,&amp;#39;20080102&amp;#39;,1 UNION &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT &amp;#39;Flash Disk&amp;#39;,&amp;#39;20080103&amp;#39;,1 UNION &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT &amp;#39;Hard Disk&amp;#39;,&amp;#39;20080104&amp;#39;,1 UNION &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT &amp;#39;CD&amp;#39;,&amp;#39;20080201&amp;#39;,2 UNION &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT &amp;#39;DVD&amp;#39;,&amp;#39;20080202&amp;#39;,2 UNION &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT &amp;#39;Flash Disk&amp;#39;,&amp;#39;20080203&amp;#39;,2 UNION &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT &amp;#39;Hard Disk&amp;#39;,&amp;#39;20080204&amp;#39;,2 UNION &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT &amp;#39;CD&amp;#39;,&amp;#39;20080301&amp;#39;,3 UNION &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT &amp;#39;DVD&amp;#39;,&amp;#39;20080302&amp;#39;,3 UNION &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT &amp;#39;Flash Disk&amp;#39;,&amp;#39;20080303&amp;#39;,3 UNION &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT &amp;#39;Hard Disk&amp;#39;,&amp;#39;20080304&amp;#39;,3 UNION &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT &amp;#39;CD&amp;#39;,&amp;#39;20080401&amp;#39;,4 UNION &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT &amp;#39;DVD&amp;#39;,&amp;#39;20080402&amp;#39;,4 UNION &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT &amp;#39;Flash Disk&amp;#39;,&amp;#39;20080403&amp;#39;,4 UNION &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT &amp;#39;Hard Disk&amp;#39;,&amp;#39;20080404&amp;#39;,4 UNION &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT &amp;#39;CD&amp;#39;,&amp;#39;20080501&amp;#39;,5 UNION &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT &amp;#39;DVD&amp;#39;,&amp;#39;20080502&amp;#39;,5 UNION &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT &amp;#39;Flash Disk&amp;#39;,&amp;#39;20080503&amp;#39;,5 UNION &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT &amp;#39;Hard Disk&amp;#39;,&amp;#39;20080504&amp;#39;,5&lt;/i&gt; &lt;/p&gt;&lt;p&gt;Skarang kita sudah punya sumber data. Berikutnya adalah bagian query untuk reportnya. Disinilah saya akan menunjukkan cara saya memanfaatkan CTE yang ada pada SQL Server 2005 ke atas. Pada query ini saya menggunakan range periode bulan,kuartal dan tahun seperti pada &lt;a href="http://sqlserver-indo.org/blogs/cahyo/archive/2009/04/18/date-script-collections.aspx" title="Date Script Collections"&gt;postingan saya sebelumnya&lt;/a&gt;. Dan querynya seperti ini :&lt;/p&gt;&lt;p&gt;&lt;i&gt;DECLARE @pRequestPeriod char(6)&lt;br /&gt;SET @pRequestPeriod=&amp;#39;200805&amp;#39;&lt;br /&gt;&lt;br /&gt;DECLARE @pDate datetime&lt;br /&gt;SET @pDate=@pRequestPeriod+&amp;#39;01&amp;#39;&lt;br /&gt;&lt;br /&gt;DECLARE @startMonth datetime,@endMonth datetime,@startPrevMonth datetime,@endPrevMonth datetime,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @startQTM datetime,@endQTM datetime,@startPrevQTM datetime,@endPrevQTM datetime,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @startYTM datetime,@endYTM datetime,@startPrevYTM datetime,@endPrevYTM datetime,@startPrevMoY datetime,@endPrevMoY datetime;&lt;br /&gt;&lt;br /&gt;SET @startMonth=datename(year,@pDate)+&amp;#39;-&amp;#39;+datename(month,@pDate)+&amp;#39;-01&amp;#39;&lt;br /&gt;SET @endMonth=dateadd(day,-1,dateadd(month,1,@startMonth))&lt;br /&gt;SET @startPrevMonth=datename(year,dateadd(month,-1,@pDate))+&amp;#39;-&amp;#39;+datename(month,dateadd(month,-1,@pDate))+&amp;#39;-01&amp;#39;&lt;br /&gt;SET @endPrevMonth=dateadd(day,-1,@startMonth)&lt;br /&gt;&lt;br /&gt;SET @startQTM=datename(year,@pDate)+&amp;#39;-&amp;#39;+cast(((datepart(month,@pDate)-1)/3)*3+1 AS varchar(2))+&amp;#39;-01&amp;#39;&lt;br /&gt;SET @endQTM=dateadd(day,-1,dateadd(month,1,datename(year,@pDate)+&amp;#39;-&amp;#39;+datename(month,@pDate)+&amp;#39;-01&amp;#39;))&lt;br /&gt;SET @startPrevQTM=datename(year,dateadd(month,-3,@pDate))+&amp;#39;-&amp;#39;+cast(((datepart(month,dateadd(month,-3,@pDate))-1)/3)*3+1 AS varchar(2))+&amp;#39;-01&amp;#39;&lt;br /&gt;SET @endPrevQTM=dateadd(day,-1,dateadd(month,1,datename(year,dateadd(month,-3,@pDate))+&amp;#39;-&amp;#39;+datename(month,dateadd(month,-3,@pDate))+&amp;#39;-01&amp;#39;))&lt;br /&gt;&lt;br /&gt;SET @startYTM=datename(year,@pDate)+&amp;#39;-01-01&amp;#39;&lt;br /&gt;SET @endYTM=dateadd(day,-1,dateadd(month,1,datename(year,@pDate)+&amp;#39;-&amp;#39;+datename(month,@pDate)+&amp;#39;-01&amp;#39;))&lt;br /&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;br /&gt;--disinilah CTE beraksi&lt;br /&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;;WITH &lt;br /&gt;Sales(Product,SalesDate,Quantity) AS (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT * FROM #Sales&lt;br /&gt;),&lt;br /&gt;SalesMonth(Product,MonthQuantity) AS (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT Product,sum(Quantity)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM Sales a&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE SalesDate BETWEEN @startMonth AND @endMonth&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GROUP BY Product&lt;br /&gt;),&lt;br /&gt;SalesPrevMonth(Product,PrevMonthQuantity) AS (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT Product,sum(Quantity)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM Sales a&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE SalesDate BETWEEN @startPrevMonth AND @endPrevMonth&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GROUP BY Product&lt;br /&gt;),&lt;br /&gt;SalesQTM(Product,QTMQuantity) AS (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT Product,sum(Quantity)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM Sales a&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE SalesDate BETWEEN @startQTM AND @endQTM&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GROUP BY Product&lt;br /&gt;),&lt;br /&gt;SalesPrevQTM(Product,PrevQTMQuantity) AS (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT Product,sum(Quantity)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM Sales a&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE SalesDate BETWEEN @startPrevQTM AND @endPrevQTM&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GROUP BY Product&lt;br /&gt;),&lt;br /&gt;SalesYTM(Product,YTMQuantity) AS (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT Product,sum(Quantity)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM Sales a&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE SalesDate BETWEEN @startYTM AND @endYTM&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GROUP BY Product&lt;br /&gt;),&lt;br /&gt;Result(Product,MonthQuantity,PrevMonthQuantity,QTMQuantity,PrevQTMQuantity,YTMQuantity) AS (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT a.Product,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; b.MonthQuantity,c.PrevMonthQuantity,d.QTMQuantity,e.PrevQTMQuantity,f.YTMQuantity&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM (SELECT DISTINCT Product FROM Sales) a&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; LEFT JOIN SalesMonth b ON a.Product=b.Product&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; LEFT JOIN SalesPrevMonth c ON a.Product=c.Product&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; LEFT JOIN SalesQTM d ON a.Product=d.Product&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; LEFT JOIN SalesPrevQTM e ON a.Product=e.Product&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; LEFT JOIN SalesYTM f ON a.Product=f.Product&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;SELECT * FROM Result&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Output: &lt;img src="http://sqlserver-indo.org/blogs/cahyo/20090417-CTE.png" title="Output" alt="Output" width="534" align="left" height="95" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Gmn? Bingung kan&amp;nbsp;&lt;img src="http://sqlserver-indo.org/emoticons/emotion-2.gif" alt="Big Smile" /&gt; ... Intinya adalah CTE disini berfungsi seperti temporary table, hanya saja kita lebih mudah untuk membaca querynya karena code relatif lebih sedikit dibandingkan dengan menggunakan temporary table dengan mendeklarasikannya terlebih dahulu. Coba anda bayangkan jika SalesMonth,SalesPrevMonth,SalesQTM,SalesPrevQTM,dan Sales YTM dibuat menggunakan temporary variabel, untuk membuat coding mudah terbaca anda pasti membutuhkan lebih dari 2x jumlah baris code jika anda tidak menggunakan CTE. Inilah mengapa saya *** CTE karena banyak kasus yang jauh lebih rumit dari yang ini dapat diselesaikan dengan &lt;b&gt;coding yang sedikit dan mudah dibaca&lt;/b&gt;.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://sqlserver-indo.net/aggbug.aspx?PostID=375" width="1" height="1"&gt;</description><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/CTE/default.aspx">CTE</category></item><item><title>Date Script Collections</title><link>http://sqlserver-indo.net/blogs/cahyo/archive/2009/04/18/date-script-collections.aspx</link><pubDate>Fri, 17 Apr 2009 04:06:00 GMT</pubDate><guid isPermaLink="false">3a6a675a-da36-4e91-95d9-8d13c1c22109:370</guid><dc:creator>cahyo</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlserver-indo.net/blogs/cahyo/rsscomments.aspx?PostID=370</wfw:commentRss><comments>http://sqlserver-indo.net/blogs/cahyo/archive/2009/04/18/date-script-collections.aspx#comments</comments><description>&lt;p&gt;Seringkali saya menghadapi kasus pembuatan report untuk menampilkan data 1 bulan , 1 kuarter atau 1 tahun dan berbagai macam variasinya. Untuk menyelesaikannya diperlukan script untuk mendapatkan range tanggal sesuai dengan periode yang diminta. Beberapa baris script di bawah ini adalah beberapa koleksi saya ketika membuat report menggunakan periode-periode tersebut. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;DECLARE @pDate datetime&lt;br /&gt;SET @pDate=&amp;#39;20090417&amp;#39;&lt;br /&gt;&lt;br /&gt;DECLARE @startMonth datetime,@endMonth datetime,@startPrevMonth datetime,@endPrevMonth datetime,@startNextMonth datetime,@endNextMonth datetime,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@startQTM datetime,@endQTM datetime,@startPrevQTM datetime,@endPrevQTM datetime,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@startYTM datetime,@endYTM datetime,@startPrevYTM datetime,@endPrevYTM datetime,@startPrevMoY datetime,@endPrevMoY datetime;&lt;br /&gt;&lt;br /&gt;SET @startMonth=datename(year,@pDate)+&amp;#39;-&amp;#39;+datename(month,@pDate)+&amp;#39;-01&amp;#39;&lt;br /&gt;SET @endMonth=dateadd(day,-1,dateadd(month,1,@startMonth))&lt;br /&gt;SET @startPrevMonth=datename(year,dateadd(month,-1,@pDate))+&amp;#39;-&amp;#39;+datename(month,dateadd(month,-1,@pDate))+&amp;#39;-01&amp;#39;&lt;br /&gt;SET @endPrevMonth=dateadd(day,-1,@startMonth)&lt;br /&gt;SET @startNextMonth=dateadd(month,1,@startMonth)&lt;br /&gt;SET @endNextMonth=dateadd(day,-1,dateadd(month,1,@startNextMonth))&lt;br /&gt;&lt;br /&gt;SET @startQTM=datename(year,@pDate)+&amp;#39;-&amp;#39;+cast(((datepart(month,@pDate)-1)/3)*3+1 AS varchar(2))+&amp;#39;-01&amp;#39;&lt;br /&gt;SET @endQTM=dateadd(day,-1,dateadd(month,1,datename(year,@pDate)+&amp;#39;-&amp;#39;+datename(month,@pDate)+&amp;#39;-01&amp;#39;))&lt;br /&gt;SET @startPrevQTM=datename(year,dateadd(month,-3,@pDate))+&amp;#39;-&amp;#39;+cast(((datepart(month,dateadd(month,-3,@pDate))-1)/3)*3+1 AS varchar(2))+&amp;#39;-01&amp;#39;&lt;br /&gt;SET @endPrevQTM=dateadd(day,-1,dateadd(month,1,datename(year,dateadd(month,-3,@pDate))+&amp;#39;-&amp;#39;+datename(month,dateadd(month,-3,@pDate))+&amp;#39;-01&amp;#39;))&lt;br /&gt;&lt;br /&gt;SET @startYTM=datename(year,@pDate)+&amp;#39;-01-01&amp;#39;&lt;br /&gt;SET @endYTM=dateadd(day,-1,dateadd(month,1,datename(year,@pDate)+&amp;#39;-&amp;#39;+datename(month,@pDate)+&amp;#39;-01&amp;#39;))&lt;br /&gt;SET @startPrevYTM=datename(year,dateadd(year,-1,@pDate))+&amp;#39;-01-01&amp;#39;&lt;br /&gt;SET @endPrevYTM=dateadd(day,-1,dateadd(month,1,datename(year,dateadd(year,-1,@pDate))+&amp;#39;-&amp;#39;+datename(month,dateadd(year,-1,@pDate))+&amp;#39;-01&amp;#39;))&lt;br /&gt;SET @startPrevMoY=dateadd(year,-1,@startMonth)&lt;br /&gt;SET @endPrevMoY=dateadd(day,-1,dateadd(month,1,@startPrevMoY))&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Keterangan:&lt;/p&gt;&lt;p&gt;- @startMonth,@endMonth ==&amp;gt; untuk mendapatkan range tanggal 1 bulan&lt;/p&gt;&lt;p&gt;- @start[Prev|Next]Month,@end[Prev|Next]Month ==&amp;gt; untuk mendapatkan range tanggal bulan sebelum/berikutnya&lt;/p&gt;&lt;p&gt;- @startQTM,@endQTM,@startPrevQTM,@endPrevQTM ==&amp;gt; untuk mendapatkan range tanggal awal kuarter ini/sebelumnya sampai tanggal terakhir bulan. Contoh : jika @pDate=&amp;#39;20090523&amp;#39; maka @startQTM=&amp;#39;20090401&amp;#39; dan @endQTM=&amp;#39;20090531&amp;#39;&lt;/p&gt;&lt;p&gt;- @startYTM,@endYTM,@startPrevYTM,@endPrevYTM ==&amp;gt; untuk mendapatkan range tanggal awal tahun ini/sebelumnya sampai tanggal terakhir
bulan. Contoh : jika @pDate=&amp;#39;20090523&amp;#39; maka @startYTM=&amp;#39;20090101&amp;#39; dan
@endYTM=&amp;#39;20090531&amp;#39;&lt;/p&gt;&lt;p&gt;&amp;nbsp;- @startPrevMoY,@endPrevMoY ==&amp;gt; untuk mendapatkan range tanggal bulan yang sama pada tahun sebelumnya.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://sqlserver-indo.net/aggbug.aspx?PostID=370" width="1" height="1"&gt;</description><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/date+manipulations/default.aspx">date manipulations</category></item><item><title>Proclarity - Little important notes for decomposition tree</title><link>http://sqlserver-indo.net/blogs/cahyo/archive/2009/01/16/proclarity-little-important-notes-for-decomposition-tree.aspx</link><pubDate>Thu, 15 Jan 2009 04:36:00 GMT</pubDate><guid isPermaLink="false">3a6a675a-da36-4e91-95d9-8d13c1c22109:144</guid><dc:creator>cahyo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlserver-indo.net/blogs/cahyo/rsscomments.aspx?PostID=144</wfw:commentRss><comments>http://sqlserver-indo.net/blogs/cahyo/archive/2009/01/16/proclarity-little-important-notes-for-decomposition-tree.aspx#comments</comments><description>&lt;p&gt;Kemaren sore saya ada meeting dengan klien untuk menjelaskan fitur Business Inteligence yang dimiliki oleh Proclarity(PPS).&lt;br /&gt;&lt;br /&gt;Pada saat saya menjelaskan tentang Decomposition Tree, saya menghadapi suatu permasalahan. &lt;br /&gt;Ketika saya menambahkan filter tahun di background pada setup panel maka munculah filter tersebut di atas data view pane.&lt;br /&gt;Akan tetapi, saya tidak mendapatkan output terfilter seperti filter yang telah saya buat dan filter tersebut akan hilang ketika saya menekan tombol apply.&lt;br /&gt;&lt;br /&gt;Setelah saya baca kembali file GettingStartedGuide.pdf untuk proclarity saya menemukan &amp;quot;a litte important note&amp;quot;:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NOTE : Because changes that you make in a Decomposition&lt;br /&gt;Tree do not show in the Setup Panel or in a grid view,&lt;br /&gt;we recommend closing the Setup Panel and viewing&lt;br /&gt;the Decomposition Tree in a full screen (with no&lt;br /&gt;grid).&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Intinya adalah Decomposition tree tidak menggunakan setup panel seperti pada bentuk view yang lain untuk mengatur measure dan dimension yang akan di tampilkan pada data view pane.&lt;br /&gt;yah..walaupun sepele tapi hal seperti ini sangatlah penting untuk diperhatikan. Apalagi untuk meeting dengan klien :D&lt;br /&gt;&lt;br /&gt;Dasar decomposition tree yang aneh. Yang laen pada pake setup panel eh dianya gak mau &amp;gt;:P&lt;br /&gt;&lt;/p&gt;&lt;img src="http://sqlserver-indo.net/aggbug.aspx?PostID=144" width="1" height="1"&gt;</description><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/Proclarity/default.aspx">Proclarity</category></item><item><title>MDX - Data suatu periode dan periode sebelumnya (PeriodsToDate,Cousin,Ancestor)</title><link>http://sqlserver-indo.net/blogs/cahyo/archive/2008/12/19/mdx-data-suatu-periode-dan-periode-sebelumnya-periodstodate-cousin-ancestor.aspx</link><pubDate>Thu, 18 Dec 2008 10:36:00 GMT</pubDate><guid isPermaLink="false">3a6a675a-da36-4e91-95d9-8d13c1c22109:129</guid><dc:creator>cahyo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlserver-indo.net/blogs/cahyo/rsscomments.aspx?PostID=129</wfw:commentRss><comments>http://sqlserver-indo.net/blogs/cahyo/archive/2008/12/19/mdx-data-suatu-periode-dan-periode-sebelumnya-periodstodate-cousin-ancestor.aspx#comments</comments><description>&lt;p&gt;Laporan di suatu perusahaan biasanya tidak hanya menampilkan data bulanan tapi juga data periode seperti 3 bulanan atau tahunan. Selain itu biasanya dibutuhkan *** data periode sebelumnya sebagai tolak ukur performa perusahaan. Pada kesempatan kali ini saya akan sedikit menjelaskan beberapa sintaks MDX yang digunakan untuk mendapatkan data dalam periode tertentu dan data pada periode sebelumnya.&lt;/p&gt;&lt;p&gt;Ada 3 fungsi MDX yang akan saya bahas kali ini, yaitu : PeriodsToDate,Cousin, dan Ancestor.&lt;/p&gt;Untuk contoh pertama saya membuat calculated member untuk mendapatkan data penjualan satu kuarter. Berikut sintaksnya:&lt;br /&gt;&lt;p&gt;&lt;i&gt;CREATE MEMBER CURRENTCUBE.[MEASURES].[SalesQTD]&lt;br /&gt;AS AGGREGATE(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PeriodsToDate(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Time].[Calendar].[Quarter], &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Time].[Calendar].CurrentMember&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ), [Measures].[Sales]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ), &lt;br /&gt; VISIBLE = 1&amp;nbsp; ; &lt;/i&gt;&lt;/p&gt;&lt;p&gt;Untuk contoh yang pertama ada 2 fungsi MDX&amp;nbsp; yang saya gunakan yaitu AGGREGATE dan PeriodsToDate. &lt;/p&gt;&lt;p&gt;&lt;b&gt;AGGREGATE &lt;/b&gt;digunakan untuk mengagregasi data pada cube dengan menggunakan default aggregation function measure yang di AGGREGATE. Jika [Measures].[Sales] mempunyai aggregation function SUM maka AGGREGATE di atas akan berjalan sebagai SUM, jika aggregation function [Measures].[Sales] AverageOfChildren maka AGGREGATE akan berfungsi seperti AverageOfChildren.&lt;/p&gt;&lt;p&gt;&lt;b&gt;PeriodsToDate &lt;/b&gt;digunakan untuk mengenerate member dari awal periode sampai member saat ini(current member). Pada contoh di atas saya menggunakan kuarter pada hierarchy calendar punya dimensi time. Misal current member untuk dimensi time adalah 15 Maret 1988 maka fungsi PeriodsToDate diatas akan menghasilkan member dari 1 Januari 1988 sampai dengan 15 Maret 1988.&lt;/p&gt;&lt;p&gt;Untuk contoh kedua saya membuat calculated member untuk mendapatkan data periode sebelumnya. Pada contoh kali ini adalah kuarter sebelumnya. Berikut Sintaksnya:&lt;/p&gt;&lt;p&gt;&lt;i&gt;CREATE MEMBER CURRENTCUBE.[MEASURES].[SalesQTD]&lt;br /&gt;AS AGGREGATE(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PeriodsToDate(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Time].[Calendar].[Quarter], &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cousin([Time].[Calendar].CurrentMember,Ancestor([Time].[Calendar].CurrentMember,[Time].[Calendar].[Quarter]).Prevmember)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ), [Measures].[Actual]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ), &lt;br /&gt; VISIBLE = 1&amp;nbsp; ; &lt;/i&gt;&lt;/p&gt;&lt;p&gt;Untuk contoh kedua ada beberapa perbedaan pada sintaks MDXnya yaitu penggunaan fungsi Cousin dan Ancestor. Inti dari penggunaan kedua fungsi ini adalah untuk mendapatkan member pada kuarter sebelumnya. Jadi apabila current member adalah 15 Juni 1988 maka member untuk kuarter sebelumnya adalah 15 Maret 1988. Sehingga fungsi PeriodsToDate akan mendapatkan member-member pada kuarter sebelumnya. Berikut adalah penjelasan kedua fungsi tersebut:&lt;/p&gt;&lt;p&gt;&lt;b&gt;Ancestor&lt;/b&gt; digunakan untuk mendapatkan level di atas current level. Fungsi ini hampir sama dengan fungsi &lt;b&gt;ParentMember&lt;/b&gt;. Perbedaannya adalah ParentMember untuk mendapatkan member 1 level di atas current member pada suatu hierarchy sedang kan Ancestor bisa mendapatkan tidak hanya 1 level tetapi bisa 2,3/x level diatas current member. Pada contoh di atas saya menggunakan ancestor untuk mendapatkan member di level quarter kemudian dengan fungsi &lt;b&gt;PrevMember&lt;/b&gt; saya mendapatkan quarter sebelumnya.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Cousin&lt;/b&gt; digunakan untuk mendapatkan member yang satu level dengan current member tetapi dengan parent yang berbeda. Jadi pada contoh diatas setelah saya mendapatkan quarter sebelumnya dengan menggunakan Ancestor saya menggunakan fungsi Cousin untuk mendapatkan member yang satu level dengan current member tetapi dengan parent kuarter sebelumnya.&lt;/p&gt;&lt;img src="http://sqlserver-indo.net/aggbug.aspx?PostID=129" width="1" height="1"&gt;</description><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/MDX/default.aspx">MDX</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/Cousin/default.aspx">Cousin</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/PeriodsToDate/default.aspx">PeriodsToDate</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/Ancestor/default.aspx">Ancestor</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/Aggregate/default.aspx">Aggregate</category></item><item><title>SSRS - Next month expression</title><link>http://sqlserver-indo.net/blogs/cahyo/archive/2008/12/17/ssrs-next-month-expression.aspx</link><pubDate>Tue, 16 Dec 2008 10:47:00 GMT</pubDate><guid isPermaLink="false">3a6a675a-da36-4e91-95d9-8d13c1c22109:128</guid><dc:creator>cahyo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlserver-indo.net/blogs/cahyo/rsscomments.aspx?PostID=128</wfw:commentRss><comments>http://sqlserver-indo.net/blogs/cahyo/archive/2008/12/17/ssrs-next-month-expression.aspx#comments</comments><description>&lt;p&gt;Pas lagi bikin report untuk project saya dihadapkan pada suatu kasus dimana terdapat label yang mencetak bulan selanjutnya dari bulan report yang diinputkan pada parameter.&lt;/p&gt;&lt;p&gt;Mungkin kita semua pernah mengalami kasus serupa pada SQL dan memang bukan hal yang sulit untuk mendapatkan next month. Begitu juga dengan expression di SSRS, untuk mendapatkan next month adalah hal yang relatif mudah. Berikut akan kita lihat perbedaan sintaks untuk mendapatkan next month dengan menggunakan SQL dan expression di SSRS.&lt;/p&gt;&lt;p&gt;&amp;nbsp;SQL Version:&lt;/p&gt;&lt;p&gt;&lt;i&gt;DECLARE @pDate datetime&lt;br /&gt;SET @pDate=&amp;#39;20081201&amp;#39;&lt;br /&gt;&lt;b&gt;SELECT datename(month,dateadd(month,1,@pdate))&lt;/b&gt;&lt;/i&gt; &lt;/p&gt;&lt;p&gt;Expression(SSRS) Version:&lt;/p&gt;&lt;p&gt;&lt;b&gt;=MonthName(dateadd(&amp;quot;M&amp;quot;,1,Parameters!pDate.Value).Month)&lt;/b&gt; &lt;br /&gt;&lt;/p&gt;&lt;img src="http://sqlserver-indo.net/aggbug.aspx?PostID=128" width="1" height="1"&gt;</description><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/SSRS/default.aspx">SSRS</category></item><item><title>SSAS - Implementasi ValueType pada DimAccount</title><link>http://sqlserver-indo.net/blogs/cahyo/archive/2008/11/05/ssas-implementasi-valuetype-pada-dimaccount.aspx</link><pubDate>Tue, 04 Nov 2008 10:10:00 GMT</pubDate><guid isPermaLink="false">3a6a675a-da36-4e91-95d9-8d13c1c22109:87</guid><dc:creator>cahyo</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlserver-indo.net/blogs/cahyo/rsscomments.aspx?PostID=87</wfw:commentRss><comments>http://sqlserver-indo.net/blogs/cahyo/archive/2008/11/05/ssas-implementasi-valuetype-pada-dimaccount.aspx#comments</comments><description>&lt;p&gt;Coba anda perhatikan Kolom-kolom DimAccount dari AdventureWorksDW berikut:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [AccountKey] [int] IDENTITY(1,1) NOT NULL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ParentAccountKey] [int] NULL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [AccountCodeAlternateKey] [int] NULL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ParentAccountCodeAlternateKey] [int] NULL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [AccountDescription] [nvarchar](50) NULL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [AccountType] [nvarchar](50) NULL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Operator] [nvarchar](50) NULL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [CustomMembers] [nvarchar](300) NULL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;b&gt;ValueType&lt;/b&gt;] [nvarchar](50) NULL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [CustomMemberOptions] [nvarchar](200) NULL,&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Disana terdapat kolom valuetype yang menurut persepsi saya :D digunakan untuk menentukan format value pada suatu account. &lt;/p&gt;&lt;p&gt;Sudah beberapa minggu saya googling untuk&amp;nbsp; mencari contoh implementasi/penggunaan kolom ini pada SSAS dan sialnya gak ketemu-ketemu :(. Alhamdullilah karena petunjuk dari yg di atas akhirnya saya menemukan sendiri cara menggunakannya :)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;Masalahnya adalah dimensi account ini punya 3 macam value type dengan 3 format yang berbeda:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Currency (&amp;quot;#,#.00&amp;quot;)&lt;/li&gt;&lt;li&gt;Unit (&amp;quot;#&amp;quot;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Percent (&amp;quot;Percent&amp;quot;)&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Jadi ada account yang sifat datanya uang,unit dan percent. Jika kita tidak melakukan sesuatu untuk value type di SSAS pastilah ketika dibrowse datanya maka yang muncul adalah format sesuai dengan measure account tersebut.Jika format measurenya &amp;quot;Currency&amp;quot; ya semua account munculnya berformat &amp;quot;Currency&amp;quot;.&lt;br /&gt;Tentunya hal ini akan fatal untuk user karena jika melihat data percent akan muncul nilai nol koma sekian dan tidak ada tanda percent.&lt;/p&gt;&lt;p&gt;Untuk itulah kita memerlukan sedikit :) script untuk mengimplementasikan kolom value type ini&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Berikut adalah langkah2 untuk peimplementasiannya:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;pastikan anda sudah menambahkan atribut value type pada DimAccount.dim pada solusi SSAS dan set property AttributeHierarchyVisible ke false supaya tidak kelihatan&lt;/li&gt;&lt;li&gt;kita set properti visible dari measure yang akan diformat ke false. misal nama measurenya [measure].[real ori]&lt;/li&gt;&lt;li&gt;membuat calculated measure pada cube. karena nama measure asli [measure].[real ori] kita bisa memberi nama calculated measure ini [measure].[real]. berikut script calculated measurenya:&lt;/li&gt;&lt;/ol&gt;CREATE MEMBER CURRENTCUBE.[MEASURES].[real]&lt;br /&gt;&amp;nbsp;AS [measure].[real ori], &lt;br /&gt;FORMAT_STRING = case &lt;br /&gt;when [Account Operating].[Account Operating].Properties( &amp;quot;Value Type&amp;quot; )=&amp;quot;Percent&amp;quot; then &amp;quot;Percent&amp;quot;&lt;br /&gt;when [Account Operating].[Account Operating].Properties( &amp;quot;Value Type&amp;quot; )=&amp;quot;Unit&amp;quot; then &amp;quot;#&amp;quot;&lt;br /&gt;else &amp;quot;#,#.00&amp;quot; --ini tipenya currency&lt;br /&gt;end, &lt;br /&gt;VISIBLE = 1&amp;nbsp; ; &lt;br /&gt;&lt;p&gt;&lt;img alt="" /&gt;&lt;img alt="" /&gt;&lt;img alt="" /&gt;&lt;img alt="" /&gt;&lt;/p&gt;&lt;img src="http://sqlserver-indo.net/aggbug.aspx?PostID=87" width="1" height="1"&gt;</description><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/MDX/default.aspx">MDX</category><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/SSAS/default.aspx">SSAS</category></item><item><title>Reset identity tanpa truncate table</title><link>http://sqlserver-indo.net/blogs/cahyo/archive/2008/09/26/reset-identity-tanpa-truncate-table.aspx</link><pubDate>Thu, 25 Sep 2008 03:32:00 GMT</pubDate><guid isPermaLink="false">3a6a675a-da36-4e91-95d9-8d13c1c22109:55</guid><dc:creator>cahyo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlserver-indo.net/blogs/cahyo/rsscomments.aspx?PostID=55</wfw:commentRss><comments>http://sqlserver-indo.net/blogs/cahyo/archive/2008/09/26/reset-identity-tanpa-truncate-table.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;Pada desain DW biasanya kita menggunakan identity untuk PK suatu dimensi. Untuk beberapa tabel dimensi yang load datanya dilakukan secara initial load, kita akan men-truncate table tersebut supaya ketika kita insert datanya lagi nilai key kembali ke nilai awal karena jika kita menggunakan perintah delete, ketika kita memasukkan data maka nilai key akan bertambah sesuai nilai key yg terakhir walaupun data sudah dihapus. &lt;/p&gt;&lt;p&gt;Permasalahan yang terjadi adalah kita tidak akan bisa menggunakan perintah truncate untuk tabel yang kita tambahkan contraint foreign key. Untuk mengatasi masalah ini nilai identity bisa direset menggunakan DBCC. Sehingga untuk menggantikan perintah truncate pada tabel yang mempunyai foreign key kita bisa menggunakan perintah-perintah berikut:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Delete from DimTable&lt;/b&gt;&lt;/p&gt;&lt;p&gt;pertama kita hapus dulu isi tabel baru setelah itu kita reset identitynya dengan menggunakan dbcc seperti berikut.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;DBCC CHECKIDENT (&amp;#39;DB.dbo.DimTable&amp;#39;,reseed,1)&lt;/b&gt;&lt;/p&gt;&lt;p&gt;1 pada perintah di atas berarti kita mereset nilai awal identity ke 1.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://sqlserver-indo.net/aggbug.aspx?PostID=55" width="1" height="1"&gt;</description><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/DBCC/default.aspx">DBCC</category></item><item><title>Mencari hari ke - n dalam suatu bulan</title><link>http://sqlserver-indo.net/blogs/cahyo/archive/2008/07/22/mencari-hari-ke-n-dalam-suatu-bulan.aspx</link><pubDate>Mon, 21 Jul 2008 11:47:00 GMT</pubDate><guid isPermaLink="false">3a6a675a-da36-4e91-95d9-8d13c1c22109:36</guid><dc:creator>cahyo</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlserver-indo.net/blogs/cahyo/rsscomments.aspx?PostID=36</wfw:commentRss><comments>http://sqlserver-indo.net/blogs/cahyo/archive/2008/07/22/mencari-hari-ke-n-dalam-suatu-bulan.aspx#comments</comments><description>&lt;p&gt;Menjawab pertanyaan di milis sekaligus untuk meramaikan sqlserver-indo.org kita ^_^&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Pertanyaan dari hendra.tala.a@gmail.com:&amp;nbsp; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;bagaimana caranya untuk mendapatkan bahwa tanggal 14-07-2008 adalah &lt;b&gt;senin ke 2 &lt;/b&gt;dalam bulan ini, meskipun 14-07-2008 berada pada minggu ke 3&lt;br /&gt;&lt;br /&gt;minta tolong pakar sql&lt;br /&gt;&lt;br /&gt;terima kasih &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Jawaban :&lt;/p&gt;&lt;p&gt;declare @date datetime,@dayname varchar(10),@datenumber int,@daycount int&lt;br /&gt;&lt;br /&gt;set @date=&amp;#39;20080714&amp;#39;&lt;br /&gt;set @dayname=(select datename(dw,@date))&lt;br /&gt;set @datenumber=(select datepart(d,@date))&lt;br /&gt;set @daycount=0&lt;br /&gt;&lt;br /&gt;while (@datenumber&amp;gt;0)&lt;br /&gt;begin&lt;br /&gt;set @datenumber=@datenumber-7&lt;br /&gt;set @daycount=@daycount+1&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;select case &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; when @dayname=&amp;#39;Monday&amp;#39; then &amp;#39;Senin&amp;#39;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; when @dayname=&amp;#39;Tuesday&amp;#39; then &amp;#39;Selasa&amp;#39;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; when @dayname=&amp;#39;Wednesday&amp;#39; then &amp;#39;Rabu&amp;#39;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; when @dayname=&amp;#39;Thursday&amp;#39; then &amp;#39;Kamis&amp;#39;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; when @dayname=&amp;#39;Friday&amp;#39; then &amp;#39;Jumat&amp;#39;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; when @dayname=&amp;#39;Saturday&amp;#39; then &amp;#39;Sabtu&amp;#39;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; when @dayname=&amp;#39;Sunday&amp;#39; then &amp;#39;Minggu&amp;#39;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; +&amp;#39; ke &amp;#39;+cast(@daycount as char) &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;Quiz: Algoritma di atas sebenarnya sangat sederhana. Tanpa menggunakan looping pun bisa diselesaikan. Kuncinya ada pada angka 7, penjumlahan, pengurangan dan pembagian. Ada yang mau menjawab?&lt;/p&gt;&lt;p&gt;&amp;nbsp;Jawaban Quiz:&lt;/p&gt;&lt;p&gt;DECLARE @Date datetime SET @Date = &amp;#39;2008-02-09&amp;#39;&lt;br /&gt;&lt;br /&gt;SELECT datename(dw,@date)+&amp;#39; ke &amp;#39;+cast((DATEPART(day,@Date)-1)/7+1 AS char) &lt;br /&gt;&lt;/p&gt;&lt;img src="http://sqlserver-indo.net/aggbug.aspx?PostID=36" width="1" height="1"&gt;</description><category domain="http://sqlserver-indo.net/blogs/cahyo/archive/tags/date+manipulations/default.aspx">date manipulations</category></item></channel></rss>