ทำเลข Running Number แบบโค็ต
กระทู้เก่าบอร์ด อ.Yeadram

 4,286   13
URL.หัวข้อ / URL
ทำเลข Running Number แบบโค็ต

ธรรมดาผมจะไม่ใช้ ทำเลข Running Number โดยใช้ Type Auto Number
ผมจะใช้ Text แล้วเวลาใช้ในฟอร์ม ผมจะใช้ Dmax("[ฟิลด์]","ตาราง")+1

งานนนี้ผมเก็บค่าเป็น Text+ตัวเลข เช่น Un00578 ผมจึงต้องอสร้าง Query
แล้วใน Query เลือกฟิลด์นี้มาใส่ฟังชั่น Val(Right(ฟิลด์,5)) ในฟอร์ม Event
AfterUpdate ก็อ้าง แบบนี้ Me.textbox = Dmax("[ฟิลด์]","Query")+1

คำถามมีอยู่ว่า ผมต้องเขียนโค๊ตยังงัยโดยไม่ต้องทำ Query



13 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R14511
DMax("Val(Right(ฟิลด์,5))", "ตาราง") + 1
2 @R14517
ไม่ใช่ครับอาจาร TTT

เอาใหม่ ตอนนี้ผมใช้ combobox เลือกข้อมูลแล้ว Event
AfterUpdate ผมใช้คำสั่ง Me.textbox = Dmax("[ฟิลด์]","Query")+1

คำถามมีอยู่ว่า ผมต้องเขียนโค๊ตยังงัยโดยไม่ต้องทำ Query หมายถึง
เอา Query มาเขียนเป็นโค๊ตแทน

SELECT Val(Right([ฟิลด์],5)) FROM ตาราง;

โดยที่บรรทัดนี้มาอยู่ใน AfterUpdate โดยไม่ต้องสร้าง Query ครับ

3 @R14518
งง ครับ
4 @R14520
คือผมไม่อยากให้มี Query เยอะ ผมจะเปลี่ยนเป็นโคตแทน
ปัจจุบันผมก็อ้างถึง Query โดยใช้แบบนี้
Me.textbox = Dmax("[ฟิลด์]","Query")+1
ผมอยากจะเขียนเป็นโคตแทนที่จะอ้างถึง Query

ประมาณแบบนี้
Dim Q As sting
Q=SELECT Val(Right([ฟิลด์],5)) FROM ตาราง;
Me.textbox = Dmax("[ฟิลด์]","Q")+1

