[A BÍBLIA DO VBA NO ACCESS]: MACROS E PROGRAMAÇÃO VBA NO ACCESS - CURSO COMPLETO

Páginas: 1164 | Autor: Júlio Battisti | 50% de Desconto e 21 Super Bônus

Você está em: PrincipalArtigosASP.NET › Capítulo 10 : 10
Quer receber novidades e e-books gratuitos?
›››
« Lição anterior Δ Página principal ¤ Capítulos Próxima lição »
ASP.NET - CURSO COMPLETO
Autor: Júlio Battisti


Promoção: Livro Windows Server 2012 R2 e Active Directory - Curso Completo, 2100 Páginas. Tudo para você se tornar um administrador de redes altamente qualificado para o mercado de trabalho e levar a sua carreira para o próximo nível!

Promoção: Livro Windows Server 2012 R2 e Active Directory

Curso Completo, 2100 páginas. Tudo para você se tornar um administrador de redes altamente qualificado para o mercado de trabalho e levar a sua carreira para o próximo nível!


Lição 090 - Capítulo 10 - O objeto DataView

Para entender a função do objeto DataView, vamos fazer uma recaptulação dos objetos que já estudamos, neste capítulo:

  • Utilizamos um objeto OleDbConnection ou SqlConnection para estabelecer uma conexão com o banco de dados.
  • O objeto DataAdapter faz a ponte entre um ou mais objetos Command (SqlCommand ou OleDbCommand) e um objeto DataSet. Ao final deste processo, os dados estão armazenados em um objeto DataSet.
  • O objeto DataView faz a ponte entre o objeto DataSet e um Web Form ou Web Form Control, onde serão exibidos os dados. Na Figura 10.14, temos uma visão geral deste processo:

Curso Completo de ASP.NET - Júlio Battisti
Figura 10.14 Acessando dados com ASP.NET.

Nesta figura fica, bem destacado, o papel de ponte entre o objeto DataSet e o controle DataGrid, exercido pelo objeto DataView. No exemplo da figura, utilizamos o controle DataGrid, mas poderia ser qualquer outro Web Form Control capaz de acessar dados de um DataView.

Um objeto DataView pode ser configurado para retornar apenas uma parte dos dados de um objeto DataTable. Podemos, por exemplo, ter dois objetos DataView, ligados com o mesmo objeto DataTable, porém exibindo diferentes dados. Vamos estudar mais alguns detalhes sobre o objeto DataView.

Na Tabela 10.13 temos uma descrição das principais propriedades da classe DataView:

Propriedade Descrição
AllowDelete Propriedade do tipo Boleana. Se contiver o valor True, podemos excluir registros, se contiver o valor False, não são permitidas exclusões. Esta propriedade pode ser utilizada para definir ou para retornar um valor True ou False.
AllowEdit Utilizada para definir ou retornar um valor do tipo Boleano. Se o valor da propriedade for True, são permitidas alterações nos dados, caso contrário os dados não poderão ser alterados.
AllowNew Utilizada para definir ou retornar um valor do tipo Boleano. Se o valor da propriedade for True, poderemos adicionar novos registros, utilizando o método AddNew, caso contrário novos registros não poderão ser adicionados.
Count Retorna o número de registros no DataView.
RowFilter Utilizada para definir ou retornar uma expressão que determina quais os dados do objeto DataView, que serão exibidos.
RowStateFilter Com ADO.NET é mantido um histórico das alterações feitas nos dados. O objeto DataView mantém as versões anteriores de registros que foram alterados ou excluídos. Podemos utilizar esta propriedade para retornar ou definir uma expressão que filtra apenas os registros em um determinado estado, como por exemplo: alterados, excluídos, etc.
Sort Utilizada para definir ou retornar informações sobre a(s) coluna(s) e a ordem de classificação dos dados.
Table Utilizada para definir ou retornar a tabela a partir da qual o DataView obtém os dados.

Tabela 10.13 Principais propriedades da classe DataView.

Na Tabela 10.14 temos uma descrição dos principais métodos da classe DataView:

Propriedade Descrição
AddNew Adiciona um novo registro ao DataView.
Delete Excluir registro do DataView.
Find Localiza um determinado registro, com base no valor da chave primária.

Tabela 10.14 Principais métodos da classe DataView.

Vamos apresentar alguns exemplos de utilização do objeto DataView.

