Views

Important:

Quaisquer necessidades de soluções e/ou desenvolvimento de aplicações pessoais/profissionais, que não constem neste Blog podem ser tratados como consultoria freelance à parte.

...

31 de agosto de 2013

Tips - Higienização de Dados - Data Scrubbing - Data Cleansing




O que é a Higienização de Dados?

A Higienização de Dados, nada mais é do que uma limpeza na base de dados. É um processo de alteração ou remoção dos dados incorretos, incompletos, mal formatados, ou duplicados que estejam na base de dados.

Organiza os dados de uma empresa num modelo de negócios específico tal como bancos, seguradoras, varejo, telecomunicações, e transportes. A companhia cria ou compra ferramentas de higienização e as 'esfrega'  na sua base de dados para analisá-los sistematicamente usando regras, algoritmos e tabelas de consulta. 

Normalmente, uma ferramenta de banco de dados inclui programas de lavagem que são capazes de corrigir uma série de tipos específicos de erros, como a adição de códigos postais em falta ou encontrar registros duplicados. 

Quando um 
administrador de banco de dados utiliza uma ferramenta de lavagem de dados, pode economizar uma quantidade significativa de tempo, sendo menos dispendioso do que corrigir os erros manualmente.

Vantagens em manter os dados higienizados:

Acelera a entrega de informações críveis,

Incorpora qualidade aos dados,

Reduz erros dispendiosos, impede a propagação de dados ruins, corrige os erros na origem,

Mantém os dados atuais e precisos com uma auditoria regular,

Padroniza os dados de várias fontes,

Reduz a redundância dos dados corporativos para dar suporte a relatórios mais precisos, além das análises e das decisões de negócio.

Adiciona valor aos dados existentes, gerando e / ou acrescentando informação a partir de outras fontes.

Tags: 
data, scrubbing, cleansing, raw data, source data, atomic data, data-driven decision management (DDDM), data-driven disaster, synthetic backup, data governance,DG, fixed data, data hygiene, data quality

Excel Tips - Aplicando Zoom correto aos seu Dashboards



Qualquer um que tenha desenvolvido um Dashboard no MS Excel provavelmente já experimentou este problema:

O meu painel que se encaixa muito bem na minha tela, não fica tão bem no meu cliente.

Sim, é o antigo problema de diferentes monitores, resoluções, tamanho das fontes e outras configurações que fazem o que parece ótimo em sua tela parecer muito pequeno ou muito grande em outra.

Já implementei algumas idéias bem diferentes para contornar este problema, os quais incluem redimensionar a planilha, redimensionar a janela do MS Excel.

Mas aqui está a ideia que me ocorre no momento:

Provavelmente, o seu Dashboard atual foi ampliado para a sua "melhor visualização. Com isso quero dizer a sua planilha atual está no nível de zoom adequado de tal forma que o seu painel é exibido de forma eficaz. Se não for, vá em frente e coloque-o no zoom ideal para a sua tela. Use a imagem abaixo como um guia.


Como próximo passo vai querer tomar nota das colunas que medem sua tela.

Acima, verá que selecionei colunas "A1: Z1", mas deixei a última coluna, "AA1" desmarcada.

Anote a sua seleção, vamos usá-la em um momento.

Vá até o VBE (Editor Visual Basic) para o configurarmos.

Uma vez que queremos que o nosso Dashboard proporcionem uma visualização correta sempre que alguém o abrir, caso contrário de que adianta, adicionaremos algum código para ser executado direito quando o workbook for aberto pela primeira vez.

No canto superior esquerdo do VBE verá uma caixa que contém os objetos do Microsoft Excel. Dê um duplo clique em Thisworkbook da pasta de trabalho pertencente ao nosso projeto.


Ao lado direito, na janela de código, selecione "Workbook" no objeto dropdown a esquerda. Então selecione o método "Open" no dropdown a direita.

Uma Procedure workbook_Open() aparecerá na janela abaixo. 


Agora digite o seguinte código acima, dentro da sua nova procedure. Lembre-se do Range A1:Z1

Para ver se o nosso código realmente funciona volte para a planilha para testar, aplique um zoom enorme, num nível que o Dashboard nunca deva estar. Agora salve e saia.
(Ahh, certifique-se de salvá-lo como um macro xlsm enabled na sua pasta de trabalho)

Abra o seu Dashboard!

Há algumas coisas que eu deveria mencionar:

- O usuário talvez precise "Habilitar Macros" antes do código entra em vigor.
- Se o Excel não foi fechado corretamente em uma utilização anterior, a caixa mostrando os arquivos que não foram salvos provavelmente aparecerão no seu painel
- Às vezes o MS Excel não abrirá num estado maximizado - mas pode corrigir isso com algum código VBA.

