Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[Tab-Que] Ordinamento: numeri+testo

336 views
Skip to first unread message

anna_miravalle

unread,
May 21, 2003, 8:13:23 AM5/21/03
to
Ho una query che estrapola dei dati da una tabella,
il problema č che ho un campo di testo che contiene
un numero e alle volte una lettera, non riesco ad ordinarlo come vorrei...

es.:

1000
4
17
4a
128

ordinandolo mediante la query mi risulta cosě:
1000
128
17
4
4a

invece lo vorrei cosě:
4
4a
17
128
1000

Capisco che il problema sta nella tabella dove il campo č di testo e di
conseguenza lo tratta appunto come testo, provando a trasformarlo in
numerico, mi vengono cancellati tutti i record che riportano una lettera, e
comunque non potrei piů inserire caratteri non numerici....

Come mi devo comportare?

Grazie AnnA

--------------------------------
Inviato via http://usenet.libero.it

Carlo Costarella

unread,
May 21, 2003, 9:12:35 AM5/21/03
to

"anna_miravalle" <anna_mi...@libero.it> ha scritto nel messaggio
news:217Z201Z16Z143Y...@usenet.libero.it...

> Ho una query che estrapola dei dati da una tabella,
> il problema è che ho un campo di testo che contiene

> un numero e alle volte una lettera, non riesco ad ordinarlo come vorrei...
>
> es.:
>
> 1000
> 4
> 17
> 4a
> 128
>
> ordinandolo mediante la query mi risulta così:

> 1000
> 128
> 17
> 4
> 4a
>
> invece lo vorrei così:

> 4
> 4a
> 17
> 128
> 1000
>
Cut

Questa funzione che ho già postato in www.sitocomune.com
potrebbe esserti di qualche aiuto se usata in una query così:
Public Function EstraiNumeri(STR As String) As Double
'Autore: Carlo Costarella
'Estrae tutti i valori numerici da una stringa
'Esempio: EstraiNumeri("A134B5") restituisce: 1345

Dim Numero As Integer, NCompleto As String, NReale As Double
Dim Pos As Integer, i As Integer, Lung As Integer

'verifico la lunghezza della stringa
Lung = Len(STR)
' inizio un ciclo da 1 alla lunghezza della stringa
For i = 1 To Lung
Pos = i ' il valore della posizione di partenza (il primo carattere
della stringa)
'Verifico se il carattere è un numero
If IsNumeric(Mid(STR, i, 1)) Then
'è un numero...allora
Numero = Mid(STR, i, 1)
' la variabile stringa assume il valore della variabile + numero
NCompleto = NCompleto & Numero
End If
Next i 'si sposta al carattere successivo

'trasformo la stringa in numerico precisione doppia
NReale = CDbl(NCompleto)
' assegno il valore alla funzione
EstraiNumeri = NReale
End Function

La query:
SELECT Tabella1.Campo1, EstraiNumeri([tabella1].[campo1]) AS Ordine
FROM Tabella1
ORDER BY EstraiNumeri([tabella1].[campo1]);
costituita da due campi: il campo che contiene i valori da ordinare e un
secondo dove uso la funzione passandogli il nome del campo da ordinare.
Questo secondo campo (Ordine) viene ordinato crescente e non visualizzato
nella query, togliendo la spunta alla riga "Mostra".

Facci sapere.
Ciao, Carlo


Roberto da casa

unread,
May 21, 2003, 9:28:11 AM5/21/03
to

"anna_miravalle" <anna_mi...@libero.it> ha scritto nel messaggio
news:217Z201Z16Z143Y...@usenet.libero.it...

Me sembrerebbe che l'ordinamento giusto dovrebbe essere:
4
17
4a
128
1000

e non quello che hai indicato tu.

Se cosě č.
Se la tabella che contiene i dati si chiama Tabella1.
Se il campo di tipo testo che contiene il tuo numero+lettera si chiama
NumeroLettera.
Se il campo NumeroLettera puň contenere al masimo 5 caratteri.

