[MEU 50º LIVRO]: BANCOS DE DADOS E ACESS - CURSO COMPLETO - DO BÁSICO AO VBA - 1602 páginas

Páginas: 1602 | Autor: Júlio Battisti | 40% de Desconto e 70h de Vídeo Aulas de Bônus

Você está em: PrincipalArtigosSQL Server 2005 › Capítulo 11 : 16
Quer receber novidades e e-books gratuitos?
›››
« Lição anterior Curso Completo de SQL Server 2005 - Júlio Battisti Δ Página principal Curso Completo de SQL Server 2005 - Júlio Battisti ¤ Capítulos Curso Completo de SQL Server 2005 - Júlio Battisti Próxima lição »
SQL Server 2005 - CURSO COMPLETO

Autor: Júlio Battisti
Lição 197 - Capítulo 11 - O OBJETO RECORDSET

Nos exemplos que foram apresentados até aqui, já utilizamos o objeto RecordSet. Agora chegou o momento de fazer um estudo mais aprofundado deste objeto.

O objeto RecordSet contém o resultado de uma instrução SQL, executada em um Banco de Dados. Um objeto RecordSet contém um conjunto de Registros. É como se fosse uma tabela, onde cada linha é um registro, sendo que cada registro é formado por um conjunto de campos (colunas da tabela). Por exemplo, ao executarmos a seguinte instrução SQL:

Select  * from Pedidos

Com este comando selecionamos todos os registros da tabela Pedidos, os quais poderão ser acessados através de um objeto do tipo RecordSet.

Existem detalhes importantes que devemos conhecer a respeito do acesso aos dados. Devemos considerar questões como:

•  O acesso deve ser somente para leitura dos dados ou devem ser permitidas alterações e inserções de novos registros?

•  Como tratar questões sobre o acesso simultâneo aos dados, por exemplo, como tratar a situação em que dois usuários tentam alterar o mesmo registro, ao mesmo tempo?

Estas são questões importantes e devem ser consideradas sempre que formos disponibilizar acesso aos dados da nossa empresa, para usuários da Internet. Também precisamos conhecer o que são Cursores, quais os tipos de Cursores disponíveis e para que utilizamos Cursores. Vamos estudar estes pontos neste tópico.

Para criar um objeto RecordSet, utilizamos a seguinte sintaxe:

Set  Pedidos = Server.CreateObject(“ADODB.Recordset”)

Neste exemplo, estamos criando um RecordSet chamado Pedidos. Uma vez criado o RecordSet, o próximo passo é utilizarmos o método Open. O método Open possui a seguinte sintaxe:

recordset.Open Source, ActiveConnection, CursorType, LockType,  Options

Considere o exemplo:

Pedidos.Open inst_sql, conn, 3, 3

Os parâmetros a serem passados para o método Open, estão descritos na Tabela 11.9.

Tabela 11.9 Parâmetros do método Open do objeto RecordSet.

Source -   Pode ser o nome de um objeto Command, uma instrução SQL ou o nome de uma variável que contém uma instrução SQL, o nome de uma tabela ou de um Stored Procedure do Banco de Dados ou até uma URL que aponta para uma fonte de dados.

ActiveConnection -   O nome da conexão a ser utilizada ou a String de conexão para uma fonte de dados ODBC ou OLE DB. É opcional.

CursorType -   É um valor que determina o tipo de cursor que será utilizado pelo provedor de dados na abertura do RecordSet. É opcional. Falaremos mais sobre tipos de cursores ainda neste item.

LockType -   É um valor que determina o tipo de lock que será utilizado pelo provedor de dados na abertura do RecordSet. É opcional. Falaremos mais sobre tipos de lock ainda neste item.

Options - Um valor do tipo Long, o qual define como o provedor de dados deve avaliar o argumento Source, quando este argumento for algo diferente de um objeto Command ou quando o RecordSet deve ser recuperado a partir de um arquivo salvo previamente.

Um Pouco Sobre Cursores

Um cursor é o mecanismo utilizado pela tecnologia ADO para gerenciar o conjunto de registros de um objeto RecordSet. Somente podemos ter acesso a um registro por vez. Este registro é chamado de Registro corrente. Quando utilizamos o método Open, por padrão, o primeiro registro é o Registro corrente.

