Italian Scambio dati testo pc device

luciano deri

Active Member
Licensed User
Longtime User
ciao ragazzi,

anche io ho avuto la stessa esigenza, e cioè trasferire dati da una applicazione PC/WIN verso una applicazione ANDROID.
La soluzione che ho adottato è la seguente:

sul PC/WIN creo un file dati in formato TXT e poi lo trasferisco in una cartella remota tramite FTP.

sul device ANDROID, sempre tramite FTP, prelevo i dati e poi li scrivo in un DB SQLite.

in pratica il PC/WIN contiene dati contabili e vengono preparati e trasferiti ogni fine giornata lavorativa (in genere verso le ore 18:00). i dati restano a disposizione sulla cartella remota, fin quando non li "prelevo" con il mio device. Infatti tramite la lib FTP, dopo avere scaricato i dati , eseguo la cancellazione.
Il fatto di avere una cartella remota è molto utile, in quanto mi permette di scaricare i dati sul device in qualsiasi momento e in qualsiasi luogo.

ciao,
Tutto ciò è magnifico, avresti per cortesia un esempio con codice da mettere a disposizione? Grazie.
 

giannimaione

Well-Known Member
Licensed User
Longtime User
B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
Dim Fatto As Int
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
    Dim FTP As FTP
    Dim Label1 As Label
    Dim Account As String
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Fatto=0
    Account=Main.Account
    'Msgbox(Account,"")
    Activity.LoadLayout("aggiorna")
    ProgressDialogShow("Download")
    DoEvents
    'If FirstTime Then
        FTP.Initialize("FTP","giannimaione.blabla",21,"giannimaione","lamiapassword")
    'End If
    FTP.PassiveMode=True
    Scarica
End Sub
Sub ClientiDATI
    'Dim i As Int
    'in pratica nel file 9901_dati.txt ci sono anche le istruzioni sql , oltre ai dati contabili
    ' esempio : INSERT INTO (bla bla bla ..
    ' in questo modo "piloto" il tutto da PC windows!
    ProgressDialogShow("UPDATE DATI CONTABILI")
    DoEvents
    Dim Reader As TextReader
    Reader.Initialize(File.OpenInput(Account, "9901_dati.txt"))
    'Main.SQL1.BeginTransaction
    Dim line As String
    line = Reader.ReadLine
    Main.SQL1.BeginTransaction
    Try
    Do While line <> Null
    'Log(line)
'    If (i Mod 10)=0 Then
        DoEvents
'    End If
        Main.SQL1.ExecNonQuery(line)
        line = Reader.ReadLine
        'i=i+1
    Loop
    Main.SQL1.TransactionSuccessful
    Catch
        Msgbox("ERRORE","")
    End Try
    Main.SQL1.EndTransaction
    Reader.Close
    ProgressDialogHide
    'Msgbox("OK","")
    Activity.Finish
End Sub
Sub Scarica
    Dim nome1 As String
    Dim nome2 As String
    'Msgbox("accedo","")
   
    nome1="/clienti/public/maione/9901_dati.txt":' la cartella ed il file remoto
    nome2="9901_dati.txt":' nome del file locale
    DoEvents
    FTP.DownloadFile(nome1,True,Account,nome2)
    'Msgbox("do","")
End Sub
Sub FTP_DownloadCompleted (ServerPath As String, Success As Boolean)
    'Msgbox(ServerPath & ", Success=" & Success,"")
    If Success = True Then
        InsertDATI
    End If
End Sub
Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub
 

giannimaione

Well-Known Member
Licensed User
Longtime User
come fai ad essere sicuro che nel PC c'è il file richiesto?
infatti, hai ragione.
in pratica , come puoi vedere dal codice , non esiste nessun controllo.
Io utilizzo i controlli dal pc windows e quindi SONO SICURO di avere trasferito su uno spazio remoto FTP il file con i dati.
Il file NON VIENE MAI cancellato.... in realtà un gruppo di agenti preleva questo file (semrpe lo stesso nome) per aggiornare il proprio dispositivo android. Ad oggi (da oltre due anni) non ho avuto problemi.
 

LucaMs

