ปุ่มรันเลขที่บันทึกไปแล้วใหม่ตามเงื่อนไข


0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

10 ม.ค. 65 , 11:47:36
อ่าน 462 ครั้ง

Un

เมื่อเราบันทึกข้อมูลลำดับต่างๆ ลงใบฐานข้อมูลของเราแล้ว
มีการแก้ไข เช่น เพิ่มเรคคอด ลบเรคคอด หรือแก้ไขวันที่บันทึก
ทำให้ข้อมูลลำดับที่บันทึกไว้นั้นเรียงผิด
ผมจึงอยากทำปุ่มไว้เรียงลำดับ โดยเมียเงื่อนไขดังนี้
-เรียงลำดับตามวันที่ ฟิล DateR
-เรคคอดแรก เท่ากับ 1
-วันที่เดียวกันเลขเดียวกัน เช่นวันที่ 2 ถ้าเป็นลำดับที่ 7 ก็เป็น 7 ทุกเรคคอด
-วันที่ถัดไป +1 ลำดับ
ฟิลดืี่บันทึกชื่อ SEQrec
ต้องเขียนโคตปุ่มยังงัยครับ
ขอบพระคุณอาจารย์ที่ช่วยครับ

 

10 ม.ค. 65 , 14:58:03
ตอบกลับ #1

PNR

ลองดูตัวอย่างนะครับ ไม่รู้ต้องการแบบนี้หรือเปล่า
Time to stop for me  :dizzy:
 

10 ม.ค. 65 , 16:05:26
ตอบกลับ #2

Un

อาจารย์ครับ ถ้าผมจะใส่เงื่อนไขเข้าไปอีก เช่น
มีชนิดของรายการ ฟิลด์ TypeR
จะมี TypeR เป็น 1  2  3  4
แล้วเงื่อนไขนี้ ผมจะใส่ที่บรรทัดไหนครับ
รบกวนอาจารย์อีกนิดครับ

 

11 ม.ค. 65 , 11:51:05
ตอบกลับ #3

Un

ที่ไม่บอกเงื่อนไขให้หมด เพราะจริงๆ มีเงื่อนไขมากกว่านี้
คิดว่า เดี๋ยวจะมาดัดแปลงเองอีกที ไม่น่ายาก
แต่ดัดแปลงยังัย เลขมันเริ่มต้นที่ 0 ทุกที
ทั้งๆ ที่ดูในโคต มันก็กำหนดให้เป็น 1 เลยมาสังเกตุจาก
ที่โหลดมามีปุ่มลบข้อมูลด้วย จึงลบข้อมูลก่อน สรุปว่าได้เฉยยย
เลยเพิ่มคำสั่ง ให้ลบข้อมูลเก่าออกก่อน ค่อยเรียงลำดับ
สรุปว่าได้แล้วครับ แต่ก็ได้แบบ งงงง นิดนึง
ของพระคุณอาจารย์มากครับ น่ารักเสมอ /|\

 

11 ม.ค. 65 , 13:27:53
ตอบกลับ #4

PNR

อ้างถึง
ดัดแปลงยังัย เลขมันเริ่มต้นที่ 0 ทุกที
กำหนดตัวแปร เก็บค่า 1 ก่อนใน record แรกครับเช่น
Dim db As DAO.Database
Dim rst As DAO.Recordset

Dim strDate As String
Dim strOnNum As Long

Set db = CurrentDb()
Set rst = db.OpenRecordset("SELECT * FROM MyTable WHERE ((Not (MyTable.DateR) Is Null));", dbOpenDynaset)
If Not rst.BOF And Not rst.EOF Then
  rst.MoveFirst
  strDate = rst!DateR
  strOnNum = "1"
End If
  Do Until rst.EOF
  If strDate = rst!DateR Then
  If IsNull(DMax("SEQrec", "MyTable")) Then
    rst.Edit
    rst!SEQrec = strOnNum
    rst.Update
    strOnNum = rst!SEQrec
  Else
    rst.Edit
    rst!SEQrec = strOnNum
    rst.Update
  End If
  Else
    rst.Edit
    rst!SEQrec = strOnNum + 1
    rst.Update
  End If
 
    strDate = rst!DateR
    strOnNum = rst!SEQrec
     rst.MoveNext
    Loop
   

เท่านี้ก็ไม่ต้องใส่โค้ดลบแล้วครับ  :miao:
Time to stop for me  :dizzy:
 

11 ม.ค. 65 , 16:48:13
ตอบกลับ #5