Um cursor também é utilizado para determinar qual o Registro corrente, bem como para movimentar o indicador de registro entre os diversos registros do objeto RecordSet. O mecanismo que identifica qual é o Registro corrente é chamado de “Record pointer”. Quem lida com a manipulação do Record pointer é o cursor. Por isso quando utilizamos os métodos MoveNext (mover para o próximo registro), MovePrevious (mover para o registro anterior) ou qualquer outro método de movimentação, estamos utilizando o cursor.

O mecanismo do cursor também gerencia situações em que tentamos avançar além do último registro ou voltar além do primeiro registro, ou quando acessamos o valor de um campo de um registro. De uma maneira simples, podemos afirmar que grande parte da funcionalidade de um objeto RecordSet é fornecida pelo mecanismo do cursor.

Quando utilizamos o método Open, podemos definir diferentes formas de comportamento para o mecanismo do cursor. Estas formas de comportamento é que determinam os tipos de cursores disponíveis, os quais estão descritos na Tabela 11.10. O tipo do cursor pode ser definido com um valor numérico ou através de uma constante, conforme indicado na Tabela 11.10.

Tabela 11.10 Tipos de cursores disponíveis.

3 – adOpenStatic - Define um cursor do tipo Static. Um cursor deste tipo contém uma cópia estática dos registros. O conteúdo do RecordSet é definido no momento da criação do objeto. Caso sejam feitas alterações no Banco de Dados, estas alterações não serão visíveis para o - RecordSet que utiliza um cursor do tipo Static. Somente recriando o RecordSet é que poderemos ter acesso as alterações efetuadas. Podemos movimentar o ponteiro de registro em ambas as direções, isto é, podemos utilizar os métodos MoveNext, MovePrevious e assim por diante.

0 – adOpenForwardOnly  Cria um cursor do tipo Forward Only. Este é o valor padrão que será utilizado caso não seja definido nenhum outro tipo. Somente podemos utilizar o método MoveNext. Se tentarmos utilizar um outro método de movimentação, será gerado um erro e a página não será carregada. Também é um cursor do tipo Static, com a diferença que somente podemos nos movimentar para a frente.

2 – adOpenDynamic - Cria um cursor do tipo Dynamic. Um cursor deste tipo não possui um conjunto fixo de registros. Quaisquer alterações, adições e exclusões feitas por outros usuários serão visíveis para o objeto RecordSet, sem que o objeto tenha que ser eliminado e recriado. Podemos nos movimentar em ambas as direções dentro do RecordSet.

1 – adOpenKeyset Cria um cursor do tipo Keyset. Um cursor deste tipo é parecido com um cursor Dynamic, com a exceção de que o conjunto de registros é fixo. O RecordSet enxerga as alterações feitas por outros usuários, porém a adição de novos registros não é visível para um RecordSet do tipo Keyset. Caso algum registro seja eliminado por outros usuários, o

respectivo registro estará inacessível no RecordSet. Podemos nos movimentar em ambas as direções dentro do RecordSet.

O tipo de cursor a ser utilizado depende da aplicação que estamos desenvolvendo. Por exemplo, se estamos desenvolvendo uma página ASP apenas para exibir um conjunto de registros, podemos utilizar um cursor do tipo Static. Cursores mais simples, como o do tipo Static, consomem menos recursos de hardware no servidor. Cursores mais sofisticados, como o do tipo Dynamic, consomem mais recursos computacionais. Estes recursos podem ser consumidos na estação do Cliente ou no servidor Web, dependendo da localização do cursor. Veremos como definir a localização do cursor através da utilização da propriedade CursorLocation, no próximo item.

Agora alguns exemplos de utilização do método Open.

Este exemplo cria um RecordSet chamado Clientes e define um cursor do tipo Static.

<%

inst_sql=“Select * from Clientes”

Set Clientes = Server.CreateObject(“ADODB.Recordset”)

Clientes.Open  inst_sql, conn, 3, 3

%>

Ao invés de utilizarmos o valor 3, podemos utilizar a constante correspondente – adOpenStatic –, conforme o exemplo:

<%
      inst_sql=“Select * from Clientes”     

Set Clientes = Server.CreateObject(“ADODB.Recordset”)

Clientes.Open  inst_sql, conn,  adOpenStatic, 3

%>

O próximo exemplo cria um RecordSet chamado Clientes e define um cursor do tipo Keyset.

<%
      inst_sql=“Select * from Clientes”     

