Coldfusion Loop用于插入

时间:2014-12-05 16:02:37

标签: mysql sql coldfusion

我有关于coldfusion和循环的问题。我有这个程序,我要求用户输入用户。用户可以为每个食品输入一些东西。

<cfloop query = "GET_ITEM">
    <tr>
        <td align="left" nowrap>
           <label>#GET_ITEM.ITEM_NBR#</label>
       </td>
          <input type="hidden" name="Item_number" id="Item_number" 
                value="#GET_ITEM.ITEM_NBR#">
        <td>
            <input type="text" name="on_hand" id="on_hand" value="" size="20" 
                                    onKeyPress="javascript:CheckNumeric();" />
        </td>
        <td>
            <input type="text" name="transit" id="transit" value="" size="20" 
                   onKeyPress="javascript:CheckNumeric();" />
        </td>
        <td>
            <input type="text" name="target_level" id="target_level" value="" 
                   size="20" onKeyPress="javascript:CheckNumeric();" />
        </td>
        <td>
            <input type="text" name="percentonhand" id="percentonhand" value="" 
                   size="20" onKeyPress="javascript:CheckNumeric();" />
        </td>
    </tr>
</cfloop>

我想使用下面的代码单独将每条记录插入到我的表格中。

<cfquery name = "insert_records"> 
  <cfloop index="Form.On_hand" list="#FORM.On_hand#" delimiters=","> 
    Insert into sometable
    (VENDORCODE,
      ITEM_NBR,
      Item_desc,
      Target_Level,
      Target_Date_Active,
      Target_Date_End,
      Vendor_name,
      Per_of_Actual
     )         
    Values (
      <cfqueryparam value = "#Form.Vendor_code#" cfsqltype = "CF_SQL_INTEGER">,     
      <cfqueryparam value = "#Item_number#" cfsqltype = "CF_SQL_VARCHAR"> ,
      <cfqueryparam value = "#Trim(itemdesc.Item_desc)#" cfsqltype = "CF_SQL_VARCHAR">,
      <cfqueryparam value = "#Trim(FORM.On_hand)#" cfsqltype = "CF_SQL_INTEGER">,
      '2014-12-02',
      '2040-01-01',  
      <cfqueryparam value = "#Trim(itemdesc.Vendor_name)#" cfsqltype = "CF_SQL_VARCHAR">,                
      100        
    )
   </cfloop>
</cfquery>  

我的问题是两件事。

  1. 如何询问用户输入并使每条记录都独一无二?
  2. 获取输入后,如何将每条记录单独插入数据库。

3 个答案:

答案 0 :(得分:1)

第一个问题,如何使事情变得独一无二,如果你这样做的话,你大部分时间都是如此:

<cfset x = 0>
<cfloop query="GET_ITEM">
  <cfset x++>
  <input name="uniqueID_#x#" value="#x#" type="hidden">
  <tr>
    <td align="left" nowrap>
       <label>#ITEM_NBR#</label>
    </td>
    <input type="hidden" name="Item_number" id="Item_number" 
            value="#GET_ITEM.ITEM_NBR#">
    <td>
        <input type="text" name="on_hand#x#" id="on_hand" value="" size="20" 
                                onKeyPress="javascript:CheckNumeric();" />
    </td>
   etc...
</cfloop>

您会注意到在引用列时,在查询循环内部不需要继续引用查询名称。

此时

x本质上是一个索引,通过将其添加到表单字段name部分,您可以引用每个单独的表单。

所以收到这个条目后,我会做这样的事情:

<cfquery name = "insert_records">
  <cfloop collection=#form# item="field">
    <cfif left(field,9) eq 'uniqueID_'>
      <cfset uniqueid = right(field,1)><!--- you'll have to work out your own logic for where you have more than 10 forms to a page--->
      Insert into sometable
        (VENDORCODE,
         ITEM_NBR,
         Item_desc,
         Target_Level,
         Target_Date_Active,
         Target_Date_End,
         Vendor_name,
         Per_of_Actual
        )         
       Values (
         <cfqueryparam value = "#Form.Vendor_code##uniqueid#" cfsqltype = "CF_SQL_INTEGER">,     
         <cfqueryparam value = "#Item_number#" cfsqltype = "CF_SQL_VARCHAR"> ,
         <cfqueryparam value = "#Trim(itemdesc.Item_desc)#" cfsqltype = "CF_SQL_VARCHAR">,
         <cfqueryparam value = "#Trim(FORM.On_hand)##uniqueid#" cfsqltype = "CF_SQL_INTEGER">,
         '2014-12-02',
         '2040-01-01',  
         <cfqueryparam value = "#Trim(itemdesc.Vendor_name)#" cfsqltype = "CF_SQL_VARCHAR">,                
         100        
        )
       </cfif>
     </cfloop>
   </cfquery>

答案 1 :(得分:1)

您已经拥有item_NBR字段的一半设置。

对于您的所有其他字段,请将其命名并标记为

on_hand_#GET_ITEM.ITEM_NBR#
transit_#GET_ITEM.ITEM_NBR#

