Autore Topic: Unknown symbol Sort in class variant[]  (Letto 1524 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Unknown symbol Sort in class variant[]
« il: 26 Febbraio 2015, 17:13:25 »
Quello riportato nel titolo è il messaggio che mi è comparso oggi dopo avere faticato un sacco per mettere in ordine crescente di data le righe di un array bidimensionale definito variant.
Per potere eseguire l'ordinamento ho dovuto trasformare l'array da bidimensionale ad unidimensionale, poi comandare il sort del nuovo array ed, infine, riportarlo nella struttura bidimensionale originaria.
Non sto a riportare qui tutto il codice perché quello che conta è lo schiaffo che Gambas3.4.1 mi ha mollato.
Riporto le istruzioni di dichiarazione dell'array e di impiego del metodo sort:
Codice: gambas [Seleziona]
Dim vArea As Variant[]
...
  vArea.Sort


L'anomalia nasce dal fatto che per gli array di tipo variant non è previsto il metodo Sort che invece è gestibili in tutti gli altri tipi di array.
La differenza pratica che riesco a riscontrare è costituita dal fatto che mentre gli array di tipo String, integer, date, single sono tutti composti da elementi di dati di tipo omogeneo, l'array di tipo Variant è composto invece da elementi di dati di tipo eterogeneo. Evidentemente Gambas non riesce a gestirli.

Ciò significa, salvo diverso riscontro, che dovrò gestirmi il Sort a manina.  :evil:
Ciao.
 
:ciao:

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Unknown symbol Sort in class variant[]
« Risposta #1 il: 26 Febbraio 2015, 18:06:36 »
Io lo vedo un comportamento logico. Variant può contenere ogni tipo di dato e pertanto non è possibile ordinare secondo un criterio logico. Se hai una cassetta di frutta non puoi ordinare i frutti secondo un criterio logico. Non avrebbe senso.

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Unknown symbol Sort in class variant[]
« Risposta #2 il: 27 Febbraio 2015, 00:12:14 »
Non c'è dubbio che un array di tipo variant può contenere sia dati numerici(interi o float), sia dati stringa che dati di tipo data di calendaro, comprensiva possibilmente anche di ore,minuti,secondi. Non c'è dubbio che un array di tipo univoco, come integer, per es., può essere ordinato secondo un criterio che tenga conto dei valori di ciascuna riga, partendo dall'estrema destra di essa, mentre un array di tipo stringa debba essere ordinato tenendo conto dei valori contenuti in ciascuna riga, partendo dall'estrema sinistra di essa.
Non so se per effettuare un ordinamento, in Gambas venga impiegato il linguaggio "C" che fra l'altro conosco assai superficialmente, però, secondo una logica da non addetto ai lavori, considererei il trattamento dei dati di ciascuna riga di un array variant alla stessa stregua di un array di tipo stringa. Ciò proprio perché non è possibile tenere conto di tutti i tipi di dati in essa contenuti.
Secondo me, sempre da utente del linguaggio, il fatto che manchi la modalità Sort per gli array di tipo variant è semplicemente una scelta e non una necessità tecnica.
Comunque, io ho già risolto perché il mio array di partenza è un array di tipo variant bidimensionale, perciò ciascuna riga si compone di diverse colonne. Pertanto ho organizzato l'ordinamento tenenndo conto della chiave di ordinamento contenuta in una colonna, all'interno della quale il tipo di dati è sicuramente omogeneo.
Alla fine penso di srivere molto meno codice di quanto ne dovrei scrivere per fare svolgere l'ordinamento a Gambas.
Non riporto qui il segmento di codice perché l'ho semplicemente stilato sotto forma di flow. Lo farò dopo che lo avrò riportato in codice e l'avrò anche provato.
Ciao.
:ciao:

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Unknown symbol Sort in class variant[]
« Risposta #3 il: 27 Febbraio 2015, 13:04:54 »
Secondo me, sempre da utente del linguaggio, il fatto che manchi la modalità Sort per gli array di tipo variant è semplicemente una scelta e non una necessità tecnica.

Se io ti dico: "in quella stanza (che rappresenta il nostro array) ci sono un bambino, un tavolo, un pacco di patatine, un foglio di carta A5 e una bottiglia d'acqua. Ordinameli." Saresti in grado di eseguire il mio comando?
L'ordinamento si deve basare su forti criteri logici (sequenzialità numerica, ordine alfabetico, dimensione dato) e questi criteri sono inesistenti tra dati di natura diversa. Tutto qua. Nessuna scelta.

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: Unknown symbol Sort in class variant[]
« Risposta #4 il: 27 Febbraio 2015, 16:01:23 »
Comunque, io ho già risolto perché il mio array di partenza è un array di tipo variant bidimensionale, perciò ciascuna riga si compone di diverse colonne. Pertanto ho organizzato l'ordinamento tenenndo conto della chiave di ordinamento contenuta in una colonna, all'interno della quale il tipo di dati è sicuramente omogeneo.

Mi ricorda tanto un Result... :) Che tipo di dati hai all'interno? Io non utilizzo mai Array di tipo Vairant, piuttosto uso una Collection e per l'ordinamento utilizzo un Array String o Integer secondo le necessità... ma solo se si tratta di ordinare oggetti altrimenti mi appoggio sempre ad una tabella per trattare dati...

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Unknown symbol Sort in class variant[]
« Risposta #5 il: 28 Febbraio 2015, 00:33:49 »
Io utilizzo array di tipo variant, semplicemente allo scopo di evitarmi ogni volta la conversione di dati numerici, come date di calendario, valori float e valori integer in caratteri stringa da riconvertire ogni volta che devo utilizzarli nella loro natura originaria.
Una volta utilizzavo arry di tipo stringa, sobbarcandomi l'onere non indifferente di convertire e riconvertire ogni volta a seconda dell'uso che ne dovevo fare. Poi ho incontrato le variabili di tipo variant, ivi compresi gli array; ho capito che utilizzando array di detto tipo, potevo risparmiarmi le operazioni di conversione e riconversione. Operando così mi trovo benissimo. Non ho mai considerato, prima d'ora, perchè fino ad oggi non ne ho avuto bisogno, l'eventualità di richiamare il modulo Sort. Ritengo, perchè l'ho potuto mettere in pratica in quest'occasione che l'ordinamento degli elementi di una tabella(array) bidimensionale di tipo variant non altera assolutamente l'esito dell'ordinamento stesso, perchè le chiavi di ordinamento sono contenute sempre nelle celle delle medesime colonne, dove i valori hanno caratteristiche di tipo di dati sempre omogeneo. Allora, visto anche che Gambas non è in grado di gestire strutture di contenuto misto, mi sono deciso a svolgere l'ordinamento con istruzioni come quelle che ho messo in opera oggi e che, per chiarezza verso chi voglia conoscere più da vicino il mio criterio di impiego. riporto qui sotto:
Codice: gambas [Seleziona]

        bSWCmmb = True
        While bSWCmb
          bSWCmb = False
          For i = 0 To iTotAnomVec - 2
            If vTaBila[i, 14] > vTaBila[i + 1, 14] Then   ' vTaBila[i, 14] = VoCoContrPart
              For ii = 0 To 14
                Swap vTaBila[i, ii], vTaBila[i + 1, ii]
              Next
              bSWCmmb = True
            Else
              If vTaBila[i, 14] = vTaBila[i + 1, 14]       ' vTaBila[i, 14] = VoCoContrPart
                If vTaBila[i, 2] > vTaBila[i + 1, 2]       ' vTaBila[i, 2] = Data contabile
                  For ii = 0 To 14
                    Swap vTaBila[i, ii], vTaBila[i + 1, ii]
                  Next
                  bSWCmmb = True
                Else
                  If vTaBila[i, 2] > vTaBila[i + 1, 2]       ' vTaBila[i, 2] = Data contabile
                    If vTaBila[i, 13] > vTaBila[i + 1, 13]   ' vTaBila[i, 13] = IdRecContrPart
                      For ii = 0 To 14
                        Swap vTaBila[i, ii], vTaBila[i + 1, ii]
                      Next
                      bSWCmmb = True
                    Endif
                  Endif
              Endif
            Endif
          Next
        Wend


L'ordinamento tiene conto di tre chiavi posizionate in colonne diverse e non contigue. Il ciclo ripetitivo di ordinamento è gestito dalla variabile booleana bSWCmb che viene posta a TRUE ogni volta che si scambiano di posto una riga della tabella con la successiva. Ad ogni nuovo ciclo di ordinamento la variabile  bSWCmb  viene posta a FALSE. Il ciclo termina solamente quando eseguiti tutti i controlli sulle chiavi di ordinamento di una riga e di quella successiva terminano senza effettuare scambi. A tal punto la tabella è sicuramente ordinata per tutte e tre le chiavi di ordinamento interessate e la variabile  bSWCmb resta settata a FALSE . Ciò permette il riconoscimento di fine ciclo  While ... Wend ed il programma può proseguire il suo percorso con le istruzioni successive.
 ;D
:ciao: