Italian A picca a picca.... Quasi ci siamo.

fifiddu70

Well-Known Member
Licensed User
Longtime User
Carissimi Buonasera a tutti, a via di fare varie prove con questo codice che posto qui sotto
sono riuscito a riempire la listview da un documento di testo così composto:

PRECONTO N 2 - 17/05/2025 - ORE:13.15
Operatore: Anonimo-Tavolo: 12
1:pizza Nutella -Euro 6.50
1:pizza Filippo -Euro 8.00
Note:
TOTALE EURO: 6.50
STANZA:

B4X:
Dim lines As List
    lines = File.ReadList(File.DirInternal, txttavolopreconto.Text & ".txt" )
    lswordine2.Clear
    lswordine2.SingleLineLayout.Label.TextSize = 14
    lswordine2.SingleLineLayout.Label.Height = 20dip
    lswordine2.SingleLineLayout.ItemHeight = 70
    lswordine2.SingleLineLayout.Label.TextColor = xui.Color_Black

    For Each line As String In lines
        If line.Trim.Length > 0 Then ' Skip empty lines
            lswordine2.AddSingleLine(line.Trim)
           
            Log(line)
        End If
    Next

quindi ora la mia domanda umile e la seguente:
come faccio a far visualizzare nella listview solo quello che c'è nel mezzo e quindi solo i due prodotti?
praticamente la listview dovrebbe essere composta così:

1:pizza Nutella -Euro 6.50
1:pizza Filippo -Euro 8.00

e possibilmente riuscire ad inserire in una casella di testo solo l'importo totale della comanda.
pensate che potete aiutarmi a risolvere questo enigma per me immenso?
grazie in anticipo.
 

LucaMs

Expert
Licensed User
Longtime User
Se la struttura del "documento" è sempre e certamente quella, è semplice.

A parte il fatto che si potrebbe usare Regex (e per farlo facilmente, basterebbe farlo fare a ChatGPT), ti basta:

  1. Eliminare subito le righe vuote
  2. trovare gli indici delle righe che iniziano con "Operatore" (IndiceOperatore) e "Note" (IndiceNote)
  3. prelevare l'importo dalle righe i cui indici siano tra IndiceOperatore +1 e IndiceNote - 1 (userai SubString + IndexOf per farlo)
  4. anche per il totale, userai SubString + IndexOf anche per questo.
P.S. E' molto più semplice di quanto ho scritto sopra!
Ti basta prelevare tutte le righe che contengono il testo "Euro"; l'ultima sarà quella del totale.
Tra poco aggiungerò qui il codice per farlo.

B4X:
Private Sub Esegui
    Dim lstRighe As List
    lstRighe = File.ReadList(File.DirAssets, "Comanda.txt")
    Dim lstImporti As List
    lstImporti.Initialize
    
    Dim RigaCorrente As String
    For i = 0 To lstRighe.Size - 1
        RigaCorrente = lstRighe.Get(i)
        If RigaCorrente.ToUpperCase.IndexOf("EURO") > 0 Then
            lstImporti.Add(RigaCorrente)
        End If
    Next
    
    lvPortate.Items.Clear
    For i = 0 To lstImporti.Size - 2
        Log(lstImporti.Get(i))
        lvPortate.Items.Add(lstImporti.Get(i))
    Next
    Log(" ")
    
    Dim Totale As Double
    RigaCorrente = lstImporti.Get(lstImporti.Size - 1)
    Log(RigaCorrente)
    Totale = RigaCorrente.SubString(RigaCorrente.ToUpperCase.IndexOf("EURO") + 5)
    tfTotale.Text = NumberFormat2(Totale, 1, 2, 2, True)
End Sub
 
Last edited:

Xfood

Expert
Licensed User
Se la struttura del "documento" è sempre e certamente quella, è semplice.

A parte il fatto che si potrebbe usare Regex (e per farlo facilmente, basterebbe farlo fare a ChatGPT), ti basta:

  1. Eliminare subito le righe vuote
  2. trovare gli indici delle righe che iniziano con "Operatore" (IndiceOperatore) e "Note" (IndiceNote)
  3. prelevare l'importo dalle righe i cui indici siano tra IndiceOperatore +1 e IndiceNote - 1 (userai SubString + IndexOf per farlo)
  4. anche per il totale, userai SubString + IndexOf anche per questo.
P.S. E' molto più semplice di quanto ho scritto sopra!
Ti basta prelevare tutte le righe che contengono il testo "Euro"; l'ultima sarà quella del totale.
Tra poco aggiungerò qui il codice per farlo.