您还需要像这样更改item_nbr字段

      <input type="hidden" name="Item_number" id="Item_number_#GET_ITEM.ITEM_NBR#" 
            value="#GET_ITEM.ITEM_NBR#">

因为虽然ID用于客户端(javascript),但它们必须是唯一的才能正常运行。

现在在您的查询中,您有

<cfloop list ="#GET_ITEM.ITEM_NBR#" index="iNbr">
<cfloop index="Form.On_hand" list="#form["on_hand_#iNbr#"]#" delimiters=","> 
 Insert into sometable
 (VENDORCODE,
   ITEM_NBR,
   Item_desc,
   Target_Level,
   Target_Date_Active,
   Target_Date_End,
   Vendor_name,
   Per_of_Actual
  )         
 Values (
   <cfqueryparam value = "#Form["Vendor_code_#iNbr#"]#" cfsqltype = "CF_SQL_INTEGER">,     
   <cfqueryparam value = "#iNbr#" cfsqltype = "CF_SQL_VARCHAR"> ,
   <cfqueryparam value = "#Trim(itemdesc.Item_desc)#" cfsqltype = "CF_SQL_VARCHAR">,
   <cfqueryparam value = "#Trim(form["On_hand_#iNbr#"])#" cfsqltype = "CF_SQL_INTEGER">,
   '2014-12-02',
   '2040-01-01',  
   <cfqueryparam value = "#Trim(itemdesc.Vendor_name)#" cfsqltype = "CF_SQL_VARCHAR">,                
  100        
 )
</cfloop>
</cfloop>

我也会将内循环的索引更改为#iOH#。当您的代码有效时,如果您尝试在代码中稍后使用#form.on_hand#,您将获得循环的最后一个值而不是列表。

正如Leigh优雅地指出的那样,你需要以不同的方式循环来处理你似乎想要做的数量。

而不是<cfloop index="Form.On_hand" list="#form["on_hand_#iNbr#"]#" delimiters=",">

您可能需要以下内容:<cfloop index="1" to="#form["on_hand_#iNbr#"]#" index="ioh">

如果您确实在每行存储了一定数量的项目。

对于itemdesc,这可能是一个查询?如果数据在行与行之间不同,您可能希望在您的外循环(我添加的循环)中包含它吗?如果这样做,则必须将循环移到<cfquery>

之外

答案 2 :(得分:1)

在你的第一个循环中试试这个:

<cfloop query = "GET_ITEM">
    <tr>
        <td align="left" nowrap>
           <label>#GET_ITEM.ITEM_NBR#</label>
       </td>
          <input type="hidden" name="Item_number" id="Item_number" 
                value="#GET_ITEM.ITEM_NBR#">
        <td>
            <input type="text" name="on_hand_#get_item.Item_nbr#" id="on_hand" value="" size="20" 
                                    onKeyPress="javascript:CheckNumeric();" />
        </td>
        <td>
            <input type="text" name="transit_#get_item.Item_nbr#" id="transit" value="" size="20" 
                   onKeyPress="javascript:CheckNumeric();" />
        </td>
        <td>
            <input type="text" name="target_level_#get_item.Item_nbr#" id="target_level" value="" 
                   size="20" onKeyPress="javascript:CheckNumeric();" />
        </td>
        <td>
            <input type="text" name="percentonhand_#get_item.Item_nbr#" id="percentonhand" value="" 
                   size="20" onKeyPress="javascript:CheckNumeric();" />
        </td>
    </tr>
</cfloop>

提交后,您将获得一个项目编号列表i form.item_nbr以及每个编号的相应值。你的第二个循环可以像这样工作:

<cfquery name = "insert_records"> 
  <cfloop index="#form.item_nbr#" index="item"> 
    Insert into sometable
    (VENDORCODE,
      ITEM_NBR,
      Item_desc,
      Target_Level,
      Target_Date_Active,
      Target_Date_End,
      Vendor_name,
      Per_of_Actual
     )         
    Values (
      <cfqueryparam value = "#Form.Vendor_code#" cfsqltype = "CF_SQL_INTEGER">,     
      <cfqueryparam value = "#Item#" cfsqltype = "CF_SQL_VARCHAR"> ,
       <cfqueryparam value = "#Trim(itemdesc.Item_desc)#" cfsqltype = "CF_SQL_VARCHAR">,
      <cfqueryparam value = "#Trim(FORM["on_hand_" & item)#" cfsqltype = "CF_SQL_INTEGER">,
      '2014-12-02',
      '2040-01-01',  
      <cfqueryparam value = "#Trim(itemdesc.Vendor_name)#" cfsqltype = "CF_SQL_VARCHAR">,                
      100        
    )
   </cfloop>
</cfquery>  

我不确定itemdesc。 value 来自此查询的确切位置 - 我假设基于该项的另一个查询。在这种情况下,您可能希望在此查询中循环 ,并为每个项目执行一次插入查询,而不是对其进行批处理。对于典型的购物车形式,没有太多的惩罚。