Set Clientes = Server.CreateObject(“ADODB.Recordset”)

Clientes.Open  inst_sql, conn, 1, 3

%>

Ao invés de utilizarmos o valor 1, podemos utilizar a constante correspondente – adOpenKeyset –, conforme o exemplo:

<%
      inst_sql=“Select * from Clientes”     

Set Clientes = Server.CreateObject(“ADODB.Recordset”)

Clientes.Open  inst_sql, conn,  adOpenKeyset, 3

%>

Localização do Cursor

O cursor pode estar localizado no servidor Web ou no Cliente que está acessando os dados. Algumas fontes de dados, como o Microsoft SQL Server, podem oferecer serviços de cursor no Servidor. O Microsoft Access não oferece serviços de cursor, com isso o cursor fica localizado no Cliente. Quando acessamos fontes de dados, utilizando OLE DB, podemos utilizar o serviço de cursor oferecido pelo próprio OLE DB. A opção padrão, caso não seja definido nada em contrário, é que o cursor esteja no Servidor.

Para definir a localização do cursor, devemos utilizar a propriedade CursorLocation do objeto RecordSet. Definimos esta propriedade antes da utilização do método Open do objeto RecordSet. A Tabela 11.11 descreve os valores possíveis para esta propriedade.

Tabela 11.11 Valores para a propriedade CursorLocation.

3/adUseClient - - Utiliza serviços de cursor no Cliente.

1/adUseNone  - -   Não utiliza serviços de cursor. Somente é mantido por questões de compatibilidade com as versões anteriores.

2/adUseServer -   Utiliza serviços de cursor do servidor ou do provedor OLE DB.

No próximo exemplo, definimos o cursor no Cliente:

<%
      inst_sql=“Select * from Clientes”     

Set Clientes = Server.CreateObject(“ADODB.Recordset”)

Clientes.CursorLocation = 3

Clientes.Open  inst_sql, conn, 3, 3

%>

Nota: A propriedade CursorLocation deve ser definida antes da utilização do método Open. Ao tentarmos definir a propriedade CursorLocation, com o RecordSet aberto, obteremos a seguinte mensagem de erro:

Tipo de erro:

ADODB.Recordset (0x800A0E79)

Operation is not allowed when the object is open.

A mensagem indica que a operação (definir a localização do cursor) não é permitida quando o objeto está aberto.

Ao invés de utilizarmos o valor 3, podemos utilizar a constante correspondente – adUseClient –, conforme o exemplo:

<%
      inst_sql=“Select * from Clientes”     

Set Clientes = Server.CreateObject(“ADODB.Recordset”)

Clientes.CursorLocation = adUseClient

Clientes.Open  inst_sql, conn,  adOpenStatic, 3

%>

Quando criamos um objeto RecordSet com o cursor no Servidor, é responsabilidade do Servidor gerenciar a navegação e as atualizações do RecordSet, sendo que serão consumidos recursos no Servidor.

Ao utilizar o cursor no Cliente, todo o conteúdo do RecordSet é copiado para a estação do Cliente e gerenciado por um cursor local. Devemos considerar a questão da velocidade da conexão do usuário com a Internet ou com a Intranet da empresa, pois se o RecordSet for muito grande, isto é, um grande número de registros, o tempo para copiar todo o RecordSet, pode ser inaceitável. Porém uma vez copiado o RecordSet para a estação do Cliente, a utilização do RecordSet é mais rápida, pois não é preciso acessar o Servidor para simples operações, tais como movimentar-se para o próximo registro.

Quando uma aplicação Web é desenvolvida, a localização dos cursores deve ser discutida na fase de projeto, sempre procurando propiciar o melhor desempenho possível para a aplicação. Em uma mesma aplicação posso ter páginas que utilizam o cursor no Servidor e outras que utilizam o cursor no Cliente, depende apenas da natureza de cada página.

No próximo exemplo, definimos o cursor no Servidor:

<%
      inst_sql=“Select * from Clientes”     

Set Clientes = Server.CreateObject(“ADODB.Recordset”)

Clientes.CursorLocation = 2

Clientes.Open  inst_sql, conn, 3, 3

%>

Ao invés de utilizarmos o valor 2, podemos utilizar a constante correspondente – adUseServer –, conforme o exemplo:

<%
      inst_sql=“Select * from Clientes”     

