แสดงกระทู้

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

หน้า: [1] 2
1
ก่อนอื่นเลยจะบอกว่าพยายามอย่าตั้งชื่อฟิวส์เป็นภาษาไทยครับ ตัวอย่างผมขอใช้ Text20 แทน "วันนัดชำระ" ของท่านนะครับ
โค๊ด: [Select]
Private Sub Text20_AfterUpdate()
Dim DatePK As String
DatePK = Me.Text20 - Date
    If DatePK > 30 Or DatePK < 0 Then
    MsgBox "กรุณาเลือกวันที่ " & Date & " - " & Date + 30, vbCritical, "แจ้งเตือน"
    Me.Text20 = Null
    End If
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: naekkhung

2
อ่อโค้ดที่ผมส่งไปผมกำหนด Pop Up Form = No
                                 Modal = No ครับ โค้ดถึงจะทำงาน

แต้ถ้า Pop Up = Yes ไม่รู้ทำยังไงเหมือนกัน
 :sweat:

แต่ก็พอมีวิธีอื่นๆที่พอจะทำได้เช่นการ ใช้ Event Click ในฟอร์ม ข้อมูลทั้งหมด
เช่นในส่วนของ
FormHeader_Click()
Detail_Click()
Form_Click()
หรืออื่นๆเพิ่มเติมจากนี้
ทั้งสามอีเว้นนี้ ใส่โค้ดไปทั้งสามจุดว่า
DoCmd.Close acForm, "collection"

เมื่อเราคลิ๊กโดยจุดต่างๆเหล่านี้ ฟอร์ม collection ก็จะปิดทันทีครับ
โพสต์นี้ได้รับคำขอบคุณจาก: naekkhung

3
มีฟอร์มทั้งหมด 2 ฟอร์มชื่อ "collection","ข้อมูลทั้งหมด" ทั้ง 2 ฟอร์มพนักงานจะเปิดใช้พร้อมกัน
คำถามคือ ปัจจุบันผมใช้งานอยู่หน้าฟอร์ม collection และจะเปลี่ยนไปใช้หน้าฟอร์ม ข้อมูลทั้งหมด อยากให้ ฟอร์ม collection ปิดอัตโนมัติต้องทำยังไงครับ

ที่ฟอร์ม ข้อมูลทั้งหมด ใส่ Event แบบนี้เข้าไปครับ
การทำงานคือเมื่อเราใช้งานอยู่ที่ collectionเมื่อเราไปกดที่  ฟอร์มข้อมูลทั้งหมด
จะทำให้ ฟอร์มข้อมูลทั้งหมด ถูก โฟกัสเราก็สั่งปิดฟอร์ม collection ได้เลย

Private Sub Form_GotFocus()
DoCmd.Close acForm, "collection"
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: naekkhung

4
ห้อง MS Access / : รวมฟิวส์ Text
« เมื่อ: 02 ก.ย. 63 , 12:15:17 »
ขอบคุณมากๆเลยครับ แต่ตอนนี้ถ้าเกิด text1 เราไม่ต้องการกรอกข้อมูล แต่ตอนรวม มันจะมีค่าเว้นวรรคมาด้วย ถ้าเราไม่ต้องการทำยังไงครับ
ใช้ Trim เข้ามาช่วยครับ


Option Compare Database
Public strText1, strText2, strText3 As Variant

Private Sub Text1_Change()
If Len(Me.Text1.Text) > 0 Then
strText1 = Me.Text1.Text
Else
strText1 = Null
End If
OutPutString
End Sub

Private Sub Text2_Change()
If Len(Me.Text2.Text) > 0 Then
strText2 = Me.Text2.Text
Else
strText2 = Null
End If
OutPutString
End Sub

Private Sub Text3_Change()
If Len(Me.Text3.Text) > 0 Then
strText3 = Me.Text3.Text
Else
strText3 = Null
End If
OutPutString
End Sub

Private Sub OutPutString()
Me.total = Trim(strText1 & IIf(IsNull(strText2), Null, " " & strText2) & IIf(IsNull(strText3), Null, " " & strText3))
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: naekkhung

