Private Sub cmdSave_Click()
Dim i As Integer
If txtCurrency.Visible = True Then txtCurrency.Visible = False
' เริ่มจุดเทียนเวียนวนตามจำนวนแถวของ MS FlexGrid - 1 (ลบออก 1 แถว คือ Column Header)
For i = 1 To fg.Rows - 1
Set RS = New ADODB.Recordset
' โปรดสังเกตว่าเราจะทำการบันทึกข้อมูลเฉพาะราคาสินค้า (PriceUnit) เท่านั้นเองน่ะครับ
' และที่สำคัญ Primary Key (PK) ที่ถูกซ่อนเอาไว้ จะถูกนำออกมาใช้แล้ว ... แอ่นแอ้นนนนนน
' ทีนี้พ่อแม่พี่น้องที่เคารพ ... ได้มองเห็นภาพ Primary Key ที่แท้จริงกันแล้วหรือไม่ล่ะครับ
Statement = "SELECT tblProduct.PK, tblProduct.PriceUnit FROM tblProduct " & _
" WHERE [PK] = " & Val(fg.TextMatrix(i, 0))
ConnMyDB.CursorLocation = adUseClient
RS.Open Statement, ConnMyDB, adOpenKeyset, adLockOptimistic, adCmdText
' ป้องกันค่าว่าง ... ต้องทำการตรวจสอบก่อน
If Trim(fg.TextMatrix(i, 3) = "") Or Len(Trim(fg.TextMatrix(i, 3))) = 0 Then fg.TextMatrix(i, 3) = "0.00"
RS("PriceUnit") = Format(fg.TextMatrix(i, 3), "#,##0.00")
RS.Update
Next
MsgBox "บันทึกข้อมูลเรียบร้อย", vbOKOnly + vbInformation, "รายงานสถานะ"
End Sub
Private Sub fg_EnterCell() ' พิจารณาจากเหตุการณ์ (Event) ในการ Focus ตรงตำแหน่งใน Cell
Select Case fg.Col ' เลือก Column ที่ต้องการ
Case 0, 1, 2, 4 ' เราไม่ได้ป้อนข้อมูลในหลักที่ 0, 1, 2 และ 4
txtCurrency.Visible = False ' จึงต้องสั่งให้ปิดการมองเห็น txtCurrency
Case 3: ' โอเค ถูกต้อง Cell ที่กำลัง Focus มาอยู่หลักที่ 3 ก็เริ่มต้นกระบวนการทำงานได้
txtCurrency.Visible = True ' เปิดให้ txtCurrency มองเห็นได้
txtCurrency.Text = fg.Text ' ค่าเดิมที่อยู่ใน Cell จะถูกส่งต่อไปให้ txtCurrency เพื่อทำการแก้ไขต่อไป
' ขั้นตอนนี้คือการเลื่อนตำแหน่งของ txtCurrency ให้ไปทับอยู่บนตำแหน่งของ Cell (หลักที่กำหนด) ตามที่เราต้องการ
' การเคลื่อนที่ โดย fg.Move ตำแหน่งทางซ้าย, ตำแหน่งบน, ความกว้างของเซลล์, ความสูงของเซลล์
txtCurrency.Move (fg.Left + fg.CellLeft), (fg.Top + fg.CellTop), fg.CellWidth, fg.CellHeight
' เมื่อ txtCurrency เคลื่อนที่ไปทับตำแหน่ง Cell ที่เราต้องการแล้ว
' ให้ Focus ไปที่ txtCurrency เพื่อที่จะสามารถแก้ไขข้อมูลลงใน TextBox ได้
txtCurrency.SetFocus
End Select
End Sub
Private Sub Form_Load()
Dim sRow As Integer
Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
txtCurrency.Text = "" ' เคลียร์ค่าใน TextBox
Call SetupGrid ' สั่งตั้งค่า FlexGrid
Call OpenDataBase
Set RS = New ADODB.Recordset
' ขอยกตัวอย่างการเชื่อมความสัมพันธ์ระหว่างตาราง tblProduct (สินค้า) เข้ากับ ตาราง tblUnit (หน่วยนับ)
Statement = "SELECT tblProduct.PK, tblProduct.ProductCode, tblProduct.Description, " & _
" tblProduct.PriceUnit, tblUnit.UnitName " & _
" FROM tblUnit INNER JOIN tblProduct ON tblUnit.PK = tblProduct.UnitFK " & _
" ORDER BY tblProduct.PK "
ConnMyDB.CursorLocation = adUseClient
RS.Open Statement, ConnMyDB, adOpenKeyset, adLockOptimistic, adCmdText
' กำหนดจำนวนแถวของ MS FlexGrid ไว้ล่วงหน้า ตามจำนวนรายการ + 1
fg.Rows = RS.RecordCount + 1
sRow = 1
RS.MoveFirst
Do Until RS.EOF
With fg
.TextMatrix(sRow, 0) = RS("PK")
.TextMatrix(sRow, 1) = "" & Trim(RS("ProductCode"))
.TextMatrix(sRow, 2) = "" & Trim(RS("Description"))
.TextMatrix(sRow, 3) = Format(RS("PriceUnit"), "#,##0.00")
.TextMatrix(sRow, 4) = "" & Trim(RS("UnitName"))
End With
RS.MoveNext
sRow = sRow + 1
Loop
RS.Close: Set RS = Nothing
End Sub
Sub SetupGrid() ' ตั้งค่าต่างๆของ FlexGrid
With fg
.Clear ' สั่ง Clear FlexGrid
.Cols = 5 ' การกำหนดในรูปแบบของ Run Time ฮับผม
' ===============================================================
' หลักแรก หรือ หลัก 0 ต้องซ่อนค่า Primary Key เอาไว้ ไม่ให้ผู้ใช้งานเห็น ... เดี๋ยวผู้ใช้งานสับสน
' แต่ค่านี้แหละสำคัญ ... ซึ่งเราต้องนำไปอ้างอิงตอนทำการบันทึกข้อมูล
' ความลับมันไม่มีอยู่ในโลก ... ผมจึงเปิดเผยออกมา ... อิอิอิอิอิ ... โปรดให้อภัยผมด้วยน่ะครับพี่น้อง
.TextMatrix(0, 0) = "PK"
' ===============================================================
.TextMatrix(0, 1) = "รหัสสินค้า"
.TextMatrix(0, 2) = "สินค้า"
.TextMatrix(0, 3) = "ราคา"
.TextMatrix(0, 4) = "หน่วย"
.ColWidth(0) = 0
.ColWidth(1) = .Width \ 4 - 600
.ColWidth(2) = .Width \ 4 + 1600
.ColWidth(3) = .Width \ 4 - 600
End With
End Sub
Private Sub txtCurrency_Change()
' เมื่อ txtCurrency เกิดการเปลี่ยนแปลง ก็จะส่งค่าให้กับ Cell ที่เราต้องการด้วย
' แต่ ณ ขณะนี้เรายังมองไม่เห็นหรอกครับ เพราะ txtCurrency มันทับ Cell ไว้อยู่
fg.Text = Format(txtCurrency.Text, "#,##0.00")
End Sub
Private Sub txtCurrency_GotFocus()
' ผมไม่ต้องการให้มีเครื่องหมายคอมม่า (,) มาปรากฏ ซึ่งมันจะยากต่อการควบคุมโปรแกรม
' ดังนั้นเมื่อ txtCurrency รับการ Focus จึงต้องแก้ไขรูปแบบการแสดงผลใหม่
txtCurrency.Text = Format(txtCurrency.Text, "0.00")
End Sub
Private Sub txtCurrency_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyDown Or KeyCode = vbKeyUp Then
txtCurrency.Visible = False
fg.SetFocus
End If
End Sub
Private Sub txtCurrency_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
Select Case fg.Col
Case 3
KeyAscii = 0 ' ปิดเสียง
txtCurrency.Visible = False
' ป้องกันค่าว่าง ... ต้องทำการตรวจสอบก่อน
If Trim(txtCurrency.Text) = "" Or Len(Trim(txtCurrency.Text)) = 0 Then txtCurrency.Text = "0.00"
fg.SetFocus
End Select
Else
' ต้องส่งค่าไปทดสอบในฟังค์ชั่น CheckCurrency ก่อนว่ามีการกดปุ่มจุด . แล้วหรือยัง
KeyAscii = CheckCurrency(KeyAscii, txtCurrency)
End If
End Sub
Private Sub cmdExit_Click()
Call CloseDataBase
Set frmFlexGridCustom = Nothing
End
End Sub
' ฟังค์ชั่นที่ใช้ในการตรวจสอบการกดเครื่องหมายจุด .
Function CheckCurrency(Index As Integer, Ctrl As TextBox) As Integer
Select Case Index
Case 48 To 57
' 0 - 9 and Return index = KeyAscii
Case 8
' Back Space and Return index = KeyAscii
Case 13
' Enter and Return index = KeyAscii
Case 46 ' รหัส Ascii Code ของเครื่องหมายจุดครับพี่น้อง
If InStr(Ctrl, ".") Then Index = 0 ' ใช้ฟังค์ชั่น InStr (In String) เพื่อหาเครื่องหมายจุดใน TextBox
Case Else
Index = 0
End Select
CheckCurrency = Index ' Return ค่ากลับตามที่ได้ตรวจสอบ
End Function
|