Autore Topic: ordinamento dati  (Letto 3064 volte)

g.paolo

  • Visitatore
ordinamento dati
« il: 07 Marzo 2008, 19:09:15 »
In una ColumnView, abilitando la proprietà Sorted, posso ordinare i record a scelta in base alla colonna selezionata. Questo però non funziona col campo ID, che invece di essere trattato come Integer ( come impostato nella table ), viene invece trattato come fosse una stringa ordinando 1-10-100-1000 anzichè 1-2-3-4.
Ho provato in vari modi impostando
.Columns[0].Alignment
che prevede un dato di tipo integer,
ma non trovo indicazioni su come usare tale proprietà.
Avete mai risolto tale problema?

g.paolo

  • Visitatore
Re: ordinamento dati
« Risposta #1 il: 07 Marzo 2008, 21:34:55 »
Ho scoperto dopo innumerevoli prove, che per impostare l'allineamento a destra in una colonna della columnview si deve impostare la proprietà "alignment" alla larghezza della colonna medesima:

.Columns[0].Alignment = .Columns[0].Width

Ovviamente cio non risolve il problema dell'ordinamento, perchè per ordinare il campo ID in modo corretto si dovrebbe sostituire con uno zero le cifre mancanti, ovvero:
invece di scrivere il numero 17, si dovrà scrivere "0017" se il campo prevede un max di quattro cifre.
Non sembra ci sia il modo di far capire a gambas che la colonna dell'ID è numerica, e pertanto trattarla come tale.

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: ordinamento dati
« Risposta #2 il: 07 Marzo 2008, 22:47:28 »
ColumnView.Columns[N.Colonna].Alignment = 1  ' Allineamento a sinistra

ColumnView.Columns[N.Colonna].Alignment = 2  ' Allineamento a destra

ColumnView.Columns[N.Colonna].Alignment = 3  ' Allineamento al centro

Al posto di [N.Colonna] inserisci il numero colonna che vuoi allineare.

Ciao.
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

g.paolo

  • Visitatore
Re: ordinamento dati
« Risposta #3 il: 08 Marzo 2008, 11:01:40 »
@tornu
E' vero quello che dici, comunque ho visto che funziona anche nel modo che ho detto sopra ed a seconda del valore numerico immesso calcola automaticamente la posizione del testo fra le tre previste. Strano comunque che la guida non dica nulla in proposito!

Resta dunque il problema di come ordinare un campo integer, e su questo problema non so proprio che pesci pigliare!

Ho poi notato un'altra cosa abbastanza difficile da risolvere. Quando l'ordinamento è diverso da quello iniziale, ed il record visualizzato per ultimo non corrisponde all'ultimo della table, se cerchi di spostarti in basso al record successivo (che non esiste) ottieni un errore perchè non trova nulla.
In tal caso non saprei quale proprietà impostare (se esiste) per impedire il sorgere dell'errore.

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: ordinamento dati
« Risposta #4 il: 08 Marzo 2008, 22:48:11 »
Citazione

darth14n ha scritto:

Resta dunque il problema di come ordinare un campo integer, e su questo problema non so proprio che pesci pigliare!


Facciamo un esempio:
ammettiamo di avere una ColumnView cosi composta

    ColumnView.Columns.Count = 3
    ColumnView.Columns.Sort = x
    ColumnView.Columns[0].Text = "COLONNA 1"
    ColumnView.Columns[1].Text = "COLONNA 2"
    ColumnView.Columns[2].Text = "COLONNA 3"

e che la COLONNA 0 debba visualizza i tuoi ID, per ordinarli in qualsiasi modo tu preferisci devi agire sull'istruzione
ColumnView.Columns.Sort = x senza bisogno di formattare l'ID nel database.
Al posto della x inserisci il numero che effettua l'ordinamento secondo le tue necessità, seguendo questo schema:

Ordina i dati della Colonna 0 nel modo 1 - 19 - 2 - 29 - 3 ......
ColumnView.Columns.Sort = 0

