ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 8965|ตอบกลับ: 6

แจกฟรี Source Code VB6+Access โปรแกรมระบบฐานข้อมูลครุภัณฑ์ ภาคเขียนโปรแกรม

[คัดลอกลิงก์]

311

กระทู้

502

โพสต์

6050

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6050


หน้าตาเมื่อรันโปรแกรม ...

รายละเอียดของรายการครุภัณฑ์

เวลาผ่านมาอย่างยาวนานถึง 8 ปีแล้ว กับการที่แอดมินได้เริ่มต้นในการแจกโค้ด Visual Basic 6 แบบฟรีๆ โปรเจคระบบฐานข้อมูลครุภัณฑ์ ซึ่งแอดมินใช้ Component มาตรฐานของ Microsoft หากเป็นงานจริงๆจะหรูเริ่ดกว่านี้เยอะครับ 5555+ ... ก่อนอื่นต้องขอชี้แจงเกี่ยวกับการออกแบบในโปรเจคตัวนี้กันสักเล็กน้อย เพราะเมื่อหลายท่านได้ดาวน์โหลดโค้ดโปรแกรมไป ก็คงจะต้องมีคำถามเกิดขึ้นในใจว่า ทำไมแอดมินถึงได้ออกแบบตารางข้อมูลในลักษณะเยี่ยงนี้???


ข้อมูลครุภัณฑ์ในส่วนงานภาครัฐ โดยเฉพาะสถานศึกษา เขามักจะมี Detail หรือรายละเอียดต่างๆของวัสดุครุภัณฑ์ที่ซ้ำซ้อนกันมาก สิ่งที่แตกต่างกันก็คือ รหัสครุภัณฑ์ เท่านั้นเอง เช่น ชื่อครุภัณฑ์ว่า คอมพิวเตอร์แบบตั้งโต๊ะ ซึ่งจัดวางอยู่ใน ห้องปฏิบัติการหมายเลขนี้ มันมีจำนวนอยู่ 40 ชุดที่เหมือนกันเลย เพราะเวลาจัดซื้อจัดจ้างในแต่ละครั้ง ก็มักจะเหมารวมกันมาเป็นแบบเข่งๆ ทีนี้ในส่วนของผู้พัฒนาโปรแกรมต้องคิดอย่างแรกเลยว่า จะทำอย่างไรให้ผู้ใช้งานเขาสะดวกในการคีย์ข้อมูล??? เอ้า แค่นี้ยังไม่พอ เนื่องจากข้อมูลมันเกิดความซ้ำซ้อน แล้วเราจะทำอย่างไรจึงจะสามารถลดความซ้ำซ้อนนี้ลงไปได้ ... ก็เลยเกิดการเชื่อมโยงความสัมพันธ์ของตารางข้อมูลต่างๆตามภาพที่ปรากฏ และนำมาใช้ในงานนี้ ...

แอดมินจะขอตัดบางส่วนที่คิดว่าเป็นจุดสำคัญๆ มาเน้นย้ำเพื่ออธิบายให้เท่านั้นนะครับ ...

การโหลดค่าจากตารางย่อย (Detail) คือพวกกลุ่มตารางข้อมูลต่างๆที่อยู่รายรอบตารางหลัก tblAsset


จากฟอร์ม frmAssetDetail ให้ไปดูโปรแกรมย่อย RecordToScreen ...
  1.         ' ชื่อหลักของครุภัณฑ์ ...
  2.         ' ไปโปรแกรมย่อยในการโหลดรายการต่างๆของตารางย่อย (Detail) เข้าสู่ ComboBox ค่าที่ส่งไปมี
  3.         ' ชื่อ ComboBox, ชื่อตาราง, ชื่อ Field ที่เป็น Primary Key, ชื่อฟิลด์ที่เป็นรายการ
  4.         Call LoadComboBox( _
  5.                 cmbAssetName, _
  6.                 "tblAssetName", _
  7.                 "AssetNamePK", _
  8.                 "AssetName" _
  9.                 )