Un

555 อาจารย์ เนี้ย คนรู้กับคนไม่รู้
ขอบพระคุณอาจารย์มากครับ
ผมเอาไปดับแปลงใช้ได้หลายแบบเลยครับ

 

11 ม.ค. 65 , 17:30:23
ตอบกลับ #6

Un

อาจารย์ครับ ถ้ามีเงื่อนไขแบบนี้หล่ะครับ
มีคนบันทึกหลายคน ชื่อฟิลด์ UerR
เก่าถ้าเป็นวันเดียวกัน จะเรียงลำดับเป็นเลขเดียวกันในวันเดียวกัน
แต่ถ้าบันทึก 3 คนในวันเดียวกัน เลขก็จะเหมือนกันในคนเดียวกัน
พอเปลี่ยนคนบันทึกก็จะ +1
พอวันต่อไปถึงจะเป็นคนเดียวกับเมื่อวานก็จะ+1

 

12 ม.ค. 65 , 07:53:39
ตอบกลับ #7

PNR

มีตัวอย่างข้อมูลที่ต้องการให้แสดงผลไหมครับว่าเป็นแบบไหน
สร้างตัวอย่างใน Excel  แล้วแคปเป็นภาพมาก็ได้ครับ

เงื่อนไขน่าจะสร้างได้ครับ
Time to stop for me  :dizzy:
 

12 ม.ค. 65 , 09:00:48
ตอบกลับ #8

Un



แบบนี้ครับอาจารย์

 

14 ม.ค. 65 , 12:54:31
ตอบกลับ #9

PNR


เขียนเป็นโค้ดทั้งหมดวันนี้นึกไม่ออกเลยครับ  :cry: แต่!!!
จากเงื่อนไขข้างบน เราจะสังเกตุได้ว่า ในแต่ละวัน และแต่ละ UserR นั้น จะมี SEQ เดียวกัน
ไม่ว่าการเรียงลำดับนั้นจะมาก่อนหรือมาหลัง

ผมลอง  DIY  ดูก็ได้ผลลัพท์แบบที่ต้องการ แต่ต้องสร้างคิวรี่เพื่อให้ได้ผลลัพท์ แบบในภาพด้านบน
ลองเช็คดูเรียงลำดับจาก Q1  >>> Q2  >>> Q_Result 
และท้ายสุดคือที่ปุ่มอัพเดท ข้อมูลจากคิวรี่ไปยังตารางหลัก

Q1 ดึงกลุ่ม DateR และ UserR ที่มีมาแสดง และกำหนดเลือก Autonumber(First)
     เพื่อนำไปใช้ในการสร้าง การรันลำดับในคิวรี่ต่อไป
Q2 นำกลุ่มที่ได้มา เรียงลำดับ ( กำหนด SEQ ให้แต่ละ DateR และ UserR)
     โดยเงื่อนไขการกำหนด SEQ ต้องมี PK ที่เรียงลำดับจากน้อยไปมากของ Autonumber(First)  ที่ถูกต้อง
     เพื่อการเรียงลำดับที่ถูกต้อง (ถ้าติดปัญหาตรงนี้แจ้งได้เผื่อหาวิธีแก้ไข)
Q_Result แสดงผลในแบบคิวรี่

และที่ปุ่มใส่โค้ดแบบนี้
โค๊ด: [Select]
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim strDate As String
Dim strUser As String

Set db = CurrentDb()
Set rst = db.OpenRecordset("SELECT * FROM MyTable WHERE ((Not (MyTable.DateR) Is Null));", dbOpenDynaset)

If Not rst.BOF And Not rst.EOF Then
  rst.MoveFirst
End If
  Do Until rst.EOF
        strDate = rst!DateR
        strUser = rst!UserR
    rst.Edit
    rst!SEQrec = DLookup("RunSEQ", "Q2", "cstr(DateR) = '" & strDate & "' and cstr(UserR) = '" & strUser & "'")
    rst.Update
   
     rst.MoveNext
    Loop
    rst.Close: Set rst = Nothing
    db.Close: Set db = Nothing

 



« แก้ไขครั้งสุดท้าย: 14 ม.ค. 65 , 13:20:03 โดย PNR »
Time to stop for me  :dizzy:
 
โพสต์นี้ได้รับคำขอบคุณจาก: laemthong

14 ม.ค. 65 , 17:27:37
ตอบกลับ #10

Un

ขอบคุณครับอาจารย์

 


บอร์ดเรียนรู้ Access สำหรับคนไทย