locked
Projeto Access - Atachar Documentos RRS feed

  • Pergunta

  • Em um projeto Access com base de dados SQL 2000, estou querendo atachar uma planilha do Excel, Word, um arquivo .pdf, uma imagem scaneada de um documento.

    Isto é possível? Se sim que tipo de dados uso, que objeto do Access (projeto de acesso a dados), e como seria a instrução em VBA para fazer isto?

    terça-feira, 17 de julho de 2007 18:54

Respostas

Todas as Respostas

  • Oi Sergio,

     

    se o que você chama de atachar é vincular, não será possível.

     

    Se é apenas armazenar em um campo aí sim conseguirá. Use um campo do tipo Image.

    domingo, 22 de julho de 2007 00:56
    Moderador
  •  

    Você postou esta dúvida no Forum da FA. Veja no link a solução que postei!

    http://forumaccess.com/eve/forums/a/tpc/f/273606921/m/9851076702?r=9851076702

     

    Sérgio

     

    Testou a solução?

    domingo, 22 de julho de 2007 14:53
  • Alexandre,

     

    Desculpe não ter respondido antes.

     

    Não deu certo,

     

    Fiz assim:

     

      If Len(Me.txtCaminho) = 0 Then
            MsgBox "Não há arquivo selecionado para anexar.", vbInformation, "Atenção"
            Exit Sub
        End If
       
       
        'Abre conexão e insere um novo registro
        Set conn = CurrentProject.Connection
        rs.Open "T_NS_Anexos", conn, adOpenDynamic, adLockOptimistic
        rs.AddNew
        rs("NUM_ID_NS") = 1
        rs("DAT_Data") = Date
        rs.Update
        rs.Close

     

    Aqui aparece a mensagem de erro: Erro em tempo de execução '13' - Tipos incompatíveis.
          
        ImportFile Me.txtCaminho, Me.OLENãoAcoplado15  

     

    Tentei assim tambem:

     

    Set rs = New ADODB.Recordset
       rs.Open "Select * FROM T_NS_Anexos WHERE (NUM_ID_NS = 1)", conn, adOpenDynamic, adLockOptimistic
        
       ImportFile Me.txtCaminho, rs.Fields.Item(3) 'O item 3 é o campo bynario.

     

    Passa pela chamada da sub, porém quando na instrução abaixo, vai direto para amensagem de erro.

     

    Dest.Value = Null
      Dest.AppendChunk buf

     

     Nota: Estou tentando anexar um arquivo .doc

    Uma pergunta: quando efetuar a anexação do arquivo, como vou salva-lo. Dando um UPDATE no registro?

     

    segunda-feira, 23 de julho de 2007 21:22
  • Sergio,

     

    veja se lhe ajuda: http://support.microsoft.com/kb/258038

    terça-feira, 24 de julho de 2007 01:01
    Moderador
  • Luis Claudio.

     

    Antes de ver a sua resposta, pelo google eu cheguei fui até o link acima, depois de meche e remeche funcionou de acordo com a página da Microsoft:

     

    Set rs = New ADODB.Recordset
    rs.Open "Select * FROM T_NS_Anexos WHERE (NUM_ID_NS = 1)", cn, adOpenKeyset, adLockOptimistic

    Set mstream = New ADODB.Stream
    mstream.Type = adTypeBinary
    mstream.Open
    mstream.LoadFromFile  "<path to .gif file>"  'Eu substitui para me.txt_Caminho
    rs.Fields("ARQ_Anexo").Value = mstream.Read
    rs.Update
     

    Só que com seu exemplo também está gravando: If Len(Me.txtCaminho) = 0 Then
                
        ImportFile Me.txtCaminho, rs.Fields("ARQ_Anexo")
        
        Me.txtCaminho = ""
        Call FechaTabela
        Call AbreTabela

     

    E tem a vantagem de não ter que alterar a referência do MS ActiveX

     

    Agora o problema é para extraí-lo no formato original, pois etou excutando DumpFile "c:\Temp\Exemplo.doc", rs.Fields("ARQ_Anexo").OriginalValue, e o texto impresso é em bynário. 

    terça-feira, 24 de julho de 2007 02:45
  • DumpFile "c:\Temp\Exemplo.doc", rs.Fields("ARQ_Anexo")

     

     

    terça-feira, 24 de julho de 2007 03:27
  • Continua do mesmo jeito, cria o arquivo, pergunta qual o tipo de arquivo para conversão deixo Windows Padrão.

     

    Alexandre, tentei recuperar os dados pelo método da Microsoft e não deu certo, então fiz tudo pelo método dela, tando a conversão para binário, quanto a recuperação para o formato original e funcionou direitinho.

    O meu problema é que tenho que confirma se o Access 2000 tem o MS AtiveX 2.5, se sim está tudo resolvido, se não, está função que tem o objetivo de elinar o transito de papel no meu setor fica para quando a empresa trocar as versões do Access, ou eu aprender a trabalhar direito com VB.NET 2005 (ainda tenho algumas dúvidas. Veja um post meu no MSN e no ForumAccess que está sem resposta, é sobre DataRelation).

    Mas voltando ao assunto, no post original eu informe que estava trabalhando com Access e base SQL 2000, você me orientou que o campo tinha que ser to tipo OLE, mas o SQL não tem este tipo de dado, só o Access.mdb, no sql estou usando Bynario.

    Como a tentativa de recuperar os dados pela funçao da microsoft falhou na primeira vez, será que o problema não está na sub de conversão para binário?.....

    De qualquer maneira, muitíssimo obrigado em seu interesse e disposição em me ajudar, se você conseguir resolver este problema, eu ficarei sabendo de imediato, pois o meu email fica aberto o dia inteiro, e logo que reber um alerta, verifico.

     

    Um abraço e boa noite.

    terça-feira, 24 de julho de 2007 03:54
  • Oi Sérgio

     

    É provavel que não esteja colocando a extensão do arquivo. Montei um exemplo para você entender

    http://www.4shared.com/file/20608037/b57b889a/ImportExporFileDatabase.html

     

    Poste um feedback para dizer se entendeu

     

     

    quarta-feira, 25 de julho de 2007 04:35
  • Alexandre.

     

    Funcionou direitinho.

    A importação não tive problema, mas na exportação quando da configuração da propriedades do File dialog, tive que comentar o filtro, pois o obleto não aceitava a propriedade.

     

    Function FileDialog(TypeDialog As enuOptionFile) As String

       
        With Application.FileDialog(TypeDialog)
       
            .Title = "Select / Save File..."
            '.Filters.Add "All FIles", "*.*"
               
            If .Show <> 0 Then
                FileDialog = .SelectedItems.Item(1)
            End If
       
        End With

    End Function

     

     

    Para testar a exportação, fiz antes uma pequena modificação no arquivo original, exportei, e conferi o arquivo. A mudança que havia feito não estava lá ou seja, o arquivo foi substituído.

     

    Aqui em casa uso o Access 2007, porém na empresa é o 2000.

     

    Duas dúvidas:

    • Na declaração, você esta definindo o que?

            Public Enum enuOptionFile
                   OpenFile = 3
                   SaveFile = 4
             End Enum

    • Notei que quando da exportação a Caixa de Dialogo abre na pasta original do arquivo, há como definir uma pasta default, ou melhor, todo arquivo que anexar ao banco, irá se referir a uma determinada Nota de Serviço que será gravada em um campo da tabela de arquivos anexados, além do nome do arquivo anexado e do próprio arquivo, o que eu quero é que salve diretamente na pasta default, e na subPasta com o número desta Nota de Serviço, se esta não existir, que seja criada. Isto é possível?

           Exemplo: C:\NS_Anexos/NS00001

    quarta-feira, 25 de julho de 2007 19:12
  • Díuvidas:

     

    1) A FileDilog só está disponível a partir do 2003 (não tenho certeza), caso tenha problema, procure no www.jrfaq.com uma classe que faz esta função, para versões anteriores.

     

    2) O enum serve apenas para estruturar o código. O que é mais Facil de ler:

     

    FileDialolg(3) ou FileDialog(OpenFile), é uma boa prática, pois, qualquer pessoa que ler este código saberá que estou pedindo para abrir.

     

    3) Para definir como Default, utilize a propriedade .InitialFileName

     

    4) Para Criar a pasta caso não exista

    Code Snippet

    Dim FolderName as String

    FolderName = "C:\NS_Anexos\" & me.txtNumeroDaNotaServico

    On error Resume Next 'Caso já exista a pasta vai para o próximo passo

    MkDir(FolderName)

     

    On error goto Line_error 'Volto para linha de erros

    .InitialFileName = FolderName

    ... segue o código

     

     

    Informe se deu certo!

     

    quinta-feira, 26 de julho de 2007 17:18
  • Luiz Claudio,

     

    O método que o Alexandre sugeriu funciona muito bem no Access 2003, mas no 2000 não.

    Resolvi seguir a sugestão e fiz o seguinte código do link acima.

     

    Mas está ocorrendo um erro (-2147217887)  "Operação de várias etapas gerou erro. Verifique cada valor de Status"

    O erro ocorre na linha sublinhada em amarelo.

     

    Option Compare Database


    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim mstream As ADODB.Stream
    Dim MyFile

    Private lngNS As Long
    Private lngNumNS As Long
    Dim cmDIL As New CommonDialog
    Dim strSQL As String

    -------------------------------------------------------------------------------------------------------------

     

    Private Sub cmdImport_Click()
    On Error GoTo Err_cmdImport_Click

        Call FileDialog
        If MyFile = vbNullString Then
            MsgBox "Não foi selecionado nenhum arguivo a adicionar", _
            vbInformation, "Atenção"
            Exit Sub
        End If

     

        Dim buf
        buf = Split(MyFile, "\")

     

        strSQL = "Select * FROM T_NS_Anexos"
        Set cn = CurrentProject.Connection
        Set rs = New ADODB.Recordset

        rs.Open strSQL, cn, adOpenKeyset, adLockOptimistic
       
        Set mstream = New ADODB.Stream
        mstream.Type = adTypeBinary
        mstream.Open
        mstream.LoadFromFile (MyFile)
       
        rs.AddNew

        rs.Fields("ARQ_Anexo").Value = mstream.Read
        rst.Fields("NUM_ID_NS") = lngNS
        rst.Fields("NOM_Arquivo") = buf(UBound(buf))
        rs.Update
       
        Me.lstAnexos.Requery
        Me.Recalc: Me.Requery: Me.Repaint
        DoCmd.GoToRecord , , acLast
       
        rs.Close
        cn.Close
        Set cn = Nothing
        Set rs = Nothing
       
    Exit_cmdImport_Click:
        Exit Sub

    Err_cmdImport_Click:
        If Err <> 0 Then MsgBox Err.Description & " - Erro: " & Err.Number
        Resume Exit_cmdImport_Click
    End Sub    
       
    Private Sub FileDialog()
        With cmDIL
            'diretorio de inicio
            .InitDir = "C:\"
            'título da caixa
            .DialogTitle = "Localizar Arquivo"
    '        'filtra os arquivos
            .Filter = "All Files"
            .ShowOpen 'Localizar Arquivo
            'retornando o caminho e o nome do arquivo para variavel
            MyFile = .FileName
        End With
       
    End Sub

     

    terça-feira, 21 de agosto de 2007 20:01