แสดงกระทู้

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 - kitisak

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


ตรงหน้าเขียนโค้ดตรงผม วงสีแดงไว้ ท่านตั้งชื่อ Project ว่า Database ไว้หรือเปล่า มันเลยแจ้งซ้ำกันกับ คำสั่งในหน้าเขียนโค้ดนะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

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

51
ห้อง MS Access / : สร้างริบบอน ใช้เอง
« เมื่อ: 02 ส.ค. 61 , 18:58:40 »
Access2003 ทำได้ แต่ถ้าใหม่กว่านั้นไม่แน่ใจว่าทำได้หรือเปล่า แต่ผมเคยหาข้อมูลในเว็บนี้ไม่เจอคำตอบเลยครับ เลยมาประยุกต์ใช้เอาโดยใช้แท็บคอนโทรลทำเป็นเมนู เขียนโค้ดเพื่อตัดแถบเมนูออกทั้งหมดดังนี้ครับ
Private Sub Form_Current()
DoCmd.ShowToolbar "Ribbon", acToolbarNo
DoCmd.Maximize
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

52
ผมเคยเกิดเหตุการณ์แบบนี้ครับ
เลยไปกำหนด ตรง References โดยกำหนดให้มี DAO Object Library ด้วย
เวอร์ชั่นเท่าที่เห็นมา เหมือนจะมีถึง 3.6 นะครับ เวอร์ชั่นใหม่ๆ ไม่เคยเจอ
หรือเขาจะไม่ทำต่อแล้วหรือเปล่าไม่แน่ใจครับ แต่ผมว่ามันยังใช้งานได้ดีอยู่ทั้ง access เวอร์เก่า และใหม่

dim dbs As Database ดึงตรงจากฐานข้อมูล
Dim dbs As dao.Database  ใช้ Dao เป็นตัวกลางในการเชื่อมข้อมูลระหว่าง Database กับส่วนที่ใช้ในการแสดงผลข้อมูล


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

53
ตรงหน้าเขียนโค้ด Tool >  references
ของท่านมีอะไรบ้างครับ อย่างน้อยต้องมี รายการพวกนี้อยู่

Mrocrosoft Access 1x.0 object library
Mrocrosoft OFFICE 1x.0 Access database Engine Object
Ole Automation
DAO 3.6 หรือเวอร์ชั่นใด เท่าที่มี

แล้วลองเปลี่ยนเป็นแบบนี้ดูครับว่าได้ไหม
Dim dbs As dao.Database
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

54
เลือกตาราง > Database Tools > Object Dependencies
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

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

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

56
พอดีพึ่งเริ่มเขียนVBในAccessเลยอยากรู้ว่าDoCmd.SetWarnings False/True ไว้ใช้ทำอะอะไรและDoCmd.คืออะไร

SetWarnings คือการเปิด/ปิดข้อความโต้ตอบ ของระบบครับ True = เปิด   / False = ปิด
ถ้าคุณใช้งานไปคุณจะสังเกตุเห็นข้อความสอบถามจากระบบเช่น ตกลง หรือ ยกเลิก ใช่ หรือ ไม่ เป็นต้น
การสั่งให้  DoCmd.SetWarnings False เป็นการสั่งปิดข้อความตอบโต้ของระบบออกไป
ซึ่งคุณต้องมั่นใจว่าผลลัพธ์ของแมโครแอคชันทั้งหมด หรือการนำไปใช้กับ Query แบบ MakeTable /Append /Delete นั้นทำงานถูกต้องแล้วด้วยนะครับ ถ้าต้องการให้แสดงข้อความตอบโต้ กำหนดเป็น True

ยกตัวอย่าง
ผมสมมุติว่าต้องการสร้าง Make Table Query ขึ้นมา 1 ตัว โดยใช้คำสั่งในการรัน Query ดังนี้
โค๊ด: [Select]
Private Sub Command0_Click()
DoCmd.OpenQuery "Query1"
End Sub
ผลที่ได้คือจะมีข้อความตอบโต้ขึ้นมา ซึ่งไม่สะดวกในการนำไปใช้งานกับโปรแกรมจริงๆ


