Reyza

tenang, senang, sederhana
See also: Other Geeks@INDC

Public

October 2009 - Posts

Astoria : Another way to get SP result with ‘fake’ Data Class

Pada posting sebelumnya tentang Astoria di sini, saya menulis :

“Dari kasus di atas, kebetulan keluaran dari SP tersebut dapat diwakili oleh class model dari tabel Case. Bagamana kalau keluaran SP tidak dapat diwakili oleh tabel yang ada? Untuk jawabannya akan ditulis pada blog berikutnya, ketika saya bertemu dengan masalah tersebut :)”.

Pada posting ini akan dicatat cara menampung keluaran dari SP yang tidak terwakilkan oleh tabel (sebagai data class). Sebagai contoh dimiliki SP seperti berikut ini.

USE [MalaysiaIntegraDB]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER procedure [dbo].[GetStatisticJob]
AS

BEGIN
SELECT j.IDNName AS Type, Count(*) AS Value FROM Job j, WNI w
WHERE w.Negara='IDN' AND w.JobID=j.JobID
GROUP BY j.IDNName;
END

Selajutnya tinggal ‘menarik’ SP ini ke Method Pane pada area design dari LINQ to SQL. Pada SP di atas akan didapat hasil seperti berikut.

image

Untuk menampung nilai dari data tersebut maka pada area design pada LINQ to SQL dapat kita tambahkan sebuah Data Class dengan cara klik kanan pada area design tersebut, pilih Add dan kemudian pilih Class.

image

Pada Data Class tersebut tambahkan property-property dengan nama Type dan Value, seperti nama ‘field’ dari data yang dikeluarkan oleh SP di atas.

image

Perlu diperhatikan penggunaan tipe data dari masing-masing property yang telah dibuat.

image

Sebagai contoh, pada gambar di atas dapat dilihat property Value mempunyai type int(System.Int32). 

Selanjutnya klik GetStatisticJob pada Method Pane, ubah nilai pada Return Type menjadi Statistic yang merupakan nama Data Class yang telah dibuat di atas.

image

Selanjutkan tinggal tambahkan file dari template ADO.NET Data Service dan ‘didalamnya’ bisa kita tambahkan method untuk mengakses method GetStatisticJob dengan cara seperti berikut.

[WebGet]
public IList<Statistic> GetStatisticJob()
{
DataClassesDataContext db = new DataClassesDataContext();
var query = db.GetStatisticJob();
IList<Statistic> statistic = query.ToList<Statistic>();

return statistic;
}

Kemudian kita bisa membuat web site baru untuk mencoba service ini. Berikut contoh cara menampilkan data service GetStatisticJob pada GridView.

// url service
string serverUrl = "http://localhost:1469/MSChart.Service/WebDataService.svc";

DataClassesDataContext ctx = new DataClassesDataContext(new Uri(serverUrl, UriKind.Absolute));
ctx.MergeOption = MergeOption.AppendOnly;

IEnumerable<Statistic> data = ctx.Execute<Statistic>(new Uri("GetStatisticJob", UriKind.Relative));

GridView1.DataSource = data;
GridView1.DataBind();

Dan dipastikan pesan error “Avoid “The closed type *** does not have a corresponding element settable property” error message” tidak akan ditemui.

Share this post: | | | |
Posted: Oct 29 2009, 09:18 AM by reyza | with no comments
Filed under: ,
Bakar…Bakar..Bakar…

Ah pasti bosen dengan acara tv yang diisi oleh reality show yang penuh dengan skenario.

Saat masih hangatnya acara kontes nyanyi ala AFI dan Indonensia Idol, sebagai sampingannya ada acara reality show mengenai rekaman kehidupan mereka disela-sela kompetisi. kemudian akhirnya diikuti acara-acara reality show yg makin tida bermutu...ada termehek2, ada relegi sampai take me out (... kok gw hapal nama acara2 tersebut ya??).


Apa tidak ada ide lain untuk membuat acara reality show yg bisa membangun semangat, yang bisa memberi inspirasi tanpa skenario, tanpa kebohongan dan tanpa dibuat2. Denger-denger (tm), nanti ada kerjasama antara pihak salah tv di Indonesia untuk meliput anak-anak Imagine Cup yang berjuang dikancah internasional. Kalau ini bisa jadi dibuat sebagai acara reality show, yang dapat memperlihatkan bagaimana anak-anak tersebut berjuang demi nama baik Indonesia...weeeew...alangkah menariknya. alangkah akan membuat penontonnya akan ikut terbakar melihat anak-anak muda berjuang...apalagi kalau sampai perjuangan mereka membuahkan hasil. api akan makin besar membakar para pemuda lain yang menontonnya.

