ถามเกี่ยวกับการใช้ autonumber ใน query ครับ
กระทู้เก่าบอร์ด อ.Yeadram

 4,216   4
URL.หัวข้อ / URL
ถามเกี่ยวกับการใช้ autonumber ใน query ครับ

พอดีผมลองเล่น Functionตัวนี้ดูและแสดงผลใน Query โดยการรับค่ามา Number:rownum([dummy])


Function rownum(dummy) As Integer
Static firstdummy, row&
If IsNull(firstdummy) Or IsEmpty(firstdummy) Then firstdummy = dummy
If dummy = firstdummy Then row = 1
row = row + 1
rownum = row
End Function

ผลที่รันได้
1
2
3
4
.
.
ect

มันก็รันได้แต่ไม่ตรงกับที่ผมต้องการครับ ที่ผมต้องการคือ
สามารถกำหนดเลขเองได้เช่น กำหนดค่า 001 ให้ก่อได้เป็น

001
002
003
004
005
.
.
.
ect

กำหนดค่า 100 ให้ก่อได้เป็น

101
102
103
104
105
.
ect

โดยที่เปิดมาอีกครั้งเลขก็ยังคงค่าที่เรากำหนดไว้(ไม่ไหลเป็นค่าอื่น)

ไม่ทราบว่าจะเขียนยังไงครับรบกวนผู้รู้อย่างสูงครับพอดีต้องรีบใช้งานแล้ว



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

1 @R16007
ผมลองคร่าวๆ ผมว่าฟังก์ชั่นนี้ใช้ไม่ได้จริงอ่ะครับ หรือผมลองไม่ถูกก็ไม่รู้นะ ลองแล้วเลื่อนค่าไปค่ามามันก็เพี้ยน ยังไงลองใช้แบบซับคิวรี่ดีไหมครับ
ตัวอย่าง
ตารางชื่อ Table1
ฟิลด์ค่าต้องไม่ซ้ำกันชื่อ ID (สำหรับใช้เปรียบเทียบค่าในการทำ Running Number)

- ในคิวรี่ สร้างฟิลด์ใหม่ ใส่โค๊ดดังนี้:
Running No: (Select count(*) From Table1 as a Where a.ID <= Table1.ID)

* หากต้องการเริ่มที่ 100 ก็บวกไปครับ
Running No: (Select count(*) From Table1 as a Where a.ID <= Table1.ID) + 100

* หากต้องการกำหนด Format เป็น 001 002 003 ก็กำหนดใน Property > Format: 000
หรือใส่ในโค๊ดอย่างนี้

Running No: Format((Select count(*) From Table1 as a Where a.ID <= Table1.ID), "000")

ประมาณนี้ ปรับใช้ดูครับ
2 @R16025
ขอบคุณมากครับคุณ TTT รันได้ตามรูปแบบแล้วครับ.
จะขอถามเพิ่มเติมอีกนิดนะครับ ถ้าข้อมูลมาแบบเป็นกลุ่มละครับจะทำยังไงให้นับข้อมูลกันเป็นกุล่มเช่น
Group RunID
1           001
1           002
1           003
2           101
2           102
2           103

อยากจะให้ออกมาในรูปแบบนี้นะครับ รบกวนผู้รู้อีกที อย่างสูงครับ
3 @R16026
คุณก็ต้องเพิ่มเงื่อนไข IF clause และ Where clause เทียบกับฟิลด์ Group อีกทีนึง ประมาณนี้

RunID: IIf([Group]=1,Format((Select count(*) From Table1 as a Where a.ID <= Table1.ID AND a.Group = Table1.Group),"000"),(Select count(*) From Table1 as a Where a.ID <= Table1.ID AND a.Group = Table1.Group)+100)

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

- การเรียงลำดับใน RunID ของคุณ จะให้ตรง คุณต้องเน้นกำหนดให้หน้าต่าง SQL เขียนเรื่องของ ORDER BY ดังนี้:

ORDER BY Group, ID;

คือคุณต้องกำหนด Sort ที่ฟิลด์ Group ก่อนอันดับแรก และตามด้วยฟิดล์ ID เท่านั้น ลำดับของ RunID ถึงจะตรงตามค่าที่คุณให้

ลองปรับใช้ดูครับ
4 @R16058
ดูจากความต้องการแล้ว เข้าใจว่าน่าจะเป็นเลขตายตัวที่จะไม่เปลี่ยนแปลงตามรายงาน
ถ้าใช่ แนะนำว่าเพิ่ม Field เก็บค่า RunID ไปเลยดีกว่า
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3745s