Set Clientes = Server.CreateObject(“ADODB.Recordset”)

Clientes.CursorLocation = adUseServer

  Clientes.Open  inst_sql, conn,  adOpenStatic, 3

%>

Lembrando que não é necessário definir o cursor no Servidor, pois essa é a definição padrão, ou seja, se não for definida, explicitamente, a propriedade CursorLocation assume o valor adUseServer.

Lock de Registros

Os Banco de Dados utilizam o Lock de registros como uma maneira de garantir a integridade dos dados. Com a utilização do Lock, garantimos que um mesmo registro não esteja sendo alterado, simultaneamente, por mais do que um usuário. Quando um usuário acessa um registro para fazer alguma alteração, o registro é bloqueado, de tal forma que outros usuários não possam ter acesso ao registro. O acesso ao registro somente será liberado após as alterações terem sido salvas no Banco de Dados. O tipo de Lock é definido pela propriedade LockType do objeto RecordSet. Existem diferentes maneiras de se fazer o Lock dos registros, conforme descrito na Tabela 11.12

Tabela 11.12 Tipos de Lock.

1/adLockReadOnly -   Cria um Lock do tipo Read Only. É o tipo padrão de lock. O RecordSet é somente leitura, isto é, os registros não podem ser modificados, logo não precisam ser bloqueados. Com isso tenho um processamento mais rápido, porém perco a capacidade de fazer alterações nos registros.

2/adLockPessimistic -   Cria um Lock do tipo Pessimistic. O provedor OLE DB tenta bloquear o registro no momento em que o registro começa a ser editado. Isso é feito para tentar garantir que o registro será editado com sucesso.

3/adLockOptimistic -   Cria um Lock do tipo Optimistic. O registro não é bloqueado enquanto as alterações no registro não forem salvas no Banco de Dados através da utilização do método Update do   RecordSet.

4/adLockBatchOptimistic  Cria um Lock do tipo Batch Optimistic. Este tipo de Lock permite que vários registros sejam modificados. Os registros somente serão bloqueados quando for chamado o método UpdateBatch do objeto RecordSet.

-1/adLockUnspecified - Não define o tipo de Lock. Quando utilizamos o método Clone, para criar uma cópia do RecordSet, o Clone será criado com o mesmo tipo de Lock do RecordSet original.

A maneira e os tipos de Lock possíveis de serem utilizados, também dependem da fonte de dados que está sendo utilizada. Quando não existe a necessidade de fazer alterações nos registros, devemos utilizar, sempre, um Lock do tipo Read Only (ou seja, como o RecordSet é apenas leitura, os registros não precisam ser bloqueados), pois isso evita que o Provider tenha que fazer verificações ao acessar cada registro, para verificar se o registro não está bloqueado no momento. Com isso teremos um processamento bem mais rápido.

Um registro bloqueado não pode nem sequer ser visualizado pelos usuários, com isso evita-se que seja exibido um registro que está sendo alterado.

Para definir o tipo de Lock, utilizamos a propriedade LockType, conforme indicado no exemplo a seguir, onde definimos o tipo de Lock como Optimistic:

<%
      inst_sql=“Select * from Clientes”     

Set Clientes = Server.CreateObject(“ADODB.Recordset”)

Clientes.LockType = 3

  Clientes.Open  inst_sql, conn, 3, 3

%>

Nota: A propriedade LockType deve ser definida antes da utilização do método Open. Ao tentarmos definir a propriedade LockType, com o RecordSet aberto, obteremos a seguinte mensagem de erro:

Tipo de erro: 

ADODB.Recordset (0x800A0E79)

Operation is not allowed when the object is open.

A mensagem indica que a operação (definir o tipo de Lock) não é permitida quando o objeto está aberto.

Ao invés de utilizarmos o valor 3, podemos utilizar a constante correspondente – adLockOptimistic –, conforme o exemplo:

<%
      inst_sql=“Select * from Clientes”     

Set Clientes = Server.CreateObject(“ADODB.Recordset”)

Clientes.LockType = adLockOptimistic

Clientes.Open  inst_sql, conn,  adOpenStatic, 3

%>

Agora que já discutimos um pouco sobre cursores, localização do cursor e Lock de registros, podemos partir para o estudo de mais alguns detalhes do objeto RecordSet.

Propriedades do Objeto RecordSet

