Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Ordinare campo stringa un po' numericamente, un po' alfabeticamente

Un mio caro cliente ha le solite esigenze un po' strampalate.
Un codice prodotto "numerico" contiene anche delle lettere, ma deve 
venire ordinato per bene, cioe' se ci sono numeri, numericamente, se ci 
sono lettere, alfabeticamente, se ci sono numeri e lettere, boh ...
Es. ho tre campi che contengono dei codici articolo
campo1 campo2 campo3
903    1      34
903    1      35
903    1      W51
903    1      W07
Questo sopra  e' quel che mi restituisce questa query:
SELECT * FROM articoli ORDER BY val(campo1), val(campo2), val(campo3)
Vorrei (vorrebbe) che W07 venisse prima di W51!!!
Finche' nel campo ci sono numeri e' tutto ok, ma se ci sono lettere, 
come sapete, val si interrompe al primo carattere non numerico.
Vorrei evitare un ordinamento (e conseguente query) ad hoc, del tipo
ORDER BY ...,iif(isnumeric(campo3),val(campo3),val(mid(campo3,2)))
perche' sono sicuro che qualche perfido personaggio sta gia' pensando 
all'utilizzo di un codice del tipo 1W2 ... ;-(
C'e' un altro modo, possibilmente gestibile via sql?
grazie
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

Scusa, ma se fai l'ordinamento senza VAL(), non dovrebbe ordinare il tutto
secondo l'ordine dei caratteri ASCII, e cioč prima numeri e poi lettere?

 
C'ero quasi cascato ... ;-)
Col tuo metodo viene prima 02 o 1 ???
:-)
ciao


 Vorrei (vorrebbe) che W07 venisse prima di W51!!!
Considerando solo il terzo campo, potresti approfondire questa ipotesi:
Select Space(10-len(campo3)) & campo3 As Codice Order By
Space(10-len(campo3)) & campo3
Ovviamente, allineando a destra (e dando quindi valenza allo spazio in più)
crea un altro problema: W51 viene prima di A051

 Col tuo metodo viene prima 02 o 1 ???
CUT
Secondo me non ti ha dato una indicazione errata in via di massima...
nel senso:
se il campo č unico...lo avrai memorizzato come "testo"....
quindi valida l'input e fai capire al bastardello di cliente che "02" E' "2"
a quel punto il suo metodo funziona no?
(non lo so non l'ho provato! č.....dubbio:502 viene prima di 51?)
No č vero....
Mi hai stimolato....in senso buono....
ho trovato sta soluzione: a te vedere se va bene o se si puň ulteriolmente
accorpare!!!
Ho preso access
ho fatto una tebella test
con il campo "Codicetesto" a Text
una query....
SELECT Test.CodiceTesto, IIf(Not
(IsNumeric([Test]![CodiceTesto])),([Test]![CodiceTesto]),"##0") AS Espr1,
IIf(IsNumeric([Test]![CodiceTesto]),CLng([Test]![CodiceTesto]),0) AS Espr2
FROM Test
ORDER BY IIf(Not
(IsNumeric([Test]![CodiceTesto])),([Test]![CodiceTesto]),"##0"),
IIf(IsNumeric([Test]![CodiceTesto]),CLng([Test]![CodiceTesto]),0);
ti fa 2 colonne...una numerica ordinata ed una testo ordinata
La colonna numerica ha il valore 0 come discrimine far valori validi e
non...
la colonna testo ha la sequenza ##0 come discrimine....
con un loop stampi prima una colonna e poi l'altra e la palla di cliente č
servita!!!!

Un'alternativa, più elaborata (e forse anche un pò
strampalata, ma bisongna sempre vedere fino a che punto)
a livello di db e di programma
è di farti un campo addizionale solo per le tue richerche
in cui trasmuti il codice cliente in codice ordinabile via
db in modalità corretta ascii e per il cliente.
Ripeto molto lavoro in più ... però magari sta cosa può
ritornarti utile per altri passaggi che ci sono all'interno
del programma di cui tutti siamo all'oscuro.
Ciao
Andrea

 Un mio caro
dev'esserti molto caro...

ipotesi troppo gnocca ? crei un campo stringa con la lunghezza dei
codici alfanumerici (che mi auguro vivamente siano a lunghezza fissa)
e ci metti un format a stringa q.b. dei numerici. la query la fai sul
campo derivato, ma mostri quello originale.
se gli alfanum sono a lunghezza variabile, approfittando della sua
carezza/caritů  gli farei un discorsino sul concetto di codici
organizzati...
ciao

On 07/01/2003 23.32, emmexx wrote:
Ringrazio tutti per i suggerimenti, anche se forse non mi sono spiegato 
del tutto.
Volevo capire se esiste un algoritmo di ordinamento che ordini sia 
lettere che numeri nella maniera utilizzata dagli umani.
Il cliente in questione e' passato da "contiene solo numeri" a "a volte 
c'e' anche W" per finere con ...
Volevo appunto prevenire la sua prossima mossa ...
Ma mi sa che e' impossibile ... :-(
ciao



