Italian Visualizzazione tabela DB errata

mario53

Member
Licensed User
Longtime User
sto provando a caricare i dati di un DB su una tabella, ecco il risultato in allegato, cosa sbaglio, grazie.
questo il codice:
B4X:
Sub Process_Globals
    Private xui As XUI
    Private fx As JFX
    Private mainform As Form
    Private sql1 As SQL
    Private tbl_tableview As TableView
    
    Private b4xtable1 As B4XTable
    Dim DBFileDir As String
    Dim DBFileName As String            : DBFileName = "db.db"   
    Dim DBTableName As String       
    Dim dataDa,dataA As String
    Private DateTemplate As B4XDateTemplate
End Sub

Sub AppStart (Form1 As Form, Args() As String)
    mainform = Form1
    
    mainform.RootPane.LoadLayout("Layout1") 'Load the layout file.
    
    mainform.Title = "Layout1"
    mainform.Show
    tbl_tableview.Initialize("tbl_tableview")
    mainform.RootPane.AddNode(tbl_tableview, 0, 0, 0, 0) 'values not important
    mainform.RootPane.SetAnchors(tbl_tableview, 0, 0, 0, 0) 'will fill the whole screen


    DateTemplate.Initialize
    DateTemplate.MinYear = 2016
    DateTemplate.MaxYear = 2030
    DBFileName = "db.db"
    DBTableName = "movimenti"
    DBFileDir="c:\temp\prova\"
    dataA=DateTime.Date(DateTemplate.Date)
    dataDa= "01/01/2021"
    

    b4xtable1.Initialize(Me, "B4XTable1")
    
    Try
        'Initialize database
        sql1.InitializeSQLite(DBFileDir,DBFileName, True)
        'sqlstring =  "SELECT * FROM " & DBTableName
        
        b4xtable1.AddColumn("Id", b4xtable1.COLUMN_TYPE_NUMBERS)
        b4xtable1.AddColumn("tavolo", b4xtable1.COLUMN_TYPE_TEXT)
        b4xtable1.AddColumn("codArt", b4xtable1.COLUMN_TYPE_TEXT)
        b4xtable1.AddColumn("prezzo", b4xtable1.COLUMN_TYPE_TEXT)
        b4xtable1.AddColumn("qta", b4xtable1.COLUMN_TYPE_TEXT)
        b4xtable1.AddColumn("dataG", b4xtable1.COLUMN_TYPE_TEXT)
        b4xtable1.AddColumn("flag", b4xtable1.COLUMN_TYPE_TEXT)
        b4xtable1.AddColumn("rifer", b4xtable1.COLUMN_TYPE_TEXT)
        b4xtable1.AddColumn("ora", b4xtable1.COLUMN_TYPE_TEXT)
        b4xtable1.AddColumn("t2", b4xtable1.COLUMN_TYPE_TEXT)
        b4xtable1.AddColumn("uf", b4xtable1.COLUMN_TYPE_TEXT)

        Dim Data As List
        Data.Initialize
        Dim rs As ResultSet = sql1.ExecQuery("SELECT * FROM " & DBTableName)
        Do While rs.NextRow
            Dim row(11) As Object
            row(0) = rs.GetDouble("Id")
            row(1) = rs.GetString("tavolo")
            row(2) = rs.GetString("codArt")
            row(3) = rs.GetString("prezzo")
            row(4) = rs.GetString("qta")
            row(5) = rs.GetString("dataG")
            row(6) = rs.GetString("flag")
            row(7) = rs.GetString("rifer")
            'Some of the values are Null. We need to convert them to empty strings:
            If row(7) = Null Then row(7) = ""
            row(8) = rs.GetString("ora")
            row(9) = rs.GetString("t2")
            row(10) = rs.GetString("ut")
            Data.Add(row)
        Loop
        rs.Close
        ' CreateTableView
        DBUtils.ExecuteTableView(sql1, "SELECT * FROM " & DBTableName, Null, 0, tbl_tableview)
        b4xtable1.SetData(Data)
        b4xtable1.Refresh
        tbl_tableview.Visible=True
        
    Catch
        'When an error occurs the database most probably isn´t there.
        xui.MsgboxAsync("Database cound't be found.", "Db.db")
        
    End Try