Exemplo 1: Neste exemplo faremos uma conexão com o banco de dados C:\Meus documentos\Northwind.mdb. Vamos retornar os seguintes campos da tabela Funcionários:

  • CódigoDoFuncionário
  • Nome
  • Cargo
  • DataDeNascimento
  • Cidade

Os dados serão apresentados na página, utilizando um controle DataGrid. Também apresentaremos um controle ListBox, onde o usuário poderá selecionar um campo pelo qual os dados serão ordenados em ordem Crescente. Por padrão os dados são classificados pelo CódigoDoFuncionário.

Na Listagem 10.5 temos o código para o exemplo proposto.

Listagem 10.5 – Um exemplo completo com DataView.

<%@ Import Namespace="System.Data"  %>
<%@ Import Namespace="System.Data.OleDb"  %>
<html>
<script language="C#"  runat="server">
    protected void Page_Load(Object Src, EventArgs E ) 
   {
      // Crio uma conexão com o banco de dados  do Microsoft Access.
      // C:\Meus documentos\NorthWind.mdb.
      String DefineConexão= "PROVIDER=MICROSOFT.JET.OLEDB.4.0;"  +
                                       "DATA SOURCE=c:\\meus  documentos\\NorthWind.mdb";
      OleDbConnection  MinhaConexão = new OleDbConnection(DefineConexão);
            // Utilizamos um objeto  DataAdapter para executar um comando SQL,
            // o qual retorna todos os dados da  tabela "Clientes".
OleDbDataAdapter MeuComando = new  OleDbDataAdapter("SELECT 
CódigoDoFuncionário," +  "Nome,Cargo,DataDeNascimento,Cidade 
FROM Funcionários",  MinhaConexão);
            // Criamos e preenchemos um objeto  DataSet.
            // Observe que não temos mais o  objeto Recordset,
            // como era de praxe com o ASP 3.0.
       DataSet ds = new DataSet();
            // Utilizo o método Fill do  objeto DataAdapter, para preencher
            // o objeto DataSet, com os dados  retornados pelo comando SQL.
       MeuComando.Fill(ds);
            // Conectamos um controle DataGrid  com o DataSet criado anteriormente. 
            // MinhaGrade é o id (nome) de um  controle do tipo
            // DataGrid que está na seção de  apresentação da página.
      DataView source = new  DataView(ds.Tables[0]);
      
         // Utilizamos uma instrução Switch para  definir a
        // classificação dos dados com base no  valor selecionado
        // na lista CampoClassificar.
        
        string  aux = CampoClassificar.SelectedItem.Value;
        
         switch (aux)
        {
             case "Cargo":
                source.Sort="Cargo ASC";
                break;
      
             case "Cidade":
                source.Sort="Cidade ASC";
                break;
            case  "Código do Funcionário":
               source.Sort="CódigoDoFuncionário  ASC";
               break;
            case "Data de  Nascimento":
                source.Sort="DataDeNascimento ASC";
               break;
             case "Nome":
                source.Sort="Nome ASC";
               break;
            default:
               // outras opções.
               break;
        }
                  
       MinhaGrade.DataSource = source ;
      MinhaGrade.DataBind();
   }
</script>
<body>
   <%-- Exibe as informações do DataGrid no  corpo da página. --%>
   <h3><font  face="Verdana">Funcionários da empresa North  Wind!!!</font></h3>
   <BR>
<form runat=server>
   <h3><font  face="Verdana">Classificar por:</font></h3>
        
        <asp:ListBox  id="CampoClassificar"  
              Rows="1" 
              Width="200px" 
              runat="server">
                        <asp:ListItem>Cargo</asp:ListItem>
                        <asp:ListItem>Cidade</asp:ListItem> 
                        <asp:ListItem  selected="True">Código do Funcionário</asp:ListItem>
                        <asp:ListItem>Data  de Nascimento</asp:ListItem>
                        <asp:ListItem>Nome</asp:ListItem> 
        </asp:ListBox>
      
            <ASP:DataGrid id="MinhaGrade"  runat="server"
                        Width="700"
                        BackColor="#ccccff" 
                        BorderColor="black"
                        ShowFooter="false" 
                        CellPadding=3 
                        CellSpacing="0"
                        Font-Name="Verdana"
                        Font-Size="8pt"
                        HeaderStyle-BackColor="#aaaadd"
                        MaintainState="false"
            />
            
            <BR>
                <B>Clique para Classificar  --></B></td>
                  <input type=submit  value="Classificar" runat="server">
</form>
</body>
</html>

Digite o código da Listagem 10.5 e salve o mesmo em um arquivo chamado chap10ex5.aspx, na pasta chap10, dentro da pasta wwwroot, conforme descrito no item: “Check List para acompanhar os exemplos deste livro”, no Capítulo 6.

Para acessar esta página utilize o seguinte endereço:

http://localhost/chap10/chap10ex5.aspx

você irá obter a página indicada na Figura 10.15.

Curso Completo de ASP.NET - Júlio Battisti
Figura 10.15 Relação de funcionários – classificada pelo Código do Funcionário.

Observe que a listagem está classificada em ordem crescente do Código do Funcionário. Vamos testar o nosso exemplo. Na lista “Classificar Por”, selecione Nome e dê um clique no botão Classificar. Você obterá uma listagem classificada pelo nome do funcionário, conforme indicado na Figura 10.15:

Curso Completo de ASP.NET - Júlio Battisti
Figura 10.15 Relação de funcionários – classificada pelo Nome.

Comentários sobre o código do exemplo – Chap10Ex5.aspx.

  • O código para conectar com o banco de dados e retornar dados é muito semelhante ao código utilizado nos exemplos anteriores. Para maiores detalhes sobre esta parte do código consulte os exemplos das Listagens 10.1, 10.2, 10.3 e 10.4.
  • Na seção de apresentação da página criamos um formulário e adicionamos um Web Server Control do tipo ListBox chamado CampoClassificar. Este controle exibe as opções de classificação. O código que define o controle ListBox está indicado a seguir:
        <asp:ListBox  id="CampoClassificar"  
              Rows="1" 
               Width="200px" 
              runat="server">
                        <asp:ListItem>Cargo</asp:ListItem>
                        <asp:ListItem>Cidade</asp:ListItem> 
                        <asp:ListItem  selected="True">Código do Funcionário</asp:ListItem>
                        <asp:ListItem>Data  de Nascimento</asp:ListItem>
                        <asp:ListItem>Nome</asp:ListItem> 
        </asp:ListBox>

Observe que, por padrão, ao carregarmos a página, a opção Código do Funcionário vem selecionada – selected=”True”. Para maiores informações sobre o controle ListBox, consulte o Capítulo 9.

  • Na seção de código precisamos verificar qual a opção selecionada no ListBox e, com base na opção selecionada, classificar os dados do DataView. Para isso utilizamos a instrução switch/case do C#, conforme indicado a seguir:
string aux =  CampoClassificar.SelectedItem.Value;
        
         switch (aux)
        {
             case "Cargo":
                source.Sort="Cargo ASC";
                break;
      
             case "Cidade":
                source.Sort="Cidade  ASC";
                break;
            case  "Código do Funcionário":
                source.Sort="CódigoDoFuncionário ASC";
               break;
            case "Data de  Nascimento":
                source.Sort="DataDeNascimento ASC";
               break;
             case "Nome":
                source.Sort="Nome ASC";
                break;
             default:
                // outras opções.
                break;
        }

Primeiro criamos uma string aux e atribuímos a esta string, o valor do item selecionado na ListBox CampoClassificar:

string aux =  CampoClassificar.SelectedItem.Value;

Em seguida, utilizamos a string aux como variável de comparação para a instrução switch/case. Com base no valor da string aux, definimos a classificação dos dados do DataView. Para definir a classificação utilizamos a propriedade Sort do objeto source, objeto este que é do tipo DataView, como no exemplo a seguir:

                source.Sort="CódigoDoFuncionário ASC";

A propriedade Sort é uma String que contém o nome do campo seguido de um espaço e da palavra ASC para classificação crescente ou DESC para classificação decrescente.

Nota: Para maiores informações sobre a instrução switch/case e sobre as demais instruções de controle de fluxo do C#, consulte o Capítulo 3.

Exemplo 2: Neste exemplo faremos uma conexão com o banco de dados C:\Meus documentos\Northwind.mdb. Vamos retornar os seguintes campos da tabela Pedidos:

  • NúmeroDoPedido
  • DataDoPedido
  • CidadeDeDestino
  • PaísDeDestino

Os dados serão apresentados na página, utilizando um controle DataGrid. Também apresentaremos dois controles ListBox. O usuário poderá classificar os dados por um ou dois campos. Caso deseje classificar apenas por um campo, basta selecionar “Não classificar”, na segunda lista. Por padrão os dados são classificados apenas pelo NúmeroDoPedido. Também apresentaremos dois controles do tipo RadioButton, onde o usuário pode selecionar classificação Crescente ou Decrescente.

Na Listagem 10.6 temos o código para o exemplo proposto.

Listagem 10.6 – Um exemplo completo com DataView e o método Sort com dois campos.

<%@ Import Namespace="System.Data"  %>
<%@ Import  Namespace="System.Data.OleDb" %>
<html>
<script language="C#"  runat="server">
    protected void Page_Load(Object Src, EventArgs E ) 
   {
         // Crio uma conexão com o banco de  dados do Microsoft Access.
         // C:\Meus documentos\NorthWind.mdb.
      String DefineConexão=  "PROVIDER=MICROSOFT.JET.OLEDB.4.0;" +
                                       "DATA SOURCE=c:\\meus documentos\\NorthWind.mdb";
       OleDbConnection MinhaConexão = new OleDbConnection(DefineConexão);
// Utilizamos um objeto DataAdapter para executar um  comando SQL,
            // o qual retorna todos os dados da  tabela "Clientes".
OleDbDataAdapter  MeuComando = new OleDbDataAdapter("SELECT NúmeroDoPedido," +
"DataDoPedido,CidadeDeDestino,PaísDeDestino FROM Pedidos", MinhaConexão);
            // Criamos e preenchemos um objeto  DataSet.
            // Observe que não temos mais o  objeto Recordset,
            // como era de praxe com o ASP 3.0.
      DataSet  ds = new DataSet();
            // Utilizo o método Fill do  objeto DataAdapter, para preencher
            // o objeto DataSet, com os dados  retornados pelo comando SQL.
            MeuComando.Fill(ds);
            // Conectamos um controle DataGrid  com o DataSet criado anteriormente. 
            // MinhaGrade é o id (nome) de um  controle do tipo
            // DataGrid que está na seção de  apresentação da página.
      DataView source = new  DataView(ds.Tables[0]);
         // Crio uma variável string chamada  aux.
        //   Na variável aux vamos concatenando os valores
        //   Selecionados nas listas CampoClassificar1 e
       //   CampoClassificar2, além das opções ASC ou DESC,
       //   dependendo da escolha do usuário.
        
        string  aux = CampoClassificar1.SelectedItem.Value;
                         
        // Se o usuário selecionou  Crescente, concateno ASC,
        // caso contrário, concateno DESC.
        
        if  (Crescente.Checked)
           {
                        aux  = aux + " ASC,";
           }
         else
            {
             aux = aux + " DESC,";
            }
                
         aux = aux + CampoClassificar2.SelectedItem.Value;
        
         if (Crescente.Checked)
               {
                         aux = aux + "  ASC";
               }
            else
               {
                        aux  = aux + " DESC";
           }
        
        
         // Ordeno passando aux para a  propriedade Sort.
               
         source.Sort  = aux;
        
         MinhaGrade.DataSource = source ;
        MinhaGrade.DataBind();
   }
</script>
<body>
   <%-- Exibe as informações do DataGrid no  corpo da página. --%>
   <h3><font  face="Verdana">Funcionários da empresa North  Wind!!!</font></h3>
<form runat=server>
   <B>Clique para  Classificar --></B></td>
   <input type=submit  value="Classificar" runat="server">
    <BR>
    <BR>
   
    <table>
   
   <tr>
            <td>
                        <B><font  face="Verdana">Classificar primeiro por:</font></B>
            </td>
            
            <td>
            
                         <B><font  face="Verdana">&nbsp;&nbsp;Em seguida  por:</font></B>
            </td>
            
            <td>
                         <B><font  face="Verdana">&nbsp;Em qual ordem?</font></B>
            </td>
    </tr>
   
    <tr>
        <td>         
                        <asp:ListBox  id="CampoClassificar1"  
                       Rows="1" 
                       Width="200px" 
                       runat="server">
                        <asp:ListItem>CidadeDeDestino</asp:ListItem>
                        <asp:ListItem>DataDoPedido</asp:ListItem> 
                        <asp:ListItem  selected="True">NúmeroDoPedido</asp:ListItem>
                        <asp:ListItem>PaísDeDestino</asp:ListItem>
                        </asp:ListBox>
            </td>   
   
            <td>
                        &nbsp;&nbsp;
                        <asp:ListBox id="CampoClassificar2"  
                       Rows="1" 
                       Width="200px" 
                       runat="server">
                        <asp:ListItem>CidadeDeDestino</asp:ListItem>
                        <asp:ListItem  selected="True">DataDoPedido</asp:ListItem> 
                        <asp:ListItem>NúmeroDoPedido</asp:ListItem>
                        <asp:ListItem>PaísDeDestino</asp:ListItem>
                        </asp:ListBox>
            </td>   
   
            <td>
            
                    <asp:RadioButton 
                           id="Crescente" 
                       Text="Crescente" 
                       Checked="True" 
                       GroupName="Ordem" 
                       runat="server"
                     />
                       
                       &nbsp;&nbsp;
                       
                    <asp:RadioButton 
                       id="Decrescente" 
                       Text="Decrescente" 
                       GroupName="Ordem" 
                       runat="server"
                     />
      
            </td>
            
            </tr>
            
            </table>
   
              <asp:DataGrid 
id="MinhaGrade" 
runat="server"
                        Width="700"
                        BackColor="#ccccff" 
                        BorderColor="black"
                        ShowFooter="false" 
                        CellPadding=3 
                        CellSpacing="0"
                        Font-Name="Verdana"
                        Font-Size="8pt"
                        HeaderStyle-BackColor="#aaaadd"
                        MaintainState="false"
            />
            
            <BR>
</form>
</body>
</html>

Digite o código da Listagem 10.6 e salve o mesmo em um arquivo chamado chap10ex6.aspx, na pasta chap10, dentro da pasta wwwroot, conforme descrito no item: “Check List para acompanhar os exemplos deste livro”, no Capítulo 6.

Para acessar esta página utilize o seguinte endereço:

http://localhost/chap10/chap10ex6.aspx

você irá obter a página indicada na Figura 10.16.

Curso Completo de ASP.NET - Júlio Battisti
Figura 10.16 Relação de pedidos – opção para classificar por dois campos diferentes.

Observe que a listagem está classificada primeiro em ordem crescente do NúmeroDoPedido, em seguida em ordem Crescente da DataDoPedido. Vamos testar o nosso exemplo. Na primeira lista selecione PaísDeDestino e na segunda lista selecione CidadeDeDestino. Para ordem de classificação clique na opção Decrescente. Dê um clique no botão Classificar. Você obterá uma listagem classificada pelo nome de Pedidos. Parte do resultado está indicado na Figura 10.17:

Curso Completo de ASP.NET - Júlio Battisti
Figura 10.17 Relação de Pedidos – classificada por Páis e dentro do país por Cidade.

Comentários sobre o código do exemplo – Chap10Ex6.aspx.

  • Utilizamos uma tabela para fazer o alinhamento dos controles, no início da página. Para fazer um controle mais refinado do alinhamento, utilizamos o caracter &nbsp – non break space. Este é um caracter especial do HTML utilizado para espaço em branco.
  • No formulário, na seção de apresentação da página, adicionamos dois controles do tipo ListBox, onde o usuário pode selecionar por quais campos deseja classificar a listagem. Também acrescentamos um grupo chamado Ordem, com dois controles do tipo RadioButton, onde o usuário pode selecionar Crescente ou Decrescente. Com base nos valores selecionados nestes controles, definimos o conteúdo de uma variável string – aux. Uma vez definido o conteúdo da string aux, utilizamos esta para definir o valor da propriedade Sort do objeto source, o quel é um objeto do tipo DataView:
string aux =  CampoClassificar1.SelectedItem.Value;
        // Se o usuário selecionou  Crescente, concateno ASC,
        // caso contrário, concateno DESC.
        
        if  (Crescente.Checked)
           {
                        aux  = aux + " ASC,";
           }
        else
           {
            aux  = aux + " DESC,";
           }
        
        
         aux = aux + CampoClassificar2.SelectedItem.Value;
        
         if (Crescente.Checked)
               {
                         aux = aux + "  ASC";
               }
            else
               {
                        aux  = aux + " DESC";
           }
        
        
         // Ordeno passando aux para a  propriedade Sort.
               
         source.Sort  = aux;

Observe que no segundo if, não acrescentamos a vírgula após ASC ou DESC. No primeiro if acrescentamos, pois quando temos dois ou mais campos para definir a propriedade Sort, precisamos separar estes campos por vírgula. Se o usuário selecionar PaísDeDestino na primeira lista, CidadeDeDestino na segunda lista e Crescente, a variável aux terá o seguinte valor:

aux  = “PaísDeDestino ASC, CidadeDeDestino ASC”

Este valor é passado para a propriedade Sort para que a classificação seja feita de acordo com os critérios selecionados pelo usuário.

  • Os demais elementos do exemplo Chap10ex6.aspx já foram vistos e explicados em exemplos anteriores. Para maiores detalhes sobre os mesmos consulte os exemplos destes e dos demais capítulos.
  • Novamente utilizamos o evento Load da página Page_Load, para executar a conexão com o banco de dados, retornar os dados, definir a string aux e ordenar os dados de acordo com os critérios estabelecidos pelo usuário.

Exercício: Vou propor um exercício para o amigo leitor. Caso você tenha alguma dificuldade para resolvê-lo, é só entrar em contato através do e-mail: batisti@hotmail.com ou batisti@juliobattisti.com.br.

Na página Chap10ex6.aspx podemos definir somente um critério de classificação para os campos selecionados nas duas listas, ou seja, somente Crescente ou somente Decrescente. O exercício que fica para o leitor é tornar o nosso exemplo um pouco mais flexível, de tal maneira que possamos escolher uma ordem de classificação independente para cada campo. Explico um pouco melhor: Selecionar classificação Crescente para o campo PaísDeDestino e dentro de um mesmo país, classificação Decrescente por CidadeDeDestino.

Fica o desafio. Em caso de dúvida é só entrar em contato.


Promoção: Livro Windows Server 2012 R2 e Active Directory - Curso Completo, 2100 Páginas. Tudo para você se tornar um administrador de redes altamente qualificado para o mercado de trabalho e levar a sua carreira para o próximo nível!

Promoção: Livro Windows Server 2012 R2 e Active Directory

Curso Completo, 2100 páginas. Tudo para você se tornar um administrador de redes altamente qualificado para o mercado de trabalho e levar a sua carreira para o próximo nível!


« Lição anterior Δ Página principal ¤ Capítulos Próxima lição »

Best Sellers de Programação do Julio Battisti

Todos com Vídeo Aulas, E-books ou Exemplos de Brinde!

Aprenda com Júlio Battisti: SQL Server 2008 R2

 

Autor: Júlio Battisti | Páginas: 1164 | Editora: Instituto Alpha

 

Macros e Programação VBA no Excel 2010

 

Autor: Júlio Battisti | Páginas: 1124 | Editora: Instituto Alpha

 

Access 2010 Avançado, Macros e Programação VBA - Passo a Passo

 

Autor: Júlio Battisti | Páginas: 828 | Editora: Instituto Alpha

 

 

Todos os livros com dezenas de horas de vídeo aulas de bônus, preço especial (alguns com 50% de desconto). Aproveite. São poucas unidades de cada livro e por tempo limitado.

Dúvidas?

Utilize a área de comentários a seguir.

Me ajude a divulgar este conteúdo gratuito!

Use a área de comentários a seguir, diga o que achou desta lição, o que está achando do curso.
Compartilhe no Facebook, no Google+, Twitter e Pinterest.

Indique para seus amigos. Quanto mais comentários forem feitos, mais lições serão publicadas.

Quer receber novidades e e-books gratuitos?
›››

Novidades e E-books grátis

Fique por dentro das novidades, lançamento de livros, cursos, e-books e vídeo-aulas, e receba ofertas de e-books e vídeo-aulas gratuitas para download.



Institucional

  • Quem somos
  • Garantia de Entrega
  • Formas de Pagamento
  • Contato
  • O Autor
  • Endereço

  • Júlio Battisti Livros e Cursos Ltda
  • CNPJ: 08.916.484/0001-25
  • Rua Vereador Ivo Cláudio Weigel, 537 Universitário
  • Santa Cruz do Sul/RS
  • CEP 96816-208
  • Todos os direitos reservados, Júlio Battisti 2001-2017 ®

    [LIVRO]: MACROS E PROGRAMAÇÃO VBA NO EXCEL 2010 - PASSO-A-PASSO

    APRENDA COM JULIO BATTISTI - 1124 PÁGINAS: CLIQUE AQUI