Ops.... distrazioni notturne...
Scusa della ca@@ata che ho detto!!!

 lettere che numeri nella maniera utilizzata dagli umani.
come ordiniamo noi "umani" (A.p. direbbe anche....definire "umani"!!!!)????
In genere io non mischio "patate e fragole"
e infatti la query che ti ho mandato fa questo....ordina le "patate" e
ordina le "fragole"
poi se tu sei in vena di schifezze....
non fai altro che stampare tutte le patate e dove finiscono stampi le
fragole...otterrai una lista ordinata per patate E per fragole!!!
ecco fatto l'algoritmo!
Anche perchč non capisco....
ad esempio...
Mela
Banana
10WT
33
0332
25
come la ordineresti questa lista????
o meglio come VORREBBE che la ordinassi il tuo cliente???
Il bello degli umani č che lavorano in "analogico" mentre il pc č solo una
macchina a 2 stati!!!
Quindi ogni umano ha la sua personale idea di ordine...qual'č quella del tuo
cliente?????
Saluti!
:-)

 macchina a 2 stati!!!
afaik i pc lavorano in digitale (con le digit, dita) mentre gli umani
tendono spiccatamente a lavorare in pedale :)

 abbi pazienza.....non ho capito una mazza!!!
Supponi di gestire degli articoli codificati con 3 cifre. L' ordinamento 
e' semplice val(codice) e li ordini.
Dopo qualche tempo la fascia di articoli si amplia (aggiungo al catalogo 
nuovi prodotti) e il codice diventa lettera + 3 cifre oppure quel che il 
mio cliente mettera' in catalogo domani. Dovrei modificare il mio 
algoritmo per riordinare i codici tenendo conto anche di queste nuove 
codifiche...
Allora mi chiedevo se esistesse qualche algoritmo "a priori" di 
ordinamento. Ma mi sono gia' risposto da solo: non esiste!
Dovro' su richiesta del caro cliente modificare l'algoritmo quando 
vengono introdotti codici di tipo diverso.


 ha scritto nel messaggio
news:avjhkk$gc2se$1...@ID-97197.news.dfncis.de...
MAH!
abbi pazienza eh!
io ho capito che....
fai un ordinamento personalizzato!
Ossia hai dei campi TESTO e vuoi considerare NUMERICO una parte
Visto che già usi VAL .....ma scusa lo applicherai ad una parte eh!
001Ecchecavolo
005Altroche
003Bingo
io ho capito che ordini in base a quelle 3 LETTERE che VUOI considerare
CIFRE
ossia
001...
003...
005...
Come fai a tirare fuori quelle 3 LETTERE per il VAL????
una volta che ti sei dato la risposta sai anche la soluzione....basta
riscrivere la query e considerare 3,4 8,12 lettere da passare alla VAL
candidato sarebbe il mid..o il left...o il right...vedi tu che cosa ti da il
tuo DB!!!
Con access ce lo puoi mettere nella query!
Se la stringa la costruisci al volo l'algoritmo è solo trovare qunte cifre
considerare per passarle al VAL
A scanso di equivoci:
mi dirai se il cliente passa da 3 a 4 cifre il vecchi mi si sballa col tuo
sistema!!!
Infatti....
prevedi dimensioni campi in esubero riempiti a zero
ad esempio 6 lettere
000001
000123...etc etc
Ma scusa eh
che ti costava fare un codice composto??????
un campo numerico e un campo testo
le chiavi possono anche essere su +campi!!!!
non era più semplice?????
ESEMPIO
Solita tabella TEST
campo codiceTesto
campo codiceVal
dati:
CODFF, 56
CODAA,88
COD_A,12
SQL:
SELECT CStr([Test]![CodiceVal]) & "-" & Trim([Test]![CodiceTesto]) AS Espr1
FROM Test
ORDER BY Test.CodiceVal;
ho messo "-" per evidenziare!


sempre per chiarezza
l'utente introduce sempre
5152CODPROVA... oppure...
12TEST
sei tu da programma
(nel validate ad esempio)
che spezzi la stringa dove finiscono  i numeri.
E memorizzi i dati nei 2 campi!

On 09/01/2003 13.16, Wodka4U(Nbook) wrote:
Forse nei miei post non era chiaro:
I codice non li creo io e non li crea il mio cliente. Io ho 
un'anagrafica Articoli con i campi:
Nome, Codice ...
Il codice e' quello di articoli "esterni" al mio cliente, quindi i 
codici non rispettano una "regola", un gruppo di articoli ha una 
codificazione con soli numeri, altri con numeri e lettere.
Siccome, su richiesta del cliente, gli articoli non hanno un campo 
"tipo" o "categoria" che permetta di distinguere il tipo di codice 
utilizzato, cercavo la "regola che non esiste" ...
non stare a preoccuparti troppo, sono io che, stanco di richieste 
assurde del cliente, cercavo la pappa gia' pronta ...
