Newsgroup: it.comp.appl.access
Titolo: convertire data in codice

Ciao a tutti.
Ho un problema da "cervelloni di Access".
Vorrei convertire automaticamente una data in un codice.
La data è in formato 99/99/99 e si trova in una casella di testo 
denominata "data" all'interno della maschera singola "Conversione" che 
contiene anche un'altra casella di testo, denominata "codice", che deve 
ricevere in modo automatico il codice.
Il codice è costituito come segue: 0 1 2 
dove 0 = numero dal 1 al 31 indica il giorno
1= lettera da A a N indica il mese (1-12)
2= lettera da Z a A, con Z=1994 (1996=U), indica l'anno.
Per fare un esempio pratico, la data odierna 24/09/07 deve diventare 24IH 
(con I=i, per intenderci).
Ovviamente l'anno deve ritornare sulla lettera Z nel 2015 (considerando 
solo le 21 lettere dalla A alla Z senza k, w, x, j e y)
Ho trovato sul sito comune un esempio per la conversione dei numeri in 
lettere ma non penso che sia attinente a questo caso.
Per me è una cosa complicatissima, non essendo esperto di VBA poi.....è 
quasi impossibile.
Spero di essermi spiegato bene.
Grazie in anticipo a chi avrà la pazienza di aiutarmi.
Ciao

(.....)

Function codice(dData As Date) As String
Dim aLettere(1 To 21) As String, i As Byte, k As Byte
k = 21
For i = 65 To 90
  If Chr$(i) <> "J" And Chr$(i) <> "K" And Chr$(i) <> "W" And Chr$(i) <> "X" And Chr$(i) <> "Y" Then
     aLettere(k) = Chr$(i)
     k = k - 1
   End If
Next i
codice = Trim$(Str$(Day(dData)))
codice = codice & Chr$(Month(dData) + 64)
codice = codice & aLettere((Year(dData) - 1973) Mod 21 + 1)
End Function
Vincenzo Turturro
Certificato Eucip Core Level
ITA 0000-002299 del 14/05/2007
---------------------------------------------
il sito comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------
risorse Access:
http://www.accessgroup.it
---------------------------------------------
Il sito comune di it.comp.as400
http://www.faq400.com
---------------------------------------------

Ho dimenticato di precisare che la funzione di cui al mio post precedente puoi richiamarla, per esempio nella routine
associata all'evento DopoAggiornamento del controllo txtData, in questo modo:
me.txtCodice=Codice(cdate(me.txtData))
dove txtCodice è il nome del controllo associato al campo codice.


Ciao
Prima di tutto volevo ringraziarti per l'aiuto. Sei stato veramente 
moooooolto gentile.
Vorrei però ulteriori chiarimenti, se possibile (io non mi intendo molto 
di VBA, anzi, veramente poco).
Sull'evento dopo aggiornamento della casella di testo (o controllo) "data" 
(perchè la chiami txtdata?) vado ad inserire:
me.txtCodice=Codice(cdate(me.txtData))
e fin qui tutto ok, ma dove salvo la function codice? In un modulo?
Poi "dove txtCodice è il nome del controllo associato al campo codice" non 
capisco cosa significa......
Se dovessi modificare la maschera da singola a continua le cose cambiano 
molto?
Siccome stò preparando una maschera di inserimento dati piuttosto 
complessa non ho ancora ben chiaro come sarà.
La maschera continua avrebbe due caselle di testo "def" e "valore".
In "def" ci sarebbe scritto 'data' e sull'evento 'su disattivato' 
metterei:
If Me!Def = "data" Then
DoCmd.OpenForm "Calendario"
End If
In modo da far apparire  (come da esempio 3.113 "un controllo calendario 
di facile utilizzo" sul sitocomune) un calendario da cui poter scegliere 
una data anzichè digitarla dall'operatore.
Questa data ovviamente verrebbe inserita nella casella di testo "valore".
Poi, andando avanti, in 'def' ci sarebbe scritto 'codice' e nella casella 
di testo 'valore' dovrebbe comparirmi il codice (cioè la data selezionata 
trasformata in codice).
Bisogna modificare parecchie cose?
Ti ringrazio ancora veramente tanto per l'aiuto
Ciao

Ciao


Ciao, scusa se ti "assillo" ancora con questa faccenda del codice.
Ho creato una tabella 'tabella1' così formata:
id - chiave primaria e contatore
data - data/ora
codice - testo
Con la creazione guidata ho poi creato una maschera 'maschera1' e ho 
chiamato le due caselle di testo 'txtdata' (origine controllo 'data') e 
'txtcodice' (origine controllo 'codice').
Ho poi copia-incollato il tuo codice in un modulo che ho chiamato 
FunzioneCodice.
Su 'dopo aggiornamento' del controllo 'txtdata' ho inserito:
me.txtCodice=Codice(cdate(me.txtData)) 
ma non funziona, mi esce l'avviso "tipo non corrispondente".
Sicuramente ho "toppato" da qualche parte. Ad esempio penso che il modulo 
debba essere richiamato in un modo o nell'altro ma come?
Sei sicuro che sia '.......=Codice(cdate..........  con la 'c'?
Grazie mille per l'aiuto
Ciao

Ciao
Codice probabilmente č parola riservata di Access.
Nel modulo dove hai salvato la funzione sostituisci tutte le occorrenze di Codice con CreaCodice, quindi sostituisci 
me.txtCodice=Codice(cdate(me.txtData))
con
me.txtCodice=CreaCodice(cdate(me.txtData))
A me ha funzionato.


 Codice probabilmente č parola riservata di Access.
Uso "codice" normalmente e non mi sembra che sia parola riservata.
Il "tipo non corrispondente" probabilmente e' dato o dal tipo errato del 
parametro passato alla funzione o su me.txtdata
-- 
ac
y-1=x

ciao
funziona che è una meraviglia!!!
Io però presumo già che mi verrà richiesto di inserire questo benedetto 
calendario da cui selezionare la data.
Posso inserire, su 'dopo aggiornamento',del calendario 
me.txtCodice=CreaCodice(cdate(me.txtData))?
O devo modificare qualcosa? Visto che non si trova nella stessa maschera 
ma si aprirà (presumo) su doppio click fatto sulla casella di testo 
txtdata.
Ciao e ancora grazie 1000

ciao
Ma perchè se inserisco manualmente la data questa viene convertita 
regolarmente in codice mentre se la stessa la inserisco attraverso l'uso 
di un calendario (esempio preso dal sitocomune) non succede nulla?
ciao


Perche' inserendola attraverso calendario non richiama la routine di 
conversione?
-- 
ac
y-1=x

Ciao
Tu sai come si può risolvere la cosa?
Io di vba non ci capisco nulla.
Grazie per la risposta comunque....
Ciao


caio  esiste un numero di "programmi" tendente ad infinito proprio 
perche' esistono lo stesso numero di soluzioni (non e' vero ma passi)
E' questa la situazione?  (presa da altro tuo post)

