How to send email using C# ?

Pertanyaan ini biasanya akan muncul disaat – saat terakhir kita mengerjakan project. UI sudah kelihatan, input sudah berhasil, saat memberikan notifikasi kepada user tentang hal – hal yang berkaitan dengan mereka. Dan email selalu menjadi andalan utama. Ok, kita tidak akan bercerita, kenapa harus email.

Sekarang yang akan kita bahas adalah bagaimana cara mengirimkan email dengan menggunakan C# dan .NET Framework 2.0. Pada awal kemunculannya, library mail ini berada dalam System.Web.Mail. Tapi seiring dengan perkembangannya, kemudian pindah ke System.Net.Mail. So, bagaimana menggunakannya? Berikut kodenya :

croppercapture2

Simple kan ? Cukup simple. Tapi ingat…. This code only work if there is smtp in your local machine. So, how to use SMTP server at another machine/pc. Or maybe we want to use our Google mail as SMTP server…..

Here is the code :

smptmailnetwork

So simple, is it ??. Happy send email using C#

How to modify/update task property at sharepoint ?

How to modify task list property at sharepoint directly using code ? Pertanyaan ini pasti akan banyak ditanyakan oleh para pemula yang baru saja “nyemplung” ke dalam sharepoint development khususnya workflow. Seperti yang kita ketahui, bahwa kita dapat saja menambahkan field properties pada task list. Tapi kemudian yang menjadi masalahnya adalah bagaimana cara assign valuenya ke dalam field / property yang baru saja kita tambahkan tersebut saat workflow berjalan.

Ok, sebelum kita masuk kedalam, perlu kita samakan persepsi mengenai 2 hal, yaitu :

  1. WorlflowProperties, yaitu properties yang dimiliki oleh workflow terkait list / dokumen yang membuat workflow tersebut berjalan ( trigger to activate workflow ).
  2. TaskProperties, yaitu properties yang dimiliki oleh workflow, dimana workflow di attach. Perubahan nilai / value pada taskproperties akan memicu workflow berjalan ( onTaskChanged -> dst ).

Ok, sekarang mari kita mulai. Biasanya saat kita develop sebuah workflow, workflow tersebut akan di attach pada sebuah dokumen di sharepoint. Jika sebuah dokumen di create, akan memicu workflow untuk create sebuah “task”. Nah, pada task yang dicreate oleh workflow ini, kita dapat menambahkan informasi sesuai dengan keinginan kita.

So, bagaimana caranya menambahkan informasi pada properties di task ? Ok, cara yang paling konvensional adalah dengan menggunakan extendedproperties.

   1: taskproperties.ExtendedProperties["myfield"]="mynewvalue";

Tapi apakah cara ini dapat berjalan ? Untuk properties yang ada pada taskform, assign properties seperti ini adalah benar. Tapi jika yang kita update adalah field dari task list, maka cara ini tidak akan berjalan. Buktikan deh… 😀

So, bagaimana cara seharusnya ? Hmm…. sebenarnya cara yang dipergunakan adalah sedikit tricky. Jika kita ketikkan taskproperties. , maka akan muncul beberapa properties yang bisa secara langsung di assign, seperti Assignee, Description, dll. Tapi tidak dengan field yang ditambahkan secara langsung pada sharepoint. Ah, kelamaan nih, caranya gimana ?????????. Sabar donk mas…. pelan – pelan….

Ok, karena kita tidak dapat update field pada task list secara langsung, maka kita gunakan trick. Caranya, gunakan properties “Description” sebagai wadah untuk transfer. Caranya, perhatikan kode berikut :

   1: taskProperties.Description = string.Format("{0};{1};{2}",
   2:                 workflowProperties.ListId, workflowProperties.Item.UniqueId,"Test Value");

