Novidades no sistema de Cotação de Mercadorias v2.6

O Sistema de Cotação em MS Access está fazendo um ano  e vem evoluindo constantemente. Além das características contidas nas versões anteriores foi incluída, por solicitação de usuários, a capacidade de importar dados de produtos e fornecedores, a partir de  planilhas do MS Excel.

Imagina só se você já possui um sistema de gerenciamento de comércio, um ERP …  e este não possui a capacidade de realizar cotações de mercadorias? O objetivo de importar os dados do MS Excel, neste caso, é facilitar a integração entre sistemas.

Ao realizar uma nova cotação, de início,  temos de definir os fornecedores e produtos que participarão da cotação conforme imagem abaixo:

definicao prods e forns

Para não ter que ficar digitando tudo, realize os seguintes passos:

1) Vá até o botão [Ferramentas e Utilitários];

2) Clique no item (5) da lista para importar produtos e no item (6) da lista para importar fornecedores. Veja imagem abaixo:

ferramentas e utilitarios

Configurando as colunas que serão lidas da planilha MS Excel ao realizar a importação de ambos os dados:

Clique na opção (4) e será aberto o formulário de configuração das colunas para ambos os casos (fornecedores e produtos). Na seta indicada pelo número 1, pode-se escolher configurar as colunas para a planilha de fornecedores ou de produtos, conforme já mencionado acima. No destaque do retângulo, é onde se insere qual coluna representará qual dado da entidade (forn. ou prod.). O valor poderá ser numérico, ex.: col 1, col 2, col n … ou letras: col A, col B, etc. No caso, abaixo, foram definidas as colunas do MS Excel por letras.

configurador da importacao

Após realizar a importação dos dados, veja abaixo como ficaram preenchidas as definições de produtos e fornecedores:

cotação com dados importados

Gostaria de tentar ??? Faça o download da versão DEMO Free Download Demo e constate tudo isso !

Compre a versão completa comprar(O código fonte não está incluso no valor da compra.)

Veja as versões anteriores deste sistema e tudo que ele pode facilitar:

Versão 2.5)  Sistema de Cotação Multi-Moedas V.2.5 em MS Access

Versão 1)   Sistema de Cotação em MS Access

Veja o vídeo da primeira versão:

Publicado em MS Access, Projetos | Etiquetas , , , | Deixe o seu comentário

Como automatizar a vinculação de tabelas no MS Access

É uma prática usual para quem trabalha com MS Access separar o arquivo de DADOS e de SISTEMA. Inclusive a Microsoft sugere esta boa prática, tanto é que no próprio MS Access há uma ferramenta de separação de tabelas e outros conteúdos. Veja imagem abaixo:

Imagem

 

Definindo, arquivo de DADOS seria o *.mdb ou *.accdb que contém as tabelas. Arquivo de SISTEMA é o que contém todos os outros objetos tais como: formulários, relatórios, marcos, módulos, módulos de classe, consultas, etc…

O problema é que se o usuário fica mudando o arquivo de dados de lugar, a re-vinculação das tabelas não é algo assim … muito intuitivo … do tipo que um usuário comum (sem nenhum conhecimento de MS Access) faria com facilidade.

Deixo, então, um exemplo para download de como automatizar esta vinculação das tabelas com VBA:

VincularTabelas.rar

Veja: Outros posts de VBA e VB6

Publicado em MS Access, Visual Basic 6.0 e VBA | Etiquetas , , | Deixe o seu comentário

Planejamento e controle da produção, um exemplo de explosão do calculo da Necessidade Líquida descontando estoques intermediários.

Estrutura Hierárquica BicicletaDando sequência ao artigo anterior, segue mais uma apresentação que ilustra o calculo da da Necessidade Líquida de produção de um determinado produto explodindo a necessidade de produção de todos os componentes e sub-componentes do mesmo. Além disso, descontando o estoque já existente de cada nó da árvore.

 Veja a apresentação: Calculo da Necessidade Líquida.ppsx