Este código pareceu ser uma boa solução em alguns dos meus projetos, mas não trabalhei com ele em todos os computadores, nos mais diversos clientes diferentes.

Deixe-me saber o que você pensa - foi útil? Como você começa exibindo a mesma coisa em telas diferentes?

Tags: VBA, Excel, workbook, zoom, 




A&A - Dados ou Informações?



Empresas em todo o mundo estão permeadas de dados oriundos de diversas fontes distintas e apesar do fácil acesso a estes, têm dificuldades em obter as necessárias informações para suas relevantes tomadas de decisões.

Não é menos verdade, nem tão pouco raro, o fato de que em muitas reuniões a maioria dos diretores, e/ou gerentes presentes estejam munidos de 
informações
 pouco relevantes ou totalmente irrelevantes. É certo que têm acesso aos seus próprios dados de A a Z
, mas estes estão completamente desprovidos de conteúdo útil. Geralmente tais amontoados de dados não contém nem a abrangência necessária e tão pouco a diversidade apropriada, que lhes propiciem dinamicidade na análise.

Em alguns casos as corporações têm acesso a uma megabase de 
dados distribuidos nos seus servidores, não raramente reunidos sob os acrônimos: 
BIDW (Datawarehouse) e cubos OLAP (online analytical processing)

informação, [algo que realmente agregue, aponte, antecipe, ou mesmo complemente] decisões é muito preciosa e deve ser obtida de forma rápida e exata.

Quando a questão é reunir informações de diferentes países, traduzindo-as nas 
estratégias e objetivos das suas respectivas companhias, os executivos têm deparado-se com um enorme desafio para a grande maioria deles, isso em todo o mundo. Não é difícil que os KPIs (Indicadores de Performance) definidos corporativamente não estejam alinhados com as suas estratégias.

A diversidade de 
bases de dados nas quais as informações se encontram são muito variáveis. O verdadeiro desafio ocorre no momento de consolidá-las em Dashboards e Scorecards por exemplo. Estas precisam ser reunidas de modo coerente e sucinto. 


No caso dos Balanced Scorecards (BSCs), estes oferecem aos executivos as ferramentas para atingirem o sucesso na obtenção de suas informações. Esta importante ferramenta sim, traduz a missão e a estratégia das suas empresas num conjunto abrangente de medidas de desempenho que servem 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 é: M
esmo cercado por dados de todas as origens, como posso obter informações relevantes para tomar minhas decisões?
 Tags: A&A, dados, informações

Excel Tips - Enviando e-mails a partir do Excel



Estender certa praticidade aos nossos clientes, facilitando-lhes o dia-a-dia, é um prazer para nós desenvolvedores, certo?

Abaixo replico um post antigo, e agora ampliado, com uma funcionalidade que visa facilitar o compartilhamento dos nossos 

BIs (Business Information), 

BSCs

Dashboards

Scorecards 

Ou mesmo dos relatórios e gráficos que estão contidos em nossos MISs. 

Como? 

Enviando-os por e-mail. Sugiro algumas aplicabilidades práticas para a utilização do envio automatizado e e-mails:

: : Sabe quando você está responsável por consolidar diversas planilhas em uma só e o pessoal que precisa enviar-lhe as planilhas (ou disponibilizá-las em algum lugar) não o fazem? então, automatize a cobrança por e-mail


: : Ao invés de gastar tempo reunindo todas as planilhas após o fechamento e enviá-las uma-a-uma a todos os gestores, reúna os dados em um só recipiente, crie uma lista de quem receberá as planilhas e pronto!

A primeira opção utiliza o método SEND, e serve como incentivo a sua pesquisa e estudo. 

Sub SendPlanNow()
    ActiveWorkbook.SendMail _

    Recipients:="bernardess@gmail.com", _

    Subject:="Enviando e-mail da aplicação Excel em: " & Format(Date, "dd/mm/yyyy")
End Sub
Outras necessidades vão se desenrolando com o passar do tempo, como por exemplo copiar a pasta ativa (ActiveSheet), envindo a planilha em seguida:

Sub Send1Sheet_ActiveWorkbook()
    ' Criando uma nova planilha (workbook) contendo um Sheet, e enviando-a 
      como um arquivo anexado.

    ThisWorkbook.Sheets(1).Copy   

    With ActiveWorkbook

         .SendMail Recipients:="bernardess@gmail.com", _

          Subject:="Tente contatar-me em: " & Format(Date, "dd/mmm/yy")

         .Close SaveChanges:=False

    End With

End Sub

