如何循环查询数据并插入结构?

时间:2019-05-30 13:05:21

标签: struct coldfusion cfml coldfusion-11

我有应插入到结构中的查询数据。循环数据时,应将每个值分配给匹配的列。这是查询数据的示例:

    REC_ID  NAME    STATUS      TYPE    YEAR
1   01      PARIS   Approved    1       2019
2   06      AUSTIN  Inactive    3       2017
3   48      LONDON  Approved    2       2018
4   43      ROME    Inactive    5       2019
5   61      DUBLIN  Inactive    4       2019

此数据应组织如下:

1
  REC_ID  01
  NAME    PARIS
  STATUS  Approved
  TYPE    1
  YEAR    2019
2
  REC_ID  06
  NAME    AUSTIN
  STATUS  Inactive
  TYPE    3
  YEAR    2017
3
  REC_ID  48
  NAME    LONDON
  STATUS  Approved
  TYPE    2
  YEAR    2018
4
  REC_ID  43
  NAME    ROME
  STATUS  Inactive
  TYPE    5
  YEAR    2019
5
  REC_ID  61
  NAME    DUBLIN
  STATUS  Inactive
  TYPE    4
  YEAR    2019

我试图通过此功能获取所需的数据格式:

function formatData(qryData) {
    local.fnResult = structNew();
    local.fnData = structNew();

    if(qryData.recordcount){
        for(row in qryData) {
            for(column in qryData.columnList) {
                local.strRec = structNew();
                structInsert(strRec, column, row[column]);
                local.fnData[qryData.currentrow] = strRec;
            }
        }
    }

    writeDump(fnData);
}

这是我的结果的样子:

1
  REC_ID  01
2
  REC_ID  06
3
  REC_ID  48
4
  REC_ID  43
5
  REC_ID  61

我使用ColdFusion 11 cfscript语法。如果有人可以帮助我解决此问题,请告诉我。谢谢。

3 个答案:

答案 0 :(得分:4)

列列表循环有问题,您正在为每个列创建一个新结构,并在下一个循环中重置。

此循环应更改

for(column in qryData.columnList) {
    local.strRec = structNew();
    structInsert(strRec, column, row[column]);
    local.fnData[qryData.currentrow] = strRec;
}

看起来像

local.strRec = structNew();
for(column in qryData.columnList) {
    structInsert(strRec, column, row[column]);
}
local.fnData[qryData.currentrow] = strRec;

答案 1 :(得分:2)

@espresso_coffee,在这里,我解决了您的问题。我希望您需要创建一个具有键作为行数的结构,并且每个键值都应采用结构格式。在这里,我为查询提供了一些示例代码。希望对您有用。

<cfquery name="readStudent" datasource="student">
    select * from  user
</cfquery>

在我的用户表中有6条记录,记录中包含名字,姓氏和ID。在这里,我遍历了查询并将其转换为结构键值。我使用脚本语法是因为您的代码具有脚本样式。 :)

<cfscript>
    myStr = {};
    for (row in readStudent) { 
        structInsert(myStr, #readStudent.currentrow#, row);
    }
    writeDump(myStr);
</cfscript>

在这里,我将第一个结构名称创建为myStr,并遍历查询数据,并为键的结构行插入当前行为 readStudent.currentRow 的值,该值位于行中。具有名字,姓氏和ID作为结构键的行及其值。

FYR::我已经附加了示例查询并转换为结构值。如果我错理解您的问题,请纠正我

enter image description here

希望对您有所帮助。谢谢。

答案 2 :(得分:1)

如果我正确理解这一点,看来您可以做到

array function formatData(qryData) {
   return DeserializeJSON(SerializeJSON(arguments.qryData, "struct"));
}

Runnable example on trycf.com

结果:

Screenshot of result

替代

array function formatData(qryData) {
   var result = [];

   for (var row in qryData) {
       result.append(row);
   }       

   return result;
}