FUNZIONE IIF

di il
18 risposte

FUNZIONE IIF

Sale a tutti e complimenti per il forum. Ho bisogno di un chiarimento in merito alla funzione IIF.
Ho una query dove ho già editato con il generatore d'espressioni detta funzione con una condizione. Adesso devo implementarla con almeno altre 11 condizioni e non sò se è possibile.
Ho provato vari tipi di sintassi e simboli vari tra un IFF ed un altro ma ricevo una secchiata d'errori ogni volta.

Il codice che funziona con una condizione è questo:

MESE FISCALE: IIf([NUMERO MESE]=1;3;0)
Grazie in anticipo a chi puo rischiarami dalle nebbie.......
Cassiopea

18 Risposte

  • Re: FUNZIONE IIF

    Non ci dici dettagli tecnici, mi sembra un po' dura darti suggerimenti corposi. Provo ad immaginare. Forse [MESE FISCALE] ti serve per una IIf successiva. Quindi sfrutta appunto [MESE FISCALE]. Dai ovviamente un nome colonna [ColonnaA] e sfrutta [ColonnaA] per una IIf seguente, ecc...
  • Re: FUNZIONE IIF

    Chiedo venia......
    Il risultato della funzione IIF è destinato alla colonna MESE FISCALE.
    In pratica devo far corrispondere ad un numero della colonna MESE (che è il numero del mese scorporato da una data) un altro numero. Nel mio caso la comparazione tra anno solare e anno fiscale. Partendo dal mese di NOV (11 solare) deve corrispondere (1 fiscale).
    Ma tralasciando il mero contenuto commerciale e una semplice comparazione tra valori che vorrei automatizzare.
    Nell esempio il numero 1 è Gennaio che dovrebbe corrispondere al terzo mese fiscale.
    Il valore 0 non ho modo di utilizzarlo....
    Grazie Osvaldo
  • Re: FUNZIONE IIF

    Non ho capito se hai risolto oppure no. Se è NO...ricordo che è possibile giocare con la numerazione dei giorni della settimana invocando quale deve essere il primo. Non so se si può fare lo stesso con i mesi...i campi di tipo Data/Ora sono una giungla di espressioni. Cerca di dare l'intera descrizione dettagliata...io non ci ho capito molto.
  • Re: FUNZIONE IIF

    Ciao Cassiopea,
    prova in questo modo :
    
    Public Function miaChoose(idmonth As Integer)
    miaChoose = Choose(idmonth, "novembre", "dicembre", "Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giungo", "Luglio", "Agosto", "Settembre", "Ottobre")
    End Function
    
    un saluto.
  • Re: FUNZIONE IIF

    .....tutto invariato tranne la prima riga:
    
    
    Public Function miaChoose(idmonth As Integer) As String
    miaChoose = Choose(idmonth, "Novembre", "dicembre", "Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giungo", "Luglio", "Agosto", "Settembre", "Ottobre")
    End Function
    
    
    facci sapere!
  • Re: FUNZIONE IIF

    Prima cosa vi ringrazio dell'aiuto e vi chiedo scusa se ancora non sono riuscito a spiegare bene il quesito. Goku si è avvicinato al problema ma io devo lavorare con i numeri.
    Da una tabella ho creato una query dove ho nella prima colonna la data dell'evento in formato gg/mm/YYYY [DATA] poi ho creato una colonna nuova nella query ed ho usato la funzione Datepart per estrapolare il numero del mese [MESE SOLARE]. Accanto a questa colonna vorrei crearne un'altra dove prendendo come imput il numero del mese solare inserisca il corrispondente mese fiscale e chiamerò quella colonna [MESE FISCALE] con il criterio che dal mese di Nov e cioè 11 corrisponda il numero 1 poi Dic 12 il numero 2 e cosi via.
    Ho provato con la funzione IIF postata all'inizio e funziona solo per il primo mese ma non riesco a far lavorare la funzione con tutte le 11 condizioni rimaste.
    Vorrei risolvere cosi senza creare codici VBA o routine se possibile.
    Spero sia più chiaro non esitate a chiedere più info.
    Io vi ringrazio per ora sento che di sicuro troverete dove stà il problema.
    A dopo
  • Re: FUNZIONE IIF

    Ciao,
    ti sei spiegato bene non ti preoccupare .
    ripeto:
    dopo aver copiato la funzione che ti ho postato in precedenza in un modulo standard, rivedi la tua query in questo modo :
    una month per estrarre il numero corrispondente al mese del tuo campo data;
    una miaChoose per convertire a fiscale da mese solare.

    sostituisci Ordini (che vedi sotti) con il nome corretto della tua tabella sui esegui la query;
    sostituisci dataOrdine con il nome corretto del campo data della tabella su cui esegui la query.
    tha't all.
    ...e....
    facci sapere.!
    un saluto.
    sql statement :
    
    
    SELECT Ordini.IDOrdine, Ordini.DataOrdine, Month([dataordine]) AS MeseSolare, miaChoose([MeseSolare]) AS MeseFiscale
    FROM Ordini
    
    
  • Re: FUNZIONE IIF

    Non metto bocca sulle soluzioni proposte da Goku (ne sa sicuramente più di me).
    Io non sottovaluterei l'ipotesi di creare una apposita tabella con 2 campi:
    MeseSolare | MeseFiscale
    1 | 3
    2 | 4
    3 | 5
    4 | 6
    5 | 7
    6 | 8
    7 | 9
    8 |10
    9 |11
    10|12
    11| 1
    12| 2
  • Re: FUNZIONE IIF

    Ciao,
    Non metto bocca sulle soluzioni proposte da Goku (ne sa sicuramente più di me).
    e chi lo dice...?

    per Cassiopea.
    se devi lavorare con il numero del mese fiscale la mia soluzione non va bene e dovrebbe essere rivista.

    invece, risolvendo lo statement sql che segue e creando una tabella d'appoggio come indicato da Osvaldo, si ottiene il risultato cercato.
    cambia opportunamente i nomi dei campi e delle tabelle...
    facci sapere.
    un saluto.
    
    
    SELECT t1.IDOrdine, t1.DataOrdine, t1.MeseSolare, t2.fiscale
    FROM 
    (SELECT Ordini.IDOrdine, Ordini.DataOrdine, Month([dataordine]) AS MeseSolare FROM Ordini)  AS t1,
    (SELECT tabella1.id, Tabella1.fiscale FROM Tabella1)  AS t2
    WHERE (t1.MeseSolare)=t2.id
    
    
  • Re: FUNZIONE IIF

    Premesso che la funzione CHOOSE è estremamente lenta da test che ho fatto in passato, e questo, nel caso di Tabelle con molti dati si manifesta in modo evidente poi in caso di Queries...

    Reputo tuttavia che l'idea della Funzione sia la soluizione migliore, ma opterei per una cosa simile
    
    Public Function Conv2Fiscal(MeseIn As Integer) As Integer
       If MeseIn<0 OR MeseIn>12 Then 
          MeseIn=-1
          Exit Function
       End if
       Select Case MeseIn
             Case Is<11
                 Conv2Fiscal=MeseIn+2
             Case Else
                  Conv2Fiscal=MeseIn-10
        End Select
    End Sub
    Chiaramente questa è semplificabile anche con un IIF semplificato nella Query
    
    MESE FISCALE:IIF(Mese<11; Mese+2; Mese-10)
    Dopo di che se si vuole Ottenere il Nome del Mese per esteso... userei la Funzione nativa:
    
    Function MonthName(Month As Long, [Abbreviate As Boolean = Falso]) As String
        Membro di VBA.Strings
        Returns localized month name
  • Re: FUNZIONE IIF

    Ciao Alessandro,
    ho fatto un test banale sfruttando l'api GetTickCount in questo senso...
    apertura recordset, scrittura tempo esecuzione della query nella tabella su cui il recordset è aperto, e chiusura query.
    la tabella su cui appoggia la qury conta 836 records.
    100 scritture nel recordset per entrambe le soluzioni del tempo di esecuzione della mia con le derivate e la tua con la funzione che hai postato...
    ho sommato tutti i tempi di esecuzione e la soluzione con la funzione è più veloce di 42000 milliseconndi....
    non me lo aspettavo...
    stasera riprovo con maggior calma, mi par strano che la funzione che viene eseguita su ogni record del recordset ottenga prestazioni migliori....

    un saluto.
  • Re: FUNZIONE IIF

    E' passato molto tempo da quando facevo questi tests ma mi pareva di ricordare che Choose avesse una deriva di tempi superando le 5 Opzioni di scelta.
    Se hai modo e tempo, prova a fare anche questo test, riducendo il numero di ITEM di selezione ad un massimo di 4 Item, dovresti ottenere tempi di risposta decisamente più conparabili con la Funzione, che in tutti i casi reputo migliore.

    Io usavo credo lo stesso metodo per i miei TEST, lo vedi quì(Rinomina in estensione ZIP):


    Fammi sapere, sono sempre molto interessato a questi Test tecnici, grazie.
  • Re: FUNZIONE IIF

    ...mi sono addentrato in questo test. (spero di aver formattato bene....)
    win7 A10, win8 A13 e winXp a03 (win8 e xp virtualizzate):

    [img]

    der fct gap
    win7 a10 209.641 189.593 20.048
    win8 a13 1.252.483 1.082.007 170.476
    winxpa03 105.375 99.129 6.246

    [/img]

    winxp+ac03 straccia tutti...il test è lo stesso del post precedente.
    la funzione resta la scelta più veloce in ogni caso.

    poi ho testato choose su se stessa con 12 cicli, il primo scrive 100 records, il secondo 200 e così via fino all'ultimo 1200.
    la choose è la funzione miaChoose postata in precedenza, il primo ciclo scrive solo novembre (per 100 records) il secondo, novembre, dicembre (per 200 records e cosi via....)
    La differenza non è proprio costante ( mi aspettavo differenze maggiormente costanti visto che i gap tra un test e l'altro è sempre 100 records) ma dal 5 al 6 i gap diventa consistente.

    [img]
    mmsec records gap
    1 560 100 560
    2 1900 200 1340
    3 7584 300 5684
    4 10732 400 3148
    5 13360 500 2628
    6 22032 600 8672
    7 29449 700 7417
    8 33376 800 3927
    9 37764 900 4388
    10 44470 1000 6706
    11 50523 1100 6053
    12 62532 1200 12009

    [/img]
    saluti!
  • Re: FUNZIONE IIF

    Ciao Goku, hai confermato completamente i risultati che ricordavo io...
    Sul fatto che Xp fosse il più performante, non ci sono dubbi su tutto dal punto di vista prestazionale, ma questo è un fattore purtroppo su cui poco si può fare.
    Mentre per il resto direi che è esattamente coerente.
    Per la funzione Choose, in realtà ricodavo molto bene l'effetto di incremento esponenziale in quanto una decina di anni fa abbiamo fatto delle verifiche molto approfondite proprio su questa, appoggiandoci ad un amico russo che ha cercato di ricostruire deingegnerizzando al linguaggio primitivo l'approccio con cui era stata realizzata la funzione, ed era anche riuscito a spiegare perchè di tanta lentezza... sinceramente non ho più le mail scambiate... una volta ero molto più bravo

    Grazie della chiarezza, queesti sono 3D che sempre meno spesso si fanno ma che reputo rilevanti.
Devi accedere o registrarti per scrivere nel forum
18 risposte