Italian Lavorare con le variabili =List e Objects Estrapolare i dati

simone77gl

Member
Licensed User
Salve non sono molto esperto in programmazione di seguito posto parte del mio programma:
programma che ricavo un objects:
Sub ListAnimals As ResumableSub
    Wait For (Connect) Complete (Success As Boolean)
    If Success Then
 
        Try
            Dim sf As Object = mysql.ExecQueryAsync("mysql", "SELECT id, data FROM sensore2 WHERE id>26135  ORDER BY id DESC ",Null)
            Wait For (sf) mysql_QueryComplete (Success As Boolean, Crsr As JdbcResultSet)
            If Success Then
                'Log(sf)
                Data.Initialize
                Dim list1 As List
                list1.Initialize
                Do While Crsr.NextRow
                    'Log(Crsr)
                 
                 
                 
                    Dim row(2) As Object
                    'Log($"Id: ${Crsr.GetString("id")} --data: ${Crsr.GetString("data")}"$)
                    'Log(Crsr.GetInt("id"))
                    row(0) = Crsr.GetInt("id")
                    row(1) = Crsr.GetString("data")
                    list1.Add(row)        
                 
                Loop
                Crsr.Close
                 
            End If
        Catch
            Success = False
            Log(LastException)
        End Try
        CloseConnection
    End If
    Return Success
End Sub

Quello che non riesco e come estrapolare i dati dalla variabile
.
E non trovo documentazione chiara per me in merito agli
Grazie.
 

drgottjr

Expert
Licensed User
Longtime User
B4X:
               Type Mytype(field1 as int, field2 as string)

...
                Do While Crsr.NextRow
                    'Log(Crsr)
                 
                 
                 
                    Dim thisrow As Mytype
                    'Log($"Id: ${Crsr.GetString("id")} --data: ${Crsr.GetString("data")}"$)
                    'Log(Crsr.GetInt("id"))

                     thisrow.field1 = Crsr.GetInt("id")
                     thisrow.field2 = Crsr.GetString("data")
                     list1.Add(row)        
                loop

dopo:

                 dim i as int
                 for i = 0 to list1.size - 1
                    dim thisrow as Mytype
                    thisrow = list1.get(i)
                    log("for this row: " & thisrow.field1 & " " & thisrow.field2)
                next
 

LucaMs

Expert
Licensed User
Longtime User
E non trovo documentazione chiara per me in merito agli Object

Object è un tipo, generico, che può contentere qualunque valore e non è specifico di B4A (B4J, B4I, B4R, B4X).
Ad esempio, Int, String, Double, etc. sono Tipi. Mentre se ho una variabile X di tipo Int non posso assegnargli il valore "abc", se la variabile fosse stata dichiarata di tipo Object potrebbe contenere sia numeri interi (Int), sia testo (String), sia numeri decimali (Double) e qualunque altro valore, compresi interi Array, List, Map, etc.
https://www.html.it/guide/guida-programmazione-orientata-agli-oggetti/
 

drgottjr

Expert
Licensed User
Longtime User
un list può contenere qualsiasi tipo di cosa senza dichiare niente in anticipo
ad es:

list1.add( int )
list1.add( string )
list1.add( float )
list1.add( int() )
ecc...
infatti quello che hai fatto

tutto legale. ma il problema e che non ci sono maniere di leggere il list senza sapere que prima viene un int, e dopo una stringa, e dopo un float, ecc...

nel tuo caso, è possibile fare:
list1.add( int )
list2.add( stringa )
ma, per leggere il list, hai bisogno di fare cosi:

dim i, thisint as int
dim thisstring as string

for i = 0 to list1.size - 1
if i mod 2 = 0 then
thisint = listi.get(i)
else
thisstring = list1.get(i)
end if
next

o sia, se "i" è pari, list1.get(i) si tratta di un int, e si "i" è dispare, list1.get(i) si tratta de una stringa. no?
ma questo non è consigliato, e nel tuo caso, è piu facile, creare un "tipo" composto da un int e una stringa (come un tipo di record)
 

simone77gl

Member
Licensed User
Riassumendo invece di una lista creo un object.
Inserisco i 2 dati row nel object.add(row)
E poi cerco i dati nel object.
Spero di capire come fare con il link di Lucas.
Grazie.
 

ivanomonti

Expert
Licensed User
Longtime User
la list è un contenitore di oggetti, quindi ci puoi mettere di tutto, io la uso molto e la trovo molto funzionale

B4X:
dim ls as list
ls.initialize