End Sub


'Resize the tableview
Sub tbl_tableview_Resize (Width As Double, Height As Double)
    Dim w As Double = (Width - 15) / tbl_tableview.ColumnsCount
    For i = 0 To tbl_tableview.ColumnsCount - 1
        tbl_tableview.SetColumnWidth(i, w)
    Next
End Sub
 

Attachments

  • tabella.JPG
    tabella.JPG
    58 KB · Views: 24

Sagenut

Expert
Licensed User
Longtime User
Premesso che io capisco poco di DB e non ho quasi mai usato quelle Views, però non capisco perchè usi un mix di TableView e B4XTable.
Se ti fosse possibile condividere il progetto, compreso di DB se non è un problema o con un DB simile da testare, forse sarebbe più facile anche per chi è pratico darti una mano.
 

mario53

Member
Licensed User
Longtime User
ho copiato un progetto in questo forum e l'ho adattato ai miei dati.
ho poca esperienza B4j e se ci sono alternative al mix, ben venga.
ecco il progetto
 

Attachments

  • Easy4Sales.b4j.zip
    7.9 KB · Views: 9

Sagenut

Expert
Licensed User
Longtime User
Per esportare correttamente un progetto e renderlo utilizzabile anche per gli altri devi usare questa icona
export.jpg

mentre hai il progetto aperto.
Questo se è un progetto di tipo normale, come questo.
Se fosse un progetto B4XPages, ne parliamo poi così non ti creo confusione.
 

LucaMs

Expert
Licensed User
Longtime User
Gli ho dato un'aggiustata, usando esclusivamente B4XTable.

Approfitto di questa situazione per ricordarvi la mia utilissima libreria lmB4XTableExt che, oltre ad aggiungere una modalità di filtraggio simile a quella di Excel ed altro, vi creerebbe automaticamente le colonne della B4XTable e caricarebbe i dati dalla tabella, semplicemente passandogli il DB ed il nome della tabella (opzionalmente, potete comunque crearle "a mano", nel vostro sorgente, ma vuoi mettere la comodità?). Volendo, quindi sempre opzionalmente, dimensionerebbe anche la larghezza delle colonne in base al loro contenuto.
Insomma, ripeto perché ne sono assolutamente convinto, che è utilissima.
Non è gratuita, anzi il suo prezzo è talmente elevato che se la comprassero due di voi, potrei vivere di rendita per i prossimi 25 anni 😂


[Nota che non ho usato DBUtils, non è necessaria, e che comunque questa è una libreria, non dovresti usare la classe - file .bas - DBUtils. Puoi rimuoverla dal progetto]
 

Attachments

  • lmEasy4Sales.zip
    9.1 KB · Views: 11
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Dimostrazione dell'utilità di lmB4XTableExt (della "sola" parte di creazione delle colonne e caricamento della tabella, non dei filtri ed altro).

Il seguente è il sorgente SENZA lmB4XTableExt:
SENZA lmB4XTableExt:
Sub AppStart (Form1 As Form, Args() As String)
' Qui solite cose per il mainform.
' Qui copia e inizializzazione del DB.

    xtblMovimenti.AddColumn("Id", xtblMovimenti.COLUMN_TYPE_NUMBERS).Width = 50dip
    xtblMovimenti.AddColumn("tavolo", xtblMovimenti.COLUMN_TYPE_TEXT).Width = 50dip
    xtblMovimenti.AddColumn("codArt", xtblMovimenti.COLUMN_TYPE_TEXT).Width = 150dip
    xtblMovimenti.AddColumn("prezzo", xtblMovimenti.COLUMN_TYPE_TEXT).Width = 50dip
    xtblMovimenti.AddColumn("qta", xtblMovimenti.COLUMN_TYPE_TEXT).Width = 50dip
    xtblMovimenti.AddColumn("dataG", xtblMovimenti.COLUMN_TYPE_TEXT).Width = 80dip
    xtblMovimenti.AddColumn("flag", xtblMovimenti.COLUMN_TYPE_TEXT).Width = 30dip
    xtblMovimenti.AddColumn("rifer", xtblMovimenti.COLUMN_TYPE_TEXT).Width = 50dip
    xtblMovimenti.AddColumn("ora", xtblMovimenti.COLUMN_TYPE_TEXT).Width = 70dip
    xtblMovimenti.AddColumn("t2", xtblMovimenti.COLUMN_TYPE_TEXT).Width = 50dip
    xtblMovimenti.AddColumn("uf", xtblMovimenti.COLUMN_TYPE_TEXT).Width = 40dip
 
    FillxtblMovimenti