คัดลอกไปที่คลิปบอร์ด
การเรียกไปยังโปรแกรมย่อยที่ชื่อ LoadComboBox โดยที่มีพารามิเตอร์ต่างๆที่ส่งไปยัง Sub Program
  1. ' Load รายการเข้าสู่ ComboBox ค่าที่ต้องส่งมา 4 ชุด คือ
  2. ' ชื่อ ComboBox, ชื่อตาราง, ชื่อฟิลด์ Primary Key และ ชื่อฟิลด์รายการ
  3. Sub LoadComboBox( _
  4.     cmb As ComboBox, _
  5.     tblName As String, _
  6.     FieldPK As String, _
  7.     FieldName As String _
  8.     )
  9.    
  10.     Set DS = New ADODB.Recordset
  11.     SQLStmt = "SELECT * FROM " & tblName & " ORDER BY " & FieldName
  12.     Set DS = ConnDB.Execute(SQLStmt, , adCmdText)
  13.    
  14.     cmb.Clear
  15.     Do Until DS.EOF
  16.         cmb.AddItem "" & DS(FieldName)
  17.         DS.MoveNext
  18.     Loop
  19.     DS.Close:    Set DS = Nothing
  20. End Sub
คัดลอกไปที่คลิปบอร์ด

การค้นหาคำ และการจำกัดความยาวในการป้อนข้อมูลลงใน ComboBox ...

  1. ' =========================================================
  2. ' โปรแกรมย่อยในการค้นหาคำในรายการของ ComboBox
  3. Private Sub SearchComboBox(cmb As ComboBox, KeyAscii As Integer)
  4. ' =========================================================
  5. Dim strKey As String, iRet As Long, LenKey As Long
  6.     cmb.SelText = ""
  7.     strKey = cmb.Text & Chr$(KeyAscii)
  8.     iRet = SendMessage(cmb.hwnd, CB_FINDSTRING, -1, ByVal strKey)
  9.     If iRet <> CB_ERR Then
  10.         LenKey = Len(strKey)
  11.         cmb.Text = cmb.List(iRet)
  12.         cmb.ListIndex = iRet
  13.         KeyAscii = 0
  14.         cmb.SelStart = LenKey
  15.         cmb.SelLength = Len(cmb.Text) - LenKey
  16.     End If

  17. End Sub
  18. ' =========================================================
คัดลอกไปที่คลิปบอร์ด
การค้นหาคำใน ComboBox ... ในระดับขั้นสูง เราหลีกเลี่ยงไม่พ้นที่จะต้องใช้งาน Win API ... (อ่านรายละเอียดได้ที่นี่)

  1. ' =========================================================
  2. ' ฟังค์ชั่นที่ช่วยจำกัดความยาวข้อมูลสำหรับ ComboBox
  3. Private Sub MaxComboBox(cmb As ComboBox, MaxChar As Integer, KeyAscii As Integer)
  4. ' =========================================================
  5.      If Len(cmb.Text) >= MaxChar Then ' ถ้าหากมีความยาวมากกว่า หรือ เท่ากับที่ได้ตั้งไว้
  6.          If KeyAscii <> vbKeyBack Then ' เป็นการกดคีย์ Back Space หรือไม่
  7.               KeyAscii = 0 ' ไม่ใช่ให้ถือว่าไม่ได้กดคีย์ใดๆเลย
  8.          End If
  9.     End If
  10. End Sub
  11. ' =========================================================
คัดลอกไปที่คลิปบอร์ด
การจำกัดความยาวที่จะพิมพ์ลงใน ComboBox