una volta initializzata puoi scriverci dentro (vedila come una cassettiera, nel cassetto uno ci metti oggetti singoli o altri insieme di oggetti, ma la faccio semplice.

B4X:
ls.add("ciao")
ls.add("ragazzo")
ls.add(button1)

Ora per riprendere ii valori nel suo interno e molto semplice

B4X:
dim bt as button = ls.get(2)

se devi prendere solo i dati per un messaggio "ciao ragazzo" allora puoi fare così

B4X:
fx.msgbox(mainform,ls.get(0) & " " & ls.get(1),"test")

Ma ricordati che se la lista la dichiari dentro una sub, quando essa finisce la lista muore e perdi i dati, se la listala devi passare ovunque o in sezioni diverse allora puoi fare in 2 modi

1) la dichiari pubblica in process global
2) la memorizzi nel oggetto Tag di ogni singolo oggetto e la richiami quando ti serve,,esempio

B4X:
Sub im_MouseClicked (EventData As MouseEvent)
    Dim  imTemp As Button = Sender
    Dim value As List = imTemp.Tag
    bla bla bla
End Sub

Spero di averti dato un sostegno, ricordati di mettere nel titolo il suffisso B4J - B4A ....
 

LucaMs

Expert
Licensed User
Longtime User
Ok, ho guardato il listato.

Si tratta di record di database. Un metodo semplice ed efficiente sarebbe:

1 - creare un Type (tipo personalizzato) che rappresenti il record; ad esempio: Type tRecord(Id As String, Data As String) <--- come nel tuo listato.

2 - creare una Map che contenga tutti i record:
B4X:
Sub Process_Globals
   Dim mapRecords As Map

Sub Activity_Create
    mapRecords.Initialize
All'interno del ciclo di lettura dei record:
Do While Crsr.NextRow
metteresti:
B4X:
Dim Record As tRecord
Record.Initialize
Record.ID = Crsr.GetString("id")
Record.Data = Crsr.GetString("data")
mapRecords.Put(Record.Id, Record)

Nota che ho messo tutto il record come valore (secondo parametro) nella Map, e non il solo valore di data letto. In questo modo, se tu avessi più campi nella tabella...!

Per ottenere un record in base all'id:
B4X:
Dim Record As tRecord
Record = mapRecords.Get("b") ' <--- hai usato un id stringa, la butto là
log(Record.Id & CRLF & Record.Data)

Potrai anche scorrere tutta la mapRecords, per leggere tutte le "chiavi della Map (Keys)" che nel tuo caso saranno gli ID dei record e/o i "valori della Map (Values)", che nel tuo caso saranno i record veri e propri.

Leggi la documentazione (suppongo ci siano molte informazioni) riguardo le Map, sono utilissime.


P.S. Già che ci sono...:
B4X:
For Each Record As tRecord in mapRecords.Values
    log(Record.Id & TAB & Record.Data)
Next
 
Last edited:

simone77gl

Member
Licensed User
Quello che voglio fare e:
Prendere i dati da un database e caricarli nel seguente modo:
1 riga "codice" "modello" "dato1" "dato2"
Dopo per ogni riga
Poi prelevare"modello" "dato2"

Per quello che ho capito usando un object che ingloba un un object per riga che contiene i dati.
Come si fa a prelevare i dati dal object?
Grazie per l'aiuto che mi state offrendo.
 

LucaMs

Expert
Licensed User
Longtime User
Quello che voglio fare e:
Prendere i dati da un database e caricarli nel seguente modo:
1 riga "codice" "modello" "dato1" "dato2"
Dopo per ogni riga
Poi prelevare"modello" "dato2"

Per quello che ho capito usando un object che ingloba un un object per riga che contiene i dati.
Come si fa a prelevare i dati dal object?
Grazie per l'aiuto che mi state offrendo.
Come ti ho scritto, solo che anziché:
1 - creare un Type (tipo personalizzato) che rappresenti il record; ad esempio: Type tRecord(Id As String, Data As String) <--- come nel tuo listato.
avrai:
Type tRecord(Codice As String, Modello As String, Dato1 As QuelloCheTePare, Dato2 As SempreQuelloCheTePare)

Se segui quello che ho scritto nel mio post precedente, basterà aggiungere i vari campi.
 

simone77gl

Member
Licensed User
Grazie mi era sfuggito l'ultimo post
Appena ho un po di tempo proverò
Mi sembra molto chiaro il tuo metodo
Grazie Buona Pasqua
 

drgottjr

Expert
Licensed User
Longtime User
cual'è venuto prima: la gallina o l'uovo?
 

Sagenut

Expert
Licensed User
Longtime User
Quando metto quella variabile Process_Globals del Main.
mi dice che mi manca una libreria.
Hai creato il TYPE di riferimento?
Esempio
B4X:
Type trecord (valore as int, testo as string)
Chiaramente dovrai strutturare il TYPE secondo le tue necessità.
 

simone77gl

Member
Licensed User
Risolto Grazie.
Ma il problema di base
Mi mancano molte info a riguardo map e object dome mi consigliate di studiare?
Grazie
 

LucaMs

Expert
Licensed User
Longtime User
Maps:
https://www.b4x.com/android/forum/threads/b4x-documentation-booklets.88985/

Objects:
1586970856659.png

Terzo post di questo thread.
 
Top