ผลลัพธ์การค้นหาลูป Coldfusion และอัปเดตโดยใช้ชื่อคอลัมน์แบบไดนามิก

ในฐานข้อมูลฉันมี 5 คอลัมน์บวก id:

 id, m1, m2, m3, m4, m5

ฉันกำลังเลือกจากตารางหนึ่งที่อาจมีตั้งแต่ 1 ถึง 5 แถวตามรหัส:

row,id,value
 1, 1, 'A'
 2, 1, 'B'
 3, 1, 'C'

ฯลฯ สิ่งที่ฉันต้องทำคืออัปเดตคอลัมน์ m1, m2 และ m3 ในตารางผู้ใช้สำหรับ ID ผู้ใช้ 1 ที่มีค่า A, B และ C ฉันได้เริ่มต้นเส้นทางของบางสิ่งเช่นนี้ แต่กำลังปวดหัวกับวันจันทร์ที่จริงจังในวันอังคาร .

i=1;
  cfloop (query=q) {
    field = 'm' & i;
    temp = invoke(myCFC,"updateUser",{ userid=q.id, field = q.value });
    i++;
  };

โดยที่ 'ฟิลด์' จะเป็น m1, m2, m3 วิธีหนึ่งคือใช้สวิตช์/เคสในการนับบันทึกและมีการเรียกใช้ 5 แบบที่แตกต่างกัน แต่ไม่แน่ใจว่าจะมีวิธีที่ดีกว่าโดยทางโปรแกรมหรือไม่

[แก้ไข] ใช้งานได้ แต่อาจไม่ใช่วิธีที่ดีที่สุด - ฉันมีเคสสำหรับ 1-5:

switch(qryM.recordCount) {
case "1":
    temp = invoke(userCFC,"updateUser", { 
        id = qryM.rsm_userid, 
        m1_c = qryM["rsm_c"][1], 
        m1_m = qryM["rsm_m"][1]
    });
    break;
case "2":
    temp = invoke(userCFC,"updateUser", { 
        id = qryM.rsm_userid, 
        m1_c = qryM["rsm_c"][1], 
        m1_m = qryM["rsm_m"][1],
        m2_c = qryM["rsm_c"][2], 
        m2_m = qryM["rsm_m"][2]
    });     
    break;

person Steve    schedule 30.10.2018    source แหล่งที่มา
comment
cfloopคืออะไร? ไวยากรณ์นี้ไม่คุ้นเคยกับฉัน มันจะไม่เป็น for วนซ้ำใน CFScript และถ้าไม่ใช่ CFScript ก็จะเป็นแท็ก <cfloop>   -  person Tomalak    schedule 30.10.2018
comment
ฉันใช้ for / in loops แต่เห็นโพสต์บนบล็อกที่ cfloop(query=, group=) ฯลฯ ใช้งานได้ ฉันไม่เคยเห็นมันมาก่อนในวันนี้ การรัน CF2016 อัพเดต 7   -  person Steve    schedule 30.10.2018
comment
คุณพูดถูก มันได้ผล พลาดไปเต็มๆ เลยต้องไปหามาอ่านบ้างแล้ว   -  person Tomalak    schedule 30.10.2018
comment
cfloop() จะทำงานใน cfscript แท็กเกือบทั้งหมดจะทำงานเช่นนั้นใน cfscript มันมีประโยชน์สำหรับการสร้าง cfscript ล้วนๆ แต่อาจทำให้เกิดความแปลกประหลาดได้ ในกรณีนี้ ฉันจะหาวิธีแก้ปัญหาแบบ for-in   -  person James A Mohler    schedule 30.10.2018
comment
คุณกำลังอัปเดตทั้ง 5 คอลัมน์หรือเพียงคอลัมน์เดียว? หากคุณวนซ้ำ query2 ของคุณเพื่ออัปเดต query1.column สำหรับแต่ละแถว คุณจะทำลายฐานข้อมูลของคุณ คุณอาจสามารถทำสิ่งที่คุณต้องการได้ด้วย PIVOT คุณมีข้อมูลตัวอย่างหรือไม่? และความคาดหวังบางอย่าง?   -  person Shawn    schedule 31.10.2018
comment
และคุณจำเป็นต้องถอยกลับไปหา CF เพื่อทำสิ่งนี้หรือไม่? คุณสามารถทำได้ใน SQL ล้วนๆ ขั้นตอนการทำงานของคุณสำหรับสิ่งนี้คืออะไร?   -  person Shawn    schedule 31.10.2018
comment
และคุณคงไม่อยาก invoke ทุกครั้งที่วนซ้ำอย่างแน่นอน คุณสามารถ new หรือ createobject ก่อนลูปของคุณ จากนั้นเพียงเรียกเมธอดของคุณในการวนซ้ำแต่ละครั้ง   -  person Shawn    schedule 31.10.2018
comment
และคุณกำลัง INSERTing, UPDATEing หรือทั้งสองอย่าง? และนี่คือสำหรับ id เดี่ยวใช่ไหม คุณจะไม่มี ids หลายอันใช่ไหม และถ้า UPDATEing หากฐานข้อมูลของคุณมี m4 อยู่แล้ว แต่คุณมีเพียง 3 แถว คุณจะ null ออก m4 และ UPDATE 1-3 หรือคุณจะปล่อย m4 ไว้เหมือนเดิมหรือไม่   -  person Shawn    schedule 31.10.2018


คำตอบ (1)


หากสามารถมีได้สูงสุดห้าแถวจริงๆ และคอลัมน์เป้าหมายคือ "m" + หมายเลขแถวปัจจุบันเสมอ สิ่งนี้ก็จะได้ผล:

for (row in q) {
    myCFC.updateUser(userid:row.id, field:'m#q.CurrentRow#');
}
person Tomalak    schedule 30.10.2018
comment
คอลัมน์จะเป็น m1, m2, m3, m4, m5 และค่าจะเป็น qryM[rsc_m][currentrow] - ฉันยังคงได้รับข้อผิดพลาดแม้ว่าในส่วนชื่อฟิลด์ไดนามิก จะเกิดอะไรขึ้นหากฉันกำหนดชื่อฟิลด์ทั้ง 5 ชื่อแต่มีเพียง 3 แถวแรกเท่านั้น qryM[rsc_m][5] เกิดข้อผิดพลาดหรือไม่หากจำนวนบันทึกการสืบค้นเป็น 3 และฉันพยายามใส่ค่าสำหรับแถว 4 หรือ 5 - person Steve; 30.10.2018
comment
ด้วยการวนซ้ำ for ... in คุณไม่จำเป็นต้องใช้การอ้างอิง [CurrentRow] เมื่อมีเพียง 3 แถว การสืบค้นจะทำงานเพียง 3 ครั้ง และใช่ จะมีข้อผิดพลาดเกิดขึ้นเมื่อคุณพยายามเข้าถึงแถวที่ 4 ฉันยอมรับยังไม่ค่อยแน่ใจว่าปัญหาคืออะไร - person Tomalak; 30.10.2018