กระทู้เก่าบอร์ด อ.Yeadram
1,869 7
URL.หัวข้อ /
URL
ต้องการสร้างตารางเก็บข้อมูล ติดปัญหา code ใน form
ต้องการสร้างตาราง ชื่อ tblwip2
โดยมีการสร้าง frmwipmain กับ frmwipdetail ตาม fileแนนชื่่่อ wippm2.mdb
สิ่งที่ต้องการคืือ หลังจาก
Private Sub WDATE_AfterUpdate()
ให้เคอเซอร์ไปอยู่ที่ combo40
End Sub
Private Sub COMBO40_AfterUpdate()
ให้เคอเซอร์ไปอยู่ที่ combo42
End Sub
Private Sub COMBO42_AfterUpdate()
ให้เคอเซอร์ไปอยู่ที่ wtype ของ form frmwipdetail
End Sub
Private Sub REMARK_afterUpdate()
ผมต้องการ ใส่ข้อมูล แล้วกด enter แล้วขึ้นบรรทัดต่อไป
End Sub
ข่อบคุณครับ
โดยมีการสร้าง frmwipmain กับ frmwipdetail ตาม fileแนนชื่่่อ wippm2.mdb
สิ่งที่ต้องการคืือ หลังจาก
Private Sub WDATE_AfterUpdate()
ให้เคอเซอร์ไปอยู่ที่ combo40
End Sub
Private Sub COMBO40_AfterUpdate()
ให้เคอเซอร์ไปอยู่ที่ combo42
End Sub
Private Sub COMBO42_AfterUpdate()
ให้เคอเซอร์ไปอยู่ที่ wtype ของ form frmwipdetail
End Sub
Private Sub REMARK_afterUpdate()
ผมต้องการ ใส่ข้อมูล แล้วกด enter แล้วขึ้นบรรทัดต่อไป
End Sub
ข่อบคุณครับ
7 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R02285
-----------------------------------
การสั่งให้เคอร์เซอร์ไปโฟกัสอยู่ ณ คอนโทรลใดๆ ให้ใช้ method setfocus ของคอนโทรลนั้นๆ ครับ
เช่นต้องการให้ เคอร์เซอร์ไปอยู่ ที่ text1 เราก็เขียนคำสั่ง ว่า
text1.setfocus
บรรทัดเดียวเดี่ยว ไม่ต้องแทรกใคร และไม่ให้ใครแทรก ยกเว้นใช้กับ if...then
if ....... then combo40.setfocus
----------------------------------------
texbox Remark ของคุณ มันอยู่ตัวสุดท้ายของฟอร์มแบบ continuous อยู่แล้ว
ถ้าตั้งค่าคุณสมบัติของมันให้ถูกต้อง มันก็ขึ้นบรรทัดใหม่ให้อัตโนมัตินั่นแหละครับ
คุณสมบัติของ textbox จะหาดูได้ใน แท็บ other
"การทำงานเมื่อกด enter" มีอยู่สองตัวเลือกครับ อิอิ ไปหาเอา
---------------------------------------
การสั่งให้เคอร์เซอร์ไปโฟกัสอยู่ ณ คอนโทรลใดๆ ให้ใช้ method setfocus ของคอนโทรลนั้นๆ ครับ
เช่นต้องการให้ เคอร์เซอร์ไปอยู่ ที่ text1 เราก็เขียนคำสั่ง ว่า
text1.setfocus
บรรทัดเดียวเดี่ยว ไม่ต้องแทรกใคร และไม่ให้ใครแทรก ยกเว้นใช้กับ if...then
if ....... then combo40.setfocus
----------------------------------------
texbox Remark ของคุณ มันอยู่ตัวสุดท้ายของฟอร์มแบบ continuous อยู่แล้ว
ถ้าตั้งค่าคุณสมบัติของมันให้ถูกต้อง มันก็ขึ้นบรรทัดใหม่ให้อัตโนมัตินั่นแหละครับ
คุณสมบัติของ textbox จะหาดูได้ใน แท็บ other
"การทำงานเมื่อกด enter" มีอยู่สองตัวเลือกครับ อิอิ ไปหาเอา
---------------------------------------
3 @R02300
ขอโทษทุกฯท่านด้วย ใช้คำพูดไม่ค่อยสุภาพ อยากถามคุณ yeadram ต่อ
Private Sub ActiveXCtl12_DblClick()
WDATE = ActiveXCtl12.Value
DoCmd.GoToControl "WDATE"
ActiveXCtl12.Visible = False
Combo40.SetFocus
End Sub
Private Sub Combo40_AfterUpdate()
Combo42.SetFocus
End Sub
code ด้านบนสองตัวผ่านได้ตามปกติ
Private Sub Combo42_AfterUpdate()
[FRMWIPDETAIL]![WTYPE].SetFocus
End Sub
ตัวนี้ผมลองหลายครั้งก็ไม่ผ่านสักที่ ช่วยดู code ให้หน่อย คือว่าหลังจาก combo42 update ให้ curcer ไปอยู่ตรง control wtype ของ frmwipdetail
Private Sub ActiveXCtl12_DblClick()
WDATE = ActiveXCtl12.Value
DoCmd.GoToControl "WDATE"
ActiveXCtl12.Visible = False
Combo40.SetFocus
End Sub
Private Sub Combo40_AfterUpdate()
Combo42.SetFocus
End Sub
code ด้านบนสองตัวผ่านได้ตามปกติ
Private Sub Combo42_AfterUpdate()
[FRMWIPDETAIL]![WTYPE].SetFocus
End Sub
ตัวนี้ผมลองหลายครั้งก็ไม่ผ่านสักที่ ช่วยดู code ให้หน่อย คือว่าหลังจาก combo42 update ให้ curcer ไปอยู่ตรง control wtype ของ frmwipdetail
4 @R02302
คุณใช้การอ้างอิงไม่ถูกต้องครับ การอ้างแบบนั้น มักจะใช้กับการอ้างจาก object อื่นเข้าไปหาฟอร์ม (frmwipdetail) ที่กำลังเปิดอยู่ ณ อีกที่หนึ่ง เช่นการอ้างจาก macro หรือการอ้างจาก คิวรี่ แต่ในกรณีนี้ คุณอ้างจากฟอร์มแม่ของมันเอง ต้องอ้าง
me.frmwipdetail.controls("WTYPE").setfocus
frmwipdetail ของคุณเป็นได้สองอย่าง คือ เป็นชื่อคอนโทรล และเป็นแหล่งข้อมูลของคอนโทรลตัวนั้น กล่าวคือ ในฟอร์มหลักของคุณ มี subform (คุณตั้งชื่อมันว่า frmwipdetail) และ subform ของคุณก็ใช้ฟอร์มอื่นมาเป็น source ของมัน (ซึ่งฟอร์มอื่นที่ว่านั่นก็ชื่อ frmwipdetail อีกนั่นแหละ) ทำให้อาจจะงงว่า "frmwipdetail" เป็นชื่อของอะไรกันแน่
ถ้าลองค้นๆ ตามกระทู้เก่าๆ ผมเคยตอบไปหลายครั้งแล้ว เกี่ยวกับการอ้าง ถ้าไม่อยากงง ควรจะตั้งชื่อ subform control อย่าให้เหมือนกับชื่อแหล่งข้อมูล (แม้มันจะทำงานได้ปกติก็เถอะ แต่มันมักจ?ทำให้การอ้างสับสน (สำหรับมือใหม่)
ถ้าฟอร์มย่อยของคุณตั้งชื่อว่า Child1 แต่ใช้ object ที่ชื่อว่า frmwipdetail มาเป็น source เราจะเขียนได้ง่ายและไม่งง เพราะเราจะเขียนว่า
me.child1.controls("WTYPE").setfocus
จะเห็นได้ว่าไม่ได้ยุ่งกับคำว่า "frmwipdetail" เลย
me.frmwipdetail.controls("WTYPE").setfocus
frmwipdetail ของคุณเป็นได้สองอย่าง คือ เป็นชื่อคอนโทรล และเป็นแหล่งข้อมูลของคอนโทรลตัวนั้น กล่าวคือ ในฟอร์มหลักของคุณ มี subform (คุณตั้งชื่อมันว่า frmwipdetail) และ subform ของคุณก็ใช้ฟอร์มอื่นมาเป็น source ของมัน (ซึ่งฟอร์มอื่นที่ว่านั่นก็ชื่อ frmwipdetail อีกนั่นแหละ) ทำให้อาจจะงงว่า "frmwipdetail" เป็นชื่อของอะไรกันแน่
ถ้าลองค้นๆ ตามกระทู้เก่าๆ ผมเคยตอบไปหลายครั้งแล้ว เกี่ยวกับการอ้าง ถ้าไม่อยากงง ควรจะตั้งชื่อ subform control อย่าให้เหมือนกับชื่อแหล่งข้อมูล (แม้มันจะทำงานได้ปกติก็เถอะ แต่มันมักจ?ทำให้การอ้างสับสน (สำหรับมือใหม่)
ถ้าฟอร์มย่อยของคุณตั้งชื่อว่า Child1 แต่ใช้ object ที่ชื่อว่า frmwipdetail มาเป็น source เราจะเขียนได้ง่ายและไม่งง เพราะเราจะเขียนว่า
me.child1.controls("WTYPE").setfocus
จะเห็นได้ว่าไม่ได้ยุ่งกับคำว่า "frmwipdetail" เลย
5 @R02315
ถึงคุณ yeadram ครับ
ผมลอง
Private Sub Combo42_AfterUpdate()
me.frmwipdetail.controls("WTYPE").setfocus
End Sub
ไม่ผ่านครับ ไม่มีอะไรเกิดขึ้นเลย เคอเซอร์ยังอยู่ที่เดิม
อ้างถึง "ถ้าฟอร์มย่อยของคุณตั้งชื่อว่า Child1 แต่ใช้ object ที่ชื่อว่า frmwipdetail มาเป็น source เราจะเขียนได้ง่ายและไม่งง เพราะเราจะเขียนว่า
me.child1.controls("WTYPE").setfocus
จะเห็นได้ว่าไม่ได้ยุ่งกับคำว่า "frmwipdetail" เลย" ตรงนี้ไม่เข้าใจจริงฯครับ
ตามความเข้าใจของผม หมายถึงให้ผมเปลี่่ยนชื่่อ form จาก frmwiporderdetail เป็น่ชื่อ child1 ใช้หรือเปล่าครับ
มือใหม่จริงฯ ครับ
ผมลอง
Private Sub Combo42_AfterUpdate()
me.frmwipdetail.controls("WTYPE").setfocus
End Sub
ไม่ผ่านครับ ไม่มีอะไรเกิดขึ้นเลย เคอเซอร์ยังอยู่ที่เดิม
อ้างถึง "ถ้าฟอร์มย่อยของคุณตั้งชื่อว่า Child1 แต่ใช้ object ที่ชื่อว่า frmwipdetail มาเป็น source เราจะเขียนได้ง่ายและไม่งง เพราะเราจะเขียนว่า
me.child1.controls("WTYPE").setfocus
จะเห็นได้ว่าไม่ได้ยุ่งกับคำว่า "frmwipdetail" เลย" ตรงนี้ไม่เข้าใจจริงฯครับ
ตามความเข้าใจของผม หมายถึงให้ผมเปลี่่ยนชื่่อ form จาก frmwiporderdetail เป็น่ชื่อ child1 ใช้หรือเปล่าครับ
มือใหม่จริงฯ ครับ
6 @R02316
อันนี้ไม่เกี่ยวกับปัญหาเฉพาะหน้าที่เกิดขึ้นนะครับ แต่อยากอธิบายเกี่ยวกับชื่อ
ไม่ใช่ให้เปลี่ยนชื่อฟอร์มครับ
ให้เปลี่ยนชื่อคอนโทรล
ถ้าอยากเห็นภาพชัดๆ นะครับ ลองเอาอย่างนี้
- สำเนาฟอร์มหลักคุณไว้ก่อน
- เปิดฟอร์มหลักในมุมมองออกแบบ
- ลบฟอร์มย่อยออกจากฟอร์มหลัก
- เปิดแถบเมนูเครื่องมือขึ้นมา เราจะวางออบเจคโดยไม่ใช้วิซาร์ด ดังนั้นให้คลิ๊กเอาวิซาร์ดออก (ไอคอนตัวที่สองในแถบเมนูเครื่องมือ)
- หยิบเอาออบเจคฟอร์มย่อย มาวางในฟอร์มหลัก
ถึงตอนนี้คุณจะเห็นแล้วว่า นี่คือ คอนโทรล ซึ่งเป็น sub form เปล่า ยังไม่มี source ให้คุณตั้งชื่อมันว่า child1
- เปิดไดอะล็อค คุณสมบัติ ของ child1 ขึ้นมา
- ไประบุแหล่งข้อมูลให้มัน ว่า frmwipdetail
ทีนี้พอจะแยกออกหรือยังครับ อะไรคือ source อะไรคือคอนโทรล
ถ้าคุณได้ทำให้มันทั้งสองเป็นคนละชื่อแบบนี้แล้วเวลาจะอ้างชื่อก็จะได้ว่า
me.child1.form.controls("wType").setfocus
จะเห็นได้ว่าไม่ได้ยุ่งกับคำว่า "frmwipdetail" เลย เพราะจริงๆ แล้ว คำสั่งนี้ต้องการกระทำกับ คอนโทรล เท่านั้น
ส่วนต่อไปนี้คือไม่ต้องไปรื้ออะไรซะขนาดนั้นก็ได้ครับ แก้ปัญหาเฉพาะหน้าไปก่อนก็ได้
me.frmwipdetail.form.controls("WTYPE").setfocus
(ก่อนนี้ผมลืมใส่ .form เข้าไปครับ) คำว่า frmw... ในที่นี้หมายถึง ชื่อ ของ subform ไม่ได้หมายถึง แหล่งข้อมูล ของ subform
หรือ..
ถ้าในฟอร์มย่อยของคุณมีการเรียง index ของคอนโทรลให้....
WType เป็นคอนโทรลตัวแรกสุด
คุณอาจจะสั่งแค่
me.frmwipdetail.setfocus
เลยก็ได้ คือสั่งให้ เคอร์เซอร์เข้าไปในฟอร์มย่อย แล้วเคอร์เซอร์มันจะวิ่งไปหาคอนโทรลตัวแรก (ที่สถานะไม่ถูก disable) โดยอัตโนมัติครับ
ไม่ใช่ให้เปลี่ยนชื่อฟอร์มครับ
ให้เปลี่ยนชื่อคอนโทรล
ถ้าอยากเห็นภาพชัดๆ นะครับ ลองเอาอย่างนี้
- สำเนาฟอร์มหลักคุณไว้ก่อน
- เปิดฟอร์มหลักในมุมมองออกแบบ
- ลบฟอร์มย่อยออกจากฟอร์มหลัก
- เปิดแถบเมนูเครื่องมือขึ้นมา เราจะวางออบเจคโดยไม่ใช้วิซาร์ด ดังนั้นให้คลิ๊กเอาวิซาร์ดออก (ไอคอนตัวที่สองในแถบเมนูเครื่องมือ)
- หยิบเอาออบเจคฟอร์มย่อย มาวางในฟอร์มหลัก
ถึงตอนนี้คุณจะเห็นแล้วว่า นี่คือ คอนโทรล ซึ่งเป็น sub form เปล่า ยังไม่มี source ให้คุณตั้งชื่อมันว่า child1
- เปิดไดอะล็อค คุณสมบัติ ของ child1 ขึ้นมา
- ไประบุแหล่งข้อมูลให้มัน ว่า frmwipdetail
ทีนี้พอจะแยกออกหรือยังครับ อะไรคือ source อะไรคือคอนโทรล
ถ้าคุณได้ทำให้มันทั้งสองเป็นคนละชื่อแบบนี้แล้วเวลาจะอ้างชื่อก็จะได้ว่า
me.child1.form.controls("wType").setfocus
จะเห็นได้ว่าไม่ได้ยุ่งกับคำว่า "frmwipdetail" เลย เพราะจริงๆ แล้ว คำสั่งนี้ต้องการกระทำกับ คอนโทรล เท่านั้น
ส่วนต่อไปนี้คือไม่ต้องไปรื้ออะไรซะขนาดนั้นก็ได้ครับ แก้ปัญหาเฉพาะหน้าไปก่อนก็ได้
me.frmwipdetail.form.controls("WTYPE").setfocus
(ก่อนนี้ผมลืมใส่ .form เข้าไปครับ) คำว่า frmw... ในที่นี้หมายถึง ชื่อ ของ subform ไม่ได้หมายถึง แหล่งข้อมูล ของ subform
หรือ..
ถ้าในฟอร์มย่อยของคุณมีการเรียง index ของคอนโทรลให้....
WType เป็นคอนโทรลตัวแรกสุด
คุณอาจจะสั่งแค่
me.frmwipdetail.setfocus
เลยก็ได้ คือสั่งให้ เคอร์เซอร์เข้าไปในฟอร์มย่อย แล้วเคอร์เซอร์มันจะวิ่งไปหาคอนโทรลตัวแรก (ที่สถานะไม่ถูก disable) โดยอัตโนมัติครับ
7 @R02327
ผมลองใส่ code ตามคุณ yeadram ดังนี้
Private Sub Combo42_AfterUpdate()
me.child1.form.controls("wType").setfocus
End Sub
ไม่ผ่าน
Private Sub Combo42_AfterUpdate()
Me.CHILD1.SetFocus
End Sub
อันนี้ผ่านฉลุย ขอบคุณ yeadram ครับ
Private Sub Combo42_AfterUpdate()
me.child1.form.controls("wType").setfocus
End Sub
ไม่ผ่าน
Private Sub Combo42_AfterUpdate()
Me.CHILD1.SetFocus
End Sub
อันนี้ผ่านฉลุย ขอบคุณ yeadram ครับ
Time: 0.3762s
อ่านแล้วยังงง