image

Begitu juga para pejuang-pejuang muda lainnya, pejuang olimpiade fisika. mestinya ada stasiun tv yang mendampingi mereka berjuang, jadikan reality show, perlihatkan susahnya mereka berjuang, perlihatkan bagimana mereka memijit kepala yang pusing, perlihatkan tawa dan raut muka bangga mereka saat medali ada digenggaman tangan mereka.

fisika

Apa di Indonesia ini tidak ada produser waras yang mengangkat mereka untuk acara reality show yang bermutu?

 

*note : cuma lagi iseng menulis sesuatu yang tidak penting :)

Share this post: | | | |
MS Chart, Binding data programmatically

Sebelumnya pernah bercerita tentang MS Chart di sana dan sini, sekarang mencoba lagi menggunakan MS Chart karena kebutuhan. Disini akan dicontohkan bagaimana menyuntik data ke control chart secara pemrograman.

Seperti biasa terlebih dahulu kita dapat menambahkan control MS Chart pada halaman ASPX.

<asp:Chart ID="Chart_Main" runat="server">
<Series>
<asp:Series Name="Series1">
</asp:Series>
</Series>
<ChartAreas>
<asp:ChartArea Name="ChartArea1">
</asp:ChartArea>
</ChartAreas>
</asp:Chart>

Pada kontrol di atas dapat dilihat di dalam tag asp:Chart terdapat dua bagian (default) yaitu Series dan ChartAreas. 

{ChartAreas}

Pada bagian ini kita dapat memberikan hal-hal untuk mempercantik tampilan chart agar sedap dipandang mata. Sebagai contoh di dalam bagian ini kita dapat memberikan ‘atribut’ seperti berikut.

<ChartAreas>
<asp:ChartArea Name="ChartArea1">
<Area3DStyle LightStyle="Realistic" Enable3D="true" IsClustered="true" />
</asp:ChartArea>
</ChartAreas>

Bisa dilihat pada contoh di atas, dengan menambahkan kode seperti pada baris ke-3 maka chat akan berbentuk 3D. Masih banyak hal-hal lain yang bisa ditambahkan pada bagian ChartAreas ini. Sebagai contoh yang lain pada bagian ini dapat ditambahkan atribut-atribut untuk memberikan style pada kedua axis pada chart seperti berikut ini.

<ChartAreas>
<asp:ChartArea Name="ChartArea1">
<Area3DStyle LightStyle="Realistic" Enable3D="true" IsClustered="true" />
<AxisY linecolor="64, 64, 64, 64" Title="Value" TitleFont="Verdana, 10pt, style=Bold">
<LabelStyle font="Verdana, 8.25pt, style=Bold" />
<MajorGrid linecolor="64, 64, 64, 64" />
</AxisY>
<AxisX linecolor="64, 64, 64, 64" Title="Occupation" TitleFont="Verdana, 10pt, style=Bold">
<LabelStyle font="Verdana, 8.25pt, style=Bold" />
<MajorGrid linecolor="64, 64, 64, 64" />
</AxisX>
</asp:ChartArea>
</ChartAreas>

{Series}

Bagian ini dapat dikatakan sebagai area tempat menampung atau menambahkan data, selain itu kita juga dapat menentukan bagaimana data akan ditampilkan.

<Series>
<asp:Series Name="Series1" ChartType="Column">
</asp:Series>
</Series>

Dapat dilihat pada contoh di atas data akan ditampilkan seperti nilai pada atribut ChartType. Untuk menambahkan data secara manual pada bagian Series dapat dilihat di sini.

{Menyuntik Data pada Chart}

Berikut ini akan diberikan contoh untuk menyuntik data pada chart.

   1: using System;
   2:  
   3: public partial class Test_Default : System.Web.UI.Page
   4: {
   5:     protected void Page_Load(object sender, EventArgs e)
   6:     {
   7:         Chart_Main_Databind();
   8:     }
   9:  
  10:     protected void Chart_Main_Databind()
  11:     {
  12:         string seriesName = "Pertama";
  13:         Random nilaiData = new Random();
  14:  
  15:         Chart_Main.Series.Clear();
  16:         Chart_Main.Series.Add(seriesName);
  17:  
  18:         for (int i = 1; i <= 5; i++)
  19:         {
  20:             string namaData = "Data " + i.ToString();
  21:  
  22:             Chart_Main.Series[seriesName].Points.AddXY(namaData, nilaiData.Next(100));
  23:         }
  24:     }
  25: }

