Italian [B4A][RISOLTO] Come posso prendere i dati con ItemClick da CustomListView collegata a Database SQL

Sagenut

Expert
Licensed User
Longtime User
@Filippo non ti fare sempre desiderare!
Intervieni prima! 🤣 🤣 🤣
 

Sagenut

Expert
Licensed User
Longtime User
Ma voi a parte anni di esperienza (che vogliono dire tanto), come avete imparato tutte queste cose?
Qualche esperienza con altri linguaggi (sempre base Basic).
Ma io lo faccio come passatempo quindi ho tantissimo da imparare come te.
Io al momento ho fatto 2 corsi di B4A su Udemy che mi hanno dato le basi e insegnato come muovermi, ma partivo da zero e vedo che tante cose sono ancora arabo per me e non so se riuscirò da solo ad andare fino in fondo a questo progetto. Un corso sul linguaggio Basic potrebbe aiutare?
Hai fatto benissimo a fare i corsi.
Tante cose che ora sono Arabo diventeranno più chiare a mano a mano che chiarisci alcuni concetti di base che poi tenderanno a ripetersi.
L'importante è che quando trovi, o ti forniscono, codice che funziona e risolve una tua necessità tu non ti limiti a copiarlo e basta.
Devi prenderti il tempo di capire perchè quella cosa funziona così.
Poi si può arrivare ad uno stesso risultato in maniere diverse, che quindi sono tutte giuste fondamentalmente ma ce ne saranno sempre alcune migliori in termini di velocità o semplicità del codice.
C'è sempre tempo per mettere mano anche a vecchi codici quando impari nuove istruzioni e metodi.
Un corso di Basic potrebbe anche esserti utile ma al momento puoi cercare/studiare quel che ti serve volta per volta e capirlo.
Il tuo progetto in qualche modo lo finirai, poi lo migliorerai.
Ma non devi avere fretta e non ridurti solo a copiare e incollare codice.
 

3uowiS

Active Member
Licensed User
io penso che così dovrebbe funzionare.
B4X:
xclv.Add(p, rs.getstring("ID"))

Private Sub xclv_ItemLongClick (Index As Int, Value As Object)
    cur = Starter.sqlPlayers.ExecQuery("Select Gen, Pos1, Pos2 from PLAYERS WHERE ID='"& Value & "'")
    Log(cur.GetString("Pos1"))
    Gen = rs.GetInt("Gen")
    Pos1 = cur.GetString("Pos1")
    Pos2 = cur.GetString("Pos2")
End Sub
@Filippo grazie, ma purtroppo mi crasha al primo CurGetString con questo errore: "android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1" Sai a cosa si riferisce?

Questo è il codice che ho: (cur è dichiarato in Globals)
B4X:
Private Sub xclv_ItemLongClick (Index As Int, Value As Object)
    
    Dim Gen As Int
    Dim Pos1 As String
    Dim Pos2 As String
    
    cur = Starter.sqlPlayers.ExecQuery("Select GEN, Pos1, Pos2 from PLAYERS WHERE ID='"& Value & "'")

    Pos1 = cur.GetString("Pos1")
    Pos2 = cur.GetString("Pos2")
    Gen = cur.GetInt("GEN")
    
    id = Value
    
    Log(id)
    Log(Pos1)
    Log(Pos2)
    Log(Gen)

End Sub
 

3uowiS

Active Member
Licensed User
Qualche esperienza con altri linguaggi (sempre base Basic).
Ma io lo faccio come passatempo quindi ho tantissimo da imparare come te.

Hai fatto benissimo a fare i corsi.
Tante cose che ora sono Arabo diventeranno più chiare a mano a mano che chiarisci alcuni concetti di base che poi tenderanno a ripetersi.
L'importante è che quando trovi, o ti forniscono, codice che funziona e risolve una tua necessità tu non ti limiti a copiarlo e basta.
Devi prenderti il tempo di capire perchè quella cosa funziona così.
Poi si può arrivare ad uno stesso risultato in maniere diverse, che quindi sono tutte giuste fondamentalmente ma ce ne saranno sempre alcune migliori in termini di velocità o semplicità del codice.
C'è sempre tempo per mettere mano anche a vecchi codici quando impari nuove istruzioni e metodi.
Un corso di Basic potrebbe anche esserti utile ma al momento puoi cercare/studiare quel che ti serve volta per volta e capirlo.
Il tuo progetto in qualche modo lo finirai, poi lo migliorerai.
Ma non devi avere fretta e non ridurti solo a copiare e incollare codice.
Grazie mille per i consigli @Sagenut! Sono preziosi! Si, per come sono fatto io non mi limito a copiare il codice, considera che quando chiedo aiuto qui solitamente sono già stato diverso tempo a batterci la testa proprio per cercare di capirne il meccanismo e arrivare alla soluzione da solo.
Spero di riuscire davvero a portare a termine questo progetto, anche se ci volessero mesi e mesi perché ci tengo molto, ma sono anche consapevole che sia un app abbastanza complessa da realizzare. Quindi via via mi vedrete sicuramente chiedere altre cose. 😅
 
