Newsgroup: it.comp.appl.access
Titolo: Creazione File installabile da RunTime

Buongiorno a tutti, sono nuovo all'interno del gruppo e mi presento con una richiesta di supporto.
Sto sviluppando un DB Access per la gestione dello sviluppo offerte per la nostra rete commerciale.
Una parte della procedura trasferisce il file PDF generato, da cartella PC locale a cartella Web ma il file arriva corrotto.
 
Mi è stato suggerito di utilizzare la libreria WinlNet che dovrebbe fare al caso mio ed essere funzionale esentando il codice da ogni errore.
 
Domanda, questa libreria va installata in locale e viene richiamata da codice VBA.
 
Vorrei evitare che i miei utenti debbano scaricare e installare tale libreria, è possibile in fase di creazione eseguibile tramite le runtime impostare anche l'installazione di questa libreria?
 
Premetto che non ho mai utilizzato le runtime e prima di attivarmi con libreria e modifica del codice, vorrei semplicemente essere certo di non gettare tempo alle ortiche!
 
Grazie per il supporto e buona giornata.
 
V


Benvenuto,
se provi a rileggere il messaggio, sicuramente capirai che non e' 
possibile darti nessun consiglio in quanto non decrivi niente di preciso
  dell'ambiente che hai, e di quello che desideri fare
 
Si parla di un pdf che parte ma non si capisce bene dove arriva, che 
c'e' a destinazione e' un webserver tipo Iis, Apache, un ftp server o 
cosa esattamente?
E come lo mandi sto file, usando che protocollo?
Ed il codice usato per mandarlo?
 
"..vorrei evitare che i miei utenti.." ma sti utenti sono in lan tuoi 
iffici o sono sparsi per il mondo?
 
"..mi e' stato suggerito.." e l'omo si e' perso o c'e' ancora? Nel senso 
gli altri ti suggeriscono una cosa, e noi dovremmo farla andare?  :)
Abbi pazienza, spiegati bene prima, poi qualcuno che risponda lo troviamo

Il 21/06/2023 18:01, Valentino Chiarello ha scritto:

quella libreria è gia compresa sul windows.
se il file arriva corrotto mi vien da pensare che stai provando ad 
inviarlo via FTP non settando il corretto tipo ASCII o BYNARY
 
prova a postare il codice
BFS


Buongiorno, chiedo scusa se la richiesta era incompleta, prima volta che mi affaccio al mondo dei gruppi e alle richieste.
Comunque, provo ad allegare il codice che si occupa del caricamento file tramite FTP.
 
#If VBA7 Then
    Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
    Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
 
Sub CaricaFileFTP(ByVal FileName As String, ByVal server As String, ByVal username As String, ByVal password As String, ByVal localPath As String, ByVal remotePath As String)
    Dim ftpScript As String
    Dim scriptFile As String
    Dim ftpInstructions As Variant
    Dim instruction As Variant
 
    ' Array comandi FTP
    ftpInstructions = Array( _
        "open " & server, _
        username, _
        password, _
        "cd " & remotePath, _
        "put " & localPath, _
        "bye" _
    )
 
    ' Esegui un comando alla volta
    For Each instruction In ftpInstructions
        ' Create the FTP script line
        ftpScript = ftpScript & instruction & vbCrLf
    Next instruction
 
    ' Salva script in file temporaneo
    scriptFile = Environ("TEMP") & "\ftp_script.txt"
    Open scriptFile For Output As #1
    Print #1, ftpScript
    Close #1
 
    ' Esegui codice nella shell
    shell "ftp -s:" & scriptFile, vbNormalNoFocus
 
 
    Sleep 1500
 
 
    Kill scriptFile
End Sub
 
 
 
In sostanza, si tratta di un programma da dare ai nostri agenti per permettergli di generare in automatico le offerte, che vengono generate in PDF. Questa sub viene chiamata subito dopo aver generato il file, e dovrebbe caricarlo in una cartella sul nostro sito per permetterci di vedere che offerte vengono sviluppate.
 
 
Grazie mille


Il tutto si riduce alla shell finaleProva a mettere in un file batch 
"ftp -s:" e poi tutto il contenuto di scriptFile, lo lanci (il file 
batch appena creato intendo) e vedi cosa ti appare a video
Meglio se metti un Pause alla fine altrimenti si chiude tutto subito
 
Non e' ancora chiaro dall'altra parte che server ftp c'e'
 

Il 22/06/2023 09:53, Valentino Chiarello ha scritto:

aggiungi
 
type binary
 
alla lista comandi e vedrai che va.
in pratica il txt che devi ottenere deve essere cosi
 
 
open ftp.tuosito.ti
tuaUser
tuaPsw
cd /cartellaFTP/
type binary
put c:\test.pdf
bye
 
senza type binary viene caricato come ascii e quindi corrotto
 
BFS
 
 
 

Inserendo Type Binary il file viene caricato correttamente, fantastico.
 
Pe rispondere a Roberto invece, si tratta di un server aruba.
 
