【问题标题】:Inserting a dynamic amount of rows in a Coldfusion form with MySql使用 MySql 在 Coldfusion 表单中插入动态数量的行
【发布时间】:2016-01-06 05:57:34
【问题描述】:

我接手了一个项目,该项目使用 Coldfusion 表单中的 JQuery 为“报价”文档动态添加项目行。我需要遍历表单并将每一行插入到单独字段中的 MySql 数据库中。我的问题是我需要通过动态更改名称和值来添加某些值一次,然后多次添加其他值。 这是表格:(我省略了一些只需要插入一次的字段)

    <tr>
    <input id="quoteDate" name="quoteDate"  value="#rc.private.currDate#">
    <input id="quoteID" name="quoteID" value="#rc.private.quoteID#">
    </tr>
    <tr id="dummyRow" class="hidden-print" style="display:none">
    <td>                
    <input id="itemQty_" name="itemQty_" value="" class="qtyField" type="number" min="0" pattern="[0-9]*" maxlength="6" size="3">
    </td>                           
    <td>                            
<input id="itemPriceEach_" name="itemPriceEach_" class="itemPriceField" type="text" maxlength="8" value="">
    <input id="itemDesc_" name="itemDesc_" class="hidden" value="">
    </td>

最后 3 个输入是使用以下 jQuery 动态添加的:

   nr = $newRow;
    $newRow.removeAttr("id");
    $newRow.find("td:nth-child(1)").empty().append( item.itemCode );
    $newRow.find("td:nth-child(2)").empty().append( item.description );
    $newRow.find("input[id^=itemQty_]").val(1).attr("id", "itemQty_" + item.itemCode) .attr("name", "itemQty_" + item.itemCode);
    $newRow.find("input[id^=itemPriceEach_]").val( accounting.formatMoney(item.price) ).attr("id", "itemPriceEach_" + item.itemCode).attr("name", "itemPriceEach_" + item.itemCode);
    $newRow.find("input[id^=itemDesc_]").val( item.description ).attr("id","itemDesc_" + item.description).attr("name","itemDesc_" + item.description);

我怎样才能只遍历所需的输入以插入具有不同名称和值的输入。我构建的内容已经将所有值插入到表中的一个字段中。

