อยากทราบลำดับที่หายไป
กระทู้เก่าบอร์ด อ.Yeadram

 3,406   11
URL.หัวข้อ / URL
อยากทราบลำดับที่หายไป

ผมมีฐานมูลทหารกองเกิน จำนวน 2000 คน แต่ใช้ใบสำคัญไปจำนวน 2020 ใบ (ครบ 2000 คนพอดี) แต่พอจะรู้ว่าใบสำคัญชำรุดใช้การไม่ได้ไป 20 ใบ                        ( 2020 -2000) แต่ผมอยากรู้ว่าใบสำคัญลำดับใดที่หายไป
                     เช่น 1 เล่ม มีใบสำคัญ 100 ใบ ใช้ได้ 98 คน ชำรุด 2 ใบ อยากรู้ว่าลำดับใดที่ชำรุด

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

1 @R17006
ต้องดูก่อนว่าออกแบบฐานข้อมูลไว้อย่างไร แต่ดูจากโจทย์แล้ว ข้อนี้ก็ไม่ยากอะไร ทำได้หลายวิธี
2 @R17007
การออกแบบ
1.เขตข้อมูล จะมี [ปีใบสำคัญ], [เล่มที่] และ [เลขที่] ต่อ 1 คน/1ใบ เช่น นาย ก ใบสำคัญ เล่มที่ 1 เลขที่ 1 (ใน 1 เล่ม มี 100 ใบ)
2.ที่ผมใช้ในคิวรี [ระบุปีใบสำคัญ] [ระบุเล่มที่] และ [ระบุเลขที่] แล้วใช้ count(*) นับจำนวน เช่น ปี 2557 เล่มที่ 1   ผลรวมมี 98 คน แต่เราใช้ใบสำคัญไป 100 ใบเรา อยากทราบเลขที่ใดบ้างที่ชำรุดไป 2 ใบ ก็ต้องมาตรวจสอบเลขว่าเลขใด (เช่น 1,2,3,4,5,9...) เลขที่หายไป เลขที่ 6,7 หายไป
3.มีวิธีใดบ้างเผื่่อผมมาทดลองทำดู
3 @R17008
- ผมพยายามจะทำความเข้าใจกับตารางของคุณก่อนนะครับ คือ คุณหมายถึง มีตารางข้อมูลอยู่เพียงตารางเดียว สมมุติมีฟิวด์อยู่ 4 ฟิวด์ คือ 1.ปีใบสำคัญ 2.เล่มที่ 3.เลขที่ 4.ชื่อ-สกุล โดยฟิวด์เลขที่นั้น เป็นแบบเรียงลำดับไปเรื่อยๆตั้งแต่เลข1
   - พอคุณทำคิวรี่นับเลขที่ สมมุติของ ปี 2557 เล่มที่ 1 คุณนับได้ 98 ใบ (แสดงว่ามีข้อมูลอยู่ 98 records หรือมีเลขที่ 2 ใบที่หายไป สมมุติคือเลขที่ 6,7)

   ไม่รู้ว่าผมเข้าใจโจทย์ถูกหรือเปล่าครับ
4 @R17009
-ถูกต้องครับ
- เพิ่มเติม ใน 1 เล่ม มี 100 ใบ ผมตี Running 1-100 แต่ผมลงบัญชีทหารกองเกินได้เพียง 98 คน ใช้ Count(*) (คนที่ 98 เลขที่ Running=100)   พอไล่นับจึงทราบว่าเลขที่ 6,7 หายไป เพราะว่าชำรุดไม่ได้นำมาใข้งาน เมื่อนำมารวมกันแล้ว= 100 ใบพอดี
   - ต้องการให้แสดงเลขที่ที่หายไป เช่น เลขที่ 6,7
5 @R17013
การออกแบบตารางเดียวแบบนี้และไม่ได้บันทึกข้อมูลไว้หมดทุกรายการ ปัญหาคือ ไม่มีอะไรเป็นตัวเปรียบเทียบเพื่อดึงเลขที่หายไปออกมา วิธีแก้ปัญหาเฉพาะหน้าที่ผมคิดได้ตอนนี้คือ ถ้าเราสร้างตาราง Temp ขึ้นมาให้มีเลข Running No. อยู่ครบ เพื่อใช้เปรียบเทียบ ก็จะสามารถดึงเลขที่หายไปออกมาได้ครับ โดยใช้ตัว Unmatch Query มาช่วยเปรียบเทียบหาได้ครับ

ทั้งนี้ อาจมีอาจารย์ท่าั้นอื่นที่มีวิธีแก้ปัญหาโจทย์นี้ได้ดีกว่าผม ผมก็รบกวนขอความรู้ด้วยคนครับ

(ปล. ถ้าสมมุติว่าเราออกแบบเพิ่มอีก 1 ฟิวด์ในตารางนี้ เป็นแบบ yes/no เพื่อใช้บอกสถานะการชำรุดของเอกสาร แล้วต่อไปก็ลงบันทึกให้ครบหมดทุกรายการ เวลาจะดูว่ารายการไหนที่หายไป ก็ทำคิวรี่กำหนดจากสถานะ จะสามารถหาคำตอบได้โดยง่ายเลยนะครับ)
6 @R17015
ผมขอยกตัวอย่างง่ายๆ ให้คุณลองไปปรับใช้ดูแล้วกันนะครับ
สมมุติว่าผมมีตารางชื่อ Table1 ในตารางมีฟิลด์ชื่อ ID สำหรับเก็บเลขตามลำดับเรคคอร์ดที่สร้างขึ้น ที่นี่บางเรคคอร์ดมีการลบที่ไป เช่น 1,2,3,4,6,7,9... พอมากขึ้นผมต้องการหาว่าเลข ID ไหนผมหายไปบ้าง ผมก็จะเขียนโค๊ดบนฟอร์มประมาณนี้ครับ
- สร้างปุ่มขึ้นมา ใส่โค๊ดใน On Click

    Dim Last_Num As Long, i As Long, beLost As String
    Last_Num = DLast("ID", "Table1")
    For i = 1 To Last_Num
        If IsNull(DLookup("ID", "Table1", "ID = " & i)) Then
            If beLost & "" = "" Then
               beLost = i
            Else
               beLost = beLost & ", " & i
            End If
        End If
    Next
    MsgBox "เลขที่ " & beLost

