แสดงกระทู้

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 - สันติสุข

หน้า: 1 ... 12 13 14 [15] 16 17 18 19
253
มีคนอื่นมีปัญหาแบบนีเหมือนกัน และเหมือนว่าฟอนท์นี้จะมีปัญหาด้วย fracktured.com/2011/04/28/problem-printing-calibri-font-with-office-2010/ แนะว่าไปใช้ฟอนท์ธรรมดาๆตัวอื่นดีกว่าครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Un

254
คอมฯทุกเครื่องตั้งชื่อเครื่องพิมพ์ตัวนี้ให้เหมือนๆกันหรือยังครับ
โพสต์นี้ได้รับคำขอบคุณจาก: pitakchan

256
ถึงเราจะ ALTER จากฟิลด์ TEXT ไปเป็น MEMO ได้ แต่ไม่มีทางที่จะเพิ่มคุณสมบัติ Hyperlink ให้กับฟิลด์ MEMO ที่มีอยู่แล้วได้  ทำได้เฉพาะตอนสร้างฟิลด์เท่านั้น ผมถึงบอกให้ สร้างฟิลด์ Hyperlink แล้วก๊อปปี้ค่าจากฟิลด์ TEXT มา  แล้วก็ค่อยลบฟิลด์ TEXT อีกทีไงครับ
โพสต์นี้ได้รับคำขอบคุณจาก: nonc31

257
ปัญหาคือ Access SQL ไม่มี Hyperlink data type โดยเฉพาะ  แต่ DAO มี   ซึ่ง Hyperlink จริงๆก็คือ Memo data type ที่เพิ่มคุณสมบัติของ hyperlink เข้าไป   ดังนั้นแนะนำว่าให้ใช้ DAO เพิ่มฟิลด์ Hyperlink ลงในเทเบิลแล้วกีอปปี้ค่าจากฟิลด์เดิมมาใส่ เสร็จแล้ลบฟิลด์เดิมทิ้งแทน

โค้ดการสร้างฟิลด์ Hyperlink

    Dim DB As DAO.Database
    Dim TD As DAO.TableDef
    Dim FD As DAO.Field
   
    Set DB = CurrentDb
    Set TD = DB.TableDefs("T")
    Set FD = TD.CreateField("H", dbMemo)
   
    FD.Attributes = FD.Attributes Or dbHyperlinkField
    TD.Fields.Append FD

ส่วนชื่อของ Autonumber ใช้คำว่า COUNTER ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: nonc31

258
ใช้ COLUMN fieldA SMALLINT หรือ COLUMN fieldA SHORT ก็ได้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: nonc31

259
ห้อง MS Access / : รวมตาราง
« เมื่อ: 31 ส.ค. 61 , 16:27:02 »
ไม่เคยทำระบบที่ต้องสร้างข้อมูลซ้ำกันแบบนี้ ดีที่สุดคือไม่สร้างซ้ำ แต่ถ้าจำเป็นต้องสร้างซ้ำแล้ว โดยหลักการของ DBMS แล้ว น่าจะเป็นเรื่องของ Trigger http://www.mysqltutorial.org/mysql-triggers.aspx ที่จะทำงานเมื่อเกิดการเปลี่ยนแปลงข้อมูลในเทเบิล ก็ต้องเขียนโค้ดใน Trigger ใน MySQL สำหรับทุกเทเบิล ให้ไปปรับปรุงข้อมูลในเทเบิลที่เกี่ยวข้องให้ถูกต้องตรงกัน

