Newsgroup: it.comp.appl.access
Titolo: [Tab-Que] Ordinamento: numeri+testo

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


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

 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
---------------------------------------------


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.


 AnnA
-- 


 ---------------------------------------------
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)


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


 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.


 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.



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

 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.


 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....


 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

 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

 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.


 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.
-- 



[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.


 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.
-- 


 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

 Ciao, Carlo



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!


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


Sicuramente la proverň, quasi quasi diventa una missione!
Grazie AnnA!
