Newsgroup: it.comp.appl.access
Titolo: Passare da numero a lettere.

Tengo a precisare che la questione che vado ad esporre è piu' di 
carattere formale che tecnico.
 
Il db che sto gestendo provvede ad inserire dei dati partendo da un 
numero di pratica di 6 numeri.
In questa pratica devo inserire degli involucri che,a loro volta, devono 
contenere dei materiali.
 
Per comodita', come chiave di accesso della pratica inserisco 
direttamente il numero di pratica.
Per gli involucri, invece, applico un contatore mio che mi numera i 
cartoni riguardanti la pratica e li incrementa di 1:
 
contatore=DCount("[IDINVOLUCRI]","TABELLAINVOLUCRI","[PRATICA]='"& 
me.PRATICA &"'")+1
E fin qui funziona tutto ok
 
Per il materiale applico la stessa norma solo che il punto di 
riferimento è la chiave usata per il cartone e il valore di riferimento 
è sempre la pratica che ho inserito per comodità anche nella tabella 
Materiali:
 
contatore=DCount("[IDMATERIALE]","TABELLAMATERIALI","[PRATICA]='"& 
me.PRATICA &"'")+1
 
E anche qui tutto bene
 
Tengo a precisare che sia il valore contatore del cartone che quello del 
materiale la converto in stringa di 3 caratteri così che "1" me lo 
inserisca come "001"
 
Il punto qual'è?
Che (ripeto) formalmente, nella documentazione scritta che vado a 
redigere con un report, il numero "001" me lo deve elencare come "  A", 
il "002" come "  B", il 003 come "  C" e via di seguito; è chiaro che 
poi, dopo il "025" che risulterebbe "  Z", bisognerebbe andare con un 
doppia lettera, ad esempio "026" dovrebbe diventare " AA", "027" 
diventerebbe " AB" e via dicendo.
C'è un metodo per realizzare ciò automaticamente?
 
Grazie a chi rispondera'
 
-- 
Carlo POTS
 
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 


rimetto la nota, che avevo eliminato,:
le lettere sono 26 (21 + K J W X Y)
una non deve essere presente ?

 C'è un metodo per realizzare ciò automaticamente?
 