5
ห้อง MS Access / : รวมฟิวส์ Text
« เมื่อ: 31 ส.ค. 63 , 16:03:16 »
เราสามารถที่จะพอทำได้ครับ โดยใช้การกำหนด ประกาศตัวแปรเป็น Public นะครับ
ผมสมมุติ text1 ถึง text3 และ textbox แสดงชื่อ total
เพราะโดยปกติ .Text จะใช้ได้กับ คอนโทรลที่ โฟกัสอยู่เท่านั้น
เราจึงควรสร้างตัวแปรขึ้นมาเก็บค่าไว้ก่อนเพื่อนำไปต่อกับ ตัวแปรต่อๆไป ครับ

ดังตัวอย่างโค้ดนี้

โค๊ด: [Select]
Option Compare Database
Public strText1, strText2, strText3 As Variant

Private Sub Form_Current()
Me.total = strText1 & " " & strText2 & " " & strText3
End Sub

Private Sub Text1_Change()
If Len(Me.Text1.Text) > 0 Then
strText1 = Me.Text1.Text
End If
Me.total = strText1 & " " & strText2 & " " & strText3
End Sub
Private Sub Text2_Change()
If Len(Me.Text2.Text) > 0 Then
strText2 = Me.Text2.Text
End If
Me.total = strText1 & " " & strText2 & " " & strText3
End Sub
Private Sub Text3_Change()
If Len(Me.Text3.Text) > 0 Then
strText3 = Me.Text3.Text
End If
Me.total = strText1 & " " & strText2 & " " & strText3
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: naekkhung

6
ห้อง MS Access / : รวมฟิวส์ Text
« เมื่อ: 31 ส.ค. 63 , 15:24:27 »
เท่าที่ทราบคือไม่ว่าจะใช้เงื่อนไขไหนก็ต้องพิมพ์เสร็จหรือ Enter ก่อนข้อมูลที่อื่นถึงจะอัพเดทครับ / จะให้เป็นแนวว่าระหว่างพิมพ์ช่องหนึ่งอยู่แล้วให้อีกช่องอัพเดทแบบ Realtime ทันทีเลยทั้งที่ยังไม่ตกลงคงจะไม่มีนะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: naekkhung

7
Event Exit ของ combobox ครับ
จากตัวอย่าง combobox ชื่อ cbresult ครับของคุณชื่ออะไร ใส่ชื่อให้ตรงกัน
เช่น

Private Sub cbresult _Exit(Cancel As Integer)
Mycheck
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: naekkhung

8
สร้างคิวรี่ ขึ้นมาครับเพื่อรวบรวมว่า ในแต่ละวันได้ระบุ Result ว่าอะไร....   และระบุไปจำนวนกี่ครั้งแล้ว

แล้วสร้าง Dlookup มาเช็คจำนวนครั้งการระบุ Result ได้เลยครับ ถ้าเจอว่า ในวันนั้นเจอการระบุ Result แล้ว หรือ >1 ก็ให้ทำตามเงื่อนไขเช่นแจ้งเตือนเป็นต้น
ส่วนตัวอย่างไว้พรุ่งนี้เน้อ
โพสต์นี้ได้รับคำขอบคุณจาก: naekkhung

9
แนวคือเมื่อใส่เลขงวดไปแล้ว แล้วให้แสดงเฉพาะปุ่มนั้นมีแนวทางตามนี้ครับ

แบบที่1 ทุกปุ่มสั่งล็อคใว้ Enabled = No จะปลดล็อคเมื่อเลขงวดตรง
โค๊ด: [Select]
Private Sub Text5_AfterUpdate()
GetNum = Me.Text5
    Select Case GetNum
        Case "1": Me.Command1.Enabled = True
        Case "2": Me.Command2.Enabled = True
        Case "3": Me.Command3.Enabled = True
        Case "4": Me.Command4.Enabled = True
    End Select
End Sub

แบบที่2 ทุกปุ่มสั่งซ่อนใว้(ยังไม่แสดง) Visible = No จะแสดงปุ่มเมื่อเลขงวดตรง
โค๊ด: [Select]
Private Sub Text5_AfterUpdate()
GetNum = Me.Text5
    Select Case GetNum
        Case "1": Me.Command1.Visible = True
        Case "2": Me.Command2.Visible = True
        Case "3": Me.Command3.Visible = True
        Case "4": Me.Command4.Visible = True
    End Select