Creati una query che abbia il seguente codice SQL:

SELECT Tabella1.*
FROM Tabella1
ORDER BY Space(5-Len([NumeroLettera])) & [NumeroLettera];

--
Roberto

---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------


anna_miravalle

unread,
May 21, 2003, 11:04:46 AM5/21/03
to

Ciao Roberto,

intanto non capisco il tuo ordinamento, perchč dovrebbe essere quello che
dici tu quello giusto? ;-) Comunque nel mio caso come ho gia scritto sarebba
4, 4a, 4b, 100, 1000 etc.. insomma hai capito...

Ho provato la tua soluzione, mi ordina tutti i numeri, ed in fondo mi mette
sempre ordinati i numeri + le lettere... non era proprio questo che volevo,
ma mi accontenterň se non si půo diversamente...

Volevo chiederti ancora, se allora la soluzione nel mio caso del campo testo
era quella piů appropriata, o ne esistono di piů specifiche...

Ti ringrazio tanto, come sempre.

Roberto da casa

unread,
May 21, 2003, 11:30:49 AM5/21/03
to

"anna_miravalle" <anna_mi...@libero.it> ha scritto nel messaggio
news:212Z171Z19Z200Y...@usenet.libero.it...

> Il 21 Mag 2003, 15:28, "Roberto da casa" <r.ma...@libero.it> ha scritto:
[CUT]
>
> Ciao Roberto,
>
> intanto non capisco il tuo ordinamento, perchè dovrebbe essere quello che

> dici tu quello giusto? ;-)

Perché in un ordinamento alfanumerico per primi vengono le stringhe di un
carattere, poi quelle di due caratteri, poi quelle di tre carattere ecc; a
parità di numero di caratteri prima i numeri e poi le lettere in ordine
alfabetico; è il criterio con cui è ordinato l'elenco telefonico: come vedi
non è un mio punto di vista. ;-)

> Comunque nel mio caso come ho gia scritto sarebba
> 4, 4a, 4b, 100, 1000 etc.. insomma hai capito...
>
> Ho provato la tua soluzione, mi ordina tutti i numeri, ed in fondo mi
mette
> sempre ordinati i numeri + le lettere... non era proprio questo che
volevo,

> ma mi accontenterò se non si pùo diversamente...
>

Per onore della cronaca se i valori sono:

1000
100
4
4b
4a

la query che ti ho proposto li ordina nel modo seguente:

4
4a
4b
100
1000

che mi sembra di capire che era quello che volevi.

> Volevo chiederti ancora, se allora la soluzione nel mio caso del campo
testo

> era quella più appropriata, o ne esistono di più specifiche...

Devi scusarmi, ma non ho capito la domanda.

>
> Ti ringrazio tanto, come sempre.
> AnnA

--

Anna_Miravalle

unread,
May 21, 2003, 12:16:25 PM5/21/03
to
> [CUT]

>
> Perché in un ordinamento alfanumerico per primi vengono le stringhe di un
> carattere, poi quelle di due caratteri, poi quelle di tre carattere ecc; a
> parità di numero di caratteri prima i numeri e poi le lettere in ordine
> alfabetico; è il criterio con cui è ordinato l'elenco telefonico: come
vedi
> non è un mio punto di vista. ;-)
>

> Per onore della cronaca se i valori sono:
>
> 1000
> 100
> 4
> 4b
> 4a
>
> la query che ti ho proposto li ordina nel modo seguente:
>
> 4
> 4a
> 4b
> 100
> 1000
>
> che mi sembra di capire che era quello che volevi.
>

> --
> Roberto
>
> ---------------------------------------------
> il Sito Comune di it.comp.appl.access:
> http://www.sitocomune.com
> ---------------------------------------------

Così mi metti in crisi, ho ricontrollato e la query mi restituisce:
1,10,50,100,2500,4a,58b,158a
e non come mi illustri nel tuo ultimo msg?
... ma penso di aver capito, il codice sql che mi hai postato, non ha come
origine la tabella ma una ulteriore query, quindi:

SELECT Query1.*
FROM Query1
ORDER BY Space(4-Len([Num])) & [Num];

è questo il problema? si risolve? ;-)

Grazzie Grazie (per la pazienza soprattutto)

Carlo Costarella

unread,
May 21, 2003, 12:37:47 PM5/21/03
to

CUT


Ciao Roberto. Sei sicuro che la funzione Space funziona nelle query?

Ciao, Carlo


Anna_Miravalle

unread,
May 21, 2003, 12:48:18 PM5/21/03
to
Il 21 Mag 2003, 18:37, "Carlo Costarella"
<carloantoni...@virgilio.it> ha scritto:

>
> CUT
>
>
> Ciao Roberto. Sei sicuro che la funzione Space funziona nelle query?
>
> Ciao, Carlo
>

Ciao Carlo,
grazie, per la tua risposta iniziale, che ho accantonato per ora in quanto
per me più complessa viste le mie misere capacità, comunque Roberto mi ha
consigliato la soluzione che tu obbietti per una tabella, sono stata io poi
a volerla utilizzare per una query... con scarsi risultati ;-(

...non c'è scampo insomma?

Ciao AnnA

Roberto da casa

unread,
May 21, 2003, 1:18:14 PM5/21/03
to

"Carlo Costarella" <carloantoni...@virgilio.it> ha scritto nel
messaggio news:vXNya.217365$K35.5...@news2.tin.it...

>
> CUT
>
>
> Ciao Roberto. Sei sicuro che la funzione Space funziona nelle query?
>
> Ciao, Carlo

Sono sicuro che funziona (Almeno con Access 97).
Era un dubbio che avevo anche io, pertanto prima di dare la soluzone ad Anna
l'ho provato e quello che ho postato non è altro che il copia/incolla del
codice SQL della mia query di prova.

Roberto da casa

unread,
May 21, 2003, 1:18:16 PM5/21/03
to

"Anna_Miravalle" <anna_mi...@libero.it> ha scritto nel messaggio
news:212Z171Z19Z200Y...@usenet.libero.it...

Non credo proprio che quanto da te lamentato dipenda dal fatto che la query
di ordinamento sia basata su una tabella o su un'altra query; non vedo dove
sarebbe la differenza.
Prova ad aumentare il valore della cifra usata nella funzione Space: invece
che 4 usa 5 o 6 o 7; ma non credo che dipenda neppure da quello.
Sono più propenso a pensare che dipenda da come hai impostato il parametro
Ordinamento nuovi database in Strumenti => Opzioni => Generale; nel mio
Access è impostato a Generale e nel tuo Access?
E se non è neppure questo non saprei cosa ipotizzare; mi dispiace.

Carlo Costarella

unread,
May 21, 2003, 1:36:27 PM5/21/03
to

"Roberto da casa" <r.ma...@libero.it> ha scritto nel messaggio
news:qxOya.20916$lK4.6...@twister1.libero.it...

>
> "Carlo Costarella" <carloantoni...@virgilio.it> ha scritto nel
> messaggio news:vXNya.217365$K35.5...@news2.tin.it...
> >
> > CUT
> >
> >
> > Ciao Roberto. Sei sicuro che la funzione Space funziona nelle query?
> >
> > Ciao, Carlo
>
> Sono sicuro che funziona (Almeno con Access 97).
> Era un dubbio che avevo anche io, pertanto prima di dare la soluzone ad
Anna
> l'ho provato e quello che ho postato non č altro che il copia/incolla del

> codice SQL della mia query di prova.
>
> --
> Roberto
>

Nelle tre versioni di Access (97, 2000 e Xp) non funziona, almeno nelle mie.
Il messaggio di errore č: "Chiamata di routine non valida".

Ciao, Carlo


Roberto da casa

unread,
May 21, 2003, 1:47:08 PM5/21/03
to

"Carlo Costarella" <carloantoni...@virgilio.it> ha scritto nel
messaggio news:vOOya.128624$3M4.2...@news1.tin.it...

Io posseggo solo Access 97 e non ho avuto alcun problema ad usare la
funzione Space in una query; d'altra parte non mi risulta che ci siano
funzioni intrinseche di Access che non possano essere usate in una query.

Anna_Miravalle

unread,
May 21, 2003, 2:01:30 PM5/21/03
to
Il 21 Mag 2003, 19:36, "Carlo Costarella"
<carloantoni...@virgilio.it> ha scritto:

Il messaggio che ti da, mi viene visualizzato solo se inserisco "3" dopo
space...

SELECT Query1.*
FROM Query1
ORDER BY Space(3-Len([Num])) & [Num];

in quanto nel mio campo ci sono numeri fino a 4 caratteri, e quindi penso
l'errore sia dovuto a questo, se inserisco 4, la query produce un risultato,
ma non quello sperato ;-(
Devo correggermi, adesso controllando, vedo che mi ordina:
1,12,500,529,52a,714 invece tutti i numeri con tre caratteri e una lettera
in fondo alla lista....

Carlo Costarella

unread,
May 21, 2003, 2:09:41 PM5/21/03
to

"Roberto da casa" <r.ma...@libero.it> ha scritto nel messaggio
news:wYOya.21019$lK4.6...@twister1.libero.it...

Infatti. Questo l'ordinamento che restituisce:
4, 17, 4a, 128, 1000.
Non era la funzione space ma il Len abbinato a space.
L'errore era dovuto al fatto che in un record avevo incollato molti piů dati
che i "5" previsti ma non li vedevo perchč avevo vari ritorni a capo.
Nella altre versioni di Access ho semplicemente importato la tabella e
l'errore si č ripetuto.
Tutto ok.
Comunque non abbiamo ancora risolto il problema di Anna.

Ciao, Carlo


Carlo Costarella

unread,
May 21, 2003, 2:11:48 PM5/21/03
to

"Anna_Miravalle" <anna_mi...@libero.it> ha scritto nel messaggio
news:212Z171Z19Z200Y...@usenet.libero.it...

Prova la funzione che ti ho inviato. Restituisce un ordinamento piů
accettabile e non si limita a 4 o 5 caratteri.

Ciao, Carlo


Roberto da casa

unread,
May 22, 2003, 6:45:49 AM5/22/03
to

"Anna_Miravalle" <anna_mi...@libero.it> ha scritto nel messaggio
news:212Z171Z19Z200Y...@usenet.libero.it...

> Il 21 Mag 2003, 18:37, "Carlo Costarella"
> <carloantoni...@virgilio.it> ha scritto:
> >
> > CUT
> >
> >
> > Ciao Roberto. Sei sicuro che la funzione Space funziona nelle query?
> >
> > Ciao, Carlo
> >
>
> Ciao Carlo,
> grazie, per la tua risposta iniziale, che ho accantonato per ora in quanto
> per me più complessa viste le mie misere capacità, comunque Roberto mi ha
> consigliato la soluzione che tu obbietti per una tabella, sono stata io
poi
> a volerla utilizzare per una query... con scarsi risultati ;-(
>
> ...non c'è scampo insomma?
>
> Ciao AnnA

Penso di aver risolto il tuo problema con una query che abbia il seguente
codice SQL:

SELECT Tabella1.*
FROM Tabella1
ORDER BY

Space(5-Len(Right(Str(Val([NumeroLettera])),Len(Str(Val([NumeroLettera])))-1
))) & Right(Str(Val([NumeroLettera])),Len(Str(Val([NumeroLettera])))-1),
Space(5-Len(Right([NumeroLettera],Len([NumeroLettera])-Len(Right(Str(Val([Nu
meroLettera])),Len(Str(Val([NumeroLettera])))-1))))) &
Right([NumeroLettera],Len([NumeroLettera])-Len(Right(Str(Val([NumeroLettera]
)),Len(Str(Val([NumeroLettera])))-1)));

Così il risultato dell'ordinamento é:

4
4a
17
128
1000

che mi sembra che sia ciò che tu volessi.
La precondizione perchè il tutto funzioni è che il campo di tipo testo
NumeroLettera non superi i 5 caratteri complessivi e che la parte numerica
preceda sempre la parte alfabetica.
Già che c'ero ho previsto che la parte alfabetica possa non esserci o
occupare tutti e 5 i caratteri del campo (ovvero mancanza della parte
numerica).
I record per i quali manchi la parte numerica in NumeroLettera, dopo
l'ordinamento compariranno in testa; l'algoritmo usato si comporta come se
la chiave di ordinamento sia composta da due parti: la prima
(gerarchicamente più importante) contiene la parte numerica di NumeroLettera
ed assume valore spazio se la parte numerica non esiste, mentre la seconda
parte (gerarchicamente meno importante) contiene l'eventuale parte
alfabetica di NumeroLettera e se non esiste assume il valore spazio.

Facci sapere se funziona.

Roberto da casa

unread,
May 22, 2003, 6:45:48 AM5/22/03
to

"Carlo Costarella" <carloantoni...@virgilio.it> ha scritto nel
messaggio news:FhPya.128807$3M4.2...@news1.tin.it...
[CUT]

>
> Infatti. Questo l'ordinamento che restituisce:
> 4, 17, 4a, 128, 1000.
> Non era la funzione space ma il Len abbinato a space.
> L'errore era dovuto al fatto che in un record avevo incollato molti più
dati
> che i "5" previsti ma non li vedevo perchè avevo vari ritorni a capo.

> Nella altre versioni di Access ho semplicemente importato la tabella e
> l'errore si è ripetuto.

> Tutto ok.
> Comunque non abbiamo ancora risolto il problema di Anna.
>
> Ciao, Carlo

Penso di aver risolto il problema di Anna con una query che abbia il
seguente codice SQL:

SELECT Tabella1.*
FROM Tabella1
ORDER BY

Space(5-Len(Right(Str(Val([NumeroLettera])),Len(Str(Val([NumeroLettera])))-1
))) & Right(Str(Val([NumeroLettera])),Len(Str(Val([NumeroLettera])))-1),
Space(5-Len(Right([NumeroLettera],Len([NumeroLettera])-Len(Right(Str(Val([Nu
meroLettera])),Len(Str(Val([NumeroLettera])))-1))))) &
Right([NumeroLettera],Len([NumeroLettera])-Len(Right(Str(Val([NumeroLettera]
)),Len(Str(Val([NumeroLettera])))-1)));

Così il risultato dell'ordinamento é:

4
4a
17
128
1000

che mi sembra che sia ciò che volesse Anna.


La precondizione perchè il tutto funzioni è che il campo di tipo testo
NumeroLettera non superi i 5 caratteri complessivi e che la parte numerica
preceda sempre la parte alfabetica.
Già che c'ero ho previsto che la parte alfabetica possa non esserci o
occupare tutti e 5 i caratteri del campo (ovvero mancanza della parte
numerica).
I record per i quali manchi la parte numerica in NumeroLettera, dopo
l'ordinamento compariranno in testa; l'algoritmo usato si comporta come se
la chiave di ordinamento sia composta da due parti: la prima
(gerarchicamente più importante) contiene la parte numerica di NumeroLettera
ed assume valore spazio se la parte numerica non esiste, mentre la seconda
parte (gerarchicamente meno importante) contiene l'eventuale parte
alfabetica di NumeroLettera e se non esiste assume il valore spazio.

--

Roberto da casa

unread,
May 22, 2003, 6:57:59 AM5/22/03
to

"Roberto da casa" <r.ma...@libero.it> ha scritto nel messaggio
news:wT1za.22726$Ny5.6...@twister2.libero.it...
>
[SUPERCUT]

ATTENZIONE!!!

Se fai il copia incolla del codice SQL che ti ho postato dovrai ricostruire
a mano qualche nome che Outlook Express ha tagiato andando a capo in maniera
non logica.

Roberto da casa

unread,
May 22, 2003, 6:57:58 AM5/22/03
to

"Roberto da casa" <r.ma...@libero.it> ha scritto nel messaggio
news:xT1za.22727$Ny5.6...@twister2.libero.it...
[SUPERCUT]

ATTENZIONE!!!

Se fai il copia incolla del codice SQL che ti ho postato dovrai ricostruire
a mano qualche nome che Outlook Express ha tagiato andando a capo in maniera
non logica.

--

Carlo Costarella

unread,
May 22, 2003, 7:05:11 AM5/22/03
to

"Roberto da casa" <r.ma...@libero.it> ha scritto nel messaggio
news:wT1za.22726$Ny5.6...@twister2.libero.it...


Ottimo. Complimenti per il lavoro.
Puoi migliorarla sostituendo il 5 con una funzione che retituisce la
lunghezza massima del campo "NumeroLettera".

Ciao, Carlo


Roberto da casa

unread,
May 22, 2003, 8:24:43 AM5/22/03
to

"Carlo Costarella" <carloantoni...@virgilio.it> ha scritto nel
messaggio news:H92za.131689$3M4.2...@news1.tin.it...
[CUT]

>
> Ottimo. Complimenti per il lavoro.
> Puoi migliorarla sostituendo il 5 con una funzione che retituisce la
> lunghezza massima del campo "NumeroLettera".

OK

>
> Ciao, Carlo

Anna_Miravalle

unread,
May 22, 2003, 12:55:16 PM5/22/03
to

So che state aspettando me! ;-)
Funziona tutto a meraviglia 4,42,42a,425,425b,1000 ;---))))))
...ma sono soprattutto commossa dal thread "gigantesco" generato, dalla
pazienza, dalla simpatia, e dalla buona volontà che ci avete messo nel
prestarmi "soccorso".