Através da utilização de propriedades de um objeto podemos definir algumas características do objeto e também retornar as características do objeto. Algumas propriedades são somente para leitura, isto significa que apenas podemos verificar o valor da propriedade. Outras propriedades são de leitura e escrita, isto é, podemos definir o valor da propriedade. Para definir o valor de uma propriedade, utilizamos a seguinte sintaxe:

<%  RecordSet.nome_da_propriedade = valor %>

Na Tabela 11.13 estão listadas as principais propriedades do objeto RecordSet.

Tabela 11.13 Principais propriedades do objeto RecordSet.

AbsolutePage - Retorna a página do Registro corrente. Página é um conceito de armazenamento de Banco de Dados.
AbsolutePosition - Indica a posição do Registro corrente, dentro do RecordSet.


ActiveCommand Retorna o objeto Command utilizado para criar o RecordSet, caso tenha sido utilizado um objeto Command. Esta propriedade é somente leitura.
BOF  - Esta propriedade torna-se verdadeira quando estivermos no primeiro registro e utilizarmos o método MovePrevious, ou seja, indica uma tentativa de voltarmos além do primeiro registro. É somente leitura.
Bookmark -   Retorna um marcador (bookmark) que identifica de maneira única cada registro do RecordSet. Também pode ser utilizado para tornar o registro identificado pelo Bookmark como o registro corrente. Nem todos as fontes de dados e seus respectivos OLE DB Providers oferecem esta propriedade.


CacheSize - Indica o número de registros do RecordSet que devem ser mantidos no cache local de memória. Também pode ser utilizada para definir este número de registros.


CursorLocation  - Pode ser utilizada para definir ou retornar a posição do cursor.


CursorType -   Indica o tipo de cursor utilizado em um objeto RecordSet. Também pode ser utilizado para definir o tipo de cursor. Deve ser usado antes do método Open, caso contrário irá provocar um erro quando a página for carregada.


EditMode - Retorna um valor que indica o status de edição do registro atual. Este valor pode ser:

0 – indica que não existe edição em andamento;

1– indica que os dados do registro atual foram modificados, porém ainda não foram salvos;

2 – indica que o método AddNew foi chamado e o registro que está

sendo criado, ainda não foi salvo no Banco de Dados;

4 – indica que o registro atual foi deletado.

É somente leitura.


EOF  - Esta propriedade torna-se verdadeira quando estivermos no último registro e utilizarmos o método MoveNext, ou seja, indica uma tentativa de avançarmos além do último registro. É somente leitura.


Filter - Pode ser utilizado para filtrar os registros de um RecordSet de acordo com um critério definido.


LockType - Indica o tipo de Lock que está sendo utilizado. Também pode ser utilizado para definir o tipo de Lock, antes que o método Open tenha sido utilizado.


MaxRecords - Define o número máximo de registros que uma consulta deve retornar para o objeto RecordSet. O valor padrão é zero, o que significa sem limite de registros.


PageCount -   Indica quantas páginas de dados o objeto RecordSet contêm. É somente leitura.


PageSize - Indica o número de registros por página.


RecordCount - Indica o número de registros do objeto RecordSet. É somente leitura.


Sort - Especifica um ou mais campos para ordenação do RecordSet, além do tipo de ordenação se ascendente ou descendente. Para utilizarmos esta propriedade devemos utilizar o cursor no cliente.


Source  - Indica as fontes dos dados de um objeto RecordSet. Por exemplo, exibe a instrução SQL que deu origem aos dados ou o nome da tabela ou consulta que originou os dados do objeto RecordSet.


State - Indica o estado do objeto RecordSet. Indica se o mesmo está aberto, fechado ou executando uma operação de maneira assíncrona. É somente leitura.

Métodos do Objeto RecordSet

O objeto RecordSet nos fornece diversos métodos, os quais podem ser utilizados para nos deslocar através dos registros, fazer uma cópia do RecordSet, etc. Para utilizarmos um método do objeto RecordSet, utilizamos a seguinte sintaxe:

<% RecordSet.nome_do_método parâmetro1, parâmetro2, ...,  parâmetron %>

Na Tabela 11.14 estão listados os principais métodos do objeto RecordSet.

Tabela 11.14 Principais métodos do objeto RecordSet.

AddNew -   Utilizado para adicionar um novo registro em um RecordSet que seja atualizável.