การบันทึกข้อมูล แบ่งออกได้ 2 ลักษณะ คือ
1. การเพิ่มข้อมูลใหม่ ส่วนนี้สาระสำคัญ คือ การหา Primary Key ตัวใหม่ และ AssetID ต้องไม่ไปซ้ำกับของเดิม
2. การแก้ไขข้อมูล สาระสำคัญต้องไม่ให้การแก้ไขแล้ว AssetID มีค่าซ้ำกับของเดิม

  1. Private Sub cmdSave_Click()
  2.     ' AssetID
  3.     If Trim(txtAssetID.Text) = "" Or Len(Trim(txtAssetID.Text)) = 0 Then
  4.         MsgBox "กรุณาป้อนทะเบียนครุภัณฑ์ให้เรียบร้อยก่อนด้วย.", vbOKOnly + vbExclamation, "รายงานสถานะ"
  5.         txtAssetID.SetFocus
  6.         Exit Sub
  7.     End If
  8.     If Trim(cmbAssetName.Text) = "" Or Len(Trim(cmbAssetName.Text)) = 0 Then
  9.         MsgBox "กรุณาป้อนชื่อรายการครุภัณฑ์ให้เรียบร้อยก่อนด้วย.", vbOKOnly + vbExclamation, "รายงานสถานะ"
  10.         cmbAssetName.SetFocus
  11.         Exit Sub
  12.     End If
  13.     '
  14. ' ตรวจสอบการซ้ำกันของรหัสทะเบียนครุภัณฑ์
  15. ' =================================================================
  16. ' มันมีโอกาสเป็นได้ 2 กรณี คือ
  17. ' เพิ่มข้อมูลใหม่ - ทำให้ txtAssetID.Text จะไม่ตรงกันกับ txtAssetID.Tag (ค่านี้จะต้องว่าง)
  18. ' แก้ไขข้อมูล - มีโอกาสได้ 2 ทาง คือ
  19. '      1. ไม่มีการแก้ไขค่าใน txtAssetdID.Text จะทำให้ txtAssetID.Text = txtAssetID.Tag
  20. '           ดังนั้นไม่ต้องไปเสียเวลาทำการเปรียบเทียบค่าเดิมในฐานข้อมูล
  21. '      2. มีการแก้ไขค่าใน txtAssetID.Text ดังนั้น txtAssetID.Text <> txtAssetID.Tag ทำให้
  22. '          ต้องนำค่าไปตรวจสอบว่ามีค่า txtAssetID.Text (ที่เปลี่ยนไป) ไปซ้ำกับค่าเดิมในฐานข้อมูลหรือไม่
  23. ' เขียน VB มานับ 10 ปี ... เทคนิคง่ายๆนี้ ผมก็ยังใช้งานได้ไม่เปลี่ยนแปลงทั้ง VB6 หรือ VB.Net
  24. ' =================================================================
  25. If txtAssetID.Text <> txtAssetID.Tag Then
  26.     If CheckNewCode > 0 Then
  27.         MsgBox "มีทะเบียนครุภัณฑ์: " & Trim(txtAssetID.Text) & " เรียบร้อยแล้ว กรุณาแก้ไขใหม่ด้วย.", _
  28.                             vbOKOnly + vbExclamation, "รายงานสถานะ"
  29.         txtAssetID.SetFocus
  30.         Exit Sub
  31.     End If
  32. End If
  33. ' ================================
  34. ' ไปบันทึกข้อมูลได้เลย
  35. Call SaveData
  36. ' ================================

  37. End Sub
คัดลอกไปที่คลิปบอร์ด
ก่อนจะทำการบันทึกข้อมูล เราต้องทำการ Validate Data ให้เรียบร้อยก่อน

  1. ' ฟังค์ชั่นตรวจสอบการซ้ำกันของทะเบียนครุภัณฑ์ (หรืออื่นๆ) กรณีข้อมูลเป็น Text
  2. ' จากนั้นส่งค่ากลับ หากเป็น 0 แสดงว่าไปไม่เกิดการซ้ำกันของข้อมูล
  3. ' ค่าส่งกลับมากกว่า 0 ... เกิดการซ้ำกัน จะต้องบังคับไม่สามารถเพิ่ม หรือ แก้ไขข้อมูลได้
  4. Function CheckNewCode() As Long
  5.     Set DS = New Recordset
  6.     SQLStmt = "SELECT * FROM tblAsset  WHERE AssetID = " & "'" & Trim(txtAssetID.Text) & "'" & _
  7.                             " ORDER BY AssetPK "
  8.    
  9.     ' หากไม่ระบุเป็น adUseClient จะใช้ค่าเดิมที่ตั้งต้น (Default) เป็นแบบ adUseServer
  10.     ' การใช้แบบ adUseClient เพื่อต้องการให้ใช้เมธอดของการนับ Record ได้ นั่นคือ
  11.     ' DS.RecordCount
  12.     DS.CursorLocation = adUseClient
  13.     DS.Open SQLStmt, ConnDB, adOpenForwardOnly, adLockReadOnly, adCmdText
  14.     CheckNewCode = DS.RecordCount
  15.     DS.Close:    Set DS = Nothing
  16. End Function
คัดลอกไปที่คลิปบอร์ด
ค่าทะเบียนครุภัณฑ์จะมีค่าที่ซ้ำกันไม่ได้