Grazie AnnA!

Roberto da casa

unread,
May 22, 2003, 1:32:41 PM5/22/03
to

"Anna_Miravalle" <anna_mi...@libero.it> ha scritto nel messaggio
news:212Z171Z19Z54Y1...@usenet.libero.it...

> Il 22 Mag 2003, 12:57, "Roberto da casa" <r.ma...@libero.it> ha scritto:
[CUT]

>
> So che state aspettando me! ;-)
> Funziona tutto a meraviglia 4,42,42a,425,425b,1000 ;---))))))

OK :-)

> ...ma sono soprattutto commossa dal thread "gigantesco" generato, dalla

> pazienza, dalla simpatia, e dalla buona volontą che ci avete messo nel


> prestarmi "soccorso".
>
> Grazie AnnA!

Un problema inconsueto intriga sempre.
E poi per una gentile pulzella si fa questo ed altro. ;-)

Anna_Miravalle

unread,
May 22, 2003, 1:42:43 PM5/22/03
to
> > > > > CUT

> > >
> > > Nelle tre versioni di Access (97, 2000 e Xp) non funziona, almeno
nelle
> > mie.
> > > Il messaggio di errore č: "Chiamata di routine non valida".
> > >
> > > Ciao, Carlo
> >
> > Il messaggio che ti da, mi viene visualizzato solo se inserisco "3" dopo
> > space...
> >
> > SELECT Query1.*
> > FROM Query1
> > ORDER BY Space(3-Len([Num])) & [Num];
> >
> > in quanto nel mio campo ci sono numeri fino a 4 caratteri, e quindi
penso
> > l'errore sia dovuto a questo, se inserisco 4, la query produce un
> risultato,
> > ma non quello sperato ;-(
> > Devo correggermi, adesso controllando, vedo che mi ordina:
> > 1,12,500,529,52a,714 invece tutti i numeri con tre caratteri e una
lettera
> > in fondo alla lista....
> >
> > AnnA
> >
>
> Prova la funzione che ti ho inviato. Restituisce un ordinamento piů
> accettabile e non si limita a 4 o 5 caratteri.
>
> Ciao, Carlo
>

Sicuramente la proverň, quasi quasi diventa una missione!

Grazie AnnA!

0 new messages