Adesso mi mancherebbe solo il codice per controllare che il file sia stato effettivamente caricato e in caso negativo, richiamare la funzione CaricaFileFTP fino a quando il file è stato correttamente caricato.
 
Grazie mille per l'aiuto che mi state dando


Per completezza vi dico cosa ho provato senza successo. 
Circa lo stesso codice per caricare ma, al posto di put, leggo il contenuto della cartella con LS. A quel punto leggo l'output della shell e se nella stringa di output è presente il nome file, allora significa che effettivamente è stato caricato correttamente. Il problema è che la lettura della shell mi mostrava dei numeri



potresti salvare i tuoi comandi in un file config.txt
 
crearti il bat/txt con il solo comando
 
ftp -s:config.txt >log.txt
 
 
a questo punto ti vai a leggere il contenuto del log e cerchi se è 
presente transfert complete
 
BFS
 
 

Se eseguo la procedura tramite prompt dei comandi funziona, quindi nel codice ho scritto:
 
Shell "ftp -s:" & scriptFile & ">" & "ftplog.txt", vbNormalNoFocus
 
Però non sta funzionando, il file log non si genera. La variabile scriptfile si compila correttamente.
 
Grazie


Ci sono riuscito, incollo il codice qua sotto! Dato che eseguendo in questo modo (Shell "ftp -s:" & scriptFile & ">" & "ftplog.txt", vbNormalNoFocus) il codice, non mi generava il file log, ho fatto in modo che questa stringa venga eseguita in un file .bat temporaneo dove va a chiamare il file contenente lo script. Alla fine cancello il file .bat, il file con lo script e il file log
 
Sub CaricaFileFTP(ByVal FileName As String, ByVal server As String, ByVal username As String, ByVal password As String, ByVal localPath As String, ByVal remotePath As String)
    Dim ftpScript As String
    Dim scriptFile As String
    Dim ftpInstructions As Variant
    Dim instruction As Variant
    Dim logFile As String
 
    ' Crea un array di istruzioni FTP
    ftpInstructions = Array( _
        "open " & server, _
        username, _
        password, _
        "cd " & remotePath, _
        "type binary", _
        "put " & localPath, _
        "bye" _
    )
 
    ' Esegui ogni istruzione con un ritardo
    For Each instruction In ftpInstructions
        ' Crea la riga di script FTP
        ftpScript = ftpScript & instruction & vbCrLf
    Next instruction
 
    ' Salva lo script in un file temporaneo
    scriptFile = Environ("TEMP") & "\ftp_script.txt"
    Open scriptFile For Output As #1
    Print #1, ftpScript
    Close #1
 
    ' Crea un file batch temporaneo
    Dim batchFile As String
    batchFile = Environ("TEMP") & "\ftp_script.bat"
    Open batchFile For Output As #2
    Print #2, "ftp -s:" & scriptFile & " > " & Environ("TEMP") & "\ftplog.txt"
    Close #2
 
    ' Esegui il file batch
    Shell batchFile, vbNormalNoFocus
 
    ' Attendi 1,5 secondi
    Sleep 1500
 
    ' Leggi il file di log
    logFile = Environ("TEMP") & "\ftplog.txt"
    Open logFile For Input As #3
    Dim logContent As String
    logContent = Input$(LOF(3), #3)
    Close #3
 
    ' Verifica se la stringa desiderata è presente nel log
    If InStr(logContent, "226-File successfully transferred") > 0 Then
        ' La stringa è presente, termina la procedura
        Kill logFile
        Exit Sub
    Else
        ' La stringa non è presente, mostra un messaggio di avviso
        MsgBox "Il trasferimento del file non è riuscito. Riprovare."
 
        ' Esegue nuovamente la funzione CaricaFileFTP
        CaricaFileFTP FileName, server, username, password, localPath, remotePath
    End If
 
    ' Elimina i file di script e batch
    On Error Resume Next
    Kill scriptFile
    Kill batchFile
    On Error GoTo 0
End Sub


grazie
per fare le cose fatte bene potresti parametrizzare anche quel "type 
binary" passandolo alla funzione
 
  Sub CaricaFileFTP(ByVal FileName As String, ByVal server As 
String,..... Type as string...
 
 
cosi torna buona per tutti gli usi
BFS
 
 
 

Fatto! Grazie del consiglio



Poi s'e' capito a che serviva la WinlNet ?
Eri partito con altro codice?

Il 22/06/2023 17:09, Valentino Chiarello ha scritto:

occhio a questa parte
 
  ' Esegue nuovamente la funzione CaricaFileFTP
          CaricaFileFTP FileName, server, username, password, localPath, 
remotePath
 
 
se il server ftp non è disponibile e quindi non riesci mai a caricare il 
file non esci più dalla "ricorsione"
dovresti mettere un "contatore" di tentativi
 
BFS

BFS hai ragione, contatore integrato, ci prova 4 volte, alla quinta interrompe il ciclo! Grazie del suggerimento.
 
Per rispondere a Roberto, alla fine è bastato aggiungere un parametro al mio codice per risolvere il problema di corruzione file in fase di caricamento!!
 
Grazie mille a tutti