Spanish Mi primer APP no logra escribir un archivo CSV

Sergio Castellari

Active Member
Licensed User
Hola,

Estoy realizando mi primera APP, que necesita poder grabar un archivo CSV que fue editado. Pero NO logro poder grabar la edición del archivo CSV.
Necesito poder grabar la edición ni bien termino de editarlo.
Adjunto proyecto completo para poder ver donde tengo el error o mejor dicho para ver como debiera hacerlo.
Saludos,
Sergio
 

Attachments

  • TomaEstado.zip
    25.7 KB · Views: 267

josejad

Expert
Licensed User
Longtime User
Hola Sergio:

Enhorabuena, la app tiene buena pinta.

A ver, como estás apuntando al sdk 26 en el manifest, deberías echar un ojo al tutorial sobre Runtime Permissions.
https://www.b4x.com/android/forum/threads/runtime-permissions-android-6-0-permissions.67689/

Algunas cosillas:
1.- Si no quieres complicarte con los permisos, deberías bajar en el manifest el SDK 26 a por ejemplo el 19 (si no va a publicar la app el Google Play). Verás que ahí ya al instalar la APP te dirá que la aplicación requiere permisos de escritura. Haciendo esto, ya graba bien el archivo, pero claro, luego debes cargarlo desde esa misma carpeta
B4X:
    su.SaveCSV(File.DirDefaultExternal, "cargas.csv", ",", data)
    Log("Directorio: " & File.DirDefaultExternal)
Verás en el log
B4X:
Directorio: /storage/emulated/0/Android/data/b4a.example/files
Y efectivamente el csv en esa carpeta ya está modificado

2.- DirAssets es de solo lectura, no puedes escribir ahí (ya habrás visto que te lanza ese error), por lo que para usar tu csv, deberías copiarlo a otra carpeta y cargarlo y grabarlo ahí.
3.- Si quieres usar los Runtime Permissions, siguiendo el tutorial, no es complicado
 

Sergio Castellari

Active Member
Licensed User
Hola José!!!,

Con tus post, logré entender (minimamente) el tema de permisos. Es decir, utilizo directamente rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
y pRutaBase = rp.GetSafeDirDefaultExternal("") que lo tomé del post que me pasaste de @Xanatos34, con ello logro leer/grabar el archivo en la carpeta predeterminada del telefono. [con esto aprendi tambien a utilizar variables publicas entre distintos modulos de Actividad]

También buscando material en el foro (poco a poco me voy acostumbrando a buscar) encontré un tutorial del @Erel sobre la libreria NET para 'descargar' un archivo. Pues bien, he logrado DESCARGAR el archivo y editarlo!!!! EXITO!!! (mi alegría al avanzar es inmensa!!!)

Pero avanzando en mejorar la APP, no encuentro la manera de verificar ANTES, si el archivo se encuentra en el FTP. Veo que existe una manera de leer carpetas/files del FTP, pero NO me doy cuenta como saber ANTES de descargar, si existe el archivo. Me imagino que se debe aplicar de alguna manera Wait For...pero ni idea como hacerlo.

Vi este codigo en el foro...
Dim sf As Object = ftp.UploadFile(File.DirAssets, "somefile", False, "/somefile")
Wait For (sf) ftp_UploadCompleted (ServerPath As String, Success As Boolean)
If Success Then
Log("file was uploaded successfully")
Else
Log("Error uploading file")
End If

Pero no tengo idea como hacer algo similar para saber si el archivo existe en el FTP y asi descargarlo o indicar un mensaje en contrario...
Desde ya gracias si puedes indicarme una pista (mientras tanto sigo avanzando en como SUBIR el archivo editado)

Saludos,
Sergio
 

josejad

Expert
Licensed User
Longtime User
Buenas de nuevo Sergio:

Me alegro mucho de que vayas avanzando, la verdad es que da un pequeño subidón cada vez que se consigue hacer algo, y más si cuesta.
A riesgo de parecer pesado, por favor, abre un nuevo hilo para el problema del FTP de forma que para quien busque en el foro, sea más sencillo encontrar respuestas y que este hilo no se convierta en todas las dudas sobre una APP en concreto.

Para mostrar código, usa delante y detrás las etiquetas [ code] [ /code] (sin espacios).
Fíjate en el código que pones, y que el objeto FTP tiene un comando list y un evento FTP_ListCompleted, por lo que supongo (no lo he probado) que deberías intentar algo como:
B4X:
Dim sf As Object = ftp.list("/ruta del ftp")
Wait For (sf) FTP_ListCompleted (ServerPath As String, Success As Boolean, Folders() As FTPEntry, Files() As FTPEntry)
If Success Then
Log("El archivo existe")
Else
Log("Error uploading file")
End If

Y en FTP_ListCompleted algo como:

B4X:
Sub FTP_ListCompleted (ServerPath As String, Success As Boolean, Folders() As FTPEntry, Files() As FTPEntry)
        If Success = False Then
            Log(LastException)
        Else
            For i = 0 To Files.Length - 1
            'Comprueba aquí sí tu archivo existe
            Log(Files(i).Name)
            Next
        End If
End Sub

Ya quizás alguno de los compañero te pueda decir exactamente cómo va.

saludos,
 
Top