End Sub

ทั้งสองแบบต่างกันที่การตั้งค่าปุ่มบนหน้าฟอร์มกับชุดคำสั่งเพียงเล็กน้อย

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

10
ไม่แน่ใจว่าใกล้เคียงที่ต้องการหรือไม่ มีตัวอย่างล็อคอินผู้ใช้แล้วแสดงเมนูเฉพาะของตนเองครับ https://www.thai-access.com/index.php?topic=932.0 แต่ทุกคนที่ใช้ฟอร์มนั้นๆได้ จะมีสิทธิ์เท่ากันทุกอย่าง ถ้าจะกำหนดว่าผู้ใช้คนนี้จะทำอะไรได้บ้างในหน้าฟอร์มนั้นๆ เช่น ดูได้อย่างเดียว หรือแก้ไขได้ด้วย แนะนำว่าเพิ่มเทเบิลของกลุ่มผู้ใช้ซึ่งจะเก็บว่ากลุ่มนี้มีใครบ้าง (คนนึงสามารถอยู่ได้หลายๆกลุ่ม) และเพิ่มเทเบิลสิทธิ์ของกลุ่มนี้ที่มีต่อฟอร์มนั้นๆว่า กลุ่มนี้เมื่อใช้ฟอร์มนั้นแล้ว จะมีสิทธิ์ชื่อว่าอะไรบ้าง เช่น ชื่อสิทธิ์ว่า "AE" (หมายถึง Add และ Edit ได้)   เมื่อเปิดฟอร์มที่ใช้งานขึ้นมา ก็เขียนโค้ดหาจากเทเบิลว่านาย ก. อยู่กลุ่มผู้ใช้ไหนบ้าง และรวมแต่ละกลุ่มที่พบแล้ว นาย ก. มีสิทธิ์รวมทั้งสิ้นอะไรที่ใช้กับฟอร์มนั้นได้บ้าง เมื่อฟอร์มจะทำการรับการป้อนเรคอร์ดใหม่ ก็ตรวจเลยว่าถ้าไม่มีสิทธิ์ A ก็ไม่ให้ทำ อย่างนี้เป็นต้นครับ
โพสต์นี้ได้รับคำขอบคุณจาก: naekkhung

11
ผมแก้ไขให้แล้วครับ
ส่วนที่แก้ คือถ้ามี Customercode ก็ต้องเอาอันนี้แหละมาอ้างอิงแทน ID ครับ
โดยโค้ดกรองฟอร์มก็จะเป็น
DoCmd.OpenForm "FrmMain_Con", , , "[customer_code]='" & Me![txtcustomer_code] & "'"

มีเครื่องหมาย single quote เพราะ ข้อมูลเป็น text ไม่ใช่ตัวเลขครับ

ส่วนโค้ดของ ระบบแจ้งเตือนก็เปลี่ยนเป็นแบบนี้

โค๊ด: [Select]
Private Sub Form_Current()
Dim CheckMaxDate As Date
CheckMaxDate = Nz(DMax("Date_time_co", "[ตาราง call]", "[ResultCode_Remark]=""ติดต่อได้"" AND customer_code ='" & Forms!frmmain_Con!txtcustomer_code & "'"))

If Not IsNull(CheckMaxDate) And CheckMaxDate >= Date Then
MsgBox "วันนี้คุณได้โทรหาลูกค้าแล้ว", vbInformation, "สถานะ!!"
End If
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: naekkhung

12
มันต้องหา Event การทำงานให้มันครับ

ผมไม่แน่ใจว่าในโปรแกรมของคุณจะตรวจสอบตอนไหน ว่ามีการติดต่อแล้ว

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

13
ตาราง เชื่อมกับ subform ชื่อ ตาราง call ไหมครับ

โค้ดง่ายๆ โดยเช็คกับวันที่ปัจจุบัน และ เช็คเงื่อนไข การระบุ ติดต่อได้

น่าจะต้อง เช็คเงื่อนไขกับ ID ลูกค้าไว้ด้วยครับ ประมาณนี้
ส่วนที่จะเช็คเงื่อนไขคือ
ID ลูกค้า
Date_time_co เก็บวันที่
ResultCode_Remark เก็บสถานะ