Dan hasilnya dapat dilihat pada gambar berikut ini.

image

Pada contoh di atas, kita dapat memperhatikan baris ke 16, dimana sebelum data diberikan terlebih dahulu adalah menambahkan ‘Series’ yang dapat dikatakan sebagai group dari data. Setelah itu pada baris ke 22 dapat dilihat bagaimana datamulai disuntikkan. Dan dapat dilihat hasilnya seperti pada gambar.  pada axis X berisi nilai Data 1, Data 2 … Data 5.  Sedangkan pada axis Y dapat dilihat nilai-nilai dari bilangan random.

Dari contoh di atas, diharapkan kita mempunyai bayangan apabila ingin memasukkan data dari database dengan cara yang sedikit membuat peluh keluar (pada posting berikutnya akan diperlihatkan cara menyuntik data dari datatable atau yang lainnya).

Contoh berikutnya adalah apabila terdapat lebih dari satu Series.

   1: using System;
   2:  
   3: public partial class Test_Default : System.Web.UI.Page
   4: {
   5:     protected void Page_Load(object sender, EventArgs e)
   6:     {
   7:         Chart_Main_Databind();
   8:     }
   9:  
  10:     protected void Chart_Main_Databind()
  11:     {
  12:         Random nilaiData = new Random();
  13:  
  14:         Chart_Main.Series.Clear();
  15:  
  16:  
  17:         for (int i = 1; i <= 3; i++)
  18:         {
  19:             string seriesName = "Seri " + i.ToString();
  20:             Chart_Main.Series.Add(seriesName);
  21:  
  22:             for (int j = 1; j <= 5; j++)
  23:             {
  24:                 string namaData = "Data " + j.ToString();
  25:  
  26:                 Chart_Main.Series[seriesName].Points.AddXY(namaData, nilaiData.Next(100));
  27:             }
  28:         }
  29:     }
  30: }

Dan hasilnya dapat dilihat seperti gambar berikut ini :

image

Pada contoh di atas dapat dilihat terdapat dua loop, loop untuk membuat Series kemudian di dalam loop tersebut terdapat loop untuk mengisikan data pada Series. Sehingga dapat kita lihat hasilnya seperti pada gambar di atas. Series pertama berwarna biru, series kedua berwarna orange sedangkan series terakhir berwarna merah.

{Legend}

Pada gambar di atas mungkin orang lain kesulitan untuk mengetahui arti dari setiap warna. Kita dapat memberikan keterangan dari setiap warna tersebut dengan menambahkan Legend sebagai keterangan. Untuk menambahkan Legend cukup dengan menambahkan bagian Legend seperti pada contoh berikut.

<asp:Chart ID="Chart_Main" Width="500" runat="server">
    . . .
    <Legends>
        <asp:Legend Name="Legend1"></asp:Legend>
    </Legends>
</asp:Chart>

Dan hasilnya akan dilihat pada gambar di bawah ini.

image

Sekian sekilas tentang MS Chart, saatnya untuk terlelap.

Share this post: | | | |
Posted: Oct 24 2009, 12:39 AM by reyza | with no comments
Filed under: ,
Activity Indicators

Ditulis supaya ingat dan mudah mencari bila nanti diperlukan.

Website berisi gambar-gambar indicator yang dapat digunakan di dalam control UpdateProgress.

http://mentalized.net/activity-indicators/

image

Share this post: | | | |
Avoid “The closed type *** does not have a corresponding element settable property” error message

Kembali mencoba mencatat apa yang telah terjadi selama bersama Astoria.

Bagi developer yang menggunakan stored procedure pada LINQ to SQL dan selanjutnya akan menggunakan data context sebagai ‘sumber’ yang nanti ‘akan digunakan’ oleh Astoria maka kemungkinan akan bertemu dengan pesan kesalahan di atas.

{Mengeluarkan pesan error}

Pada bagian ini akan disebutkan langkah-langkah untuk membuat pesan error di atas keluar dan mencoba mencari tahu kenapa pesan error itu keluar.

Pertama, buat file DBML kemudian tambahkan stored procedure yang ingin digunakan, seperti yang terlihat di gambar di bawah ini.