การบันทึกข้อมูล ... (หลักการที่แอดมินใช้ใน VB6 จึงถูกนำไปใช้กับ VB.NET ได้ต่อทันที)
  1. ' ==================== การบันทึกข้อมูล =======================
  2. Private Sub SaveData()
  3. Set RS = New Recordset
  4.     If NewData Then
  5.         ' ค้นหาค่า PK ก่อน
  6.         Call SetupNewData
  7.         '
  8.         Statement = "SELECT * FROM tblAsset ORDER BY AssetPK"
  9.         RS.Open Statement, ConnDB, adOpenKeyset, adLockOptimistic, adCmdText
  10.         RS.AddNew
  11.         RS("AssetPK") = PK
  12.         RS("DateAdded") = FormatDateTime(Now(), vbShortDate)
  13.         RS("DateModified") = FormatDateTime(Now, vbShortDate)
  14.     '========== แก้ไขข้อมูล
  15.     Else
  16.         '
  17.         Statement = "SELECT * FROM tblAsset WHERE AssetPK = " & PK
  18.         RS.Open Statement, ConnDB, adOpenKeyset, adLockOptimistic, adCmdText
  19.     End If
  20.     '
  21.     RS("AssetID") = "" & Trim(txtAssetID.Text)
  22.     RS("SerialNumber") = "" & Trim(txtSerialNumber.Text)
  23.     RS("Model") = "" & Trim(txtModel.Text)
  24.     RS("Class") = "" & Trim(txtClass.Text)
  25.     RS("DateReceived") = FormatDateTime(dtpDateReceived.Value, vbShortDate)
  26.     '
  27.     ' ตรวจสอบค่าใน ComboBox
  28.     ' ชื่อครุภัณฑ์ โดยการส่งค่าไปตรวจสอบหาค่า Primary Key ของตารางย่อย (Detail) ค่าที่ส่งไป มี
  29.     ' ชื่อ ComboBox, ชื่อตาราง, Field ที่เป็น PK, Field ที่เป็นรายการ (ค่าที่ต้องทดสอบหา Primary Key)
  30.     RS("AssetNameFK") = VerifyComboBox( _
  31.                                                             cmbAssetName, _
  32.                                                             "tblAssetName", _
  33.                                                             "AssetNamePK", _
  34.                                                             "AssetName" _
  35.                                                             )
  36.    
  37.     ' ยี่ห้อ - BrandName
  38.     ' ชื่อครุภัณฑ์ โดยการส่งค่าไปตรวจสอบหาค่า Primary Key ของตารางย่อย (Detail) ค่าที่ส่งไป มี
  39.     ' ชื่อ ComboBox, ชื่อตาราง, Field ที่เป็น PK, Field ที่เป็นรายการ (ค่าที่ต้องทดสอบหา Primary Key)
  40.     RS("BrandNameFK") = VerifyComboBox( _
  41.                                                         cmbBrandName, _
  42.                                                         "tblBrandName", _
  43.                                                         "BrandNamePK", _
  44.                                                         "BrandName" _
  45.                                                         )
  46.     ' กลุ่ม
  47.     RS("GroupNameFK") = VerifyComboBox(cmbGroupName, "tblGroup", "GroupNamePK", "GroupName")
  48.     ' หน่วยนับ
  49.     RS("UnitFK") = VerifyComboBox(cmbUnitName, "tblUnit", "UnitPK", "UnitName")
  50.     ' แหล่งเงิน
  51.     RS("SourceFK") = VerifyComboBox(cmbSourceName, "tblSource", "SourcePK", "SourceName")
  52.     ' สถานะของครุภัณฑ์
  53.     RS("StatusFK") = VerifyComboBox(cmbStatusName, "tblStatus", "StatusPK", "StatusName")
  54.     ' สถานที่ใช้งาน หรือ เก็บ
  55.     RS("LocationFK") = VerifyComboBox(cmbLocationName, "tblLocation", "LocationPK", "LocationName")
  56.    
  57.     If txtUnitPrice.Text <> "" And Val(txtUnitPrice.Text) >= 0 Then
  58.         RS("UnitPrice") = CCur(txtUnitPrice.Text)
  59.     Else
  60.         RS("UnitPrice") = 0#
  61.     End If
  62.     '
  63.     RS("Reference") = "" & Trim(txtReference.Text)
  64.     RS("Memo") = "" & Trim(txtMemo.Text)
  65.     RS("DateModified") = FormatDateTime(Now(), vbShortDate)
  66.     RS.Update
  67.     '
  68.     RS.Close: Set RS = Nothing
  69.     '
  70.     NewData = False
  71.     ' ส่งค่าไปบอกฟอร์มหลักให้ Refresh
  72.     FormUpdate = True
  73.     MsgBox "บันทึกเข้าสู่ระบบงานฐานข้อมูลเรียบร้อย.", vbOKOnly + vbInformation, "รายงานสถานะ"
  74.     Unload Me
  75.    
  76. End Sub