Dim CheckMaxDate As Date
CheckMaxDate = Nz(DMax("Date_time_co", "[ตาราง call]", "[ResultCode_Remark]=""ติดต่อได้"" AND ID =" & Forms!ชื่อฟอร์มหลัก!txtID))

If Not IsNull(CheckMaxDate) And CheckMaxDate = Date Then
MsgBox "วันนี้คุณได้โทรหาลูกค้าแล้ว", vbInformation, "สถานะ!!"
End If


Event เลือกเอานะครับ ว่าจะเช็คจาก Event ไหน
โดยจากตัวอย่างผมให้ เช็ค ID จาก textbox ชื่อ txtID
เช็ควันที่ปัจจุบัน กับ วันที่ๆ ลงในระบบไว้แล้ว และตรวจสอบว่า มีการระบุ ติดต่อได้ ไว้หรือไม่


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

14
พอดีมีเวลาและเห็นว่ามีหลายครั้งที่มีการถามถึงการสร้างฟอร์มล็อคอินและเมนู ผมเลยเขียนตัวอย่างขึ้นมาเอาไว้ให้เป็นแนวทางในการศึกษาครับ

ระบบมี 2 เทเบิลคือ tbUser ไว้เก็บ ID,รหัสผ่าน,และเมนูที่จะใช้ ในขณะที่อีกเทเบิล tbMenu จะเก็บว่าแต่ละเมนูมีโครงสร้างอย่างไร

ฟอร์มหลักๆคือ FmLogon เพื่อรับ ID และรหัสผ่านผู้ใช้ เมื่อป้อนถูกต้องแล้ว ระบบก็จะเปิดฟอร์ม FmMenu เพื่อแสดงเมนูของแต่ละคน เมื่อคลิกหรือเลื่อนมาที่แต่ละรายการในเมนู คำอธิบายของรายการนั้นจะแสดงที่กรอบด้านล่าง แต่ถ้าดับเบิลคลิก จะเป็นการเปิดหน้าฟอร์ม/รายงานของรายการนั้น พร้อมกับตัวเมนูจะถูกหดย่อลงไป และจะกลับมาแสดงโดยอัตโนมัติเมื่อปิดฟอร์ม/รายงานที่ได้เปิดไป หลังจากปิดเมนู ก็จะกลับมาเปิดฟอร์มล็อคอินอีกครั้ง  ส่วนฟอร์มและรายงานที่เหลือเป็นแค่ตัวอย่างเพื่อแสดงให้เห็นว่าฟอร์ม/รายงานนั้นได้เปิดจริงๆแล้วเท่านั้น

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

ปล. อย่าถามนะว่า login ID และรหัสผ่านมีอะไรบ้าง  :sweat:
โพสต์นี้ได้รับคำขอบคุณจาก: naekkhung

15
ห้อง MS Access / : cannot open any more tables
« เมื่อ: 25 มี.ค. 62 , 21:58:43 »
เป็นข้อจำกัดของ Access ครับ มันสามารถมีและเปิดตารางได้ไม่เกิน 2000 ตารางครับ ถ้าโปรแกรมมีตารางเยอะ มี query หรือฟอร์มที่อิงตารางเยอะ หรือมีคอมโบบอกซ์หรือ list box ที่อิงกับตารางเยอะๆ แล้วเปิดใช้งานพร้อมๆกัน พอถึงจุดเกิน 2000 ตารางเมื่อไหร่ก็จะมี error นี้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: naekkhung

16
ห้อง MS Access / : cannot open any more tables
« เมื่อ: 24 มี.ค. 62 , 09:09:01 »
ไม่เยอะนะครับ

เท่าที่นึกได้ ถ้าไม่ใช่ไฟล์ที่คุณสร้างเอง อาจมีการฝัง Module ให้ทำไม่ได้ก็เป็นได้

หรือไม่ Access อาจหมดอายุ ถ้าเป็นแถบสีแดงด้านบนก็ใช่เลยครับ หมดอายุ
โพสต์นี้ได้รับคำขอบคุณจาก: naekkhung

หน้า: [1] 2