Newsgroup: it.comp.lang.visual-basic
Titolo: [VB 5] Ancora Vettori

OK ragazzi tutto a posto ho tenuto traccia (come immaginavo) di quanti
elementi fossero stati "non vuoti".
Adesso ho un'altro piccolo inconveniente che non capisco.
Con vari cicli for...next faccio confrontare il 1° elemento col 2° poi col
3° ecc.....
Poi ripeto partendo dal 2° col 3° e avanti.
Se due elementi di questi sono uguali allora faccio la somma dei pezzi, e
cancello l'ultimo elemento trovato altrimenti al prossimo giro me lo
sommerebbe nuovamente.
Cosi almeno credevo. Infatti sembra che la somma sia giusta, ma quando vado
a formare la mia Flex il dato che doveva essere cancellato me lo ritrovo la'
in bella mostra.
Allora io ho fatto cosi: dov'è l'errore?
For PIPPO = 1 To DimensioneRealeRecord ' Questa è variabile che tiene
traccia degli elementi "non vuoti"
     For Pluto = (PIPPO + 1) To DimensioneRealeRecord 'Sono uno avanti
rispetto a Pippo
     If fiset(PIPPO).articolo = fiset(Pluto).articolo Then 'Vedo se gli
articoli sono uguali
          fiset(PIPPO).pezzi = fiset(PIPPO).pezzi + fiset(Pluto).pezzi ' e
allora se lo sono sommo il valore dei pezzi
          fiset(Pluto).dati = "" ' Qui forse è l'errore. Dati e' il vettore
dove ho memorizzato i dati quando ho caricato il file esterno
                                          Questo Vettore è stato scomposto
poi in 3 type Pezzi, Articolo,Descrizione (se vi puo' servire saperlo)
                                           e adesso gli sto dicendo di porsi
a "", cosa che invece non succede.
     End If
     Next Pluto
Next PIPPO
Ciao gente
Buon fine settimana
Pensierino:
Noi ci troviamo continuamente di fronte a una serie di grandi opportunità
brillantemente travestite da problemi insolubili.
J.W.Gardner
Paolo
CIAUZ:)

*PAOLO* ha scritto:
...

Non si capisce molto. Dati è rimasto un vettore "normale"? Comunque sia, qui
non si vede alcun test sullo stesso, quindi qualsiasi variazione gli fai non
verrà qui considerata.
Forse basta, al posto di fiset(Pluto).dati="", fiset(Pluto).Articolo="" che
viene testato per uguaglianza, ma rischia di essere "confuso" con un
fiset(PIPPO).Articolo anch'esso="", quindi mi limiterei ad azzerare pezzi,
quindi fiset(Pluto).pezzi=0 che, anche se riconsiderato, non modifica il
totale

Ciao Lupo :)
mmmmmmm non funziona. Avevo gia' provato a mettere a zero ma mi scrive lo
stesso l'elemento che dovrebbe essere vuoto.
Vediamo se riesco a farti capire visto che non è chiaro e quindi possibile
di errori di concetto da parte mia.
Allora io carico il mio file CICCIO. ASC in un vettore Fiset(pippo).Dati
siccome questo file è "sporco" (contiene asterischi,spazi ecc....) lo
elaboro e memorizzo il tutto dentro un'altro vettore
separato Fiset(pippo).DatiAscii in modo che so che questo è il vettore dal
quale prendere i dati.
Ok a questo punto siccome ho bisogno di trattare questi dati come dei record
(solo 3), ma usando la FlexGrid, ho bisogno di suddividerli
in 3 type: quindi una stringa contenuta dentro a Fiset(pippo).DatiAscii che
puo' essere 5    banane    data    12345    ora    descr ecc...
viene lavorata estraendo solo:
Fiset(pippo).pezzi
Fiset(pippo).Articoli
Fiset(pippo).Descrizione
Prima stavo lavorando con il caricamento di un file TXT e ti assicuro che
tutto questo funzionava perfettamente (solo che le somme dei pezzi erano
gia' fatte) :)
Pippo ovviamente fa parte del ciclo For...Next per scrivere o leggere dentro
o dal vettore.
Bene adesso ho i tre elementi separati che pero' posso ricomporre sulla Flex
Assegnando Riga e Colonna.
Ma prima di questa assegnazione devo fare la somma di tutti i pezzi di cui
gli articoli sono uguali
quindi se la mia tabella fosse
5    banane     12345
3    mele        5187
2    banane    12345
6    limoni       43265565
ecco che le banane del 1° record si devono sommare alle banane del 3°
record, ma ovviamente il 3° record non dovrebbe piu' esistere perchè quando
mando il vettore alla Flex gli dico di partire a scrivere dal 1 vettore (che
contiene la somma delle banane e va bene)
poi scriverebbe nelle celle il secondo vettore (che sono le mele e va bene),
ma non dovrebbe scrivere il Terzo che sono ancora Banane che ho gia' sommato
prima.
Invece cio' non accade perchè in effetti al primo record mi Scrive nelle
celle 7 Banane (che come somma mi sta bene) ma poi al 3 vettore mi
ripresenta 2 Banane che invece non dovrebbero esserci.
Adesso va un pò meglio Lupo? :)
For PIPPO = 1 To DimensioneRealeRecord
     For Pluto = (PIPPO + 1) To DimensioneRealeRecord
     If fiset(PIPPO).articolo = fiset(Pluto).articolo Then ' qui fa il
