2013-11-26 49 views
0

我有一個關於經典ASP的問題:昏暗或ReDim的問題?

任何人都可以告訴我在這段代碼中我做錯了什麼嗎?如果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
countOrderRows = ubound(orderdata,1) 

分配最大基於0的索引到countOrderRow元件的數量。

然後,您使用countOrderRows,就好像它包含的元素個數:

ReDim cartItems(countOrderRows-1) 

對於orderdata在尺寸1只有一個元素,這會做ReDim (..,-1),這是不是您的本意,但嘿!

那麼,爲什麼這不會產生一個錯誤是一個單獨的問題;)

然後,您使用

for i = 0 to countOrderRows-1 

進行迭代。 這是錯的。UBound返回最大可接受索引。對於一個元素,這是0。由於countOrderRows等於0,你正在嘗試

for i = 0 to -1 

這又不是你預期什麼。

以及爲什麼工作(似乎工作)只有一個元素that's:從0 for環-1執行倍。如果有多個元素,則會執行循環代碼,並且由於涉及錯誤的索引和數組大小而失敗。

注意我故意不只是吐出糾正的代碼,而是試圖引導你自己修復這個bug。

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 

多維數組中刪除在它使用的所有三個地方的-1countOrderRows讓我返回每次迭代的項目值。

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()返回的數組格式有關?