Rimanendo legato al thread incontro il seguente problema:
eseguo un loop che, leggendo dati da una tabella con (tra gli altri) i campi "modulo" e "nome", crea dei file "nome.xcs" nella cartella "modulo". Quando finisco i "nome" con lo stesso "modulo", prima di passare al "modulo" successivo lancio un file batch che converte i file da .Xcs a .Pgmx
Ad ogni loop il file batch viene modificato da codice per convertire tutti i file contenuti nella cartella "modulo"
Se eseguo il codice passo passo, tutto funziona perfettamente, se invece lo lancio da access il file batch converte solo i file contenuti nell' ultima cartella creata .
Immagino che dovrei fermare l'esecuzione del ciclo per dare il tempo al batch di fare il suo lavoro sui file di una cartella prima di chiedergli di passare alla successiva, ma non ho idea di come fare .
Ho pensato di copiare il batch "modello" nella cartella "modulo" prima di lanciarlo, ma mi restituisce "errore 70 " (autorizzazione negata), e il problema non è che il file è in rete, perchè lo fa anche se lo sposto "a mano" in locale.
Qualche idea?
P.S. questo è il codice:
Private Sub cmdCreaPgmx_Click()
'se sono in modalità modifica, salvo il file
If Me.Dirty Then
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
End If
'controllo se c'è il link alla cartella nella commessa
If IsNull(DLookup("linkCartella", "tblCommesse", "Idcommessa=" & Forms!frmCommessa!IDCommessa)) Then
MsgBox ("Non c'è il percorso della Commessa" & vbCrLf & _
"Non so dove salvare")
Exit Sub
ElseIf DLookup("linkCartella", "tblCommesse", "Idcommessa=" & Forms!frmCommessa!IDCommessa) = "" Then
MsgBox ("Non c'è il percorso della Commessa" & vbCrLf & _
"Non so dove salvare")
Exit Sub
End If
Dim strOrigine As String 'Percorso del file modello.xcs
Dim strDestinazione As String 'Percorso di destinazione degli xcs creati
Dim strFileUscita As String 'Percorso completo del file di uscita
Dim strXCS As String 'Stringa da scrivere nel file .xcs
Dim strPezzo As String 'Nome del pezzo e del file
Dim strSqlMateriali As String 'elenco dei materiali della commessa
Dim strSqlPezzi As String 'elenco dei pezzi della commessa
Dim dbs As Database
Dim rstMateriali As Recordset
Dim rstPezzi As Recordset
Dim strBatch As String 'riempie il file batch
Dim strLung As String
Dim strLarg As String
Dim strSp As String
strSqlMateriali = "SELECT tblCommessePannelli.IdCommessa, tblArticoli.IDArticolo, tblArticoli.Articolo, tblCommessePannelli.Sp, tblCommessePannelli.Pgmx" & _
" FROM tblArticoli RIGHT JOIN tblCommessePannelli ON tblArticoli.IDArticolo = tblCommessePannelli.IdArticolo" & _
" WHERE tblCommessePannelli.IdCommessa=" & Forms!frmCommessa!IDCommessa & " AND tblCommessePannelli.Pgmx=True"
strSqlPezzi = "SELECT tblCommessePezzi.IdCommessa, tblArticoli.Articolo, tblCommessePezzi.Sp, cod &'_'& [modulo] & '-' & [nome] AS Pezzo, tblCommessePezzi.Lung, tblCommessePezzi.Larg, tblCommessePezzi.Qtà" & _
" FROM tblCommessePezzi LEFT JOIN tblArticoli ON tblCommessePezzi.IdArticolo = tblArticoli.IDArticolo" & _
" WHERE tblCommessePezzi.IdCommessa=" & Forms!frmCommessa!IDCommessa
Set dbs = CurrentDb
Set rstMateriali = dbs.OpenRecordset(strSqlMateriali)
Set rstPezzi = dbs.OpenRecordset(strSqlPezzi)
strOrigine = "H:\RiservatiAccess\Modello.XCS"
strDestinazione = Me!CartellaOutput & "\PGMX"
'controlla se c'è già la cartella di output di primo livello, se no la crea
Dim fdObj As Object
Set fdObj = CreateObject("Scripting.FileSystemObject")
If fdObj.FolderExists(strDestinazione) Then 'se c'è già non fa niente
Else
fdObj.CreateFolder (strDestinazione)
End If
'svuota il file batch per riempirlo di nuovo al prossimo comando
'Open "H:\RiservatiAccess\CreazionePgmx.bat" For Output As #1
' strBatch = ""
'Print #1, strBatch
'Close #1 ' Close file.
rstMateriali.MoveFirst
Do While Not rstMateriali.EOF
strDestinazione = Me!CartellaOutput & "\PGMX"
strDestinazione = strDestinazione & "\" & rstMateriali!Articolo & "_" & rstMateriali!Sp
'controlla se c'è già la cartella di output di secondo livello, se no la crea
'Set fdObj = CreateObject("Scripting.FileSystemObject")
If fdObj.FolderExists(strDestinazione) Then 'se c'è già non fa niente
Else
fdObj.CreateFolder (strDestinazione)
End If
'comincio a creare gli xcs
rstPezzi.MoveFirst
Do While Not rstPezzi.EOF
If rstPezzi!Articolo = rstMateriali!Articolo And rstPezzi!Sp = rstMateriali!Sp Then
strLung = CStr(rstPezzi!Lung)
strLung = Replace(strLung, ",", ".")
strLarg = CStr(rstPezzi!Larg)
strLarg = Replace(strLarg, ",", ".")
strSp = CStr(rstPezzi!Sp)
strSp = Replace(strSp, ",", ".")
strPezzo = rstPezzi!pezzo
strFileUscita = strDestinazione & "\" & strPezzo & ".xcs"
FileCopy strOrigine, strFileUscita
strXCS = "SetMachiningParameters (""EF"", 1, 10, 0, false);"
strXCS = strXCS & vbCrLf & "CreateFinishedWorkpieceBox (""" & strPezzo & """," & strLung & ", " & strLarg & "," & strSp & " );"
strXCS = strXCS & vbCrLf & "SetWorkPieceLabel(120, 90, 90);"
Open strFileUscita For Output As #1
Print #1, strXCS
Close #1 ' Close file.
End If
rstPezzi.MoveNext
Loop
'modifica input e output del file batch per convertire in pgmx
'fdObj.CopyFile "H:\RiservatiAccess\CreazionePgmx.bat", "C:\_Progetti\PGMX\U570VL_19"
Open "H:\RiservatiAccess\CreazionePgmx.bat" For Output As #1
Debug.Print strDestinazione
strBatch = "Call ""C:\Program Files\SCM Group\Maestro\XConverter.exe"" ^"
strBatch = strBatch & vbCrLf & "-s -m 0 ^"
strBatch = strBatch & vbCrLf & "-t ""C:\Users\Public\Documents\SCM Group\Maestro\Tlgx\Buzzi.tlgx"" ^"
strBatch = strBatch & vbCrLf & "-i """ & strDestinazione & """ ^"
strBatch = strBatch & vbCrLf & "-o """ & strDestinazione & """ ^"
Print #1, strBatch
Close #1 ' Close file.
Call Shell("H:\RiservatiAccess\CreazionePgmx.bat")
rstMateriali.MoveNext
Loop
MsgBox "Fatto"
End Sub