|
Topic Topic Hot Topic New Topic Locked Topic Sticky Topic Hidden |
Standardizzare Calcoli VBA |
Post Reply
|
| Author | |||
mjjfil
Utente Senior
Joined: 07/Giu/2010 Status: Offline Points: 236 |
Post Options
Thanks(0)
Quote Reply
Topic: Standardizzare Calcoli VBAPosted: 01/Mag/2012 at 21:24 |
||
|
Ciao a Tutti,
apro questo 3D per porvi alcuni quesiti riguardo argomenti, in parte, già trattati da me e Luciano in quest'altro 3D LINK. In buona sostanza nel mio db ho creato un modulo nel quale ho inserito 4 funzioni e 1 Sub Pubbliche che eseguono calcoli in VBA (le prime 4) e una query di aggiornamento (la sub). Queste poi le richiamo nel modulo della form interessata in questo modo: -Richiamo in Form
-4 Funzioni Pubbliche nel Modulo
Ora: prima di fare così come mi aveva consigliato Luciano, eseguivo i calcoli direttamente dalla form. Però, così facendo, se l'utente voleva modificare alcune "parti dei calcoli", x es. il campo [valore] (vedi codice seguente) e doveva farlo da una Form, diversa da quella in cui eseguivo i calcoli, cosa facevo io: Nell'evento "su dopo aggiornamento" del controllo (origine-[valore]), che l'utente intendeva modificare, facevo aprire e chiudere la form che eseguiva i calcoli. Poi con un banalissimo [For...Next + "Call cmd_123_Click], facevo ciclare tutti i record. Così si aggiornavano i risultati dei calcoli nella tabella a fronte del dato ([valore]) modificato.
Adesso la questione è la seguente: Siccome Luciano mi aveva insegnato che i calcoli "standardizzati" potevano essere richiamati in qualsiasi punto dell'applicazione, io vorrei operare come segue: Se l'utente modifica il campo [valore], tramite l'apposita form, vorrei che funzioni pubbliche e relativi calcoli fossero rieseguiti, onde avere nel report finale dei dati corretti (senza dover ciclare tutta la form che richiama le [public functions]). Aggiungo che la form che richiama i calcoli (Funzioni Pubbliche), funziona alla grande e i risultati sono esatti...! :-) Aggiungo pure che i calcoli eseguiti, vengono memorizzati nei campi della tabella. Penso che ciò NON infranga la 4° regola di "Normalizzazione DataBase". Questo perchè un campo calcolato è un campo che contiene ed esegue un calcolo. Infatti i campi delle tabelle in cui vengono memorizzati i risultati non sono calcolati e le tabelle non sono altro che contenitori sterili. Il calcolo lo esegue solo il VBA. Si potrebbe quasi dire che "non è del tutto giusto" eseguire i calcoli nelle query di selezione, in quanto queste ultime servono (teoricamente) solo a interrogare le tabelle (o anche query) e dovrebbero essere utilizzate per lo scopo per il quale sono state concepite (interrogare dati di Tabelle o query). Mi scuso se mi sono dilungato così tanto e ringrazio chiunque vorrà aiutarmi... ;-) Abbraccio Ciao Fil P.S. Ditemi pure se devo spiegarmi meglio...! |
|||
![]() |
|||
willy55
Veterano
Esperto di Access Joined: 03/Ago/2011 Location: Italy Status: Offline Points: 1230 |
Post Options
Thanks(0)
Quote Reply
Posted: 03/Mag/2012 at 14:49 |
||
|
Per modificare un valore da un qualsiasi punto dell'applicativo devi realizzare una serie di funzioni in grado di operare indipendentemente dalla maschera (tutti i dati devono essere parametri della funzione stessa) ove si imputano i dati e quindi che effettui esclusivamente il calcolo e restituisca il valore.
Dopodichè si può valutare se effettuare la memorizzazione del calcolo in quanto, se scaturisce da dati presenti nel db e conosciuta la logica, è sempre possibile ottenerne il risultato (appunto fornito dalla funzione sopracitata). Ciò significa rivedere il tuo codice. Buon lavoro. |
|||
|
Willy
|
|||
![]() |
|||
mjjfil
Utente Senior
Joined: 07/Giu/2010 Status: Offline Points: 236 |
Post Options
Thanks(0)
Quote Reply
Posted: 04/Mag/2012 at 12:52 |
||
|
Ciao Willy55 e Grazie,
seguendo le tue indicazioni ho modificato le funzioni, nel modulo, come segue (ne mostro solo una). Spero di aver fatto dei passi avanti (e non indietro :P). In debug mi esegue tutta la funzione e il risultato del calcolo quantomeno c'è. Tuttavia non viene memorizzato nella tabella. :( ecco il codice:
Ho controllato pure i nomi dei campi e sono giusti mi valorizza tutto, ma a questa riga non memorizza il valore nella tabella e a da errore runtime: "Utilizzo non valido di null".
E per richiamare la funzione pubblica del modulo nella form uso il seguente [for...next]:
Attendo tue notizie e ti ringrazio in anticipo per la pazienza e l'aiuto. Abbraccio Ciao Fil |
|||
![]() |
|||
willy55
Veterano
Esperto di Access Joined: 03/Ago/2011 Location: Italy Status: Offline Points: 1230 |
Post Options
Thanks(0)
Quote Reply
Posted: 05/Mag/2012 at 22:19 |
||
|
La tua funzione Forecast non si capisce il senso dei parametri impiegati (varAnalisi, dlkup, dlkup1, dlkup2). Esempi di cicli con recordset con aggiunta/modifica dati Edited by willy55 - 05/Mag/2012 at 22:19 |
|||
|
Willy
|
|||
![]() |
|||
mjjfil
Utente Senior
Joined: 07/Giu/2010 Status: Offline Points: 236 |
Post Options
Thanks(0)
Quote Reply
Posted: 06/Mag/2012 at 21:35 |
||
|
Ciao Willy e grazie,
sarò sincero: non mi ci raccapezzo più... :( Non è che potresti postare un esempio di una funzione pubblica che esegue un calcolo con dati presenti in campi di varie tabelle, che li memorizza nella tabella interessata e che tale Funzione sia richiamabile da qualsiasi punto dell'applicazione? Attendo tue notizie. Grazie in anticipo Abbraccio Fil |
|||
![]() |
|||
willy55
Veterano
Esperto di Access Joined: 03/Ago/2011 Location: Italy Status: Offline Points: 1230 |
Post Options
Thanks(0)
Quote Reply
Posted: 07/Mag/2012 at 22:11 |
||
|
Rispondo alla tua
Per memorizzare un dato da un recordset devi utilizzare il metodo "Update" (con "Edit" prima se utilizzi DAO) e AddNew se devi aggiungere un nuovo record. Per operare con varie tabelle la funzione deve acquisire come parametro sia la tabella che i campi interessati (che potrebbero avere nomi diversi fra le tabelle). Riprendendo l'esempio della funzione Forecast da te presentata, da un esame sommario, i calcoli sembrano essere sempre legati in modo fisso alla dLookup sulla tabella/query "TTipoVoci" al campo "Valore" e ai criteri per "id_tipo" e gli altri elementi (variabili) che entrano in gioco sono i campi: "ce_tipo", "ce_gruppo", "analisi" del recordset "QXMImporti". Ipotizzando che il calcolo debba essere effettuato con un ciclo per l'intero insieme dei dati e oltre al recordset vi siano solo i tre campi succitati interessati alla elaborazione questi ("ce_tipo", "ce_gruppo", "analisi") devono essere forniti quali parametri. Pertanto, una pseudo codifica è la seguente:
E la funzione di calcolo dovrebbe essere similare a questa:
Credo che il codice schematico possa farti comprendere il concetto, dopodichè devi adeguare la funzione nel numero e nel tipo di parametri di tuo interesse. |
|||
|
Willy
|
|||
![]() |
|||
mjjfil
Utente Senior
Joined: 07/Giu/2010 Status: Offline Points: 236 |
Post Options
Thanks(0)
Quote Reply
Posted: 08/Mag/2012 at 06:50 |
||
|
Buongiorno a tutti,
grazie a willy55 sono riuscito al "97%" nel mio intento... l'unica cosa che mi manca è assegnare la funzione del calcolo al "campo calcolato" della tabella nel [do...loop] solo se i dati memorizzati nella tabella e più precisamente nei records dei campi calcolati sono differenti dal calcolo che viene eseguito. mi spiego meglio: se il risultato del calcolo rieffettuato dalla funzione è <> da null o è <> da quello già memorizzato: ricalcolarlo. Altrimenti: uscire dal ciclo [do...loop]. io avevo tentato una cosa del genere ma, non funziona.
Questa richiesta di aiuto non è rivolta solo a willy55, ma a chiunque abbia voglia di mettersi in gioco e aiutare... ...ovviamente nessuno deve sentirsi obbligato... ;-D Super-Abbraccio Ciao e Buona Giornata Fil |
|||
![]() |
|||
willy55
Veterano
Esperto di Access Joined: 03/Ago/2011 Location: Italy Status: Offline Points: 1230 |
Post Options
Thanks(0)
Quote Reply
Posted: 09/Mag/2012 at 22:29 |
||
|
Riprendo il tuo esempio in quanto ipotizzo che la logica non sia corretta date le condizioni logiche in OR con cui vai ad effettuare il controllo del ciclo (in base alla tua descrizione che dovrebbe soddisfare la funzione).
Edited by willy55 - 09/Mag/2012 at 22:32 |
|||
|
Willy
|
|||
![]() |
|||
Post Reply
|
|
|
Tweet
|
| Forum Jump | Forum Permissions ![]() You cannot post new topics in this forum You cannot reply to topics in this forum You cannot delete your posts in this forum You cannot edit your posts in this forum You cannot create polls in this forum You cannot vote in polls in this forum |