แสดงกระทู้

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - TTT

หน้า: 1 2 3 4 [5] 6 7
74
โค๊ด: [Select]
Function CheckFont(fontName As String, Optional fontSize As Integer) As Boolean
    On Error Resume Next
    With New StdFont
        .Name = fontName
        If fontSize > 0 Then .Size = fontSize
        CheckFont = (StrComp(fontName, .Name, vbTextCompare) = 0)
        fontName = .Name
        fontSize = .Size
    End With
End Function
<การใช้งาน> CheckFont(ชื่อฟอนต์, ขนาดฟอนต์ (กำหนดหรือไม่ก็ได้))
CheckFont("พส. พิมพ์ดีด ๒ ใหม่", 12)
หรือ
CheckFont("พส. พิมพ์ดีด ๒ ใหม่")
 
Return:
True  คือ มีฟอนต์ชื่อ "พส. พิมพ์ดีด ๒ ใหม่" อยู่ในเครื่องแล้ว และใช้ขนาด 12 ได้
False คือ ไม่มีฟอนต์ชื่อ "พส. พิมพ์ดีด ๒ ใหม่" อยู่ในเครื่อง หรือใช้ขนาด 12 ไม่ได้


75
ตามความเห็นผม ผมว่าไม่น่าเกี่ยวกับคำสั่งอะไรแล้วหละครับ ถ้า Network ติดต่อได้บ้างไม่ได้บ้างนี่น่าจะเป็นที่ระบบ Network มากกว่า ต้องหาสาเหตุว่าทำไมติดต่อได้แล้วมันควรจะติดต่อได้ตลอดไป เหมือน Network ไม่เสถียรอะครับ หรืออาจเป็นเรื่อง Traffic ของการแย่งกันใช้ทำให้เกิด time out ถ้าเป็นงั้นอาจต้องหันไปใช้พวก My SQL หรือ SQL Server ที่มีระบบจัดการการ Traffic ได้ดีกว่าการแชร์ไฟล์ธรรมดาดูครับ

76
งั้นก็ไม่มีอะไรซับซ้อนครับ ลองดูได้ เปลี่ยนพาธที่ลิ้งค์ตารางที่แชร์มาจากเดิมเป็น
S:\PSSGUIDE-BackEnd.accdb
ให้เปลี่ยนเป็นชื่อ IP ของ Server หรือชื่อ Server ก็ได้ แบบนี้แทนครับ
\\192.168.1.1\PSSGUIDE-BackEnd.accdb
หรือ
\\ชื่อ Server\PSSGUIDE-BackEnd.accdb

อื่ม! แต่ผมว่านะ มันเป็นแค่ตอนเปิดเครื่องแสดงว่ามันก็แค่ยังช้าตรงการ Map จะรอสักพักให้ Windows มัน Map ไดร์ฟเสร็จก่อนมันก็ไม่มีปัญหาแล้วไม่ใช่หรือครับ หรือว่ามันนานมากๆ

77
อันนี้ไม่ทราบว่าคุณเองเป็นคนทำระบบ Server เองหรือป่าวครับ การเปลี่ยนพาธลิ้งค์ตาราง ผมมีทราบว่าถ้าไม่ Map Drive จะติดปัญหาเรื่อง Security ของระบบอะไรหรือไม่ เช่นถ้าไม่ Map Drive ทำเป็นการเรียกโดยตรงผ่าน Server มันจะถามรหัสผ่านทุกครั้งหรือไม่
- การติดต่อกับไฟล์ฐานข้อมูลบน Server ใช้ Driver อะไร หรือแชร์ไฟล์ธรรมดา
- Server ที่ใช้เป็นแบบ Domain Name หรือป่าว หรือ เป็นแค่เครื่องลง Windows ธรรมดาแล้วแค่แชร์

78
อื่ม! มันเป็นเรื่องของการติดต่อกับ Server หรือครับ ค่าการ Ping ใช้เวลาเท่าไหร่ครับ และอาการนี้เป็นตอนเปิดเครื่องใหม่ๆ เท่านั้น หรือเป็นตลอด จริงๆ แล้วผมไม่นิยมการ Map Drive เลยถ้าไม่จำเป็นจริงๆกับบ้างโปรแกรม ส่วนใหญ่ผมจะใช้วิธีการเรียกอ้าง IP ไปเลย หรือไม่ก็ชื่อ Server ผมว่าจะคร่องตัวกว่า เช่น

