Hasil kueri loop Coldfusion dan pembaruan menggunakan nama kolom dinamis

Dalam database saya memiliki 5 kolom ditambah id:

 id, m1, m2, m3, m4, m5

Saya memilih dari satu tabel yang mungkin memiliki 1 hingga 5 baris berdasarkan id:

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

dll Yang perlu saya lakukan adalah memperbarui kolom m1, m2 dan m3 di tabel pengguna untuk ID pengguna 1 dengan nilai A, B dan C. Saya sudah memulai jalur seperti ini tetapi saya mulai serius pada hari Senin pada hari Selasa .

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

Dimana 'bidang' adalah m1, m2, m3. Salah satu caranya adalah dengan menggunakan switch/case pada jumlah rekaman dan melakukan 5 pemanggilan berbeda, tetapi tidak yakin apakah ada cara yang lebih baik secara terprogram?

[edit] ini berfungsi tetapi mungkin bukan cara terbaik - Saya punya kasus untuk 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 sumber
comment
Apa itu cfloop? Sintaks ini asing bagi saya. Bukankah itu akan menjadi loop for di CFScript, dan jika bukan CFScript, maka tag <cfloop>?   -  person Tomalak    schedule 30.10.2018
comment
Saya menggunakan for / in loops tetapi melihat posting blog yang cfloop(query=, group=) dll. berfungsi. Aku belum pernah melihatnya sebelumnya hari ini. Menjalankan pembaruan CF2016 7.   -  person Steve    schedule 30.10.2018
comment
Anda benar, ini berhasil. Saya benar-benar melewatkannya, saya harus membaca.   -  person Tomalak    schedule 30.10.2018
comment
cfloop() akan bekerja di cfscript. Hampir semua tag akan berfungsi seperti itu di cfscript. Ini berguna untuk membuat cfscript murni, tetapi dapat menimbulkan keanehan. Dalam hal ini, saya akan mencari solusi tambahan.   -  person James A Mohler    schedule 30.10.2018
comment
Apakah Anda memperbarui kelima kolom tersebut, atau hanya salah satunya? Jika Anda mengulangi query2 Anda untuk melakukan pembaruan query1.column untuk setiap baris, Anda akan kehabisan database Anda. Anda mungkin dapat melakukan apa yang Anda inginkan dengan PIVOT. Apakah Anda memiliki data sampel? Dan beberapa harapan?   -  person Shawn    schedule 31.10.2018
comment
Dan apakah Anda perlu kembali ke CF untuk melakukan ini? Anda dapat melakukan ini dalam SQL murni. Apa alur kerja Anda untuk ini?   -  person Shawn    schedule 31.10.2018
comment
Dan Anda pasti tidak ingin invoke untuk setiap iterasi. Anda dapat new atau createobject sebelum loop Anda dan kemudian memanggil metode Anda pada setiap iterasi.   -  person Shawn    schedule 31.10.2018
comment
Dan apakah Anda INSERTing, UPDATEing atau keduanya? Dan ini untuk satu id, benar? Anda tidak akan memiliki banyak ids? Dan jika UPDATEing, jika database Anda sudah memiliki m4, tetapi Anda hanya memiliki 3 baris, apakah Anda akan null mengeluarkan m4 dan UPDATE 1-3, atau membiarkan m4 apa adanya?   -  person Shawn    schedule 31.10.2018


Jawaban (1)


Jika hanya ada maksimal lima baris dan kolom target selalu "m" + nomor baris saat ini, maka ini akan berhasil:

for (row in q) {
    myCFC.updateUser(userid:row.id, field:'m#q.CurrentRow#');
}
person Tomalak    schedule 30.10.2018
comment
kolomnya adalah m1, m2, m3, m4, m5 dan nilainya adalah qryM[rsc_m][currentrow] - Saya terus mendapatkan kesalahan pada bagian nama bidang dinamis. Apa yang akan terjadi jika saya mendefinisikan kelima nama bidang tetapi hanya memiliki nilai untuk 3 baris pertama? Apakah qryM[rsc_m][5] menimbulkan kesalahan jika jumlah catatan kueri adalah 3 dan saya mencoba memasukkan nilai untuk baris 4 atau 5? - person Steve; 30.10.2018
comment
Nah, dengan loop for ... in Anda tidak perlu menggunakan referensi [CurrentRow]. Bila hanya ada 3 baris maka query hanya berjalan 3 kali, dan ya pasti ada error saat mencoba mengakses baris 4. Masih kurang yakin apa masalahnya, saya akui. - person Tomalak; 30.10.2018