Kamis, 22 Januari 2009

ADO.Net Transaction, Untuk Penyimpanan pada Tabel Master/Detail

PRA KATA...
Pada saat membuat program terutama untuk aplikasi database, seringkali kita dihadapkan pada model penyimpanan master/detail atau header/detail. contoh nya pada kasus Order pembelian, penerimaan barang dan masih banyak lagi. tekhnik penyimpanannya sebenarnya bisa dilakukan dengan menyimpan headernya terlebih dahulu, baru kemudian kita tambahkan detailnya satu per satu, akan tetapi ada kalanya kita dihadapkan pada situasi bahwa data yang di masukan harus sukses tersimpan semuanya.. jika ada kesalahan.. entah yg disebabkan terputusnya koneksi secara tiba2 atau hal lainnya, maka data tersebut tidak boleh tersimpan hanya sebagian saja. Nah untuk situasi semacam ini memanfaatkan fungsi transaction pada SQLconnection menjadi perlu. untuk tujuan tersebutlah tulisan ini dibuat... ini hasil explorasi ku aja.. kalo ada yang lebih baik lagi tekhniknya boleh dong di sharing.. :)

STARTING..
Pada kasus ini saya menggunakan database SQLServer dg nama database test dan dua buah tabel TrsH sebagai tabel headernya dg field sbb (NoTrs Varchar(64), Desk Varchar(80) ) dan tabel TrsD sebagai tabel detailnya dg Field sbb (ID Smallint, NoTrs Varchar(64), Qty Smallint). Oleh karenanya jika ingin mencoba maka harus membuat database dan tabel-tabel tersebut.

Kemudian buatlah sebuah project baru dan tambahkan sebuah button pada form yang ada. dan kopikan code program berikut ini atau bisa juga download contoh program yg saya buat di sini 

Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlClient
Imports System.Data.SqlTypes

Public Class Form1

    'Procedure berikut ini untuk simulasi memasukan data ke Database pada SQL Server
    'Dengan memanfaat fungsi Begintrans dan Commit Trans.
    'Hal kadang diperlukan pada transaksi yg mengharuskan bahwa penyimpanan pada tabel master/detail harus 
    'sukses semuanya, jika gagal pada salah satu prosesnya, maka data yg ditambahkan tersebut tidak boleh tersimpan semuanya
    Private Sub saveToDb()

        Dim MyConn As SqlConnection
        Dim TheTransaction As SqlTransaction
        Dim myCmd4Trsh As SqlCommand
        Dim myCmd4Trsd As SqlCommand

        Dim MyTrsHNo As String = "001"
        Dim MyTrsHDesc As String = "Ini Cuma test aja"
        Dim NoDtl As Integer = 0
        Dim Qty As Integer = 0

        Try
            'Prepare connection & set transcation, so every connection to SQL Server using this connection
            'will use the same transaction
            MyConn = New SqlConnection
            MyConn.ConnectionString = "Data Source=(local);Initial Catalog=test;Persist Security Info=True;User ID=sa;Password=123"
            MyConn.Open()
            'Memulai transaksi
            TheTransaction = MyConn.BeginTransaction

            myCmd4Trsh = New SqlCommand
            myCmd4Trsh.Connection = MyConn
            myCmd4Trsh.CommandType = CommandType.StoredProcedure
            myCmd4Trsh.CommandText = "ADD_TrsH"
            myCmd4Trsh.Transaction = TheTransaction

            'Tambahkan parameter untuk SP AddTrsH dan Set value ke parameter tersebut
            myCmd4Trsh.Parameters.Add("@NoTrs", SqlDbType.VarChar, 64).Value = MyTrsHNo
            myCmd4Trsh.Parameters.Add("@Desk", SqlDbType.VarChar, 80).Value = MyTrsHDesc
            myCmd4Trsh.ExecuteNonQuery()

            myCmd4Trsd = New SqlCommand
            myCmd4Trsd.Connection = MyConn
            myCmd4Trsd.CommandType = CommandType.StoredProcedure
            myCmd4Trsd.CommandText = "ADD_TrsD"
            myCmd4Trsd.Transaction = TheTransaction

            Dim i As Integer = 0
            For i = 0 To 4
                myCmd4Trsd.Parameters.Add("@ID", SqlDbType.SmallInt).Value = i
                myCmd4Trsd.Parameters.Add("@NoTrs", SqlDbType.VarChar, 64).Value = MyTrsHNo
                myCmd4Trsd.Parameters.Add("@Qty", SqlDbType.Int).Value = i + 10
                myCmd4Trsd.ExecuteNonQuery()
                myCmd4Trsd.Parameters.Clear()
            Next
            'jika proses menambahkan data pada tabel TrsH dan TrsD sukes maka lakukan Commit, untuk menyimpan data
            'secara permanen didatabase
            TheTransaction.Commit()

        Catch ex As Exception
            MessageBox.Show(ex.Message, "", MessageBoxButtons.OK)
            'jika proses menambahkan data pada tabel TrsH dan TrsD Gagal maka lakukan RollBack, agar data tidak disimpan
            'didatabase
            TheTransaction.Rollback()
            MyConn.Close()
        Finally
            MyConn.Close()
        End Try

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Call saveToDb()
    End Sub