Outro método que pode ser usado é o Método de Roteirização, este encaminha a pasta de trabalho (worksheet), a partir de uma lista seguindo o roteiro atual, isto nos permite especificar inúmeros destinatários.

Sub RoutingActwBook()
    With ActiveWorkbook

       Let .HasRoutingSlip = True

           With .RoutingSlip

                Let .Delivery = xlOneAfterAnother
                Let .Recipients = Array("bernardess@gmail.com", "inanyplace01@gmail.com", "inanyplace02@gmail.com")
                Let .Subject = "Por favor, dê atenção a este relatório"
                'Let.Message = ""

          End With

        .Route

    End With
End Sub

Um outro problema comum encontrado em diversos códigos onde se faz citação ao envio de e-mails de modo automatizado é a aparição de mensagens similares a:

"A program is trying to automatically send e-mail..."

"Um programa está tentando enviar..."

Como eliminar de vez esta constante mensagem de exibição? 

Bem, a solução não está no MS Excel, neste caso, pois esta solução pode ser implementada em qualquer um dos produtos do MS Office.

Crie um novo módulo no MS Outlook e cole o código abaixo (Agradecimentos antecipados ao Waine Phillips, dono da solução):

Public Function FnSendMailSafe(strTo As String, _

                                strCC As String, _

                                strBCC As String, _

                                strSubject As String, _

                                strMessageBody As String, _

                                Optional strAttachments) As Boolean

    On Error GoTo ErrorHandler:

    Dim MAPISession As Outlook.NameSpace
    Dim MAPIFolder As Outlook.MAPIFolder
    Dim MAPIMailItem As Outlook.MailItem
    Dim oRecipient As Outlook.Recipient
    Dim TempArray() As String
    Dim varArrayItem As Variant
    Dim strEmailAddress As String
    Dim strAttachmentPath As String
    Dim blnSuccessful As Boolean

    'Obtendo o MAPI do objeto NameSpace

    Set MAPISession = Application.Session

    If Not MAPISession Is Nothing Then

      'Logando-se na sessão MAPI

      MAPISession.Logon , , True, False

      'Criando um ponteiro na pasta Outbox

      Set MAPIFolder = MAPISession.GetDefaultFolder(olFolderOutbox)

      If Not MAPIFolder Is Nothing Then

        ' Criando um novo item de e-mail item na pasta "Outbox"

        Set MAPIMailItem = MAPIFolder.Items.Add(olMailItem)

        If Not MAPIMailItem Is Nothing Then
         
          With MAPIMailItem

            'Criando um novo recipiente para TO

                Let TempArray = Split(strTo, ";")

                For Each varArrayItem In TempArray

                    Let strEmailAddress = Trim(varArrayItem)

                    If Len(strEmailAddress) > 0 Then

                        Set oRecipient = .Recipients.Add(strEmailAddress)

                        Let oRecipient.Type = olTo

                        Set oRecipient = Nothing

                    End If
               
                Next varArrayItem
           

            'Criando um recipiente para CC

                Let TempArray = Split(strCC, ";")

                For Each varArrayItem In TempArray

                    Let strEmailAddress = Trim(varArrayItem)

                    If Len(strEmailAddress) > 0 Then

                        Set oRecipient = .Recipients.Add(strEmailAddress)

                        Let oRecipient.Type = olCC

                        Set oRecipient = Nothing

                    End If

                Next varArrayItem
           
            'Criando recipiente para BCC

                Let TempArray = Split(strBCC, ";")

                For Each varArrayItem In TempArray

                    Let strEmailAddress = Trim(varArrayItem)

                    If Len(strEmailAddress) > 0 Then

                        Set oRecipient = .Recipients.Add(strEmailAddress)

                        Let oRecipient.Type = olBCC

                        Set oRecipient = Nothing

                    End If
               

                Next varArrayItem
           

            'Configurado a mensagem do SUBJECT

                Let .Subject = strSubject
           

            'Configurando a mensagem do corpo od e-mail (em HTML ou texto)

                If StrComp(Left(strMessageBody, 6), "<HTML>", vbTextCompare) = 0 Then

                    Let .HTMLBody = strMessageBody

                Else

                    Let .Body = strMessageBody

                End If


            'Adicionando qualquer anexo especificado

                'Let TempArray = strAttachments

                For Each varArrayItem In strAttachments

                    Let strAttachmentPath = Trim(varArrayItem)

                    If Len(strAttachmentPath) > 0 Then
                        .Attachments.Add strAttachmentPath
                    End If
               

                Next varArrayItem

            .Send


            Set MAPIMailItem = Nothing

          End With

        End If

        Set MAPIFolder = Nothing

      End If

      MAPISession.Logoff

    End If


    Let blnSuccessful = True
   

