Letto e sto seguendo passo passo le giude
<http://education.mondadori.it/libri/Download/Capitoli/88-04-53451-6_capitolo14.pdf
>
<http://www.itportal.it/developer/algoritmi/access_vba/>
Ho fatto 3 moduli Classe
List_Clienti
Item_Cliente
Item_Mese
Vorrei ottenere che
List_Item sia una Collection formata da elementi tipo Item_Cliente
Item_Cliente a sua volta ha una sua
property cod
e una List_Mesi(1 to 12 ) as Item_Mese
Item_Mese ha le seguenti propietà
public totale1 as Double
public totale2 as Double
...
public totale_n as Double
Devo poi implementarmi "a manina" le procedure di inserimento, ricerca,
cancellazione ... ???
Ci sono altre guide in rete a riguardo o esempi di codice?
Grazie anticipatamante
Ridddler ?
Mi sono perso il thread.
Mi dai il link o mi spieghi(in modo
sintetico) cosa devi fare?
Le classi richiedono qualcosa in più(in termini
di comprensione) delle semplici routine
che mettiamo nei moduli.
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
> abbandonata l'idea della matrice "gigante" sono passato alle Classi ...
> ora vista le mia inesperienza in VBA ... nelle Classi ... è nebbia
> TOTALE ... Vi chiedo corretto quello che ho fatto?
> ******************************************
>
> Mi sono perso il thread.
> Mi dai il link o mi spieghi(in modo
Ho pensato di apprirne un altro perchè l'argomento era un pò diverso
...
Cucchiaino mi ha proposto una soluzine molto interessante.
> sintetico) cosa devi fare?
> Le classi richiedono qualcosa in più(in termini
> di comprensione) delle semplici routine
> che mettiamo nei moduli.
Si infatti implementando una Classe devo farmi anche i metodi ri
inserimento e recupero dei valori ...
Ho programmato con le Classi con altri linguaggi ma con VBA sono
proprio alle prime armi ... e mi sono sentito un pò spaesato ...
sto valutando anche la soluzione proprosta da cucchiaino
saluti
Riddler ?
> Le classi richiedono qualcosa in più(in termini
> di comprensione) delle semplici routine
> che mettiamo nei moduli.
Ragionando sulla soluzione matrice tridimensionale, ho trvato che in
ogn caso dovrei avere una ulteriore struttura arra in cui inserire
l'indicizzazione dei codici clienti ... da tread suggerito ...
Quindi questo mi riporta a pensare che sia meglio farmi una classe ...
Per ora l'idea è di fare così
List_Clienti as Collection
Cliente come classe che ha le property codice e un array 1 to 12 per i
mesi di tipi Item_Mese
Item_Mese
tot1
tot2
...
totn
Cosi quando aggiungo un elemento
List_Clienti.Add Item:=Cliente, key:=Cliente.cod
posso ricercare per codice ... giusto?
Ecco le definizioni delle classi
Item_Mese
pubic tot1
pubic tot2
...
pubic totn
Item_Cliente
public cod as string
pubic List_Mesi(1 to 12) as Item_Mese
List_Clienti as Collection
In cui inserirò valori di tipi Item_Cliente
Vi chiedo è corretto come punto di partenza?
Quando devo valorizzare il tutto sono corrette le seguenti istruzioni?
Dim cliente as Item_Cliente
dim mese as Item_Mese
mese.tot1 = xxx
mese.tot2 = yyy
...
mese.totn = zzz
cliente.cod = 333
cliente.List_Mesi(1)=mese
List_Clienti.Add Item:=cliente, key:=cliente.cod
Grazie ancora
saluti
Riddler ?
Niente! NON ci riesco! sarà perchè ormai sono fuso ma non sono
riuscito ad implementare in VBA la classe che vorrei fare ... ho chiaro
quello che vorrei implementare, ma non trovo la strada ...
L'esigenza è poter avere una Collection di Clienti e ricecrcarli per
codice, ogni cliente a sua volta avrà un elenco di mesi ... da 1 a 12
... nei i quali ho i vari tot1, tot2 ... totn
Qualcuno ke mi da una dritta in più ... adesso ho provato nella classe
Item_Cliente a dichiarare
Public List_Mesi as Item_mese ma non è possibile ...
Come posso realizzare la suddetta struttura?
Grazie ancora a tutti
Riddler ?
ho implementato le classi come descritto, ma durante il test ottengo un
errore run-time 91 "variabile ggetto o blocco with non impoststa"
Di seguito le classi
Item_Mese
Option Explicit
' Totali da calcolare
Public tot1 As Double
Public tot2 As Double
Public tot3 As Double
Public tot4 As Double
Public tot5 As Double
Public tot6 As Double
Public tot7 As Double
Public Sub Initialize_Mese()
Me.tot1 = 0
Me.tot2 = 0
Me.tot3 = 0
Me.tot4= 0
Me.tot5 = 0
Me.tot6 = 0
Me.tot7 = 0
End Sub
Item_Cliente
Public cod As String ' Codice Cliente
Public List_Mesi As Collection ' Elenco Mesi
Private Sub Initialize_Cliente()
Dim i As Integer
Dim mese As Item_Mese
Set List_Mesi = New Collection
For i = 1 To 12
Set mese = New Item_Mese
mese.Initialize_Mese
List_Mesi.Add Item:=mese, Key:=i
Next i
End Sub
Private Sub Terminate_Cliente()
Set List_Mesi = Nothing
End Sub
List_Clienti
Public Clienti As Collection
' Aggiunge un Elemento Cliente con il suo array Mesi nella lista
Sub Add_Cliente(cli As Item_Cliente)
Clienti.Add Item:=cli, Key:=cli.cod
End Sub
Sub Remove_Cliente(code As String)
If Clienti.Contains(code) Then
Clienti.Remove (code)
End If
End Sub
Sub Print_Clienti()
Dim i As Integer
Dim cli As Item_Cliente
Dim mese As Item_Mese
Dim MyObject As Variant
Dim MyList As Variant
For Each MyObject In Me.Clienti
MyList = MyList & MyObject.cod & Chr(13)
Set mese = New Item_Mese
Set cli = New Item_Cliente
cli = MyObject
For i = 1 To 12
mese = cli.List_Mesi(i)
MyList = MyList & mese.crediti_residui & Chr(13)
MyList = MyList & mese.tot_ct_brillanti & Chr(13)
MyList = MyList & mese.tot_pietre & Chr(13)
MyList = MyList & mese.vend_brillanti & Chr(13)
MyList = MyList & mese.vend_oreficeria & Chr(13)
MyList = MyList & mese.vend_pulitura & Chr(13)
MyList = MyList & mese.vend_service & Chr(13)
Next i
Next MyObject
MsgBox (MyList)
End Sub
Codice usato per il test
Sub test_class()
Dim list_cli As New List_Clienti
Dim cli As Item_Cliente
Dim mese As Item_Mese
Dim MyObject As Variant
Dim MyList As Variant
Dim i As Integer
For i = 1 To 20
Set cli = New Item_Cliente
Set mese = New Item_Mese
cli.cod = i
mese.Initialize_Mese
cli.List_Mesi.Add Item:=mese, Key:=cli.cod '<= Dove da ERRORE
list_cli.Add_Cliente (cli)
Next i
list_cli.Print_Clienti
list_cli.Remove_Cliente (17)
list_cli.Print_Clienti
End Sub
Dove sto sbagliando?
Grazie anticipatamente a tutti
Riddler ?
Salve a tutti,
Fatte alcune modifiche a vari tentativi, ma non riesco a valorizzare
la Collection ...
Item_Mese
Option Explicit
' Totali da calcolare
Public tot1 As Double
Public tot2 As Double
Public tot3 As Double
Public tot4 As Double
Public tot5 As Double
Public tot6 As Double
Public tot7 As Double
Public Sub IAzzera_Totali()
Me.tot1 = 0
Me.tot2 = 0
Me.tot3 = 0
Me.tot4= 0
Me.tot5 = 0
Me.tot6 = 0
Me.tot7 = 0
End Sub
Item_Cliente
Public cod As String ' Codice Cliente
Public List_Mesi As Collection ' Elenco Mesi
Private Sub Class_Initialize()
Dim i As Integer
Dim mese As Item_Mese
Set List_Mesi = New Collection
For i = 1 To 12
Set mese = New Item_Mese
mese.Initialize_Mese
List_Mesi.Add Item:=mese, Key:=i
Next i
End Sub
Private Sub Class_Terminate()
Set List_Mesi = Nothing
End Sub
List_Clienti
Public Clienti As Collection
MsgBox (MyList)
End Sub
Sub test_class()
cli.List_Mesi.Add Item:=mese, Key:=cli.cod '<= Dove da ERRORE ***
list_cli.Add_Cliente (cli)
Next i
list_cli.Print_Clienti
list_cli.Remove_Cliente (17)
list_cli.Print_Clienti
End Sub
Alla riga cli.List_Mesi.Add Item:=mese, Key:=cli.cod
Ottengo l'errore:
ho implementato le classi come descritto, ma durante il test ottengo
un
errore run-time 91 "variabile ggetto o blocco with non impoststa"
Se invece provo a metter
cli.List_Mesi.Item(i) = mese
Che "sarebbe" in teoria quella corretta ottengo un errore run-time
tipo non corrispondente
> MyList = MyList & mese.tot1 & Chr(13)
> MyList = MyList & mese.tot2 & Chr(13)
> MyList = MyList & mese.tot3 & Chr(13)
> MyList = MyList & mese.tot4 & Chr(13)
> MyList = MyList & mese.tot5 & Chr(13)
> MyList = MyList & mese.tot6 & Chr(13)
> MyList = MyList & mese.tot7 & Chr(13)
TROVATO!
Se invece di
cli.List_Mesi.Add Item:=mese, Key:=cli.cod '<= Dove da ERRORE ***
Metto
cli.List_Mesi.Add mese
Funziona correttamente l'inserimento dell'item nella collectio e lo
recupero facendo:
lista_cli.Clienti.Item(n)
Dove lista_cli è la Collection ... ora ... un po di dubbi ... visto
che vorrei recuperare i valori tramite key perchè mi da errore se
tento di inserire la key? Anche gli esempi trovati in giro per la rete
e nella guida fanno l'inserimento con
cli.List_Mesi.Add Item:=mese, Key:=cli.cod
Per chè a me da errore?
Poi altra cosa ho trovato sumsdn il metodo "Contains", ma con VBA di
Excel mi da errore, quindi come faccio a sapere se un elemento è già
stato inserito nella collection ricercando la sua key? Mi sembra ino
spreco ciclare tutte le volete la Collection alla ricerca del valore (
visto che per ora NON sono riuscito a mettre la key )
Qualcuno sa indirizzarmi su dove corregge queste mancanze? Fatte queste
... finalemte posso utilizzare la Classe per i miei scopi ...
> Dove lista_cli è la Collection ... ora ... un po di dubbi ... visto
> che vorrei recuperare i valori tramite key perchè mi da errore se
> tento di inserire la key? Anche gli esempi trovati in giro per la rete
> e nella guida fanno l'inserimento con
> cli.List_Mesi.Add Item:=mese, Key:=cli.cod
>
> Per chè a me da errore?
>
> Poi altra cosa ho trovato sumsdn il metodo "Contains", ma con VBA di
> Excel mi da errore, quindi come faccio a sapere se un elemento è già
> stato inserito nella collection ricercando la sua key? Mi sembra ino
> spreco ciclare tutte le volete la Collection alla ricerca del valore (
> visto che per ora NON sono riuscito a mettre la key )
>
> Qualcuno sa indirizzarmi su dove corregge queste mancanze? Fatte queste
> ... finalemte posso utilizzare la Classe per i miei scopi ...
>
Trovata risposta alla seconda domanda ... come fare a sapere se un
elemento è nella Collection , ecco a Voi il codice, magari può
tornare util a qualcun altro, ma mi manca la parte in cui vorrei
inserire anche le key ... come fare?
Code:
Function IsIn(oCollection As Object, key_to_search As String) As
Boolean
Dim O As Object
On Error GoTo NotIn
Set O = oCollection(key_to_search)
IsIn = True 'succeeded in creating a pointer to the object so
'must be there
NotIn:
End Function
> Trovata risposta alla seconda domanda ... come fare a sapere se un
> elemento è nella Collection , ecco a Voi il codice, magari può
> tornare util a qualcun altro, ma mi manca la parte in cui vorrei
> inserire anche le key ... come fare?
Così magari può trornare utile a qualcun' altro che come me si
cimenta per la prima volta nella costrusione di Moduli Classe ...
Ecco perchè non riuscivo ad inserire la key
List_Clienti.Add Item:=cliente, key:=cliente.cod
Questa istruzione va modificata con
List_Clienti.Add Item:=cliente, key:=CStr(cliente.cod)
Perchè la key "vuole" una stringa .-) ora funziona tutto correttamente
Un saluti a tutti
Riddler ?