End Sub

Private Sub FillxtblMovimenti
    Dim lstData As List
    lstData.Initialize
 
    Dim rs As ResultSet = sql1.ExecQuery("SELECT * FROM " & DBTableName)
    Do While rs.NextRow
        Dim row(11) As Object
        row(0) = rs.GetDouble("Id")
        row(1) = rs.GetString("tavolo")
        row(2) = rs.GetString("codArt")
        row(3) = rs.GetString("prezzo")
        row(4) = rs.GetString("qta")
        row(5) = rs.GetString("dataG")
        row(6) = rs.GetString("flag")
        row(7) = rs.GetString("rifer")
        'Some of the values are Null. We need to convert them to empty strings:
        If row(7) = Null Then row(7) = ""
        row(8) = rs.GetString("ora")
        row(9) = rs.GetString("t2")
        row(10) = rs.GetString("ut")
        lstData.Add(row)
    Loop
    rs.Close
    xtblMovimenti.SetData(lstData)
End Sub

Questo, invece, usando lmB4XTableExt:
CON lmB4XTableExt:
Sub AppStart (Form1 As Form, Args() As String)
' Qui solite cose per il mainform.
' Qui copia e inizializzazione del DB.

    B4XTableExt.Initialize(Me, "B4XTableExt", xtblMovimenti, sql1, DBTableName, "", Null, mainform, True)
End Sub

Private Sub xtblMovimenti_DataUpdated
    B4XTableExt.DataUpdated(True)
End Sub
In pratica 2 righe (la Sub xtblMovimenti_DataUpdated fa parte di B4XTable e spesso è necessaria comunque) contro 40, senza contare che sono 40 righe "complicate", soprattutto per i principianti, ma la comodità anche per i professionisti è molto evidente.
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
questo esclude il modulo DBUtils?
Si, puoi togliere quella classe dal progetto. Eventualmente dovesse servire per altro, non usare la classe, che potrebbe essere vecchia, seleziona la libreria.

Allego lo stesso progetto, senza DBUtils e con l'utilizzo di lmB4XTableExt. Vedrai quanto diventi semplicissimo.

Grazie per la donazione, Mario.
 

Attachments

  • lmEasy4Sales_lmB4XTableExt.zip
    7.6 KB · Views: 8

mario53

Member
Licensed User
Longtime User
dopo aver caricato un db sulla B4XTable e fatte tutte modifiche, come si salva il db nuovo che e' caricato su B4XTable.
grazie
 

LucaMs

Expert
Licensed User
Longtime User
dopo aver caricato un db sulla B4XTable e fatte tutte modifiche, come si salva il db nuovo che e' caricato su B4XTable.
grazie
Non facile.

Erel ha creato una classe per rendere "editabili" le celle di una B4XTable, però alla chiusura dell'app (volendo anche prima) salva su file di testo .csv i dati che poi ricarica all'avvio, ovvero non modifica direttamente la tabella DB.

Qui trovi un esempio di come si dovrebbe fare, invece, per modificare la tabella da codice: EDIT: non modifica (e non potrebbe) la tabella DB "associata"; vedi più avanti.
https://www.b4x.com/android/forum/threads/b4xtable-update-a-single-cell.105365/post-660034
Come dice l'autore di quel post, si dovrebbe "mixare" le due cose, ovvero usare (ma anche modificare) la classe di Erel che consente la modifica dal punto di vista grafico ed il codice per l'aggiornamento della tabella, anzichè usare un file di testo "intermedio".

P.S.
No, non semplice. L'esempio del quale ti ho dato il link, in realtà aggiorna il DB temporaneo ed interno della B4XTable (ed anche la GUI), ma non può aggiornare il tuo DB, in quanto B4XTable non è nato per essere associato a tabelle di DB, può contenere dati inseriti in qualunque modo, anche che non abbiano a che fare con dei DB.