<cfquery name="addNewQuote" datasource="inv">
            INSERT INTO inv.quotesaves
                (quoteID, cNumber, quoteDate, itemcode, itemQty_, itemPriceEach_, itemDesc_,fetqty, fetPriceEach)
            VALUES(
                <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.quoteID#">,
                <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.cNumber#">,
                <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.quoteDate#">,
                <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.itemCode#">,
                <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.itemQty_#">,
                <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.itemPriceEach_#">,
                <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.itemDesc_#"> )               
</cfquery>              

这是我的表单的转储。

-CNUMBER    ZZ1753

-FIELDNAMES QUOTEDATE,QUOTEID,CNUMBER,ITEMCODE,ITEMDESC_51769,ITEMQTY_51769,ITEMPRICEEACH_51769,ITEMQTY_015,ITEMPRICEEACH_015,ITEMDESC_LABOR,ITEMQTY_011,ITEMPRICEEACH_011,ITEMDESC_OIL,ITEMQTY_,ITEMPRICEEACH_,ITEMDESC_,ADDITEMCODE

-ITEMCODE   51769

-ITEMDESC_  [empty string]

-ITEMDESC_51769 [empty string]

-ITEMDESC_LABOR labor

-ITEMDESC_OIL   oil

-ITEMPRICEEACH_ [empty string]

-ITEMPRICEEACH_011  $3.00

-ITEMPRICEEACH_015  $15.00

-ITEMPRICEEACH_51769    $157.70

-ITEMQTY_   [empty string]

-ITEMQTY_011    1

-ITEMQTY_015    3

-ITEMQTY_51769  2

-QUOTEDATE  October 08, 2015

-QUOTEID    82103808

action  retailquote.quotesave
origPage    RetailQuote.quoteSave   

我需要将每个以“itemQty_”和“itemPriceEach_”开头的项目添加到单独字段中的表中。所以一行将包含“quoteID”、“itemQty_”的值和“itemPriceEach_”的值

所以经过多次试验和磨难,我终于找到了一个使用 cfloop 和 ListGetAt 的好方法。这种方式似乎工作得很好。

<cftransaction>
    <cfloop from="1" to="#ListLen(form.itemQty_)#" index="i">
        <cfquery name="quoteAddOns"  datasource="inv">
            INSERT INTO inv.quoteAddOns
                (quoteID, itemDesc_,itemQty_, itemPriceEach_, fetqty, fetPriceEach)
            VALUES(
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.quoteID#">,
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#ListGetAt(arguments.itemDesc_,i)#">,
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#ListGetAt(arguments.itemQty_,i)#">,
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#ListGetAt(arguments.itemPriceEach_,i)#">,
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#ListGetAt(arguments.fetQty#">,
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.fetPriceEach#">)
    </cfquery>
</cfloop>

【问题讨论】:

  • 能否请update your question 提供提交的实际表单字段名称示例? CFdumpFORM(或 arguments 范围)在您的操作页面上。
  • 谢谢。不确定我是否遵循命名约定和关系。一些名称是通过附加 itemCode 后缀 (51769) 生成的:即 ITEM_QTY_51769、ITEMPRICEEACH_51769 等。其他人呢?示例:A)无后缀ITEMPRICEEACH_ B)“011”后缀:ITEMPRICEEACH_011 C)“015”后缀:ITEMPRICEEACH_015 D)其他后缀:ITEMDESC_LABOR ....这些都应该链接到相同的 itemCode - 51769?使用上面的字段名称,您希望在数据库中插入多少条记录?
  • 我对以下问题的回答可能会对您有所帮助。 stackoverflow.com/questions/32970739/…
  • 这是一种可能性。但是,我对命名约定感到好奇……仅从名称来看,这种关系并不明显。您可能需要考虑更改它们以使其更直观。
  • 每个后缀都链接到一个项目代码。项目代码来自相应的表格。这些名称附加有 jQuery .attr 命令。我不确定为什么每个条目都有空字符串。具体来说:51769是卖轮胎的。其他的用于安装轮胎的杂费。我遇到的麻烦是我不知道将插入多少条记录。有些引号可能有 0,有些可能有 5。

标签: jquery mysql forms loops coldfusion


【解决方案1】:

(对于 cmets 来说太长了)

使用“同名字段”方法的缺点是,如果任何值包含列表分隔符(即逗号),代码将会中断,这并不罕见。列表的常见替代方法之一是generating unique field names by appending a numeric ID value as a suffix

例如,假设您有三个 itemCode 的“51769、51775、51782”,只需将每个代码作为后缀附加到所有相关字段(数量、描述、价格等)上,即

  • itemPrice_51769, itemDesc_51769,itemQty_51769,...
  • itemPrice_51775, itemDesc_51775,itemQty_51775,...
  • itemPrice_51782, itemDesc_51782,itemQty_51782,...

要提取提交的值,只需遍历 form.itemCode 列表,并使用关联数组表示法动态访问相关字段:

<cfloop list="#form.itemCode#" index="currItemCode">

   <!--- extract the fields for current itemCode --->
   <cfset itemQty   = FORM["itemQty_"& currItemCode]>
   <cfset itemPrice = FORM["itemPrice_"& currItemCode]>
   <cfset itemDesc  = FORM["itemDesc_"& currItemCode]>
   ...

   <!--- for debugging only ---> 
   <cfoutput>
   DEBUG: Current itemCode = #currentID# 
          itemQty   = #itemQty#
          itemPrice = #itemPrice#
          itemDesc  = #itemDesc#
     ... <br>
   </cfoutput>


   ... now use the values in your query ....
</cfloop>

如果您必须坚持所有“同名字段”,更好的选择可能是新的 CF10+ Application setting this.sameformfieldsasarray。具有相同名称的字段将作为数组而不是列表传递,这样可以避免分隔符问题。只需遍历生成的数组即可。

【讨论】:

    猜你喜欢
    • 2011-10-04
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2013-06-14
    • 2019-03-14
    相关资源
    最近更新 更多