2013-06-05 4 views
1

Я пытаюсь использовать некоторые классы, которые будут хранить данные счета, и я не могу заставить его работать. Я просто хочу, чтобы он сохранял детали счета-фактуры в массиве. Вот код, может быть, кто-то может понять это. Также id как для LineItems для случайного количества элементов продукта, не уверен, как это сделать. Я делаю это, чтобы в конечном итоге отправить данные через веб-службу из мс-доступа.Доступ к классам классов VBA

Вот другой код struct_XOrder:

Public OrderNumber As String 
Public ClientShortName As String 
'"LineItems" is an array with elements defined as struct_LineItem 
'See Complex Types: Arrays in Microsoft Office 2003 Web Services Toolkit Help 
'for details on implementing arrays. 
Public LineItems As Variant 
Public OrderError As String 

Херес struct_LineItem:

Public ProductSKU As String 
Public Qty As Long 
Public UnitPrice As Variant 
Public ItemComment As String 
Public ItemError As String 

Heres мой основной код

Sub webservicetest() 

Dim NewOrder As struct_XOrder 
Dim LineItems(1 To 2) As Variant 
Dim Xline(1 To 2) As Variant 

Set Xline() = struct_LineItem 

Set NewOrder = New struct_XOrder 

Set NewOrder.LineItems() = New struct_LineItem 
Set NewOrder.LineItems() = New Xline 
'Xline = New struct_LineItem 


Xline(1).ItemComment = "items" 
Xline(1).Qty = 10 
NewOrder.LineItems() = Xline() 


NewOrder.ClientShortName = "DemoClient" 
NewOrder.OrderNumber = "12345" 

'Xline(1).ItemComment = "item1" 
'Xline(1).Qty = 5 

Debug.Print NewOrder.ClientShortName 
Debug.Print NewOrder.OrderNumber 

'For i = LBound(Xline) To UBound(Xline): Debug.Print Xline(i): Next 

'Debug.Print Xline(1).ItemComment 
'Debug.Print Xline(1).Qty 

End Sub 

ответ

1

См комментарии для объяснений.

Использовать Type вместо VBA для создания структур. Кроме того, вам не нужно использовать Set так, как вы.

Кроме того, используйте Option Explicit, чтобы требовать объявления переменных при использовании VBA, если вы не хотите кошмара.

Это все может идти в том же модуле.


'use this 
Option Explicit 

'VBA structs are defined like the following 
'and do not need "new" (similar to other languages) 
'when creating them 

Type struct_LineItem 
    ProductSKU As String 
    Qty As Long 
    UnitPrice As Variant 
    ItemComment As String 
    ItemError As String 

End Type 

Type struct_XOrder 
    OrderNumber As String 
    ClientShortName As String 

    'make this more clear 
    LineItems() As struct_LineItem 
    OrderError As String 
End Type 


Sub webservicetest() 

    Dim NewOrder As struct_XOrder 
    Dim LineItems(1 To 2) As Variant 
    Dim Xline(1 To 2) As struct_LineItem 

    'you can't do this, you need to specify which element 
    'in XLine you want to set 
    'Set Xline() = struct_LineItem 

    Dim myStruct As struct_LineItem 
    Xline(1) = myStruct 

    'you don't need "set" 
    NewOrder.LineItems = Xline() 

    'this won't update as if it's a reference, btw 
    Xline(1).ItemComment = "items" 
    Xline(1).Qty = 10 
    NewOrder.LineItems = Xline() 


    NewOrder.ClientShortName = "DemoClient" 
    NewOrder.OrderNumber = "12345" 

    Debug.Print NewOrder.ClientShortName 
    Debug.Print NewOrder.OrderNumber 

    'don't do ":" as this makes code unbearably not readable... 
    'For i = LBound(Xline) To UBound(Xline): Debug.Print Xline(i): Next 

    Dim i As Integer 
    For i = 1 To UBound(NewOrder.LineItems) 
     Debug.Print NewOrder.LineItems(i).ItemComment 
    Next i 

End Sub 
+0

спасибо. Это имеет больший смысл. Иль поиграет с ним, чтобы заставить его делать то, что я хочу. – Col

+0

Модуль класса struct_xorder изменен, есть ли способ, которым я могу просто сохранить его как 'lineitems как вариант'? Это вызывает ошибки. @enderland – Col

+0

BTY веб-службы находятся в https://webservices.p3pl.com/WSOrder.asmx?WSDL, если это помогает кому-то лучше понять. – Col

Смежные вопросы