ประมาณนี้ครับ ไม่รู้ตรงตรรกะที่คุณต้องการหรือเปล่า ปรับใช้ดูนะครับ
7 @R17022
ขอบคุณครับ

ทดลองแล้ว แต่มันไม่ตรงประเด็น
-ตัวอย่าง
      นายดำ   แดง   (แล้วมีข้อมูลอีกมาก) และบันทึก ปีใบสำคัญ(2557) เล่มที่ (1) เลขที่(66)
       พอนำใบสำคัญเลขที่ 66 ไปพิมพ์ เกิดปัญหา เช่น พิมพ์ไม่ตรง อื่น ๆ ไม่สามารถมอบให้กับทหารกองเกินได้ เราจึงนำใบสำคัญเลขที่ 67 (แล้วแก้ไขข้อมูลจากเลขที่ 66 เป็น 67) พิมพ์ข้อมูล สำเร็จ
       พอสิ้นปีการลงบัญชีทหารกองเกิน เราต้องการทราบว่า เลขที่ใดบ้างที่ชำรุด/ใช้การไม่ได้ พอคลิก ให้แสดงสิ่งที่เราไม่ได้ใช่
                  ปีใบลำคัญ 2557
                  เล่มที่        1
                  เลขที่          66
        เพื่อให้ง่ายในการตรวจสอบหลักฐาน
ท่านอาจารย์ท่านใดที่มีความสามารถแก้ไขปัญหา....ขอบคุณล่วงหน้าครับ




































8 @R17026
ผมลองทำดูตามแบบของผม ก็ทำได้นะครับ คือ
1. สร้างตาราง Temp ขึ้นมาเองก่อน โดยให้มีเลข Running No. ครบทุกจำนวน (สร้างเองโดย Copy จาก Excel มาแปะก็ได้ หรือใช้ Function Access ชื่อ GetNextCounter([FieldName]) สร้างก็ได้ หรือเขียน Loop โดยใช้ VBA ก็ได้)

2. ใช้ Unmatch Query เปรียบเทียบหาตัวเลขที่หายไป ก็จะได้ผลลัพธ์ตามต้องการครับ (ถ้าฝาก email ไว้ได้ จะส่งตัวอย่างที่ทำไว้ไปให้ดูครับ)


9 @R17032
ผมขอยกตัวอย่างง่ายๆ ให้คุณลองไปปรับใช้ดูแล้วกันนะครับ
สมมุติว่าผมมีตารางชื่อ Table1 ในตารางมีฟิลด์ชื่อ ID สำหรับเก็บเลขตามลำดับเรคคอร์ดที่สร้างขึ้น ที่นี่บางเรคคอร์ดมีการลบที่ไป เช่น 1,2,3,4,6,7,9... พอมากขึ้นผมต้องการหาว่าเลข ID ไหนผมหายไปบ้าง ผมก็จะเขียนโค๊ดบนฟอร์มประมาณนี้ครับ
- สร้างปุ่มขึ้นมา ใส่โค๊ดใน On Click

    Dim Last_Num As Long, i As Long, beLost As String
    Last_Num = DLast("ID", "Table1")
    For i = 1 To Last_Num
        If IsNull(DLookup("ID", "Table1", "ID = " & i)) Then
            If beLost & "" = "" Then
               beLost = i
            Else
               beLost = beLost & ", " & i
            End If
        End If
    Next
    MsgBox "เลขที่ " & beLost

ประมาณนี้ครับ ไม่รู้ตรงตรรกะที่คุณต้องการหรือเปล่า ปรับใช้ดูนะครับ

จากข้อมูลของอาจารย์ TTT
จากกรณีดังกล่าว พอลำดับไป ถ้าเราอยากขยับให้ข้อมูลเรียงกันใหม่
จะต้องเขียนโค้ดอย่างไรครับ เช่น 1,2,3,4,6,7,9... ขยับใหม่
อยากได้เป็น 1,2,3,4,5,6,7
ประมาณนี้คับผม
10 @R17033
ผมขอฝากเมลล์ sadsadeekabchoeng@hotmail.com
ขอคุณล่วงหน้านะครับ
11 @R17035
@LADA ถ้าให้ตอบแบบง่ายสุด คุณก็อาจใช้การสร้างฟิลด์ Autonumber ขึ้นมาใหม่อีกฟิดล์ในตารางเดิม โปรแกรมมันจะรันเลขเรียงให้เองครับ แต่ถ้าอยากแก้ของเดิมโดยใช้การเขียนเป็นโค๊ด เราก็อาจเขียนเป็นแนวๆนี้ได้ครับ (ใช้ตัวอย่างเดิม)

    Dim rs As DAO.Recordset, i As Long
    i = 1
    Set rs = CurrentDb.OpenRecordset("Table1", dbOpenDynaset)
    rs.MoveFirst
    Do Until rs.EOF
        rs.Edit
        rs!ID = i
        rs.Update
        i = i + 1
        rs.MoveNext
    Loop
    rs.Close: Set rs = Nothing


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