ผมลองแล้วมัน Error น่าจะเป็นผิด Syntax
5 @R14521
คุณ Un ผมคงไม่สามารถตอบคำถามของคุณได้นะ แต่อาศัยความรู้สึกแบบ "ครูพักลักจำ" เอามาจาก อ.ต้อง กับ อ.พิชัย อาจารย์ทั้งสองท่านสอนให้ทำในคิวรี แล้วแปลงกลับมาเป็นเอสคิวเอล ไม่ทราบว่าคุณพอเข้าใจหรือเปล่า หรือผมไกด์มาถูกทางหรือเปล่า
เอาใจช่วยให้ทำสำเร็จครับ
6 @R14524
ไม่ใช่ครับพี่TheBeginner อันนั้นผมใช้มานานแล้วครับ คือผมมาอ้างไม่ถูกครับ
อย่างที่ อ.พิชัยบอก ทุกอย่างเอามาเขียนเป็น SQL ได้หมด ผมเลยอยากทำดู
แต่ SQL ผมไม่มีพื้นฐานเลย แค่ จำๆ ลองผิดลองถูก เลย ประยุกไม่ได้ครับ
ถึงเสียดาย ครั้งที่แล้ว ติดเวร TT
7 @R14525
ถ้าจะ code แทนการเรียกใช้ผ่าน Query ที่สร้างไว้
- กรณีใช้ที่ RecordSource ใช้ Me.RecordSource = "Select ..." ได้เลยครับ
- กรณีต้องการเอามาใส่ตัวแปรใน code เช่น ตัวแปร Q = "Select ..." อย่างที่คุณ Un ทำไม่ได้นะครับ
ต้องผ่าน RecordSet ดังนี้ครับ
Dim rs As RecordSet
Dim Q as String
Set rs = CurrentDB.OpenRecordSet ("Select ...", ...)     'ส่วนนี้คือการเปิด recordset ควรศึกษาเรื่อง RecordSet เพิ่มเติมเพราะมีวิธีเรียกใช้หลายแบบและรายละเอียดอีกมาก
Q = rs.Fields(0) + 1
...
8 @R14526
อ.พิชัยครับ ผมแค่จะเอาค่า Dmax มา+1 ครับ
ตอนนี้ผมใช้ Me.textbox = Dmax("[ฟิลด์]","Query")+1
จะเห็นว่า ผมอ้างถึง Query อยู่ ซึ่งผมอยากได้วิธีที่เอา SQL ของ
Query นั้นมาเขียนเลยครับ เดี๋ยวลองแบบ อาจารย์ดูก่อนครับ
9 @R14527
โอเค ได้แล้วครับอาจารย์พิชัย ขอความรู้เพิ่มเติมนิดนึงครับ
Set rs = CurrentDB.OpenRecordSet ("Select ...", ...) บรรทัดนี้คงคล้ายๆ ให้เปิด Query ตาม SQL
Q = rs.Fields(0) + 1 แต่บรรทัดนี้ ไม่เข้าใจครับ Fields(0) เป็นการอ้างอิงถึงอะไร
10 @R14529
RecordSet หมายถึงการสร้าง Table ในระบบแบบชั่วคราว เมื่อเป็น table ก็จะมี record และมี field อยู่ในนั้นเวลาอ้างถึงข้อมูลใน RecordSet สามารถเรียกใช้ได้ 2 แบบ 1) rs!ชื่อfield หรือ 2) rs.Fields(หมายเลขลำดับของ field)
*ปกติหมายเลขลำดับของ field จะเริ่มที่ 0 ตัวอย่าง Select ID, Name
Fields(0) หมายถึง ID, Fields(1) หมายถึง Name
11 @R14530
การใช้ Aggregate Function เช่น DMax(), DMin(), ...
คือการให้ Access สร้าง RecordSet แล้วนำค่าที่ต้องการมาใช้ได้โดยเขียน code แค่บรรทัดเดียว
* เป็นการอำนวยความสะดวกของ Access แต่ข้อเสียคือมันทำงานช้ากว่าการเปิด RecordSet เอง

ดังนั้นหากไม่ถนัดใช้ RecordSet การใช้ DMax() ในกรณีนี้ก็เป็นเรื่องปกติ
ตัวอย่างของกรณีนี้เป็น
Q = DMax("Val(Right(ฟิลด์,5))", "Select ...") + 1
ตามที่คุณ TTT แนะนำมาก็ใช้ได้ครับ เพียงแต่เปลี่ยนจากชื่อตาราง เป็น SQL statement แทน
12 @R14531
เท่าที่ทราบ อากิวเมนท์ที่สองของ Aggregate Function ไม่สามารถรับเป็น SQL Statement ได้นะครับ ได้แต่ชื่อเทเบิลหรือคิวรี่เท่านั้น
13 @R14532
ขอบคุณอาจารย์สันติสุขที่มาช่วยแก้ครับ
(ปกติผมไม่ได้ใช้ function นี้จึงสับสนไปน่ะครับ)

แก้เป็น
Q = DMax("Val(Right(ฟิลด์,5))", "ตาราง") + 1
เหมือนที่คุณ TTT แนะนำ

แต่เข้าใจว่าคุณ Un ต้องการข้อมูลที่มี criteria ก็เพิ่มเป็น
Q = DMax("Val(Right(ฟิลด์,5))", "ตาราง", "เงื่อนไข") + 1
แทนการสร้าง query รอไว้ได้ครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3030s