B4X:
Private Sub Esegui
    Dim lstRighe As List
    lstRighe = File.ReadList(File.DirAssets, "Comanda.txt")
    Dim lstImporti As List
    lstImporti.Initialize
   
    Dim RigaCorrente As String
    For i = 0 To lstRighe.Size - 1
        RigaCorrente = lstRighe.Get(i)
        If RigaCorrente.ToUpperCase.IndexOf("EURO") > 0 Then
            lstImporti.Add(RigaCorrente)
        End If
    Next
   
    lvPortate.Items.Clear
    For i = 0 To lstImporti.Size - 2
        Log(lstImporti.Get(i))
        lvPortate.Items.Add(lstImporti.Get(i))
    Next
    Log(" ")
   
    Dim Totale As Double
    RigaCorrente = lstImporti.Get(lstImporti.Size - 1)
    Log(RigaCorrente)
    Totale = RigaCorrente.SubString(RigaCorrente.ToUpperCase.IndexOf("EURO") + 5)
    tfTotale.Text = NumberFormat2(Totale, 1, 2, 2, True)
End Sub
Se la struttura e' sempre la stessa, meglio cercare allora -Euro
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Sapete una cosa..... sono riuscito grazie a voi ma poi mi sono trovato in altre problematiche, e sono 4 giorni che ci sbatto la testa per sistemare un problema che per me è davvero grande non avendo molta dimestichezza con la programmazione, praticamente questo software ormai ospita 20 mila righe di codice ingarbugliate, il software funziona per carità ma molto limitato in alcune cose, ad esempio non sono riuscito a fare una semplice operazione: una volta inviata la comanda il tavolo diventa rosso e se però vogliono cambiare tavolo devo: chiudere il tavolo e rifare la comanda in un'altro tavolo, sarebbe bello invece poterlo fare, un giorno mi sa che dovrò rifarne uno nuovo con librerie e view più avanzate per una migliore fruibilità e funzionalità, nel frattempo vediamo come posso sistemare alcuni piccoli problemini.
 

LucaMs

Expert
Licensed User
Longtime User
Sapete una cosa..... sono riuscito grazie a voi ma poi mi sono trovato in altre problematiche, e sono 4 giorni che ci sbatto la testa per sistemare un problema che per me è davvero grande non avendo molta dimestichezza con la programmazione, praticamente questo software ormai ospita 20 mila righe di codice ingarbugliate, il software funziona per carità ma molto limitato in alcune cose, ad esempio non sono riuscito a fare una semplice operazione: una volta inviata la comanda il tavolo diventa rosso e se però vogliono cambiare tavolo devo: chiudere il tavolo e rifare la comanda in un'altro tavolo, sarebbe bello invece poterlo fare, un giorno mi sa che dovrò rifarne uno nuovo con librerie e view più avanzate per una migliore fruibilità e funzionalità, nel frattempo vediamo come posso sistemare alcuni piccoli problemini.
Probabilmente ti manca l'utilizzo di 3 cose fondamentali:

  • DB
  • Classi
  • B4XPages (classi anche queste)

Prova a farti dare una mano da ChatGPT; oppure, chiedi a qualcuno di dare una "pulita" al tuo progetto.
 

Xfood

Expert
Licensed User
Come mai questa osservazione? A meno che non ci sia una pietanza che contenga il il testo "Euro", cosa piuttosto improbabile, niente cambierebbe.

Servono nEUROni fritti? 😄 (Non credo, questi li ho solo io 🤣).
semplicemente cosi non prende la riga del totale ma solo gli item
 

LucaMs

Expert
Licensed User
Longtime User

fifiddu70

Well-Known Member
Licensed User
Longtime User
dopo aver recuperato i prodotti con relativo prezzo mi serve anche recuperare il totale dal documento di testo che però ormai è visualizzato in una edittex e non come file txt
il totale si, devo solo estrarre il totale in euro ed incubarlo in una casella di testo.
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Probabilmente ti manca l'utilizzo di 3 cose fondamentali:

  • DB
  • Classi
  • B4XPages (classi anche queste)

Prova a farti dare una mano da ChatGPT; oppure, chiedi a qualcuno di dare una "pulita" al tuo progetto.
Hai indovinato le 3 cose che non so, e dovrei studiarle ma a 54 anni ho poca voglia di studiarle anche se vorrei approfondirle ma mi sembra molto difficile da capire
 
Top