代码之家  ›  专栏  ›  技术社区  ›  John Eubanks

ColdFusion排序/分配

  •  1
  • John Eubanks  · 技术社区  · 7 年前

    我有两个列表:一个是动态的,基于学生数量记录,另一个是学生。。i、 e.、001002003等和123456(学生数据)。我需要一些帮助,以便能够随机为学生分配其中一个数字。例如,如果我有5个学生(123456234561等),我需要能够随机分配001002等给这些学生。到目前为止,遇到了一堵墙。以下是我目前掌握的情况:

    <cfquery name="testjd" datasource="student">
        SELECT SoonerID FROM dbo.CurrentStudentData
        WHERE status = 'Student' OR status = 'JD'
    </cfquery>
    
    <cfset testList = valueList(testjd.soonerid)>
    <cfset totalRecordsJd = #testjd.recordcount#>
    <cfloop from="001" to="#totalRecordsJd#" index="i">
        <cfset examNo = i>
        <cfif len(i) is 1>
            <cfset examNo = "00" & i>
        <cfelseif len(i) is 2>
            <cfset examNo = "0" & i>
        </cfif>
        <cfif not listFind(usedJDExams, examNo)> 
            #examNo#<!---is NOT being used!---><br/>
        </cfif>
    </cfloop>
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   Shawn    7 年前

    CF9使其比更高版本的版本更不有趣。我相信这应该行得通(除了我的查询模型)。

    https://trycf.com/gist/3667b4a650efe702981cb934cd325b08/acf?theme=monokai

    首先,我创建假查询。

    <!--- 
        Simple faked up query data. This is just demo data. I think this 
        queryNew() syntax was first available in CF10.  
    --->
    <cfscript>
        testjd = queryNew("SoonerID", "varchar", [
            ["123456"],
            ["564798"],
            ["147258"],
            ["369741"]
        ]);
    </cfscript>
    

    现在我已经有了需要测试的学生列表,我为这些测试创建了一个数字数组。

    <!--- Create array of Available Exam Numbers --->
    <cfset examNos = ArrayNew(1)>
    <cfloop from=1 to=100 index="i">
        <cfset examNos[i] = right('00' & i,3)>
    </cfloop>
    

    现在,我们将这两组数据结合起来,得到分配给学生的考试编号。

    <!--- Loop through the query and build random assignments --->
    <cfloop query="#testjd#">
        <!---Get random exam no.--->
        <cfset examNo = examNos[randrange(1,arrayLen(examNos))]> 
        <!---Build struct of exam assignments--->
        <cfset testAssignments[SoonerID] = examNo>
        <!---Delete that num from exam array. No reuse.--->
        <cfset blah = arrayDelete(examNos,examNo)>
    </cfloop>
    

    <cfoutput>
        <cfloop collection="#testAssignments#" item="i">
            For User #i#, the test is #testAssignments[i]#.<br>
        </cfloop>
    </cfoutput>
    
    The unused tests are: <cfoutput>#ArrayToList(examNos)#</cfoutput>.
    
    -------------------------------------------------------------------- 
    
    For User 369741, the test is 054. 
    For User 147258, the test is 080. 
    For User 564798, the test is 066. 
    For User 123456, the test is 005. 
    The unused tests are: 
         001,002,003,004,006,007,008,009,010
        ,011,012,013,014,015,016,017,018,019,020
        ,021,022,023,024,025,026,027,028,029,030
        ,031,032,033,034,035,036,037,038,039,040
        ,041,042,043,044,045,046,047,048,049,050
        ,051,052,053,055,056,057,058,059,060
        ,061,062,063,064,065,067,068,069,070
        ,071,072,073,074,075,076,077,078,079
        ,081,082,083,084,085,086,087,088,089,090
        ,091,092,093,094,095,096,097,098,099,100.
    

    OP代码的两个代码审查注释:

    1) 使用数组或结构比使用列表更容易。

    2) cfloop from="001" to="#totalRecordsJd#" :from“001”是与整数进行比较的字符串。ColdFusion将“001”转换为背景中的一个数字,因此它实际上可以启动循环。注意预期的数据类型,并确保按预期使用参数。

    3) cfif len(i) is 1... :首先,在一次过程中构建此字符串并对其进行修剪需要更少的处理- right('00' & i,3) is eq 把东西串起来 均衡器 给事物编号。

    =====================================================================

    对于CF10+,我会使用类似

    https://trycf.com/gist/82694ff715fecd328c129b255c809183/acf2016?theme=monokai

    <cfscript>
        // Create array of random string assignments for ExamNo
        examNos = [] ;
        for(i=1; i lte 100;i++) {
            arrayAppend(examNos,right('00'& i,3)) ;
        }
    
        ///// Now do the work. ////
        //Create a struct to hold final results
        testAssignments = {} ;
        // Loop through the query and build random assignments
        for(row in testjd) {
            // Get random exam no.
            examNo = examNos[randrange(1,arrayLen(examNos))] ; 
            // Build struct of exam assignments
            structInsert(testAssignments, row.SoonerID, examNo) ; 
            // Delete that num from exam array. No reuse.
            arrayDelete(examNos,examNo) ; 
        }
    </cfscript>
    
        2
  •  1
  •   SOS    7 年前

    如果是 小的 查询时,为什么不使用NEWID()对记录(psuedo)进行随机排序?由于记录已经随机化,您可以使用 query.currentRow 构建“examNo”。

    <cfquery name="testjd" datasource="student">
        SELECT SoonerID 
        FROM   CurrentStudentData
        WHERE  status IN ('Student', 'JD')
        ORDER BY NewID()
    </cfquery>
    
    <cfoutput query="yourQuery">
       #yourQuery.SoonerID# #NumberFormat(yourQuery.currentRow, "000000")#<br>
    </cfoutput>
    
        3
  •  -1
  •   Dan Bracuk    7 年前

    这是一个格式化的注释。运行此查询后:

    <cfquery name="testjd" datasource="student">
        SELECT SoonerID FROM dbo.CurrentStudentData
        WHERE status = 'Student' OR status = 'JD'
    </cfquery>
    

    执行以下操作:

    <cfset QueryAddColumn(testJd, "newcolumn", arrayNew(1))>
    

    然后循环查询并使用 QuerySetCell .