Grazie per aver risposto, allora ricominciamo.
Uso Access, che per fortuna sopperisce alla mia poca conoscenza di vba!!
Con le query e la costruzione di un db me la cavo, ma non si può fare tutto senza le macro.
Allora, il mio obiettivo è quello di calcolare il valore del magazzino e dei singoli prodotti in uscita. Ho una tabella con tutti gli Stock e Acquisti dei prodotti. In un'altra tabella sono riuscita ad ottenere tutti i prelievi dei prodotti (con la data specifica) che poi dovranno entrare in produzione. Per valorizzare il prodotto in uscita uso la media mobile che in parole povere "valorizza" il materiale in uscita al costo medio di quel materiale. Cioè se in magazzino ho 10 pezzi di uno specifico materiale che ho pagato 10 €, e domani mi arrivano altri 5 pezzi che però pagherò 5€, la media pesata sarà (10*10+5*5)/(10+5).
Tutti i pezzi che verranno prelevati da domani in poi avranno un valore di 125/15.
Mi ricavo una tabella che
ordina per data e per materiale tutti i movimenti di magazzino, quindi stock acquisti e vendita(prelievi). la struttura della tabella è la seguente:
- Material: codice prodotto
- Data: data dell'operazione
- Input: quantità del materiale nel caso di stock o acquisto
- Output: quantità nel caso di prelievo
- Valore: importo singolo degli input (per gli output sarà null)
Per calcolare la media ho bisogno di calcolare il valore totale del magazzino e le giacenze (progressivi), il loro rapporto sarà quindi la mia MAP che dovrò associare ai prodotti in uscita.
La mia idea, che non so perchè ma funziona, è questa:
- creo un recordset con la tabella totale in cui per ogni materiale avrò come prima voce lo stock (situazione attuale del magazzino), poi gli eventuali acquisti e/o prelievi.
- mi sposto alla prima riga, salvo l'id del materiale e la data e creo un nuovo recordset che mi seleziona tutti i prodotti che hanno quell'id e sono precedenti a quella data
- mi calcolo e creo variabili per valoretot (valore totale del magazzino) e giacenze e relativa media.
- mi sposto nella riga successiva e se il valore del record è null (quindi è un prelievo) gli inserisco come valore la variabile map calcolata al punto precedente.
-ricalcolo recordset valoretot giacenze e map e poi movenext...
Per quanto riguarda il controllo dell'eof e bof, ho dovuto modificarlo così sperando di non ricevere errori ma continuo ad averne, se avete consigli su come modificare il codice sono tutt'orecchie(o occhi in questo caso).
premettendo che funziona( è abbastanza lento ma sono 15mila record), vi allego il codice così mi dite quali e quante cretinate ho scritto:
Private Sub Form_Open(Cancel As Integer)
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim rs2 As ADODB.Recordset
Dim array1 As Variant
Dim strsql As String
Dim Valoretot As Double
Dim magazzino As Integer
Dim map As Double
Dim ID As String
Dim Material As String
Dim Data As Date
'Use the ADO connection that Access uses
Set cn = CurrentProject.AccessConnection
'Create an instance of the ADO Recordset class, and
'set its properties
Set rs = New ADODB.Recordset
strsql = "SELECT giacenze.* FROM giacenze WHERE (((giacenze.data) Is Not Null)) ORDER BY giacenze.Material, giacenze.data"
With rs
Set .ActiveConnection = cn
.Source = strsql
.LockType = adLockOptimistic
.CursorType = adOpenKeyset
.Open
rs.MoveFirst
Do While Not rs.EOF
Material = .Fields("Material").Value
Data = .Fields("data").Value
Set rs2 = New ADODB.Recordset
strsql = "SELECT giacenze.* FROM giacenze WHERE material='" & Material & "' and data<=" & CLng([Data]) & " ORDER BY giacenze.data"
With rs2
Set .ActiveConnection = cn
.Source = strsql
.LockType = adLockOptimistic
.CursorType = adOpenKeyset
.Open
Valoretot = DSum("Input*Valore-Output*Valore", "giacenze", "material='" & [Material] & "' and data<=" & CLng([Data]))
magazzino = DSum("Input-Output", "giacenze", "material='" & [Material] & "' and data<=" & CLng([Data]))
End With
rs2.Close
Set rs2 = Nothing
'Valoretot1 = Valoretot(a, b)
'magazzino1 = magazzino(.Fields("Material").Value, .Fields("data").Value)
If Valoretot = 0 Or magazzino = 0 Then
map = 0
Else: map = [Valoretot] / [magazzino]
End If
ID = rs.Fields("Material").Value
rs.MoveNext
If rs.EOF = "True" And rs.BOF = "True" Then
Exit Do
ElseIf IsNull(rs.Fields("Valore").Value) And ID = rs.Fields("Material").Value Then
rs.Fields("Valore").Value = map
rs.Update
End If
Loop
End With
rs.Close
Set rs = Nothing
Set cn = Nothing
End Sub