Visual Studio 2005 – Extendendo o DataGridView Windows Forms

É, às vezes a Microsoft se esquece de algumas coisas, mas tenta consertar logo depois, seja por meio de patches ou através de exemplos postados em seu Knowledge Base.

Um desses esquecimentos, pelo menos que vivenciei, foi a falta do controle DateTimePicker para o .NET Compact Framework, quando me envolvi em um projeto para Pocket PCs. Apesar do controle não existir na ToolBox do Visual Studio .NET, a Microsoft o disponibiliza no site MSDN com código fonte e tudo mais. O link para o código nesta data é:
http://www.microsoft.com/downloads/details.aspx?FamilyID=11e2aa23-a6d3-441b-b622-b3a4d7695f44&DisplayLang=en

Não ter o controle pode dar um ar de imcompleteza à ferramenta, mas pensando pelo lado bom, talvez a real intenção seja mostrar o que é possível fazer com a esta. Venhamos e convenhamos, que programador se daria ao trabalho de construir do zero um DateTimePicker com todas as suas características? Acho que vale a observação.

Completando o assunto, acho que a Microsoft decidiu fazer o mesmo com o DateTimePicker para o controle DataGridView Windows Forms no Visual Studio 2005. Ele não é nativo, mas é possível adicioná-lo na nossa solução com o código também disponibilizado pela Microsoft:
http://msdn2.microsoft.com/en-us/library/7tas5c80(vs.80).aspx

Além de simplesmente embuti-lo no projeto, vale as pena uma bela olhada no código fonte.

Abraços

Tomás Vásquez

Parametrizando a importação de dados no Excel

Fazendo referência aos treinamentos em vídeo sobre união de planilhas usando a importação de dados no Excel, uma das dúvidas que surgiram entre os telespectadores foi sobre a parametrização dos dados nas consultas em SQL.

Pelo que entendi, foi uma tentativa de fazer analogia às consultas criadas no Access, em que costumeiramente menciona-se parâmetros na cláusula WHERE através do caractere chave colchete “[]”.

A criar uma consulta no Access como esta:

1
SELECT *FROM Clientes WHERE ID = [Digite o Id do Cliente];

Ao ser executada, surge uma caixa de texto com a mensagem colocada entre os colchetes da cláusula WHERE, para que o valor do parâmetro seja informado por digitação. O mesmo não acontece com o recurso de importação de dados do Excel. Pelo menos em meus testes, não consegui uma alternativa automática para fazer a importação de dados. Então, o jeito é fazer por código mesmo. Para tentar ajudar nesta tarefa, efetuarei o mesmo procedimento de importação de dados no vídeo de treinamentos com o gravador de macros ativado. Após isso, o seguinte código VBA é gerado:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Sub ImportarDados()
'
' ImportarDados Macro
' Macro gravada em 22/9/2006 por Tomás Vásquez
'
 
'
    With ActiveSheet.QueryTables.Add(Connection:=Array( _
                                                 "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source=C:\temp\Clientes.xls;Mode=Share Deny Write;Extended Prope" _
       , _
                                     "rties=""HDR=YES;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine Type=35" _
       , _
                                     ";Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Databa" _
       , _
                                     "se Password="""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=Fa" _
       , "lse;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False"), _
                                     Destination:=Range("A1"))
        .CommandType = xlCmdSql
        .CommandText = Array( _
                       "SELECT * FROM [Clientes$] WHERE CódigoDoCliente = ""ALFKI""")
        .Name = "Clientes"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .SourceDataFile = "C:\temp\Clientes.xls"
        .Refresh BackgroundQuery:=False
    End With
End Sub

Percebam que todos os dados informados foram gravados, inclusive o nome de planilha e o comando SQL. Agora, usando um pouco de código VBA adicionai, é perfeitamente possível parametrizar nossa importação de dados. Um exemplo extremamente simples é adicionar as seguintes linhas códigos e alterar a linha onde está o comando SQL:

1
2
3
4
5
Dim Codigo As String, SQL As String
Codigo = InputBox("Digite o Código do Cliente:", "Parâmetros da consulta", "Codigo")
SQL = "SELECT * FROM [Clientes$] WHERE CódigoDoCliente = """ & Codigo & """"
'nova linha do comando SQL
.CommandText = Array(SQL)

Agora é só executar e informar o valor do parâmetro na InputBox. Agora é usar a imaginação para construir consultas com parâmetros mais aprimorados, validação e tudo mais. É lógico que agora você pode extrair os valor do parâmetro de qualquer lugar da planilha, como o valor de uma célula, um UserForm. Abaixo segue o código completo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Sub ImportarDados()
'
' ImportarDados Macro
' Macro gravada em 22/9/2006 por Tomás Vásquez
'
 
'
    Dim Codigo As String, SQL As String
    Codigo = InputBox("Digite o Código do Cliente:", "Parâmetros da consulta", "Codigo")
    SQL = "SELECT * FROM [Clientes$] WHERE CódigoDoCliente = """ & Codigo & """"
    With ActiveSheet.QueryTables.Add(Connection:=Array( _
                                                 "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source=C:\temp\Clientes.xls;Mode=Share Deny Write;Extended Prope" _
       , _
                                     "rties=""HDR=YES;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine Type=35" _
       , _
                                     ";Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Databa" _
       , _
                                     "se Password="""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=Fa" _
       , "lse;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False"), _
                                     Destination:=Range("A1"))
        .CommandType = xlCmdSql
        .CommandText = Array(SQL)
        .Name = "Clientes"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .SourceDataFile = "C:\temp\Clientes.xls"
        .Refresh BackgroundQuery:=False
    End With
End Sub

Agora é com vocês. Boa sorte a todos.

Tomás Vásquez

Entendendo as limitações do Excel

Depois da criação dos Vídeos treinamentos sobre o recurso de importação de dados no Excel com o auxílio de comandos SQL para manipulação dos dados, tenho recebido uma série de dúvidas a respeito e tentarei neste blog, esclarecer algumas delas e também estender as funcionalidades, além daquelas demonstradas nos vídeos dispostos.

O primeiro ponto que é necessário mencionar, é que devemos admitir que só o fato do recursos de importação permitirem enxergar uma pasta de trabalho do Excel como um fonte de dados, já é uma proeza e tanto. É necessário assumir que tentar ir além disso, é fugir demais do foco do aplicativo. Apesar de vantajoso, não é prudente usar o Excel como base de dados. Se a necessidade exigir consultas mais complexas ou um tratamento de dados mais apurados, além de consistência, comece a pensar em utilizar um sistema de banco de dados. O exemplo mais próximo do Excel é o Access, mas não se esqueçam que existem uma série de alternativas, boas e gratuitas, como o MSDE e o SQL Server 2005 Express, para não citar outras. Não vou entrar no mérito destes banco de dados, mas fica aí a idéia.

Tentar transformar o Excel num mega-aplicativo de acesso a dados, pode se tornar tão oneroso que compensaria estudar uma tecnologia dedicada a este fim. Pensem na utilização destes recursos como alternativas, não corriqueiras. A função do Excel é manipular dados, não controlá-los.

Sobre as dúvidas sugestões e suas respostas, tratarei de mencionar todas por este veículo.

Sugestões e comentários, é só avisar.

Um grande abraço a todos.

Tomás Vásquez

Tecnologia e Programação