D

Deleted member 103

Guest
@Filippo grazie, ma purtroppo mi crasha al primo CurGetString con questo errore: "android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1" Sai a cosa si riferisce?
metti un log(Value) prima della riga
B4X:
cur = Starter.sqlPlayers.ExecQuery("Select GEN, Pos1, Pos2 from PLAYERS WHERE ID='"& Value & "'")
e guarda qual'è il valore. Se è -1, allora l'errore ci stà.
 

3uowiS

Active Member
Licensed User
metti un log(Value) prima della riga
B4X:
cur = Starter.sqlPlayers.ExecQuery("Select GEN, Pos1, Pos2 from PLAYERS WHERE ID='"& Value & "'")
e guarda qual'è il valore. Se è -1, allora l'errore ci stà.
Avevo già provato, ma con Value mi da l'ID che è alfanumerico (ad esempio: "BealBr1"). Ho provato anche a mettere il log di Index e mi da un numero che corrisponde al numero della riga (ad esempio 5 che è la sesta riga) ma di -1 non ne ho.
 
D

Deleted member 103

Guest
qual'è il valore di quello che inserisci qui?
log(rs.getstring("ID"))
B4X:
xclv.Add(p, rs.getstring("ID"))
se questo corrisponde ad es. a "BealBr1", allora non può funzionare.
 

3uowiS

Active Member
Licensed User
qual'è il valore di quello che inserisci qui?
log(rs.getstring("ID"))
B4X:
xclv.Add(p, rs.getstring("ID"))
se questo corrisponde ad es. a "BealBr1", allora non può funzionare.
Si esatto, è una string e corrisponde ad un codice alfanumerico come quello. Perché non può funzionare? cur funziona solo con i numeri? E se uso rs è lo stesso?
 

Sagenut

Expert
Licensed User
Longtime User
Resta il fatto che non capisco perchè non ti abbia funzionato il pezzo di codice
B4X:
Sub xclv_ItemClick (Index As Int, Value As Object)
    Dim PlayerName As String = xclv.GetPanel(Index).GetView(0).Text
    Dim Pos1 As String = xclv.GetPanel(Index).GetView(1).Text
    Dim Pos2 As String = xclv.GetPanel(Index).GetView(2).Text
    Dim Team As String = xclv.GetPanel(Index).GetView(3).Text
    Dim GEN As String = xclv.GetPanel(Index).GetView(4).Text
End Sub
visto che ti trovi bene passando l'ID come Value della CLV.
Ti posto un piccolo esempio di quel pezzo di codice che non ti funziona, magari ti aiuta a capire cosa ti manca.
 

Attachments

  • CLV_Click.zip
    10.7 KB · Views: 161

Sagenut

Expert
Licensed User
Longtime User
Si, ma avevo solo inserito i codice che mi avevi dato
B4X:
Dim Pos1 As String = xclv.GetPanel(Index).GetView(3).Text
Dim Pos2 As String = xclv.GetPanel(Index).GetView(4).Text
Dim GEN As String = xclv.GetPanel(Index).GetView(5).Text
Domanda:
il tuo layout degli item della CLV contiene solo le 5 Label e niente altro?
 

3uowiS

Active Member
Licensed User
Domanda:
il tuo layout degli item della CLV contiene solo le 5 Label e niente altro?
Il layout contiene un panel che contiene le 5 label + 1 altro panel che uso da divisorio tra una riga e l'altra. Ho allegato uno screen.
Grazie ancora ragazzi per l'aiuto che mi date!!! 🙏
 

