Ottimizzare Routine per aggiornare tanti records

di il
5 risposte

Ottimizzare Routine per aggiornare tanti records

Salve.
Premetto che ho provato a cercare nello storico ma non sono riuscito a trovare qualcosa che potesse andare al caso mio.
Sto combattendo con una routine che svolge bene il suo compito ma impiega troppo tempo per farlo.
Dunque, cercherò di essere sintetico.
Ho una tabella con più o meno 100.000 records.
Alcune colonne di questa tabella non sono valorizzate e devo, settimanalmente, procedere con l'estrapolazione di alcuni valori rilevati da altre tabelle presenti sullo stesso DB in modo da poter calcolare i valori da aggiornare.
Di seguito la routine che ho sviluppato e che esegue quanto occorrente.
La mia domanda è se sto sbagliando qualcosa oppure se mi conviene un approccio diverso rispetto a quanto fatto fin ora...
grazie mille!!!
Private Sub Comando10_Click()
' Routine agganciata al pulsante di comando sulla dashboard principale...
' Elabora la tabella riferita al Fornitore ed al Cliente in linea per aggiornare le colonne di StockMonth, StockVal e SellOutVal
Dim RsTbl As DAO.Recordset ' Apro in memoria la tabella Fornitore_Cliente con tutte le settimane importate
Dim RsLP As DAO.Recordset ' Estrapolo la tabella del QLastPrice per catturare l'ultimo prezzo di acquisto
Dim RsWeeks As DAO.Recordset ' Estrapolo la tabella delle settimane per individuare quelle di fine mese
Dim RsMax As DAO.Recordset ' Estrapolo l'Ultima settimana valorizzata
Dim id_Forn As Integer
Dim id_Cl As Integer
Dim EAN As String
Dim bln_EOM As Boolean ' Se è true vuol dire che siamo in una settimana di fine mese, oppure nell'ultima settimana inserita

Dim StrMax As String
Dim strSql_LP As String
Dim strSql_Weeks As String
Dim Price_Acq As Currency ' Definisce il prezzo di acquisto del codice EAN dato Cliente e Fornitore
Dim LastN_Progr As Integer ' Definisce l'ultimo N_Progr caricato in tabella...
Dim my_Tbl As String
Dim lngCounter  As Long
Dim ReturnValue As Integer
Dim i As Long

Dim s As Single ' Registro la durata dell'Elaborazione

s = Timer

my_Tbl = Me.cbo_idFornitore.Column(1) & "_" & Me.cbo_IdCliente.Column(1)

' Apro la tabella Fornitore_Cliente con tutte le settimane caricate...
Set RsTbl = CurrentDb.OpenRecordset(Me.cbo_idFornitore.Column(1) & "_" & Me.cbo_IdCliente.Column(1))

' Il fornitore è unico per l'intera elaborazione...
id_Forn = Me.cbo_idFornitore.Value

StrMax = "SELECT Max([" & my_Tbl & "].N_PROGR) AS MaxDiN_PROGR FROM [" & my_Tbl & "];"

    Set RsMax = CurrentDb.OpenRecordset(StrMax)
    LastN_Progr = RsMax.Fields(0) ' Avrà solo un valore
    RsMax.Close
    Set RsMax = Nothing

