我对经典ASP有疑问:
有谁可以告诉我这段内容我做错了什么?如果ORDERDATA()仅包含一个条目,则它可以正常工作。如果不止一个,它会崩溃。我很确定它与CARTITEMS()变量的Dim / ReDim有关,但我看不出我做错了什么。
一些变暗的变量用于脚本的其他部分,请忽略它们。
Dim i,countOrderRows, orderdata, XXX
orderdata = Order_GetOrderData()
countOrderRows = ubound(orderdata,1)
Dim cartItems()
ReDim cartItems(countOrderRows-1)
Dim goodsList(), addr, klarnaresponse, resp, sql, item
ReDim goodsList(countOrderRows-1)
for i = 0 to countOrderRows - 1
Set item = Server.CreateObject("Scripting.Dictionary")
item.Add "reference", "XX1"
item.Add "name", orderdata(i,2)
item.Add "quantity", cint(orderdata(i,5))
item.Add "unit_price", (cint(orderdata(i,3)*100))
item.Add "discount_rate", 0
item.Add "tax_rate", 2500
Set cartItems(i) = item
Set item = nothing
next
希望你们能帮忙!
问候,鲍勃
答案 0 :(得分:2)
假设 Order_GetOrderData()是格式为
的多维数组function Order_GetOrderData ()
dim myArray(0,5)
myArray(0, 0) = "XX1"
myArray(0, 1) = "G66T"
myArray(0, 2) = "An Item"
myArray(0, 3) = "3"
myArray(0, 4) = "0"
myArray(0, 5) = "100"
Order_GetOrderData = myArray
end function
在所有三个地方从 countOrderRows 中删除 -1 允许我返回每次迭代的项目值。
Dim i,countOrderRows, orderdata, XXX
orderdata = Order_GetOrderData()
countOrderRows = ubound(orderdata, 1)
Dim cartItems()
ReDim cartItems(countOrderRows)
Dim goodsList(), addr, klarnaresponse, resp, sql, item
ReDim goodsList(countOrderRows)
for i = 0 to countOrderRows
Set item = Server.CreateObject("Scripting.Dictionary")
item.Add "reference", "XX1"
item.Add "name", orderdata(i,2)
item.Add "quantity", cint(orderdata(i,5))
item.Add "unit_price", (cint(orderdata(i,3)*100))
item.Add "discount_rate", 0
item.Add "tax_rate", 2500
Set cartItems(i) = item
Set item = nothing
next
response.write cartItems(0).item("name")
response.write cartItems(1).item("name")
etc.
原因是 ubound(orderdata,1)返回基于ZERO的表单中的行数,因此当只有一个结果存在时,从中减去1给出了负值。
我不确定为什么你的代码在传递一个项目而不是多个项目时起作用。只要您希望从数据集的开头返回,使用我的假设数据提供的示例就可以使用多个项目,但如果只返回一个项目,则始终会失败。它可能与 Order_GetOrderData()返回的数组格式有关?
答案 1 :(得分:2)
countOrderRows = ubound(orderdata,1)
将最大的从0开始的索引分配给countOrderRow
,不是元素的数量。
稍后,您使用countOrderRows
,就像它包含元素数量一样:
ReDim cartItems(countOrderRows-1)
对于在维度1中只有一个元素的orderdata,这将执行ReDim (..,-1)
,这不是您想要的,但是嘿!
那么,为什么这不会产生错误是一个单独的问题;)
然后,你使用
for i = 0 to countOrderRows-1
迭代。 错误。 UBound
返回最大可接受索引。对于一个元素,这是0.因为countOrderRows等于0,所以你正在尝试
for i = 0 to -1
这又不是你想要的。
这就是为什么只为一个元素工作(似乎工作)的原因:从0到-1的for
循环执行零 times。如果有多个元素,则执行循环代码,并且由于涉及错误的索引和数组大小而失败。
注意我故意不只是吐出更正的代码,而是试图引导你自己修复这个错误。