04/12/2009

VBA Error 3275 - Unexpected error from external database driver

Pois é, erros e mais erros...

Conforme já tive chance de escrever aqui antes, invariavelmente somos expostos a erros quando estamos desenvolvendo soluções através das nossas aplicações, não raramente acompanhadas de uma demanda alta e com pouco tempo.

Especialmente quando envolve o inter-relacionamento entre aplicações distintas, neste caso utilizo o
MS Office 2007.

As interações podem ocorrer entre o MS Access e o MS Excel, numa constante troca de dados, com a criação de diversas planilhas repletas de fórmulas, ou mesmo a exportação de diversos painéis de dados (como um Dashboard) para apresentações MS PowerPoint dentro de um ciclo contínuo.

No cenário descrito acima é muito provável que nos deparemos com o famoso, pouco conhecido, mas muiiitooo chato: Erro 3275.

Este erro, quando pesquisado na literatura Microsoftniana, está acompanhado da seguinte definição:
Unexpected error from external database driver <error number>, ou,
Erro inexperado causado pelo driver de banco de dados externo <número do erro>

Este erro torna-se ainda mais comum durante a execução repetitiva da seguinte linha de comando:
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, nquery, PlanTarget

Pode percebê-lo melhor dentro da funcionalidade abaixo, a qual é evocada dentro de um ciclo constante.
Function Qualquer
    ' 1ª FASE - Copia a planilha enviada como referência.
    ' ----------------------------------------------------------------------------------------
    Set objExcel = CreateObject("Excel.Application")
    Set objWorkBook = objExcel.Workbooks.Open(PlanBase)

    ' Salva planilha com o nome temporário.
    objExcel.Workbooks(1).SaveAs (PlanTarget)
    objExcel.Quit
   
    ' Cria Query tmp, base da planilha.
    Set Cria_Query = CurrentDb.CreateQueryDef(nquery, strSQL)

    Call Sleep(2000)  ' Pausa para o sistema operacional não fundir...
    Debug.Print Right(Now(), 8), nquery, strSQL, PlanTarget

    ' Insere planilha com dados.
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, nquery, PlanTarget

    ' Delete a query temp
    DoCmd.DeleteObject acQuery, nquery

    ' Final - Limpa as variáveis.
    ' ----------------------------------------------------------------------------------------
    Set Cria_Query_PXBR = Nothing
    Set objWorkBook = Nothing
    Set objExcel = Nothing
End Function

Certamente percebeu a ocorrência da função Sleep() no trecho de código colado aí acima. Este foi
implementado com o único propósito de 'atrasar' a funcionalidade para que esta possa ter tempo de
exportar os dados para a planilha e em seguida dar continuidade ao processo.

Percebi, pelo menos neste meu problema, que a interação entre as aplicações necessita de um tempo para o processamento completo, o qual envolve:

- Busca dos dados dentro da base;
- Exportação destes dados para uma planilha, que tem como base um modelo;
- Adequação dos dados nesta planilha modelo.

Ao passo que o MS Access executava suas funcionalidade de uma forma rápida, o mesmo não ocorria com MS Excel que ficava 'agarrado' no seu processamento de forma mais lenta (letárgica diria). Para tanto, precisei dar um sossega leão no MS Access, utilizando a função Sleep().

Call Sleep(4000)  ' Pausa para o sistema operacional não fundir...
Pode ser que necessite dessa funcionalidade em outros aspectos, por isso te passo o modo como
resolvi aqui nesta Sleep(), mas poderá fazer de outro modo:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Seria muito legal, caso já tenha se deparado com este problema, que o comentasse, e como fez
para resolvê-lo. Desse modo criaremos um repositório para elucidar aqueles que forem atacados
pelo mesmo inconveniente Erro 3275.
 
Twitter: @officespecialis
             @brzexceldevelop
             @brzaccessdevel


01/12/2009

Tome posse das INFORMAÇÕES da sua empresa!

Empresas em todo o mundo estão permeadas de dados oriundos de diversas origens distintas e apesar do acesso a este, têm dificuldades em obter as necessárias informações para tomar as suas mais relevantes decisões.
 
Não é menos verdade que em muitas reuniões todos estejam munidos de INFORMAÇÕES totalmente irrelevantes. Têm acesso a dados de A a Z, completamente desprovidos de conteúdo, pois estes não contém a abrangência e nem a diversificação, que lhes propiciem dinamicidade na análise.
 
Em alguns casos as corporações têm acesso a um grande amontoado de dados distribuidos nos seus servidores como BIs, Datawarehouse e cubos OLAP.
 
Informação é algo muito precioso e deve ser obtida de forma rápida e exata.

Reunir informações de diferentes países, traduzindo-os nas estratégias e targets pré-estabelecidos tem sido um desafio para a maioria dos executivos em todo o mundo.
Não raro seus KPIs (Indicadores de Performance) não estão alinhados com as estratégias da empresa.