Kode diatas biasanya terdapat pada prosedur OnTaskCreated, kita gunakan untuk assign value ke properties Description pada task. Kemudian buatlah sebuah handler yang akan kita attach pada list. Perhatikan kode berikut :

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Text;
   4: using System.Web;
   5: using Microsoft.SharePoint;
   6:  
   7: namespace Workflow.TaskHandler
   8: {
   9:     public class TaskEventHandler : SPItemEventReceiver
  10:     {
  11:         public override void ItemAdded(SPItemEventProperties properties)
  12:         {
  13:             base.ItemAdded(properties);
  14:  
  15:             if (properties.ListItem["Description"] != null &&
  16:                 !string.IsNullOrEmpty(properties.ListItem["Description"].ToString()))
  17:             {
  18:                 string[] descriptionItem = properties.ListItem["Description"].ToString().Split(new char[] {';'});
  19:                 if (descriptionItem.Length > 2)
  20:                 {
  21:                     using (SPWeb web = properties.OpenWeb())
  22:                     {
  23:                         bool webAllowUnsafeUpdates = web.AllowUnsafeUpdates;
  24:                         web.AllowUnsafeUpdates = true;
  25:  
  26:                         if (!descriptionItem[2].Equals(string.Empty))
  27:                         {
  28:                             properties.ListItem["Custom Field"] = descriptionItem[2];
  29:                             properties.ListItem.SystemUpdate();
  30:                         }
  31:                         web.AllowUnsafeUpdates = webAllowUnsafeUpdates;
  32:                     }
  33:                 }
  34:             }
  35:         }
  36:     }
  37: }

Kode diatas adalah sebuah handler yang kita modifikasi dari handler asli dari sharepoint. Kegunaannya adalah untuk mengambil value dari field “Description”, dan assign ke field “Custom Field” yang sudah kita buat pada task. Apakah sudah selesai ? Hm… pada dasarnya sudah. Hanya butuh beberapa langkah kecil, yaitu assign handler yang sudah kita buat ke task, agar pada saat task di create/ add di list, handler ini secara otomatis akan berjalan. Tapi benarkah sudah selesai ??.

Tunggu dulu. hehehe. Ada hal yang harus dipahami, yaitu apabila kita mengupdate properties dari sebuah task di task list yang didalamnya attach sebuah workflow, secara otomatis workflow akan execute OnTaskChanged. Hal ini tidak bisa dibiarkan, karena pada dasarnya kita hanya ingin update properties dari task, tanpa ingin workflow jalan ( kecuali memang diinginkan demikian. Tapi dalam kasus yang saya hadapi, tidak ). So, bagaimana solusinya ??  Ternyata cukup mudah. SPItemEventReceiver ternyata memiliki 2 fungsi yang bisa dipergunakan secara langsung, yaitu : DisabledEventFiring() dan EnableEventFiring(). So, setelah kita tambahkan, kode diatas seharusnya berubah menjadi berikut ini :

   1: base.DisableEventFiring();
   2: properties.ListItem["Default Approver"] = string.Empty;
   3: properties.ListItem.SystemUpdate();
   4: base.EnableEventFiring();

Dengan tambahan 2 baris perintah diatas, dijamin, perubahan pada task properties, selama masih dalam scope yang diinginkan oleh code kita, tidak akan membuat workflow berjalan.

Semoga berguna.

Sharepoint Series : How to Create Data Connection Library

Artikel kali ini akan menjelaskan langkah – langkah membuat data connection library di sharepoint server. Diharapkan, setelah membaca artikel ini, dapat mempermudah dalam proses development form InfoPath, terutama yang banyak menggunakan koneksi kedatabase. Ok, mari kita mulai… 😀

Step 1 :

Buatlah sebuah Library dari menu Site Action –> Create –> Data Connection Library. Isikan semua property yang dibutuhkan. [ Name and Description, Navigation -> pilih No, Version History -> Pilih No ]

Step 2 :

