Funzione IIf "molto" nidificata

di il
3 risposte

Funzione IIf "molto" nidificata

Ciao a tutti!! Vi sottopongo una grana che non saprei proprio come risolvere, anzi non saprei neanche se Access sia in grado di fare quello che mi serve...
Nel mio database ho quattro campi:
- "ID1" contiene i codici identificativi delle persone a cui si riferiscono i singoli record;
- "ID2" contiene i codici identificativi degli eventuali coniugi delle persone a cui si riferiscono i singoli record;
- "carico" assume valore 1 se l'eventuale coniuge è a carico della persona cui si riferisce il record, 0 quando non è a carico;
- "reddito" è il reddito individuale della persona a cui si riferisce il record.
Per quanto concerne il contenuto delle celle del campo "ID2" posso avere tre diverse situazione:
- quella in cui lo stesso codice lo ritrovo, su un altro record, nel campo "ID1";
- quella in cui ciò non avviene;
- quella in cui la cella è vuota.

E' dura scrivere tutto ciò, immagino quanto vi sarà "facile" capirmi...
A questo punto vorrei aggiungere un nuovo campo "reddito familiare". La funzione necessaria alla generazione di questo nuovo campo dovrebbe restituirmi i seguenti risultati:
- "reddito familiare" = somma dei "reddito" dei due coniugi quando i loro "ID" compaiono entrambi nel campo "ID1";
- "reddito familiare" = NA quando il codice del coniuge compare soltanto nel campo "ID2" (mai in quello "ID1") e "carico" = 0;
- "reddito familiare" = "reddito" sia quando la cella del campo "ID2" è vuota, sia quando c'è il codice del coniuge ma "carico" = 1.
Grazie, grazie e ancora grazie a chi vorrà aiutarmi in quella che, per me, sembra essere un'impresona...

3 Risposte

  • Re: Funzione IIf "molto" nidificata

    La cosa migliore è crearti una Funzione in un Modulo che prevede 4 parametri, ovviamente ID1, ID2, Carico e Reddito.
    
    Public Function fRedditoTotale(Id1 As Long, Id2 As Long, Carico As Boolean, Reddito As Currency) As Currency
    ....
    End Function
    Questa funzione in sostanza deve tradurre quello che hai scritto, l'unica variante alla logica che hai scritto è che, dato ID2(famigliare) nel caso non sia a Carico immagino, devi andare a cercare il Record che ha ID1=ID2(del dato attuale) per ricavare il suo Reddito...!

    Il tutto si deve ovviamente fare con l'uso del VBA aprendo Recordset... tramite una Query:
    "SELECT * FROM Tabella WHERE ID1=" ID2

    Il tutto diverrebbe:
    
    Public Function fRedditoTotale(Id1 As Long, Id2 As Long, Carico As Boolean, Reddito As Currency) As Currency
       Dim rs As DAO.Recordset
       Dim sSQL As String
       Dim cReddTot As Currency
       If Carico=False Then
           sSQL="SELECT * FROM Tabella WHERE ID1=" ID2
           DbEngine(0)(0).OpenRecordset(sSQL)
           If Rs.EOF
              msgBox "NON ESISTE"
           Else
               cReddTot =rs.Fields("Reddito").Value
           End If
           rs.close
           set rs=nothing
       End If
       ' nella Variabile cReddTot hai il Reddito del Familiare non a carico
       ' quindi ora lo puoi sommare al parametro Reddito che è il Reddito del TITOLARE
       ' ovviamente condizionando il tutto con le logiche che hai riportato
       .....           
       cReddTot = cReddTot + Reddito
       fRedditoTotale=cReddTot 
    End Function
    A questo punto questa funzione la puoi richiamare da Query o da Maschera(io preferisco da Query soprattutto se deve alimentare una Maschera continua).

    Spero sia chiaro, ma potrei aver frainteso la logicha degli ID1/ID2...
  • Re: Funzione IIf "molto" nidificata

    Grazie Alex !! Adesso mi ci metto e quanto prima ti faccio sapere com'è andata............
  • Re: Funzione IIf "molto" nidificata

    Mmm... mi sa che non ho capito granchè, nel senso che non avendo idea di come si usa VBA il tuo preziosissimo suggerimento non saprei proprio come seguirlo...
    dato che, alla luce delle mie "conoscenze", la soluzione migliore sarebbe di andare avanti per passaggi, avresti/e suggerimenti per una procedura magari più lunga ma più semplice per una schiappa totale come me????
    grazie a tutti
Devi accedere o registrarti per scrivere nel forum
3 risposte