ผมเลยนิยม ปิดคำสั่งตอบโต้ซะโดยใส่ Code แบบนี้
โค๊ด: [Select]
Private Sub Command0_Click()
DoCmd.SetWarnings False
DoCmd.OpenQuery "Query1"
DoCmd.SetWarnings True
End Sub
DoCmd คือ Object ในการสั่งให้ Methods ทำงานซึ่ง Methods ก็มีมากมายที่ ใช้ใน Visual Basic ซึ่งรวมถึงการสั่ง run มาโคร actions โดยวิธีการจะดูว่า Methods มีอะไรบ้าง ที่หน้าต่าง เขียนโค็ดถ้าท่านพิมพ์ DoCmd. เมื่อใส่ . ท่านจะเห็นว่ามีอะไรบ้างที่ทำงานด้วยใช้ Docmd ซึ่ง นำไปใช้งานได้หลากหลายเช่น การเปิด/ปิดฟอร์ม ปริ้นรายงาน ตั้งค่าตัว Control การ Import/Export และอื่นๆ มากมาย
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

57
ไฟล์ตามนี้เลยครับ ลองลบโมดูลที่น่าสงสัยแล้วก็ไม่หาย
https://drive.google.com/open?id=1uOVAL07-6CHgAHXNR0jhh4UfaH5McaCv link

เช็คแล้วพบว่าคุณต้องกำหนดตรง Row Source ของ Combobox ให้เพิ่ม DISTINCT เข้าไปด้วย เพราะข้อมูลในรายการมีการซ้ำกันทำให้ Combobox ไม่สามารถแสดงรายการตามที่เราพิมพ์ได้

โค๊ด: [Select]
SELECT DISTINCT CarInsu.ChassisNO, CarInsu.licensePlate
FROM CarInsu
ORDER BY CarInsu.licensePlate;


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

58
ที่ตัวรายงาน ส่วนของ Detail  ตรง Event On Print ใส่โค้ดนี้เข้าไปครับ
โค๊ด: [Select]
Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
Dim ctl As Control, strText As Variant, strName As String
    Me.ScaleMode = 1
    For Each ctl In Me.Detail.Controls
        If ctl.ControlType = acTextBox Then
       
        strName = ctl.Name
            If Nz(ctl.Tag, "") = "" Then
                ctl.Tag = ctl.FontSize
            End If
            ctl.FontSize = ctl.Tag
            Me.FontSize = ctl.FontSize
            strText = ctl.Value
           If Len(strText) > 0 Then
            Do Until TextWidth(strText) < ctl.Width
                ctl.FontSize = ctl.FontSize - 1
                Me.FontSize = ctl.FontSize
            Loop
            Do Until TextHeight(strText) < ctl.Height - (ctl.Height * 0.26)
                ctl.FontSize = ctl.FontSize - 1
                Me.FontSize = ctl.FontSize
            Loop
        End If
        End If
       
    Next ctl
End Sub

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

59
ครับอาจารย์ โค๊ตหายเกลี้ยงทั้งฟอร์ม ร้องไห้หนักมาก
1.ลอง compare ดูแล้วครับ ไม่หาย
2.ลองเพิ่ม combobox เปล่าๆ ดู(วาดไปเฉยๆไม่ได้ใส่ค่าอะไร)  combobox ตัวอื่นกลับมาใช้ได้เหมือนเดิม แต่พอปิดแล้วเปิดใหม่ ก็กลับมาเป็นอาการเดิมครับ งงมาก

ต้องไล่เช็คโค้ด ดูครับ ที่ Event  On Current  /  On FormLoad / On Open Form / รวมถึง Module และอื่นๆ ว่ามีการทำงานที่ไปกระทบกับ Combobox หรือไม่ หรือส่งรหัส Teamview มาทาง Inbox เดี่ยวผมดูให้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

