กระทู้เก่าบอร์ด อ.Yeadram
3,942 6
URL.หัวข้อ /
URL
เตือนข้อมูลซ้ำ
เรียนอาจารย์และผู้รู้ทุกท่านครับ
ผมขอเป็นสมาชิก Access ด้วยคนนะครับ พอดี Search มาเจอเวปที่ให้ความรู้และตอบคำถามที่เกี่ยวกับ Access ได้เป็นอย่าดีมีประโยชน์มากครับ ก็มือใหม่นะครับศึกษาด้วยตนเองขอแลกเปลี่ยนความรู้ด้วยคนนะครับมีข้อปัญหาติดขัดดังนี้ครับ
1. ต้องการให้เตือนข้อความว่า"มีข้อมูลซ้ำ "โดบฟิลด็ข้อมูลเป็น Number ชนิด Long Integer รูปแบบการป้อนข้อมูลเป็นแบบ 0001-53 แต่ถ้าข้อมูลเป็น Text ใช้ If Nz(DLookup) สามาถเตือนได้ครับขอคำแนะนำครับ
2. ถ้ามีการส่งข้อความผ่านระบบแลนเข้ามาก็ให้มี pop Up แจ้งเตือนว่ามีข้อความเข้ามาแล้วเช่น 3 รายการพร้อมรายละเอียด โดยที่เราไม่ต้องคอยเปิดดูบ่อยๆพอจะมี Code หรือแนวทางแนะนำไหมครับ
ผมขอเป็นสมาชิก Access ด้วยคนนะครับ พอดี Search มาเจอเวปที่ให้ความรู้และตอบคำถามที่เกี่ยวกับ Access ได้เป็นอย่าดีมีประโยชน์มากครับ ก็มือใหม่นะครับศึกษาด้วยตนเองขอแลกเปลี่ยนความรู้ด้วยคนนะครับมีข้อปัญหาติดขัดดังนี้ครับ
1. ต้องการให้เตือนข้อความว่า"มีข้อมูลซ้ำ "โดบฟิลด็ข้อมูลเป็น Number ชนิด Long Integer รูปแบบการป้อนข้อมูลเป็นแบบ 0001-53 แต่ถ้าข้อมูลเป็น Text ใช้ If Nz(DLookup) สามาถเตือนได้ครับขอคำแนะนำครับ
2. ถ้ามีการส่งข้อความผ่านระบบแลนเข้ามาก็ให้มี pop Up แจ้งเตือนว่ามีข้อความเข้ามาแล้วเช่น 3 รายการพร้อมรายละเอียด โดยที่เราไม่ต้องคอยเปิดดูบ่อยๆพอจะมี Code หรือแนวทางแนะนำไหมครับ
6 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R04988
โมดูลครับ
ฟอร์มทดสอบครับ (Form2)
- ตั้งเวลา 500
- สร้าง label0 ใส่ข้อความ " "
- ฝังโค้ดครับ
- ลองงาน แล้วรัน Form2
- ขณะรันฟอร์มนี้ ลองย่อโปรแกรม access แล้วไปทำงานอื่น สังเกต ไม่เกิน 10วิ ดูว่า ที่แถบ task bar มีการกระพริบหรือไม่
- ถ้ามันทำงาน ลองเอาไปประยุกต์ดูครับ
ตามโค้ดที่ให้ไปผมลองวางแนวให้แล้วบ้าง คือ การตรวจสอบเรคคอร์ดสุดท้าย แล้วให้เปลี่ยนค่าของตัวแปรกลาง เป็น true
และหากเมื่อคุณทำงานเสร็จต้องอย่าลืม ปรับค่าตัวแปรกลางตัวนี้ให้เป็น false เหมือนเดิม ก่อนจะย่อโปรแรกมไปทำงานอืน
ลองดูครับ จากเน็ตบ้าง จากตัวอย่างเก่าๆ บ้าง จากที่เพิ่งคิดเอาเองบ้าง อิอิ รวมๆ กันมา ลองผิดลองถูกครับ
Declare Function FlashWindow Lib "user32" (ByVal hWnd As Long, ByVal bInvert As Long) As Long
Declare Function apiGetActiveWindow Lib "user32" Alias "GetActiveWindow" () As Long
Declare Function apiGetParent Lib "user32" Alias "GetParent" (ByVal hWnd As Long) As Long
Function GetAccesshWnd()
Dim hWnd As Long
Dim hWndAccess As Long
' Get the handle to the currently active window.
hWnd = apiGetActiveWindow()
hWndAccess = hWnd
' Find the top window (which has no parent window).
While hWnd <> 0
hWndAccess = hWnd
hWnd = apiGetParent(hWnd)
Wend
GetAccesshWnd = hWndAccess
End Function
ฟอร์มทดสอบครับ (Form2)
- ตั้งเวลา 500
- สร้าง label0 ใส่ข้อความ " "
- ฝังโค้ดครับ
Option Compare Database
Dim NewData As Boolean
Dim mhwnd As Long
Private Sub Form_Timer()
Static myFlash As Integer
myFlash = myFlash + 1
If myFlash > 20 Then myFlash = 1
Label0.Caption = myFlash
If myFlash > 14 Then
FlashWindow GetAccesshWnd(), True
FlashWindow Access.hWndAccessApp, True
End If
'If myFlash > 14 Then
' If NewData = False Then checkNewData
' If NewData = True Then
' DoEvents
' FlashWindow GetAccesshWnd(), True
' FlashWindow Access.hWndAccessApp, True
' End If
'End If
End Sub
Sub checkNewData()
NewData = False
'if dlast(.................) <> "" then NewData=True
End Sub
- ลองงาน แล้วรัน Form2
- ขณะรันฟอร์มนี้ ลองย่อโปรแกรม access แล้วไปทำงานอื่น สังเกต ไม่เกิน 10วิ ดูว่า ที่แถบ task bar มีการกระพริบหรือไม่
- ถ้ามันทำงาน ลองเอาไปประยุกต์ดูครับ
ตามโค้ดที่ให้ไปผมลองวางแนวให้แล้วบ้าง คือ การตรวจสอบเรคคอร์ดสุดท้าย แล้วให้เปลี่ยนค่าของตัวแปรกลาง เป็น true
และหากเมื่อคุณทำงานเสร็จต้องอย่าลืม ปรับค่าตัวแปรกลางตัวนี้ให้เป็น false เหมือนเดิม ก่อนจะย่อโปรแรกมไปทำงานอืน
ลองดูครับ จากเน็ตบ้าง จากตัวอย่างเก่าๆ บ้าง จากที่เพิ่งคิดเอาเองบ้าง อิอิ รวมๆ กันมา ลองผิดลองถูกครับ
3 @R05003
เรื่องการส่งไฟล์ตัวอย่าง :
ส่งตัวอย่างไฟล์เข้าที่ gmail ครับ (หน้าแรกเว็บบอร์ดมีแจ้งไว้แล้ว) เป็นเมล์กลางทุกคนเข้าอ่าน เข้าใช้ได้
เขียนหัวข้ออีเมล์ให้สื่อได้ว่าเป็นเรื่องอะไร เกี่ยวข้องกับกระทู้ใด
เพื่อนๆ สมาชิกทุกท่าน มีสิทธิ์เข้าอ่าน เข้าโหลด เข้าตอบกันได้ทุกคนครับ
------------------------------------------------------
เรื่องตัวอย่างโค้ดที่นำไปทดสอบ :
Sub checkNewData()
คุณนำไปประยุกต์ได้อย่าง "ผิดมหันต์" เลยครับ
Dlast() ที่ผมให้ไป ความหมายคือ
- ปกติคุณต้องเป็นคนจบงาน ในแต่ละเรคคอร์ด (ตามที่เข้าใจคุณเล่า) คือ user จากเครื่องอื่นๆ คีย์ข้อมูลเบื้องต้นเข้ามา แล้วคุณจะเข้าไปเพิ่มข้อมูลบางอย่างตามหลัง ดังนั้น แสดงว่า ในทุกๆ เรคคอร์ด คุณ คือคนที่จะจบงานใน แต่ละเรคคอร์ด
- จากเหตุผลนี้แหละครับ เราก็เพิ่มงานเข้าไปในโค้ด คือ เมื่อคุณจบงาน ให้จำค่าอะไรบางอย่าง อาจจะเป็นข้อมูลในช่อง Primary key เอาไว้ ว่าเรคคอร์ดสุดท้ายที่คุณทำแล้ว มันถึงเรคคอร์ดใด สมมติว่า คุณให้มันจำเข้าตัวแปร a
- ใน โปรแกรมย่อย checkNewData() ก็คือ สั่งให้ VBA ไปตรวจสอบรายการสุดท้ายในตาราง ว่าเป็นเรคคอร์ดเดียวกันกับที่คุณจด คุณจำเอาไว้หรือไม่ (เรคคอร์ด a)
If DLast("ชื่อฟิลด์", "ชื่อตาราง") <> a Then NewData = True
- เพราะฉะนั้น การใช้ Dlast ในความหมายของผมคือให้คุณใช้ ฟังก์ชั่นนี้ไปตรวจสอบข้อมูลในตาราง ไม่ใช่ไปตรวจสอบ label0 (ซึ่งผมมองว่าคุณทำผิดมหันต์ ก็ตรงที่ จริงๆ แล้ว dlast() มันตรวจสอบ label ไม่ได้)
- ตามที่ผมให้ไป คือให้พอเป็นแนวทาง ต้องเอาไปประยุกต์อีกที แม้ตอนที่ผมให้ไป ผมยังได้เบรคคำสั่งไว้หลายบรรทัด คุณลองเบรคมันก่อนแล้วหรือยัง ที่ผมเบรคมันไว้ ก็เพราะว่า Dlast() นั่นแหละครับ ที่มันจะมีปัญหา เพราะต้องรอให้คุณเอาไปเติม ค่าอาร์กิวร์เมนต์ต่างๆ เอาเอง ให้ครบถ้วนถูกต้องเสียก่อน ถึงจะปล่อย คำสั่งในบรรทัดที่เบรคออกได้
ลองดูใหม่ครับ
ส่วนการส่งไฟล์ให้ผมดู ผมยังสงสัยอยู่ว่าผมจะเอามารัน มาทดสอบได้อย่างไร เพราะสถานการณ์หรือสภาพแวดล้อมของผมมันไม่เหมือนคุณ ในขณะที่งานของคุณมันต้องทำร่วมกับ วงเน็ตเวอร์ค และให้เครื่องอื่นๆ ป้อนข้อมูลทดสอบในขณะที่โปรแกรมของคุณกำลังทำงาน
แต่ก็เอาเถอะครับ ลองส่งมาดูก็ได้
ส่งตัวอย่างไฟล์เข้าที่ gmail ครับ (หน้าแรกเว็บบอร์ดมีแจ้งไว้แล้ว) เป็นเมล์กลางทุกคนเข้าอ่าน เข้าใช้ได้
เขียนหัวข้ออีเมล์ให้สื่อได้ว่าเป็นเรื่องอะไร เกี่ยวข้องกับกระทู้ใด
เพื่อนๆ สมาชิกทุกท่าน มีสิทธิ์เข้าอ่าน เข้าโหลด เข้าตอบกันได้ทุกคนครับ
------------------------------------------------------
เรื่องตัวอย่างโค้ดที่นำไปทดสอบ :
Sub checkNewData()
คุณนำไปประยุกต์ได้อย่าง "ผิดมหันต์" เลยครับ
Dlast() ที่ผมให้ไป ความหมายคือ
- ปกติคุณต้องเป็นคนจบงาน ในแต่ละเรคคอร์ด (ตามที่เข้าใจคุณเล่า) คือ user จากเครื่องอื่นๆ คีย์ข้อมูลเบื้องต้นเข้ามา แล้วคุณจะเข้าไปเพิ่มข้อมูลบางอย่างตามหลัง ดังนั้น แสดงว่า ในทุกๆ เรคคอร์ด คุณ คือคนที่จะจบงานใน แต่ละเรคคอร์ด
- จากเหตุผลนี้แหละครับ เราก็เพิ่มงานเข้าไปในโค้ด คือ เมื่อคุณจบงาน ให้จำค่าอะไรบางอย่าง อาจจะเป็นข้อมูลในช่อง Primary key เอาไว้ ว่าเรคคอร์ดสุดท้ายที่คุณทำแล้ว มันถึงเรคคอร์ดใด สมมติว่า คุณให้มันจำเข้าตัวแปร a
- ใน โปรแกรมย่อย checkNewData() ก็คือ สั่งให้ VBA ไปตรวจสอบรายการสุดท้ายในตาราง ว่าเป็นเรคคอร์ดเดียวกันกับที่คุณจด คุณจำเอาไว้หรือไม่ (เรคคอร์ด a)
If DLast("ชื่อฟิลด์", "ชื่อตาราง") <> a Then NewData = True
- เพราะฉะนั้น การใช้ Dlast ในความหมายของผมคือให้คุณใช้ ฟังก์ชั่นนี้ไปตรวจสอบข้อมูลในตาราง ไม่ใช่ไปตรวจสอบ label0 (ซึ่งผมมองว่าคุณทำผิดมหันต์ ก็ตรงที่ จริงๆ แล้ว dlast() มันตรวจสอบ label ไม่ได้)
- ตามที่ผมให้ไป คือให้พอเป็นแนวทาง ต้องเอาไปประยุกต์อีกที แม้ตอนที่ผมให้ไป ผมยังได้เบรคคำสั่งไว้หลายบรรทัด คุณลองเบรคมันก่อนแล้วหรือยัง ที่ผมเบรคมันไว้ ก็เพราะว่า Dlast() นั่นแหละครับ ที่มันจะมีปัญหา เพราะต้องรอให้คุณเอาไปเติม ค่าอาร์กิวร์เมนต์ต่างๆ เอาเอง ให้ครบถ้วนถูกต้องเสียก่อน ถึงจะปล่อย คำสั่งในบรรทัดที่เบรคออกได้
ลองดูใหม่ครับ
ส่วนการส่งไฟล์ให้ผมดู ผมยังสงสัยอยู่ว่าผมจะเอามารัน มาทดสอบได้อย่างไร เพราะสถานการณ์หรือสภาพแวดล้อมของผมมันไม่เหมือนคุณ ในขณะที่งานของคุณมันต้องทำร่วมกับ วงเน็ตเวอร์ค และให้เครื่องอื่นๆ ป้อนข้อมูลทดสอบในขณะที่โปรแกรมของคุณกำลังทำงาน
แต่ก็เอาเถอะครับ ลองส่งมาดูก็ได้
4 @R05038
accboard : accgmail
5 @R05040
ไฟล์ตัวอย่างของคุณ ใน 1 ฟอร์ม มีคอนโทรลเป็นสิบๆ
คุณไม่ตั้งชื่อคอนโทรลเลย มันสื่อความหมายไม่ได้เลยว่า combo140 มันหมายถึงตัวไหน ไว้ทำอะไร ต้องนั่งไล่คลำไล่เช็คเอาเอา
ปัญหาของคุณ อาจใช้เวลาในการแก้ แค่ 3นาที
แต่ต้องใช้เวลาในการตามหาสาเหตุถึง 3 ชั่วโมง เพราะไล่ต้นทางปลายทางไม่ได้ ไม่รู้ว่า จาก text1 แล้วไปต่อ text ไหนอีก เห็นโค้ดบอกว่าให้ไปต่อที่ text440 แล้วกว่าจะรู้ว่า text440 มันคืออะไร ใช้ทำอะไร ผูกกับฟิลด์อะไร เมื่อไหร่ล่ะครับจะหาสาเหตุมันเจอ
ผมไม่มานั่งไล่ให้หรอกครับ ไม่ว่างปานนั้น รอท่านอื่นช่วยดูให้นะครับ
คุณไม่ตั้งชื่อคอนโทรลเลย มันสื่อความหมายไม่ได้เลยว่า combo140 มันหมายถึงตัวไหน ไว้ทำอะไร ต้องนั่งไล่คลำไล่เช็คเอาเอา
ปัญหาของคุณ อาจใช้เวลาในการแก้ แค่ 3นาที
แต่ต้องใช้เวลาในการตามหาสาเหตุถึง 3 ชั่วโมง เพราะไล่ต้นทางปลายทางไม่ได้ ไม่รู้ว่า จาก text1 แล้วไปต่อ text ไหนอีก เห็นโค้ดบอกว่าให้ไปต่อที่ text440 แล้วกว่าจะรู้ว่า text440 มันคืออะไร ใช้ทำอะไร ผูกกับฟิลด์อะไร เมื่อไหร่ล่ะครับจะหาสาเหตุมันเจอ
ผมไม่มานั่งไล่ให้หรอกครับ ไม่ว่างปานนั้น รอท่านอื่นช่วยดูให้นะครับ
6 @R05153
ขนาดเวลา สำหรับตามอ่านชื่อคอนโทรลของคุณ ผมยังไม่มีเลย แล้วผมจะเอาเวลาไหนไปนั่งทำตัวอย่าง
โค้ดที่ให้ไปทดลอง ผมอ่านทวนที่คุณโพสต์ตอบมาแล้ว เห็นว่าคุณทำผิดไปอย่าง คือการตั้งชื่อโมดูล คุณตั้งชื่อมันอย่างนั้นไม่ได้ ต้องตั้งชื่อตามหลักการตั้งชื่อ คือ ห้ามซ้ำกับชื่อของ object อื่นๆ
ฟังก์ชั่นใดๆ ที่วางอยู่บนโมดูล ถ้าไม่มีคำว่า Private นำหน้า นั่นถือว่าเป็น object เช่นกัน
ดังนั้นคุณจะไปตั้งชื่อโมดูลซ้ำกับชื่อของฟังก์ชั่นไม่ได้ ลองดูใหม่ครับ
(R05061) เรียน อาจารย์ yeadram ครับ
ไม่เห็นมีท่านใดช่วยตอบเลยครับ ถ้าอาจารย์จะกรุณาช่วยทำไฟล์ตัวอย่างให้ดูหน่อยได้ไหมครับผม
ส่วนไฟล์เดิมผมได้ปรับเรียงไฟล์ใหม่แล้วครับช่วยดูให้อีกทีนะครับ อาจารย์จะตัดส่วนอื่นๆออกให้เหลือเฉพาะ Text ข้อมูลไม่กี่ตัวก็ได้ครับ
ผมอยากเห็นตัวอย่างที่ทำได้ครับ ขอบคุณครับ
ขนาดเวลา สำหรับตามอ่านชื่อคอนโทรลของคุณ ผมยังไม่มีเลย แล้วผมจะเอาเวลาไหนไปนั่งทำตัวอย่าง
โค้ดที่ให้ไปทดลอง ผมอ่านทวนที่คุณโพสต์ตอบมาแล้ว เห็นว่าคุณทำผิดไปอย่าง คือการตั้งชื่อโมดูล คุณตั้งชื่อมันอย่างนั้นไม่ได้ ต้องตั้งชื่อตามหลักการตั้งชื่อ คือ ห้ามซ้ำกับชื่อของ object อื่นๆ
ฟังก์ชั่นใดๆ ที่วางอยู่บนโมดูล ถ้าไม่มีคำว่า Private นำหน้า นั่นถือว่าเป็น object เช่นกัน
ดังนั้นคุณจะไปตั้งชื่อโมดูลซ้ำกับชื่อของฟังก์ชั่นไม่ได้ ลองดูใหม่ครับ
Time: 0.3419s
(ยากแฮะ)
เขียนคำถามข้อ 2 เขียนผิดหรือเปล่า
"ถ้ามีการส่งข้อความผ่านระบบแลนเข้ามาก็ให้มี pop Up แจ้งเตือน"
น่าจะเป็น
"ถ้ามีการส่งข้อมูลผ่านระบบแลนเข้ามาก็ให้มี pop Up แจ้งเตือน"
สถานการณ์คงเป็น (เดา)
-เครื่องเราชื่อ comp1 เป็นทั้งตัวจัดการข้อมูล และฐานข้อมูลโดยใช้ Access
-เราสามารถทำงานผ่านหน้าฟอร์มในเครื่องของเราได้ด้วย
-และขณะเดียวกันเครื่องอื่นๆ เช่น comp2, comp3 ฯลฯ ก็สามารถทำงานได้ในเวลาเดียวกัน ซึ่งมีการเพิ่มข้อมูลเข้าในตารางเดียวกับที่เรากำลังทำงานอยู่ด้วย
-ต้องการดักจับว่า มีข้อมูลเข้ามาในตาราง เมื่อไหร่, ข้อมูลอะไรบ้าง (ที่ไม่ได้มาจากเครื่องเรา)
ถ้าสถานการณ์เป็นอย่างที่ผมเดา สำหรับผม ยากจัง! อิอิ
แต่สำหรับ อ.สุภาพ หรือระดับ อ.สันติสุข น่าจะไม่มีปัญหา
ที่ผมมาตอบ ถือว่าเป็นการมาทักทายครับ อยากให้ทราบว่า ทุกปัญหาทุกคำถาม อย่างน้อยๆ มีผมคนหนึ่งที่เข้าอ่านและพยายามตอบครับ
เป็นกำลังใจขอให้ได้รับคำตอบทีต้องการเร็วๆ ครับ
* ปล. ถ้าว่างๆ จะช่วยหาคำตอบ (ด้วยการลองผิดลองถูก) เหมือนกันครับ เพราะโดยส่วนตัวคิดว่า เป็นโจทก์ที่น่าศึกษาครับ