DoCmd.Hourglass True

    lngCounter = RsTbl.RecordCount
    
    'Display message and initialize status bar:
    ReturnValue = SysCmd(acSysCmdInitMeter, "Updating Values...", lngCounter)

    Do While Not RsTbl.EOF
        i = i + 1
        ReturnValue = SysCmd(acSysCmdUpdateMeter, i) ' Visulazzo la barra di avanzamento...
        
        EAN = RsTbl![EAN]
        id_Cl = RsTbl![id_cliente]
    
        strSql_LP = _
        "SELECT Tbl_QLastPrice.IDFornitori, Tbl_QLastPrice.IDCliente, Tbl_QLastPrice.Barcode, Tbl_QLastPrice.[Prezzo Acquisto] FROM Tbl_QLastPrice " & _
        "WHERE (((Tbl_QLastPrice.IDFornitori)=" & id_Forn & ") AND ((Tbl_QLastPrice.IDCliente)=" & id_Cl & ") AND ((Tbl_QLastPrice.Barcode) = """ & EAN & """));"
        
        Set RsLP = CurrentDb.OpenRecordset(strSql_LP)
            If RsLP.RecordCount > 0 Then
                Price_Acq = RsLP![Prezzo Acquisto] ' Mi basta estrapolare il primo prezzo presente in tabella!!
            End If
        
        ' Verifico se la settimana in analisi appartiene alle settimane di fine mese...
        strSql_Weeks = "SELECT Tbl_Weeks.N_Progr, Tbl_Weeks.fineMese FROM Tbl_Weeks WHERE (((Tbl_Weeks.N_Progr)=" & RsTbl![N_Progr] & "));"
        
        Set RsWeeks = CurrentDb.OpenRecordset(strSql_Weeks)
        If RsTbl!N_Progr = LastN_Progr Or RsWeeks![finemese] = True Then
            bln_EOM = True
        Else
            bln_EOM = False
        End If
        
        RsTbl.Edit
        RsTbl!Stock_val.Value = RsTbl!Stock * Price_Acq
        RsTbl![Sell-Out_val].Value = RsTbl!SEllOut * Price_Acq
        RsTbl![Stock_Month].Value = RsTbl!Stock * bln_EOM * -1
        RsTbl!Stock_MonthVal.Value = RsTbl!Stock * Price_Acq * bln_EOM * -1
        
        RsTbl.Update
        RsTbl.MoveNext
                        
    Loop
    
DoCmd.Hourglass False

MsgBox "Durata dell'Elaborazione " & Round(Timer - s, 2)
ReturnValue = SysCmd(acSysCmdRemoveMeter)

RsTbl.Close
RsWeeks.Close
RsLP.Close

Set RsTbl = Nothing
Set RsWeeks = Nothing
Set RsLP = Nothing

End Sub

5 Risposte

  • Re: Ottimizzare Routine per aggiornare tanti records

    Puoi spiegare questo
    
    Set RsTbl = CurrentDb.OpenRecordset(Me.cbo_idFornitore.Column(1) & "_" & Me.cbo_IdCliente.Column(1))
    Nel senso che mi viene da pensare tu abbia Tante Tabelle quanti i Fornitori...? Spero non sia così...

    Secondo me tutto quello che hai scritto potrebbe essere fattibile con una Query UPDATE... se la costruisci bene... ma non è semplice capire la confusione del codice di altri...
  • Re: Ottimizzare Routine per aggiornare tanti records

    Grazie mille per la risposta.
    Mi rendo conto che la questione è abbastanza articolata.
    Semplificando lo scenario al massimo:
    Ho due tabelle:
    La tabella "A" (lato uno) contiene tutti i prezzi unitari degli Articoli. Una riga contiene prezzo, id_Articolo, id_Cliente e id_Fornitore.
    La tabella "B" (lato molti) contiene tutte le registrazioni di vendita effettuate per tutti gli Articoli su tutti i Clienti.
    Adesso devo prendere tutti i prezzi della tabella "A" ed inserirli nella tabella "B" rispettando però le seguenti condizioni:
    l'Id_Articolo della Tabella "B" è legato all'id_Articolo della tabella "A" se ha lo stesso id_Cliente e lo stesso Id_Fornitore.
    Chiaramente in queste condizioni non mi permette di scrivere un Query UPDATE e quindi sono stato costretto a scorrere tutti i records utilizzando una connessione DAO.recordset
    Ma spero ci sia un'alternativa...
  • Re: Ottimizzare Routine per aggiornare tanti records

    Textomb ha scritto:


    ....
    Chiaramente in queste condizioni non mi permette di scrivere un Query UPDATE......
    Perchè fai questa affermazione...?
    Cerca di spiegarla, perchè così come l'hai esposta è fattibile ed il fatto tu invece dica il contrario mi fa pensare che mi possa sfuggire qualche cosa.
  • Re: Ottimizzare Routine per aggiornare tanti records

    Alex buondì.
    Certo ti è sfuggita una cosa importante.
    Era tardi ed ero stanco! Quando sono in quelle in condizioni non conviene lavorare. meglio riposare un pò.
    Infatti stamattina guardando la problematica l'ho risolta con una query UPDATE come avevi suggerito e come era giusto fare...
    Chiedo scusa per l'inutile thread...!
  • Re: Ottimizzare Routine per aggiornare tanti records

    Textomb ha scritto:


    Alex buondì.
    ...
    Chiedo scusa per l'inutile thread...!
    Direi che non è inutile se risolve...
    Di solito quando ci si fissa su un modo di vedere il problema, è difficile trovare un modo diverso per risolvere, se non lasciandolo li qualche gg, oppure facendolo guardare ad altri...!
Devi accedere o registrarti per scrivere nel forum
5 risposte