Buatlah sebuah Data Connection Definition dengan format XML, bisa menggunakan sample berikut :

   1: <?xml version="1.0" encoding="UTF-8"?>
   2: <?MicrosoftWindowsSharePointServices ContentTypeID="0x010100B4CBD48E029A4ad8B62CB0E41868F2B0"?>
   3: <udc:DataSource MajorVersion="2" MinorVersion="0" xmlns:udc="http://schemas.microsoft.com/office/infopath/2006/udc">
   4:     <udc:Name>MyDataDefinition</udc:Name>
   5:     <udc:Description>Format: UDC V2; Connection Type: Database; Purpose: ReadOnly;</udc:Description>
   6:     <udc:Type MajorVersion="2" MinorVersion="0" Type="Database">
   7:         <udc:SubType MajorVersion="0" MinorVersion="0" Type=""/>
   8:     </udc:Type>
   9:     <udc:ConnectionInfo Purpose="ReadOnly" AltDataSource="">
  10:         <udc:WsdlUrl/>
  11:         <udc:SelectCommand>
  12:             <udc:ListId/>
  13:             <udc:WebUrl/>
  14:             <udc:ConnectionString>
  15:                 Provider=SQLOLEDB.1;
  16:                 Initial Catalog=MyTestDB;Data Source=myserver;
  17:                 User ID=myuser;Password=mypassword;Persist Security Info=True;Use Procedure for Prepare=1;Auto Translate=True;
  18:                 Packet Size=4096;Workstation ID=mypc;Use Encryption for Data=False;Tag with column collation when possible=False</udc:ConnectionString>
  19:             <udc:ServiceUrl UseFormsServiceProxy="false"/>
  20:             <udc:SoapAction/>
  21:             <udc:Query>
  22:                 select * from mytable where id=null
  23:             </udc:Query>
  24:         </udc:SelectCommand>
  25:         <udc:UpdateCommand>
  26:             <udc:ServiceUrl UseFormsServiceProxy="false"/>
  27:             <udc:SoapAction/>
  28:             <udc:Submit/>
  29:             <udc:FileName>Specify a filename or formula</udc:FileName>
  30:             <udc:FolderName AllowOverwrite=""/>
  31:         </udc:UpdateCommand>
  32:         <!--udc:Authentication><udc:SSO AppId='' CredentialType='' /></udc:Authentication-->
  33:     </udc:ConnectionInfo>
  34: </udc:DataSource>

Save menjadi file dengan extention udcx. Bagian mana saja yang harus anda modifikasi ?

  • <udc:Name></udc:Name>, ini untuk mendefinisikan nama Connection Library kita. Buatlah berbeda dgn yang lainnya
  • <udc:ConnectionString></udc:ConnectionString>, ini bagian dimana kita mendeklarasikan kemana koneksi akan di lakukan. pastikan semua informasi yang dimasukkan benar ( username, password ) agar bisa konek dengan database yang diinginkan. Bagi yang biasa main-main dengan Connection String di .NET, bentuk ini adalah bentuk yang biasa.
  • <udc:Query></udc:Query>, pada bagian ini, dispesifikasikan data yang ingin di ambil. Ini adalah bentuk SQL statement biasa, yang lazim digunakan. Bagaimana jika kita ingin dinamik ? hehehe,, tunggu saja bagian berikutnya.

Step 3:

Langkah selanjutnya adalah upload file udcx yg telah kita buat tadi, ke library yang kita buat pada langkah 1.  Yang harus diperhatikan adalah, file yang kita upload tidak bisa langsung digunakan, karena statusnya masih pending. So, you must approved it first. Letakkan mouse pointer pada nama file yang baru saja di upload, klik edit -> pilih approve/reject. Akan muncul form approval, pilih approve, kemudian pilih ok. Done. Connection Library kita sudah siap untuk digunakan. Congratulation……

Ok, itu saja dulu. Pada bagian selanjutnya, akan dibahas bagaimana menggunakannya pada InfoPath Form. Selamat Belajar

There is an error in XML document (4, 2), What is it ?

Pertama kali melihat error ini, jadi pusing. Wah, error apa lagi ini. Usut punya usut, ternyata ini adalah error yang ditimbulkan ketika kita mengambil nilai dari sebuah XML file yang di create menjadi object, tetapi tidak ditemukan. Salah satu cara yang saya gunakan ( dapat info nya dari net ), adalah sebagai berikut  ( step lengkap dari create object sampai ambil value ):

–> Initialize Object :

   1: private void LoadInitialInfoItem()
   2: {
   3:     try
   4:     {
   5:         InitForm request = (InitForm)XmlDeserialize(typeof(InitForm), workflowProperties.Item.File);
   6:         userName = request.username;
   7:         total = request.expense;
   8:         WriteLogFilesInfo("LoadInitialInfoItem", request.username);
   9:         WriteLogFilesInfo("LoadInitialInfoItem", request.expense.ToString());
  10:     }
  11:     catch (Exception ex)
  12:     {
  13:         WriteLogFiles("LoadInitialInfoItem", ex.InnerException.ToString());
  14:         userName = "none";
  15:         total = 0;
  16:     }
  17: }

