Dim或ReDim问题?

时间:2013-11-26 13:58:34

标签: vbscript

我对经典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

希望你们能帮忙!

问候,鲍勃

2 个答案:

答案 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。如果有多个元素,则执行循环代码,并且由于涉及错误的索引和数组大小而失败。

注意我故意不只是吐出更正的代码,而是试图引导你自己修复这个错误。