แสดงกระทู้

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
65
ห้อง MS Access / : สร้าง QR Code
« เมื่อ: 21 มิ.ย. 61 , 23:46:02 »
ความคิดส่วนตัวผมว่าไม่น่าจะได้นะครับ เพราะฟิลด์ของ MS Access มันจะสามารถกำหนดฟอนต์ได้เพียงอย่างเดียวเท่านั้น ยกเว้นกำหนดให้เป็น Rich Text ซึ่งมันก็คงไม่รองรับกับ QR แบบนี้อีก เลยคิดว่าไม่น่าจะได้นะครับ ต้องเป็นฟอนต์ญึ่ปุ่นทั้งหมด ส่วนเรื่องอื่นผมตอบใน YouTube แล้วนะครับ คิดว่าคงเป็นคนเดียวกันที่ถาม

66
ลองศึกษาการสร้าง Menu Ribbon จากเว็บนี้ดูก่อนครับ จะได้รู้หลักการเขียน accessribbon link

67
ผมมีไฟล์ตัวอย่าง ไฟล์ตัวอย่าง By Peter Hibbs July 2017 link
เป็นโปรเจคที่เค้าเรียนแบบ Calendar ของ Outlook ไม่รู้อาจารย์เคยเห็นยังนะครับ เผื่อพอช่วยได้ โค้ดดิ้งเยอะใช้ได้ แต่ดูคร่าวๆแล้วคิดว่าน่าจะเป็นแนวคิดประมาณนี้อะครับที่เห็นคนเค้าทำกันบน MS Access เมื่อก่อนคิดว่าจะนั่งไล่โค้ดดู จนถึงวันนี้ยังไม่ได้ดูเลย ยอมรับว่าขึ้เกียจครับ

68
ของผมลองเปิดดูใช้ได้นะครับ ผมใช้ Windows 10 - MS Access 2013 อาจเป็นไปได้ว่า IE ที่มันดึงมาใช้เป็น IE 11 ตามเงื่อนไขอะครับ เพราะ IE รุ่นสุดท้ายก่อน Microsoft จะเปลี่ยนไปใช้เป็น Edge จะเป็น IE 11 ลองหา Patch Update เป็น IE 11 มาลงดูครับ ไม่รู้ว่าช่วยได้ป่าวนะครับ

69
แนวคิดคร่าวๆ คือ ไม่ว่าคุณจะสร้าง Ribbon จากการใช้ไฟล์ UsysRibbons หรือ User Table หรือ XML File (อันนี้ไม่แน่ใจว่าได้หรือเปล่า) เราสามารถสร้างเป็น List ของคำสั่งแต่ละชุดเมนูได้อยู่แล้ว โดยกำหนดชื่อต่างกัน จากนั้นในตอน Login เข้ามาก็กำหนดสิทธิได้ว่า user ระดับไหนใช้เมนูชื่ออะไรบนฟอร์มไหนโดยกำหนดที่ Event > On Load ของฟอร์มนั้นๆ เช่น ถ้า Level1 ก็โหลด Me.RibbonName = "เมนู1" หรือ Level2 ก็โหลด Me.RibbonName = "เมนู2" อย่างนี้ได้เลยครับ

71
โค๊ด: [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 ไม่ได้


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

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

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

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

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

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

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

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

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

77
ทำครั้งเดียวพอครับ ทำกับไฟล์ฟอร์มใช้งานของเรา ไฟล์ที่เก็บ 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 link


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

79
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 จะเจอตัวอย่างมากมายครับ

80
อ.สันติสุข ช่วยขยายความได้ไหมครับ ที่ว่า "เมื่อมีการ 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 ได้ หากมีข้อมูลที่เชื่อมกันอยู่ นอกจากจะลบข้อมูลที่เชื่อมกันให้หมดเสียก่อน ระบบถึงจะยอมให้ลบ ซึ่งมันก็จะไม่มีปัญหาเรื่องเลขที่ไม่ตรงกันอยู่แล้วไม่ใข่หรือครับ

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