Ciao,
in un modulo del Vba inserisci le varie funzioni che ti occorreranno
Per esempio:
Public Function MyFunction01(tuoparametro 1, tuo parametro 2, Etc etc...) As Double … o altro tipo di valore di ritorno
Tuo calcolo etc etc ....
End If
Public Function MyFunction02(tuoparametro 1, tuo parametro 2, Etc etc...) As Double … o altro tipo di valore di ritorno
Tuo calcolo etc etc ....
End If
Public Function MyFunction03(tuoparametro 1, tuo parametro 2, Etc etc...) As Double … o altro tipo di valore di ritorno
Tuo calcolo etc etc ....
End If
Public Function MyFunction04(tuoparametro 1, tuo parametro 2, Etc etc...) As Double … o altro tipo di valore di ritorno
Tuo calcolo etc etc ....
End If
e varie altre function ... (tutte quelle che serviranno)
Nella Tabella inserirai una Field che indica quale Function dovrà essere eseguita per quel particolare caso… Per esempio:
Field di nome FunctionRun di tipo Integer
In questa colonna della tabella inserirai il valore corrispondente alla function da richiamare.. per esempio = 1 per richiamare la Function 1, oppure = 2 per richiamare la Function 2, etc etc etc …
A questo punto, sempre nel modulo che si accennava in precedenza, creare una Function per pilotare l'esecuzione della function desiderata… Proviamo a mettere insieme tutto il codice e ….
- Supponiamo di aver bisogno di tre parametri atti per eseguire i calcoli per tutte le varie Function,
- Si definisco i parametri di tipo Optional in modo che se una Function ha la necessita di usare 1 o 2 o più parametri, in tal caso passerai solo quelli che occorrono
- Tali parametri saranno definiti di tipo Variant e in questo modo si ha la possibilità di passare alle function valori espessioni etc etc…
- Supponiamo di aver bisogno di un solo valore di ritorno dalla Function richiamata e lo impostiamo di tipo Double
- Supponiamo di aver bisogno di richiamare 4 tipi di calcoli diversi, uno per ogni Function
Per esempio possiamo avere una cosa di questo tipo:
____________________________________________________________________________________________________________________
' FUNCTION RUN SELECT
Public Function MyFunctionRun(intRun As Integer, Optional parm1 As Variant, Optional parm2 As Variant, Optional parm3 As Variant) As Double
' set default return value
MyFunctionRun = 0
' select function run
Select Case intRun
Case 1: MyFunctionRun = MyFunction01(parm1, parm2, parm3)
Case 2: MyFunctionRun = MyFunction02(parm1, parm2, parm3)
Case 3: MyFunctionRun = MyFunction03(parm1, parm2, parm3)
Case 4: MyFunctionRun = MyFunction04(parm1, parm2, parm3)
End Select
End Function
____________________________________________________________________________________________________________________
' FUNCTION 1 RUN
Public Function MyFunction01(par1, parm2, parm3) As Double
' set default return value
MyFunction01 = 1
' your calculations
' ...
End Function
____________________________________________________________________________________________________________________
' FUNCTION 2 RUN
Public Function MyFunction02(par1, parm2, parm3) As Double
' set default return value
MyFunction02 = 2
' your calculations
' ...
End Function
____________________________________________________________________________________________________________________
' FUNCTION 3 RUN
Public Function MyFunction03(par1, parm2, parm3) As Double
' set default return value
MyFunction03 = 3
' your calculations
' ...
End Function
____________________________________________________________________________________________________________________
' FUNCTION 4 RUN
Public Function MyFunction04(par1, parm2, parm3) As Double
' set default return value
MyFunction04 = 4
' your calculations
' ...
End Function
Per richiamare la function desiderata si richiamerà MyFunctionRun con il parametro proveniente dal record nella Field FunctionRun…
Per esempio in una query potrai agire in questo modo :
MyFunctionRun(FunctionRun, parm1,parm2,parm3)
Supponiamo che la Field FunctionRun del record contenga il valore 2 e non abbiamo necessità di passare nessun parametro aggiuntivo…
Quindi verrà richiamata in questo modo:
MyFunctionRun(2)
In questo caso viene eseguita la function 2,… eseguirà i calcoli che deve eseguire e restituisce il valore risultante dal calcolo che ha eseguito
Supponiamo che il record successivo della Query richiede l'esecuzione della Function 4 (troviamo tale valore sempre nella colonna FunctionRun)
e supponiamo di dover passare i parametri 1 con il valore 50 e parametro 2 con il valore 1000 e magari questi valori sono contenuti nelle varie fields che espone la Query … in pratica risulterà il richiamo della function 4 in questo modo:
MyFunctionRun(4, 50, 1000)
e così via dicendo e nei parametri puoi avere o i valori o il nome dei campi che hai a disposizione, etc etc etc ….
se poi ti occorre passare come parametri operatori e altri simboli per eseguire determinate formule e calcoli, allora nei parametri puoi passare qualsiasi tipo di informazione visto che sono definiti di tipo Variant… Per esempio parm1 = “>= 0” e nel parm2 = “<= 100” , etc etc etc …
Oppure puoi inserire nella tabella una seconda Field di nome FunctionRunParm di tipo Stringa e che conterrà un espressione che indicherà il tipo di calcoli che quella particolare function dovrà esequire…. etc etc etc …
Per esempio avrai una cosa del genere dove il parm1 verrà popolato con la field appena citata:
MyFunctionRun(FunctionRun, FunctionRunParm , parm2, parm3)
Ma la Field FunctionRunParm può contenere qualsiasi cosa e per esempio una serie di calcoli e funzioni da eseguire… bene a questo punto in FunctionRunParm si imposteranno, sempre sotto forma di stringa, le varie variabile e condizioni di una o più formule e basta separarle l'une dalle altre con un delimitatore, per esempio un punto e virgola … “condizione1;formula1;condizione2;operaratore2;funzione2”.
A questo punto la funzione richiamata riceverà tale parametro e dovrà splittare i vari argomenti che rappresenteranno le funzioni e i calcoli da eseguire.
Insomma … una cosa del genere … mi sembra che sia abbastanza flessibile e adattabile per qualsiasi formula da eseguire.
P.s. Ho fatto un esempio citando il richiamo delle functions da una query, ma possono essere richiamate in qualsiasi altro contesto… nella lettura di un recordset, oppure da impostare in un controllo TextBox nelle Form o nei Report, etc etc etc
;-)