Reassigning
กระทู้เก่าบอร์ด อ.สุภาพ ไชยา

 239   1
URL.หัวข้อ / URL
Reassigning

ผมอ่านเจอคำถามหนึ่งน่าสนใจครับ ที่  
http://www.access-programmers.co.uk/forums/showthread.php?s=&threadid=27582  
  
คำถามมีดังนี้  
Hello all,  
  
Question...the database I'm writing monitors several clinical trials (a four digit number/primary key) at a given time. 
They are assigned a priority number for reports...trial #9999 has priority 1, #9998 priority 2...etc....  
HOWEVER, the priority number is reset on a monthly/weekly basis.  
If I decide to make #9998 priority 1, is there a way for Access to understand or automatically reassign the priority numbers for the other trials.... 
in other words, "bump" the former priority #1 trial to #2....#2 to #3...and so on?   
  
Thanks for your help,  
  
สรุป ต้องการจะเปลี่ยนลำดับความสำคัญ (Priority) ของแต่ละข้อมูล ซึ่งจะเปลี่ยนอยู่เป็นประจำทุกเดือน 
หรือทุกสัปดาห์ เช่น ต้องการเปลี่ยนข้อมูลเลขที่ #9999 ซึ่งมี Priority เป็น 10 (เป็นฟีลด์แบบตัวเลข) ให้มี Priority เป็น 1 จะทำอย่างไรเมื่อเปลี่ยนข้อมูล #9999 จากลำดับที่ 10 เป็น 1 แล้ว ให้ข้อมูลที่เคยเป็นลำดับที่ 1 เปลี่ยนไปเป็นลำดับที่ 2 ข้อมูลลำดับที่เคยเป็นลำดับที่ 2 ให้เปลี่ยนเป็นลำดับที่ 3 ใส่ไปเรื่อยๆ  
  
ในฟอรัมนั้นจะถกกันถึงข้อควรระวังด้วยครับ คือ จะต้องเปลี่ยนแปลงเฉพาะตั้งแต่ข้อมูลลำดับที่ต้องการจะเปลี่ยนลงมาเท่านั้น ตำแหน่งอื่นต้องไม่เปลี่ยน ฉะนั้นจะใช้ Update Query มาใช้เลยทันทีไม่ได้ครับ   
  
แล้วจะทำอย่างไร  
  
หลักการ  
ก็ใช้ Update Query แหล่ะครับ แต่ต้องไปสร้างเงื่อนไขให้มีการเปลี่ยนแปลงลำดับเฉพาะลำดับที่น้อยกว่าข้อมูลเป้าหมายเท่านั้น  
  
สมมติว่าตารางเป้าหมายชื่อ Table1 และมีฟีลด์ชื่อ Priority ถ้าต้องการที่จะให้เลื่อนลำดับ Priority ของทุกข้อมูลลง ก็ให้ + 1 เข้าไปดัง  
  
UPDATE Table1 SET Table1.Priority = [Priority"]+1  
WHERE (((Table1.Priority)<10));  
  
แต่ถ้าต้องการให้ Update เฉพาะข้อมูลลำดับที่ต่ำลงมาจะทำอย่างไร  
  
ก็ปรับ SQL นิดหน่อยครับ  
  
ถ้าผมสร้างฟอร์มขึ้นมาอันหนึ่ง ประกอบด้วย Text Box ชื่อ TrialNO, Priority แลผมได้เพิ่ม Text Box ชื่อ txtBefore ขึ้นมาเพื่อเก็บค่า Priority ของข้อมูลนั้นก่อนเปลี่ยนแปลง  
  
การเปลี่ยน Priority ก็เพียงให้ผู้ใช้เข้ามาแก้ลำดับของ Priority เอง โดยการคลิกไปยังข้อมูลเป้าหมาย แล้ว double click ที่ช่อง Priority เป้าหมาย แล้วให้เปลี่ยนแปลง Priority ตามกำหนด   
  
ก็ต้องสร้าง Query ให้อ้างให้มี SQL อย่างนี้ครับ  
  
UPDATE Table1 SET Table1.Priority = [Priority]+1  
WHERE (((Table1.Priority) Between [Forms]![frmPriority]![priority] And [Forms]![frmPriority]![txtBefore]) AND ((Table1.TrialNO)<>[Forms]![frmPriority]![TrialNo]));  
  
และใส่โค้ดในเหตุการณ์ On Double Click กับ Text Box ชื่อ Priority ดังนี้  
 
Private Sub Priority_DblClick(Cancel As Integer)  
Dim dbs As Database  
Set dbs = CurrentDb  
Me.txtBefore = Me.Priority  
Me.Priority = 1  
DoCmd.RunCommand acCmdSaveRecord  
dbs.Execute "UPDATE Table1 SET Table1.Priority = Table1.Priority +1 " _  
    & "WHERE Table1.Priority Between " & Me.Priority & " And " & Me.txtBefore & " AND " _  
    & "Table1.TrialNO <> '" & Me.TrialNO & "';" 
 
'DoCmd.SetWarnings False  
'DoCmd.RunSQL "UPDATE Table1 SET Table1.Priority = [Priority]+1 " _  
    & "WHERE (((Table1.Priority) Between [Forms]![frmPriority]![priority] And [Forms]![frmPriority]![txtBefore]) AND ((Table1.TrialNO)<>[Forms]![frmPriority]![TrialNo]));"  
'DoCmd.SetWarnings True 
 
Me.Table1.Requery  
End Sub  
  
โค้ดข้างบนจะไม่ต้องใช้ Query ช่วย ส่วนที่เป็นสีเขียวจะไม่ทำงานในโค้ดดังกล่าว แต่ถ้าท่านอยากลองส่วนที่เป็นสีเขียว ก็ให้ Rem (ใส่เครื่องหมาย ' ) ไว้ข้างหน้าบันทัดสีน้ำเงินก่อน แล้วเอาเครื่องหมาย ' หน้าบันทัดสีเขียวออก  
  
ซึ่งส่วนของบันทัดสีเขียวนี้ จะต้องมี Query1 ด้วย ลองเปรียบเทียบโค้ดทั้ง 2 ส่วนดูนะครับ  
  
ตัวอย่างจริงอยู่ที่ http://agserver.kku.ac.th/basiceng/reassign.zip ครับ  
  
ในตัวอย่าง ท่านสามารถที่จะซ่อน txtBefore ซึ่งเก็บค่า Priority ของข้อมูลนั้นก่อนที่จะเปลี่ยนไปเป็น 1 และจะต้องมีเพราะใช้ในการเปรียบเทียบในโค้ดด้วย  
  
คำถามเพิ่มเติม  
ถ้าต้องการทีจะเปลี่ยนลำดับ Priority จากค่าหนึ่ง ไปเป็นอีกค่าหนึ่งที่ไม่ใช่ 1 จะต้องทำอย่างไร  
เช่น เปลี่ยนจากลำดับ 15 มาเป็นลำดับ 7 (เปลี่ยนลง) หรือ  
เปลี่ยนจาก 5 ไปเป็น 14 (เปลี่ยนขึ้น)   
เอาไว้คิดเล่นๆ แต่ขอให้ลองทำจริงต่อเอาเองนะครับ

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

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