Expert
Licensed User
Longtime User
posso impicciarmi? (bello... l'Etna :D - e qui tutta Napoli mi odierà hehehe)

"un gruppo di agenti preleva..."

Non dirmi che tramite quel file ottieni una sorta di allineamento dei db sui vari dispositivi!

O, se lo dici... COME???

Con query e relative date?

Come risolvi i conflitti?

Questo è uno dei motivi per i quali ancora non ho pubblicato la mia prima app. Sono indeciso se pubblicarla "stand-alone", ovvero senza la possibilità di allineamento tra i db di vari dispositivi, creare qualcosa con wifi-direct (ma qui la sincronizzazione...!), usare db centralizzato esterno (internet).
 

giannimaione

Well-Known Member
Licensed User
Longtime User
qui la faccenda si complica.... ma in realtà è fin troppo semplice.
un mio cliente (una azienda commerciale) ha fornito ai suoi agenti di vendita un dispositivo android (tablet)
Dal gestionale aziendale vengono esportati i dati contabili amministrativi dei clienti.
Ogni cliente è associato ad un solo agente (che bella scoperta!)
Il file esportato contiene TUTTI i dati di TUTTI i clienti;
la APP android ha una "sorta" di login per identificare chi è l'agente (in pratica ogni agente accede alla APP con un codice e una password che SOLO LUI conosce , e chiaramente io).
Quindi il singolo agente consulta SOLO i clienti che sono di sua pertinenza.

:)
Chi ha avuto, ha avuto, ha avuto...
chi ha dato, ha dato, ha dato...
scurdámmoce 'o ppassato,
simmo 'e Napule paisá!...
 

giannimaione

Well-Known Member
Licensed User
Longtime User
al momento i dati viaggiano solo a "senso unico" dal gestionale aziendale verso i tablet.
In progetto c'è la creazione di una APP per gestire gli "ordini clienti";
i problemi non mancano.... ci sono oltre 9000 prodotti (articoli di cancelleria, cartoleria, ecc.) ;
gli agenti hanno poca praticità con la tastiera virtuale , specialmente con dispositivi medio/piccoli.
si sta pensando di utilizzare tablet con schermo "grande" ed eventualmente una tastiera BT.
al vaglio l'azienda vorrebbe inserire sui prossimi cataloghi (un librone con centinaia di pagine), oltre le notizie solite (codice, prezzo, pezzi per confezione, ecc.) anche il codice a barre...
A proposito: avete qualche consiglio da darmi in merito?
 

LucaMs

Expert
Licensed User
Longtime User
veramente ero io che speravo di trovare la soluzione migliore per l'allineamento dei db sui dispositivi, sperando che tu l'avessi già risolto :D.

Comunque... se i prodotti sono "troppi", l'unica è filtrarli in qualche modo (invece di scaricare tutto tramite FTP); lo so, è ovvio, ma questo è.

Per gli agenti poco pratici ci sono due soluzioni: o si "allenano" :D oppure alcune immissioni potrebbero avvenire a voce.

Per il codice a barre non è un problema, ci sono un paio di librerie per ottenere la scansione tramite la fotocamera del dispositivo (sperando che tutti i i dispositivi degli agenti abbiano una fotocamera): una richiede anche l'installazione di un'altra app (gratuita), l'altra è meno precisa e veloce, ma fa il suo dovere.

La prima è ABZxing Barcode reader.
La seconda ZXingLib
 

luciano deri

Active Member
Licensed User
Longtime User
Salve, sto facendo anche io un progetto analogo. Credo che la funzione FTP.list permetta di esplorare la cartella del computer remoto, anche se il suo utilizzo non mi pare così immediato. Il problema è che se manca il file remoto nel table crea un file vuoto sostituendo quello esistente. Quindi importo il file come con un nome diverso, testo se ha una dimensione > zero lo sostituisco all'esistente. Il problema dell'allineamento dati c'è, ma dipende da come funziona il gestionale e come è organizzato il database. Io ho posto queste regole: le tabelle (per lo più anagrafiche) che invio ai tablet non sono modificabili, i dati (ordini) che i tablet mandano al server non vengono copiati così come sono, ma sono importati e completati, quindi archiviati in uno stato "da approvare". In questa fase gli agenti possono ri-inviare gli ordini con le modifiche. Quando l'ordine è approvato non è più modificabile dal tablet
 

luciano deri

Active Member
Licensed User
Longtime User
Relativamente allo scambio dati FTP, nonostante si connettaa e scarichi i dati correttamente sia in download che upload non mi esegue mai FTP_DownloadCompleted e ftp_UploadCompleted. Basta definire le sub o devo chiamarle in qualche modo?
 
Top