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