แสดงกระทู้

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
55
ห้อง MS Access / : ทศนิยม
« เมื่อ: 21 ก.ค. 61 , 13:40:31 »
อาจเป็นเรื่องของการปัดเศษ ยังไงลองอ่านกระทู้นี้ดูครับ
กระทู้ปัดเศษ
โพสต์นี้ได้รับคำขอบคุณจาก: Xternity

56
คือกรณีนี้ หากต้องการแสดงสถานะภาษาคีย์ พอเรากำหนดให้ปุ่ม (~ tilde) เป็นปุ่มเปลี่ยนภาษาจะทำให้ปุ่มมันไม่สามารถ Active กับโปรแกรมอื่นๆได้ โปรแกรมอย่าง MS Access ให้การรันโค้ดที่เหตุการณ์เป็นหลัก Event-Driven แต่เมื่อกดปุ่มตัวหนอนแล้วไม่เกิดเหตุการณ์ใดๆ จึงไม่สามารถรันโค้ดที่ต้องการให้แสดงสถานะคีย์ได้ จึงต้องใช้เหตุการณ์ On Time แทนครับ แล้วก็ให้รันโค้ดที่ On Time แทน ถึงจะแสดงได้แบบ Real Time โดยไม่ต้องพึ่งเหตุการณ์ใดๆ ลองดูไฟล์ต้วอย่างที่นี่ครับ กดโหลดไฟล์ตัวอย่าง
โพสต์นี้ได้รับคำขอบคุณจาก: aung, nonc31

57
ลองแทรกบรรทัดสีแดงนี้เข้าไปที่โค้ด แนวคิดคือใช้การตรวจสอบว่า ถ้าเซล A1 มีข้อความเหมือนชื่อหัวเรื่องอยู่แล้วก็ให้ข้ามการแทรกเซลไป อะไรประมาณนี้ครับ

    Set xlSheet = xlWorkbook.ActiveSheet
    '-------------ตรวจสอบหากมีหัวเรื่องชื่อเดียวกันซ้ำก็ให้ข้ามการแทรกไป
    If xlSheet.Cells(1, 1).Value = "ชื่อหัวเรื่องที่ต้องการ" Then Exit Sub
    '-------------------------------------------------
    With xlSheet.Range("A1")
โพสต์นี้ได้รับคำขอบคุณจาก: pirin, มาลี

58
ใช้แบบโค้ดแบบนี้น่าจะพอได้นะครับ
ในเหตุการณ์ After Update ของ TextBox
โค๊ด: [Select]
    Dim iStr As String
    iStr = Replace(TextBox, ",,", ",")
    iStr = Replace(TextBox, ", ,", ",")
    If Right(iStr, 1) = "," Then
        iStr = Mid(iStr, 1, Len(iStr) - 1)
    End If
    TextBox = iStr
โพสต์นี้ได้รับคำขอบคุณจาก: Xternity

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

60
ลองศึกษาการสร้าง Menu Ribbon จากเว็บนี้ดูก่อนครับ จะได้รู้หลักการเขียน accessribbon
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

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

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

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

64
ห้อง MS Access / : กำหนดขนาดกระดาษด้วย VB
« เมื่อ: 13 มิ.ย. 61 , 23:50:28 »
ลองดูที่นี่ครับ
https://support.office.com/th-th/article/คุณสมบัติ-papersize-0bb787f4-c856-4ec8-b1fa-9473e27f5d98
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

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

โพสต์นี้ได้รับคำขอบคุณจาก: kitisak, มาลี, suaccess

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

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

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

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

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

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

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

70
ลองทำ decompile ดูยังครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Kxess

71
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

72
อ.สันติสุข ช่วยขยายความได้ไหมครับ ที่ว่า "เมื่อมีการ 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

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