กระทู้เก่าบอร์ด อ.Yeadram
14,879 20
URL.หัวข้อ /
URL
การสร้าง Running Number ใน Query
RunningNo: (Select Count(*) from TableA as TA Where TA.ID <= TableA.ID)
จากตัวอย่างด้านบน เป็นการสร้าง Field Running Number ใน Query
ซึ่งสามารถทำงานได้หากข้อมูลมีไม่มากเกินไป...
แต่ถ้าข้อมูลเยอะๆแล้ว มันจะค่อนข้างช้า ใครพอมีวิธีอื่นไหมครับ
จากตัวอย่างด้านบน เป็นการสร้าง Field Running Number ใน Query
ซึ่งสามารถทำงานได้หากข้อมูลมีไม่มากเกินไป...
แต่ถ้าข้อมูลเยอะๆแล้ว มันจะค่อนข้างช้า ใครพอมีวิธีอื่นไหมครับ
20 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R00876
ขอบคุณครับ
จะเก็บเอาไว้ใช้... นะครับ
เมื่อก่อนผมใช้วิธีสร้าง master table ที่มี AutoNumber ทิ้งวัน
จากนั้นก็ เขียน code ให้ copy master table มาเป็นชื่อใหม่
จากนั้นค่อย run query append เข้าไป ...ก็จะเลข auto run เหมือนกัน
แต่ใจจริงอยากได้ที่ query เลยนะครับ ทำไม MicroSoft เขาถึงไม่ทำมาหนอ
จะเก็บเอาไว้ใช้... นะครับ
เมื่อก่อนผมใช้วิธีสร้าง master table ที่มี AutoNumber ทิ้งวัน
จากนั้นก็ เขียน code ให้ copy master table มาเป็นชื่อใหม่
จากนั้นค่อย run query append เข้าไป ...ก็จะเลข auto run เหมือนกัน
แต่ใจจริงอยากได้ที่ query เลยนะครับ ทำไม MicroSoft เขาถึงไม่ทำมาหนอ
3 @R07188
คุณyeadram คะ
รบกวนขอรายละเอียดเพิ่มเติมได้มั้ยคะ
On Error Resume Next
DoCmd.DeleteObject acTable, "tbTemp"
sq = "Select ...................... INTO tbTemp From .......[where....] [order by...]......"
DoCmd.RunSQL sq
sq = "ALTER TABLE tbTemp ADD COLUMN RN AUTOINCREMENT"
DoCmd.RunSQL sq
อันนี้จะต้องไปใส่ที่ไหนคะ
รบกวนขอรายละเอียดเพิ่มเติมได้มั้ยคะ
On Error Resume Next
DoCmd.DeleteObject acTable, "tbTemp"
sq = "Select ...................... INTO tbTemp From .......[where....] [order by...]......"
DoCmd.RunSQL sq
sq = "ALTER TABLE tbTemp ADD COLUMN RN AUTOINCREMENT"
DoCmd.RunSQL sq
อันนี้จะต้องไปใส่ที่ไหนคะ
4 @R07199
ขอเพิ่มเติมด้วยอีกคนนะครับ
ถ้ามี User มากกว่า 1 คน และต้องการใช้ TBLTemp ข้อมูลที่ได้ของแต่ละคนจะไม่เหมือนกัน แปลว่าจะต้องสร้าง TBLTemp1,TBLTemp2,...TBLTempN หรือเปล่าครับ
หรือเราสามารถสร้างเป็นชื่ออะไรก็ได้ พอใช้เสร็จก็ลบมันทิ้งไปครับ
ถ้ามี User มากกว่า 1 คน และต้องการใช้ TBLTemp ข้อมูลที่ได้ของแต่ละคนจะไม่เหมือนกัน แปลว่าจะต้องสร้าง TBLTemp1,TBLTemp2,...TBLTempN หรือเปล่าครับ
หรือเราสามารถสร้างเป็นชื่ออะไรก็ได้ พอใช้เสร็จก็ลบมันทิ้งไปครับ
5 @R07531
RunningNo: (Select Count(*) from TableA as TA Where TA.ID <= TableA.ID)
ผมต้องเขียนยังไงหรอครับ ผมมี TABLE ชื่อ 555 อะครับ ส่วนตัวที่จะให้นับชื่อ Filed AC ครับ รบกวนด้วยนะครับ
ผมต้องเขียนยังไงหรอครับ ผมมี TABLE ชื่อ 555 อะครับ ส่วนตัวที่จะให้นับชื่อ Filed AC ครับ รบกวนด้วยนะครับ
6 @R07538
ฟิลด์ AC ของคุณในทุกๆ เรคคอร์ด ต้องอยู่ในรูปแบบเดียวกัน เป็นตัวเลขได้จะดีมาก แต่เป็น string ก็ควรจะอยู่ในรูปแบบเดียวกัน ที่สามารถเปรียบเทียบค่ามากกว่า หรือ ค่าน้อยกว่า ได้
(Select Count(*) from [555] as TA Where TA.AC <= [555].AC)
(Select Count(*) from [555] as TA Where TA.AC <= [555].AC)
7 @R14800
ถ้าเอา Code นี้ไปใส่ใน Criteria ของ Query จะต้องเขียนอย่างไรครับ
8 @R14801
@ vit คุณหมายถึงทำในมุมมอง Design ไม่ใช่แบบใส่ที่ SQL หรือเปล่าครับ ถ้าใช่ทำอย่างนี้ครับ
ตัวอย่างนะครับ
- มีตารางข้อมูลชื่อ Table1
- มีฟิลด์ชื่อ aName สำหรับเก็บชื่อลูกค้าดังนี้:
---------
aName
---------
A
B
C
D
E
F
- สำคัญคือฟิลด์ที่จะใช้อ้างในการทำ AutoNumber ต้องมีข้อมูลไม่ซ้ำกันในทุกๆเรคคอร์ด
- สร้างคิวรี่ใหม่ ดึงตาราง Table1 ขึ้นมา ใส่ฟิลด์แรกคือ aName
- ในฟิลด์เปล่าของคิวรี่ใส่โค๊ดดังนี้
AutoNumber: (Select count(*) From Table1 as b Where b.aName <= a.aName)
- เมื่อรันคิวรี่ดูก็จะมีฟิลด์ชื่อ AutoNumber รันเลขเรียงลำดับตั้งแต่ 1,2,3...
เพิ่มเติม
- หากคิวรี่เราต้องการใส่ค่า Criteria เช่น Between 'D' And 'F' เพื่อกรองแค่ชื่อ D ถึง F ในฟิลด์ AutoNumber ก็ต้องใส่เงื่อนไขเพิ่มด้วยเช่นกัน ไม่อย่างนั้นค่าใน AutoNumber จะแสดงค่าของข้อมูลทั้งหมดเสมอ
AutoNumber: (Select count(*) From Table1 as b Where b.aName <= a.aName And b.aName Between 'D' And 'F')
ไม่รู้ตอบตรงคำถามหรือเปล่า ปรับใช้ดูนะครับ
ตัวอย่างนะครับ
- มีตารางข้อมูลชื่อ Table1
- มีฟิลด์ชื่อ aName สำหรับเก็บชื่อลูกค้าดังนี้:
---------
aName
---------
A
B
C
D
E
F
- สำคัญคือฟิลด์ที่จะใช้อ้างในการทำ AutoNumber ต้องมีข้อมูลไม่ซ้ำกันในทุกๆเรคคอร์ด
- สร้างคิวรี่ใหม่ ดึงตาราง Table1 ขึ้นมา ใส่ฟิลด์แรกคือ aName
- ในฟิลด์เปล่าของคิวรี่ใส่โค๊ดดังนี้
AutoNumber: (Select count(*) From Table1 as b Where b.aName <= a.aName)
- เมื่อรันคิวรี่ดูก็จะมีฟิลด์ชื่อ AutoNumber รันเลขเรียงลำดับตั้งแต่ 1,2,3...
เพิ่มเติม
- หากคิวรี่เราต้องการใส่ค่า Criteria เช่น Between 'D' And 'F' เพื่อกรองแค่ชื่อ D ถึง F ในฟิลด์ AutoNumber ก็ต้องใส่เงื่อนไขเพิ่มด้วยเช่นกัน ไม่อย่างนั้นค่าใน AutoNumber จะแสดงค่าของข้อมูลทั้งหมดเสมอ
AutoNumber: (Select count(*) From Table1 as b Where b.aName <= a.aName And b.aName Between 'D' And 'F')
ไม่รู้ตอบตรงคำถามหรือเปล่า ปรับใช้ดูนะครับ
9 @R14803
@ vit คุณหมายถึงทำในมุมมอง Design ไม่ใช่แบบใส่ที่ SQL หรือเปล่าครับ
ถูกต้องครับ.... ผมมี ตาราง Table1 มีฟิลด์ที่มีข้อมูลไม่ซ้ำกัน Job_Code ชนิด Data Type เป็น Text
-----------------
Job_Code
-----------------
0554911921
0554911922
0554911923
ประมาณนี้ครับ
ผมสร้าง Query ใหม่ โดยเอาฟิลด์ Job_Code มาเพียงฟิลด์เดียว
qryTable1 ในมุมมอง Design
|-----------------|-----------------
Field: | Job_Code |
|-----------------|--------------------
Table: | Table1 |
|-----------------|--------------------
Sort: | |
|-----------------|---------------------
Show: | / |
|-----------------|---------------------
Criteria:| |
|-----------------|---------------------
Or: | |
|-----------------|---------------------
ให้เอา AutoNumber: (Select count(*) From Table1 as b Where b.aName <= a.aName)
ใส่ในช่อง Criteria ใช่ใหมครับ
b คือ 0554911922
b.aName คือ 0554911922.Job_Code
a.aName คือ 0554911921.Job_Code
ผมเข้าใจถูกไหมครับ คุณ TTT
ถูกต้องครับ.... ผมมี ตาราง Table1 มีฟิลด์ที่มีข้อมูลไม่ซ้ำกัน Job_Code ชนิด Data Type เป็น Text
-----------------
Job_Code
-----------------
0554911921
0554911922
0554911923
ประมาณนี้ครับ
ผมสร้าง Query ใหม่ โดยเอาฟิลด์ Job_Code มาเพียงฟิลด์เดียว
qryTable1 ในมุมมอง Design
|-----------------|-----------------
Field: | Job_Code |
|-----------------|--------------------
Table: | Table1 |
|-----------------|--------------------
Sort: | |
|-----------------|---------------------
Show: | / |
|-----------------|---------------------
Criteria:| |
|-----------------|---------------------
Or: | |
|-----------------|---------------------
ให้เอา AutoNumber: (Select count(*) From Table1 as b Where b.aName <= a.aName)
ใส่ในช่อง Criteria ใช่ใหมครับ
b คือ 0554911922
b.aName คือ 0554911922.Job_Code
a.aName คือ 0554911921.Job_Code
ผมเข้าใจถูกไหมครับ คุณ TTT
10 @R14804
แก้ไขโค๊ดหน่อยนะครับ เขียนผิด
จาก
AutoNumber: (Select count(*) From Table1 as b Where b.aName <= a.aName)
แก้เป็น
AutoNumber: (Select count(*) From Table1 as a Where a.Job_Code <= Table1.Job_Code)
ตอบคำถาม
(Q) ใส่ในช่อง Criteria ใช่ใหมครับ
(A) ไม่ใช่ครับ ใส่ช่องฟิดล์ว่างๆ ต่อจากฟิลด์แรกเลยครับ
|-----------------|-----------------
Field: | Job_Code | AutoNumber: (Select count(*) From .....
|-----------------|--------------------
Table: | Table1 |
|-----------------|--------------------
Sort: | |
|-----------------|---------------------
Show: | / |
|-----------------|---------------------
Criteria:| |
|-----------------|---------------------
Or: | |
|-----------------|---------------------
ผลลัพธ์
-------------------------------------
Job_Code AutoNumber
-------------------------------------
0554911921 1
0554911922 2
0554911923 3
ปล. ช่อง Criteria เป็นการใส่เฉพาะ เงื่อนไข ที่เราต้องการกระทำกับฟิลด์นั้นๆ
อธิบายเรื่อง From Table1 as a
มันเป็นการสร้างซับคิวรี่ เสมือนการจำลองฟิลด์ย่อยที่เหมือนกับฟิลด์ในตารางจริงเพื่อเอาไว้เทียบค่ากัน ทำให้การใช้ฟังก์ชั่น Count() ใช้งานได้จริง
ลองดูครับ น่าจะประมาณนี้ (มีบ่อยครั้งที่ผมอาจเขียนผิด ไม่ได้ตั้งใจ ลองตรวจสอบดูนะครับ)
จาก
AutoNumber: (Select count(*) From Table1 as b Where b.aName <= a.aName)
แก้เป็น
AutoNumber: (Select count(*) From Table1 as a Where a.Job_Code <= Table1.Job_Code)
ตอบคำถาม
(Q) ใส่ในช่อง Criteria ใช่ใหมครับ
(A) ไม่ใช่ครับ ใส่ช่องฟิดล์ว่างๆ ต่อจากฟิลด์แรกเลยครับ
|-----------------|-----------------
Field: | Job_Code | AutoNumber: (Select count(*) From .....
|-----------------|--------------------
Table: | Table1 |
|-----------------|--------------------
Sort: | |
|-----------------|---------------------
Show: | / |
|-----------------|---------------------
Criteria:| |
|-----------------|---------------------
Or: | |
|-----------------|---------------------
ผลลัพธ์
-------------------------------------
Job_Code AutoNumber
-------------------------------------
0554911921 1
0554911922 2
0554911923 3
ปล. ช่อง Criteria เป็นการใส่เฉพาะ เงื่อนไข ที่เราต้องการกระทำกับฟิลด์นั้นๆ
อธิบายเรื่อง From Table1 as a
มันเป็นการสร้างซับคิวรี่ เสมือนการจำลองฟิลด์ย่อยที่เหมือนกับฟิลด์ในตารางจริงเพื่อเอาไว้เทียบค่ากัน ทำให้การใช้ฟังก์ชั่น Count() ใช้งานได้จริง
ลองดูครับ น่าจะประมาณนี้ (มีบ่อยครั้งที่ผมอาจเขียนผิด ไม่ได้ตั้งใจ ลองตรวจสอบดูนะครับ)
11 @R14805
ผลลัพธ์
-------------------------------------
Job_Code AutoNumber
-------------------------------------
0554911921 3
0554911922 4
0554911923 5
0554910546 2
0554910452 1
0551911935 6
มันได้อย่างนี้ครับ เหมือนการจัดลำดับค่า น้อยสุด = 1 ---- มากสุด = 6
--------------------------------------
วัตถุประสงค์น่าจะเป็นแบบนี้ใช่ไหมครับ
ผลลัพธ์
-------------------------------------
Job_Code AutoNumber
-------------------------------------
0554911921 1
0554911922 2
0554911923 3
0554910546 4
0554910452 5
0551911935 6
คุณ TTT ครับ ช่วยอธิบายให้เข้าใจด้วยครับ หรือว่าผมเข้าใจผิดไปเองครับ ขอบคุณมากครับ
-------------------------------------
Job_Code AutoNumber
-------------------------------------
0554911921 3
0554911922 4
0554911923 5
0554910546 2
0554910452 1
0551911935 6
มันได้อย่างนี้ครับ เหมือนการจัดลำดับค่า น้อยสุด = 1 ---- มากสุด = 6
--------------------------------------
วัตถุประสงค์น่าจะเป็นแบบนี้ใช่ไหมครับ
ผลลัพธ์
-------------------------------------
Job_Code AutoNumber
-------------------------------------
0554911921 1
0554911922 2
0554911923 3
0554910546 4
0554910452 5
0551911935 6
คุณ TTT ครับ ช่วยอธิบายให้เข้าใจด้วยครับ หรือว่าผมเข้าใจผิดไปเองครับ ขอบคุณมากครับ
12 @R14806
เออ...คือ... ไม่รู้จะเขียนสั้นๆ ให้เข้าใจยังไงดี
ก่อนอื่นคุณต้องเข้าใจก่อนว่า การทำ AutoNumber ในคิวรี่นั่นค่อนข้างมีข้อจำกัดมาก ไม่เหมือนการเขียน VBA (หลายคนไม่รู้ด้วยซ้ำว่าสามารถทำได้)
จากตัวอย่างที่คุณทำ การอ้างถึงเงื่อนไขการนับเรคคอร์ด
a.Job_Code <= Table1.Job_Code
ด้วยโอเปอร์เรเตอร์ <= หมายถึงมันจะเริ่มนับ Count() จากเรคคอร์ด a.Job_Code ที่น้อยกว่า Table1.Job_Code ไปจนถึงเรคคอร์ดที่เท่ากัน ว่ามีจำนวนเท่าไร นั่นก็หมายความว่า จากเรคคอร์ดที่ 1 ก็จะมีจำนวน 1 จากเรคคอร์ดที่ 2 ก็จะนับได้ 2 ไปเรื่อยๆ จนหมดเรคคอร์ดนั่นเอง
ที่นี้ข้อจำกัดจากเงื่อนไขที่ว่าก็คือ มันจะใช้ค่าของฟิลด์ Job_Code ในการคำนวณเงื่อนไข <= แล้วแสดงเลข AutoNumber (อย่างที่เขียนไว้ก่อนหน้านี้ว่าฟิลด์ที่ใช้อ้างจะต้องสามารถใช้เทียบค่าเครื่องหมาย < > = ได้)
ดังนั้นหากคุณต้องการเรียงเลข AutoNumber คุณก็ต้องเรียงฟิลด์ Job_Code ด้วย คือที่ช่อง Sort ของฟิลด์ Job_Code เลือกค่าเป็น Ascending หรือหากคุณต้องการเรียงฟิลด์ Job_Code แบบ Descending คุณก็ต้องกลับเครื่องหมายที่โค๊ดจาก <= เป็น >= เลข AutoNumber ถึงจะเรียงจากน้อยไปมาก ทำได้แค่สองกรณี นั่นคือข้อจำกัดของการทำ AutoNumber ในคิวรี่ครับ
ไม่รู้อ่านแล้วจะงงหรือเปล่านะครับ
ก่อนอื่นคุณต้องเข้าใจก่อนว่า การทำ AutoNumber ในคิวรี่นั่นค่อนข้างมีข้อจำกัดมาก ไม่เหมือนการเขียน VBA (หลายคนไม่รู้ด้วยซ้ำว่าสามารถทำได้)
จากตัวอย่างที่คุณทำ การอ้างถึงเงื่อนไขการนับเรคคอร์ด
a.Job_Code <= Table1.Job_Code
ด้วยโอเปอร์เรเตอร์ <= หมายถึงมันจะเริ่มนับ Count() จากเรคคอร์ด a.Job_Code ที่น้อยกว่า Table1.Job_Code ไปจนถึงเรคคอร์ดที่เท่ากัน ว่ามีจำนวนเท่าไร นั่นก็หมายความว่า จากเรคคอร์ดที่ 1 ก็จะมีจำนวน 1 จากเรคคอร์ดที่ 2 ก็จะนับได้ 2 ไปเรื่อยๆ จนหมดเรคคอร์ดนั่นเอง
ที่นี้ข้อจำกัดจากเงื่อนไขที่ว่าก็คือ มันจะใช้ค่าของฟิลด์ Job_Code ในการคำนวณเงื่อนไข <= แล้วแสดงเลข AutoNumber (อย่างที่เขียนไว้ก่อนหน้านี้ว่าฟิลด์ที่ใช้อ้างจะต้องสามารถใช้เทียบค่าเครื่องหมาย < > = ได้)
ดังนั้นหากคุณต้องการเรียงเลข AutoNumber คุณก็ต้องเรียงฟิลด์ Job_Code ด้วย คือที่ช่อง Sort ของฟิลด์ Job_Code เลือกค่าเป็น Ascending หรือหากคุณต้องการเรียงฟิลด์ Job_Code แบบ Descending คุณก็ต้องกลับเครื่องหมายที่โค๊ดจาก <= เป็น >= เลข AutoNumber ถึงจะเรียงจากน้อยไปมาก ทำได้แค่สองกรณี นั่นคือข้อจำกัดของการทำ AutoNumber ในคิวรี่ครับ
ไม่รู้อ่านแล้วจะงงหรือเปล่านะครับ
13 @R14811
พอเข้าใจบ้างแล้วครับ ขอบคุณ คุณ TTT มากนะครับที่เข้ามาตอบปัญหาจะได้หายสงสัยครับ Happy New Year 2013 ครับ
14 @R14812
ยินดีครับ และ สุขสันต์ปีใหม่ เช่นกันครับ
แก้ไขนิดครับ การทำแบบนี้นิยมเรียกว่า Running Number พอดีผมเผลอใช้ชื่อว่า AutoNumber เลยเรียกอย่างไปตลอดเลย
แก้ไขนิดครับ การทำแบบนี้นิยมเรียกว่า Running Number พอดีผมเผลอใช้ชื่อว่า AutoNumber เลยเรียกอย่างไปตลอดเลย
15 @R14832
ขอต่อยอดเรื่องนี้หน่อยนะครับ
พอเราได้ Runing Number แล้ว เราจะใช้ Conditional Format ยังดีกครับว่าถ้า Running Number เป็นเลขคู่ให้ใส่พื้นเป็น น้ำเงิน รบกวนด้วยครับ
พอเราได้ Runing Number แล้ว เราจะใช้ Conditional Format ยังดีกครับว่าถ้า Running Number เป็นเลขคู่ให้ใส่พื้นเป็น น้ำเงิน รบกวนด้วยครับ
16 @R14833
สมมุติ Textbox บนฟอร์มที่ใช้แสดง Running Number ชื่อ Text1 ใน Conditional Formatting = Expression is [Text1] Mod 2=0
17 @R14834
ปล. การทำ Running Number ในคิวรี่ลักษณะนี้ จะมีข้อจำกัดอีกอย่างคือ ข้อมูลที่แสดงจะไม่สามารถแก้ไขเพิ่มเติมได้
18 @R14835
ขอบคุณมากครับ อยากได้ตารางแบบมีสีสันมานานแล้วครับ สมหวังซะที
19 @R14838
Access 2007 + มีคุณสมบัติการสลับสีมาให้อยู่แล้วครับ ไม่ต้องใช้ conditional formating
ชื่อว่า Alternate Back Color อยุ่ใน detail section ครับ
ชื่อว่า Alternate Back Color อยุ่ใน detail section ครับ
20 @R14839
ขอบคุณ คุณ PichaiTC มากครับ ที่ Office ผมเขายังไม่เปลี่ยนเป็น 2007 เลยครับ ตอนนี้ยังใช้เป็น 2003 อยู่ครับ
Time: 0.3859s
เหมาะกับงานที่จำนวนเรคคอร์ดมากๆ
On Error Resume Next
DoCmd.DeleteObject acTable, "tbTemp"
sq = "Select ...................... INTO tbTemp From .......[where....] [order by...]......"
DoCmd.RunSQL sq
sq = "ALTER TABLE tbTemp ADD COLUMN RN AUTOINCREMENT"
DoCmd.RunSQL sq
จะได้ตารางพักชื่อ tbTemp ฟิลด์รันนิ่งอยู่ฟิลด์สุดท้าย ชื่อฟิลด์ว่า "RN"