Private Sub AutoRune() '--------------------------------------- > (PAGE Call AutoNumber )
Dim tmpNumber As Integer
Dim ComEdit As New OleDbCommand
Dim sqlCheckNumber As String
dataset = New DataSet
Dim i As Integer
strConn = "provider=Microsoft.Jet.oleDb.4.0;" & _
"Data Source=..\\Computer_CheckcoseEmployees.mdb"
With Conn
If .State = ConnectionState.Open Then .Close()
.ConnectionString = strConn
.Open()
sqlCheckNumber = "SELECT Comment_ID FROM Comment ORDER BY Comment_ID asc"
With ComEdit
ComEdit.CommandType = CommandType.Text
ComEdit.CommandText = sqlCheckNumber
ComEdit.Connection = Conn
ComEdit.ExecuteReader()
ComEdit = New OleDbCommand(sqlCheckNumber, Conn)
Dim adapter As New OleDbDataAdapter(ComEdit)
adapter.Fill(dataset, "pro")
tmpNumber = 0 + i
For i = 0 To dataset.Tables("pro").Rows.Count + 1
tmpNumber = 0 + i
Next
txtComment_ID.Text = Format(CInt(tmpNumber.ToString("000")))
Return
End With
End With
End Sub
With Conn
If .State = ConnectionState.Open Then .Close()
.ConnectionString = strConn
.Open()
End With
Dim MaxID As Integer
sqlCheckNumber = "SELECT ISNULL(MAX(Comment_ID),0) FROM Comment"
'ใช้บรรทัดนี้แล้ว 3 บรรทัดก่อนหน้านี้ไม่ต้องใช้แล้ว
ComEdit = New OleDbCommand(sqlCheckNumber, Conn)
ใส่ Try ตรงนี้ด้วยน่าจะดี
MaxID = ComEdit.ExecuteScalar()
tmpNumber = (MaxID + 1).tostring("0000")
ถ้าทำเป็น auto increament มันง่ายก้อจิงแต่เวลา ทำการนำข้อมูลมาแสดงสิครับ
มันทำยากนะคับ ถึงผมจะมือใหม่ .net แต่ก้อพอจะรู้นะคับ ทำเป็น Auto number มันจะดีกว่าคับ
เลยพยายามทำ แต่ทำเท่าไหร่ก้อทำไม่้ได้สักที
Private Sub Autorune() '--------------------------------------- > (PAGE Call AutoNumber )
Dim Autorun As Integer
If mskid_docter.Text = "______" Then
mskid_docter.Text = "000001"
Else
Sqlsa = "select id_docter from savedocter order by id_docter asc"
Set Res = New ADODB.Recordset
Res.Open Sqlsa, Cnn, adOpenStatic, adLockReadOnly
If Res.RecordCount > 0 Then
Res.MoveLast
Autorun = Val(mskid_docter.Text)
mskid_docter.Text = Format(CInt(Res!id_docter) + 1, "000000")
Else
mskid_docter.Text = "000001"
Res.Close
End If
End If
End Sub
ถ้าสามารถเช็คได้เหมือน นี้เลยจะทำได้หรือป่าวคับเพราะถ้าสามารถชี้ Record
ได้แล้วก้อจะสามารถทำ การ ลบ เพิ่ม มันก้อไม่กระทบเลย
มือใหม่ครับ ทำมา 3 เดือน พยายามสุด ๆ คับตอนนี้ -*- ทำอย่างอื่นเสร็จหมดแล้ว เหลือแต่ Auto number ครับ
ตัวโปรแกรมไม่ต่างจาก vb 6 สักเท่าไหร่ แต่งง Auto number ไม่ได้ ไม่เข้าใจ เลยเอา Code มาให้ดู เป็นการ Save ลง
Data access 2003 หรือ 2007 ได้แล้วแต่ละเปิดใช้ตัวไหน
ในฐานข้อมูลมี 1 ตาราง ชื่อ Comment ใน ตางรางประกอบด้วย ฟิวล์ Comment_ID , Comment_Comment_Title
แค่ 2 ตัวนี้ก้อทำ Auto number ไม่ได้แล้ว ช่วยดูให้หน่อยเป็นงง ที่แนะนำมาทำหมดแล้ว แต่พอกด add ค่าเริ่มต้น เป็น 0 ทั้งที่มีข้อมูล
ในตาราง 5 ข้อมูลแล้ว เอ้ย ละอ่อนใจ ทำ Search เลือกข้อมูล ในฐานข้อมูล คิดว่ายากแล้วนะแต่เจอ Auto number เข้าไป ไปไม่เป็นเลย
Code vb.net ฐานข้อมูล access 2003 หรือ 2007
Code (VB.NET)
Option Explicit On
'Option Strict On
Imports System.Text
Imports System.Data
Imports System.Data.OleDb
Imports System.Data.OleDb.OleDbConnection
Imports System.Data.SqlClient
Imports System.Drawing.Drawing2D
Imports System.String
Public Class FormAdd_Comment
Dim strConn, Objrecored As String
Dim Autorun As Integer
Dim Conn As New OleDbConnection
Dim da, da1 As OleDbDataAdapter
Dim ds, dataset As New DataSet()
Dim ds1 As New DataSet()
Dim CurrentEmployees As Integer
Dim IsFind As Boolean = False
Dim instance As OleDbException
Dim comSearch As New OleDbCommand
Private Sub ProvinceBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Me.Validate()
Formdisplay_Colum()
End Sub
Private Sub LoadFiledata()
' Code ติดต่อกับฐานข้อมูล Accress 2007
'strConn = "Provider=Microsoft.ACE.OLEDB.12.0; " & _
' "Data Source=..\\Computer_CheckcoseEmployees.accdb;Persist Security Info=False"
' Code ติดต่อกับฐานข้อมูล Accress 2003
'Dim conStr As String = _
strConn = "provider=Microsoft.Jet.oleDb.4.0;" & _
"Data Source=..\\Computer_CheckcoseEmployees.mdb"
Dim Conn As New OleDbConnection(strConn)
Conn.Open()
Dim Sql As String = "select * from Comment"
Dim Cmd As New OleDbCommand(Sql, Conn)
Dim Adapter As New OleDbDataAdapter(Cmd)
Dim Data As New DataSet()
Adapter.Fill(Data, "cat")
Dim Data1 As New DataSet()
DataGridView1.DataSource = Data.Tables("cat")
Conn.Close()
Dim sqlCategories As String
sqlCategories = "SELECT * from Comment"
da = New OleDbDataAdapter(sqlCategories, Conn)
da.Fill(ds, "Comment")
Return
End Sub
Private Sub ClearButtom()
BtnAdd.Enabled = True
BtnSave.Enabled = False
BtnEdit.Enabled = False
BtnSave_Edit.Enabled = False
BtnDelete.Enabled = False
BtnExit.Enabled = True
End Sub
Private Sub ClearText()
txtComment_ID.Text = "000"
lblComment_ID.Text = "000"
txtComment_Title.Text = ""
txtComment_ID.Enabled = True
txtComment_Title.Enabled = True
End Sub
'--------------------------------------------->>>> (FORMLOAD PAGE ข้อมูล)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
LoadFiledata()
showAllProvince() ' Function Call เรียกใช้งาน Table provinces
'txtComment_ID.ContextMenu = New ContextMenu()
txtComment_ID.Enabled = False
txtComment_Title.Enabled = False
txtComment_ID.Text = "000"
lblComment_ID.Text = "000"
txtComment_Title.Text = "หมายเหตุ"
ClearButtom()
'AutoRune()
Return
End Sub
Private Sub BtnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAdd.Click
ClearText()
AutoRune()
lblComment_ID.Show()
txtComment_ID.Hide()
BtnSave.Enabled = True
BtnAdd.Enabled = False
End Sub
Private Sub BtnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnExit.Click
Me.Close()
End Sub
'--------------------------------------------->>>> (SAVE ข้อมูล)
Private Sub BtnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSave.Click
Dim sqlAdd As String
Dim comAdd As New OleDbCommand
If txtComment_ID.Text = "" Then
MessageBox.Show("กรอกข้อมูลรหัส !!!", "แจ้งให้ทราบ", MessageBoxButtons.OK, MessageBoxIcon.Information)
txtComment_ID.Focus()
Exit Sub
End If
If txtComment_Title.Text = "" Then
MessageBox.Show("กรอกข้อมูลหมายเหตุ !!!", "แจ้งให้ทราบ", MessageBoxButtons.OK, MessageBoxIcon.Information)
txtComment_ID.Focus()
Exit Sub
End If
If MessageBox.Show("คุณต้องการเพิ่มรายการหมายเหตุ ใช่หรือไม่?", "แจ้งให้ทราบ", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
sqlAdd = "INSERT INTO Comment(Comment_ID,Comment_Title)"
sqlAdd &= " VALUES ('" & lblComment_ID.Text & "',"
sqlAdd &= "'" & txtComment_Title.Text & "')"
' Code ติดต่อกับฐานข้อมูล Accress 2007
'strConn = "Provider=Microsoft.ACE.OLEDB.12.0; " & _
' "Data Source=..\\Computer_CheckcoseEmployees.accdb;Persist Security Info=False"
' Code ติดต่อกับฐานข้อมูล Accress 2003
'Dim conStr As String = _
'strConn = ("provider=Microsoft.Jet.oleDb.4.0;" & _
' "Data Source=..\\Computer_CheckcoseEmployees.mdb")
With Conn
If .State = ConnectionState.Open Then .Close()
.ConnectionString = strConn
.Open()
End With
With comAdd
.CommandType = CommandType.Text
.CommandText = sqlAdd
.Connection = Conn
.ExecuteNonQuery()
End With
MessageBox.Show("เพิ่มรายการหมายเหตุ เรียบร้อยแล้ว !!!", "แจ้งให้ทราบ", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
LoadFiledata()
showAllProvince()
Formdisplay_Colum()
BtnAdd.Enabled = True
BtnSave.Enabled = False
'txtComment_ID.Enabled = False
txtComment_Title.Enabled = False
Return
End Sub
Private Sub showAllProvince() ' Function ใช้เพื่อ Call Table Doctor
Dim SqlDoctor As String
SqlDoctor = "SELECT * from Comment"
SqlDoctor &= " FROM Comment"
da.SelectCommand.CommandText = SqlDoctor
If IsFind = True Then
ds.Tables("Comment").Clear()
End If
If ds.Tables("Comment").Rows.Count <> 0 Then
IsFind = True
With DataGridView1
.ReadOnly = True
.DataSource = ds.Tables("Comment")
End With
Else
IsFind = False
End If
Formdisplay_Colum()
Return
End Sub
Private Sub Formdisplay_Colum() ' Function แสดงหัวข้อบน Gridviwe Table Doctor
Dim cs As New DataGridViewCellStyle()
cs.Font = New Font("AngsanaUPC", 17, FontStyle.Bold)
With DataGridView1
If .RowCount > 0 Then
.Columns(0).HeaderText = "รหัส"
.Columns(1).HeaderText = "หมายเหตุ"
.Columns(0).Width = 30
.Columns(1).Width = 440
End If
End With
Return
End Sub
Private Sub DataGridView1_CellMouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseUp
If e.RowIndex = DataGridView1.Rows.Count - 1 Then
Exit Sub
End If
If e.RowIndex = -1 Then Exit Sub
With DataGridView1
CurrentEmployees = CInt(.Rows.Item(e.RowIndex).Cells(0).Value)
txtComment_ID.Text = .Rows.Item(e.RowIndex).Cells(0).Value.ToString()
lblComment_ID.Text = .Rows.Item(e.RowIndex).Cells(0).Value.ToString()
txtComment_Title.Text = .Rows.Item(e.RowIndex).Cells(1).Value.ToString()
End With
BtnEdit.Enabled = True : BtnAdd.Enabled = False : BtnDelete.Enabled = True
Return
End Sub
Private Sub ButDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnDelete.Click
Dim SqlDelete As String
Dim ComDelete As New OleDbCommand
If (txtComment_ID.Text = "") And (lblComment_ID.Text = "") Then
Return
End If
If MessageBox.Show("ต้องการลบข้อมูลแผนก หรือไม่", "แจ้งให้ทราบ", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
SqlDelete = "DELETE * FROM Comment"
SqlDelete = "WHERE Comment_ID = txtComment_ID.Text"
ComDelete = New OleDbCommand(SqlDelete, Conn)
'strConn = "provider=Microsoft.Jet.oleDb.4.0;" & _
' "Data Source=..\\Computer_CheckcoseEmployees.mdb"
With Conn
If .State = ConnectionState.Open Then .Close()
.ConnectionString = strConn
.Open()
End With
SqlDelete = "DELETE * FROM Comment WHERE Comment_ID = txtComment_ID.Text"
ComDelete = New OleDbCommand(SqlDelete, Conn)
ComDelete.Parameters.AddWithValue("txtComment_ID.Text", txtComment_ID.Text)
ComDelete.ExecuteNonQuery()
End If
MessageBox.Show("ลบข้อมูลหมายเหตุนี้ เรียบร้อยแล้ว", "แจ้งให้ทราบ", MessageBoxButtons.OK, MessageBoxIcon.Information)
LoadFiledata() ' Function Call เรียกใช้งาน Table Loadtable Form Province
showAllProvince() ' Function Call เรียกใช้งาน Table province
Formdisplay_Colum() ' Function Call เรียกใช้งาน Display Field
ClearButtom()
'AutoRune()
Return
End Sub
Private Sub BtnEdit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnEdit.Click
If txtComment_ID.Text <> "" Then
If MessageBox.Show("ต้องการแก้ไขข้อมูลหมายเหตุนี้ หรือไม่", "แจ้งให้ทราบ", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
BtnAdd.Enabled = False
BtnSave.Enabled = False
BtnEdit.Enabled = False
BtnSave_Edit.Enabled = True
BtnDelete.Enabled = False
txtComment_ID.Enabled = False
txtComment_Title.Enabled = True
txtComment_Title.Focus()
End If
Else
Exit Sub
End If
End Sub
Private Sub BtnSave_Edit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSave_Edit.Click
Dim SqlEdit As String
Dim ComEdit As New OleDbCommand
If txtComment_ID.Text = "" Then
MessageBox.Show("กรอกข้อมูลรหัส !!!", "แจ้งให้ทราบ", MessageBoxButtons.OK, MessageBoxIcon.Information)
txtComment_ID.Focus()
Exit Sub
End If
If txtComment_Title.Text = "" Then
MessageBox.Show("กรอกข้อมูลหมายเหตุ !!!", "แจ้งให้ทราบ", MessageBoxButtons.OK, MessageBoxIcon.Information)
txtComment_ID.Focus()
Exit Sub
End If
If MessageBox.Show("ต้องการแก้ไขข้อมูลชื่อแผนก หรือไม่", "แจ้งให้ทราบ", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
SqlEdit = "UPDATE Comment"
SqlEdit &= " SET Comment_Title = '" & txtComment_Title.Text & "'"
SqlEdit &= " WHERE (Comment_ID = '" & txtComment_ID.Text & "')"
' Code ติดต่อกับฐานข้อมูล Accress 2007
'strConn = "Provider=Microsoft.ACE.OLEDB.12.0; " & _
' "Data Source=..\\Computer_CheckcoseEmployees.accdb;Persist Security Info=False"
' Code ติดต่อกับฐานข้อมูล Accress 2003
' Dim Strconn As String
'strConn = "provider=Microsoft.Jet.oleDb.4.0;" & _
' "Data Source=..\\Computer_CheckcoseEmployees.mdb"
With Conn
If .State = ConnectionState.Open Then .Close()
.ConnectionString = strConn
.Open()
End With
ComEdit.CommandType = CommandType.Text
ComEdit.CommandText = SqlEdit
ComEdit.Connection = Conn
ComEdit.ExecuteNonQuery()
End If
MessageBox.Show("แก้ไขข้อมูลหมายเหตุนี้ เรียบร้อยแล้ว", "แจ้งให้ทราบ", MessageBoxButtons.OK, MessageBoxIcon.Information)
LoadFiledata() ' Function Call เรียกใช้งาน Table Loadtable Form Province
showAllProvince() ' Function Call เรียกใช้งาน Table province
Formdisplay_Colum() ' Function Call เรียกใช้งาน Display Field
BtnAdd.Enabled = True
BtnSave_Edit.Enabled = False
txtComment_Title.Enabled = False
Return
End Sub
'------------------------------------------------------------------------------------------------------>>>>> > (PAGE Call AutoNumber )
Private Sub AutoRune()
Dim tmpNumber As Integer
Dim ComEdit As New OleDbCommand
Dim sqlCheckNumber As String
Dim price As Integer = 0
dataset = New DataSet
Dim i As Integer
' strConn = "provider=Microsoft.Jet.oleDb.4.0;" & _
' "Data Source=..\\Computer_CheckcoseEmployees.mdb"
With Conn
If .State = ConnectionState.Open Then .Close()
.ConnectionString = strConn
.Open()
sqlCheckNumber = "SELECT Comment_ID FROM Comment ORDER BY Comment_ID asc"
With ComEdit
ComEdit.CommandType = CommandType.Text
ComEdit.CommandText = sqlCheckNumber
ComEdit.Connection = Conn
ComEdit.ExecuteReader()
ComEdit = New OleDbCommand(sqlCheckNumber, Conn)
Dim adapter As New OleDbDataAdapter(ComEdit)
adapter.Fill(dataset, "pro")
For i = 0 To dataset.Tables("pro").Rows.Count '+ 1
tmpNumber = i + 1
Next
MsgBox(i)
txtComment_ID.Text = Format(CInt(tmpNumber.ToString("000")))
lblComment_ID.Text = Format(CInt(tmpNumber.ToString("000")))
Return
End With
End With
End Sub
Private Sub txtComment_ID_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtComment_ID.KeyPress
e.Handled = ClassCall.CurrencyOnly(txtComment_ID, e.KeyChar)
End Sub
End Class
เป็น From หน้าจอการทำงานที่ทำการทดสอบ
ตามที่ทำเครื่องหมาย Auto number ครับ ไม่รู้ทำผิดตรงไหน ถึงไม่ได้สักที ช่วยผมอีกที่นะคับ
Private Sub AutoRune()
Dim tmpNumber As Integer
Dim ComEdit As New OleDbCommand
Dim sqlCheckNumber As String
Dim price As Integer = 0
dataset = New DataSet
Dim i As Integer
strConn = "provider=Microsoft.Jet.oleDb.4.0;" & _
"Data Source=..\\Computer_CheckcoseEmployees.mdb"
With Conn
If .State = ConnectionState.Open Then .Close()
.ConnectionString = strConn
.Open()
sqlCheckNumber = "SELECT Top 1 Comment_ID FROM Comment ORDER BY Comment_ID Desc"
With ComEdit
.CommandType = CommandType.Text
.CommandText = sqlCheckNumber
.Connection = Conn
tmpNumber = .ExecuteScalar()
txtComment_ID.Text = Format$(tmpNumber + 1, ("000"))
lblComment_ID.Text = Format$(tmpNumber + 1, ("000"))
End With
End With
End Sub
Sub AutoRune() เป็นแค่การดึง ID ล่าสุดมาแสดงใช้ไหมครับ
ทีนี้ลองมาดู ขั้นตอนการทำงานว่ามันน่าจะผิดตรงไหน จริงๆ ผมไม่รู้ Loop การทำงานของ Programs เลยว่าทำงานยังไง
อย่าง Event Save ก็ไม่มีการปิด Connection อาจเป็นเหตุให้ Data Save ไม่จบ หรือเรื่อง การใช้ Sub AutoRune() ดึง ID แบบเกินความจำเป็นจริงๆดึงครั้งเดียวแล้วมาเก็บไว้ใน ตัวแปรแล้ว Control ที่ตัวแปร น่าจะเปลื่องทรัพยากรน้อยกว่า
ลอง Focus ไปที่ Event Add เห็นว่าทุกครั้งที่มีการดึง ID ต้องใช้ Sub AutoRune การที่ได้ ID 10 แสดงว่าข้อมูลใน Database มีแค่ 9 แล้ว 10 ที่ Add ไปก่อนหน้าหายไปไหน ทำไมจึงหายไป หายเพราะไม่ได้ Save หรือ Save แล้วไม่ได้รับ ทดลองตรวจสอบดูครับ
Ok ได้แล้วครับ ไม่ได้ไปดูใน Data base Save ชนิดข้อมูลเป็น Text มันเลยไม่ทำให้ คับ
ต้องเปลี่ยน จาก Text เป็น Number ก้อได้แล้วคับ ขอบคุณครับสำหรับทุก ๆ คำตอบ ขอบคุณมาก ๆ คับผม
Date :
2010-11-30 12:47:43
By :
angelrings0
No. 24
Guest
^_^
Date :
2010-11-30 13:18:10
By :
ตังค์แมน
No. 25
Guest
ดีนะที่มันเป็น access นี่ถ้าเป็นพวก client server แล้ว user request id พร้อมกันทีละหลายคน
Private Sub SelectMax()
Dim ItemID As Integer
sqlItem = New SqlCommand("select MAX( ชื่อฟิลที่อยากเอาออกมา ) FROM ชื่อตาราง ", Conn)
Dim readerA As SqlDataReader = sqlItem.ExecuteReader()
While readerA.Read()
ItemID = CInt(readerA(0))
ItemID = ItemID + 1
tbItemID.Text = CStr(ItemID)
End While
readerA.Close()
End Sub
การทำเลขรหัส Auto Run ครับลองเอาไปประยุกดู แต่ผมทำให้ฐานข้อมูล ของ MySql นะ
สั้น ๆ เผื่อจะช่วยได้
Public Sub DisplayMaxID()
Dim iMaxID As Integer
Dim CDB As New MySqlCommand
With CDB
.Connection = Con_CallData
.CommandText = "SELECT MAX(Id_Billnum) FROM db_by_supplier"
If IsDBNull(.ExecuteScalar()) = True Then
iMaxID = 1
Else
iMaxID = .ExecuteScalar() + 1
End If
lblId_Billnum.Text = iMaxID.ToString("000000")
End With
End Sub
คือทำการรัน ID Auto แต่เมื่อเราแก้ไข หรือลบข้อมูลนั้นไป เราต้องการบันทึกใหม่แต่ระบบไม่รัน ID Auto ต่อจาก ID ตัวสุดท้ายให้ แต่กลับรันเป็น 0 แทน พอเพิ่มอีกครั้ง ID กลับไม่รันให้