อีกอย่างที่ต้องคำนึงถึงคือเรื่องของ Transaction Control คือ DBMS จะปรับปรุงข้อมูลทั้งเทเบิลตัวเองและที่เกี่ยวข้องได้สำเร็จ ก็ต้องทำได้สำเร็จทั้งคู่ (Commit Transaction) ถ้าเทเบิลใดเทเบิลหนึ่งปรับปรุงไม่สำเร็จ ก็ต้องยกเลิกได้ทั้งคู่โดยอัตโนมัติ  (Rollback Transaction)  ไม่งั้นข้อมูลก็จะไม่เหมือนกัน ตรงนี้ผมไม่รู้ว่า MySQL สนับสนุนให้ทำได้พร้อม Trigger ด้วยหรือไม่ และถ้าทำได้ ถ้าเกิดกรณี Rollback Transaction แล้ว  จะมี runtime error อะไรส่งกลับมาบอก Access ด้วยหรือไม่ ตรงนี้ก็ต้องทดลองด้วยนะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์

261
Forms("ชื่อฟอร์ม").SetFocus
Docmd.RunCommand acCmdDocMinimize ' สำหรับหดฟอร์ม หรือใช้ acCmdDocMaximize สำหรับขยายเต็มวินโดว์ของ Access หรือใช้ acCmdDocRestore สำหรับกลับคืนขนาดก่อนการหดหรือขยายฟอร์ม
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์, มาลี

262
ห้อง MS Access / : ลบไฟล์ที่เลือก
« เมื่อ: 27 ส.ค. 61 , 13:17:51 »
รายละเอียดเพิ่มเติมด้วยครับ ไดอะล็อกบ๊อกซ์มาจากไหน เกี่ยวกับอะไร โค้ดที่ใช้คืออะไร และลบไฟล์ ณ ขั้นตอนไหน ลบในตัวไดอะล็อกบ๊อกซ์เองเลย หรือมาลบที่ไหน
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

263
ส่วนตัวไม่เคยใช้ Office 64 bits ครับ และไม่คิดจะใช้เพื่อตัดปัญหาเพราะยังไม่เห็นประโยชน์อะไรที่จะใช้ ลองอ่านบทความข้างล่างนี้ดูครับ

เลือกระหว่าง Office 32 หรือ 64 bits
support.office.com/en-us/article/choose-between-the-64-bit-or-32-bit-version-of-office-2dee7807-8f95-4d0c-b5fe-6c6f49b8d261

ความแตกต่างของโค้ด VBA สำหรับ Office 32 หรือ 64 bits
docs.microsoft.com/en-us/office/vba/Language/Concepts/Getting-Started/64-bit-visual-basic-for-applications-overview

อีกอย่างคือถ้าจะใช้ไฟล์ .accde บน Office 64 bits  ก็จะต้องสร้าง .accde ด้วย Office 64 bits ด้วย

ส่วนที่ถามว่า "และรุ่นที่ใหม่กว่า" อันนี้ microsoft ไม่มีบอกนะครับ และคิดว่าคงไม่มีใครบอกได้เช่นกัน
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

264
ถ้าคุณไม่รู้เกี่ยวกับเรื่อง การออกแบบฐานข้อมูล (Database Design) ผมแนะนำว่าให้ศึกษาด้านนี้ดูก่อน มันไม่ได้เกี่ยวกับการเขียนโปรแกรมอะไรเท่าไหร่ เป็นการออกแบบว่าระบบของเราต้องมีตารางที่เก็บข้อมูล(เทเบิล)อะไรบ้าง มีข้อมูล(ฟิลด์)อะไรในตารางนั้นบ้าง และออกแบบตรงตามหลักการวิชาการ เพื่อการเก็บข้อมูลจะได้ไม่ซ้ำซ้อน โปรแกรมที่เขียนมาจัดการก็จะง่ายขึ้น ที่ถามมามันโยงกันได้หมดแหล่ะครับ แต่ต้องบอกเลยว่าไม่ง่ายสำหรับมือใหม่ ต้องใช้เวลา เรื่องการออกแบบก็ทำในกระดาษนี่ก็ได้ ไม่ต้องใช้โปรแกรม ทำพื้นฐานตรงนี้ให้ได้ก่อนแล้วค่อยไปเลือกว่าจะใช้ Access หรือยี่ห้ออื่นๆในการพัฒนาระบบต่อไป
โพสต์นี้ได้รับคำขอบคุณจาก: pom2266