End Class

FINALLY...
Ok selesai sudah.. selamat mencoba, semoga berguna... thank's

Selasa, 20 Januari 2009

TextBox Yang hanya menerima Angka Saja di VB.Net

PRA KATA

Seringkali pada saat membuat program kita menginginkan hanya angka saja yang boleh di ketik pada suatu TextBox. hal yang sederhana namum cukup membuat kita kehabisan waktu untuk mengexplorenya.. apalagi bagi para pemula.. :).

Starting...

Buatlah project baru, pada form tambahkan sebuah TextBox

Codenya..

Kemudian copy paste kode program berikut ini..

Private nonNumberEntered As Boolean = False

Private Sub TextBox1_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.GotFocus
TextBox1.Text = Replace(TextBox1.Text, ".", "")
End Sub

Private Function CekIfNonNumber(ByVal Kc As System.Windows.Forms.KeyEventArgs) As Boolean
' Determine whether the keystroke is a number from the top of the keyboard.
If Kc.KeyCode <> Keys.D9 Then
' Determine whether the keystroke is a number from the keypad.
If Kc.KeyCode <> Keys.NumPad9 Then
' Determine whether the keystroke is a backspace.
If Kc.KeyCode <> Keys.Back Then
' A non-numerical keystroke was pressed.
' Set the flag to true and evaluate in KeyPress event.
Return True
End If
End If
End If
End Function

' Handle the KeyDown event to determine the type of character entered into the control.
Private Sub textBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) _
Handles TextBox1.KeyDown
' Initialize the flag to false.
nonNumberEntered = CekIfNonNumber(e)
End Sub 'textBox1_KeyDown

' This event occurs after the KeyDown event and can be used
' to prevent characters from entering the control.
Private Sub textBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles TextBox1.KeyPress
e.Handled = nonNumberEntered
End Sub 'textBox1_KeyPress

Private Sub TextBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Leave
TextBox1.Text = FormatNumber(TextBox1.Text, 0)
End Sub

Private Sub TextBox2_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox2.KeyDown
MsgBox(e.KeyCode)
End Sub


Finally

Ok That's all, selamat mencoba dan mempelajari semoga bermanfaat..

Sumber..
1. Someone di internet.. sudah lama sekali lupa jadinya.. :)

Find Item, Add Row Dan Column di Listview Pada VB.NET 2005

PRA KATA

Berikut adalah catatan gw tentang bagaimana mencari suatu item data di Listview dan bagaimana menambahkan baris dan Columns di Listview... pemula banget sih.. tapi ga apa2 emang ini ditujukan untuk pembaca2 yang masih pemula dalam programming VB.Net 2005.

Starting...

Buatlah project baru, tambahkan pada form sebuah Listview, Button, dan TextBox, bagaimana mengatur komponen tersebut agar menarik... itu menjadi urusan Kamu.. aturlah sesuai selera kamu.. ok

Codenya..

Kemudian Copy code berikut ini...

Private Sub ResettingListView()
        With ListView1
            .Clear()
            .View = View.Details
            .GridLines = True
            .FullRowSelect = True
            .Columns.Add("Col", 100, HorizontalAlignment.Left)
            .Columns.Add("Desc", 300, HorizontalAlignment.Left)
        End With
    End Sub

    Private Sub ListViewMakeRow(ByVal lvw As ListView, ByVal item_title As String, ByVal ParamArray subitem_titles() As String)
        Dim new_item As ListViewItem = lvw.Items.Add(item_title)

        For i As Integer = subitem_titles.GetLowerBound(0) To subitem_titles.GetUpperBound(0)
            new_item.SubItems.Add(subitem_titles(i))
        Next i
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim xCount As Integer = 0
        Call ResettingListView()
        For xCount = 0 To 20
            Call ListViewMakeRow(ListView1, xCount.ToString, "Ini " & xCount.ToString)
        Next
    End Sub

    Private Sub CariDiListView(ByVal Text2Search As String)
        Try
            Dim foundItem As ListViewItem = _
            ListView1.FindItemWithText(Text2Search, True, 0, True)
            ListView1.SelectedItems.Clear()
            If Not (foundItem Is Nothing) Then
                ListView1.Focus()
                foundItem.Selected = True
                ListView1.TopItem = foundItem
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "", MessageBoxButtons.OK)
        End Try
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Try
            Call CariDiListView(TextBox1.Text)
        Catch ex As Exception
            MessageBox.Show(ex.Message, "", MessageBoxButtons.OK)
        End Try
    End Sub

Finally....
Selesai deh... selamat mencoba, semoga bermanfaat.

Sumber...
1. MSDN Offline