Cancel  -   Cancela a execução de uma operação Open assíncrona.


CancelBatch  Cancela uma operação de atualização em Batch.


CancelUpdate Cancela qualquer alteração feita no registro corrente, ou alterações feitas em um novo registro antes da chamada ao método Update.


Clone  -   Cria uma cópia do objeto RecordSet.


Close  -   Fecha o objeto RecordSet e todos os objetos dele dependentes.


Delete -   Elimina o registro corrente ou um grupo de registros selecionados.


Find  -   Pesquisa no RecordSet por um registro que atende um critério especificado.


GetRows - Retorna registros de um RecordSet e os armazena em um array.


GetString - Retorna todo o RecordSet como uma String.


Move - Movimenta o indicador de registro a partir de uma posição especificada um determinado número de registros. Por exemplo, posso movimentar o indicador dez registros a partir do registro 10, com isso o indicador fica no registro 20.


MoveFirst -   Movimenta o indicador para o primeiro registro.


MoveLast -   Movimenta o indicador para o último registro.


MoveNext -   Movimenta o indicador para o próximo registro.


MovePrevious  Movimenta o indicador para o registro anterior.


Open -   Abre o objeto RecordSet.


Requery - Atualiza o conjunto de registros do RecordSet, executando novamente a consulta que deu origem ao RecordSet.


Resync  - Atualiza os dados do RecordSet, buscando os dados a partir do Banco de Dados.


Save -   Salva o conteúdo do RecordSet em um arquivo.


Update Salva quaisquer alterações que tenham sido feitas para o objeto RecordSet.

Agora vamos aprender a executar algumas operações bastante comuns em aplicações Web do dia a dia. Aprenderemos a inserir registros, excluir registros e alterar um determinado registro.

« Lição anterior Curso Completo de SQL Server 2005 - Júlio Battisti Δ Página principal Curso Completo de SQL Server 2005 - Júlio Battisti ¤ Capítulos Curso Completo de SQL Server 2005 - Júlio Battisti Próxima lição »

Best Sellers de Excel do Julio Battisti

Todos com Vídeo Aulas, E-books e Planilhas de Bônus!

Aprenda com Júlio Battisti:
Excel 2010 Básico em 140 Lições - Através de Exemplos Práticos - Passo a Passo

 Aprenda com Júlio Battisti: Excel 2010 Básico em 140 Lições - Através de Exemplos Práticos

 

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

 

[Livro]: Aprenda com Júlio Battisti: Excel 2010 Básico em 140 Lições - Através de Exemplos Práticos

Aprenda com Júlio Battisti: Excel 2010 Avançado, Análise de Dados, Tabelas Dinâmicas, Funções Avançadas, Macros e Programação VBA - Passo a Passo

Livro: Aprenda com Júlio Battisti: Excel 2010 Avançado, Análise de Dados, Tabelas Dinâmicas, Funções Avançadas, Macros e Programação VBA - Passo a Passo

 

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

 

Livro: Aprenda com Júlio Battisti: Excel 2010 Avançado, Análise de Dados, Tabelas Dinâmicas, Funções Avançadas, Macros e Programação VBA - Passo a Passo

Aprenda com Júlio Battisti: Macros e Programação VBA no Excel 2010 Através de Exemplos Práticos e Úteis - Passo a Passo

 

[LIVRO]: Aprenda com Júlio Battisti: Macros e Programação VBA no Excel 2010 Através de Exemplos Práticos e Úteis - Passo a Passo

 

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

 

[LIVRO]: Aprenda com Júlio Battisti: Macros e Programação VBA no Excel 2010 Através de Exemplos Práticos e Úteis - Passo a Passo

Aprenda com Júlio Battisti: Excel 2010 - Curso Completo - Do Básico ao Avançado, Incluindo Macros e Programação VBA - Através de Exemplos Práticos

 

[A BÍBLIA DO EXCEL]: Aprenda com Júlio Battisti: Excel 2010 - Curso Completo - Do Básico ao Avançado, Incluindo Macros e Programação VBA - Através de Exemplos Práticos Passo a Passo

 

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

 

[A BÍBLIA DO EXCEL]: Aprenda com Júlio Battisti: Excel 2010 - Curso Completo - Do Básico ao Avançado, Incluindo Macros e Programação VBA - Através de Exemplos Práticos Passo a Passo

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