เก็บเป็น Text แต่อยากเรียงลำดับแบบ Number
กระทู้เก่าบอร์ด อ.Yeadram

 2,681   16
URL.หัวข้อ / URL
เก็บเป็น Text แต่อยากเรียงลำดับแบบ Number

ผมเก็บข้อมูลเป็น Text แต่อยากเรียงลำดับแบบ Number จะทำได้มัยครับ

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

1 @R13050
เรียงด้วยฟังก์ชั่น Val([ฟิลด์เท็กซ์]) ครับ
2 @R13055
เรียน อจ.สันติสุข ขอพลอยไปด้วยนะครับ

1.   หาก text นั้นเป็น 1   ,   2,     3,   3A,    3AB,..........11, .....   13d

2    หรือ 1    ,1.1.....,1.10,1.11,1.13........... 11.1,   11.1a

   จะทำได้ไหมครับ   เป็นปัญหาที่เจอจริงครับ
3 @R13056
@gonna go หมายถึงยังไงครับ ?

เพราะตัวอย่างที่ยกมานั้นมี alphabetic A-Z ติดมาด้วย จะให้มันตัดเอาเฉพาะตัวเลขที่ตีความหมายข้างหน้าใช่ไหมครับ เช่น 3AB ก็ให้ตีความเป็นค่า 3 หรือ 1.11a ก็ให้ตีความว่าเป็นค่า 1.11 ถ้าตามนี้หล่ะก็ Val( ) ก็ยังใช้ได้ครับ

แต่ขอเตือนว่า

1) ข้อมูล 1B อาจได้รับการเรียงมาก่อน 1A ก็ได้ เพราะว่ามีตีความได้เป็นค่า 1 เหมือนกัน จะอะไรเรียงก่อนหรือหลัง อยู่ที่ตัวจัดการฐานข้อมูลมันจะจัดการกันเองครับ เราไปบังคับอะไรไม่ได้

2) ถ้าจำหลักหน้าทศนิยมและหลังทศนิยมหลังจากตีความแล้ว ได้เกิน 15 หลัก (เช่น 12345.12345678901a คือ 16 หลัก) ต้องระวังแล้วนะครับ เพราะอาจทำให้การเรียงลำดับไม่ถูกต้องสักทีเดียว
4 @R13057
อาจต้องแปลงเป็น Ascii ด้วยฟังก์ชั่น Asc() แล้วเรียงลำดับจากฟิลด์นี้
5 @R13059
ทำแบบ อาจารย์สันติสุขแล้วได้แบบที่ต้องการเลยครับ แต่แบบ อาจารย์ TTT มันเปลี่ยนค่าแล้วซึ่งยังไม่ตรงครับ ขอขอบพระคุณอาจารย์ทั้งสองด้วยครับ
6 @R13062
ผมอาจตอบสั้นไป แต่ไม่เป็นไรครับ คุณ Un ทำได้แล้วก็ OK ครับ
แต่ขอให้ตัวอย่างเพิ่มแล้วกัน เผื่อเป็นประโยชน์กับคนอื่นๆ และ คุณ gonna go นำไปปรับใช้ได้

- การแปลงตัวอักษรเป็นค่า Ascii Code สามารถทำได้โดยการใช้ฟังก์ชั่น Asc()
- แต่หากต้องการแปลงทั้งประโยคสามารถทำได้โดยการเขียนฟังก์ชั่นดังนี้:

Function StrToAsc(S As Variant) As Variant
   Dim Temp As String, I As Integer
   
   If VarType(S) <> 8 Then
              
     StrToAsc = S
   Else
      Temp = ""
       For I = 1 To Len(S)
          Temp = Temp & "-" & Format(Asc(Mid(S, I, 1)), "00")
       Next I
       StrToAsc = Right(Temp, Len(Temp) - 1)
End If
End Function


StrToAsc("AaBbCcกขค")

65-97-66-98-67-99-161-162-164
7 @R13063
เท่านี้เราก็สามารถใช้ตัวเลข Ascii ไปอ้างในการเรียงลำดับได้ครับ
8 @R13064
ขอบพระคุณ อจ.สันติสุข และ อจ.TTT

9 @R17705
ถ้าเป็นแบบนี้เรียงไหมครับ

IS-PART B-ALL-01(02)
IS-PART B-ALL-09(02)
IS-PART B-ALL-10(02)
IS-PART B-ALL-100(02)
IS-PART B-ALL-101(01)
IS-PART B-ALL-11(02)

ตัวอย่างเป็นหมายเลขเอกสาร
ระหว่าง 1-99 มันเรียงให้ปกติครับ
แต่ถ้าเกิน 99 (100) มันมาแทรกหลักสิบ ครับ

มีคนบอกว่ามันคิดจากหน้าไปหลัง
S-PART B-ALL-100(02) จึงมีค่าน้อยกว่า
IS-PART B-ALL-11(02)
ทำให้มันเรียงสลับกันไปกับหลักสิบ

มีวิธีแก้ไขให้เรียงเป็นปกติเหมือน Intreger
(แบบตัวเลข) หรือเปล่าครับ
10 @R17706
ถ้าไม่ต้องเอาค่าในวงเล็บมาคิดด้วย ในคิวรี่ ก็ให้สร้างอีกฟิลด์ที่ใช้สำหรับเรียงลำดับ มีนิพจน์เป็น val(mid$(ชื่อฟิลด์,15)) แล้วเลือก sort ตามฟิลด์ใหม่นี้ครับ

แต่ถ้าต้องเอาค่าในวงเล็บมาคิดด้วย ก็สร้างฟิลด์เพิ่มอีกเป็นฟิลด์ที่ 2 (ต้องวางไว้ทางขวาของฟิลด์แรก) ให้มีนิพจน์ val(mid$(ชื่อฟิลด์, instr(1,ชื่อฟิลด์,"(")+1)) แล้วก็ sort ในฟิลด์นี้เพิ่มด้วย   ถ้าค่าในวงเล็บมี 2 หลัก ปิดท้ายด้วยวงเล็บ และไม่มีตัวอักษรอะไรตามมาอีกเสมอ ก็ใช้นิพจน์ val(right(ชื่อฟิลด์, 3)) แทนจะดีกว่า เข้าใจได้ง่ายกว่าครับ
11 @R17714
ไม่เอาค่าในวงเล็บมาคิดครับ
ผมใส่ตามที่อาจารย์แนะนำ



แต่ก็ยังขึ้นแบบนี้อยู่ครับ



หรือว่าผมทำผิดตรงไหนหรือเปล่าครับอาจารย์
12 @R17715
...
13 @R17719
ภาพคุณเล็กมาจนผมมองไม่ออกเลยครับ
14 @R17723
ส่วนที่แก้ไขเพิ่มฟิวล์ที่คิวรี่ครับ


ผลรับจากการค้นหา
15 @R17724
ส่วนที่แก้ไขเพิ่มฟิวล์ที่คิวรี่ครับ
...
16 @R17726
เวปนี้มีปัญหาเรื่องรูปภาพตลอด เพี้ยนไปเป็นรูปอื่น รูปผลของการคิวรี่ผมไม่เห็นคอลัมน์ของฟิลด์ที่เราเพิ่มเลยนะครับ แต่ว่าพอดูจากข้อความที่โพสมาถาม ตกลง IS-PART B-ALL-01(02) ระหว่าง PART กับ B มีช่องว่างหรือเปล่า ถ้าไม่มีก็ต้องเป็นตัวเลข 14 แทน 15 นะครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3337s