MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração


Participe do fórum, é rápido e fácil

MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração

MaximoAccess

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access


2 participantes

    Como saber se um arquivo está sendo utilizado?

    walisilva
    walisilva
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 34
    Registrado : 10/09/2015

    Como saber se um arquivo está sendo utilizado? Empty Como saber se um arquivo está sendo utilizado?

    Mensagem  walisilva 23/12/2015, 13:17

    Prezados,

    Vi que haviam alguns tópicos falando no assunto mas não encontrei algo mais claro e objetivo.

    No meu código eu crio um PDF, envio por e-mail e, em seguida, deleto. O problema é que as vezes vejo um erro de permissão negada, deduzo que o mesmo esteja ainda sendo utilizado pelo access por isso não consigo deletá-lo.

    Testei algumas formas e até agora nada com sucesso, portanto gostaria de saber se alguém aqui sabe uma função que eu possa saber se o arquivo ainda está aberto e aguardar (Do Whille... Loop).

    Agradeço a atenção de todos. Obrigado.


    .................................................................................
    --
    Walison Silva Cool
    Noobezinho
    Noobezinho
    Moderador
    Moderador


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 4140
    Registrado : 29/06/2012

    Como saber se um arquivo está sendo utilizado? Empty Re: Como saber se um arquivo está sendo utilizado?

    Mensagem  Noobezinho 23/12/2015, 13:55

    Walison



    Experimente isso:

    No final do código que envia para emails:

    Se existir uma msgbox que avisa que foi enviado, ótimo,

    se não existir crie uma.

    E depois deleta o arquivo.

    Se já existe a msgbox e mesmo assim, não da para deletar,

    antes da msgbox coloque uma Pausa no código.

    Comece com 2,3 minutos, e então vai testando e diminuindo

    o tempo de pausa, até chegar num tempo mínimo que de para

    deletar o arquivo.

    Espero que tenha feito me entender Wink

    [ ]'

    santa




    .................................................................................
    A pergunta que não quer calar:
    Por quê quando alguém vem pedir ajuda e conforme o caso pedimos
    para enviar parte do projeto, não temos mais continuidade do tópico?  
    Crê que temos bolas de cristal ou está com medo que "roubemos"  a
    idéia/projeto dele?  Twisted Evil
    Se é tão bom assim...


    Ajude a ser ajudado:
    Seja objetivo na dúvida, dê os detalhes do que precisa, sem rodeios.
    Quando anexar teu projeto, diga onde está o problema, ganhamos mais tempo
    sem precisar procurar o mesmo.
    walisilva
    walisilva
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 34
    Registrado : 10/09/2015

    Como saber se um arquivo está sendo utilizado? Empty Re: Como saber se um arquivo está sendo utilizado?

    Mensagem  walisilva 23/12/2015, 14:27

    Noobezinho,

    Interessante, mas como não tenho msgbox seria complicado adicionar uma pausa de tempo, uma vez que meu objetivo é enviar cada vez mais rápido os emails...

    Outra coisa que eu observei é que, quando o access usa o arquivo, todas as verificações que eu encontrei mostra como se o arquivo estivesse aberto, testando abrindo o arquivo manualmente as verificações funcionam normalmente. É como se o access quando abre o arquivo e usa, depois de usar ele não diz que fechou, saca? Estranho isso. Vou postar aqui um código que achei pra melhor entender...

    Código:
    Function isfileopen(filename As String)

    Dim ifilenum As Long
    Dim ierr As Long

    On Error Resume Next
    ifilenum = FreeFile()
    Open filename For Input Lock Read As #ifilenum
    Close ifilenum
    ierr = err
    On Error GoTo 0

    Select Case ierr
    Case 0: isfileopen = False
    Case 70: isfileopen = True
    Case Else: Error ierr
    End Select

    End Function


    .................................................................................
    --
    Walison Silva Cool
    walisilva
    walisilva
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 34
    Registrado : 10/09/2015

    Como saber se um arquivo está sendo utilizado? Empty Re: Como saber se um arquivo está sendo utilizado?

    Mensagem  walisilva 23/12/2015, 14:31

    Obs: Erro 70 é erro de Permissão Negada, o que está me estressando há dias... Razz


    .................................................................................
    --
    Walison Silva Cool
    Noobezinho
    Noobezinho
    Moderador
    Moderador


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 4140
    Registrado : 29/06/2012

    Como saber se um arquivo está sendo utilizado? Empty Re: Como saber se um arquivo está sendo utilizado?

    Mensagem  Noobezinho 23/12/2015, 14:37

    Bem

    Já percebi que não tem a função pausa.

    Mas, gostaria que nos mostre o código

    que cria e envia cada PDF.

    Porque eu já fiz esse código para envio de boletos via e-mail.

    Detalhe, eu envio o PDF como anexo do e-mail.

    Aguardo...


    santa


    .................................................................................
    A pergunta que não quer calar:
    Por quê quando alguém vem pedir ajuda e conforme o caso pedimos
    para enviar parte do projeto, não temos mais continuidade do tópico?  
    Crê que temos bolas de cristal ou está com medo que "roubemos"  a
    idéia/projeto dele?  Twisted Evil
    Se é tão bom assim...


    Ajude a ser ajudado:
    Seja objetivo na dúvida, dê os detalhes do que precisa, sem rodeios.
    Quando anexar teu projeto, diga onde está o problema, ganhamos mais tempo
    sem precisar procurar o mesmo.
    walisilva
    walisilva
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 34
    Registrado : 10/09/2015

    Como saber se um arquivo está sendo utilizado? Empty Re: Como saber se um arquivo está sendo utilizado?

    Mensagem  walisilva 23/12/2015, 14:50

    Função que transforma meu relatório em .SNP e em seguinda em .PDF com senha.

    Código:
    Public Function ConvertReportToPDF( _
    Optional RptName As String, _
    Optional SnapshotName As String, _
    Optional OutputPDFname As String, _
    Optional ShowSaveFileDialog As Boolean = False, _
    Optional StartPDFViewer As Boolean = True, _
    Optional CompressionLevel As Long, _
    Optional PasswordOwner As String, _
    Optional PasswordOpen As String, _
    Optional PasswordRestrictions As Long, _
    Optional PDFNoFontEmbedding As Long, _
    Optional pasta As String, Optional pArquivo As String, Optional strPathx As String) As Boolean

    Dim fso As FileSystemObject
    Dim fso2 As Object
    Set fso2 = CreateObject("scripting.filesystemobject")
    Dim S, a, b, file As String
    Dim blRet As Boolean
    Dim pausetime, start As Long
    Dim i As Integer

    'On Error Resume Next

    ' Let's see if the DynaPDF.DLL is available.
    blRet = LoadLib()

    If blRet = False Then
        ' Cannot find DynaPDF.dll or StrStorage.dll file
        Exit Function
    End If

    On Error GoTo ERR_CREATSNAP

    Dim strPath  As String
    Dim strPathandFileName  As String
    Dim strEMFUncompressed As String

    Dim sOutFile As String
    Dim lngRet As Long

    ' Init our string buffer
    strPath = Space(Pathlen)

    'Save the ReportName to a local var
    mReportName = RptName

    ' Let's kill any existing Temp SnapShot file
    If Len(mUncompressedSnapFile & vbNullString) > 0 Then
        Kill mUncompressedSnapFile
        mUncompressedSnapFile = ""
    End If

    ' If we have been passed the name of a Snapshot file then
    ' skip the Snapshot creation process below
    If Len(SnapshotName & vbNullString) = 0 Then
         
        ' Make sure we were passed a ReportName
        If Len(RptName & vbNullString) = 0 Then
            ' No valid parameters - FAIL AND EXIT!!
            ConvertReportToPDF = ""
            Exit Function
        End If
           
        ' Get the Systems Temp path
        ' Returns Length of path(num characters in path)
        lngRet = GetTempPath(Pathlen, strPath)
        ' Chop off NULLS and trailing "\"
        'strPath = Left(strPath, lngRet) & Chr(0)
        strPath = strPathx
       
        ' Now need a unique Filename
        ' locked from a previous aborted attemp.
        ' Needs more work!
        strPathandFileName = GetUniqueFilename(strPath, "SNP" & Chr(0), "snp")
       
        ' Export the selected Report to SnapShot format
        DoCmd.OutputTo acOutputReport, RptName, "SnapshotFormat(*.snp)", _
          strPathandFileName
        ' Make sure the process has time to complete
       
        file = strPathandFileName
            For i = 0 To 15
                If Len(Dir(file)) = 0 Then
                    i = i + 1
                    esperar (1)
                    DoEvents
                Else
                    Exit For
                End If
            Next

        If Len(Dir(file)) = 0 Then
        MsgBox "arquivo SNP encontrado. " & vbCrLf & file
        Exit Function
        End If
       
    Else
        strPathandFileName = SnapshotName
     
    End If

    ' Let's decompress into same filename but change type to ".tmp"
    'strEMFUncompressed = Mid(strPathandFileName, 1, Len(strPathandFileName) - 3)
    'strEMFUncompressed = strEMFUncompressed & "tmp"
    'Dim sPath As String * 512
    'lngRet = GetTempPath(512, sPath)

    strEMFUncompressed = GetUniqueFilename(strPath, "SNP", "tmp")

    lngRet = SetupDecompressOrCopyFile(strPathandFileName, strEMFUncompressed, 0&)

    If lngRet <> 0 Then
        'err.Raise vbObjectError + 525, "ConvertReportToPDF.SetupDecompressOrCopyFile", _
        "Não foi possível descompactar o arquivo do SnapShot" & vbCrLf & _
        "Selecione um relatório diferente para exportação"
    End If

    ' Set our uncompressed SnapShot file name var
    mUncompressedSnapFile = strEMFUncompressed

    ' Remember to Cleanup our Temp SnapShot File if we were NOT passed the
    ' Snapshot file as the optional param
    If Len(SnapshotName & vbNullString) = 0 Then
        Kill strPathandFileName
    End If


    ' Do we name output file the same as the input file name
    ' and simply change the file extension to .PDF or
    ' do we show the File Save Dialog
    If ShowSaveFileDialog = False Then

        ' let's decompress into same filename but change type to ".tmp"
        ' But first let's see if we were passed an output PDF file name
        If Len(OutputPDFname & vbNullString) = 0 Then
            sOutFile = Mid(strPathandFileName, 1, Len(strPathandFileName) - 3)
            sOutFile = sOutFile & "PDF"
        Else
            sOutFile = OutputPDFname
        End If

    Else
        ' Call File Save Dialog
        sOutFile = fFileDialog()
        If Len(sOutFile & vbNullString) = 0 Then
            Exit Function
        End If

    End If

    ' Call our function in the StrStorage DLL
    ' Note the Compression and Password params are not hooked up yet.

    blRet = ConvertUncompressedSnapshot(mUncompressedSnapFile, sOutFile, _
    CompressionLevel, PasswordOwner, PasswordOpen, PasswordRestrictions, PDFNoFontEmbedding)

        file = sOutFile
            For i = 0 To 15
                If Len(Dir(file)) = 0 Then
                    i = i + 1
                    esperar (1)
                    DoEvents
                Else
                    Exit For
                End If
            Next

        If Len(Dir(file)) = 0 Then
        MsgBox "arquivo pdf não encontrado. " & vbCrLf & file
        Exit Function
        End If

    a = CurrentDBDir & "temp\pdftk.exe " & pasta & "\" & pArquivo & ".pdf output " & pasta & "\xxxx" & Right(pArquivo, 7) & ".pdf owner_pw foopass user_pw " & Left(pArquivo, 4) & " uncompress allow copycontents degradedprinting printing"

    ShellWait (a)

        file = pasta & "\xxxx" & Right(pArquivo, 7) & ".pdf"
            For i = 0 To 15
                If Len(Dir(file)) = 0 Then
                    i = i + 1
                    esperar (1)
                    DoEvents
                Else
                    Exit For
                End If
            Next

        If Len(file) = 0 Then
        MsgBox "arquivo pdf não encontrado. " & vbCrLf & file
        Exit Function
        End If

    Kill pasta & "\" & pArquivo & ".pdf"

    If blRet = False Then
    err.Raise vbObjectError + 526, "ConvertReportToPDF.ConvertUncompressedSnaphot", _
        "Arquivo SnapShot danificado" & vbCrLf & _
        "Por favor selecione um relatório diferente para exportação"
    End If

    ' Do we open new PDF in registered PDF viewer on this system?
    If StartPDFViewer = True Then
     ShellExecuteA Application.hWndAccessApp, "open", sOutFile, vbNullString, vbNullString, 1
    End If

    ' Success
    ConvertReportToPDF = True


    EXIT_CREATESNAP:

    ' Let's kill any existing Temp SnapShot file
    'If Len(mUncompressedSnapFile & vbNullString) > 0 Then
        On Error Resume Next
      Kill mUncompressedSnapFile
        mUncompressedSnapFile = ""
    'End If

    ' If we aready loaded then free the library
    If hLibStrStorage <> 0 Then
        hLibStrStorage = FreeLibrary(hLibStrStorage)
    End If

    If hLibDynaPDF <> 0 Then
        hLibDynaPDF = FreeLibrary(hLibDynaPDF)
    End If

    Exit Function

    ERR_CREATSNAP:
    MsgBox err.Description, vbOKOnly, err.Source & ":" & err.Number
    mUncompressedSnapFile = ""
    ConvertReportToPDF = False
    Resume EXIT_CREATESNAP

    End Function

    Parte da função que envia o PDF gerado:

    Código:
    Set oMensagem = CreateObject("CDO.Message")
            Set oConfiguração = CreateObject("CDO.Configuration")
                oConfiguração.load -1 'Padrões CDO
                Set vFields = oConfiguração.Fields
                With vFields
                    .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
                    .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "servidor.smtp"
                    .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
                    .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = -1
                    .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "usuario"
                    .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "senha"
                    .Update
                End With
            With oMensagem
                Set .Configuration = oConfiguração
                .To = Replace(rsMalaEnvios.Fields("email"), " ", "")
                .CC = "" 'com cópia
                .BCC = "" 'com cópia oculta
                .FROM = "meu nome <" & rsLote.Fields("emailde") & ">"
                .Subject = Nz(ass, "meu assunto")
                .TextBody = ""
                .HtmlBody = Replace(Replace(msg, "[cliente]", rsMalaEnvios.Fields("Sacado")), "[cpf2]", "XXXX" & Right(rsMalaEnvios.Fields("cpf devedor"), 7))
               
                    file = CurrentDBDir & "TEMP_" & Left(CurrentProject.Name, Len(CurrentProject.Name) - 4) & "\XXXX" & Right(rsMalaEnvios.Fields("cpf devedor"), 7) & ".pdf"
           
                    For i = 0 To 15
                        If Len(Dir(file)) = 0 Then
                            i = i + 1
                            esperar (1)
                            DoEvents
                        Else
                            Exit For
                        End If
                    Next
           
                    If Len(Dir(file)) = 0 Then
                        GoTo e
                    End If
               
                .AddAttachment file
                .Send
            End With
           
           
            'desctruir pdf enviado
            tstarq = CurrentDBDir & "TEMP_" & Left(CurrentProject.Name, Len(CurrentProject.Name) - 4) & "\xxxx" & Right(rsMalaEnvios.Fields("cpf devedor"), 7) & ".pdf"
           
            isfileopen ("" & tstarq)
           
                If tstarq <> "" Then
                    Kill tstarq
                End If


    .................................................................................
    --
    Walison Silva Cool
    Noobezinho
    Noobezinho
    Moderador
    Moderador


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 4140
    Registrado : 29/06/2012

    Como saber se um arquivo está sendo utilizado? Empty Re: Como saber se um arquivo está sendo utilizado?

    Mensagem  Noobezinho 23/12/2015, 16:11

    Walison

    Vi teu código rapidamente, depois vejo com mais calma, correria de fim de ano. Razz
    Percebi que usou duas variáveis para o mesmo caminho do pdf.(a unica diferença é o diretório
    que numa frase está /XXXX e na outra \xxxx (linhas em laranja).
    Se for a mesma coisa, o que acredito que seja, pode utilizar somente uma variável.
    Experimente com a Pausa , a linha em azul, quase no final do código.
    E fique tranquilo que isso não irá demorar teu código.

    Mais abaixo a função Pausa()



    Walison - veja o código clicando aqui:

    Código:

    Public Function Pausa(Nsec As Variant)
    'uso: Pausa 1  = 1 segundo
    On Error GoTo Err_Pausa

       Dim PausaTime As Variant, start As Variant

       PausaTime = Nsec
       start = Timer
       Do While Timer < start + PausaTime
       DoEvents
       Loop

    Exit_Pausa:
       Exit Function

    Err_Pausa:
       Dialog.Box err.Number & " - " & err.Description, vbCritical, "Pausa()"
       Resume Exit_Pausa

    End Function


    santa


    .................................................................................
    A pergunta que não quer calar:
    Por quê quando alguém vem pedir ajuda e conforme o caso pedimos
    para enviar parte do projeto, não temos mais continuidade do tópico?  
    Crê que temos bolas de cristal ou está com medo que "roubemos"  a
    idéia/projeto dele?  Twisted Evil
    Se é tão bom assim...


    Ajude a ser ajudado:
    Seja objetivo na dúvida, dê os detalhes do que precisa, sem rodeios.
    Quando anexar teu projeto, diga onde está o problema, ganhamos mais tempo
    sem precisar procurar o mesmo.
    walisilva
    walisilva
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 34
    Registrado : 10/09/2015

    Como saber se um arquivo está sendo utilizado? Empty Re: Como saber se um arquivo está sendo utilizado?

    Mensagem  walisilva 23/12/2015, 18:50

    Ótimo, vou estar essa pausa.

    Minha ideia seria, tratar esse erro. Quando der erro ai sim esperar e tentar de novo. Mas adicionar tempo ao meu codigo vai diminuir meu desempenho ao longo do dia.


    .................................................................................
    --
    Walison Silva Cool
    Noobezinho
    Noobezinho
    Moderador
    Moderador


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 4140
    Registrado : 29/06/2012

    Como saber se um arquivo está sendo utilizado? Empty Re: Como saber se um arquivo está sendo utilizado?

    Mensagem  Noobezinho 23/12/2015, 19:39

    Essa pausa é somente para esperar o Access terminar a operação.

    Ou seja, com ou sem pausa, terá que esperar o código terminar e liberar o arquivo,

    para então poder deleta-lo.

    Tentar tratar o erro não vai adiantar porque ele ainda não existe.

    O erro só acontece quando tenta deletar o arquivo antes do tempo.

    santa


    .................................................................................
    A pergunta que não quer calar:
    Por quê quando alguém vem pedir ajuda e conforme o caso pedimos
    para enviar parte do projeto, não temos mais continuidade do tópico?  
    Crê que temos bolas de cristal ou está com medo que "roubemos"  a
    idéia/projeto dele?  Twisted Evil
    Se é tão bom assim...


    Ajude a ser ajudado:
    Seja objetivo na dúvida, dê os detalhes do que precisa, sem rodeios.
    Quando anexar teu projeto, diga onde está o problema, ganhamos mais tempo
    sem precisar procurar o mesmo.
    walisilva
    walisilva
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 34
    Registrado : 10/09/2015

    Como saber se um arquivo está sendo utilizado? Empty Re: Como saber se um arquivo está sendo utilizado?

    Mensagem  walisilva 23/12/2015, 20:22

    É isso que estou falando. Preciso saber como faço pra, antes de deletar, verificar se o arquivo existe (que existe mesmo) e se ele não está sendo utilizado. Caso ocorra de ele não existir ou estar sendo usado, geraria o erro mas, no tratamento eu aguardaria (while...loop) ele atender a minha necessidade.

    Porém, qualquer tratamento de erro que eu colocar (código do erro: 70) não consigo tratar.


    .................................................................................
    --
    Walison Silva Cool

    Conteúdo patrocinado


    Como saber se um arquivo está sendo utilizado? Empty Re: Como saber se um arquivo está sendo utilizado?

    Mensagem  Conteúdo patrocinado


      Data/hora atual: 22/11/2024, 12:22