image

Apa yang terjadi saat SP tersebut ditambahkan pada diagram DBML?

image

Seperti dilihat digambar, secara otomatis akan dibuatkan class yang akan menampung hasil dari SP tersebut. Field-field dari class tersebut adalah sesuai dengan field-field dari hasil keluaran SP.

Selanjutnya adalah menggunakan data context ini untuk digunakan oleh Astoria (ADO.NET Data Service), sekaligus menambahkan satu method untuk menampilkan hasil dari SP yang telah dibuat. Berikut adalah contoh dari kode pada Astoria.

   1: using System;
   2: using System.Data.Services;
   3: using System.Collections.Generic;
   4: using System.Linq;
   5: using System.ServiceModel.Web;
   6:  
   7: [System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
   8: public class KonsulDataService : DataService< KonsulDataClassesDataContext >
   9: {
  10:     // This method is called only once to initialize service-wide policies.
  11:     public static void InitializeService(IDataServiceConfiguration config)
  12:     {
  13:         // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
  14:         // Examples:
  15:         config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
  16:         config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
  17:         config.UseVerboseErrors = true;
  18:     }
  19:  
  20:     [WebGet]
  21:     public IList<GetCasesByWNIIDResult> GetCasesByWNIID(string id)
  22:     {
  23:         long wniId = Convert.ToInt64(id);
  24:         KonsulDataClassesDataContext db = new KonsulDataClassesDataContext();
  25:         var query = db.GetCasesByWNIID(wniId);
  26:         IList<GetCasesByWNIIDResult> caseList = query.ToList<GetCasesByWNIIDResult>();
  27:  
  28:         return caseList;
  29:     }
  30: }

Dari baris ke 20 dapat dilihat terdapat satu method baru untuk menjalankan SP dan ‘menyimpan’ hasilnya pada suatu List. Dengan memanggil url seperti (contoh) berikut ini pada address bar web browser maka akan ditampilkan data dari output SP tersebut seperti berikut ini.

   1: <?xml version="1.0" encoding="utf-8" standalone="yes" ?> 
   2: - <GetCasesByWNIID xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices">
   3: - <element p2:type="GetCasesByWNIIDResult" xmlns:p2="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
   4:   <CasesID>SL5G080807170001</CasesID> 
   5:   <CasesTypeID>BIRTH</CasesTypeID> 
   6:   <ShortDescription>Aplikasi Akta/Keterangan Kelahiran</ShortDescription> 
   7:   <LocationID p2:type="Edm.Int16">1</LocationID> 
   8:   <CaseDate p2:type="Edm.DateTime">2008-08-07T17:26:39.03</CaseDate> 
   9:   <WNICases p2:type="Edm.Int64">1</WNICases> 
  10:   </element>
  11: - <element p2:type="GetCasesByWNIIDResult" xmlns:p2="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
  12:   <CasesID xml:space="preserve">SL5G80730230002</CasesID> 
  13:   <CasesTypeID>BIRTH</CasesTypeID> 
  14:   <ShortDescription>Aplikasi Akta/Keterangan Kelahiran</ShortDescription> 
  15:   <LocationID p2:type="Edm.Int16">1</LocationID> 
  16:   <CaseDate p2:type="Edm.DateTime">2008-07-30T23:15:00.2</CaseDate> 
  17:   <WNICases p2:type="Edm.Int64">1</WNICases> 
  18:   </element>
  19:   </GetCasesByWNIID>

Dari data di atas, dapat terlihat terdapat dua item data (lebih dari satu). Maka secara logika, seharusnya saya dapat menampilkan data tersebut ke dalam suatu server control seperti GridView.

Untuk mensimulasikan proses menampilkan data dari Astoria pada GridView, dibuatlah solution dengan struktur project seperti pada gambar di bawah ini.

image

Avoid.Web berisi service dari Astoria. Sedangkan AvoidShowData.Web akan memiliki 1 halaman ASPX yang akan menampilkan data pada GridView. Tetapi terlebih dahulu akan ditambahkan service reference pada AvoidShowData.Web yang sumber servicenya adalah dari Avoid.Web (seperti yang terlihat pada gambar di bawah ini).

image

Dan hasilnya dapat dilihat pada gambar berikut ini.

image

Selanjutnya, setelah menambahkan control GridView pada file ASPX yang ada pada AvoidShowData.Web. Kemudian dapat ditambahkan beberapa baris kode untuk melakukan ‘koneksi’ ke Astoria, melakukan query untuk mengambil data dan mem-bind data tersebut ke GridView. Dan berikut adalah contoh isi dari file ASPX.CS.

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Web;
   5: using System.Web.UI;
   6: using System.Web.UI.WebControls;
   7:  
   8: using System.Data.Services.Client;
   9:  
  10: using KonsulService;
  11: using KonsulService.Konsul.Service;
  12:  
  13: public partial class _Default : System.Web.UI.Page 
  14: {
  15:     protected void Page_Load(object sender, EventArgs e)
  16:     {
  17:         string serverUrl = "http://localhost:1479/Avoid.Web/KonsulDataService.svc";
  18:         string id = "1";
  19:         KonsulDataClassesDataContext ctx = new KonsulDataClassesDataContext(new Uri(serverUrl, UriKind.Absolute));
  20:         ctx.MergeOption = MergeOption.AppendOnly;
  21:  
  22:         List<GetCasesByWNIIDResult> data = ctx.Execute<GetCasesByWNIIDResult>(new Uri("GetCasesByWNIID?id='" + id + "'", UriKind.Relative)).ToList();
  23:  
  24:         GridView1.DataSource = data;
  25:         GridView1.DataBind();
  26:     }
  27: }

Dapat dilihat pada baris ke 22, hasil dari ‘query’ akan disimpan ke dalam data bertipe List. Dan secara logika tipe data ini dapat digunakan sebagai sumber data GridView. Dan berikut dapat kita lihat hasil halaman ASPX setelah di view di browser.

image

Akhirnya “error yang diharapkan” keluar juga.

{Sebab keluarnya pesan kesalahan}

Dari contoh di atas, dapat dipastikan bahwa yang membuat pesan error ini keluar adalah penggunaan class GetCasesByWNIIDResult yang ada pada gambar kedua (di atas). Dari beberapa sumber hasil pencarian dengan ‘mesin pencarian terpercaya’ menyatakan bahwa class ‘auto generated’ pada film DBML ini mempunyai sifat yang hanya ‘sekali pakai’, dan tidak cocok digunakan sebagai ‘penampung’ data yang terdiri atas lebih dari satu record.

Apabila SP hanya mengeluarkan pasti 1 record saja, maka class di atas dapat digunakan.

** Sebab-sebab lain kenapa class ini tidak bisa menampung lebih dari 1 record masih dalam pencarian. Bila ada yang punya pengalaman dengan ini maka dapat menitipkan pesan pada kolom komentar di bawah ini.

{Solusi awal}

Karena adanya masalah tersebut di atas, ada satu solusi yang saya gunakan. Solusi ini bertujuan untuk mengindari penggunaan class ‘auto-generated’ tersebut di atas dan menggantikannya dengan class dari model tabel yang ada di database.

Sebelumnya kita lirik dulu isi dari SP GetCasesByWNIID di bawah ini.

ALTER procedure [dbo].[GetCasesByWNIID] @WNIID bigint
AS
 
BEGIN
    
    SELECT 
        a.CasesID,
        a.CasesTypeID,
        a.ShortDescription,
        a.LocationID,
        a.CaseDate,
        a.WNICases
    FROM 
        Cases a
    WHERE 
        a.WNICases=@WNIID
    ORDER BY a.CaseDate DESC
END

Terlihat bawah SP ini menggunakan tabel Cases dan menampilkan field-field dari sebagian tabel tersebut. Maka oleh dari itu dapat ditambahkan tabel Cases ke dalam diagram DBML yang sudah ada. Seperti pada gambar di bawah ini.

image

Kemudian klik method representasi dari SP, dan pada area properties, di kolom Return Type dari Auto-generated type menjadi Case (model dari tabel yang baru saja ditambahkan).

image

Langkah selanjutkany mengubah seluruh penggunaan class GetCasesByWNIIDResult menjadi Case. Dan akhirnya ‘hasil query’ dari service Astoria dapat di-bind ke control GridView.

{Pertanyaan}

Dari kasus di atas, kebetulan keluaran dari SP tersebut dapat diwakili oleh class model dari tabel Case. Bagamana kalau keluaran SP tidak dapat diwakili oleh tabel yang ada? Untuk jawabannya akan ditulis pada blog berikutnya, ketika saya bertemu dengan masalah tersebut :)

Share this post: | | | |