กระทู้เก่าบอร์ด อ.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
โดยที่เปิดมาอีกครั้งเลขก็ยังคงค่าที่เรากำหนดไว้(ไม่ไหลเป็นค่าอื่น)
ไม่ทราบว่าจะเขียนยังไงครับรบกวนผู้รู้อย่างสูงครับพอดีต้องรีบใช้งานแล้ว
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
2 @R16025
ขอบคุณมากครับคุณ TTT รันได้ตามรูปแบบแล้วครับ.
จะขอถามเพิ่มเติมอีกนิดนะครับ ถ้าข้อมูลมาแบบเป็นกลุ่มละครับจะทำยังไงให้นับข้อมูลกันเป็นกุล่มเช่น
Group RunID
1 001
1 002
1 003
2 101
2 102
2 103
อยากจะให้ออกมาในรูปแบบนี้นะครับ รบกวนผู้รู้อีกที อย่างสูงครับ
จะขอถามเพิ่มเติมอีกนิดนะครับ ถ้าข้อมูลมาแบบเป็นกลุ่มละครับจะทำยังไงให้นับข้อมูลกันเป็นกุล่มเช่น
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 ถึงจะตรงตามค่าที่คุณให้
ลองปรับใช้ดูครับ
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 ไปเลยดีกว่า
ถ้าใช่ แนะนำว่าเพิ่ม Field เก็บค่า RunID ไปเลยดีกว่า
Time: 0.3745s
ตัวอย่าง
ตารางชื่อ 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")
ประมาณนี้ ปรับใช้ดูครับ