\\192.168.1.1\PSSGUIDE-BackEnd.accdb
หรือ
\\ชื่อ Server\PSSGUIDE-BackEnd.accdb

โดยไม่ต้อง Map Drive
แต่ปัญหาคุณน่าจะอยู่ที่เครื่องลูกติดต่อกับเซฟเวอร์ได้ช้ามากกว่านะ ต้องลองปรับแก้ที่ Network อะครับ ว่าทำไมมันช้า ผมเองก็ใช้ Windows 10 นะ ใช้ติดต่อกับเซฟเวอร์ทุกวันนี้ก็ไม่มีปัญหาเรื่องความช้านะครับ ยังไงลอง Ping ที่เครื่องลูกดูครับว่าใช้เวลานานเท่าไหร่

79
คือมันไม่มีความจำเป็น ทำให้โปรแกรมต้องมาทำ Decompile ทุกครั้ง

Compile เป็นตัวแปลภาษารูปแบบหนึ่ง  มีหน้าที่หลัก คือการแปลภาษาโปรแกรมที่มนุษย์เขียนขึ้นไปเป็นภาษาเครื่องที่คอมพิวเตอร์เข้าใจ และทำตามได้ ด้วยคอมไพเลอร์ของภาษานั้นๆ  ซึ่งหลักการที่คอมไพเลอร์ใช้  เรียกว่า  คอมไพล์ (compile) โดยจะทำการอ่านโปรแกรมภาษาทั้งหมดตั้งแต่ต้นจนจบ  แล้วทำการแปลผลทีเดียว
 
Decompile คือการบอกให้ MS Access ละทิ้งโค้ด VBA ที่ทำการคอมไพล์ ไม่ใช่คำสั่งต้นฉบับภาษาที่เราเขียนขึ้น แต่เป็นคำสั่งที่คอมไพล์ไปแล้ว ซึ่งคอมพิวเตอร์ปฎิบัติตามอยู่ โดยหวังว่าจะช่วยลดความเสียหายที่อาจเกิดขึ้นในคำสั่ง VBA จากการคอมไพล์ โดยการเริ่มต้นใหม่เพื่อล้างค่าต่างๆ ที่ได้เคยคอมไพล์ไปก่อนหน้านี้ทิ้งไป แล้วค่อยทำการคอมไพล์ใหม่อีกครั้ง

80
ทำครั้งเดียวพอครับ ทำกับไฟล์ฟอร์มใช้งานของเรา ไฟล์ที่เก็บ Database อย่างเดียวไม่ต้องทำครับ
โดยจะเป็นพารามิเตอร์ /decompile ใช้พิมพ์ต่อจากชื่อไฟล์ MS Access ของเรา ในการเรียกใช้งานไฟล์ แต่ต้องอ้างถึงไฟล์ MSAccess.exe โปรแกรมหลักด้วยนะครับ เช่น
"C:\Program Files (x86)\Microsoft Office\Office14\MSACCESS.EXE" /decompile D:\ชื่อไฟล์เรา.accdb
ทำเป็น Shortcut หรือ จะทำแบบ เมนู SentTo ตาม VDO ที่ผมทำให้ดูก็ได้ครับ https://youtu.be/knFHRm-bwos


81
ลองทำ decompile ดูยังครับ

82
1. สร้างฟังก์ชั่นลงใน Module
โค๊ด: [Select]
Function ConcatRelated(expression$, domain$, criterial$)
    Dim db As DAO.Database
    Dim rs As Recordset
    Dim SQLCmd As String
    Dim ConCat As String
 
    Set db = CurrentDb()
    SQLCmd = "SELECT " & expression$ & " FROM " & domain$ & " WHERE " & criterial$
    Set rs = db.OpenRecordset(SQLCmd)
 
    If Not rs.EOF Then
        rs.MoveFirst
    End If
 
    Do While Not rs.EOF
        ConCat = ConCat & rs(0) & "-" ' เครื่องหมายคั่น
        rs.MoveNext
    Loop
   
    If ConCat & "" <> "" Then
        ConcatRelated = Left(ConCat, Len(ConCat) - 2)
    End If
    rs.Close: Set rs = Nothing: Set db = Nothing
End Function

2. สร้างคิวรี่ใหม่ ใส่ SQL ประมาณนี้ครับ
โค๊ด: [Select]
SELECT DISTINCT Table.Job, ConcatRelated("[Name]","[Table]","[Job]='" & [Table].[Job] & "'") AS Name
FROM [Table];

