我有关于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>
我的问题是两件事。
答案 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 来自此查询的确切位置 - 我假设基于该项的另一个查询。在这种情况下,您可能希望在此查询中循环 ,并为每个项目执行一次插入查询,而不是对其进行批处理。对于典型的购物车形式,没有太多的惩罚。