คัดลอกไปที่คลิปบอร์ด

โปรแกรมย่อยในการสร้าง Primary Key ให้กับรายการครุภัณฑ์
  1. ' ===================== สร้าง Record ใหม่ ==========================
  2. ' ต้องคำนวณหาค่า Primary Key ให้เรียบร้อยก่อน
  3. Sub SetupNewData()
  4. Dim Rec As Long
  5. Set DS = New Recordset
  6.     ' นำข้อมูลจากตารางมาคำนวณหาค่าสูงสุด
  7.     SQLStmt = "SELECT Max(tblAsset.AssetPK) As MaxPK FROM tblAsset "
  8.     DS.Open SQLStmt, ConnDB, adOpenForwardOnly, adLockReadOnly, adCmdText
  9.     ' หากไม่พบข้อมูลจะทำให้เกิดค่า Null ดังนั้นต้องดัก Error เอาไว้ก่อนด้วย
  10.     If IsNull(DS("MaxPK")) Then
  11.         PK = 1
  12.     Else
  13.         PK = DS("MaxPK") + 1
  14.     End If
  15.     DS.Close: Set DS = Nothing

  16. End Sub
คัดลอกไปที่คลิปบอร์ด

จะมีฟังค์ชั่นที่สำคัญอยู่ตัวหนึ่ง VerifyComboBox ซึ่งต้องใช้งานกับ ComboBox หลายๆตัวก่อนทำการบันทึกข้อมูล (แอดมินถึงต้องสร้างฟังค์ชั่นขึ้นมาใหม่)
  1. ' ฟังค์ชั่นที่ใช้ในการตรวจสอบค่าที่อยู่ใน ComboBox เพื่อค้นหาค่า Primary Key ในตารางย่อย
  2. Function VerifyComboBox( _
  3.     cmb As ComboBox, _
  4.     tblName As String, _
  5.     FieldPK As String, _
  6.     FieldName As String _
  7.     ) As Integer

  8.     Dim CountRec As Integer    ' ไว้นับจำนวนของตารางย่อย
  9.     ' ตรวจสอบว่ามีการป้อนข้อมูลหรือไม่ หากไม่มีให้กำหนดค่า Default เป็น 0
  10.     ' จากนั้น Return ค่ากลับ และออกจากฟังค์ชั่นไปเลยครับพี่น้อง ... เพื่อเป็นการไม่เสียเวลา
  11.     If cmb.Text = "" Or Len(cmb.Text) = 0 Or cmb.Text = "-" Then
  12.         VerifyComboBox = 0
  13.         Exit Function
  14.     End If
  15.     '// เป็นการตัดการเชื่อมต่อ RecordSet ของเดิมทิ้ง
  16.     Set DS = New Recordset
  17.     SQLStmt = "SELECT * FROM " & tblName & " WHERE " & FieldName & " = " _
  18.                         & "'" & Trim(cmb.Text) & "'" & _
  19.                         " ORDER BY " & FieldPK
  20.     '/ ======================================================================
  21.     '/ หลายคนมักทำผิด และมองข้ามมันไป สำหรับการเขียน SQL Statement
  22.     '/ SQL Statement ... การค้นหาค่าโดยการเปรียบเทียบกับข้อมูลชนิดข้อความ Text หรือ String
  23.     '/ SELECT * FROM ... WHERE ฟิลด์แบบข้อความ = '1020' ... (อ่านว่า หนึ่ง ศูนย์ สอง ศูนย์)
  24.     '/ เวลาเขียน Statement จะต้องเขียนค่าที่นำมาเปรียบเทียบให้อยู่ภายใต้เครื่องหมาย Single Quote (') เช่น
  25.     '/ "SELECT * FROM ... WHERE AssetID = " & "'" & txtAssetID.Text & "'" ... จดจำรูปแบบนี้ให้ดี
  26.     '/ ส่วนกรณีของตัวเลขไม่ต้องมีเครื่องหมาย Single Quote เช่น
  27.     '/ SELECT * FROM ... WHERE AssetPK = 1020 (อ่านว่า หนึ่งพันยี่สิบ) เช่น
  28.     '/ "SELECT * FROM ... WHERE AssetPK = " & txtAssetPK.Text
  29.     '/ ======================================================================
  30.    
  31.     DS.CursorLocation = adUseClient
  32.     DS.Open SQLStmt, ConnDB, adOpenForwardOnly, adLockReadOnly, adCmdText
  33.     CountRec = DS.RecordCount
  34.    
  35.     ' แสดงว่าไม่มีในรายการ ดังนั้นเราต้องเพิ่มรายการเข้าไปใหม่ในตารางย่อย
  36.     If CountRec <= 0 Then
  37.         Set DS = New Recordset
  38.         SQLStmt = "SELECT Max(" & tblName & "." & FieldPK & ") As MaxPK " & " FROM " & tblName
  39.         DS.CursorLocation = adUseClient
  40.         DS.Open SQLStmt, ConnDB, adOpenForwardOnly, adLockReadOnly, adCmdText
  41.         ' เพิ่มค่า Primary Key ของตารางย่อย (Detail) ขึ้นอีก 1
  42.         CountRec = DS("MaxPK") + 1
  43.         
  44.         ' การที่ผมไม่สั่งปิดตารางข้อมูล DS.Close ก็เพราะคำสั่ง Set DS = New Recordset
  45.         ' มันจะตัดการชื่อมต่อเดิมออกไปในทันทีได้เลยครับ ... ไม่ต้องห่วง
  46.         Set DS = New Recordset
  47.         SQLStmt = "SELECT * FROM " & tblName & " ORDER BY " & FieldPK
  48.         DS.Open SQLStmt, ConnDB, adOpenKeyset, adLockOptimistic, adCmdText
  49.         DS.AddNew
  50.         DS(FieldPK) = CountRec
  51.         DS(FieldName) = cmb.Text
  52.         DS.Update
  53.         ' ส่งค่า PK กลับไปเพื่อบันทึกข้อมูล
  54.         VerifyComboBox = CountRec
  55.         
  56.     ' มีข้อมูลเดิมอยู่แล้ว
  57.     Else
  58.         ' ส่งค่า PK กลับไปเพื่อบันทึกข้อมูล
  59.         VerifyComboBox = DS(FieldPK)
  60.     End If
  61.     DS.Close:    Set DS = Nothing
  62. End Function