3. นำคิวรี่นี้ไปสร้างเป็นรายงาน

ประมาณนี้ครับ ปรับใช้ดู

ปล. มีกระทู้คำถามประมาณนี้ลองศึกษาดูที่นี่ครับ https://www.thai-access.com/yeadram_view.php?topic_id=4015 หรือค้นหาใน Google คำว่า ConcatRelated จะเจอตัวอย่างมากมายครับ

83
อ.สันติสุข ช่วยขยายความได้ไหมครับ ที่ว่า "เมื่อมีการ Compact ฐานข้อมูลแล้ว ค่าของฟิลด์ Autonumber จะถูกจัดเรียงใหม่ให้ต่อเนื่องกันไปโดยไม่สนใจค่าเดิม" มันจะเกิดขึ้นกรณีไหนบ้างครับ นี่คือความรู้ใหม่ของผมเลยอะครับ เพราะเท่าที่ทราบ การ Compact จะทำให้ฟิลด์ AutoNumber รันลำดับใหม่แค่เรคคอร์ดสุดท้าย ให้ต่อเนื่องกันเท่านั้นเอง ไม่ได้ไปเรียงเรคคอร์ดใหม่ที่มีค่าอยู่แล้วหนิครับ แล้วในฐานข้อมูล Northwind ของทางไมโครซอฟเองก็ใช้ฟิลด์ AutoNumber ในการเชื่อมความสัมพันธ์กันแทบทุกตารางเลยครับ เลยอยากขอความเห็นของอาจารย์หน่อยครับ ว่ากรณีไหนบ้าง?
ปล. ขออภัยหากอ่านความหมายของ อาจารย์ผิดไปครับ

ใช่ครับ หมายถึงถ้ามีการลบกี่เรคอร์ดก็ตามที่มีค่า autonumber เรียงต่อเนื่องกันไปจนถึงเรคอร์ดที่มีค่า autonumber มากสุด หลัง compact ฐานข้อมูลหลักแล้ว (ฐานข้อมูลที่มีเทเบิลนั้นอยู่จริง ไม่ใช่ฐานข้อมูลที่เราสร้าง linked table) มันจะรันค่าของ autonumber ต่อจากค่าที่มากที่สุดใหม่อีกครั้ง ไม่ได้หมายถึงค่าเดิมที่บันทึกอยู่แล้วจะถูกสร้างใหม่ ทีนี้เนื่องจากการที่มันเป็นค่าที่ระบบสร้างขึ้นมาเอง เรคอร์ดที่สัมพันธ์กันจะเชื่อมั่นได้อย่างไรว่าจะอ้างกลับมายังเรคอร์ดเก่า (ที่ถูกลบไปแล้ว) หรือเรคอร์ดใหม่ที่มีเลข autonumber เดียวกับเรคอร์ดเก่า แต่ถ้าเราสร้างเลขเอง อันนี้เราเชื่อได้แน่ว่าเลขใหม่จะไม่ซ้ำกับเลขที่มีอยู่เดิม แต่ปัญหานี้ก็อาจหมดไป ถ้าเราระบุ Cascade delete record ให้กับความสัมพันธ์นั้นด้วยครับ

แต่อาจารย์ครับ ขอความรู้อีกนิดนะครับ ถ้าหากเราสร้างความสัมพันธ์ของตารางไว้แล้ว เมื่อมีการลบเรคคอร์ดที่มีความสัมพันธ์ ถึงจะไม่ได้ระบุ Cascade delete record ไว้ ระบบฐานขัอมูล มันจะไม่ยอมให้ลบได้อยู่แล้วหนิครับ โดยระบบจะฟ้องว่า The record cannot be deleted or changed because table ... includes related records. ยังไงมันก็จะบังคับเราให้ไปลบเรคคอร์ดที่อ้างมายังเรคคอร์ดนี้ให้หมดก่อนถึงจะสามารถลบเรคคอร์ดหลักได้ อย่างที่อาจารย์บอก ผมอยากรู้ว่ามันมีกรณีไหนหรือเทคนิกอะไรครับ ที่เมื่อสร้างความสัมพันธ์แบบที่เจ้าของกระทู้บอกแล้ว แต่สามารถลบเรคคอร์ดหลักที่อ้างได้โดยไม่ต้องลบเรคคอร์ดย่อยก่อน เพราะอย่างในกรณีนี้ ผมคิดว่าทำยังไงก็ไม่สามารถลบเรคคอร์ด AutoNumber ได้ หากมีข้อมูลที่เชื่อมกันอยู่ นอกจากจะลบข้อมูลที่เชื่อมกันให้หมดเสียก่อน ระบบถึงจะยอมให้ลบ ซึ่งมันก็จะไม่มีปัญหาเรื่องเลขที่ไม่ตรงกันอยู่แล้วไม่ใข่หรือครับ