265
ถ้าเอาแบบง่ายๆเร็วๆไม่เช็คมาก ก็ใช้ On Error Resume Next มาช่วย คำสั่งนี้จะบอกว่าถึงแม้โปรแกรมทำอะไรแล้วเกิด error ไม่ว่าจากอะไรก็ตาม (ไม่ใช่เฉพาะไม่มีเทเบิลต้นทาง) ก็ให้ข้ามไปทำคำสั่งถัดไปได้เลยโดยที่ไม่ต้องแสดง error ออกมา แต่ถ้าต้องการจะเช็คอย่างในกรณี Tbl_A ว่ามีก่อนหรือไม่ ก็ตรวจสอบกับ Err.Number ได้ว่าเกิด error หรือไม่ ถ้าเกิด มันจะไม่คืนค่า 0 ออกมาครับ

On Error Resume Next จะมีผลต่อคำสั่งไปเรื่อยจนกว่าจะกำหนด On Error เป็นอย่างอื่น ซึ่งท้ายของโค้ดนี้สั่งเป็น On Error Goto 0 ซึ่งหมายถึงให้ Access แสดง error ออกมาได้ตามปกติ พร้อมถามผู้ใช้ว่าจะให้ Debug โค้ดหรือไม่

โค๊ด: [Select]
    DoCmd.SetWarnings False
    On Error Resume Next
    DoCmd.RunSQL "insert into Tbl_A select * from Tbl_A in 'C:\Sample.mde'"
    If Err.Number = 0 Then
        DoCmd.RunSQL "insert into Tbl_B select * from Tbl_B in 'C:\Sample.mde'"
        DoCmd.RunSQL "insert into Tbl_C select * from Tbl_C in 'C:\Sample.mde'"
        DoCmd.RunSQL "insert into Tbl_D select * from Tbl_D in 'C:\Sample.mde'"
        DoCmd.RunSQL "insert into Tbl_E select * from Tbl_E in 'C:\Sample.mde'"
        DoCmd.RunSQL "insert into Tbl_F select * from Tbl_F in 'C:\Sample.mde'"
    End If
    DoCmd.SetWarnings True
    On Error GoTo 0
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

266
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์, kitisak

267
ไม่รู้ใช้ได้ไหม ลองดูครับ

https://www.thai-access.com/yeadram_view.php?topic_id=4079
โพสต์นี้ได้รับคำขอบคุณจาก: Anuwat Jaijomkun

268
ในคิวรี่เอง ไม่ได้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

269
เอาคิวรี่ไปสร้างเป็นฟอร์ม ในฟิลด์ก็กำหนดชิดขอบตามที่ต้องการ แล้วเปิดมุมมองแบบ Data Sheet ครับ

ปล.ในกระทู้ก่อนหน้า ผมมีเขียนอธิบายเพิ่มเติม ลองไปอ่านดูครับ
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak, มาลี

270
ผมเขียนตัวอย่างสมมุติของ Class Recordset เพื่อให้เห็นภาพว่าเมื่อเราอ่านหรือกำหนดค่าให้ Property ของ Object ทำงาน มันจะไปสัมพันธ์กับโค้ดส่วนไหนใน Class นั้นๆ หวังว่าพอจะมีประโยชน์บ้างครับ แต่เอาไปรันจริงไม่ได้นะครับ แค่ตัวอย่างเท่านั้น

โค้ดข้างล่างนี้จะเขียนอยู่ใน Class Module และบันทึกในชื่อ Recordset
โค๊ด: [Select]
Option Compare Database
Option Explicit

Type RecordStructure                ' โครงสร้างของ Recordset Object
    RSField1    As Variant
    RSField2    As Variant
End Type