confronto solo su gli articoli dello stesso vettore
          fiset(PIPPO).pezzi = fiset(PIPPO).pezzi + fiset(Pluto).pezzi 'qui
fa la somma solo sui pezzi dello stesso vettore
          fiset(Pluto).datiAscii = "" ' contiene tutta la stringa intera
esempio 5 Banane 12345 che io voglio mettere a ""
        End If
     Next Pluto
Next PIPPO
Ciao Speriamo bene :)
Paolo

 Next PIPPO
Io sostituire quella riga con
Fiset(pippo).pezzi =0
Fiset(pippo).Articoli=""
Fiset(pippo).Descrizione""
e poi volendo farei la compattazione dell'array
Ciao,
Taipů

 Paolo
Ma la Flex come la carichi?
Vuoi che gli items azzerati compaiano azzerati o non compaiano?
Nel tuo codice mi sembra di capire che NON azzeri .pezzi ma .datiAscii .
Quindi nel caricamento della Flex dovresti testare .datiAscii e skippare
se nullo (l'item non compare). Oppure dovresti azzerare .pezzi (l'item
compare azzerato).
Ciao.
pinco_pallo
 
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Piu' tardi provo a fare questo
ma come si fa la compattazione dell'array?
Cmq poi quando assegno alla FlexGrid i vettori Vuoti li tiro via da li, ho
gia' la procedura vecchia che funziona.
Adesso mi serve solo di eliminare dal vettore quello che non voglio venga
riconteggiato
E cmq per pinco_pallo l'assegnazione alla Flex la faccio da
Fiset(pippo).pezzi per esempio con un ciclo che scrive tutti i pezzi nella
prima colonna e via dicendo per l'articolo e la descrizione, insomma vedila
come un PUZZLE.
In effetti potrei anche scrivere sbagliando se volessi i pezzi di una cosa,
l'articolo di un'altra e la descrizione di un'altra ancora, ma generalmente
quando muovo una cosa sola gli muovo anche i suoi "fratelli" appresso
Ciao ragazzi, alla prossima
PAOLO


 > Fiset(pippo).Descrizione""
le avevo gia' usate nella procedura di caricamento file, per svuotare il
vettore da un precedente caricamento,qualora avessero voluto caricare
un'altro file diverso.
Non so perchè non mi sia passato per la testa di usarle, e sono partito come
un missile a voler cancellare a tutti i costi l'elemento del vettore intero.
Cmq non è scontato per niente, e certe volte sono ripetitivo, ma davvero
grazie ragazzi:)
Con voi oltre a imparare qualcosa in piu', ottengo sempre degli aiuti
validi.
Bene a questo punto procedo, ci sentiamo al prossimo problema (cioe'
presto:))))))))
Buona Giornata
PAOLO
CIAUZ:)

 ripresenta 2 Banane che invece non dovrebbero esserci.
Riproviamoci (limitandoci alla somma)... Attenzione, non l'ho provato:
For Pippo = 1 to DimensioneRealeRecord
    For Pluto = Pippo+1 to DimensioneRealeRecord
        If fiset(Pluto).Articolo<>"" Then
'                L'elemento è "vivo", ovvero contiene il codice articolo
'                quindi non è già stato totalizzato
            If fiset(Pluto).Articolo=fiset(Pippo).Articolo Then
'                    Questo elemento (Pluto) riguarda lo stesso articolo
'                    in fase di analisi (elemento Pippo)
'                    Totalizzo sull'elemento Pippo
                fiset(Pippo).Pezzi=fiset(Pippo).Pezzi + fiset(Pluto).Pezzi