84
ขอบคุณ คุณ ekppom กับคลิปความรู้นะครับ ติดตามครับ

85
อ.สันติสุข ช่วยขยายความได้ไหมครับ ที่ว่า "เมื่อมีการ Compact ฐานข้อมูลแล้ว ค่าของฟิลด์ Autonumber จะถูกจัดเรียงใหม่ให้ต่อเนื่องกันไปโดยไม่สนใจค่าเดิม" มันจะเกิดขึ้นกรณีไหนบ้างครับ นี่คือความรู้ใหม่ของผมเลยอะครับ เพราะเท่าที่ทราบ การ Compact จะทำให้ฟิลด์ AutoNumber รันลำดับใหม่แค่เรคคอร์ดสุดท้าย ให้ต่อเนื่องกันเท่านั้นเอง ไม่ได้ไปเรียงเรคคอร์ดใหม่ที่มีค่าอยู่แล้วหนิครับ แล้วในฐานข้อมูล Northwind ของทางไมโครซอฟเองก็ใช้ฟิลด์ AutoNumber ในการเชื่อมความสัมพันธ์กันแทบทุกตารางเลยครับ เลยอยากขอความเห็นของอาจารย์หน่อยครับ ว่ากรณีไหนบ้าง?
ปล. ขออภัยหากอ่านความหมายของ อาจารย์ผิดไปครับ

86
ทำเหมือนเดิม แต่ให้เปลี่ยน Event เป็น On KeyPress แล้วใช้โค้ดตามนี้ครับ

Private Sub INVOICE_KeyPress(KeyAscii As Integer)
    If KeyAscii = 32 Then
        KeyAscii = 0
    End If
End Sub

87
ห้อง MS Access / : สร้าง QR Code
« เมื่อ: 26 พ.ค. 61 , 13:42:56 »
จริงๆแล้วไฟล์ DLL ตัวนี้ ผมใช้กับโปรแกรมอื่นที่รองรับ มันสามารถแสดงเป็นภาษาไทย หรือ ญี่ปุ่นได้หมดนะครับ แต่พอมาใช้กับ MS Access มันกลับใช้ได้แค่ภาษาอังกฤษเท่านั้นครับ ยังไม่ทราบว่าเพราะอะไร สงสัยว่าอาจเป็นที่ตัว VBA ของ MS Access เองครับ
คราวนี้ผมเคยอ่านเจอกระทู้เก่ากระทู้นึงของคุณ kamsuk เป็นโค้ดที่รองรับภาษาญี่ปุ่นได้ ไม่ต้องใช้ไฟล์ไลบารี่หรือฟอนต์ใดๆ เขียนโค้ดอย่างเดียว แต่สามารถใช้กับรายงานเท่านั้น ไม่สามารถแสดงบนฟอร์มได้ ยังไงรองศึกษาดูที่กระทู้นี้ครับ https://www.thai-access.com/yeadram_view.php?topic_id=5576



88
ห้อง MS Access / : Lock ข้อมูลใน Form
« เมื่อ: 16 พ.ค. 61 , 16:03:56 »
อื่ม! จริงๆ ถ้าเป็น Text Box ก็สามารถใส่เงื่อนไข Conditional Format ได้หมดนะครับ ทำไมถึงใช้ไม่ได้บางอัน?

ลองอย่างนี้ดูครับ หากคอนโทรลทุกตัวที่คุณต้องการ Disable เป็น Text Box
เท่าที่ดูรูป ฟอร์มชื่อ frm_ราคากระดาษ, ตัว Check Box ชื่อ Cancel (หากไม่ใช่ให้แก้ให้ถูกในโค้ดด้านล่าง)
ใส่โค้ดนี้ที่ Event > On Load ของฟอร์มเลยครับ แล้วลองเรียกใช้ดูครับ