A diversidade de bases de dados nas quais as informações podem estar são muito variáveis, quando necessita consolidar tais informações em
Dashboards e Scorecards, estes precisam estar reundos de modo coerente e sucinto.

Os
Balanced Scorecards oferecem aos executivos as ferramentas que necessitam para alcançar o sucesso na obtenção de suas informações. Esta importante ferramenta traduz a missão e a estratégia da sua empresa num conjunto abrangente de medidas de desempenho que serve como base para o sistema de medição e gestão estratégica. Perseguindo os objetivos financeiros, incluindo os vetores de desempenho desses objetivos.

O grande dilema é: Mesmo estando cercado por dados de todas as origens, como posso  obter INFORMAÇÕES relevantes para tomar minhas decisões?

?ui=2&view=att&th=1254a1f913f53170&attid=0.1&disp=attd&realattid=ii_1254a1f913f53170&zw
Os conceitos e as regras de negócio precisam ser aplicados aos dados de modo a atender a empresa como um TODO e não apenas a alguns departamentos e países.

Os resultados mais comuns são INFORMAÇÕES IMPRECISAS, números que não coicidem durante as reuniões, resultando no adiamento de decisões altamente relevantes, ou na tomada de decisões inseguras.

Para que a Direção da empresa possa tomar decisões abalizadas, torna-se imprescindível que o conteúdo seja coeso, sintético e direcionado para atender o foco das reuniões.

O
Management Information System é um Sistema de Informação Gerencial, que interliga todos os dados da organização. Consiste na rede de canais de comunicação da organização permeando todas as estruturas executivas. É composto por todos os componentes que recolhem, manipulam e disseminam as informações. Nele estão inclusos hardware, software, pessoas, sistemas de telecomunicação, e os dados propriamente ditos.
Essas soluções são facilmente implementadas sem que se necessite adquirir novos softwares ou sistemas. Permita-me norteá-lo.
 
Utilize o que há de melhor em técnicas de análise!

:: Consulte seus dados concentrados em Scorecards.
:: Utilize layouts funcionais que destaquem as informações mais relevantes.
:: Envie ou arraste tabelas e gráficos para suas apresentações eletrônicas.
:: Compartilhe as informações através de Dashboards funcionais.

Cause um impacto positivo em todos os níveis executivos da sua gestão.

Entre em contato, presto consultoria pontual.

:: Avalie diferentes cenários
:: Reúna as informações mais importante para sua análise.
:: Efetue simulações com os dados reais ou com estimativas.
:: Compare suas informações com dados do seu Marketshare.
:: Tenha relatórios atualizados com informações oriundas da Internet.


Não é necessário a aquisição de nenhum produto!

Implemente soluções com os produtos já disponíveis na sua Empresa ou Departamento.

Reunir informações de diferentes países, traduzindo-os nas estratégias e targets pré-estabelecidos tem sido um desafio para a maioria dos executivos em todo o mundo.

- Torne a informação clara e compreensível nos seus relatórios
- Complete suas planilhas com mais funcionalidades.
- Melhore a apresentação das suas informações.
- Aplique layouts modernos.
- Envie dados diretamente para as apresentações do Powerpoint.
- Envie análises consolidadas diretamente para os seus clientes.
- Capte informações do marketshare diretamente da Web
.

Implemento soluções com os produtos já instalados na sua Empresa e Departamento.

Organizo os dados disponíveis, deixando seus novos relatórios com layouts funcionais.

Amplie a visão:
       Demonstração 1
       Demonstração 2
 
 

23/11/2009

VBA Access - Criando uma planilha (MS Excel com gráfico) a partir de uma aplicação MS Access.

Vez por outra recebo pedidos sobre como criar planilhas através do Access, ou seja, a partir de uma aplicação MS Access que alguém já tem desenvolvida.

Na verdade isso é muito simples, por isso estou ampliando alguns passos nesta criação. Além de demonstrar como criar a planilha, estou populando-a com dados e inserindo um gráfico, tudo programaticamente (ou de modo automatizado, como preferem alguns).

Espero que gostem, ampliem o exemplo e me retornem opiniões e acréscimos...Ahhh e o mais importante para toda a comunidade de desenvolvedores, compartilhe com o máximo de pessoas que conhecer!

Boa diversão!

 
Private Sub cmdMakeChart_Click()
    '  Author:                           Date:                     Contact:                           URL:
    '  André Bernardes             23/11/2009 10:40   