Attachments

  • Senza titolo-2.jpg
    Senza titolo-2.jpg
    118.2 KB · Views: 172

Sagenut

Expert
Licensed User
Longtime User
Non sò bene il tuo scopo e il loro utilizzo............. però credo che i 2 Panel dal Layout li puoi rimuovere, se non hanno un ruolo specifico.
Il panel di base lo crei già nella Sub dove popoli la CLV
B4X:
Dim p As B4XView = xui.CreatePanel("")
L altro panel sembra che tu lo voglia usare per avere una linea colorata per dividere gli Item.
Se guardi nelle proprietà della CLV nel Designer vedrai che ci sono già
Divider Color
Divider Height
che ti permettono di personalizzare una linea divisoria già compresa nella CLV.
Ho indovinato? :)
Se invece vuoi mantenere i tuoi Panel perchè ti servono puoi accedere alle Label così:
B4X:
dim s as String = xclv.GetPanel(index).GetView(0).Getview(0).text
Perchè:
xclv.GetPanel(index) --- Prende il panel dell'Item dalla CLV
.GetView(0) --- Prende il tuo pnlplayer che è la prima view ed è il contenitore di tutte le altre così come lo hai usato
.GetView(0) --- Prende la prima Label contenuta nel tuo pnlplayer.
Essendo un contenitore extra ha di nuovo la sua lista di view che riparte da 0.
 
Last edited:

udg

Expert
Licensed User
Longtime User
Anche lasciando il layout inalterato può funzionare senza problemi. l'unica accortezza è la lettura del primo panel da cui far dipendere le altre.
Es.
B4X:
dim p as panel = xclv.GetPanel(Index).GetView(0)
dim pnlPlayer as panel = p.getview(0)
dim Pos1 As String = pnlPlayer .getview(2).text
..
Risolto questo punto, io passerei ad utilizzare B4xView in modo da non essere confinato ad una specifica piattaforma.
Darei un'occhiata anche alle Anchors del layout (es. lblGen a dx, lblName su both, così come pnlPlayer)

ps: come Value potresti passare una map che contenga già tutti i valori che ti interessano ed evitare di accedere di nuovo al DB oppure ai valori del panel della xCLV che potrebbero essere parziali (nel senso che sono solo quelli che mostri ma potresti avere altri campi cui sei interessato).

pps: sembra che il pranzo sia pronto..vado.. :)
 

Sagenut

Expert
Licensed User
Longtime User
Risolto questo punto, io passerei ad utilizzare B4xView in modo da non essere confinato ad una specifica piattaforma.
Assolutamente sì
 

3uowiS

Active Member
Licensed User
Non sò bene il tuo scopo e il loro utilizzo............. però credo che i 2 Panel dal Layout li puoi rimuovere, se non hanno un ruolo specifico.
Il panel di base lo crei già nella Sub dove popoli la CLV
B4X:
Dim p As B4XView = xui.CreatePanel("")
Si, so che lo avevo già creato con quella riga di codice ma non riuscivo a farlo adattare allo schermo, così ho creato quel panel in modo da farlo adattare a tutti gli schermi con lo script e poi l'ho usato come riferimento in questa riga
B4X:
p.SetLayoutAnimated(0,0,0,pnlPlayer.Width,pnlPlayer.Height)
probabilmente c'era un altro modo, meno contorto ma non sono riuscito a trovarlo... 😅

L altro panel sembra che tu lo voglia usare per avere una linea colorata per dividere gli Item.
Se guardi nelle proprietà della CLV nel Designer vedrai che ci sono già
Divider Color
Divider Height
che ti permettono di personalizzare una linea divisoria già compresa nella CLV.
Ho indovinato? :)
Esatto 😁 Non sapevo che esistesse anche quel metodo, grazie per l'informazione, come sempre preziosa! Ma quella linea l'ho fatta come gradiente che sfuma da nero a trasparente che è più delicata e mi sembra che tramite quelle impostazioni non si possa.

Se invece vuoi mantenere i tuoi Panel perchè ti servono puoi accedere alle Label così:
B4X:

dim s as String = xclv.GetPanel(index).GetView(0).Getview(0).text
Perchè:
xclv.GetPanel(index) --- Prende il panel dell'Item dalla CLV
.GetView(0) --- Prende il tuo pnlplayer che è la prima view ed è il contenitore di tutte le altre così come lo hai usato
.GetView(0) --- Prende la prima Label contenuta nel tuo pnlplayer.
Essendo un contenitore extra ha di nuovo la sua lista di view che riparte da 0.
Grandissimo @Sagenut!!! 💪💪 Così ci sono riuscito a prendere tutti i dati che volevo!!! 🥳🥳🥳
Grazie mille davvero!!!
 
Last edited:

3uowiS

Active Member
Licensed User
Risolto questo punto, io passerei ad utilizzare B4xView in modo da non essere confinato ad una specifica piattaforma.
Darei un'occhiata anche alle Anchors del layout (es. lblGen a dx, lblName su both, così come pnlPlayer)
Grazie @udg! Nella mia ignoranza credevo di averlo fatto... Non sto già usando B4xView? Dove sbaglio?
E le Anchors non le ho usate perché ho usato lo script. Pensavo fosse meglio...non va bene?

ps: come Value potresti passare una map che contenga già tutti i valori che ti interessano ed evitare di accedere di nuovo al DB oppure ai valori del panel della xCLV che potrebbero essere parziali (nel senso che sono solo quelli che mostri ma potresti avere altri campi cui sei interessato).
Ecco, sicuramente sarebbe meglio, ma non ho idea di come si faccia una map... 😅 Dove posso trovare info su come fare?
 

Sagenut

Expert
Licensed User
Longtime User
Dove posso trovare info su come fare?
Trovi praticamente qualunque informazione, spesso con esempi, con la ricerca del forum che funziona decisamente bene. ;)
Ti è stata fornita l'idea di cosa fare.............. ora come Esercizio prova a risolvere da solo. :)
Ma non buttare il codice che in questo momento hai e funziona, altrimenti rischi di bloccare lo sviluppo della tua app.
Poi c'è sempre tempo per fare domande se ciò che trovi non è chiaro o non riesci a farlo funzionare.
Dato che l'argomento della domanda di questa discussione è stato risolto dovrai aprire una nuova discussione con la nuova domanda, tipo:
Come ci crea e si usa una Map?
Ma prima cerca se trovi altre discussioni con la stessa domanda e relative risposte.
Ogni discussione deve/dovrebbe contenere solo una domanda specifica e le relative risposte, per non disperdere le informazioni e facilitare le ricerche successive.
E' il regolamento del forum.

P.S.= modifica il titolo della discussione aggiungendo all'inizio [B4A][RISOLTO] così chi cerca saprà che in questa discussione c'è una soluzione che funziona.
E nelle prossime domande, quì sul forum Italiano, metti sempre il linguaggio che stai usando relativo alla domanda come [B4A] [B4J] [B4i].
 
Last edited:

udg

Expert
Licensed User
Longtime User
Dove posso trovare info su come fare?
La risposta più semplice è quella di cercare sul forum (cerca "map" e vedrai le tonnellate di risposte..heheh)
La base è che una map è una specie di lista che contiene coppie chiave-valore (e le chiavi sono univoche)
Quindi qualcosa tipo
B4X:
dim m as map
m.initialize
m.put("key1", "valore1")
Nel tuo caso le chiavi potrebbero essere "gen", pos1", "pos2", ciascuna con il suo valore (che è un object e quindi ci metti quello che ti pare)
Se ti occorre, aggiungi anche una chiave "id" e memorizzi l'ID univoco che hai sul DB per quel record da cui hai estratto quei valori

Come vedi è uno strumento molto flessibile.
Una volta che ti sarai impratichito con le map, tenta quelle che io chiamo LOM (List of Maps); in pratica ogni elemento della List è una Map. Un possibile utilizzo è la memorizzazione di una serie di record ritornati da una query. Ogni record ha i suoi valori in una Map e la List rappresenta l'intero set di record della risposta.

Anchors-Script: guarda i video di Erel (sezione Learn). La risposta breve è che le Anchors sono preferibili

B4xView: non è automatico. Tocca a te scrivere dim l1 as B4xView invece che dim l1 as label. In pratica ricorri al tipo base (label) solo quando ti occorre qualche sua proprietà o metodo non disponibile utilizzando la B4xView.

Edit: non solo @Sagenut mi ha anticipato, ma ha anche ricordato la regola d'oro: un thread (con titolo significativo) un argomento. Serve per facilitare la ricerca ad altri interessati al medesimo argomento.
 
Top