Sto "lavorando" (da alcune decine di minuti - e adesso passo ad un buon caffè 😁) ad una modifica del progettino di prova in questo thread in modo da ottenere ciò che ti serve, l'aggiornamento sia della parte grafica che del DB.
Ovviamente lo allegherò.

Chissà che in futuro io non aggiunga queste funzionalità alla mia lmB4XTableExt (per niente semplicissimo, eh).
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
P.S.
No, non semplice. L'esempio del quale ti ho dato il link, in realtà aggiorna il DB temporaneo ed interno della B4XTable (ed anche la GUI), ma non può aggiornare il tuo DB, in quanto B4XTable non è nato per essere associato a tabelle di DB, può contenere dati inseriti in qualunque modo, non è associato a tabelle di DB.

Sto "lavorando" (da alcune decine di minuti - e adesso passo ad un buon caffè 😁) ad una modifica del progettino di prova in questo thread in modo da ottenere ciò che ti serve, l'aggiornamento sia della parte grafica che del DB.
Ovviamente lo allegherò.
Lassiate che me lo dicHI da solo: so' bravino 😂 , perfino stando sveglio di notte!

Come detto, quei consigli permettono soltanto di aggiornare la B4XTable, quindi ottenere che il valore di una cella sia cambiato, ma se si riavvia il progetto, dato che il DB non viene modificato, i dati tornerebbero ad essere quelli iniziali.

Ho modificato il progetto, invece, in modo che anche il DB "associato", il nostro DB reale, venga aggiornato.
Modifica una cella, chiudi e riavvia il progetto, vedrai che le modifiche saranno state salvate.

java_eXfEp5sXXb.gif


Al riavvio:
1735884483187.png
 

Attachments

  • lmEasy4Sales_lmB4XTableExt_Upd.zip
    8.4 KB · Views: 4
Last edited:

mario53

Member
Licensed User
Longtime User
Complimenti, tutto bello forse anche troppo, io chiedevo di modificare i dati in tabella e solo alla fine salvare il risultato nel db.
Adesso lo provo ma penso che il risultato alla fine e' lo stesso.
tutto vale anche per la cancellazione di una riga della tabella?
grazie. (spero di essere stato chiaro...)
 

LucaMs

Expert
Licensed User
Longtime User
Complimenti, tutto bello forse anche troppo, io chiedevo di modificare i dati in tabella e solo alla fine salvare il risultato nel db.
Adesso lo provo ma penso che il risultato alla fine e' lo stesso.
tutto vale anche per la cancellazione di una riga della tabella?
grazie. (spero di essere stato chiaro...)
Beh, per come è fatto adesso, salva subito l'aggiornamento della singola cella (o meglio "campo") nel DB.
Si può anche fare che aggiorni la tabella soltanto dopo la modifica di N celle e su pressione di un tasto, ma ci sarebbe da lavorarci non poco.

Anche per l'eliminazione di un record... se me lo avessi chiesto subito..., servono modifiche, ovviamente.
 

LucaMs

Expert
Licensed User
Longtime User
Volendo fare una cosa "come si deve", si dovrebbe:

  1. Creare il progetto come B4XPages
  2. In una delle pagine, mettere la B4XTable
  3. Lungo-click su una riga, eliminazione record, previa conferma dell'utente
  4. Click unico su una riga, passaggio del record ad una seconda pagina, per la modifica
  5. Click su un tasto "Aggiungi", apertura della pagina di cui al punto precedente, ma per immissione nuovo record.
Vediamo cosa posso fare, perché mi sta venendo la "voglia" (si fa per dire) di riprendere il sorgente di lmB4XTableExt e fargli esporre vari dati circa l'eventuale tabella-db che gli associamo (ricordo che B4XTable non è specifica per gestire tabelle di DB, è fatta per qualunque tipo di dati; è uno dei motivi per cui ho sviluppato lmB4XTableExt, benché il principale fosse poter filtrare i dati in modo simile ad Excel).
Tra l'altro vorrei anche migliorare la view di immissione.

Spero che tu non abbia fretta; "La gatta frettolosa, fece i figli ciechi". Ok, non sono una gatta, però...! 😁
 
Top