This Blog

Syndication

News

Awards

Microsoft MVP Logo
Grab this badge here!

Certificates

Transcript ID#: 6724122
Brainbench ASP.NET Certificate
 
Brainbench ASP.NET 2.0 Certificate
 
Brainbench .NET Framework 2.0 Certificate

Ahmad Masykur

var myObject = { "languages" : [ "C#", "VB.NET", "ASP.NET", "Javascript", "SDCC", "Assembler" ] }; //

November 2007 - Posts

  • DinnerNow

    Pengen dinner sambil belajar IIS7, ASP.NET Ajax Extentions, LINQ, Windows Communication Foundation, Windows Workflow Foundation, Windows Presentation Foundation, Windows Powershell, dan .NET Compact Framework?

    Silakan kunjungi http://www.codeplex.com/DinnerNow

    Share this post: | | | |
  • iMulai - Pencegahan Pengaksesan situs Terlarang dengan Bonus

    Ide ini muncul pada waktu saya ngobrol bersama teman kuliah di sebuah warung kucingan (angkringan). Awal mulanya kita ngobrol masalah pekerjaan masing-masing, kebetulan pekerjaan kita berbeda, saya sebagai seorang tukang koding dan teman saya tersebut seorang Electrical Engineer. Setelah ngobrol sana sini dan habis dua bungkus nasi kucing, obrolan yang sebelumnya membahas masalah listrik dan microcontroller beralih ke masalah jaringan komputer di perusahaan. Dia menceritakan bagaimana susahnya seorang network administrator di perusahaannya dalam memblokir situs porno, sudah ratusan ribu daftar situs yang ditutup tapi jumlah situs yang "mengasyikkan" tersebut tiap hari bertambah. Berbeda dengan tempat saya bekerja, semua situs diblokir kecuali situs mesin pencari Google, Microsoft dan situs-situs lain yang sudah terdaftar yang bisa diakses.

    Tugas network administrator (admin jaringan) memang berat, selain harus menjaga jaringan supaya selalu tersambung dengan baik juga mencegah masuknya virus dan program asing lain yang membahayakan. Biasanya seorang admin jaringan memiliki daftar hitam situs yang tidak boleh diakses tapi munculnya situs terlarang baru terlalu cepat. Bisa jadi jumlah daftar hitam mencapai jutaan. Hal ini menjadi kendala bagi seorang admin jaringan padahal tugas dia tidak hanya mencatat daftar situs yang dilarang untuk dikunjungi.

    Seorang user (pengguna) yang cerdik dan memang suka mencari situs-situs porno, dengan segala cara dia akan mencari situs baru yang belum dibokir oleh admin jaringan. Hanya berbekas mesin pencari pengguna tersebut bisa mendapatkan ribuan daftar situs X yang dia cari. Admin jaringan tidak bisa mencegah hal ini karena jumlah situs porno akan selalu bertambah.

    Dari permasalahan tersebut saya terpikir ide kenapa tidak membebaskan saja mereka membuka situs-situs kesayangannya, bahkan diberi bonus lebih. Mungkin ini ide yang aneh, kata membebaskan dan bonus pada kalimat di atas bukan berarti bebas tanpa syarat. Bebaskan pengguna untuk membuka situs kesayangannya tapi berikan bonus tak terbatas dengan memberikan 100x bahkan lebih halaman yang sama. Ini maksudnya ketika pengguna membuka halaman yang dilarang, pada browsernya akan membuka lagi halaman yang sama sampai tak terbatas jumlahnya. Cegat halaman di proxy server dan sisipkan sebuah javascript di dalam tag <header> halaman HTML dengan kode window.open(url, '_blank') sebelum halaman sampai di browser pengguna, maka ketika halaman dibuka di browser halaman yang sama akan dibuka di window lain dan seterusnya. Hal tersebut akan membuat komputer pengguna hang dan lebih berhati-hati dalam membuka situs terlarang. Jika tiap kali membuka situs sejenis komputer akan hang, dia akan kapok dengan sendirinya.

    Cara tersebut di atas bukan tidak memiliki kelemahan. Browser modern saat ini sudah dilengkapi dengan pop-up blocker, sehingga script tersebut tidak bisa berjalan secara otomatis tanpa ijin dari pengguna. Selain itu, jika fasilitas javascript dimatikan oleh pengguna, maka script tersebut tidak ada artinya.

    Cara lain pemberian bonus adalah bonus statistik pengguna. Pada waktu pengguna mengases situs terlarang, otomatis akan di-redirect ke halaman statistik penggunaan Internet. Dalam statistik tersebut dirinci situs mana yang paling sering dikunjungi dan kata yang paling sering digunakan sebagai query mesin pencari. Misalkan statistik tersebut seperti berikut.

    IP Address : 10.1.36.35
    User ID    : xyz

    Situs yang paling sering dikunjungi

    www.google.co.id 16%
    geeks.netindonesia.net 14%
    msdn2.microsoft.com 12%
    www.frienster.com 10%
    mail.google.com 9%
    www.xsite.com 8%
    www.companysite.co.id 5%
    www.codeplex.com 4%
    www.detik.com 4%
    lain-lain 18%

    Kata-kata yang paling sering digunakan dalam query mesin pencari selama satu bulan terakhir

    asp.net 8%
    ajax 8%
    ebook 7%
    algorithm 6%
    jakarta 5%
    gadis 4%
    komputer 4%
    mp3 3%
    download 1%
    lain-lain 54%

    Dengan cara seperti itu diharapkan para pengguna lebih berhati-hati karena tahu aktifitas berselancar mereka di Internet tercatat. Pihak managemen juga dapat mengetahui kinerja karyawan dengan melihat statistik tersebut.

    Share this post: | | | |
    Posted Nov 26 2007, 08:48 AM by cahnom with 2 comment(s)
    Filed under:
  • JawaScript

    Boso Java tambah dino tambah akeh class, tambah akeh kemampuane. Kawit digawe pertengahan taon 90-an, sampe saiki tambah akeh sing biso nggawe program nganggo boso Java.

    Kulo sakniki mung saged ngelos dodo ningali bocah-bocah sing mboten saged maleh nulis nganggo tulisan jowo. Koq nulis jowo lha wong ngucap boso jowo mawon mboten saged. Nate kenalan kalian mahasiswa UNDIP, ngakune kelahiran Semarang, ageng ten Semarang tapi diajak sanjang boso Jowo mboten saged. Lha pripun niku?

    Nopo sakniki ndamel boso pemprograman enggal mawon kanggo nglestariake boso jowo.

    <script type="text/jawascript">
        var jeneng = dokumen.pendetElemenSakingId("jeneng").teksLebetipun;
        menawi (jeneng == "Ahmad") {
            kagem (int i =0; i < jeneng.dowo; i++) {
                dokumen.nyerat(jeneng + "<br/>");
            }
        }
    </script>

    Mungkin yen wonten boso kados mekaten, boso jowo saged langkung dikenal kalian tiang jawi.

    Share this post: | | | |
    Posted Nov 23 2007, 11:11 AM by cahnom with 2 comment(s)
    Filed under:
  • Visual Studio 2008 Express Sudah Final

    Hari ini, saya lihat sesuatu yang berbeda dari hari kemaren. Halaman Web Visual Studio 2008 Express telah diperbarui. Kemaren saya baru saja selesai download Visual Studio 2008 Express Beta 2, hari ini sudah ada versi final-nya.

    Download lagi....

    Tunggu 1 jam 37 menit lagi...

    Share this post: | | | |
    Posted Nov 21 2007, 08:38 AM by cahnom with 4 comment(s)
    Filed under: ,
  • Javascript Debugger

    Salah satu fitur yang ada di Visual Studio 2008 adalah Javascript debugger. Berbeda dengan Visual Studio 2005 yang hanya bisa debug halaman saat dijalankan, pada VS 2008 penambahan break-point dapat dilakukan sebelum program dijalankan.

    Selama dua hari saya tidak dapat melakukan debugging javascript dengan Visual Studio 2008. Padahal sebelumnya lancar-lancar saja. Tiap kali ada javascript error, debugger yang dipilih bukan VS 2008 tapi Visual Interdev 6.0. Ini terjadi setelah saya buka Visual Interdev untuk melakukan sedikit perbaikan di program ASP Classic.

    Saya cari berbagai sumber informasi dari Google mengenai masalah javascript debugger namun hasilnya nihil. Saya cari option default debugger di windows juga tidak ditemukan. Cari option di VS 2008 juga tidak ada. Dan terakhir saya cari option di Visual Interdev 6.0 dan di sana ada option seperti gambar di bawah.

    Setelah option Attach to programs running on this maching yang berada dalam kotak merah gambar di atas saya uncheck. Alhamdulillah debugger javascript saya telah kembali ke VS 2008.

    Share this post: | | | |
  • Sequential Workflow & LINQ

    Berikut ini adalah rangkuman Bab 2 dari buku "Foundation of WF: An Introduction to Windows Workflow Foundation" karangan Brian R. Myers. Dalam bab tersebut diterangkan bagaimana membuat Sequential Workflow dan State Machine Workflow. Pada tulisan kali ini hanya akan saya bahas mengenai sequential workflow. Semua kode yang saya tulis di sini menggunakan C# tidak seperti pada buku yang menggunakan VB.NET. Dalam buku tersebut, akses ke database mengguakan ADO.NET, namun dalam tulisan ini saya gunakan LINQ to SQL. Penggunaan LINQ to SQL dimaksudkan untuk selain mempelajari WWF juga sekalian mempelajari bagaimana akses database menggunakan LINQ.

    Sequential Workflow merupakan sebuah workflow yang berjalan secara berurutan (sequential). Sebelum atifitas pertama selesai, aktifitas berikutnya tidak akan pernah dijalankan dan seterusnya sampai aktifitas terakhir.

    Pertama kita buat project "Sequential Workflow Console Application" seperti terlihat pada gambar di bawah.

    Setelah project dibuat, kita mulai pada Workflow Diagram. Buka file Workflow1.cs (design mode) dan akan terlihat tampilan seperti pada gambar berikut.

    Pada toolbox, drag Code Activity ke dalam Sequential Diagram. Klik Code Activity yang baru saja ditambahkan. Pada jendela Properties, ubah property name menjadi "step1" dan description menjadi "Step 1 in process". Setelah semuanya terisi, akan tampil seperti pada gambar berikut.

    Terlihat pada gambar di atas terdapat tanda seru merah pada sudut kanan atas Code Activity. Klik pada tanda seru tersebut dan terlihat bahwa property "ExecuteCode" belum di-set. Klik kanan pada Code Activity dan klik "Generate Handlers".

    Setelah itu akan dibangkitkan semua kode event handler secara otomatis. Pada Code Activity hanya ada satu event handler "ExecuteCode" sehingga hanya akan dibangkitkan event handler untuk event "ExecuteCode". Tambahkan kode untuk menampilkan pesan "Step 1" ke layar monitor seperti pada kode di bawah.

    private void Step1_ExecuteCode(object sender, EventArgs e) 
    { 
        Console.WriteLine("Step 1");
    }

    Selanjutnya kembali ke design mode. Tambahkan satu Code Activity lagi setelah step1. Namai Code Activity tersebut dengan step1 dan description "Step 2 in process". Generate event handlers dan tulis kode untuk menulis pesan ke layar monitor seperti step sebelumnya. Hasil diagram dan kode akan tampil seperti pada gambar dan kode berikut.

     

    private void Step1_ExecuteCode(object sender, EventArgs e)
    {
        Console.WriteLine("Step 1");
    }
    
    private void Step2_ExecuteCode(object sender, EventArgs e)
    {
        Console.WriteLine("Step 2");
    }

    Sekarang kita bisa jalankan program tersebut di atas. Pada jendela console akan tampil tulisan "Step 1" dan baris berikut nya tampil tulisan "Step 2" seperti gambar berikut.

    Pada Sequential Workflow, process akan selalu dilakukan secara berurutan sesuai dengan alur yang dibuat pada workflow diagram. Jika alur aktifitas dibalik maka proses juga akan mengikuti perubakan yang terjadi (dibalik).

    Sequential Workflow dengan Parameter

    Workflow pada penerapan di dunia nyata sering kali membutuhkan data masukan dan keluaran baik berupa nomor dokumen, status dokumen, atau hasil perhitungan dari aktifitas tertentu. Untuk memenuhi kebutuhan tersebut, dibuat parameter untuk menyertakan data tersebut pada workflow. Terdapat dua parameter yaitu parameter hanya tulis (write only) yang digunakan untuk mengeset data workflow activity dan parameter baca (read only) sebagai output parameter setelah proses aktifitas selesai dilaksanakan.

    Pada file Workflow1.cs tambahkan dua buah write only property integer dengan nama Input1 dan Input2 dan satu read only property integer dengan nama OutputValue.

    private int InputValue1;
    public int Input1
    {
        set { InputValue1 = value; }
    }
    
    private int InputValue2;
    public int Input2
    {
        set { InputValue2 = value; }
    }
    
    private int OutputResult;
    public int OutputValue
    {
        get { return OutputResult; }
    }

    Selanjutnya pada event handler Step1_ExecuteCode tambahkan baris OutputResult = InputValue1 + InputValue2; setelah kode Console.WriteLine("Step 1"); seperti kode berikut.

    private void Step1_ExecuteCode(object sender, EventArgs e)
    {
        Console.WriteLine("Step 1");
        OutputResult = InputValue1 + InputValue2;
    }

    Pada program utama (Program.cs), buat Generic Dictionary untuk menampung parameter input. Perlu diingat bahwa nama parameter input harus sama persis (case sensitif) dengan nama parameter yang didefinisikan di class workflow (Workflow1.cs).

    Dictionary<string, object> parameters = new Dictionary<string, object>();
    parameters.Add("Input1", 45);
    parameters.Add("Input2", 45);
    
    WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication1.Workflow1), parameters);
    instance.Start();

    Parameter output dapat dibaca hasilnya setelah workflow selesai dieksekusi. Tambahkan kode untuk menampilkan output parameter pada event handler WorkflowCompleted seperti kode berikut.

    workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) 
    {
        Console.WriteLine("Completed");
        Console.WriteLine("Output parameter: {0}", e.OutputParameters["OutputValue"]);
        waitHandle.Set();
    };

    Secara keseluruhan class workflow (Workflow1.cs) dan kode program utama (Program.cs) sebagai berikut.

    Workflow1.cs

    using System;
    using System.ComponentModel;
    using System.ComponentModel.Design;
    using System.Collections;
    using System.Drawing;
    using System.Workflow.ComponentModel.Compiler;
    using System.Workflow.ComponentModel.Serialization;
    using System.Workflow.ComponentModel;
    using System.Workflow.ComponentModel.Design;
    using System.Workflow.Runtime;
    using System.Workflow.Activities;
    using System.Workflow.Activities.Rules;
    
    namespace WorkflowConsoleApplication1
    {
    	public sealed partial class Workflow1: SequentialWorkflowActivity
    	{
            private int InputValue1;
            public int Input1
            {
                set { InputValue1 = value; }
            }
    
            private int InputValue2;
            public int Input2
            {
                set { InputValue2 = value; }
            }
    
            private int OutputResult;
            public int OutputValue
            {
                get { return OutputResult; }
            }
    
    		public Workflow1()
    		{
    			InitializeComponent();
    		}
    
            private void Step1_ExecuteCode(object sender, EventArgs e)
            {
                Console.WriteLine("Step 1");
                OutputResult = InputValue1 + InputValue2;
            }
    
            private void Step2_ExecuteCode(object sender, EventArgs e)
            {
                Console.WriteLine("Step 2");
            }
    	}
    }

    Program1.cs

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Threading;
    using System.Workflow.Runtime;
    using System.Workflow.Runtime.Hosting;
    
    namespace WorkflowConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
                {
                    AutoResetEvent waitHandle = new AutoResetEvent(false);
                    workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) 
                    {
                        Console.WriteLine("Completed");
                        Console.WriteLine("Output parameter: {0}", e.OutputParameters["OutputValue"]);
                        waitHandle.Set();
                    };
                    workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
                    {
                        Console.WriteLine(e.Exception.Message);
                        waitHandle.Set();
                    };
    
                    Dictionary<string, object> parameters = new Dictionary<string, object>();
                    parameters.Add("Input1", 45);
                    parameters.Add("Input2", 45);
    
                    WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication1.Workflow1), parameters);
                    instance.Start();
    
                    waitHandle.WaitOne();
                }
            }
        }
    }

    Contoh Aplikasi Purchase Order

    Selanjutnya akan dibuat contoh aplikasi sederhana untuk melakukan input PurchaseOrder. Seperti pada project sebelumnya, kita gunakan Sequential Workflow Console Application project untuk contoh ini.

    Pembuatan Database dan Tabel

    Sebelum buat project, siapkan dulu database dan table yang digunakan. Buat database dengan nama "Purchasing" dan tabel "tblPurchaseOrders". Dalam contoh ini saya gunakan MS SQL 2005 Express. Script untuk membuat database dan tabel dapat dilihat pada query di bawah.

    CREATE DATABASE [Purchasing]
    GO
    USE [Purchasing]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[tblPurchaseOrders](
    	[IntPurchaseOrderID] [int] IDENTITY(1,1) NOT NULL,
    	[StrPurchaseOrderNumber] [varchar](50) NULL,
    	[StrPartNumber] [varchar](50) NULL,
    	[dtePurchaseDate] [smalldatetime] NULL,
    	[dteExpectedDate] [smalldatetime] NULL,
    	[StrBuyerLogin] [varchar](50) NULL,
    	[StrBuyerName] [varchar](50) NULL,
    	[IntQuantityOrdered] [int] NULL,
    	[blnReceived] [bit] NULL CONSTRAINT [DF_tblPurchaseOrders_blnReceived]  DEFAULT ((0)),
    	[IntQuantityReceived] [int] NULL,
    	[dteReceivedDate] [smalldatetime] NULL,
     CONSTRAINT [PK_tblPurchaseOrders] PRIMARY KEY CLUSTERED 
    (
    	[IntPurchaseOrderID] ASC
    )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]

    Setelah database dan tabel dibuat, langkah-langkah berikutnya.

    Pembuatan Project Workflow

    Seperti pada pembahasan sebelumnya, buat project Sequential Workflow Console Application dengan nama PurchaseOrderConsole. Setelah project dibuat, pada workflow designer tambahkan satu Code Activity dan generate event handler untuk activity tersebut.

    Untuk dapat menerima input data dari luar dan mengembalikan hasilnya, dibutuhkan parameter-parameter. Kita buat beberapa parameter write only sebagi input data dan satu parameter read only sebagai output data. Buka class workflow (Workflow1.cs) dan tambahkan parameter seperti kode berikut.

    #region Write only parameters
    private string partNumber;
    public string PartNumber
    {
        set { partNumber = value; }
    }
    
    private DateTime purchaseDate;
    public DateTime PurchaseDate
    {
        set { purchaseDate = value; }
    }
    
    private DateTime expectedDate;
    public DateTime ExpectedDate
    {
        set { expectedDate = value; }
    }
    
    private string buyerLogin;
    public string BuyerLogin
    {
        set { buyerLogin = value; }
    }
    
    private string buyerName;
    public string BuyerName
    {
        set { buyerName = value; }
    }
    
    private int quantityOrdered;
    public int QuantityOrdered
    {
        set { quantityOrdered = value; }
    }
    #endregion
    
    #region Read only parameters
    private string purchaseOrderNumber;
    public string PurchaseOrderNumber
    {
        get { return purchaseOrderNumber; }
    }
    #endregion

    Pada program utama (Program.cs) juga harus ditambahkan input data dari user dan dimasukkan ke class workflow mengguakan parameters seperti yang telah dijelaskan di atas.

    Set input parameters

    Dictionary<string, object> parameters = new Dictionary<string, object>();
    Console.Write("Enter the Part Number:");
    parameters.Add("PartNumber", Console.ReadLine());
    
    Console.Write("Enter the Purchase Date:");
    parameters.Add("PurchaseDate", Convert.ToDateTime(Console.ReadLine()));
    
    Console.Write("Enter the Expected Date:");
    parameters.Add("ExpectedDate", Convert.ToDateTime(Console.ReadLine()));
    
    Console.Write("Enter the Buyer Login:");
    parameters.Add("BuyerLogin", Console.ReadLine());
    
    Console.Write("Enter the Buyer Name:");
    parameters.Add("BuyerName", Console.ReadLine());
    
    Console.Write("Enter the Quantity Ordered:");
    parameters.Add("QuantityOrdered", Convert.ToInt32(Console.ReadLine()));

    Karena input data dari user berupa string, maka untuk parameter dengan tipe data selain string harus dilakukan konversi terlebih dahulu ke tipe data yang sesuai. Dalam kode di atas, tipe data DateTime harus dikonversi menggunakan Convert.ToDateTime dan intenger menggunakan Convert.ToInt32.

    Setelah workflow selesai dieksekusi, tampilkan hasil nomor purchase order ke layar.

    workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) 
    {
        Console.WriteLine("Purchase Order Number is: {0}", e.OutputParameters["PurchaseOrderNumber"]);
        waitHandle.Set(); 
    };

    Akses ke Database Menggunakan LINQ

    Pada contoh ini akses ke database  tidak menggunakan ADO.NET secara langsung melainkan menggunakan LINQ to SQL. Pemilihan LINQ to SQL dikarenakan akses ke database menjadi lebih mudah dibandingkan mengguanakn ADO.NET secara langsung. Selain itu, LINQ menyediakan strong type query sehingga kesalahan yang timbul sudah bisa diketahui pada saat kompilasi.

    Pertama, pada jendela Server Explore, tambahkan koneksi ke database yang telah dibuat. Masukkan nama server pada kotak Server name dan pilih database sesuai dengan database yang telah dibuat yaitu "Purchasing".

    Setelah koneksi dibuat kemudian buat class LINQ to SQL. Pada jendela Solution Explorer, klik kanan pada project dan pilih Add -> New item. Pilih LINQ to SQL class dan beri nama Purchasing.dbml.

    Buka file Purchasing.dbml, pada jendela Server Explorer drag tabel tblPurchaseOrders ke designer. Setelah itu pada designer akan tampil diagram tabel tblPurchaseOrders seperti pada gambar berikut.

    Insert Data ke Database

    Setelah class LINQ to SQL selesai dibuat selanjutnya adalah query untuk memasukkan data ke dalam database. Pada class workflow (Workflow1.cs), buat satu method AddPurchaseOrder() untuk melakukan insert data ke database. Semua data diambil dari write only parameter yang telah dibuat sebelumnya.

    public void AddPurchaseOrder()
    {
        PurchasingDataContext db = new PurchasingDataContext();
        tblPurchaseOrder order = new tblPurchaseOrder
        {
            StrPartNumber = partNumber,
            dtePurchaseDate = purchaseDate,
            dteExpectedDate = expectedDate,
            StrBuyerLogin = buyerLogin,
            StrBuyerName = buyerName,
            IntQuantityOrdered = quantityOrdered
        };
        db.tblPurchaseOrders.Add(order);
        db.SubmitChanges();
        purchaseOrderNumber = order.IntPurchaseOrderID.ToString().PadLeft(6, '0');
    }

    Terakhir tambahkan baris AddPurchaseOrder() pada event handler ExecuteCode

    private void codeActivity1_ExecuteCode(object sender, EventArgs e)
    {
        AddPurchaseOrder();
    }

     

    Program secara lengkah dapat dilihat pada kode-kode berikut.

    Workflow.cs

    using System;
    using System.ComponentModel;
    using System.ComponentModel.Design;
    using System.Collections;
    using System.Drawing;
    using System.Workflow.ComponentModel.Compiler;
    using System.Workflow.ComponentModel.Serialization;
    using System.Workflow.ComponentModel;
    using System.Workflow.ComponentModel.Design;
    using System.Workflow.Runtime;
    using System.Workflow.Activities;
    using System.Workflow.Activities.Rules;
    
    namespace PurchaseOrderConsole
    {
    	public sealed partial class Workflow1: SequentialWorkflowActivity
        {
            #region Write only parameters
            private string partNumber;
            public string PartNumber
            {
                set { partNumber = value; }
            }
    
            private DateTime purchaseDate;
            public DateTime PurchaseDate
            {
                set { purchaseDate = value; }
            }
    
            private DateTime expectedDate;
            public DateTime ExpectedDate
            {
                set { expectedDate = value; }
            }
    
            private string buyerLogin;
            public string BuyerLogin
            {
                set { buyerLogin = value; }
            }
    
            private string buyerName;
            public string BuyerName
            {
                set { buyerName = value; }
            }
    
            private int quantityOrdered;
            public int QuantityOrdered
            {
                set { quantityOrdered = value; }
            }
            #endregion
    
            #region Read only parameters
            private string purchaseOrderNumber;
            public string PurchaseOrderNumber
            {
                get { return purchaseOrderNumber; }
            }
            #endregion
    
    		public Workflow1()
    		{
    			InitializeComponent();
    		}
    
            public void AddPurchaseOrder()
            {
                PurchasingDataContext db = new PurchasingDataContext();
                tblPurchaseOrder order = new tblPurchaseOrder
                {
                    StrPartNumber = partNumber,
                    dtePurchaseDate = purchaseDate,
                    dteExpectedDate = expectedDate,
                    StrBuyerLogin = buyerLogin,
                    StrBuyerName = buyerName,
                    IntQuantityOrdered = quantityOrdered
                };
                db.tblPurchaseOrders.Add(order);
                db.SubmitChanges();
                purchaseOrderNumber = order.IntPurchaseOrderID.ToString().PadLeft(6, '0');
            }
    
            private void codeActivity1_ExecuteCode(object sender, EventArgs e)
            {
                AddPurchaseOrder();
            }
        }
    }

    Program.cs

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Threading;
    using System.Workflow.Runtime;
    using System.Workflow.Runtime.Hosting;
    
    namespace PurchaseOrderConsole
    {
        class Program
        {
            static void Main(string[] args)
            {
                Dictionary<string, object> parameters = new Dictionary<string, object>();
                Console.Write("Enter the Part Number:");
                parameters.Add("PartNumber", Console.ReadLine());
    
                Console.Write("Enter the Purchase Date:");
                parameters.Add("PurchaseDate", Convert.ToDateTime(Console.ReadLine()));
    
                Console.Write("Enter the Expected Date:");
                parameters.Add("ExpectedDate", Convert.ToDateTime(Console.ReadLine()));
    
                Console.Write("Enter the Buyer Login:");
                parameters.Add("BuyerLogin", Console.ReadLine());
    
                Console.Write("Enter the Buyer Name:");
                parameters.Add("BuyerName", Console.ReadLine());
    
                Console.Write("Enter the Quantity Ordered:");
                parameters.Add("QuantityOrdered", Convert.ToInt32(Console.ReadLine()));
    
                using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
                {
                    AutoResetEvent waitHandle = new AutoResetEvent(false);
                    workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) 
                    {
                        Console.WriteLine("Purchase Order Number is: {0}", e.OutputParameters["PurchaseOrderNumber"]);
                        waitHandle.Set(); 
                    };
                    workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
                    {
                        Console.WriteLine(e.Exception.Message);
                        waitHandle.Set();
                    };
    
                    WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(PurchaseOrderConsole.Workflow1), parameters);
                    instance.Start();
    
                    waitHandle.WaitOne();
                }
                Console.WriteLine("Press any key to continue...");
                Console.ReadKey();
            }
        }
    }
    Share this post: | | | |