60
Has Module หมายถึงฟอร์มนี้ได้มีการเขียนโค้ดลงใน Event อะไรของฟอร์มหรือของ Control หรือไม่ ถ้าเป็น Yes ตัว Access จะมองฟอร์มนี้เป็น Class ด้วย  (ซึ่งทำให้สามารถมอง sub procedure ของฟอร์มเป็น Method และ function procedure ของฟอร์มเป็น Property)  พอเราเลือกเป็น No โค้ดต่างๆในฟอร์มนี้จะถูกลบทิ้งครับ  ผมคิดว่าไม่น่ามีส่วนเกี่ยวข้องกับปัญหาที่เจอนะครับ  ยังคิดไม่ออกว่าเพราะอะไร ลองทำ Compile แล้วตามด้วย Compact and Repair Database อาจช่วยได้ ?!?
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

61
RowSource และ ColumnCount property มีค่าเป็นอะไรครับ และอีกอย่าง ทำไมระหว่างชื่อและนามสกุลถึงดูเหมือนมีช่องว่างหลายช่อง
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

62
น่าจะเพราะ AutoExpand property ไม่ได้กำหนดเป็น Yes ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

63
ภาษา VBA นำมาจากภาษา BASIC ซึ่งเป็นภาษาเก่าแก่ สิ่งนึงที่ตกทอดมาถึง VBA ก็คือหมายเลขบรรทัด เราสามารถใส่เลขที่บรรทัด จะเป็นเลขอะไรก็ได้ตั้งแต่ 1 ถึง 65535 และแต่ละบรรทัดจะเป็นเลขอะไรก็ได้ ไม่จำเป็นต้องเรียงลำดับ ไม่จำเป็นต้องมีทุกบรรทัด ขอให้ไม่ซ้ำใน Sub หรือ Function Procedure เดียวกันก็พอ โดยเขียนไว้เป็นส่วนแรกของโค้ดแต่ละบรรทัด ที่ทำๆกันมาเป็นมาตรฐานก็คือเริ่มจาก 10  และเพิ่มทีละ 10 เพื่อให้อ่านง่ายและสะดวกเมื่อมีการแทรกบรรทัดเพิ่ม จะได้ใส่เลขบรรทัดได้โดยไม่ต้องไปแก้หมายเลขของบรรทัดอื่นๆให้เสียเวลาครับ

ตย.ของโค้ดก็เช่น
โค๊ด: [Select]
Private Function NewSalesPrice(Price As Variant, Percent As Variant) As Single
          Dim Factor  As Single

          On Error GoTo ErrHandler

10        Factor = 1 + Percent / 100
20        NewSalesPrice = Price * Factor

ExitRtn:
30        Exit Function
               
ErrHandler:
40        MsgBox "In [NewSalesPrice], Line " & Str(Erl) & ", Error " & Str(Err.Number) & " : " & Err.Description
50        Resume ExitRtn
End Function

เลขบรรทัดทำหน้าที่แบบเดียวกับลาเบล เราสามารถสั่ง Goto <ลาเบล/เลขบรรทัด> หรือ GoSub <ลาเบล/เลขบรรทัด> เพื่อให้โค้ดข้ามไปทำงานที่บรรทัดตามเลขที่นั้นได้ แต่ประโยชน์ที่ชัดเจนที่สุดก็คือ ถ้าเกิด Runtime Error ขึ้นในบรรทัดของโค้ดที่มีเลขที่บรรทัดอยู่ เราสามารถใช้ฟังก์ชั่น Erl เพื่อคืนเลขที่บรรทัดออกมาได้ด้วย ดังนั้นเราจึงใส่ไว้ในส่วนของ Error Handling Routine เพื่อบอกให้ทราบว่าเกิดปัญหาที่บรรทัดอะไร การ Debug หรือแก้ไขปัญหาก็จะทำได้ง่ายขึ้นมาก แต่หากเกิด Error ในบรรทัดที่ไม่ได้ใส่หมายเลขบรรทัดเอาไว้  ฟังก์ชั่น Erl จะคืนค่าของเลขบรรทัดสุดท้ายที่อยู่ก่อนหน้าออกมาให้แทน หรือถ้าไม่มีเลย ก็จะคืนค่าเป็นศูนย์แทนครับ

ตย.ของข้อความ

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

64


สามารถไปกำหนดได้ที่ File  >  Option  > Object Designer > QueryDesign
กำหนดรูปแบบฟ้อน กับขนาดได้เลยครับ


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

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