คัดลอกไปที่คลิปบอร์ด
Conclusion: แอดมินก็คาดหวังเล็กๆว่า คงพอที่จะทำให้พี่น้องหลายท่านได้แนวคิด ได้มุมมองแปลกๆใหม่ๆเอาไว้ในอ้อมกอด อ้อมใจ กันบ้างพอสมควรนะครับ ... สวัสดี
ดาวน์โหลดโค้ด VB6 (SP6) ต้นฉบับแบบเต็มๆได้ที่นี่

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

0

กระทู้

2

โพสต์

13

เครดิต

Newbie

Rank: 1

เครดิต
13
โพสต์ 2019-1-23 11:31:13 | ดูโพสต์ทั้งหมด

ขอบคุณมากมายครับ

0

กระทู้

1

โพสต์

16

เครดิต

Newbie

Rank: 1

เครดิต
16
โพสต์ 2019-5-14 14:18:42 | ดูโพสต์ทั้งหมด

ขอบคุณครับ

0

กระทู้

5

โพสต์

18

เครดิต

Newbie

Rank: 1

เครดิต
18
โพสต์ 2019-9-16 14:21:50 | ดูโพสต์ทั้งหมด

อาจารย์ครับ  ผมอยากได้ การรับค่าจากเครื่องยิง บาร์โค๊ด  พอจะมีไหมครับ

311

กระทู้

502

โพสต์

6050

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6050
 เจ้าของ| โพสต์ 2019-9-17 10:57:55 | ดูโพสต์ทั้งหมด

Artkummool ตอบกลับเมื่อ 2019-9-16 14:21
อาจารย์ครับ  ผมอยากได้ การรับค่าจากเครื่องยิง บาร์โค๊ด  พอจะมีไหมครับ

ปกติเครื่องอ่านบาร์โค้ดแบบแท่ง มันสามารถอ่านรหัสแท่ง แล้วแปลงเป็นชุดรหัสตัวอักษร ตัวเลขได้ทันทีเลยครับ
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

0

กระทู้

4

โพสต์

28

เครดิต

Newbie

Rank: 1

เครดิต
28
โพสต์ 2020-2-21 10:44:54 | ดูโพสต์ทั้งหมด

ขอบคุณครับ

0

กระทู้

58

โพสต์

10

เครดิต

Member

Rank: 2

เครดิต
10
โพสต์ 2022-10-25 14:48:51 | ดูโพสต์ทั้งหมด

ขอบคุณครับ
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-4-25 22:53 , Processed in 0.405734 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้