Ordina i dati della Colonna 1 nello stesso modo della Colonna 0
ColumnView.Columns.Sort = 1

Ordina i dati della Colonna 2 nello stesso modo della Colonna 0
ColumnView.Columns.Sort = 2

ecc... fai delle prove per vedere il risultato.

Questa e l'istruzione che serve a te:

Ordina i dati della Colonna 0 nel modo 1 - 2 - 3.....10 - 11.....20 ......
ColumnView.Columns.Sort = 3

Naturalmente funziona anche con colonne che contengono caratteri.
Ciao
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

g.paolo

  • Visitatore
Re: ordinamento dati
« Risposta #5 il: 09 Marzo 2008, 10:55:27 »
@tornu
Grazie molte per le tue precise istruzioni, è proprio quello che mi serve.
Certo che ora mi hai molto incuriosito!
Ma dove vai a trovare queste istruzioni, che mi sono letto un sacco di cose
e non ho trovato nulla?
Sono frutto di una ricerca mirata o di estenuanti prove da parte tua?

g.paolo

  • Visitatore
Re: ordinamento dati
« Risposta #6 il: 09 Marzo 2008, 14:32:49 »
@tornu
Ho provato coma da tue istruzioni:

Ordina i dati della Colonna 0 nel modo 1 - 2 - 3.....10 - 11.....20 ......
ColumnView.Columns.Sort = 3

ma il risultato non è quello atteso.
Puo essere che il numero 3 non sia corretto?

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: ordinamento dati
« Risposta #7 il: 09 Marzo 2008, 15:30:55 »
Se la tua ColumnView è formata per esempio da sette colonne:
ColumnView.Columns.Sort = 7

se fossero venti colonne:
ColumnView.Column.Sort = 20

queste istruzioni sono valide per ordinare la Column[0], comunque è valida per qualsiasi colonna seguendo lo schema che ti ho descritto nel post precedente.

Le ricerche mirate raramente mi portano a trovare documentazione completa inerente un determinato argomento, molto trovo sulla mailing list for gambas users anche se  la ricerca non è semplice e la difficoltà della lingua inglese non è trascurabile (almeno per me), con la guida di Gambas trovo difficoltà perchè povera di esempi, spulcio molto anche nei forum spagnoli e tedeschi, ti consiglio di dare un'occhiata al libro 'A Beginner's Guide to Gambas' scaricabile in pdf dal sito ufficiale (sempre in inglese), per ultimo provare...provare...provare.

Confido molto nella crescita di questo forum dove spero che qualcuno che a buone conoscenze magari pubblichi anche piccoli tutorial in lingua madre.
Ciao
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

g.paolo

  • Visitatore
Re: ordinamento dati
« Risposta #8 il: 09 Marzo 2008, 15:59:44 »
Non so dove sbaglio, ma non mi funziona proprio.
Ecco il mio codice:

WITH cvIndirizzi
    .Enabled = TRUE
    .Clear    
    .Columns.Count = 3    
    .Columns[0].Alignment = 2                          
    .Columns[0].Width = 50                
    .Columns[1].Width = 70
    .Columns[2].Width = 260
    .Columns[0].Text = "id"                      
    .Columns[1].Text = "tipo"
    .Columns[2].Text = "indirizzo"
    .Columns.Sort = 3
END WITH

Come vedi, mi sembra di aver fatto come hai detto tu; il campo ID è un campo di tipo integer,
e si ostina a mantenere l'ordinamento originale 1-10-100-1000.

  • Visitatore
Re: ordinamento dati
« Risposta #9 il: 09 Marzo 2008, 17:05:57 »
Mi trovo ad avere il medesimo problema ....
certamente non sarà risolvible con il metodo da voi proposto.

Il .sort = 1-2-3 o 4 simula in sostanza il mio click sull header della colonna 1-2-3 o 4 , non modifica nient'altro

L'alignment a dx o a sx non serve a nulla se non all'estetica.