-- 
ac
y-1=x

Ciao e grazie per il tuo aiuto.
Ricapitoliamo, aggiornando la situazione allo stato attuale delle cose.
Argomento:convertire automaticamente una data in un codice.
La data è in formato 99/99/99 e si trova in una casella di testo 
denominata "datap" all'interno della maschera singola "Conversione" che 
contiene anche un'altra casella di testo, denominata "codice", che deve 
ricevere in modo automatico il codice. Il codice è costituito come segue: 
0 1 2 
dove 0 = numero dal 1 al 31 indica il giorno, 1= lettera da A a N indica 
il mese (1-12), 2= lettera da Z a A, con Z=1994 (1996=U), indica l'anno.
Per fare un esempio pratico, la data odierna 24/09/07 deve diventare 24IH 
(con I=i, per intenderci). Ovviamente l'anno deve ritornare sulla lettera 
Z nel 2015 (considerando solo le 21 lettere dalla A alla Z senza k, w, x, 
j e y)
Soluzione proposta, inserita in un modulo:
Function creacodice(dData As Date) As String
Dim aLettere(1 To 21) As String, i As Byte, k As Byte
k = 21
For i = 65 To 90
  If Chr$(i) <> "J" And Chr$(i) <> "K" And Chr$(i) <> "W" And Chr$(i) <> 
"X" And Chr$(i) <> "Y" Then
    aLettere(k) = Chr$(i)
    k = k - 1
  End If
Next i
creacodice = Trim$(Str$(Day(dData)))
creacodice = creacodice & Chr$(Month(dData) + 64)
creacodice = creacodice & aLettere((Year(dData) - 1973) Mod 21 + 1)
End Function
Poi 'su dopo aggiornamento' della casella di testo "datap" ho inserito:
Me.codice = creacodice(CDate(Me.datap))
mentre 'su click' sempre della stessa casella di testo ho inserito:
 ' Se la data è nulla, passo il valore 0; verrà proposta la data del 
giorno
 
    Me!datap = InputCalendario(Nz(Me!datap, 0), "Calendario")
che mi apre il calendario (esempio preso dal sito comune).
Ora, se digito direttamente la data all'interno della casella di testo 
"datap" questa crea automaticamente il codice ed inserito nella casella di 
testo appropriata.
Se la stessa data la seleziono dal calendario questa si inserisce poi 
automaticamente nella casella di testo "datap" ma non viene creato il 
codice.
Se data e codice non fossero così importanti (compaiono poi su report che 
vengono spediti in ogni angolo della terra e che servono per la 
rintracciabilità del prodotto) non avrei messo il calendario e, forse, non 
avrei automatizzato nemmeno il codice.
Ti ringrazio per l'interessamento
Ciao
 

     Me!datap = InputCalendario(Nz(Me!datap, 0), "Calendario")
Strano,  dovrebbe comunque passare dal "DopoAggiornamento".
aggiungi:Me.codice = creacodice(CDate(Me.datap))
dopo la istruzione precedente (chiamata a calendario)
-- 
ac
y-1=x

Ciao, ho seguito i tuoi suggerimenti e adesso funziona: grazie mille.
Solo una curiosità: perchè preferisci togliere "if"? C'è qualche motivo 
particolare?
Ciao e grazie ancora

 particolare?
If e cicli (che hanno if implicite) rendono il codice meno robusto.
Ogni if puo' generare due rami di codice diverso, le if annidate 
aumentano i nodi in potenza di 2, trai le conclusioni.
Il pezzo di codice che hai utilizzato l'ha scrtto una persona "capace" e 
non gli ci e' voluto molto. Una persona meno capace tra scrivere e fare 
i controlli di corretta esecuzione ci avrebbe messo una settimana (e 
tremila post ;<)). Quando il livello di difficolta' aumenta, aumenta 
esponenzialmente il tempo da dedicare allo "spulciamento" e non si 
riesce mai a fare tutti i test necessari.
-- 
ac
y-1=x