Dim Ptr         As Integer          ' เก็บตำแหน่งเรคอร์ดปัจจุบันของ Recordset นี้
Dim RC()        As RecordStructure  ' ตัวแปร Recordset Object

Private Sub Class_Initialize()
    ' Procedure จะทำงานโดยอัตโนมัติเมื่อ object ถูกสร้าง
    ' ตย.โค้ดเช่น เพิ่ม object นี้ลงใน Recordsets Collection (Collection คือ อ็อปเจ็คของกลุ่ม Object อีกที)
End Sub

Private Sub Class_Terminate()
    ' Procedure จะทำงานโดยอัตโนมัติเมื่อ object ถูกเคลียร์ให้เป็น Nothing
    ' ตย.โค้ดเช่น นำ object นี้ ออกจาก Recordsets Collection
End Sub

Public Property Let Bookmark(NewPosition As Integer)
    ' กำหนดตำแหน่งเรคอร์ดปัจจุบันของ Recordset
    If NewPosition <= UBound(RC) Then
        Ptr = NewPosition
    Else
        Err.Raise 1234, "Invalid Bookmark"
    End If
End Property

Public Property Get RecordCount() As Long
    ' คืนค่าจำนวนเรคอร์ดทั้งหมดใน Recordset
    RecordCount = UBound(RC)
End Property

Public Property Get Fields(Name As String) As Variant
    ' คืนค่าฟิลด์ตามชื่อฟิลด์ที่ส่งมาในตัวแปร Name
    Select Case Name
        Case "CustomerID"
            Fields = RC(Ptr).RSField1
        Case "CustomerName"
            Fields = RC(Ptr).RSField2
        Case Else
            Err.Raise 2589, "Invalid Field Name"
    End Select
End Property

Public Property Get EOF() As Boolean
    ' คืนค่า True เมื่อตำแหน่งเรคอร์ดปัจจุบันเลยเรคอร์ดสุดท้ายไปแล้ว
    If Ptr > UBound(RC) Then
        EOF = True
    Else
        EOF = False
    End If
End Property

Public Sub MoveNext()
    ' เลื่อนไปยังเรคอร์ดถัดไปใน Recordset
    If Ptr <= UBound(RC) Then
        Ptr = Ptr + 1
    Else
        Err.Raise 7654, "End of file"
    End If
End Sub

ส่วนข้างล่างนี้เป็นโค้ดที่อยู่ใน Module ธรรมดาๆ ที่เรียกใช้ Object, Method และ Property ต่างๆใน Class Module Recordset ครับ
โค๊ด: [Select]
Private Sub Example()
    ' โค้ดพิมพ์ CustomerID และ CustomerName จากเทเบิล Customer ตั้งแต่เรคอร์ดที่ 10 เป็นต้นไป
   
    Dim RS  As DAO.Recordset
       
    Set RS = CurrentDb.OpenRecordset("Customer")
    ' เมื่อ Object ถูกสร้าง จะไปเรียก Class_Initialize procedure มาทำงาน
   
    If RS.RecordCount > 10 Then     ' โค้ดใน Property Get RecordCount จะถูกทำงาน
        RS.Bookmark = 10            ' โค้ดใน Property Let Bookmark จะถูกทำงาน เป็นการนำค่าเข้าไปใน Property Bookmark
    End If
    Do Until RS.EOF                 ' โค้ดใน Property Get EOF จะถูกทำงาน
        Debug.Print RS.Fields("CustomerID") & ";" _
                  & RS.Fields("CustomerName") ' โค้ดใน Property Get Fields จะถูกทำงาน
        RS.MoveNext                 ' โค้ดใน Sub MoveNext จะถูกทำงาน
    Loop
   
    Set RS = Nothing
    ' เมื่อ Object ถูกเคลียร์ จะไปเรียกโค้ดใน Class_Initialize procedure มาทำงาน
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์

หน้า: 1 ... 12 13 14 [15] 16 17 18 19