Dim Item_Squadra As List
Item_Squadra.Initialize
For i = 0 To Clv_Item_Squadra.Size - 1
Item_Squadra.AddAll(Array As String(Clv_Item_Squadra.GetPanel(i).GetView(0).Getview(0).text))
Log(Item_Squadra.Get(i))' <----- Qui ho tutti i record (item) (valori) della xclv
Next
For Each Item As CLVItem In Clv_Item_Squadra
Item_Squadra.Add(Item.Value)
Next
Dim Item_Squadra As Map
Item_Squadra.Initialize
For i = 0 To Clv_Item_Squadra.Size - 1
Dim Item As CLVItem = Clv_Item_Squadra.GetRawListItem(i)
Item_Squadra.Put(Item.Value, i)
Next
grazie LucaMs, ho usato AddAll perchè ho visto che avevo i valori della lista.1 - Nel caso dovresti usare Add e non AddAll; quest'ultimo serve ad aggiungere alla list più valori con un'unica istruzione ma tu ne aggiungi uno solo (... .text)
2 - Alla fine del ciclo For avresti sì una lista in cui controllare se esistano doppioni ma non sapresti a quali item della CLV si riferiscano.
Vedo che prendi il valore di una View; se questo fosse lo stesso che tu associ ad ogni item nel momento in cui crei quest'ultimo (Clv_Item_Squadra.Add(..., Value), potresti fare, più
Usando una Map anziché una List potresti associare i valori agli indici degli item:
B4X:Dim Item_Squadra As Map Item_Squadra.Initialize For i = 0 To Clv_Item_Squadra.Size - 1 Dim Item As CLVItem = Clv_Item_Squadra.GetRawListItem(i) Item_Squadra.Put(Item.Value, i) Next
For i = 0 To Clv_Item_Squadra.Size - 1
Private Item1 As CLVItem = Clv_Item_Squadra.GetRawListItem(i)
If (i + 1) = (Clv_Item_Squadra.Size - 1) Then
Exit
End If
Private Contatore As Int
For ii = (i + 1) To Clv_Item_Squadra.Size - 1
Private Item2 As CLVItem = Clv_Item_Squadra.GetRawListItem(ii)
If Item2.Value = Item1.Value Then
Contatore = Contatore + 1
' Exit ' ---> se non interessa sapere quante volte è ripetuto basta uscire dal secondo ciclo for e sostituire il log oppure usare un valore boolean etc..
End If
Next
Log($"${Item1.Value} presente ${Contatore} volte"$)
Next
Grazie Elric, ho provato il tuo codice e funziona benissimo. Sarebbe fantastico se potessi prelevare il nome dell'item anche perchè facendo il log (tuo codice)Se ho capito bene, hai un codice che riempie una CLV da database esterno e vuoi controllare se ci sono valori duplicati e, se si, che ti avverta tramite log?
Se la lista non è troppo lunga, un accrocchio a forza bruta potrebbe fare al caso tuo (un ciclo for annidiato dentro un altro ciclo for):
* ATTENZIONE! L'ho scirtto direttamente nell'editor del forum e non l'ho testatoB4X:For i = 0 To Clv_Item_Squadra.Size - 1 Private Item1 As CLVItem = Clv_Item_Squadra.GetRawListItem(i) If (i + 1) = (Clv_Item_Squadra.Size - 1) Then Exit End If Private Contatore As Int For ii = (i + 1) To Clv_Item_Squadra.Size - 1 Private Item2 As CLVItem = Clv_Item_Squadra.GetRawListItem(ii) If Item2.Value = Item1.Value Then Contatore = Contatore + 1 ' Exit ' ---> se non interessa sapere quante volte è ripetuto basta uscire dal secondo ciclo for e sostituire il log oppure usare un valore boolean etc.. End If Next Log($"${Item1.Value} presente ${Contatore} volte"$) Next
Fermo quanto suggerito già da LucaMs, perché non curi la cosa a livello di database esterno con la sintassi MySQL, con un "SELECT count" ad esempio?
Per questo ti ho consigliato di...mi scrive ' 26 presente 2 volte ' . quel 26 come faccio a prelevare il nome dell'item (valore) della xclv?.
Avresti una Map contenente sia i valori ripetuti, sia gli indici degli item.Usando una Map anziché una List potresti associare i valori agli indici degli item:
Item_Squadra.Put(i, Item.Value)Item_Squadra.Put(Item.Value, i)
perché non curi la cosa a livello di database esterno con la sintassi MySQL, con un "SELECT count" ad esempio?
Immagino che ti servano tutti nel DB, non nella CLV, per cui creare una query apposita, per riempire la CLV sarebbe la giusta soluzione.P.s. per quanto riguardo perchè non uso la query di selezione è perchè i dati del DB mi servono tutti.
Type tDuplicato(Value As Int, ItemIndex As Int)
Dim lstDuplicati As List
lstDuplicati.Initialize
For i = 0 To Clv_Item_Squadra.Size - 1
Dim Item As CLVItem = Clv_Item_Squadra.GetRawListItem(i)
Dim Duplicato As tDuplicato
Duplicato.Initialize
Duplicato.Value = Item.Value
Duplicato.ItemIndex = i
lstDuplicati.Add(Duplicato)
Next
lstDuplicati.SortType("Value", True)
' oppure
lstDuplicati.SortType("ItemIndex", True)
Non mi è chiaro se:avvisare (anche per ora con un log) se nella lista esiste un nome
uguale ad un'altro già inserito nella lista.
- vuoi evitare dei duplicati nella lista finale (Item_Squadra?)
Esatto.Per di più, se non capisco male, i tuoi dati viaggiano da DB a xCLV e da questa a lista Item_Squadra. Magari si può intervenire prima per contare o scartare elementi..
E non puoi usare la clausola Distinct nella query che carica i dati per la XCLV1? In questa CLV devi poter avere nomi duplicati?Praticamente faccio una lettura di tutti i record del database sul server.
Questi dati o valori esempio: (Marco) (Fabio) (Andrea) (Maikol) ecc.. vanno su una XCLV1
Da questa XCLV1 scelgo il nome e lo inserisco in un'altra XCLV2
Qui non posso piu' usare la query del database perchè i dati adesso sono sulla XCLV1 che io devo cliccare per selezionare.
Fino alla xclv1 è tutto corretto, cioè ho i dati dal database anche con nomi duplicati.E non puoi usare la clausola Distinct nella query che carica i dati per la XCLV1? In questa CLV devi poter avere nomi duplicati?
Stavo per scrivere una cosa simile.Io utilizzerei un trucchetto , suggerito da @LucaMs creo una mappa , e ogni volta che clicco sulla clv1 prima di aggiungere alla clv2 faccio un if mappa.GetDefault(mario,"non_esiste")="non_esiste" then aggiungo
E mentre aggiungi popoli anche la mappa
If lstInseriti.IndexOf(NomeClickato) = - 1 Then 'non ancora inserito
lstInseriti.Add(NomeClickato)
' qui crei l'item e lo aggiungi alla XCLV2
Else
'Messaggio
End If
Prego. Il perché ti ritrovi "26" invece che "Marco" o "Salernitana" lo puoi sapere solo tu.Grazie Elric, ho provato il tuo codice e funziona benissimo. Sarebbe fantastico se potessi prelevare il nome dell'item anche perchè facendo il log (tuo codice)
mi scrive ' 26 presente 2 volte ' . quel 26 come faccio a prelevare il nome dell'item (valore) della xclv?. ma anche con il codice che hai postato sono mooolto avanti grazie.
P.s. per quanto riguardo perchè non uso la query di selezione è perchè i dati del DB mi servono tutti.Poi c'è una funzione che li mette in questa lista e da questa li controllo. Funziona tutto tranne la parte che non capivo (non sapevo) che hai postato tu. grazie mille
Item1.TextItem
Item1.Value
Uso B4XPages Android. Progetto complesso. Allegherò un esempio in B4J della parte interessata per avere l'idea del problemino(mio)né indicato se usi B4A, B4J o B4i (o B4XPages)
Interessante, farò una provaAd esempio:
1. Popoli la CLV1 dal DB remoto, estrai il valore che ti interessa dalla CLV1 in una variabile, crei una query che seleziona/estrae dal db remoto con un filtro basato sulla variabile e inserisci tutto nella CLV2. Lo trovo macchinoso ma potrebbe fare al caso tuo.
non ho ancora capito, forse è l'id del record del database, indagheròIl perché ti ritrovi "26" invece che "Marco" o "Salernitana" lo puoi sapere solo tu.
TextItem è di tipo Boolean. Infatti mi logga ' False presente 2 volte 'Hai provato con
invece che conB4X:Item1.TextItem
?B4X:Item1.Value
Grazie SagenutLa soluzione te l'aveva già scritta @LucaMs (insieme agli altri)
Vedi se quì la trovi funzionale.
In pratica Pulisco la List dopo che hai inserito tutto nella CLV1 (immagino che poi l'inserimento sarà fatto tramite lettura da DB e quindi ora sia un Accessorio).
Dopodichè inizio a ripopolare la List insieme alla CLV2 per poter verificare se il nome è già presente.
Se invece non ho capito una mazza............... allora mi scuso.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?