Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: g.paolo - 07 Marzo 2008, 19:09:15

Titolo: ordinamento dati
Inserito da: g.paolo - 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?
Titolo: Re: ordinamento dati
Inserito da: g.paolo - 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.
Titolo: Re: ordinamento dati
Inserito da: tornu - 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.
Titolo: Re: ordinamento dati
Inserito da: g.paolo - 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.
Titolo: Re: ordinamento dati
Inserito da: tornu - 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
Titolo: Re: ordinamento dati
Inserito da: g.paolo - 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?
Titolo: Re: ordinamento dati
Inserito da: g.paolo - 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?
Titolo: Re: ordinamento dati
Inserito da: tornu - 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
Titolo: Re: ordinamento dati
Inserito da: g.paolo - 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.
Titolo: Re: ordinamento dati
Inserito da: - 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.
Titolo: Re: ordinamento dati
Inserito da: g.paolo - 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ù.
Titolo: Re: ordinamento dati
Inserito da: - 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
Titolo: Re: ordinamento dati
Inserito da: - 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 ?
Titolo: Re: ordinamento dati
Inserito da: g.paolo - 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
Titolo: Re: ordinamento dati
Inserito da: tornu - 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
Titolo: Re: ordinamento dati
Inserito da: g.paolo - 09 Marzo 2008, 23:51:19
@tornu


Hai proprio ragione, così funziona bene, ma perdo però la funzionalità di ordinamento mediante il click sulla colonna, che tutto sommato considero molto più importante. Creare il codice per settare l'ordinamento di ogni colonna, potrebbe significare molto lavoro in più di quello richiesto per ordinare il campo ID anteponendo degli zeri.
Titolo: Re: ordinamento dati
Inserito da: tornu - 10 Marzo 2008, 00:17:16
Citazione

darth14n ha scritto:
Hai proprio ragione, così funziona bene, ma perdo però la funzionalità di ordinamento mediante il click sulla colonna, che tutto sommato considero molto più importante. Creare il codice per settare l'ordinamento di ogni colonna, potrebbe significare molto lavoro in più di quello richiesto per ordinare il campo ID anteponendo degli zeri.


Questa è una scelta secondo le tue esigenze, scusa se mi permetto ma non credo che tu stia cambiando continuamente l'ordine di visualizzazione dei dati, comunque le mie indicazioni erano in base al tuo post dove avevi l'esigenza di ordinare la colonna ID.
Non devi creare codice per settare le altre colonne, vengono ordinate automaticamente in riferimento all'ordine che dai all'ID se fanno parte dello stesso record di dati.
Ciao
Titolo: Re: ordinamento dati
Inserito da: tornu - 10 Marzo 2008, 00:37:51
Un'ultima indicazione, se scegli di anteporre gli zeri all'ID non c'e' bisogno di righe di codice è sufficiente che vai sul database e assegni all'ID l'attributo
UNSIGNED ZEROFILL lo farà lui automaticamente almeno con Mysql, non conosco gli altri DB.
Ciao
Titolo: Re: ordinamento dati
Inserito da: g.paolo - 10 Marzo 2008, 09:20:15
@tornu
Un'ultima indicazione, se scegli di anteporre gli zeri all'ID non c'e' bisogno di righe di codice è sufficiente che vai sul database e assegni all'ID l'attributo
UNSIGNED ZEROFILL lo farà lui automaticamente almeno con Mysql, non conosco gli altri DB

Purtroppo non mi sembra che questa sia una funzionalità prevista da sqlite3 al quale non posso rinunciare perchè l'unica applicazione che ho trovato in grado di portare i miei dati in Access direttamente in un DB gestibile in linux è Kexi che mi crea un unico file contenente tutte le tabelle richieste come avviene in Access.
Non conosco altre applicazioni simili che mi diano lo stesso risultato usando MySQL o PostgreSql
Titolo: Re: ordinamento dati
Inserito da: - 10 Marzo 2008, 22:45:16
Io sono meno di un pivello nel campo della programmazione ( mi diletto con gambas da 5-6 mesi da autodidatta per piccole applicazioni ad unico mio utilizzo ) e ancor meno nel database ( settimana scorsa ho iniziato un mp3 cataloger ); dico e faccio arrangiandomi, tentando e spesso bestemmiando . Per scrivere quel che ho scritto ho semplicemente provato il metodo, elencando i risultati , senza arroganza .  

Tornando al metodo degli 0, per conto mio funziona benissimo. Lo uso solo in lettura in quanto in scrittura salvo tutto con un loop; nel caso in cui devo utilizzare il campo della tabella per sovrascrivere il corrispondente nel database faccio un semplice left$ e elimino gli zeri superflui .... Tutto funzia alla grande .....


Io son dell'idea che un ostacolo tante volte è meglio aggirarlo che scavalcarlo, si fà meno fatica ;-)
Titolo: Re: ordinamento dati
Inserito da: tornu - 10 Marzo 2008, 23:51:02
Citazione

giac_fab ha scritto:
Io sono meno di un pivello nel campo della programmazione.......................

.....Per scrivere quel che ho scritto ho semplicemente provato il metodo, elencando i risultati , senza arroganza...............


Neanche io mi elevo a programmatore (non me lo sogno proprio), però se indico qualche soluzione è perchè prima l'ho provata e riprovata. Ho solo risposto alla tua frase dove dicevi che il metodo proposto non avrebbe funzionato, non è arroganza.
Siamo tutti qui (penso) per imparare qualcosa l'uno dall'altro in base alle proprie  esperienze, il tuo metodo e valido come gli altri, poi uno applica la soluzione che più le sembra appropriata al caso.
Ciao   :-)  :-)