กระทู้เก่าบอร์ด อ.Yeadram
6,370 5
URL.หัวข้อ /
URL
Function ใน Access
ต้องการเขียน Function ใน Access ต้องไปเริ่มต้นที่ไหน หาไม่เจอ
เคยแต่ใช้งาน Macro..... กรุณาแนะนำด้วยจะขอบคุณยิ่ง
เคยแต่ใช้งาน Macro..... กรุณาแนะนำด้วยจะขอบคุณยิ่ง
5 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R00490
พอไปที่ from ไปที่ Control ไปที่ event Procedure..... ไปที่ Code Builder จะได้ดังนี้
Private Sub Command2_DblClick(Cancel As Integer)
End Sub
ซึ่งวิธีนี้ใช้เป็นแล้ว
แต่หากจะสร้าง Functionตามข้างล่างนี้ ทำไม่เป็นง่ะ
แล้วต้องสร้างปุ่ม Buttom command อย่างไรจึงจะ call Function ได้ รบกวนอธิบายอีกสักนิด ได้มั๊ยจ๊ะ
.....
......................................................คำตอบของ...คำถามที่ก่อนหน้านี้ที่ Pantip................................................................
สอบถามปัญหาการเขียนโค้ดเพิ่มเติมได้ที่ www.thai-access.com ครับ
Function Phon(firstDay as Date, rcCount as long, optional stp =1)
dim i as long
for i =0 to (rcCount-1) step stp
docmd.runsql "Insert Into ชื่อตาราง (ชื่อฟิลด์) Values("'" & dateadd("d",i,rcCount) & "'")
next
End function
วิธีเรียกใช้ครับ
call Phon(วันที่เริ่มต้น, จำนวนรอบ, [step]
เรียกใช้ครั้งเดียวครับ ครบเลย
.................................................................................................................
Private Sub Command2_DblClick(Cancel As Integer)
End Sub
ซึ่งวิธีนี้ใช้เป็นแล้ว
แต่หากจะสร้าง Functionตามข้างล่างนี้ ทำไม่เป็นง่ะ
แล้วต้องสร้างปุ่ม Buttom command อย่างไรจึงจะ call Function ได้ รบกวนอธิบายอีกสักนิด ได้มั๊ยจ๊ะ
.....
......................................................คำตอบของ...คำถามที่ก่อนหน้านี้ที่ Pantip................................................................
สอบถามปัญหาการเขียนโค้ดเพิ่มเติมได้ที่ www.thai-access.com ครับ
Function Phon(firstDay as Date, rcCount as long, optional stp =1)
dim i as long
for i =0 to (rcCount-1) step stp
docmd.runsql "Insert Into ชื่อตาราง (ชื่อฟิลด์) Values("'" & dateadd("d",i,rcCount) & "'")
next
End function
วิธีเรียกใช้ครับ
call Phon(วันที่เริ่มต้น, จำนวนรอบ, [step]
เรียกใช้ครั้งเดียวครับ ครบเลย
.................................................................................................................
3 @R00491
คุณก็เอา Function Phon ไปใส่ต่อท้ายบรรทัดสุดท้ายในโค้ดของฟอร์มที่คุณที่ต้องการ เหมือนอย่างที่ผมเขียนเอาไว้ก่อนหน้านี้แล้ว แล้วคุณออกแบบให้ฟังก์ชั่นนี้ถูกเรียกอย่างไรหล่ะ ? ถ้าออกแบบไว้ว่าให้ถูกเรียกเมื่อ ดับเบิลคลิกที่ปุ่มที่ชื่อ Command2 (อย่างที่ให้ ตย.มา) ก็ให้ใส่โค้ดที่เรียกฟังก์ชั่น Phon ใน Event Command2_DblClick ผลก็จะออกมาเป็น
Private Sub Command2_DblClick(Cancel As Integer)
call Phon(วันที่เริ่มต้น, จำนวนรอบ, step)
End Sub
ปล. ไม่ต้อง "ง่ะ" ไม่ต้อง "นะจ๊ะ" ก็ได้ครับ
Private Sub Command2_DblClick(Cancel As Integer)
call Phon(วันที่เริ่มต้น, จำนวนรอบ, step)
End Sub
ปล. ไม่ต้อง "ง่ะ" ไม่ต้อง "นะจ๊ะ" ก็ได้ครับ
4 @R00492
ถ้าตามที่คุณทำมานี้
คุณต้องการให้ฟังก์ชั่นที่เขียนขึ้นนี้ ใช้ได้เฉพาะในฟอร์มนี้เท่านั่น ก็วาง ฟังก์ชั่นไว้ใน โมดูลของฟอร์มนี้ วางถัดลงไปข้างล่างก็ได้ครับ ขอแค่ อยากไปแทรกระหว่าง end sub ของ sub อื่นเค้าละกัน
สมมติ เช่น ถ้า ปุ่มคำสั่ง Command2 ของคุณ อยู่ในฟอร์ม
งานของคุณคือ ต้องการวนลูป เพิ่มเรคคอร์ด (ตามฟังก์ชั่น) ทีนี้คุณต้องหาข้อมูลที่ฟังก์ชั่นต้องการ
นั่นคือ วันที่เริ่มต้น คือ วันอะไร
จำนวนรอบ จะให้เพิ่มกี่รอบ กี่เรคคอร์ด
แต่ละเรคคอร์ดจะให้ห่างกันกี่วัน (สำหรับฟังก์ชั่นนี้ระบุว่า ถ้าคุณไม่ส่งค่านี้ จะถือว่าให้ห่างกัน 1วัน)
เพราะฉะนั้น คำสั่งต่างๆ ที่อยู่ใน sub ของปุ่มคำสั่ง หลักๆ ก็จะเป็นการหาค่าข้อมูลเหล่านั้นมาเตรียมไว้ เมื่อได้ข้อมูลครบ ก็ค่อยเรียกใช้ ฟังก์ชั่น
ตัวอย่าง ผมวาง sub ของปุ่มคำสั่ง และฟังก์ชั่น ต่อกันลงไปเลยนะครับ
Private Sub Command2_DblClick(Cancel As Integer)
dim fdate as date
fdate =cdate(text1) ' สมมติว่าคุณมี textbox บนฟอร์มนี้ไว้รับค่า วันที่ ชื่อ text1
dim j as long
j = clng(text2) ' สมมติว่าคุณมี textbox อีกตัวบนฟอร์ม ไว้รับค่า จำนวนเรคคอร์ด ชือ่ text2
dim x as integer
if isnumeric(text3) and text3>1 then
x = cint(text3) ' สมมติว่าคุณมี textboxไว้รับค่า ระยะห่างของวันที่ ชือ่ text3
else ' ก็ทำการเช็คไปด้วยว่า มีการกรอกข้อมูลมาหรือไม่ ถ้าไม่มี เตรียม x ให้เป็น1 ไปเลย
x=1 ' แต่ถ้ามีการกรอก ก็ตรวจสอบอีกว่า เป็นตัวเลขที่มีค่ามากกว่า 1 หรือไม่
end if
'เมื่อได้ข้อมูลครบตามที่ฟังก์ชั่นต้องการเราก็เรียกฟังก์ชั่นได้เลยครับ ใส่อาร์กิวเมนต์ต่างๆ เข้าไปตามที่ฟังก์ชั่น ต้องการ
call Phon(fdate, j, x)
End Sub
Function Phon(firstDay as Date, rcCount as long, optional stp =1)
dim i as long
for i =0 to (rcCount-1) step stp
docmd.runsql "Insert Into ชื่อตาราง (ชื่อฟิลด์) Values("'" & dateadd("d",i,rcCount) & "'")
next
End function
----------------------------------------------------------------------------
ผมพยายามเขียนให้มันยืดๆ เพื่อให้ทำความเข้าใจง่าย นะครับ
จริงๆ อาจจะรวบเร็วกว่านั้นได้อีกเยอะครับ ถ้าใช้คล่องเช่น
Private Sub Command2_DblClick(Cancel As Integer)
if isnumeric(text3) and text3>1 then
Phon cdate(text1), clng(text2), cint(text3)
else
Phon cdate(text1),clng(text2)
end if
End Sub
** ถ้าการเรียกใช้ฟังก์ชั่น นำหน้าด้วยคำสั่ง Call อาร์กิวเมนต์ต่างๆ ที่จะระบุต้องให้อยู่ในวงเล็บ
ส่วนถ้าไม่ใช้คำสั่ง Call นำหน้า อาร์กิวเมนต์ต่างๆ ต้องเปลือย ไม่มีวงเล็บคลุม
คุณต้องการให้ฟังก์ชั่นที่เขียนขึ้นนี้ ใช้ได้เฉพาะในฟอร์มนี้เท่านั่น ก็วาง ฟังก์ชั่นไว้ใน โมดูลของฟอร์มนี้ วางถัดลงไปข้างล่างก็ได้ครับ ขอแค่ อยากไปแทรกระหว่าง end sub ของ sub อื่นเค้าละกัน
สมมติ เช่น ถ้า ปุ่มคำสั่ง Command2 ของคุณ อยู่ในฟอร์ม
งานของคุณคือ ต้องการวนลูป เพิ่มเรคคอร์ด (ตามฟังก์ชั่น) ทีนี้คุณต้องหาข้อมูลที่ฟังก์ชั่นต้องการ
นั่นคือ วันที่เริ่มต้น คือ วันอะไร
จำนวนรอบ จะให้เพิ่มกี่รอบ กี่เรคคอร์ด
แต่ละเรคคอร์ดจะให้ห่างกันกี่วัน (สำหรับฟังก์ชั่นนี้ระบุว่า ถ้าคุณไม่ส่งค่านี้ จะถือว่าให้ห่างกัน 1วัน)
เพราะฉะนั้น คำสั่งต่างๆ ที่อยู่ใน sub ของปุ่มคำสั่ง หลักๆ ก็จะเป็นการหาค่าข้อมูลเหล่านั้นมาเตรียมไว้ เมื่อได้ข้อมูลครบ ก็ค่อยเรียกใช้ ฟังก์ชั่น
ตัวอย่าง ผมวาง sub ของปุ่มคำสั่ง และฟังก์ชั่น ต่อกันลงไปเลยนะครับ
Private Sub Command2_DblClick(Cancel As Integer)
dim fdate as date
fdate =cdate(text1) ' สมมติว่าคุณมี textbox บนฟอร์มนี้ไว้รับค่า วันที่ ชื่อ text1
dim j as long
j = clng(text2) ' สมมติว่าคุณมี textbox อีกตัวบนฟอร์ม ไว้รับค่า จำนวนเรคคอร์ด ชือ่ text2
dim x as integer
if isnumeric(text3) and text3>1 then
x = cint(text3) ' สมมติว่าคุณมี textboxไว้รับค่า ระยะห่างของวันที่ ชือ่ text3
else ' ก็ทำการเช็คไปด้วยว่า มีการกรอกข้อมูลมาหรือไม่ ถ้าไม่มี เตรียม x ให้เป็น1 ไปเลย
x=1 ' แต่ถ้ามีการกรอก ก็ตรวจสอบอีกว่า เป็นตัวเลขที่มีค่ามากกว่า 1 หรือไม่
end if
'เมื่อได้ข้อมูลครบตามที่ฟังก์ชั่นต้องการเราก็เรียกฟังก์ชั่นได้เลยครับ ใส่อาร์กิวเมนต์ต่างๆ เข้าไปตามที่ฟังก์ชั่น ต้องการ
call Phon(fdate, j, x)
End Sub
Function Phon(firstDay as Date, rcCount as long, optional stp =1)
dim i as long
for i =0 to (rcCount-1) step stp
docmd.runsql "Insert Into ชื่อตาราง (ชื่อฟิลด์) Values("'" & dateadd("d",i,rcCount) & "'")
next
End function
----------------------------------------------------------------------------
ผมพยายามเขียนให้มันยืดๆ เพื่อให้ทำความเข้าใจง่าย นะครับ
จริงๆ อาจจะรวบเร็วกว่านั้นได้อีกเยอะครับ ถ้าใช้คล่องเช่น
Private Sub Command2_DblClick(Cancel As Integer)
if isnumeric(text3) and text3>1 then
Phon cdate(text1), clng(text2), cint(text3)
else
Phon cdate(text1),clng(text2)
end if
End Sub
** ถ้าการเรียกใช้ฟังก์ชั่น นำหน้าด้วยคำสั่ง Call อาร์กิวเมนต์ต่างๆ ที่จะระบุต้องให้อยู่ในวงเล็บ
ส่วนถ้าไม่ใช้คำสั่ง Call นำหน้า อาร์กิวเมนต์ต่างๆ ต้องเปลือย ไม่มีวงเล็บคลุม
5 @R00499
ขอบคุณมากๆ ท่านได้พยายามอธิบายโดยละเอียด วันนี้ตั่งแต่เช้าแล้ว เพื่อไม่เสียเปล่า ผมจึงศึกษาเรื่อง Module, Procedure, Function จนเข้าใจพอจะทำได้แล้ว อ๋อ ถึงขั้นนี้มันก็คือ VB นั่นเอง
Time: 0.3634s
ใน 2 ส่วนแรก แต่ละส่วนแยกได้เป็นอีก 2 ส่วนย่อยๆคือ ส่วนที่เขียนเพื่อรองรับ Event ต่างๆของ Form , Control ต่างๆในฟอร์ม และรองรับ Event ของ Report เช่น เมื่อเราเปิดฟอร์มก็จะเกิด Form_OnOpen Event และตามด้วย Form_OnLoad Event เป็นต้น Event เหล่านี้จะทำหน้าที่เป็น Sub Procedure ให้เราป้อนคำสั่งต่างๆเพื่อรองรับเหตุการณ์นั้นๆ (ขอไม่อธิบายว่า Event คืออะไรนะครับ ถ้าไม่เข้าใจก็ให้ตั้งกระทู้ถามแยกต่างหากไป) ส่วนการเปิด Event เหล่านี้ขึ้นมา ก็ให้ไปที่ Form, Control หรือ Report ที่เราต้องการแล้วเปิด Property Sheet แล้วไปที่หมวด Event จะเห็นรายชื่อของ Event ต่างๆที่มีให้ เราก็เลือกเป็นคำว่า [Event Procedure] แล้วก็คลิกปุ่ม ... ที่อยู่ข้างท้ายบรรทัด ก็จะเปิดส่วนที่เป็น Editor ของ Visual Basic ขึ้นมาให้ป้อนคำสั่งภาษา VBA ได้ อีกส่วนหนึ่งที่จะเขียนโค้ดได้ก็ยังคงอยู่ในที่เดียวกับส่วนแรก แต่ไม่ได้ผูกกับ Event อะไร ก็คือเป็นส่วนที่เราจะเขียน Procedure ของเราเอง หมายถึงเราต้องเขียนเองเข้าไปเลยว่าชื่อ Function หรือ Sub อะไร จะเขียนแทรกระหว่าง Event Procedure ก็ไม่ผิดกฏอะไร แต่ตามธรรมเนียมแล้วก็จะเขียนต่อท้าย Event Procedure เพื่อให้หาได้ง่ายๆ
แต่ทั้ง 2 ส่วนแรกนั้น ก็มักจะมีคำว่า Private นำหน้า Event Procedure หรือ Procedure ของเรา เพื่อบอกว่า Procedure เหล่านี้เห็นได้จาก Procedure ภายใน Form หรือ Report เดียวกันเท่านั้น ดังนั้น เมื่อต้องการเขียน Procedure ที่ต้องการให้เรียกใช้จาก Form/Report/Module อื่นๆได้ด้วย ก็มักจะเขียนในส่วนที่เรียกว่า Module นั่นเอง เราจะสร้างกี่ Module ก็ได้ เพื่อแยกกลุ่มของ Procedure ของเราให้เป็นหมวดหมู่ ถ้า Procedure ไหนต้องการให้มองเห็นได้จาก Form/Report/Module อื่นๆ ก็ให้นำหน้า Procedure ว่าคำว่า Public แต่ถ้าต้องการให้เห็นกันภายใน Module นั้นๆ ก็ให้นำหน้าด้วยคำว่า Private
ถ้าอยู่ที่ Database Windows แล้วอยากเข้าสู่ Visula Basic Editor เลย ก็ให้กด Alt-F11 ได้เลย
ทั้งหมดนี้ก็คร่าวๆครับ ไปหารายละเอียดการใช้ได้จาก Help File ของ Access ครับ