Quest non è un problema, vedo che ti hanno già dato una soluzione, quindi evito di aggioungerne altre, ma... ad 
occhio... ho il timore che il tuo database non sia congegnato cosi bene :(
 
-- 
Greg

 una non deve essere presente ?
 
No, no, ho sbagliato io il conteggio. Sono 26, tranquillo
 
 
 
-- 
Lamps a tutti from Naples's kingdom Carlo POTS on VFR VTEC '02
& Bmw F650GS '00 "insomma, e' un VFR, mica una zoccola che cede appena ci
provi..." (cit. PMF)



 
Sicuramente non è nato per questa "formalita'"; in effetti io avevo 
ideato il db in modo che, con un numero, da trasformare poi in stringa 
alfanumerica, debba funzionare tranquillamente e mi inserisce delle 
chiavi univoche; la funzionalità c'è sempre stata e il lavoro va avanti 
benissimo.
 
Il problema è che, il capo "di turno" (che normalmente è abituato solo 
ad ordinare e disporre, ma poi, quando c'e' da prendersi una 
responsabilità, le scaricano sui dipendenti) abbia deciso che non deve 
più apparire un numero, ma bensì una lettera.
 
Ed ecco che allora mi nasce il problema.
 
Nella forma, più che nella sostanza, uno potrebbe "far apparire" una 
lettera, piuttosto che un numero, lasciando le chiavi inalterate e, 
magari, inserendo in tabella un campo alfanumerico da 3 chr$, ma quello 
che secca (non tanto a me che sul pc ci faccio tutto, quanto a quei 
colleghi che ci lavorano come utenti e non possono permettersi il lusso 
di perdere tempo) è davvero doversi ricordare a menadito tutte le 
lettere inserite.
 
-- 
Lamps a tutti from Naples's kingdom Carlo POTS on VFR VTEC '02
& Bmw F650GS '00 "insomma, e' un VFR, mica una zoccola che cede appena ci
provi..." (cit. PMF)
 



allora mi provo a dare una risposta
(ho migliorato quanto avevo tolto, non essendo sicuro delle 26 lettere)
 
premessa:
prendo spunto da questo link
http://www.lezionidimatematica.net/Binario/approfondimenti/bin_approfondimento_05.htm
 
e considero che si debba fare una conversione con una base di 27 simboli
(sono 26 lettere + lo spazio vuoto per i posti 1 e 2
mentre l'esempio tuo mostra che il posto 3 ha solo lettere)
per cui sono importanti i resti e gli "interi" rimanenti
 
Questa è la funzione (CONTROLLA !!!):
 
Function ricavaLett(numero)
'numMAX: 27*27*26 =18278
 
'posto3 DA SOLO: max 26
'posto2 e posto3: max 702 (27*26)
'posto1 e posto2 e posto3: max 18278 (27*27*26)
 
posto3 = 0 ' valore iniziale NUMERICO --> diventa carattere con chr()
posto2 = 0 ' valore iniziale NUMERICO --> diventa carattere con chr()
posto1 = 0 ' valore iniziale NUMERICO --> diventa carattere con chr()
 
posto3 = IIf(numero Mod 26 = 0, 26, numero Mod 26) 'valorizza SEMPRE posto 3
'resto3 = IIf(numero Mod 26 = 0, Int(numero / 26) - 1, Int(numero / 26))
If numero > 26 Then 'valorizza  posto 2
    resto3 = IIf(numero Mod 26 = 0, Int(numero / 26) - 1, Int(numero / 26))
    posto2 = IIf(resto3 Mod 26 = 0, 26, resto3 Mod 26)
    'resto2 = IIf(resto3 Mod 26 = 0, Int(resto3 / 26) - 1, Int(resto3 / 26))
End If
If numero > 702 And numero <= 18278 Then  'valorizza  posto 1
    resto2 = IIf(resto3 Mod 26 = 0, Int(resto3 / 26) - 1, Int(resto3 / 26))
    posto1 = IIf(resto2 Mod 26 = 0, 26, resto2 Mod 26)
End If
ricavaLett = Chr(posto1 + 64) + Chr(posto2 + 64) + Chr(posto3 + 64)
ricavaLett = Replace(ricavaLett, "@", "0") 'copre il chr(64)
'--> qui inserire il Replace DEFINITIVO (spazi vuoti ?)
End Function
 
e questo è il link con la tabella contenente 
gli abbinamenti numeri-stringa di 3 CARATTERI
https://we.tl/fGwCLim42g
 
 
NON HO VERIFICATO A FONDO !!!
 


 
Non ho guardato appieno la funzione (la tua prima si),
Il problema e' un semplice cambio di base
Da base 10 a base n (dove n puo' essere qualsiasi valore)
Ho provato a scrivere la routine (non ho access installato e quindi non 
so  cosa faccia di preciso, da qualche parte la ho per la base 2
ma chissa' dov'e')
 
E' questa
 
b=26
ar=array("A","B",....."Y","Z")
nx=n
x=""
r
do while nx > b
    r=nx mod b
    nx= nx\b
    x = ar(r) & x
    if r=b then nx=nx-1
loop
x = ar(nx-1) & x
 
 
Valida per qualsiasi base e qualsiasi lunghezza
Probabilmente dopo sistemata e testata.
N.B. Base 26 significa da  0 a 25 quindi A deve eguagliare lo 0
Salvo molteplici errori ed omissioni
-- 
ac (x=y-1)
Aborro il Killfile
(La violenza e' l'ultimo rifugio degli incapaci -Salvor Hardin-)

Il 08/05/2017 21:52, Alessandro Cara ha scritto:
P.S.
Puo servire anche a /incasinare/ la base 10 basta mettere
alla rinfusa i valori 0 - 9 in ar.
Se sui vuole una /crittografia/ de noantri.



quello che avevo inserito, e poi eliminato, NON andava bene,
 
qui, dall'esempio riportato: passaggio da 00Z a 0AA,
(0 = valore vuoto)
sembra ci sia da far uscire 26 simboli nella colonna a destra e 27 nelle altre,
cosa che comunque viene meglio facendo saltare un passo
con il ciclo compatto che hai presentato