Veja também:
Planejamento e controle da produção, um exemplo de sequenciamento de operações com restrições de recursos produtivos.

- Outros relativos

Publicado em Administração, Projetos | Etiquetas , , , , , | 2 Comentários

Planejamento e controle da produção, um exemplo de sequenciamento de operações com restrições de recursos produtivos.

Estrutura Hierárquica Bicicleta

Disponibilizo uma apresentação em MS Power Point que ilustra a lógica (algorítmo) de um sistema que faz o sequenciamento de operações que representam o processo produtivo de um produto fictício.

A ideia é que o processo produtivo de um determinado produto complexo contempla componentes (produtos filhos) que também possuem seu processo produtivo.

Define-se processo produtivo como o conjunto de operações realizadas para produzir um produto, sendo este intermediário (componente) ou final (produto de venda).

Cada operação deve utilizar um único recurso para transpassar o processo. Um recurso pode estar contido em um grupo de recursos similares para que, no momento do sequenciamento das operações, se escolha o que possua mais disponibilidade de tempo e brevidade para concluir a operação.

Veja a apresentação: Lógica do Sequenciamento.ppsx

Veja também:
MS Access e TreeView
MS Access e TreeView 2
Controle o custo de suas Receitas de Cozinha – MS Access
Outros relativos

Publicado em Administração, Projetos | Etiquetas , , , , , | Deixe o seu comentário

MS Access e Relatório estilo Gantt (Diagrama de Gantt)

Neste artigo deixo um exemplo simplificado de relatório no estilo Gantt para download. Para quem não conhece, este tipo de relatório é comumente utilizado para gerenciamento de projetos (de tecnologia ou não). Veja imagem:

Imagem

Observação: há um pouco de código  VBA (Visual Basic for Applications)  para posicionar os campos no relatório.

Faça o download GanttChart.rar

Veja também:

http://pt.wikipedia.org/wiki/Diagrama_de_Gantt

Publicado em MS Access | Etiquetas , , , , , | Deixe o seu comentário

VBA, organizando coleções seguindo princípios da orientação a objetos.

A linguagem de programação Java, além de completamente orientada a objetos possui algumas facilidades já prontas e implícitas que ajudam muito a vida do desenvolvedor. Neste artigo, focarei-me na habilidade de ordenar itens contidos em uma coleção; comparar como pode ser feito com Java e com VBA. Implementar a lógica da organização no VBA baseada no Java, que por sua vez está baseada em alguns princípios da orientação a objetos.

Coleções podem possuir tipos de dados variados tais como: datas, números, textos e objetos. Podemos ordenar os itens de uma coleção de maneira ascendente e descendente sendo que, para itens do tipo Objeto, poderíamos necessitar ordenar  a cada momento por um campo diferente. Se estivermos falando de um objeto que, por exemplo, representa uma Pessoa e, este, possua os campos Nome e Idade, ora podemos ordenar por nome, ora podemos ordenar por idade.

Já no VBA, uma maneira comum de se ordenar uma coleção é criarmos um procedimento (Sub)  dentro de um módulo que recebe como parâmetro tal coleção e a  ordena. Veja código abaixo:

Bubble Sort

Bubble Sort – algorítmo para ordenar uma coleção – código VBA

O problema é que para cada coleção que contenham itens de um tipo de dado (string, número, datas, objeto …)  ou cada vez que desejamos mudar a ordem (ascendente ou descendente) necessitaríamos codificar mais um método em um módulo no VBA (praticamente um método para cada coleção)  acarretando em inúmeras repetições de código e aumentando muito a complexidade e, consequentemente, a dificuldade de manutenção.

Existem três princípios da orientação a objetos que podem ser mencionados e aplicados à este código para melhorar a questão da complexidade e da repetição do código:

(1) Identifique aspectos de sua aplicação que variem e separe eles dos que permanecem sempre iguais (encapsulate what varies) ;

(2) Programe para interfaces não para implementações;

(3) DRY – Don’t Repeat Yourself – Não repita código.

Abaixo, pretendo relacionar estes princípios ao código Java e, na sequência, ao código VBA que será produzido e explanado:

Conforme já mencionado acima, cada nova ordem desejada demandaria uma nova função em um método. Aplicando o primeiro princípio (1) iremos encapsular o “comparador” dos objetos da coleção (destacado em vermelho), pois ele contém a lógica (critério) que irá variar:

Classe SortAsc implementa a interface Comparator

Código Java – classe SortAsc implementa a interface Comparator. O critério de ordenamento dos dados.

O que nos permite “acoplar” este comparador / critério (SortAsc)  ao método Collections.sort (que é implícito na linguagem Java) é que este método espera receber como parâmetro uma classe qualquer que implemente a interface Comparator. Então estamos tratando do 2º princípio. Abaixo o destaque para a classe que implementa a interface Comparator e também seu método compare. Podemos observar também, que cada uma das classes possuem suas responsabilidades bem definidas, por exemplo, a classe SortAsc só existe para implementar a lógica de ordenamento (critério de ordenamento) , o que nos faz pensar em mais um princípio: Single Responsability (cada classe deve possuir apenas uma responsabilidade).

Código Java - destaque para interface Comparator

Código Java – destaque para interface Comparator

Em se tratando do 3º princípio, podemos re-utilizar esta classe SortAsc que implementa o critério de organização para strings para organizar qualquer outra coleção de strings ascendente. Desta forma, não há a necessidade de se repetir o código que implementa a lógica de organização, apenas reutilizá-lo.

Pois bem ….

No VBA (Excel, Access, Word, Power Point, Outlook …. )  e até mesmo no VB6 (Microsoft Visual Basic 6), as coisas são um pouco diferentes. Temos apenas um objeto chamado Collection que funciona como um repositório para vários itens de vários tipos podendo ser até ao mesmo tempo. Além disto, a linguagem (VBA) não possui nenhum método de organização de seus itens e, tão pouco, uma coleção (Collection) VBA também o possui.

Como já disse no início deste texto, podemos implementar um método por coleção para organizá-la, mas, volto a dizer: ISSO É REPETITITITIT..ITI….VO  ….

Vamos, então, implementar (codificar)  esta característica de organização de coleções no VBA semelhante ao que já existe na linguagem Java:

Primeiro, declaramos uma interface (Módulo de Classe) no VBA que representará a interface Comparator preparando-se para o 2º princípio: programe para interfaces e não para implementações. Observação é que esta interface já é nativa na linguagem Java. Não houve a necessidade de programá-la, apenas implementá-la (utilizá-la) na linguagem Java.

Código VBA - módulo de classe que representará uma interface

Código VBA – módulo de classe que representará uma interface. Equivalente à interface Comparator do Java.

Vamos, então, implementar um módulo padrão que faz a organização dos itens de uma coleção (o algorítmo Bubble Sort). Novamente lembrando do 2º princípio pois podemos ver que utilizamos a interface na programação, e também do 3º princípio, pois iremos ver que re-utilizaremos este código (Collections.sort) para várias coleções. Na linguagem Java, a classe Collections possui inúmeros métodos estáticos (métodos não de instância) para lidar com coleções, dentre eles o método sort pronto para o uso:

Código VBA - Módulo Collections

Código VBA – Módulo Collections

Abaixo, demonstro uma classe (Módulo de Classe) que implementa a interface IComparator criada anteriormente que contém o critério para organizar objetos do tipo Pessoas.

Código VBA - Classe que implementa o algorítmo de comparação de pessoas por idade

Código VBA – Classe que implementa o critério de comparação de pessoas por idade.

A classe Pessoa possui apenas duas propriedades: Nome e Idade:

Código VBA de uma classe que representa uma pessoa

Código VBA de uma classe que representa uma pessoa

Colocando tudo junto:

Finalmente, vamos testar este código para ver se funciona. O módulo Testes (VBA) possui dois métodos para testar tudo que foi codificado.  Abaixo demonstro brevemente o método testeValores que: (1) instancia a classe responsável pelo critério de organização (CompareByValueAsc) e (2) utilizando-se deste critério + o algorítmo bubble sort (contido no módulo Collections) organiza-se os itens contidos na coleção. Falando nos princípios da orientação a objetos, : encapsulamos o que variou (que seriam as lógicas de organização (critérios), programamos para interface simplesmente permitindo que o método sort do módulo Collections aceite qualquer objeto que implemente a interface IComparator (ou seja, qualquer critério de ordenamento) e não repetimos os códigos que tratam tanto do critério de organização (classe CompareByValueAsc) como também o código que executa a organização (Collections.sort – algorítmo Bubble Sort). Tornamos a lógica da organização (critérios) , que é algo que pode variar, desacoplada  do código que executa esta organização (Collections.sort – algorítmo Bubble Sort) através das classes que implementam a interface IComparator.

Não posso esquecer de mencionar que também nos baseamos em outro grande princípio da orientação a objetos: SINGLE RESPONSABILITY – cada classe deve conter apenas uma única responsabilidade. Vemos isso tanto nas classes que implementam os critérios de ordenamento: CompareByIdadeAsc, CompareByIdadeDesc, CompareByNomeAsc e CompareByValueAsc, quanto no tradicional módulo Collections que utiliza-se destas classes para executar seu ordenamento. Isso é separação de responsabilidades e desacoplamento de código (características tão perseguidas na orientação a objetos para reduzir complexidade e facilitar a manutenção).

módulo que realiza o teste do que foi codificado.

Módulo que realiza o teste do que foi codificado.

Como este módulo é um pouco extenso deixo o link para download (SortCollections.rar) tanto do código VBA e também do equivalente código Java.

Veja também:

VBA orientado a objetos

Sabe para que serve o módulo de classe no VBA ?

Outros posts de VBA e VB6

Publicado em Java, Visual Basic 6.0 e VBA | Etiquetas , , , , , , , | 2 Comentários

Tornando uma coleção customizada iterável no VBA (for each / IUnknown / NewEnum)

Na linguagem de programação Java, existem três principais famílias de coleções sendo que cada uma delas pode implementar vários objetos dentro da mesma família. Citando cada uma dessas grandes famílias e suas breves características são:

List – Adiciona-se objetos / valores à uma coleção permitindo a iteração rápida entre eles.

Set – Adiciona-se objetos / valores à uma coleção permitindo a iteração entre eles sendo estes não repetidos.

Map – Adiciona-se objetos / valores à uma coleção identificados por uma chave (key, value).

No VBA temos duas opções: (1) criar uma matriz (array) dos objetos ou valores que queremos “colecionar”. Ex:

dim i() as Integer
ReDim i(8) as Integer

Ou (2) instanciar e utilizar um objeto do tipo Collection. Ex:

dim animais as Collection
set animais = new Collection

ou até mesmo abreviando a instrução:

dim animais as new Collection

O primeiro ponto “contra” à utilizar o objeto Collection pura e simplesmente é que ele aceita qualquer tipo de valor:

animais.add 1
animais.add “uma string”

Além do Java possuir várias coleções em 3 principais famílias, temos, na linguagem, o Generics, que faz com que definamos em tempo de compilação qual o tipo que uma determinada coleção vai aceitar:

List<Animal> animais = new ArrayList<Animal>(); /*coleção que só aceita instância de animais*/

Para contornar esta limitação, podemos implementar uma classe no VBA (Módulo de Classe) que representa uma coleção com seus métodos específicos da escolha do programador:

dim animal as new Animal
animal.Nome = “Leão”
animais.addAnimal animal

Desta forma, não fica muito melhor que a coleção customizada aceite apenas animais (e não números nem strings) ?

Bem, o objeto nativo [Collection] no VBA possui uma característica muito interessante que é a capacidade de se iterar por seus itens usando-se da instrução [for each]. Ex:

for each animal in animais
        ‘faça algo com cada animal achado na coleção…
next animal
 

Porém, ao se codificar nossa nova coleção, perdemos provisóriamente a capacidade de se usar esta sintaxe. Veja o erro apresentado:

erro iterator

Existe, então, uma forma “OCULTA” de se permitir com que uma coleção customizada aceite essa propriedade.

Objetivo final: implementar no módulo de classe o método NewEnum conforme abaixo:

Public Function NewEnum() As IUnknown
Set NewEnum = pCol.[_NewEnum]
End Function

Passos:

(1) Opcional: a interface IUnknown é uma interface oculta do VBA. Para que possamos vê-la na janela Object Browser temos que selecionar a opção de ver objetos ocultos:

exibir membros ocultos

Após fazer isso podemos verificar a existência do membro que antes era oculto:

membro oculto desocultado

Esse primeiro passo não é essencial para que o código funcione. Ele é apenas importante para percebermos que a interface existe (não vem do além).         :-D

(2) Exporte a classe que representa uma nova coleção para, por exemplo, a área de trabalho do seu computador:

exportar classe vba

(3) Na sua área de trabalho ou  em outro local que você tenha salvo a classe, abra-á com o bloco de notas e cole na mesma o seguinte código:

cole o código NewEnum

Public Function NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Set NewEnum = pCol.[_NewEnum]
End Function
 

(4) Apague a classe original contida no projeto e importe o arquivo com essas alterações previamente salvas:

importar arquivo de classe vba

Pronto !!!

Observe que no código VBA a linha destacada abaixo em vermelho fica oculta:

Public Function NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Set NewEnum = pCol.[_NewEnum]
End Function

Veja imagem:

vba iterador linha oculta

Faça o download de uma planilha MS Excel com código VBA de exemplo: CustomCollection.xlsm

Publicado em Visual Basic 6.0 e VBA | Etiquetas , , , , , , | Deixe o seu comentário

Desenvolvendo VBA e XML, fazendo uma requisição web (Web Request)

Neste artigo, dando sequência aos dois anteriores demonstro como fazer uma requisição para um arquivo XML (eXtensible Markup Language) na internet. Poderia ser um arquivo HTML ou XHTML também:

Dim url As String
url = “https://dl.dropboxusercontent.com/u/20823029/toys/books.xml

‘Abra a conexão para URL

Dim xmlHttp As New MSXML2.ServerXMLHTTP60
xmlHttp.Open “GET”, url, False

‘Envie a solicitação

xmlHttp.send

‘Carregue a resposta em um documento DOM
Dim document As New DOMDocument60
document.Load xmlHttp.responseXML

‘Processe a solicitação como for conveniente …

Faça download do exemplo.

Leia também:

Desenvolvendo VBA e XML, utilizando a API DOM (Document Object Model)

Desenvolvendo VBA e XML, utilizando a API SAX (Simple API for XML)

Publicado em Desenvolvimento, Visual Basic 6.0 e VBA | Etiquetas , , , , | 2 Comentários

Desenvolvendo VBA e XML, utilizando a API DOM (Document Object Model)

Conforme vimos no artigo anterior, SAX (Simple API for XML) é uma das alternativas para se lidar com arquivos XML. Outra ótima alternativa é o DOM (Document Object Model).

Existem + de 1ª maneira de se fazer a mesma coisa (lidar com XML), porém a API (Application Programming Interface) SAX é mais indicada quando temos um arquivo XML imenso e apenas queremos tratar algumas informações pois esta API consome menos memória que a DOM já que não armazena seus dados em memória, apenas passa por eles. Já a API DOM é indicada para tratar um arquivo XML por completo, porém, há o revés de ter que se carregar em memória toda a sua estrutura, que é o que o DOM faz quando representa programaticamente um arquivo XML.

Seguem, então, algumas diferenças:

SAX

- Analisa nó por nó;

- Não armazena o arquivo XML em memória (representação de seus nós programaticamente);

- Não se pode inserir ou deletar nós

- É um analisador baseado em eventos;

- Geralmente roda um pouco mais rápido que DOM.

DOM

- Armazena toda a estrutura XML (documento XML) em memória antes de realizar qualquer processamento;

- Ocupa mais memória;

- Pode-se inserir ou deletar nós;

- Pode-se navegar por qualquer direção pelos seus nós;

- DOM representa um modelo de árvore;

- Preserva comentários;

- Geralmente roda um pouco mais lento que SAX.

Você pode fazer o download de uma planilha do MS EXCEL que contém ambos os exemplos (SAX / DOM) chegando a um mesmo resultado.

Leia também:

Desenvolvendo VBA e XML, utilizando a API SAX (Simple API for XML)

Desenvolvendo VBA e XML, fazendo uma requisição web (Web Request)

Outros posts de VBA e VB6

Programação Orientada a Objetos com VBA e VB6

Padrão Anbima de Posição de Fundos. Eu importei.

Publicado em Visual Basic 6.0 e VBA | Etiquetas , , , , , | 1 Comentário

Desenvolvendo VBA e XML, utilizando a API SAX (Simple API for XML)

A biblioteca MSXML da Microsoft pode ser referenciada para se trabalhar com XML inclusive com todas as aplicações do MS Office (além de VB6, Dot Net, ASP, etc …). Existem duas API (Application Programming Interface) principais para se trabalhar com XML: (a) DOM (Document Object Model) e (b) SAX (Simple API for XML).

Neste artigo demostro através de um simples exemplo de VBA com MS Excel, a importação de um arquivo XML que contém dados de livros utilizando da API SAX. Porém, como já mencionado acima, esta API pode ser utilizada por outras linguagens da Microsoft, inclusive outros aplicativos do MS Office (na verdade todos que utilizam VBA).

Para iniciar, abra o MS Excel e acessando a sua IDE (Integrated Development Environment), por exemplo, pressionando as teclas [ALT] + [F11] do seu computador.

Vá no menu [Ferramentas] depois no sub-menu [Referencias] e ache o item Microsoft XML, V 6.0  conforme demonstrado abaixo:

Imagem

Isto feito, você já está pronto para começar a programar utilizando-se da API SAX. Para tanto, será preciso criar um módulo-de-classe que implementa a Interface IVBSAXContentHandler  sendo que esta classe será responsável por lidar com os eventos SAX. Veja imagem abaixo de como fica esta classe:

Imagem

A API SAX (no escopo deste artigo) possui o papel do Reader e do Handler. O primeiro é o “motor” que carrega e lê o arquivo XML. Já o segundo define o que deverá ser feito conforme o leitor (Reader) vai acessando cada uma das tags (elementos xml), por exemplo: <book>, <author>, etc… Então, o handler possui alguns “eventos” interessantes tais como: startElement, endElement e characters.

No exemplo que pode ser baixado (veja rodapé do artigo), cada vez que se inicia uma tag da qual desejo fazer algo, defino uma variável booleana que representa uma das tags que tenho interesse no arquivo xml com o valor Verdadeiro e conforme vou acessando os caracteres de dentro da tag (<tag>caracteres</tag>) verifico se a variável booleana está setada para Verdadeiro. Ao terminar a tag então seto a variável booleana para Falso e transfiro o dado para a planilha do Excel na celula correta.

Start Element: (Ocorre toda vez que o reader encontra um novo elemento)

Imagem

Character: (Ocorre toda vez que o reader está processando o texto de dentro do elemento encontrado)

Imagem

End Element: (Ocorre quando o reader terminou de ler o elemento.)

Imagem

Faça DOWNLOAD do código deste exemplo e veja de maneira mais completa tudo funcionando.

Não se esqueça de habilitar as macros quando abrir o arquivo:

Imagem

Leia também:

- Desenvolvendo VBA e XML utilizando a API DOM (Document Object Model)

Desenvolvendo VBA e XML, fazendo uma requisição web (Web Request)

Outros posts de VBA e VB6

Programação Orientada a Objetos com VBA e VB6

Padrão Anbima de Posição de Fundos. Eu importei.

Publicado em Microsoft, Projetos, Visual Basic 6.0 e VBA | Etiquetas , , , , , , | 3 Comentários