แสดงกระทู้

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]
65
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 จะเจอตัวอย่างมากมายครับ
โพสต์นี้ได้รับคำขอบคุณจาก: eqsan

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

67
ขอบคุณ คุณ ekppom กับคลิปความรู้นะครับ ติดตามครับ
โพสต์นี้ได้รับคำขอบคุณจาก: ekppom, Ongart

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

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

Private Sub INVOICE_KeyPress(KeyAscii As Integer)
    If KeyAscii = 32 Then
        KeyAscii = 0
    End If
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

70
ห้อง 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


โพสต์นี้ได้รับคำขอบคุณจาก: Earth

71
ห้อง 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 ลงในเครื่องเลย สามารถเรียกรันในโฟลเดอร์เดียวกับฐานข้อมูลเราได้เลย แต่มันต้องเขียนโค้ดอีกพอสมควร ในคลิปที่ผมทำเน้นความง่าย เลยไม่ได้ทำในส่วนนี้ให้ดูครับ
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown, sjs, Earth

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

73
ผมเคยทำคลิปตอบคำถามแนวๆนี้ ไม่รู้ว่าพอช่วยเป็นแนวทางได้หรือไม่นะครับ ลองดูแล้วกัน
โพสต์นี้ได้รับคำขอบคุณจาก: SakDa, chaoclub

74
ห้อง MS Access / > ซ่อน Page Header
« เมื่อ: 06 มี.ค. 61 , 10:55:22 »
Me.Section ต้องไม่มี s ต่อท้าย ไม่ใช่หรือครับ ส่วนชื่อ PageHeaderSection ต้องเป็นชื่อของพื้นที่ ที่เราจะทำการซ่อน เช่นถ้าเราต้องการซ่อนพื้นที่ในส่วนของ Header ก็คล๊กที่พื้นที่ Header นั้น ในมุมมองออกแบบ แล้วดูที่ Property > Other > Name ว่าใช้ชื่อว่าอะไรก็ใส่ให้ตรงกับชื่อนั้น ส่วนการเทียบ Page = Pages เราจำเป็นต้องสร้าง Control Text Box ขึ้นมา โดย Control Source กำหนดเป็น [Pages] จะแสดงหรือไม่ก็ได้แต่ต้องมี เพื่อให้การนับหน้าทั้งหมดทำงาน เราถึงจะเทียบค่ากับหน้าปัจจุบันได้จริง ประมาณนี้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Un

75
ก็ต้องวางแผนฐานข้อมูลก่อนนะครับ ว่าจะเชื่อมโยงข้อมูลกันหรือไม่ ถ้าแยกร้านกันไม่ต้องเชื่อมโยงข้อมูลกันก็ไม่มีปัญหาใช้ตามความถนัดไปก่อนได้ แต่ถ้าต้องการเชื่อมโยงข้อมูลกันก็ควรใช้เป็นฐานข้อมูล SQL Server หรือ My SQL หรืออื่นๆหลายค่าย (ต้องศึกษาดู ส่วนตัวผมใช้แต่ SQL Server) โดยการใช้งานผ่านทาง Web Browser  น่าจะง่ายที่สุดแล้ว โดยหาคนที่เขียน Web application เป็นก็สามารถทำได้ครับ ส่วนเรื่องข้อมูลเก่าใน MS Access เราสามารถ Export ไปที่ SQL Server (ในกรณีใช้ SQL Server นะครับ ค่ายอื่นๆ ก็ได้ แต่ไม่แน่ใจในวิธีการทำ) ได้ครับ ยกเว้นฟิลด์ที่ไม่ใช้มาตรฐานของฐานข้อมูลจริงๆ อย่าง Attachment ถ้ามีก็ต้องเปลี่ยนรูปแบบการจัดเก็บใหม่
สรุป ลองปรึกษาคนที่รับเขียนเว็บครับ ยิ่งปัจจุบันเค้าสามาถเขียนเป็นแอฟรองรับมือถือได้ด้วยทำให้ใช้งานได้หลาย Device อีกต่างหาก
โพสต์นี้ได้รับคำขอบคุณจาก: laemthong

76
สมมุติตารางคุณชื่อ Table1

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 Table1.[รหัสใบสั่งซื้อ], ConcatRelated("รายการ","Table1","รหัสใบสั่งซื้อ=" & [รหัสใบสั่งซื้อ]) AS รวมรายการ
FROM Table1
GROUP BY Table1.[รหัสใบสั่งซื้อ];

ประมาณนี้ ปรับใช้ดูครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Peak21, Jieng2021

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