Io per risolvere il problema penso farò un controllo sul numero di cifre e andrò ad aggiungere la giusta quantià di "zeri" necessaria, lasciando intatto il database e agendo solo in fase di lettura-scrittura sulla colonna.

g.paolo

  • Visitatore
Re: ordinamento dati
« Risposta #10 il: 09 Marzo 2008, 17:37:22 »
@giac_fab
Proprio così, poichè modificando i dati del campo ID in testo, aggiungendovi gli zeri mancanti, in tal caso perdi la funzione del campo contatore!
Per l'altro problema che ho, quello di riscontrare un errore quando mi muovo in fondo alla griglia con un ordinamento diverso, e punto ad un record successivo inesistente, ho scelto la strada della gestione dell'errore in questo modo:

PUBLIC SUB btn_next_Click()  
  WITH cvIndirizzi    
      .MoveNext
      .Item.Selected = TRUE
  END WITH
CATCH
  IF ERROR THEN
    Message.Info("fine lista!")
  ENDIF
END

Almeno così ricevo un messaggio, e l'errore non si presenta più.

  • Visitatore
Re: ordinamento dati
« Risposta #11 il: 09 Marzo 2008, 17:41:14 »
ho fatto .... molto banale



numerorows as string 'il mumero massimo da raggiungere non deve essere un integer ( al massimo fai integer = string)
lunghezza as string il numero da scrivere come id

 quantizeri = Len(file.Load(numerorows)) - Len(lunghezza)
 IF quantizeri = 0 THEN glizeri = ""
 IF quantizeri = 1 THEN glizeri = "0"
 IF quantizeri = 2 THEN glizeri = "00"
 IF quantizeri = 3 THEN glizeri = "000"
 IF quantizeri = 4 THEN glizeri = "0000"
 IF quantizeri = 5 THEN glizeri = "00000"
  GridView1.Item[0] = glizeri & number

  • Visitatore
Re: ordinamento dati
« Risposta #12 il: 09 Marzo 2008, 17:44:17 »
Non ho ben capito cosa intendi per funzione campo contatore ...

Ma come si fà a modificare un post già fatto ?

g.paolo

  • Visitatore
Re: ordinamento dati
« Risposta #13 il: 09 Marzo 2008, 20:00:15 »
Il campo contatore in ogni tabella di un database è quello che riporta un numero univoco mai ripetuto per ogni record ed è la base per tutte le funzioni di ordinamento.
Puoi avere anche campi con lo stesso nome ripetuto, ma il campo ID o contatore non lo sarà mai, e di solito è autoincrementante.

Per modificare un post ti compare di solito in basso sotto il post il pulsante MODIFICA, ma mi sembra di aver capito che la modifica la puoi fare entro un certo tempo massimo e poi viene bloccato

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: ordinamento dati
« Risposta #14 il: 09 Marzo 2008, 21:57:46 »
Citazione

giac_fab ha scritto:
Mi trovo ad avere il medesimo problema ....
certamente non sarà risolvible con il metodo da voi proposto.

Il .sort = 1-2-3 o 4 simula in sostanza il mio click sull header della colonna 1-2-3 o 4 , non modifica nient'altro

L'alignment a dx o a sx non serve a nulla se non all'estetica.

Io per risolvere il problema penso farò un controllo sul numero di cifre e andrò ad aggiungere la giusta quantià di "zeri" necessaria, lasciando intatto il database e agendo solo in fase di lettura-scrittura sulla colonna.


Il metodo da me proposto ti assicuro che funziona perfettamente, guardare per credere. L'estetica di un programma ti sembra poco importante?
E buona norma di un programmatore ottenere gli stessi risultati con il minor numero di righe di programma.
Certo che simula in sostanza il click sull'header, ma se il programma viene usato da più utenti ognuno potrebbe cambiare l'ordinamento, impostato da programma questo può essere evitato.

darth14n@
Dovrebbe funzionare tutto correttamente, verifica nelle proprietà della ColmunView se Sorted = TRUE settalo su FALSE altrimenti vengono ignorate le istruzioni da programma.
Ciao
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)