ExitRoutine:

    Set MAPISession = Nothing
    Let FnSendMailSafe = blnSuccessful

    Exit Function


ErrorHandler:

    MsgBox "Occoreu um erro na função VBA FnSendMailSafe()" & vbCrLf & vbCrLf & _

            "Nº do erro: " & CStr(Err.Number) & vbCrLf & _

            "Descrição do erro: " & Err.Description, vbApplicationModal + vbCritical

    Resume ExitRoutine

End Function

Já no MS Excel (ou qualquer outro produto do MS Office), cole o código abaixo:Chame essa função com os parâmetros da mensagem.
No parâmetro TO (Para) e CC é só separar os e-mails com ;[ponto-e-vírgula], e os anexos precisarão estar numa matriz.

Function SendMail (para As String, cc As String, assunto As String, mensagem As String, Anexos) As Boolean
         'enviar e-mail via Outlook
         Dim objOutlook As Object ' Note: Must be late-binding.
         Dim objNameSpace As Object
         Dim objExplorer As Object
         Dim blnSuccessful As Boolean
         Dim blnNewInstance As Boolean 

         On Error Resume Next

         Set objOutlook = GetObject(, "Outlook.Application")

         On Error GoTo 0

         If objOutlook Is Nothing Then
             Set objOutlook = CreateObject("Outlook.Application")

             Let blnNewInstance = True

             Set objNameSpace = objOutlook.GetNamespace ("MAPI")
             Set objExplorer = objOutlook.Explorers.Add (objNameSpace.Folders(1), 0)

             objExplorer.CommandBars.FindControl(, 1695).Execute
                   
             objExplorer.Close
               
             Set objNameSpace = Nothing
             Set objExplorer = Nothing
         End If

         Let blnSuccessful = objOutlook.FnSendMailSafe (para, cc, "", assunto, mensagem, Anexos)

         If blnNewInstance = True Then objOutlook.Quit

         Set objOutlook = Nothing

         Let EnviarEmail = blnSuccessful
End Function


Tags: VBA, e-mail, send, Excel

ACCESS Tips - Campo Auto Numérico - Creating an AutoNumber field from code - VBA, DAO, DDL e SQL



Existem 2 caminhos para acrescentarmos um campo cujo o conteúdo seja autonumerado:

Um dos modos é fazê-lo através do comando SQL DDL Create Table, e o outro é o modo como abordaremos neste artigo usando VBA e DAO para adicionar um campo em uma tabela pré-existente.

Antes de continuar, um pequeno parênteses, deixe seus comentários para este post.  

A função abaixo, desenvolvida por Dev Ashish, serve para efetuar tal ação em qualquer tabela na qual tenhamos a necessidade de inserirmos um campo numerado.

Function fCreateAutoNumberField (ByVal strTableName As String, ByVal strFieldName As String) As Boolean
    Dim db As DAO.Database
    Dim fld As DAO.Field
    Dim tdf As DAO.TableDef

    On Error GoTo ErrHandler

    Set db = Application.CurrentDb
    Set tdf = db.TableDefs(strTableName)
    
    '   Primeiro criamos um campo com o tipo = Long Integer
    Set fld = tdf.CreateField(strFieldName, dbLong)
    
    With fld
        '   Adicionamos o dbAutoIncrField para efetuar chamadas ao Jet que sozinho efetuará a autonumeração do campo
        Let .Attributes = .Attributes Or dbAutoIncrField
    End With
    
    With tdf.Fields
        .Append fld
        .Refresh
    End With
    
    Let fCreateAutoNumberField = True
    
ExitHere:
    Set fld = Nothing
    Set tdf = Nothing
    Set db = Nothing
    Exit Function
ErrHandler:
    Let fCreateAutoNumberField = False
    
    With Err
        MsgBox "Erro: " & .Number & vbCrLf & .Description, _
            vbOKOnly Or vbCritical, "CreateAutonumberField"
    End With

    Resume ExitHere
End Function


Ei, Ok! tudo bom, tudo legal, mas e quanto a primeira opção? Não chorem, coloquei-a mais abaixo:

Para criar uma tabela com um campo com AutoNumeração e PrimaryKey, além de um campo chamado MyText com o tipo TEXTO e comprimento de 10, insira a instrução a seguir na janela de consulta de definição de dados e, em seguida, executar a consulta.

CREATE TABLE Table1 _
(Id COUNTER CONSTRAINT PrimaryKey PRIMARY KEY, _
MyText TEXT (10))


Tags: VBA, autonumber, increment, Dev Ashish, counter

eBooks VBA na AMAZOM.com.br

Vitrine