–> Deserialize Object :

   1: public object XmlDeserialize(Type type, SPFile file)
   2: {
   3:     XmlSerializer serializer = new XmlSerializer(type);
   4:     Stream stream = file.OpenBinaryStream();
   5:     XmlTextReader reader = new XmlTextReader(stream);
   6:     object obj = serializer.Deserialize(reader);
   7:     reader.Close();
   8:     stream.Close();
   9:
  10:     return obj;
  11: }

Ok, itu code awalnya… Tapi ketika dijalankan, muncul error ini : “There is an error in XML document (4, 2)”. Wah sempat pusing. setelah tanya sama om Google, akhirnya dapat informasi bahwa dengan menambahkan perintah position=0 pada stream object, akan solve. Yup.. akhirnya di coba :

   1: public object XmlDeserialize(Type type, SPFile file)
   2: {
   3:     XmlSerializer serializer = new XmlSerializer(type);
   4:     Stream stream = file.OpenBinaryStream();
   5:     stream.Position = 0;    // Ini Tambahannya
   6:     XmlTextReader reader = new XmlTextReader(stream);
   7:     object obj = serializer.Deserialize(reader);
   8:     reader.Close();
   9:     stream.Close();
  10:
  11:     return obj;
  12: }

Alhamdulillah, solve juga. Waktunya melaju ke modul selanjutnya. Hope usefull for reader 😀

Bagaimana Loop pada repeating table di Infopath 2007 ?

Masalah ini biasanya ditemui oleh para rekan-rekan yang berkecimpung dalam dunia sharepoint, terutama yang menggunakan Infopath sebagai form inputannya.
Berikut adalah cara untuk looping item pada repeating table di infopath :
Misalkan kita punya sebuah struktur repeating table seperti berikut ini :

maka yang harus dilakukan untuk looping ( untuk ambil semua value fieldnya ) cukup dengan code berikut ini :

   1: XPathNavigator domNav = MainDataSource.CreateNavigator();
   2: XPathNodeIterator rows = domNav.Select("/my:myFields/my:table/my:row", NamespaceManager);
   3:
   4: while (rows.MoveNext())
   5: {
   6:     string field1 = rows.Current.SelectSingleNode("my:field1", NamespaceManager).Value;
   7:     string field2 = rows.Current.SelectSingleNode("my:field2", NamespaceManager).Value;
   8:     string field3 = rows.Current.SelectSingleNode("my:field3", NamespaceManager).Value;
   9: }

semoga berguna….

How to Deploy Your webpart to Sharepoint Web?

Ya, kira-kira itulah yang sering muncul di kepala seorang developer yg baru terjun ke dunia webpart development for sharepoint seperti saya. Maklum, karena sebelumnya just copy paste your page/template(ascx) to your website and benk benk…. already done. Tapi di sharepoint, agak sedikit ribet.

So, untuk mengatasi keribetan itu, disarankan menggunakan tool yang namanya WSPBuilder. Cukup download dari CodePlex, install dan sudah bisa dipakai.

Bagaimana menggunakannya ? Cukup simple. Just create your webpart project. Create your own code, on project name, just right click your mouse and tick at WSPBuilder Menu –> Buid Webpart. Kalo mo deploy, cukup pilih menu deploy webpart. Done….

Simple kan ? Hehehe. Hopefully useful…..

Silverlight and Sharepoint Integration

Bagi yang gemar bermain sharepoint dan ingin mengintegrasikannya dengan silverlight, tunggu saja. Microsoft sudah announce blueprint untuk hal ini.

berikut petikannya diambil dari sini:

Silverlight Blueprint for SharePoint

The Silverlight Blueprint for SharePoint is source code and guidance for developers describing how to use Microsoft Silverlight and Microsoft SharePoint Products and TePoint Products and Technologies using the modern graphics capability in Silverlight.

Cek saja di : <a title=”httperface elements. This capability enables a fresh look at data exposed through SharePoint Products and Technologies using the modern graphics capability in Silverlight.

Cek saja di : http://www.ssblueprints.net/sharepoint/

So, tidak lama lagi, sharepoint akan semakin funky tampilannya dengan silverlight. Tunggu saja……!!!!