Funzione IIF e EVAL in una casella di testo

di il
18 risposte

Funzione IIF e EVAL in una casella di testo

Buonasera !

In una maschera, voglio che scrivendo la DATA di un ANNO, in una casella di testo deve comparire il nome giusto dell'epoca.
Se ad esempio, la DATA ANNO è il 476 deve comparire la dicitura "MEDIO EVO"; se c'è il 1500 deve comparire "STORIA MODERNA".

Voglio gestire la scelta di una parola, sotto l'ipotesi che una data sia compresa tra due numeri.

Sto provando con questa funzione:
=IIf(Eval("DATA ANNO">476 & "DATA ANNO"<1492);"STORIA MEDIEVALE";"STORIA ANTICA")
ma qualunque data inserisco esce la dicitura STORIA MEDIEVALE, mentre per alcune date non è vero !

Come si può risolvere ?

18 Risposte

  • Re: Funzione IIF e EVAL in una casella di testo

    Eval perché..? Hai un motivo tecnico oppure così ti piaceva...?
    Per fare una cosa fatta bene devi avere una tabella con i range di anno e la definizione... se non vuoi una tabella devo fare una funzione Public così da poterla richiamare da qualsiasi punto senza dover riscrivere la definizione dell'epoca... alla quale passi l'anno e restituisce il testo che chiedi...
    Quello che hai fatto non ha alcun senso.
  • Re: Funzione IIF e EVAL in una casella di testo

    @Alex ha scritto:


    Per fare una cosa fatta bene devi avere una tabella con i range di anno e la definizione
    Anch'io la penserei così. Crea una tabella Periodi con i seguenti campi:
    IDPeriodo
    AnnoDa
    AnnoA
    NomePeriodo
  • Re: Funzione IIF e EVAL in una casella di testo

    OsvaldoLaviosa ha scritto:


    @Alex ha scritto:


    Per fare una cosa fatta bene devi avere una tabella con i range di anno e la definizione
    Anch'io la penserei così. Crea una tabella Periodi con i seguenti campi:
    Questo mi conforta.

    OsvaldoLaviosa ha scritto:


    IDPeriodo
    AnnoDa
    AnnoA
    NomePeriodo
    Tecnicamente basta solo 1 campo data... il LIMITE SUPERIORE...
    
    SELECT TOP 1 IDPeriodo, UpLimitYear, NomePeriodo
    FROM TPeriodi
    WHERE (UpLimitYear>=[Data])
    ORDER BY UpLimitYear;
  • Re: Funzione IIF e EVAL in una casella di testo

    Chiedo scusa, ma UpLimitYear è la function (di cui sopra) ?
    Sto provando, ma esce l'errore #Nome?

    Ho provato a creare una Function, così:
    
    Function UpLimitYear()
    UpLimitYear = [Anno] + 1
    End Function
    
  • Re: Funzione IIF e EVAL in una casella di testo

    Riepilogando, volendo usare le due tabelle.

    Se ho due tabelle,
    PERIODI che ha:
    IDPeriodi
    Anno
    Periodo

    ed un'altra tabella EVENTI, simile alla prima, che ha questi campi:
    IDEventoStorico
    DataEvento
    Periodo
    DescrizioneEvento

    Nella tabella EVENTI, quando digito l'anno dell'evento, deve comparire nel campo Periodo il nome contenuto nella tabella PERIODI corrispondente all'intervallo di anni che racchiude un periodo.
    Il campo periodo, in origine riga, deve avere una query ? una formula iif ? una function ?
  • Re: Funzione IIF e EVAL in una casella di testo

    ProgrammD ha scritto:


    Chiedo scusa, ma UpLimitYear è la function (di cui sopra) ?
    Sto provando, ma esce l'errore #Nome?

    Ho provato a creare una Function, così:
    
    Function UpLimitYear()
    UpLimitYear = [Anno] + 1
    End Function
    
    Ma non vedi che è un Campo della Tabella...?
  • Re: Funzione IIF e EVAL in una casella di testo

    
    SELECT TOP 1 IDPeriodo, UpLimitYear, NomePeriodo
    FROM TPeriodi
    WHERE (UpLimitYear>=[Data])
    ORDER BY UpLimitYear;
    
    Analizzando questo codice SQL:
    TOP 1 il nome tabella ? del database ?
    IDPeriodo, UpLimitYear, NomePeriodo sono i nomi dei campi
    FROM TPeriodi qui si mette il nome della tabella dove stanno i campi prima menzionati
    WHERE (UpLimitYear>=[Data]) è la condizione che si deve verificare, e cioè il valore del campo UpLimitYear superiore al valore del Campo [Data] cioè della casella di testo nella maschera.

    Se ho fatto errori correggetemi, così imparo meglio.
    Grazie.
  • Re: Funzione IIF e EVAL in una casella di testo

    Ma non hai detto nulla di tecnico solo spiegato una Query... e direi che
    il predicato SQL fa parte di uno studio di base tuo... che noi diamo per assunto.

    Quella Query serve per estrarre il periodo passando la data... ovviamente quello che devi comprendere è che i periodi sono consecutivi usando solo 1 data che rappresenta il limite superiore.
  • Re: Funzione IIF e EVAL in una casella di testo

    Forse la soluzione che ho trovato non è la più performante, ma almeno funziona bene.

    Ho risolto in questo modo.

    Ho creato una tabella EVENTI con:
    ID
    ANNO
    DESCRIZIONE

    Su questa tabella ho creato una query, con tutti i campi più un campo alias chiamato Periodo che ha la seguente formula:
    Periodo: IIf([ANNO]<476;"STORIA ANTICA";IIf([ANNO]<1492;"STORIA MEDIEVALE";IIf([ANNO]<1789;"STORIA MODERNA";IIf([ANNO]<2100;"STORIA CONTEMPORANEA"))))

    Su questa Query ho creato una maschera, con tutti i suoi campi, e senza usare VBA o Macro, quando digito l'anno, compare subito il nome del corrispondente periodo.
    Funziona tutto bene.

    L'unica cosa. Se volessi avere una tabella EVENTI che comprenda anche il dato del Periodo, dovrei partite dalla query per generare una nuova tabella EVENTI2.

    Saluti a tutti.
  • Re: Funzione IIF e EVAL in una casella di testo

    Rifletti bene.... non hai l'impressione che, dopo aver fatto la domanda..., aver ricevuto dei suggerimenti... alla fine hai fatto quello che avevi proposto all'inizio mescolato MALAMENTE con una parte dei suggerimenti..?
    Quello che hai fatto è assolutamente inutile quindi sbagliato... ma qui mi fermo.
  • Re: Funzione IIF e EVAL in una casella di testo

    Giusto un piccolo aiuto.

    Tornando al primo post, dove chiedevo:
    In una maschera, voglio che scrivendo la DATA di un ANNO, in una casella di testo deve comparire il nome giusto dell'epoca.
    il codice SQL di questa query:
    
    SELECT TOP 1 IDPeriodo, UpLimitYear, NomePeriodo
    FROM TPeriodi
    WHERE (UpLimitYear>=[Data])
    ORDER BY UpLimitYear;
    
    va nell'origine riga della casella di testo ?
  • Re: Funzione IIF e EVAL in una casella di testo

    ProgrammD ha scritto:


    Giusto un piccolo aiuto.
    Mi pare tu ne abbia avuti molti.

    ProgrammD ha scritto:


    Tornando al primo post, dove chiedevo:
    In una maschera, voglio che scrivendo la DATA di un ANNO, in una casella di testo deve comparire il nome giusto dell'epoca.
    Ti è stato suggerito di creare una Tabella così strutturata:
    
    IdPeriodo	Tipo Counter
    UpLimitYear	Tipo Numerico Intero
    NomePeriodo	Tipo Testo
    In questa Tabella metti i Records che corrispondono a quello che hai scritto nell'IIF....
    
    IdPeriodo	UpLimitYear	NomePeriodo
    1				476	 		STORIA ANTICA
    2				1492			STORIA MEDIOEVALE
    3				1789			STORIA MODERNA
    4				2100			STORIA CONTEMPORANEA

    ProgrammD ha scritto:


    il codice SQL di questa query:
    
    SELECT TOP 1 IDPeriodo, UpLimitYear, NomePeriodo
    FROM TPeriodi
    WHERE (UpLimitYear>=[Data])
    ORDER BY UpLimitYear;
    
    Ora prova in modo da CAPIRE, cosa che ad ora non hai minimamente fatto, ad eseguire questa benedetta Query e vedere cosa restituisce...!

    ProgrammD ha scritto:


    va nell'origine riga della casella di testo ?
    Questa cosa faccio finta di non averla letta...!
    Tu hai una data, quindi dovrai ricavare, dalla data, guarda caso quella che hai o avresti dovuto passare alla Query di Test sopra, il campo Calcolato di tipo Testo corrispondente al periodo...!
  • Re: Funzione IIF e EVAL in una casella di testo

    Ho creato tabella e query come detto.
    La query la lancio e compare una maschera dove mi chiede il numero dell'anno.
    Poi ottengo il periodo corrispondente.
    Funziona bene.

    Nella maschera eventi, che è associata alla tabella Eventi, e non alla tabella Periodi nè alla query, bisogna gestire il campo Periodo.
  • Re: Funzione IIF e EVAL in una casella di testo

    Chi lo dice che "BISOGNA"...?
    Se riesci a ricavare il periodo passando l'anno... non hai già tutto per calcolarlo...?
Devi accedere o registrarti per scrivere nel forum
18 risposte