Esecuzione calcoli a seguito di scelta con casella combinata

Anonimo
2022-01-07T09:59:21+00:00

Buongiorno

stò realizzando un piccolo dbase con access 2016 e windows 2010, il cui scopo è quello di eseguire dei calcoli per la corresponsione di incentivi al personale.

Il dbase consta di 4 tabelle

  1. ANAGRAFICA_INCENTIVI (anagrafica dipendenti)
  2. INCENTIVI_PESI_RUP (tabella con l'indicazione di pesi che vengono apllicati in base alla figura professionale)
  3. TAB_RIPARTIZIONE_RUP (tabella di ripatizione della percentuale destinata per quella fase e calcolo delle quote spettanti in base alla figura professionale)
  4. TIPO_FIGURA_PROFESSIONALE (tabelle delle figure professionali)

Ho costruito una maschera RIPARTIZIONE_RUP basata sulla tabella TAB_RIPARTIZIONE_RUP dove ho inserito due caselle combinate legate fra loro. La prima ID_TIPO_FIGURA e la seconda ID_ANAGRAFE. Quest'ultima è legata al valore della prima (ID_TIPO_FIGURA) in modo da limitare alle persone che ricoprono un determinato ruolo.

Sulla seconda cbo ho poi impostato codice vba, su evento "dopo aggiornamento", in modo che mi vengano eseguiti dei calcoli e scritti nella tabella di riferimento (TAB_RIPATIZIONE_RUP).

All'apparenza sembra che tutto funzioni correttamente, ma analizzando i risultati mi sono accorto che sono sbagliati.

Infatti se inserisco delle figure e relativi nominativi, alla primo calcolo, questo è del tutto sbagliato come da schermata allegata:

come potete notare se inserisco le prime due riche il calcolo della prima riga non viene riportato, per cui sono costretto a ritornare sul primo record.

completaneto l'inserimento anche delle altre figure previste, mi ritrovo con il risultato di cui alla tabella qui sotto riportata con il totale delle quote errato (€ 2.174,63)

Se riprendo dall'inizio a ripassare l'inserimento dati, a quel punto il tolare delle quote è quello corretto, come si evince dall'immagine qui riportata (totale quote esatto € 1.512,16)

Voglio precisare che il calcolo delle quote è direttamente dipendente dalla percentule calcolata (PESO_PONDERATO) per cui ogni qualvolta viene inserito una figura professionale il calcolo dell'intera tabella dovrà essere rideterminato.

Per questo motivo chiedo aiuto a qualche anima buona che abbia voglia di aiutarmi, non essendo da solo riuscito a risolvere questo problema.

Ringrazio in anticipo chiunque voglia aiutarmi e ringrazio sin da ora.

Di seguito il link per scaricare una demo del database.

https://1drv.ms/u/s!AtAJ5hV8tzhMmTlvcm73nItmfWxu?e=QglThE

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

domenico laurenza 9,900 Punti di reputazione Moderatore volontario
2022-01-09T17:43:11+00:00

Ciao,

prova con l'aggiunta dell'istruzione in grassetto

Private Sub CBO_ANAGRAFE_AfterUpdate()

TXT\_PESI\_rup = DLookup("PESI\_RUP", "INCENTIVI\_PESI\_RUP", "ID\_TIPO\_FIGURA=" & Me!ID\_TIPO\_FIGURA) 

PERCENTUALE\_ESTERNO = DLookup("PERCENTUALE\_ESTERNO", "INCENTIVI\_PESI\_RUP", "ID\_TIPO\_FIGURA=" & Me!ID\_TIPO\_FIGURA) 

**Me.Dirty = False** 

End Sub

Ad ogni modifica di cbo_anagrafe, l'inserimento viene finalizzato e quindi viene effettuato il ricalcolo.

Mimmo

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

domenico laurenza 9,900 Punti di reputazione Moderatore volontario
2022-01-09T13:12:41+00:00

Ciao,

spero di aver azzeccato i calcoli, prova a cambiare:

Private Sub CBO_ANAGRAFE_AfterUpdate()

TXT\_PESI\_rup = DLookup("PESI\_RUP", "INCENTIVI\_PESI\_RUP", "ID\_TIPO\_FIGURA=" & Me!ID\_TIPO\_FIGURA) 

PERCENTUALE\_ESTERNO = DLookup("PERCENTUALE\_ESTERNO", "INCENTIVI\_PESI\_RUP", "ID\_TIPO\_FIGURA=" & Me!ID\_TIPO\_FIGURA) 

End Sub

e ad aggiungere nell'evento dopo eliminazione della Form

Private Sub Form_AfterDelConfirm(Status As Integer)

RicalcolaRipartizioni 

End Sub

e ad aggiungere nell'evento dopo aggiornamento della Form

Private Sub Form_AfterUpdate()

RicalcolaRipartizioni 

End Sub

e aggiungere la seguente Sub

Private Sub RicalcolaRipartizioni()

Dim SommaPesi As Double 

Dim myRst As Recordset 

Set myRst = CurrentDb.OpenRecordset("TAB\_RIPARTIZIONE\_RUP") 

'-> Ricalcolo Somma Pesi

myRst.MoveFirst 

SommaPesi = 0 

Do While Not myRst.EOF 

   SommaPesi = SommaPesi + myRst("PESI\_rup") 

   myRst.MoveNext 

Loop 

If SommaPesi < 10 Then SommaPesi = 10 

'-> Ricalcolo generale

myRst.MoveFirst 

Do While Not myRst.EOF 

   myRst.Edit 

   myRst("PESO\_PONDERATO") = myRst("PESI\_rup") / SommaPesi 

   myRst("PERCENTUALE\_TEORICA") = myRst("PESO\_PONDERATO") \* (5 / 100) 

   myRst("PERCENTUALE\_EFFETTIVA") = myRst("PERCENTUALE\_TEORICA") \* (1 - myRst("PERCENTUALE\_ESTERNO")) 

   myRst("QUOTA\_SPETTANTE") = 30243.21 \* myRst("PERCENTUALE\_EFFETTIVA") 

   myRst.Update 

   myRst.MoveNext 

Loop 

Me.Requery 

Set myRst = Nothing 

End Sub

in fase di inserimento/modifica devi finalizzare l'operazione e quindi il sistema effettua il ricalcolo.

Potresti, in alternativa, prevedere un pulsante di ricalcolo delle ripartizioni.

Facci sapere

Ciao Mimmo

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

8 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2022-01-09T16:11:37+00:00

    Ciao Mimmo

    ho implementato il codice secondo le tue indicazioni, o meglio ho copiato il codice integralmente e devo dire con molta gratitudine che funziona alla grande; in modo impeccabile effettua i calcoli al decimo di centesimo.

    Non avevo nessun dubbio che mi avresti indicato la strada giusta.

    L'unica attenzione che devo prestare è riferita alla fase di inserimento/modifica dove, affinchè venga effettuato il ricalcolo della tabella, dovrò posizionare il cursore al primo record vuoto.

    Per questo ulteriore problema, immagino che l'unica alternativa sia di posizionare un pulsante di ricalcolo?

    Oppure c'è il modo che il cursore si possa posizionare sul primo record vuoto disponibile a mezzo codice vba?

    Comunque grazie Mimmo

    Con ammirazione e gratitudine

    Luca

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2022-01-09T10:18:44+00:00

    Ciao Mimmo, ti rigrazio vivamente della tua risposta.

    In merito a cio che mi chiedi, ed in particolare:

    La prima cosa che mi viene in mente è che tranne i campi

    ID_TIPO_FIGURA

    ID_ANAGRAFE

    tutti gli altri campi sono campi calcolabili o presenti nelle altre tabelle come

    PESI_RUP

    PERCENTUALE_ESTERNO

    Si in effetti gli unici campi già popolati sono:

    ID_TIPO_FIGURA

    ID_ANAGRAFE

    PESI_RUP

    PERCENTUALE_ESTERNO

    gli altri campi della tabella TAB_RIPARTIZIONE_RUP sono da calcolare, in base ai valori dei campi precedenti.

    Il mio problema, in buona sostanza, è avere una routin che dovrebbe ricalcolare l'intera tabella TAB_RIPARTIZIONE_RUP quando vado a variare, aggiungere o eliminare un record della medesima

    perchè come potrai notare dal confronto delle figure che ti allego i risultati variano in virtù dell'aggiunta, eliminazione o modifica di un record:

    Schermata con tutte le figure interessate (immagine 1)

    Immagine

    Schermata con l'eòliminazione dalla precedente tabella di un record (immagine 2)

    Immagine

    Schermata con l'aggiunta di un nuovo record rispetto all'immagine 1 (immagine 3)

    Immagine

    Come sicuramente avrai potuto notare la somma della colonna QUOTE (€) deve rimanere uguale in ogni situazione.

    Avevo pensato al ricalcolo mediante un clico do while o qualcosa di simile, ma è un percorso che non ho mai utilizzato e non saprei da dove iniziare.

    Spero di aver chiarito i tuoi dubbi.

    Grazie ancora Mimmo

    Luca

    La risposta è stata utile?

    0 commenti Nessun commento
  3. domenico laurenza 9,900 Punti di reputazione Moderatore volontario
    2022-01-08T18:54:07+00:00

    Ciao Luca,

    sto tentando di capire il problema quindi ti faccio qualche domanda.

    La prima cosa che mi viene in mente è che tranne i campi

    ID_TIPO_FIGURA

    ID_ANAGRAFE

    tutti gli altri campi sono campi calcolabili o presenti nelle altre tabelle come

    PESI_RUP

    PERCENTUALE_ESTERNO

    Come tu dici:

    per cui ogni qualvolta viene inserito una figura professionale il calcolo dell'intera tabella dovrà essere rideterminato.

    ed io aggiungo anche se elimini o aggiorni un qualsiasi record.

    Quindi proverei a non memorizzare in tabella i valori calcolati.

    Nella maschera prova ad impostare in ogni controllo le funzioni necessarie per ricavarlo.

    Ad esempio

    TXT_PESI_rup =IIf(Not IsNull([CBO_TIPO_FIGURA]);DLookUp("PESI_RUP";"INCENTIVI_PESI_RUP";"ID_TIPO_FIGURA =" & [CBO_TIPO_FIGURA]);"")

    Facci sapere

    Ciao Mimmo

    La risposta è stata utile?

    0 commenti Nessun commento