โค๊ด: [Select]
    Dim objFrc As FormatCondition
    Dim txtCtrl As Access.Control
    For Each txtCtrl In Forms("frm_ราคากระดาษ").Controls 'สำหรับอ้างซับฟอร์ม For Each wCtrl In Forms("ชื่อฟอร์มหลัก")!ชื่อซับฟอร์ม.Form.Controls
        If txtCtrl.ControlType = acTextBox Then ' หาคอนโทรลทั้งหมดบนฟอร์ม หากเป็น Text box ก็สร้าง Conditional Formatting
            Me(txtCtrl.Name).FormatConditions.Delete ' ลบเงื่อนไขเก่า หากมีการสร้างเงื่อนไขไว้ในตัว Text Box
            Set objFrc = Me(txtCtrl.Name).FormatConditions.Add(acExpression, acEqual, "[Cancel]=True") 'หากคอนโทรล checkbox มีค่าเป็น True
            Me(txtCtrl.Name).FormatConditions(0).Enabled = False ' ให้ Disable
            Set objFrc = Nothing
        End If
    Next txtCtrl

89
ห้อง MS Access / : สร้าง QR Code
« เมื่อ: 16 พ.ค. 61 , 15:51:06 »
คือจะประมาณว่า ถ้าโปรแกรม MS Access เป็นแบบ
32bit ให้ใช้ไฟล์ QRCode_x86.dll
64bit ให้ใช้ไฟล์ QRCode_x64.dll
ไม่เกี่ยวกับ Windows ครับ Windows จะเป็น 32bit หรือ 64bit ก็ได้ แต่ทว่า โฟลเดอร์ระบบมาตรฐานของ Windows 32bit กับ 64bit มันใช้โฟลเดอร์คนละตัวกันคือ
Windows 32bit เราต้องก๊อปปี้ใส่ในโฟลเดอร์ Windows\system32
Windows 64bit เราต้องกีอปปี้ใส่ในโฟลเดอร์ Windows\sysWOW64

สรุปคือ: ถ้าคุณใช้ MS Access 64bit ให้ก๊อปไฟล์ QRCode_x64.dll ไว้ใน Windows\sysWOW64 ได้เลย (เพราะ Access 64bit ต้องใช้ Windows 64bit อยู่แล้ว) แต่หากคุณใช้ MS Access 32bit ต้องดูว่ารันบน Windows 32bit หรือ 64bit ถ้า Windows เป็น 32bit ก็ใช้ไฟล์ QRCode_x86.dll ก๊อปปี้ใส่ในโฟลเดอร์ Windows\system32 แต่หากรันบน Windows 64bit ก็ก๊อปปี้ไฟล์ QRCode_x86.dll ใส่ในโฟลเดอร์ Windows\sysWOW64 แทนครับ

ปล. จริงๆแล้วมันสามารถเขียนโค้ดให้รัน Dll ไฟล์จากในโฟลเดอร์ที่เรากำหนดได้เลยโดยไม่ต้องไปก๊อปใส่เครื่องให้ยุ่งยาก รวมทั้งฟอนต์ด้วย แต่ต้องใช้การเขียนโค้ดอีก ซึ่งมันจะยืดหยุ่นกว่ามาก ไม่ต้องทั้งเพิ่มฟอนต์ QRCode และ ไฟล์ dll ลงในเครื่องเลย สามารถเรียกรันในโฟลเดอร์เดียวกับฐานข้อมูลเราได้เลย แต่มันต้องเขียนโค้ดอีกพอสมควร ในคลิปที่ผมทำเน้นความง่าย เลยไม่ได้ทำในส่วนนี้ให้ดูครับ

90
คือหากจะใช้ QR ในการแสดงรายละเอียดแทนก็ได้ครับ เช่นในการส่งซ่อมเราก็เขียนรายละเอียดแบบไม่ต้องมากนะครับ เพราะ qr จะใหญ่ เสร็จแล้วก็ Gen เป็น QR Code
ส่วนการอ่านรับของซ่อม ก็ใช้เครื่องยิ่งบาร์โค้ดที่เป็นรุ่นที่อ่าน qr ได้ ส่วนใหญ่จะเป็นแบบ ccd ซึ่งราคาแพงกว่าเครื่องธรรมดา หลักหลายพันขึ้น เราก็สามารถอ่าน qr code ได้ทั้งจากกระดาษ และ หน้าจอมือถือก็ได้ แค่คนส่งซ่อมนำมือถือถ่ายภาพ qr code มา เรา Scan จากมือถือก็รู้รายละเอียดได้ครับ

หน้า: 1 2 3 4 [5] 6 7