'                    Ora "elimino logicamente" l'elemento già totalizzato
'                    assegnando allo stesso un codice articolo pari a ""
'                    Questo, convenzionalmente, vuol dire "elemento da
ignorare, morto"
                fiset(Pluto).Articolo=""
            End If
        End If
    Next Pluto
Next Pippo
'Quando dovrai aggiungere le informazioni alla FlexGrid, ti basterà fare
qualcosa del genere:
For Pippo=1 to DimensioneRealeRecord
    If fiset(Pippo).Articolo<>"" Then
'            L'elemento è "vivo", ovvero contiene il codice articolo
'            con il suo totale
        FlexGrid1.Additem fiset(Pippo).Articolo & vbTab &
fiset(Pippo).Descrizione & vbTab & fiset(Pippo).Pezzi
    End If
Next Pippo

 ripresenta 2 Banane che invece non dovrebbero esserci.
Riproviamoci (limitandoci alla somma)... Attenzione, non l'ho provato:
For Pippo = 1 to DimensioneRealeRecord
    For Pluto = Pippo+1 to DimensioneRealeRecord
        If fiset(Pluto).Articolo<>"" Then
'                L'elemento è "vivo", ovvero contiene il codice articolo
'                quindi non è già stato totalizzato
            If fiset(Pluto).Articolo=fiset(Pippo).Articolo Then
'                    Questo elemento (Pluto) riguarda lo stesso articolo
'                    in fase di analisi (elemento Pippo)
'                    Totalizzo sull'elemento Pippo
                fiset(Pippo).Pezzi=fiset(Pippo).Pezzi + fiset(Pluto).Pezzi
'                    Ora "elimino logicamente" l'elemento già totalizzato
'                    assegnando allo stesso un codice articolo pari a ""
'                    Questo, convenzionalmente, vuol dire "elemento da
ignorare, morto"
                fiset(Pluto).Articolo=""
            End If
        End If
    Next Pluto
Next Pippo


Dunque Lupo,
pare che adesso funzioni tutto, ma non al meglio:(
Nel senso che sebbene tu (ma l'ho fatto anche io) mi fai "morire" un
elemento del vettore, me lo ritrovo cmq sempre tra i piedi e per quello che
devo fare mi da noia.
Cioe' se all'elemento 47 del Vettore Fiset, quindi fiset(47) assegno "" cmq
sia questo elemento è occupato anche se non contiene nulla.
Siccome piu' avanti mi serve di fare dei confronti tra Vettori di una
tabella e Vettori di un'altra la situazione Vettore="" mi crea problemi.
Dovrei forse impegnarmi a fare controlli su controlli prima di ottenere
quello che mi occorre.
Una soluzione che per altro non saprei fare (anche se un'idea l'avrei) è
quella che ha suggerito Taipu', ossia compattare il Vettore.
Solo che Taipu' per il momento non mi ha dato ulteriori informazioni.
Quindi se effettivamente riuscissi a pulire il vettore da tutte quelle cose
che sono "0" oppure "",e a scalare gli elementi avrei un dimensionamento da
1 a TOT pulito con tutti gli elementi in ordine e che guarda caso potrei
fare combaciare con le celle Flex.
CellaFlex(1) corrispondente a Fiset(1) e cosi via.
Sarebbe molto meglio :)
Suggeriscimi qualcosa :)
Ciao a presto :)
PAOLO
CIAUZ:)

 devo fare mi da noia.
'Prova questo codice (che NON ho provato), da mettere dopo la somma e prima
della compilazione della griglia
'    Compatto il vettore eliminando gli elementi vuoti (Articolo="")
elementi_eliminati=0
For Pippo=1 to DimensioneRealeRecord
    If fiset(Pippo).Articolo="" Then
        elementi_eliminati=elementi_eliminati+1
        If Pippo<DimensioneRealeRecord Then
            For Pluto=Pippo to DimensioneRealeRecord-1
                fiset(Pluto).Articolo=fiset(Pluto+1).Articolo
                fiset(Pluto).Pezzi=fiset(Pluto+1).Pezzi
                fiset(Pluto).Descrizione=fiset(Pluto+1).Descrizione
            Next Pluto
        End If
    End If
Next Pippo
If elementi_eliminati Then
    DimensioneRealeRecord=DimensioneRealeRecord-elementi_eliminati
    Redim Preserve fiset(1 to DimensioneRealeRecord)
End If