bernardess@gmail.com     http://al-bernardes.sites.uol.com.br/
    '  Cria uma planilha, popula-a com uma periodicidade e dados, cria um gráfico.
 
    Dim AppMSExcel As Excel.Application
    Dim the_date As Date
    Dim stop_date As Date
    Dim r As Integer
    Dim new_chart As Chart
    Dim new_book As Workbook
    Dim active_sheet As Worksheet
 
    ' Abre a aplicação MS Excel.
    Set AppMSExcel = CreateObject("Excel.Application")
 
    ' Mantém aplicação escondida.
    Let AppMSExcel.Visible = True
 
    ' Cria uma nova planilha (spreadsheet).
    Set new_book = AppMSExcel.Workbooks.Add()
 
    ' Gera valores randômicos dentro de um período.
    Set active_sheet = new_book.Sheets(1)
   
    Let the_date = CDate("01/11/09")
    Let stop_date = CDate("23/11/09")
    Let r = 1
   
    Do While the_date < stop_date
        Let active_sheet.Cells(r, 1) = the_date
        Let active_sheet.Cells(r, 2) = Int(Rnd * 90) + 10
        Let the_date = DateAdd("d", 1, the_date)
        Let r = r + 1
    Loop
 
    ' Cria um gráfico (chart) conectado a estes dados.
    Set new_chart = Charts.Add()
   
    With new_chart
        Let .ChartType = xlLineMarkers
       
        .SetSourceData Source:=active_sheet.Range("A1:B" & Format$(r - 1)), PlotBy:=xlColumns
        .Location Where:=xlLocationAsObject, Name:=active_sheet.Name
    End With
 
    Let active_sheet.Shapes(active_sheet.Shapes.Count).Top = 10
    Let active_sheet.Shapes(active_sheet.Shapes.Count).Left = 100
    Let active_sheet.Shapes(active_sheet.Shapes.Count).Width = 600
    Let active_sheet.Shapes(active_sheet.Shapes.Count).Height = 400
 
    ActiveChart.ChartArea.Select
 
    ' Acerta primeira fase de detalhes.
    With ActiveChart
        Let .HasTitle = True
        Let .ChartTitle.Characters.Text = "Valores de Fevereiro"
        Let .Axes(xlCategory, xlPrimary).HasTitle = True
        Let .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Data"
        Let .Axes(xlValue, xlPrimary).HasTitle = True
        Let .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Valores"
    End With
 
    ' Fecha a pasta (workbook) salvando.
    AppMSExcel.ActiveWorkbook.Close True
 
    ' Fecha o MS Excel.
    AppMSExcel.Quit
    Set AppMSExcel = Nothing
 
    MsgBox "Planilha Gerada!"
End Sub
 


André Luiz Bernardes
A&A - WORK, DON´T PLAY!
http://al-bernardes.sites.uol.com.br/
bernardess@gmail.com
 
Twitter: @officespecialis
                 @brzexceldevelop
                 @brzaccessdevel
 

 

19/11/2009

VBA Access - Removendo campos programaticamente

Remove Fields From MDB programmatically

O código VBA abaixo será usado para remover um campo de uma tabela do MS Access através da codificação VBA.

Sobre a função: Aceitará três parâmetros

1. Database Path - O caminho completo da base de dados MS Access

2. TableName - O nome correto da tabela do MS Access de onde o
campo será removido.

3. FieldName - O nome do campo a ser removido.

Function RemoveFieldFromMSACCESSTable (ByVal AccessDBPath, _
                                       ByVal AccessTableName As String, _
                                       AccessFieldName As String _
                                      ) As Boolean

  ' Declaração das variáveis.
  Dim AccessDB As Database
  Dim AccessDBPath As Variant
  Dim Td As TableDef

  On Error Resume Next


  ' Informa o Path do MS Access DB, baseado na TableName.

  ' Abre a base de dados.
  Set AccessDB = OpenDatabase(AccessDBPath) 'if linked table       

  If Err <> 0 Then           
    ' Caso falhe, retorna a base de dados.

    Exit Function       
  End If   


  ' Retorna a tabela.   
  Set Td = AccessDB.TableDefs(AccessTableName)   

  If Err <> 0 Then       
    ' caso falhe obtém a tabela.       

    GoTo End   
  End IF

  ' Deletando o campo.
  With Td       
    ' Deleta o campo.       
    .Fields.Delete AccessFieldName       

    If Err <> 0 Then           
      ' Caso falhe a deleção do campo - possivelmente não existe.           

      GoTo End       
    End If   
  End With   

  Let RemoveFieldFromMSACCESSTable = True ' O Default é False caso tenha falhado.


  ' Limpa.
End:   
  Set Td = Nothing   

  ' Close the Database   
  If Not AccessDB Is Nothing Then AccessDB.Close   

  Set AccessDb = Nothing
End Function

Exemplo do uso:
Public Sub RemoveField ()

' Exemplo da chamada:
If (RemoveFieldFromMSACCESSTable ( "C:\Bernardes\A&A.mdb", "Clientes", "TimeStamp") Then

MsgBox "Campo removido com sucesso!"

End If

End Sub
 

A chamada acima é utilizada para excluir de "C:\Bernardes\A&A.mdb", o nome da tabela é Clientes, e o nome do campo é "TimeStamp"
 
 
Twitter: @officespecialis
             @brzexceldevelop
             @brzaccessdevel


Veja também:
Blog Office VBA