Você está na página 1de 66

A Aplicao Exemplo Livraria Duwamish

Bem-vindo ao exemplo da Livraria Duwamish. Iremos disponibilizar o exemplo em fases, cada uma representando
os passos de migrao de um sistema desktop simples de uma nica loja para um sistema de venda a varejo
escalonvel baseado na Internet. Atravs desta srie de artigos esperamos destacar assuntos como o projeto de
componentes no nvel intermedirio (middle-tier) e o projeto e acesso a um banco de dados distribudo. Por isso,
nosso objetivo no providenciar um sistema completo de venda a varejo, mas um subconjunto de um possvel
sistema que poder ser usado como uma ferramenta de aprendizado.
At o momento, disponibilizamos e documentamos as seguintes fases:
Livraria Duwamish, Fase 1

Livraria Duwamish, Fase 2

Livraria Duwamish, Fase 3

Livraria Duwamish, Fase 3.5


Para uma introduo ao exemplo, um resumo do caminho da migrao, e uma viso geral de arquiteturas em nveis
(tier), leia o artigo introdutrio:

"Uma Introduo ao Exemplo Livraria Duwamish"


Descreve o exemplo Livraria Duwamish. Inclui:
Funcionalidades bsicas.

O cenrio da migrao.

O modelo de arquitetura em nveis usado pela migrao.


Inclumos agora "pginas de ndice" que fornecem links s sees dos artigos da Livraria Duwamish. Estes links so
separados em categorias por tpicos especficos de desenvolvimento:
Tpicos Gerais de Projeto de Aplicaes
Fornece links para alguns dos mais importantes conceitos de desenvolvimento, com uma ampla aplicao
alm do escopo deste exemplo.
Tpicos de Arquiteturas em Camadas
As trs camadas lgicas que implementaremos podem ser encontradas na maioria das aplicaes
comerciais.
Tpicos de Banco de Dados e Fluxo de Dados
Fornece links aos artigos de assuntos que tratam de estruturas de dados e algoritmos complementares
usados nos nossos sistemas de catlogo, estoque e gerenciamento de pedidos.
Um Guia Passo a Passo para a Estratgia de Acesso aos Dados da Livraria Duwamish
Descreve a estratgia de acesso aos dados para a migrao da Livrarias Duwamish.

Livraria Duwamish, Fase 1


Na Fase 1, a aplicao exemplo desenvolvida para uma nica loja de venda, baseado na arquitetura de aplicao
clssica e monoltica. Para montar o exemplo ou para ver o cdigo fonte, veja a pgina Setup da Fase 1 e Cdigo
Fonte. Aqui esto os artigos que documentam a Fase 1 do exemplo:

"Construindo uma Aplicao de Solicitao e Acompanhamento de Pedidos"


Solicitao de Pedidos da Livraria Duwamish, Fase 1
Descreve a aplicao de Solicitao de Pedidos. Conhecimento em Visual Basic a ADO ser til. (13 pginas
impressas) Explica:
Compartilhando interfaces de usurio com outras aplicaes.

Exemplos de Cdigo.

Prs e contras do projeto de aplicao para a migrao.

"Coordenando as Vendas e o Estoque"


Pontos de Venda da Livraria Duwamish, Fase 1
Descreve a aplicao de Pontos de Venda. Conhecimentos em Visual Basic, projeto bsico de banco de dados, e a
aplicao de Solicitao de Pedidos da Livraria Duwamish sero teis. (10 pginas impressas) Discute:
Criando uma venda, incluindo os atributos da entidade de venda.

Transaes de Banco de Dados.

Projeto de Interface.

Exemplos de Cdigo.

"Criando um Cliente Unificado para Entrega e Recebimento"


Entrega e Recebimento da Livraria Duwamish, Fase 1
Descreve a aplicao de Entrega e Recebimento. Conhecimentos em Visual Basic, ADO, e projeto orientado a objeto
sero teis. (8 pginas impressas) Discute:
Encapsulamento de Dados.

Projeto de Interface.

Exemplos de Cdigo.

"Procurando no Estoque"
O Catlogo da Livraria Duwamish, Fase 1
Descreve a aplicao Catlogo. Conhecimentos em Visual Basic e programao de acesso a dados sero teis. (8
pginas impressas) Discute:
Criando uma funcionalidade de procura em banco de dados amigvel.

Usando controles ActiveX em um formulrio de procura.

Exemplos de Cdigo.

"Projetando um Banco de Dados Simples para Venda a Varejo"


O Banco de Dados da Livraria Duwamish, Fase 1
Detalha o esquema de banco de dados para a Livraria Duwamish. Conhecimentos de Microsoft Access e projeto
genrico de banco de dados relacional sero teis. (10 pginas impressas) Inclui:
Discusso de modelagem de transaes de negcio para projetos de banco de dados.

Especificao da Entidade do Banco de Dados da Livraria Duwamish.

Modelo de Banco de Dados da Livraria Duwamish (no formato de um grfico).

Livraria Duwamish, Fase 2


Na Fase 2, a Livraria Duwamish passa por uma pequena, mas significativa reviso de sua arquitetura. A nossa
livraria fictcia cresceu para uma cadeia de lojas, o que significa que mltiplas lojas e usurios estaro acessando o
banco de dados ao mesmo tempo. A fim de direcionar a operao de crescimento, os nossos desenvolvedores
compilaram todo o cdigo de acesso a dados em um componente COM compartilhado. Para montar o exemplo ou
para ver o cdigo fonte, veja a pgina Setup e Cdigo Fonte da Fase 2. Os seguintes artigos documentam as
mudanas na aplicao e alguns dos tpicos envolvidos na criao do componente de acesso aos dados.

"Projetando uma Camada de Acesso aos Dados"


Livraria Duwamish, Fase 2
Discute os tpicos de custos, benefcios, e projeto na criao de uma camada de acesso aos dados. (8 pginas
impressas) Discute:
Mtodos para solicitar dados de uma fonte de dados.

Mtodos para recuperar dados solicitados.

Escolhendo entre recordsets conectados e desconectados.

Escolhendo entre recordsets transacionais e no transacionais.

Escolhendo entre conexes em cache e no cache.

"Desmembrando a Camada de Acesso a Dados"


Livraria Duwamish, Fase 2
Explica o processo de remover o cdigo de acesso aos dados de uma aplicao e substitui-lo por chamadas a um
componente COM de acesso a dados. (5 pginas impressas) Discute:
Movendo um mdulo API para um componente COM.

Exemplos de Cdigo.

"Migrando um Componente em Visual Basic 5.0 para o Visual C++ 5.0"


Explica como criar uma verso em Visual C++ de um componente do Visual Basic. (3 pginas impressas) Inclui
discusso dos seguinte tpicos:
Renomeando Smbolos.

Suporte a erros em tempo de execuo (COM exceptions).

IDL, Visual Basic, e GUIDS.

"Modelando um Estoque Distribudo"


Livraria Duwamish, Fase 2
Apresenta o modelo de dados revisado para a Fase 2 o exemplo da Livraria Duwamish. (4 pginas impressas)
Discute:
Gerenciando o aumento de entrada de dados enquanto mantm a consistncia dos mesmos.

Benefcios de um componente de dados separado.

Expandindo o banco de dados para acomodar mltiplas lojas.

"API da Camada de Acesso aos Dados da Livraria Duwamish"


Livraria Duwamish, Fase 2
Descreve os mtodos e propriedades do componente da Camada de Acesso aos Dados da Livraria Duwamish
(DBDAL) COM para a Fase 2. (11 pginas impressas) Para cada mtodo e propriedade, fornece:
Assinaturas do Visual Basic e Visual C++.

Parmetros.

Exemplos de Cdigo.

Livrarias Duwamish, Fase 3


Na Fase 3, desmembramos a camada da lgica do negcio para criar uma aplicao lgica em trs-nveis (threetier). A fictcia Livraria Duwamish precisa fazer uma reviso no seu sistema usado na loja para ser mais escalonvel
e suportar rpidas mudanas nas regras do negcio. Para criar este novo sistema baseado em componentes fica mais
fcil se migrarmos nossa ferramenta de desenvolvimento para o Visual Studio 6.0.
Para montar o exemplo ou ver o cdigo fonte, veja a pgina Setup e Cdigo Fonte da Fase 3. Os seguintes artigos
discutem os tpicos envolvidos na criao de um componente para a lgica do negcio e movendo para uma
arquitetura em trs-nveis (three-tier).

"Abstraindo Transaes de Negcio"


A Camada da Lgica de Negcio da Fase 3 da Livraria Duwamish
Explica o projeto do componente da Camada da Lgica do Negcio para a aplicao exemplo da Livraria
Duwamish. (6 pginas impressas) Define a Camada da Lgica do Negcio e discute as diferenas entre a Lgica do
Negcio e a camada do fluxo de trabalho (Workflow). Tambm abrange:
Principais casos de uso do componente.

Tpicos de Desempenho.

Usando Stored procedures com Recordsets da ADO 2.0.

Tpicos de Transao.

"Desmembrando a Lgica do Negcio"


Livraria Duwamish, Fase 3
Explica o processo de remover lgica do negcio de uma aplicao e substitui-la por chamadas a componente COM.
(6 pginas impressas) Discute:
Movendo a lgica do negcio para um componente COM.

Separando o cdigo de fluxo de trabalho workflow (e a nossa definio de workflow).

Exemplos de Cdigo.

"A Camada de Acesso aos Dados da Livraria Duwamish, Fase 3"


Discute os tpicos relacionados com o estado de objeto e recursos de cache. Examina como estes se relacionam
com a Camada de Acesso a Dados da Fase 3 da Livraria Duwamish. Inclui referncia a API da Fase 3 DAL.

"API de Referncia da Camada da Lgica do Negcio da Livraria Duwamish"


Documenta os mtodos do componente da Camada da Lgica do Negcio (BLL).

"Migrando o Banco de Dados da Livraria Duwamish para o SQL Server"


Discute os tpicos envolvidos com a converso do banco de dados da Livraria Duwamish do Access 97 para o SQL
Server. (3 pginas impressas) Tambm abrange:
Usando as Ferramentas de Upsizing do Access 97.

Criando dispositivos de banco de dados.

Tpicos envolvidos na converso de consultas em SQL.

Livraria Duwamish, Fase 3.5


A Fase 3.5 do nosso exemplo de migrao almeja a uma arquitetura fsica em trs-nveis (three-tier), implementando
o Microsoft Transaction Server (MTS) para permitir as aplicaes clientes, aos componentes, e ao bando de dados
serem distribudos por vrios computadores.

Para montar o exemplo ou ver o cdigo fonte, veja a pgina Setup e Cdigo Fonte da Fase 3.5. Os seguintes artigos
discutem os tpicos envolvidos na distribuio de uma aplicao usando o MTS.

"Instalando uma Aplicao Distribuda"


Fornece instrues para montar e distribuir a Fase 3.5 da aplicao exemplo da Livraria Duwamish. (3 pginas
impressas) Discute:
Requisitos de Sistema.

Criando um banco de dados.

Instalando os componentes do nvel intermedirio (middle-tier).

Montando as aplicaes cliente.

"Distribuindo a Livraria Duwamish com o Microsoft Transaction Server"


Fornece uma viso geral da migrao do exemplo da Livraria Duwamish da Fase 3.0 at 3.5. (3 pginas impressas)
Discute:
Setup e distribuio.

Acesso Remoto.

Transaes.

O componente de acesso a dados da Livraria Duwamish.

"Instalando os Componentes da Livraria Duwamish no MTS"


Examina como os componentes modificados da Duwamish interagem com o run time do MTS fornecendo acesso
remoto e escalonamento. (8 pginas impressas) Abrange:
Ativao JIT.

Pool de conexes e tempo de vida.

Transaes automticas.

Atributos das transaes.

"Componentes de Acesso Remoto da Duwamish"


Explica o processo de preparao das aplicaes e os componentes do Modelo de Objeto de Componentes (COM), a
Camada da Lgica do Negcio (BLL), e a Camada de Acesso aos Dados (DAL) para trabalhar em diferentes
computadores. (7 pginas impressas) Discute:
Distribuio de componentes.

Instanciando objetos.

Instalando com a API do MTSAdmin.

Exemplos de cdigo do Visual Basic.

"Movendo uma Camada de Acesso a Dados para o Microsoft Transaction Server"


Discute as mudanas no componente da Camada de Acesso a Dados da Livraria Duwamish (DAL) para integrao
com o Microsoft Transaction Server (MTS). (2 pginas impressas) Assume familiaridade com o conceito de uma
camada de acesso a dados como detalhado em "Projetando uma Camada de Acesso a Dados."

Uma Introduo ao Exemplo da Livraria


Duwamish
Sumrio: Descreve o exemplo Livraria Duwamish. (4 pginas impressas) Inclui:
Funcionalidades bsicas.

O cenrio da migrao.

O modelo de arquitetura em nveis usado pela migrao.

Introduo
A Livraria Duwamish um sistema exemplo de venda e controle de estoque. Conforme a fictcia Livraria Duwamish
cresce de uma simples loja para uma operao na Internet, iremos migrar o exemplo de uma simples aplicao
desktop (arquitetura clssica) para um ambiente bsico cliente/server em trs-nveis (three-tier) e, finalmente,
para uma loja de venda a varejo para a Internet em trs-nveis (three-tier) distribudo, ou em n-nveis (n-tier).
A transio ser apresentada em quatro fases. Iremos fornecer-lhe cdigo reutilizvel, documentao das diferentes
aplicaes, e discusso dos tpicos e estratgias envolvidas com o projeto e a migrao. Atravs desta srie de
artigos esperamos destacar tpicos como: o projeto do componente do nvel intermedirio (middle-tier), migrao de
interfaces de usurio divergentes para um projeto consistente, e acesso a banco de dados distribudo. Portanto, o
nosso objetivo no de fornecer um sistema completo de venda a varejo, mas um subconjunto de um possvel
sistema que poder ser usado como uma ferramenta de aprendizado (ou, para os mais motivados, como a base para o
desenvolvimento de um projeto). Nos concentramos nas tecnologias e caractersticas que melhor demonstraro os
pontos crticos envolvidos com este tipo de migrao.
As Fases 1 e 2 sero implementadas usando Microsoft Visual Basic verso 5.0 com um banco de dados
Microsoft Access.
As Fases 3 at 4 sero implementadas usando Visual Basic verso 6.0. Tambm iremos desenvolver verses dos
componentes com o Visual C++ 6.0.
As Fases 3 e 4 iro usar um banco de dados Microsoft SQL Server. Assim, as aplicaes podero tirar vantagem
do conjunto de caractersticas avanadas e escalonamento que o banco oferece.

O Cenrio de Migrao
A estria da Livraria Duwamish uma verso simples de crescimento do negcio. Inicialmente, uma nica loja
compunha todo o negcio, e uma aplicao desktop simples satisfazia todas as necessidades do negcio (Fase 1).
Entretanto, algum sucesso permitiu a seus donos expandir para lojas adicionais, requerendo um banco de dados
centralizado que pudesse ser acessado por cada loja (Fase 2). Conforme este sucesso continuava e a Livraria
Duwamish se movia para diferentes estados e pases, o sistema tinha que comportar diferentes regras de negcio,
tais como troca nas taxas de imposto cobrado de loja para loja, requerendo futuras modificaes (Fase 3).
Porque a nossa Livraria Duwamish gerenciada por homens de negcio com uma viso avanada e de bom senso,
eles decidiram colocar a loja online. A mudana para a Internet envolve no somente gerenciar uma quantidade
maior de entrada de dados, mas tambm uma reavaliao das interfaces de usurio (Fase 4).
A migrao da Livraria Duwamish, de uma arquitetura simples para uma arquitetura em n-nveis (n-tier) para a
Internet, ser construda com as mesmas funcionalidades bsicas.
Pontos de Venda (POS): Usado por um vendedor para registrar uma venda, imprimir recibos, e atualizar o
estoque.

Solicitao de Pedidos: Usada para rastrear os vrios pedidos de novos livros e suprimentos. Esta
aplicao tambm est ligada ao estoque.

Entrega e Recebimento: Gerncia as entregas de pedidos aos clientes e o recebimento de pedidos dos
fornecedores (originados no programa de Solicitao de Pedidos). Esta aplicao dever fazer todo o

gerenciamento do estoque necessrio para manter o mesmo atualizado.

Catlogo: Usado para procurar por ttulos, autores, palavras chaves, Nmero (ISBN), e etc. ..., e tambm
usados pelas outras aplicaes para checar o estoque.
Enquanto na Fase 1 no mais do que isto desenvolvido, as fases subsequentes iro presenciar melhoramentos
nestas funcionalidades.

Nosso Exemplo: A Livraria Duwamish


A chave para este exemplo a compreenso das vrias camadas utilizadas pela maioria das aplicaes de
processamento de dados baseadas em interfaces:
Uma camada de apresentao, ou interface de usurio, pela qual o usurio interage com a aplicao.

Uma camada de regras de negcio que contm as regras de como o usurio interage e manipula os dados
atravs de uma camada de acesso aos dados. Esta camada poder conter outras camadas como subcamadas.

Uma camada de acesso aos dados que atravs de programao permitir o acesso das regras de negcio aos
dados armazenados.
Com este exemplo, iremos demonstrar no somente como escrever uma bom exemplo de desktop (Fase 1) , mas
tambm como migrar esta aplicao para outros cenrios de negcios igualmente vlidos. A Fase 2 se expande para
um modelo em dois-nveis (two-tier) e a Fase 3 para um modelo de aplicao em trs-nveis (three-tier). A Fase 4 (a
Internet) destaca os tpicos envolvidos no projeto de uma aplicao distribuda em n-nveis (n-tier).
A Figura 1 ilustra estes modelos de arquitetura.

Figura 1. O caminho da migrao

Fase 1: Clssico
No modelo clssico, note como todas as camadas esto contidas dentro da prpria aplicao. Esta arquitetura ser
muito difcil de manter em um ambiente em larga escala a no ser que extremo cuidado seja tomado para encapsular
e modularizar totalmente o cdigo. Porque a Fase 1 do exemplo da Livraria Duwamish est focado em uma
operao pequena de venda a varejo, este tipo de projeto perfeitamente aceitvel. fcil de desenvolver e, no
espao limitado de uma nica loja, fcil de manter.
Na Fase 1 entregaremos as funcionalidades bsicas e a documentao do cdigo e tpicos de projeto.

Fase 2: Dois-nveis (Two-tier)


A Fase 2 avana para um projeto em dois-nveis (two-tier), uma vez que desmembramos o cdigo de acesso a dados
na sua prpria camada. Desmembrando esta camada, fazemos com que o acesso de multi-usurios aos dados seja
muito mais fcil de trabalhar. O desenvolvedor no precisa se preocupar com o travamento de registros, ou
compartilhamento de dados, porque todo o acesso aos dados est encapsulado e controlado dentro desta nova
camada.

Fase 3 e Fase 3.5: Trs-nveis (three-tier) lgico e trs-nveis (three-tier) fsico


As regras de negcio contm no somente regras que determinam o que fazer com os dados, mas tambm como e
onde faze-lo. Para que uma aplicao se torne escalonvel, geralmente necessrio separar a camada das regras de
negcio em duas camadas separadas: a lgica do negcio no lado do cliente, a qual chamamos de fluxo de trabalho
(workflow), e a lgica do negcio no lado do servidor. Embora descrevamos estas camadas como cliente e servidor,
as implementaes fsicas reais podem variar. Geralmente, as regras de fluxo de trabalho (workflow) governam a
entrada da dados dos usurios e outros processos no cliente, enquanto a lgica do negcio controla a manipulao e
o fluxo dos dados no servidor.
A Fase 3 do exemplo da Livraria Duwamish desmembra a lgica do negcio em um componente COM para criar
uma aplicao lgica em trs-nveis (three-tier). Nosso segundo passo para criar uma aplicao em trs-nveis
(three-tier) fornecer uma implementao fsica da arquitetura. Para distribuir a aplicao entre vrios
computadores, implementamos o Microsoft Transaction Server na Fase 3.5. A aplicao ficar fcil de manter e
distribuir, quando uma mudana nas regras do negcio afetar um componente menor, e no a toda a aplicao. Isto
envolve uma anlise extensa porque, deliberadamente, as regras de negcio no foram encapsuladas na Fase 1.

Fase 4: Uma aplicao em trs-nveis (three-tier ou n-tier) para a Internet


A Fase 4 do exemplo da Livraria Duwamish culmina na migrao de um modelo desktop para um modelo
distribudo em n-nveis (n-tier) implementado como uma aplicao para a Internet. Este o estgio final da Livraria
Duwamish. Na Fase 4, desmembramos o fluxo de trabalho (workflow) em um componente separado e fornecemos
uma interface de usurio especfica para a Internet. A Fase 4 documentar os benefcio, a arquitetura, e os tpicos de
implementao relacionados com a migrao de uma aplicao em trs-nveis (three-tier) para uma aplicao para a
Internet. Muito da documentao estar focado nos produtos estratgicos da Microsoft e nas tecnologias com que o
exemplo ser construdo.

Concluso
A Livraria Duwamish pode ser uma empresa fictcia, mas os tpicos sobre o projeto, o desenvolvimento, e a
distribuio levantados atravs das quatro fases deste projeto no so. Iremos, com entusiasmo, expor e esclarecer
estes tpicos para voc.
Sinta-se a vontade para nos enviar um e-mail com suas perguntas, comentrios, ou feedback para
msdnsite@microsoft.com.

Tpicos Gerais de Projeto de Aplicaes


Os seguintes links so vises das sees dos artigos da Livraria Duwamish. Para uma lista completa dos artigos,
procure por cada fase individual no painel de Contedo deste arquivo de Ajuda.
Muitos dos mais importantes conceitos de desenvolvimento, com ampla aplicao alm do escopo deste exemplo,
so mencionados aqui.

O uso de objetos de dados


Os objetos de negcio no so somente abstratos como entidades de banco de dados, eles so abstratos como objetos
de dados do negcio. Isto permite que Clientes, Pedidos, e Vendas sejam representados por dados que muito
anlogo ao objeto de negcio real sendo modelado e que no est limitado ao que pode ser representado como uma
entidade de banco de dados.
Classes do Visual Basic define objetos que representam objetos de negcio (Fase 1)

Formulrios do Visual Basic como objetos (Fase 1)

Rolando registros e domnios de banco de dados

O uso de recordsets desconectados em uma aplicao distribuda


Os recordsets desconectados e os recordsets desconectados hierrquicos (introduzidos em ADO 2.0) permitem
s aplicaes recuperar dados e desconectar-se do banco de dados (at mesmo da rede) e trabalhar off line sem
sobrecarregar o banco de dados e a rede com uma conexo aberta. Os Recordsets tambm servem como
recipientes de dados inteligentes e de linguagem agnstica na COM e em aplicaes COM distribudas.
Recordsets desconectados ADO como recipientes de dados (Fase 2)

Papis dos recordsets ADO no exemplo da Livraria Duwamish

Recordsets ADO desconectados como uma caracterstica de escalonamento

Recordsets desconectados hierrquicos usados nos clientes da Fase 3

Extraindo um recordset aninhado

Expresses de consulta ADO modeladas

Distribuindo componentes com o MTS


O Microsoft Transaction Server (MTS) simplifica o desenvolvimento de aplicaes distribudas atravs da
unificao de componente remotos, gerenciamento de recursos, e controle de transaes em uma nica tecnologia.
Opes para instanciar objetos no Visual Basic

Ligaes cedo vs. tarde

Instalando a

MTS para componentes remotos

MTS e a escalonamento de aplicaes

MTS para ativao de componentes just in time (JIT)

Uso da API do MTS

Ativao de componentes MTS mudas p modelo de programao

O MTS funde ativao e transaes distribudas

Instanciando componentes remotos

Controle de Transaes
As tcnicas de controle de transaes esto muito prximas da tecnologia de acesso a dados, portanto no surpresa
que tenhamos documentado nossa odissia sobre o assunto.
Controle de transaes (Fase 2)

Controle de transaes (Fase 3)

Alternativas de controle de transaes com o MTS

IObjectContext versus ITransactionContext

Usando o "bug book" para disparar uma falha de transao

Transaes MTS mudam o modelo de programao

Projetando para transaes MTS

Agentes MTS de transaes implcitas distribudas

Configuraes da propriedade de atributo MTS

Desempenho e escalonamento
Um critrio importante para cada deciso de projeto na aplicao a escalonamento da aplicao. A escalonamento
considerada junto com outros fatores nas seguintes discusses.
Estado dos dados referente a escalonamento

Stored procedures versus SQL dinmico

Apenas o upsizing no melhora o desempenho

Melhoramento no desempenho relacionado ao MTS

Componentes intercambiveis entre o Visual Basic e o Visual C++

Acomodando o programador de Visual Basic

Usando o OLE/COM Object Viewer para obter a typelibrary

IDL Symbol Renaming suporta compatibilidade em tempo de projeto

Compatibilidade Binria ou compatibilidade ProgId

Fully qualified enumeration type expression problem

Visual Basic 'Raise' contrasta com C++ ATL CComCoClass 'Error()'

Tpicos de Arquiteturas em Camadas


Os seguintes links so vises das sees dos artigos da Livraria Duwamish. Para uma lista completa dos artigos,
procure por cada fase individual no painel de Contedo deste arquivo de Ajuda.
Estas camadas lgicas, as quais podem ser encontradas na maioria das aplicaes comerciais, so referenciadas no
exemplo da Livraria Duwamish. Para uma introduo, veja introduo as camadas de aplicaes.

A camada de apresentao

Formulrios do Visual Basic que apresentam objetos de negcio (Fase 1)

Preparao de um pedido de compra (Fase 1)

A camada de Workflow

Preparao de um pedido de compra (Fase 1)

Preparao de uma venda (Fase 1)

Workflow (regras de negcio no cliente) name clarified

Workflow como um cliente dos servios da BLL nas aplicaes clientes (Fase 3)

A camada da lgica do negcio

Cdigo da transao InsereVenda (Fase 1)

InsereVenda usando atualizao da DAL (Fase 2)

justificar o componente da camada da lgica do negcio (BLL)

Definir a camada da lgica do negcio (regras do negcio no servidor) (Fase 3)

Uso do modelo de programao da BLL

O cdigo da BLL distribudo entre o componente COM e o banco de dados SQL

O projeto da BLL em Visual C++

Configuraes do assistente de projeto da ATL em Visual C++ para a BLL

Os nomes das stored procedure acoplados ao cdigo da lgica do negcio

Processamento reutilizvel na BLL em Visual C++

Parmetros e comandos da BLL em Visual C++ BLL

Hierarquia de classe na BLL em Visual C++

Implementando ISupportErrorInfo na BLL em Visual C++

Chamando o prprio mtodo de interface da BLL em Visual C++

Aumentando a robustez da BLL em Visual C++

Executando stored procedures do SQL Server 6.5 na BLL

A camada de acesso aos dados

Fornecendo registros de dados em cache com a coleo de objetos do Visual Basic (Fase 1)

Cdigo de transao do InsereVenda (Fase 1)

InsereVenda usando atualizao da DAL (Fase 2)

Justificar o componente da Camada de Acesso aos Dados (DAL) (Fase 2)

Recordsets desconectados ADO como recipientes de dados (Fase 2)

Controle de transaes (Fase 2)

Gerenciamento de conexes ODBC (Fase 2)

Pool de conexes ODBC e o MTS

API da DAL (Fase 2)

Mudanas na API da DAL (Fase 3 )

Mudanas na API da DAL (Fase 3.5)

Tpicos de Banco de Dados e Fluxo de Dados


Os seguintes links so vises das sees dos artigos da Livraria Duwamish. Para uma lista completa dos artigos,
procure por cada fase individual no painel de Contedo deste arquivo de Ajuda.
Os links documentam as estruturas de dados e os algoritmos complementares usados nos nossos sistemas de
catlogo, estoque, e gerenciamento de dados.
Tambm veja, "Um Guia Fase a Fase para a Estratgia de Acesso a Dados da Livraria Duwamish."

Banco de Dados
O modelo comea como um simples banco de dados Microsoft Access para uma nica loja. expandido nas fases
subsequentes para representar mltiplas lojas e convertido para um banco de dados SQL Server usando stored
procedures.
Capturando os processos do negcio em um nico modelo

Iniciando com um arquivo de banco de dados MS Access .mdb

Modificando o banco de dados para rastrear o estoque atravs de vrias lojas

Migrando o banco de dados para o SQL Server

Melhoramentos no Banco de dados para maior escalonamento nas transaes de atualizao do Estoque na
Fase 2

Uso de stored procedures na Fase 3

Fluxo de Dados
O cdigo que interage mais diretamente com o banco de dados (e mais muda entre as fases) documentado aqui.
Preparao do pedido de compra (Fase 1)

O objeto de Pedido de Compra e seu tempo de vida (Fase 1)

O objeto Pedido de Venda e seu tempo de vida (Fase 1)

Cdigo da transao do InsereVenda (Fase 1 )

InsereVenda usando atualizao da DAL (Fase 2)

Recordsets desconectados ADO como recipientes de dados

Recordset ADO como uma coleo chave ou um mapa

Tipos de parmetros e direo (Fase 3)

Colocando dados de longa durao em cache na Fase 3 do catlogo no cliente

Expresses de consulta ADO modeladas

Um Guia Passo a Passo para a Estratgia de


Acesso a Dados Da Livraria Duwamish
Fase 1
Cdigo da Aplicao
O Cdigo do esquema acessa os dados:
SQL do Access (Select, Insert, e Update)
Manipulao ao estilo de driver ISAM (AddNew . . . Update)
Acesso aos Dados
O Cdigo nas aplicaes desktop
ADO 1.5
Access ODBC driver
Driver do ODBC do Access
Banco de Dados
Banco de Dados no formato de arquivo Microsoft Access 97 .mdb
Um esquema simples representando o modelo de negcio (no
normalizado)
Leitura
"Projetando um Banco de Dados Simples Orientado para Venda Varejo"

Fase 2
Cdigo da Aplicao
Acesso aos dados pela API da Camada de Acesso aos Dados
DAL.ExecQuery e GetRecordset (schema-aware Access SQL)
TransactedRecordset (estilo ISAM para transaes requerendo
mltiplas trips)
Acesso aos Dados
Cdigo de aceso aos dados desmembado em componentes da
Camada de Acesso a Dados (DAL)
ExecQuery, GetRecordset, TransactRecordset
ADO 1.5
Access ODBC driver
Driver do ODBC do Access
Banco de Dados
Esquema do Banco de Dados estendido para suportar vrias lojas
Modificaes no esquema no ponto principal do estoque
Leitura
"Projetando uma Camada de Acesso a Dados"
"Modelando Um Estoque Distribudo: Livraria Duwamish, Fase 2"
"Desmembrando a Camada de Acesso a Dados"
"API da Camada de Acesso a Dados da Livraria Duwamish, Fase 2"
"Migrando um Componente Visual Basic 5.0 para o Visual C++ 5.0"

Fase 3
Cdigo da Aplicao
Todo o acesso a dados pela API da Camada Lgica do Negcio
(ObterCliente, InserirPedido, . . .)
Recordsets desconectados hierrquicos da ADO 2.0
A Lgica do Negcio
A lgica do negcio desmembrada no componente da Camada Lgica
do Negcio (BLL)
A API encapsula o esquema do banco de dados
Executa stored procedures no banco de dados atravs da DAL.
Minimiza round trips e maximiza escalonamento.
Acesso aos Dados
SQL Server ODBC driver
Driver ODBC do SQL Server
ADO 2.0.
API da DAL revisada para simplificar transaes complexas
Banco de Dados
SQL Server 6.5
Stored procedures usadas exclusivamente para todo o acesso e
manipulao de dados
O esquema simples da Fase 2 permanece
Leitura
"Migrando o Banco de Dados da Livraria Duwamish par o SQL Server"
"A Camada de Acesso a Dados da Livraria Duwamish muda para a Fase 3"
"Abstraindo Transaes de Negcio"

Fase 3.5
Lgica do Negcio
Transaes OLE gerenciadas pelo MTS
Acesso a Dados
MTS assume o gerenciamento das conexes ADO/ODBC
Leitura
"Movendo a Camada de Acesso a Dados para o Microsoft Transaction Server"
"Distribuindo a Livraria Duwamish com o Microsoft Transaction Server"
"Componentes Remotos da Livraria Duwamish"
"Instalando os Componentes da Livraria Duwamish no MTS"

Fase 4
Banco de Dados
Modificar o esquema para aumentar a escalonamento e o
desempenho
Distribuir o Banco de Dados para escalonamento
Separar dados analticos (OLAP) de dados transacionais (OLTP).

Livraria Duwamish, Setup da Fase 1 e


Cdigo Fonte
Execute o pacote do setup para instalar a aplicao exemplo da Livraria Duwamish em seu computador. Na pasta de
grupo de programa Exemplo do MSDN Livraria Duwamish, Fase 1, clique na opo Duwamish Launcher.
Clique com o boto da esquerda no item Launcher para iniciar a aplicao ou clique com o boto da direita para ver
o Guia do Usurio ou as consideraes de projeto para a aplicao.
Nota No aplicativo Launcher, clique com o boto da direita em Log On e selecione User Guide para ver a lista de
nomes e senhas de usurios que j vem com o exemplo.
A Livraria Duwamish uma aplicao exemplo da MSDN no suportada. Por favor, lembre-se de que s um
exemploo suporte tcnico da Microsoft no est preparado para responder a questes sobre a Livraria Duwamish.
Clique aqui para copias o pacote exemplo de instalao e o cdigo fonte para a Fase 1 da Livraria Duwamish.
d1setup.exe: Este executvel auto-extravel ir instalar a aplicao exemplo da Livraria Duwamish.
d1source.exe: Este executvel auto-extravel ir montar a rvore de cdigo fonte do exemplo da Livraria Duwamish
em seu computador.
Nota Para compilar o cdigo fonte da Fase 1, voc ir precisar do Visual Basic 5.0 Professional ou a Enterprise
Edition. As fases futuras iro requerer a Enterprise Edition para compilar os componentes do servidor.

Construindo uma Aplicao de Solicitao e


Acompanhamento de Pedidos
A Solicitao de Pedidos da Livraria Duwamish, Fase 1
Sumrio: Descreve a aplicao de Solicitao de Pedidos. (13 pginas impressas) Conhecimentos em Visual Basic e
ADO ser til. Explica:
Compartilhando interfaces de usurio com outras aplicaes

Exemplos de Cdigo

Prs e contras de um projeto de aplicao para migrao

Introduo
Este artigo descreve a aplicao de Solicitao de Pedidos usada na Fase 1 do exemplo da Livraria Duwamish.
A aplicao de Solicitao de Pedidos (orderent.exe) parte de um conjunto de aplicaes desktop, escritas em
Microsoft Visual Basic verso 5.0, que automatiza os processos do negcio de uma pequena livraria. Estas
aplicaes compartilham de um mesmo banco de dados, como descrito em "Projetando um Banco de Dados Simples
de Venda a Varejo: O Banco de Dados Duwamish, Fase 1." As aplicaes da Fase 1 so o ponto de partida para o
que ser a migrao, como descrito em "A Livraria Duwamish," para uma arquitetura em dois-nveis (two-tier), onde
cada aplicao contem sua prpria apresentao, regras de negcio, e cdigo de acesso a dados, para uma arquitetura
em multi-nveis (multitiered), onde estes servios so distribudos pela rede.
Esta aplicao fornece funcionalidades para solicitao e acompanhamento de pedidos, incluindo interfaces
apropriadas para gerenciar clientes, funcionrios, e fornecedores. Ela compartilha interfaces de usurio com a
aplicao de Ponto de Venda (veja "Coordenando Vendas e Estoque: Ponto de Vendas da Livraria Duwamish, Fase
1") e a aplicao Chamadora, e empresta da aplicao Catlogo (veja "Procurando no Estoque: Aplicao Catlogo
da Livraria Duwamish, Fase 1").

Fluxo de Dados
A aplicao de Solicitao de Pedidos gerencia pedidos de compra e pedidos de venda. Um pedido de compra
representa uma compra de itens de um fornecedor e um pedido de venda representa uma venda que requer uma
entrega ou outro processamento.

Pedido de Compra
Um pedido de compra consiste de uma entidade pedido e de um conjunto de detalhes do pedido. Ele usa os seguintes
atributos da entidade pedido.
Tabela 1. Atributos do Pedido de Compra
Atributos
Descrio
Codigo
Identifica um nico pedido.
NumFuncionario
Identifica o funcionrio que entrou com o pedido.
NumFornecedor
Identifica o fornecedor dos itens do pedido.
DataPedido
Indica a data/hora em que o pedido foi inserido no banco de dados.
Status
Indica onde o pedido se encontra durante o seu tempo de vida, como explicado a seguir.
SubTotal
Indica o total da compra de todos os itens pedidos.
Cada detalhe do pedido usa os seguintes atributos da entidade DetalhePedido.
Tabela 2. Entidade DetalhePedido
Atributos
Descrio
Codigo
Identifica um nico detalhe do pedido.
NumPedido
Identifica o pedido de compra.

NumItem
PrecoUnitario
Quantidade

Identifica o item sendo pedido.


Indica o preo unitrio do item.
Indica a quantidade pedida.

O tempo de vida do pedido de compra


Um pedido de compra possui os seguintes estados durante o seu tempo de vida:
1. SOLICITADO indica que o pedido foi solicitado mas ainda no foi submetido ao fornecedor. A aplicao
atualiza o status do pedido para SOLICITADO quando um pedido inserido no banco de dados.
2.

PEDIDO indica que o pedido foi submetido ao fornecedor. Como as tcnicas de aprovao de um pedido
podem variar entre fornecedores, a aplicao simplesmente fornece um mtodo para manualmente
promover o status do pedido para PEDIDO.

3.

RECEBIDO indica que alguns itens do pedido foram recebidos e includos no estoque. A aplicao de
Entrega e Recebimento promove o pedido de compra para RECEBIDO.

4.

COMPLETADO indica que todas as partes do pedido foram encaminhadas. Quando um pedido de compra
completado, sai do escopo deste sistema.

Pedido de Venda
Um pedido de venda representa um pedido que requer mais processamento que uma simples venda "cliente compra
e leva um livro". Este tipo de venda permitir uma entrega ou reserva pelo cliente e requer que itens sejam pedidos.
Pedidos de venda so gerados pela aplicao de Ponto de Venda quando a quantidade de venda excede a quantidade
em mos ou quando a opo de entrega selecionada.
Um pedido de venda usa os seguintes atributos da entidade pedido.
Tabela 3. Atributos do Pedido de Venda
Atributos
Descrio
Codigo
Identifica um nico pedido.
NumCliente
Identifica o cliente.
NumFuncionario
Identifica o funcionrio que efetuou o pedido.
DataPedido
Indica a data/hora que o pedido foi inserido no banco de dados.
DataRetirada
Indica a data/hora que o pedido foi retirado pelo cliente.
Status
Indica onde o pedido se encontra em seu tempo de vida.
EhVenda
Verdadeiro indica que o pedido um pedido de venda.

O tempo de vida do pedido de venda


Um pedido de venda possui os seguintes estado durante o seu tempo de vida:
1. SOLICITADO indica que o pedido foi solicitado. A aplicao de Ponto de Venda insere pedidos de venda
no banco de dados com o status de SOLICITADO.
2.

PRONTO indica que o pedido est pronto para ser entregue. A aplicao de Solicitao de Pedidos
promove pedidos de SOLICITADO para PRONTO quando existe suficientes itens no estoque.

3.

ENTREGUE indica que partes do pedido foram entregues. A aplicao de Entrega/Recebimento promove
um pedido de venda ao status de ENTREGUE.

4.

IRACHAMAR indica que partes de um pedido esto reservados para retirada pelo cliente. A aplicao de
Entrega/Recebimento efetua esta atualizao.

5.

COMPLETADO indica que todas as partes do pedido foram entregues ou esto reservadas para retirada
pelo cliente.

Organizao da Aplicao
As interfaces de usurio (UIs) da Solicitao de Pedido so projetadas para permitir a reutilizao. A interface de
Pedido pode representar tanto um pedido de compra como um pedido de venda. A interface de Ator representa
entidades tais como um Cliente, um Funcionrio, ou um Fornecedor que estamos nos referindo como Atores. A
interface de Atores representa uma lista destes Atores e, finalmente, a interface de Pedidos representa uma lista de
pedidos de compra ou pedidos de venda.
Usamos classes de dados gerais em toda a aplicao de tal forma que sempre que o cdigo est manipulando clientes
ou vendas est usando objetos da classe cClientes ou cVendas em vez de estar abrindo registros do banco de dados
ou mantendo outros tipos de variveis para representar estas entidades. Quando selecionamos um pedido da lista de
pedidos recebemos um objeto de cPedido. Estes objetos de dados deixam a aplicao mais limpa e que fcil de
manter enquanto que lida naturalmente com a arquitetura cliente/servidor que no requer uma conexo constante
com o banco de dados.
As regras de negcio (tais como o processo que marca uma venda para ser entregue ou que determina que tipo de
venda gera transaes imediatas no estoque) so agrupadas em um nico lugar para poderem ser facilmente
alteradas sem ter que fazer alteraes por toda a aplicao. As regras de negcio atualizam os totais para um objeto
de pedido ou determinam que uma venda excedeu a quantidade em estoque e que um pedido de entrega ser gerado.
Finalmente, usamos o mdulo geral de acesso a dados (dados_api.bas) sempre que possvel e iremos documentar
aonde temos que adicion-lo. Estendemos esta interface de programao de aplicao (API) onde incluiremos
registros pai/filho e encapsular mltiplas operaes de banco de dados em uma transao de Objeto de Dados
ActiveX (ADO).

Formulrios de livre posicionamento


A aplicao de Solicitao de Pedidos basicamente o menor recipiente possvel (solpedido.exe) em torno de um
conjunto de mdulos de formulrios de livre posicionamento. Os formulrios so de livre posicionamento no sentido
de que eles tem interfaces bem definidas e dependncia de cdigo e seus processamentos internos esto bem
escondidos. Este encapsulamento permite que eles sejam reutilizados livremente de formas desconhecidas ao projeto
original sempre que uma aplicao tenha necessidade de ou necessidades para trabalhar com uma das entidades de
dados gerais da aplicao (itens de Clientes, Funcionrios, Fornecedores, Pedidos, Detalhes do Pedido, ou
Catlogo).
Os servios de um formulrios so acionados atravs da atribuio do modo de operao, pr-atribuindo cada
propriedade do Objeto, e ento mostrando o formulrio. Quando o usurio sai do formulrio, os dados resultantes
tais como um Objeto de Cliente, Funcionrio, Item, Pedido, ou Fornecedor exposto como uma propriedade do
Formulrio.

Interfaces de Usurios
A aplicao de Solicitao de Pedidos permite que funcionrios da loja entrem com novos pedidos de compra e
rastreiem pedidos de compra e venda existentes. Uma solicitao de pedido executada pelos funcionrios na Fase
1, portanto pouco esforo feito para restringir o acesso aos dados, embora as fases futuras da aplicao iro
aumentar a segurana uma vez que clientes sero capazes de fazer seus prprios pedidos de quiosques colocados na
loja e atravs da Internet. Antes de discutir a implementao das interfaces de usurio, iremos especific-los como
um conjunto de objetos com propriedades e mtodos que satisfazem o fluxo de dados requerido. Muitas das
propriedades dos dados descritas a seguir so de classes que abrangem as entidades de dados descritas em
"Projetando um Banco de Dados Simples de Venda a Varejo."
Tabela 4. Interfaces de Usurio da Solicitao de Pedidos
Interface
Descrio
Mostra um pedido de compra ou venda e fornece opes
Interface de PedidofrmPedido
de menu e na barra de ferramentas para criar novos
pedidos e procurar pedidos existentes.
Mostra uma lista dos pedidos existentes filtrados de
acordo com o modo de operao. Fornece opes de
Interface de PedidosfrmPedidos
menu e na barra de ferramentas para filtrar a lista ou
para selecionar um pedido.
Interface de AtoresfrmAtores
Fornece uma lista de Clientes, Funcionrios ou

Interface de AtorfrmAtor

Fornecedores. Fornece opes de menu e na barra de


ferramentas para incluir ou alterar estas entidades.
Uma interface de Incluir/Mostrar/Alterar para as
entidades de Endereo, Cliente, Funcionrios, ou
Fornecedor.

Interface de Pedido
O formulrio de Pedido mostra pedidos e fornece uma interface para criar novos pedidos de compra e procurar por
pedidos de compra e pedidos de venda existentes. A interface inclui selees de menu e na barra de ferramentas para
pedidos novos e existentes. O formulrio de Pedido (frmPedido) expem as seguintes propriedades e mtodos.
Tabela 5. Propriedades e Mtodos do Formulrio de Pedido
Propriedade/mtodo
Descrio
L/Escreve a propriedade inteira do modo dos controles
no formulrio. Os modos disponveis so descritos a
seguir.
PedidoModo
IcMENU_BASICO
IcINCLUI_PEDIDO_COMPRA
IcMOSTRA_PEDIDO_COMPRA
IcMOSTRA_PEDIDO_VENDA
L/Escreve objeto da classe cPedido, como definido no
Pedido
mdulo de classe geral pedido.cls.
Tabela 6. Formulrio de Pedido PedidoModo = icMENU_BASICO
Esta a interface da Solicitao. O modo de Menu Bsico apresenta as seguintes opes.
Opes do usuriobarra de
Estado
Funo
ferramentas e menu
Menu Arquivo: Fechar
ou
Habilitado
Sai do solpedido.exe.
Barra de Ferramentas: Fechar
Mostra o formulrio de Pedido com a lista
Menu Arquivo: Abrir Compra
de pedidos de compra. Muda PedidoModo
ou
Habilitado
para icMOSTRA_PEDIDO_COMPRA se
Barra de Ferramentas: Abrir PC
um pedido for selecionado.
Mostra o formulrio de Pedidos com a lista
Menu Arquivo: Abrir Vendas
de pedidos de venda. Muda PedidoModo
ou
Habilitado
para icMOSTRA_PEDIDO_VENDA se um
Barra de Ferramentas: Abrir PV
pedido for selecionado.
Menu Arquivo: Nova Compra
Muda o PedidoModo para
ou
Habilitado
icINCLUIR_PEDIDO_COMPRA.
Barra de Ferramentas: Nova PC
Tabela 7. Formulrio de Pedido PedidoModo = icINCLUIR_PEDIDO_COMPRA
O modo Incluir Pedido de Compra para solicitar um pedido de compra. Ele apresenta as seguintes opes.
Opes do Usurio
Estado
Funo
Menu Arquivo: Cancelar
Cancela uma solicitao de pedido e
ou
Habilitado
retorna para o modo Menu Bsico.
Barra de Ferramentas: Cancelar
Seleciona fornecedor para pedido
Menu Pedido: Fornecedor
(pe a interface Atores no modo
Habilitado antes de selecionar o
ou
ObterFornecedor, mostra a interface
fornecedor
Barra de Ferramentas: Fornecedor
Atores, obtm um fornecedor do
formulrio Atores).
Menu Catlogo: Procurar
Habilitado depois que um
Inclui um item ao pedido (pem a
ou
fornecedor for selecionado
interface Procura no modo
Barra de Ferramentas: Catlogo
ModoObterItem, muda a interface

Procura para Fornecedor, mostra a


interface Procura, pega o item(s)
selecionado e as quantidades
fornecidas do formulrio
DetalheProcura).
Menu Catlogo: Remover
ou
Barra de Ferramentas: Remover

Habilitado se um item do detalhe do Apaga o item selecionado do detalhe


pedido est selecionado
do pedido.

Inclui o pedido e os detalhes do


pedido no banco de dados. Se a
Habilitado se o pedido no estiver
transao tiver sucesso, muda
Submeter
vazio
PedidoModo para
icMOSTRA_PEDIDO_COMPRA e
mostra o pedido.
Tabela 8. Formulrio de Pedido OrderModo = icMOSTRA_PEDIDO_COMPRA
Opes do usurio
Estado
Funo
Executado
Habilitado
Retorna ao modo Menu Bsico.
Seleciona um pedido de compra
existente (pem a interface Pedidos
no modo CompraExistente, mostra os
Pedidos
Habilitado
Pedidos, pega o pedido do formulrio
Pedidos, mostra o pedido
selecionado).
Formulrio Pedidos PedidoModo = icMOSTRA_PEDIDO_COMPRA
Similar ao icMOSTRA_PEDIDO_COMPRA.

Interface de Pedidos
O formulrio de Pedidos fornece um modo de selecionar um pedido existente de uma lista. A lista de pedidos de
compra deve ser filtrada de acordo com o fornecedor e a de pedidos de venda deve ser filtrada por cliente. O
formulrio de Pedidos (frmPedidos) expem as seguintes propriedades e mtodos.
Tabela 9. Propriedades e Mtodos do Formulrio de Pedidos
Propriedade/mtodo
Descrio
L/Escreve a propriedade inteira do modo dos controles
no formulrio.
icPEDIDOS_COMPRA mostra a lista de pedidos de
PedidosModo
compra.
icPEDIDOS_VENDA mostra a lista de pedidos de
venda.
L/Escreve o objeto da classe cPedido, como definido
Pedido
no mdulo de classe geral pedido.cls.
L/Escreve o objeto da classe cCliente, como definido
no mdulo da classe comum cliente.cls. Referencia o
Cliente
cliente de um pedido de venda selecionado. Atribuindo
esta propriedade filtra a lista de pedidos de venda para o
a do cliente.
L/Escreve o objeto da classe cFuncionario, como
definido no mdulo da classe comum funcionario.cls.
Funcionrio
Referencia o funcionrio associado com o pedido de
compra selecionado.
L/Escreve o objeto da classe cContato, como definido
no mdulo da classe comum contato.cls. Referencia o
Fornecedor
fornecedor d0 pedido de compra selecionado.
Atribuindo esta propriedade filtra a lista de pedidos de
compra para as do fornecedor.

Tabela 10. Formulrio de Pedidos PedidosModo = icPEDIDOS_COMPRA


Mostra uma lista de pedidos de compra filtrada por fornecedor.
Opes do usurio
Estado
Funes
Cancela a seleo do pedido. Muda
as propriedades Pedido, Cliente, e
Barra de Ferramentas: Cancelar
Habilitado
Fornecedor para Nothing e esconde
o formulrio.
Seleciona um fornecedor para filtrar a
Barra de Ferramentas: Fornecedor
Habilitado
lista de pedidos. Usa servios do
frmAtores.
Seleciona pedido da lista e esconde o
formulrio, retornando o controle
Barra de Ferramentas: Selecionar
para o cdigo cliente. Muda as
Habilitado quando um pedido
ou
propriedades de Pedido,
selecionado na lista
Lista: Duplo-clique
Funcionrio, e Fornecedor
correspondente ao pedido de compra
selecionado.
Tabela 11. Formulrio de Pedidos PedidosModo = icPEDIDOS_VENDA
Mostra a lista de pedidos de venda filtrada por cliente.
Opes de usurio
Estado
Funo
Cancela a seleo do pedido. Muda a
propriedade Pedido para Nothing e
Barra de Ferramentas: Cancelar
Habilitado
esconde o formulrio, retornando o
controle para o cdigo cliente.
Seleciona o cliente para filtrar a lista
Barra de Ferramentas: Cliente
Habilitado
de pedidos. Usa servios de
frmAtores.
Seleciona o pedido da lista e esconde
o formulrio, retornando o controle
Barra de Ferramentas: Selecionar
Habilitado quando um pedido
para o cdigo cliente. Muda as
ou
selecionado na lista
propriedades Pedido, Cliente, e
Lista: Duplo-clique
Funcionrio de acordo com o pedido
de venda selecionado.

Interface de Atores
O formulrio Atores fornece um modo de selecionar um Cliente, Funcionrio, ou Fornecedor de uma lista ou como
Incluir/Alterar estas entidades. O formulrio Atores (frmAtores) expem as seguintes propriedades e mtodos.
Tabela 12. Propriedades e Mtodos do Formulrio Atores
Propriedade/mtodo
Descrio
L/Escreve a propriedade inteira do modo dos controles
no formulrio. Os modos disponveis so descritos a
seguir.
AtoresModo
IcOBTER_CLIENTE
IcOBTER_FORNECEDOR
IcOBTER_FUNCIONARIO
L/Escreve o objeto da classe cCliente, como definido
Cliente
no mdulo de classe geral ccliente.cls. um cliente
selecionado.
L/Escreve o objeto da classe cFuncionrio, como
Funcionrio
definido no mdulo de classes comuns cfuncionario.cls.
um funcionrio selecionado.
Fornecedor
L/Escreve o objeto da classe cContato, como definido
no mdulo de classes comuns ccontato.cls. um

fornecedor selecionado.
Tabela 13. Formulrio Atores AtoresModo = icOBTER_CLIENTE, icOBTER_FORNECEDOR ou
icOBTER_FUNCIONARIO
Opes de usurio
Estado
Funo
Cancela uma seleo. Muda as
propriedades de Cliente,
Funcionario, ou Fornecedor para
Barra de Ferramentas: Cancelar
Habilitado
Nothing (de acordo com o modo) e
esconde o formulrio, retornando o
controle para o cdigo cliente.
Habilitado quando um item da lista Altera a entidade selecionada usando
Barra de Ferramentas: Alterar
est selecionado
servios de frmAtor.
Inclui uma nova entidade usando
Barra de Ferramentas: Novo
Habilitado
servios de frmAtor.
Seleciona o Cliente, Funcionario, ou
Fornecedor da lista e esconde o
Barra de Ferramentas: Selecionar
formulrio, retornando o controle
Habilitado quando um item da lista
ou
para o cdigo cliente. Muda a
est selecionado
Lista: Duplo-clique
propriedade de Cliente,
Funcionrio, ou Fornecedor para a
entidade selecionada.

Interface de Ator
O formulrio Ator fornece um modo para incluir, mostrar ou alterar um Cliente, Funcionrio, Editor, Endereo de
Entrega, ou Fornecedor.
O formulrio Ator (frmAtor) expem as seguintes propriedades e mtodos.
Tabela 14. Propriedades e Mtodos do Formulrio Ator
Propriedade/mtodo
Descrio
L/Escreve a propriedade inteira do modo dos controles
no formulrio. Os modos disponveis so descritos a
seguir.
IcINCLUI_ENDERECO
IcMOSTRA_ENDERECO
IcALTERA_ENDERECO
IcINCLUI_CLIENTE
AtorModo
IcMOSTRA_CLIENTE
IcALTERA_CLIENTE
IcINCLUI _FUNCIONARIO
IcMOSTRA _ FUNCIONARIO
IcALTERA _ FUNCIONARIO
IcINCLUI _FORNECEDOR
IcMOSTRA _ FORNECEDOR
IcALTERA _ FORNECEDOR
L/Escreve o objeto da classe cEndereco, como definido
Endereo
no mdulo de classes comuns endereco.cls.
L/Escreve o objeto da classe cCliente, como definido
Cliente
no mdulo de classe geral cliente.cls.
L/Escreve o objeto da classe cFuncionario como
Funcionrio
definido no mdulo de classe geral funcionario.cls.
L/Escreve o objeto da classe cContato como definido
Fornecedor
no mdulo de classe geral contato.cls.
Tabela 15. Formulrio Ator AtorModo = icINCLUI_ENDERECO, icINCLUI _CLIENTE, icINCLUI
_FUNCIONARIO ou icINCLUI _FORNECEDOR

Opes de usurio

Estado

Funo
Cancela a transao. Muda a
propriedade de Endereo, Cliente,
Funcionario, ou Fornecedor para
Barra de Ferramentas: Cancelar
Habilitado
Nothing e esconde o formulrio,
retornando o controle para o cdigo
cliente.
Executa a transao. Inclui um
Cliente, Funcionrio, ou Fornecedor
no banco de dados, muda o objeto
Cliente, Funcionrio ou Fornecedor
para uma nova entidade, e esconde o
formulrio se teve sucesso. Mostra
Incluir
Habilitado
mensagens de erro e retorna o
controle para o usurio se no teve
sucesso.
No modo de Incluir Endereo, muda
o objeto Endereo para um novo
endereo.
Tabela 16. Formulrio Ator AtorModo icMOSTRA_ENDERECO, icMOSTRA _CLIENTE, icMOSTRA
_FUNCIONARIO ou icMOSTRA _FORNECEDOR
Opes de usurio
Estado
Funo
Esconde o formulrio, retornando o
Barra de Ferramentas: Concludo
Habilitado
controle para o cdigo cliente.
Tabela 17. Formulrio Ator AtorModo = icALTERA_CLIENTE, icALTERA _FUNCIONARIO ou
icALTERA _FORNECEDOR
Similar ao modo Incluir com opes de alterar em vez de incluir.

Usando e Implementando as Interfaces


Agora, com o fluxo de dados e as interfaces de usurio especificadas, iremos fornecer um rpido demo do cdigo
fonte mostrando como os componentes da UI funcionam bem em conjunto. Aps mostrar os componentes
funcionando em conjunto, iremos nos aprofundar em mais detalhes.

Usando os Formulrios
O seguinte segmento de cdigo mostra como usar o formulrio Pedidos para selecionar um pedido de compra
existente e para obter objetos de dados representando o pedido selecionado, o funcionrio que criou o pedido de
compra, e o fornecedor:
' Configura o formulrio de pedidos para listar os pedidos de compra
frmPedidos.PedidosModo = icPEDIDOS_COMPRA
Set frmPedidos.Pedido = m_oPedido
' Mostra o formulrio de pedidos como uma janela modal
frmPedidos.Show vbModal
' Obtm o pedido selecionado com os objetos funcionrio e fornecedor
Set m_oPedido = frmPedidos.Pedido
Set m_oFuncionario = frmPedidos.Funcionario
Set m_oFornecedor = frmPedidos.Fornecedor
De modo similar, o seguinte segmento de cdigo mostra como usar o formulrio Atores para selecionar um cliente:
' Configura o formulrio atores para listar clientes
frmAtores.AtoresModo = icOBTER_CLIENTE
Set frmAtores.Cliente = m_o Cliente
' Mostra o formulrio atores como uma janela modal
frmAtores.Show vbModal
' Obtm o objeto cliente selecionado
Set m_oCliente = frmActors.Cliente

Agora iremos usar os servios de mais de um formulrio para criar um pedido de compra. A seguinte seqncia pode
ser obtida da opo Nova Compra do formulrio de Pedido mas, para mostrar como os servios dos formulrios de
livre posicionamento podem ser usados de um modo no previsto pelo projetista original, iremos usar os servios do
novo pedido diretamente de um parte do cdigo cliente.
1. Mostra o formulrio Pedido:
frmPedido.Modo = NovoPedidoCompra
frmPedido.Show vbModal
2.

Usurio seleciona o boto Fornecedor:


frmAtores.Modo = ObterFornecedor
frmAtores.Show vbModal
Set oNovoFornecedor = frmAtores.Fornecedor
' Limpa os itens do pedido se outro fornecedor estava selecionado
If Not oNovoFornecedor Is Nothing Then
If Not oFornecedor Is Nothing Then
If oNovoFornecedor.Codigo <> oFornecedor.Codigo Then
' Fornecedor mudou entao limpa itens da lista
lvwItens.Items.Clear
Set cItemDetalhes = New clsItemDetalhes
End IF
End If
End if
3. Usurio seleciona o boto Procurar:
' O formulrio procura j usou o cache para o par item/quantidade de um
' 'pedido'.
frmProcura.SetOrderable True
' Limpa 'pedido' anterior
Set frmProcura.Pedidos = Nothing
' Filtrar os itens do catalogo pelo fornecedor selecionado
frmProcura.MudaFornecedorID m_oFornecedor.Codigo
' Mostra o formulrio como modal
frmProcura.Show vbModal
' Inclui itens que foram selecionados para a coleo detalhes do pedido
If CBool(frmProcura.ObterPedidoConta) Then
For i = 1 To frmProcura.ObterPedidoConta
Set oPedidoDet = frmProcura.ObterPedido(i)
' Usa um ID temporrio para ser substitudo pelo autocontador
do bd
oPedidoDet.Codigo = ProximoDetID
sChave = PedidoGeral.IDParaChave(oPedidoDet.Codigo)
' Inclui na coleo
m_cPedidoDetalhes.Incluir oPedidoDet, sChave
Set oPedidoDet = Nothing
Next
End If
' Regras de negocio para mudanas no pedido
SomaPedido
' Refresh a lista de detalhe
PreencheListaView
' Refresh controles do formulrio
AtualizaUI
4. Usurio seleciona o boto Submeter:
O seguinte cdigo passa o pedido para as regras de negcio que validam o pedido e tentam inclui-lo no banco de
dados. Se teve sucesso, a interface retornada para o modo de Menu Bsico e mostrada de novo. Se o pedido no
est completo ou no passa pela validao, a mensagem de erro apropriada exibida e o controle retornado ao
usurio:

' Submete o pedido ao banco de dados


If MsgBox(scCONFIRMA PARA_ENVIAR, vbYesNo) = vbYes Then
' Passa o pedido para as regras de negcio gerenciando o envio
If EnviarPedido Then
MsgBox (scENVIAR_SUCESSO)
' Coloca o formulrio no modo menu bsico e refresh
m_iPedidoModo = PEDIDO_MODO.icMENU_BASICO
' Configura os controles do formulrio
ConfiguraForm
' Refresh lista de detalhes
PreencheListaView
' Atualiza UI
AtualizaUI
End If
End If

Os Prximos Passos
Em que momento a arquitetura que foi implementada aqui ir necessitar de reviso para satisfazer o crescimento da
livraria pelos cenrios destacados no artigo "Uma Introduo ao Exemplo da Livraria Duwamish"? Como descrito
na viso geral, o acesso a dados primeiro ir ser encapsulado em uma API que suporta todas as transaes que foram
identificadas aqui. Isto far com que a aplicao seja fcil de manter, porque todo o cdigo de acesso a dados estar
em um nico lugar, e ir fornecer outros benefcios como melhor segurana dos dados e escalonamento. O cdigo de
acesso a dados ir necessitar de revises.
Primeiro, vamos destacar alguns dos bons pontos deste projeto:
Ele usa cdigo de acesso a dados geral sempre que possvel e organiza o cdigo de acesso a dados separado
do cdigo das regras de negcio e do cdigo de apresentao. Isto ir facilitar a transio para a Fase 2
onde os servios de acesso a dados so fornecidos por um componente separado.

Mesmo que o cdigo compartilhado geral em dados_api.bas no gerencie o tratamento de mltiplas


mudanas ao banco de dados como uma nica transao, inclumos cdigo que trata as partes da incluso
de um pedido como uma nica transao. Isto funciona bem porque estas transaes esto sempre incluindo
registros ao invs de atualizar registros que esto em uso por outras aplicaes.

A tcnica de copiar dados do banco de dados em objetos de dados locais na memria e retornando ao banco
de dados somente quando os dados para uma mudana foi preparado amigvel ao banco de dados pelo
motivo de que ele no mantm os registros abertos por muito tempo causado travamento de registros
desnecessariamente. Isto reduz os problemas com travamento de registro conforme o nmero de usurios
aumenta.

Pelo fato do cdigo de acesso a dados ser compilado junto com a aplicao torna-o menos propenso ao
tratamento como objeto do ponto de vista de gerenciamento porque as fontes de dados (ODBC) podem ser
configuradas para cada cliente.
Embora o projeto tenha estes pontos fortes, a migrao para a Fase 2 ir destacar um ponto fraco no projeto:
Mudanas na tecnologia de acesso a dados ir requerer que toda a aplicao seja modificada, recompilada, e
reinstalada. Colocando o cdigo de acesso a dados em um componente separado, mudanas ao acesso a dados
podem ser feitas sem mudanas na aplicao cliente.
Depois da Fase 2, as regras de negcio sero desmembradas de tal forma que elas possam ser revisadas sem ter que
reconstruir a aplicao e, finalmente, as interfaces de usurio identificadas aqui sero refinadas de tal forma que elas
funcionem bem em um ambiente distribudo e se tornem independentes da linguagem.

Coordenando Vendas e Estoque


Ponto de Venda da Livraria Duwamish, Fase 1
Sumrio: Descreve a aplicao Ponto de Venda. (10 pginas impressas) Conhecimento em Visual Basic, projeto
bsico de banco de dados, e a aplicao de Solicitao de Pedidos da Livraria Duwamish sero teis. Discute:
Criando uma venda, incluindo os atributos de uma entidade venda

Transaes de Banco de Dados

Projeto de Interface

Exemplo de cdigo

Introduo
Neste artigo iremos descrever a aplicao de Ponto de Venda (PDV) usada na Fase 1 do exemplo da Livraria
Duwamish.
A aplicao Ponto de Venda automatiza funes para a sada de produtos e controle de estoque para uma pequena
livraria. Tambm gerencia os pedidos a serem entregues e pedidos para itens que no esto no estoque. Ela empresta
interfaces da aplicao Catlogo (veja "Procurando no Estoque: Aplicao Catlogo da Livraria Duwamish, Fase 1")
e da aplicao de Solicitao de Pedidos.
Como a aplicao de Ponto de Venda em termos de arquitetura similar a aplicao de Solicitao de Pedidos que
descrevemos em "Construindo uma Aplicao de Solicitao e Acompanhamento de Pedidos: Solicitao de Pedido
da Livraria Duwamish, Fase 1," iremos nos focar aqui no que for nico para esta aplicao e fazer somente breves
referncias ao que for igual.

Fluxo de Dados
A aplicao PDV obtm o nome do funcionrio da aplicao chamadora da Duwamish.
A aplicao PDV cria entidades de venda e detalhes de venda que representam a troca de mercadoria por moeda. Se
a venda envolve entrega ou um pedido especial, a aplicao PDV gera um pedido de venda. A aplicao tambm
gera entidades de transao de estoque para vendas em que o cliente leva a mercadoria no ato. Um pedido de venda
representa uma venda que requer entrega ou outro processamento. Um pedido representa a inteno de uma
transao de negcio, a qual est conectada, atravs das aplicaes Ponto de Venda e Entrega e Recebimento, as
transaes de estoque que representam o fluxo real de itens de mercadoria pela loja.

Venda
Uma venda representa uma troca de mercadoria por moeda com um cliente. Tabela 1 lista os atributos de uma
entidade de venda.
Tabela 1. Entidade Venda
Atributos
Descrio
Codigo
Identifica uma nica venda.
NumCliente
Identifica o cliente.
Identifica um pedido de venda (quando um pedido especial ou uma entrega
NumPedido
requerida).
NumFuncionario
Identifica o funcionrio que efetuou a venda.
DataVenda
Indica a data/hora quando a venda foi includa no banco de dados.
SubTotal
A soma de todos os itens na venda.
Imposto
O imposto calculado para a venda total.
TipoPagamento
Pode ser dinheiro, cheque ou carto de crdito.
NumCartaoCredito
Para vendas com carto de crdito.
DataValidade
Para vendas com carto de crdito.

NomeNoCartao
Entrega

Para vendas com carto de crdito.


Indica que a venda para ser entregue.

Pedido de Venda
Um pedido de venda representa um pedido que requer mais processamento que um simples venda "cliente compra e
leva um livro". Este tipo de venda deve ser entregue ou reservada para o cliente e deve requerer itens a serem
pedidos. Pedidos de venda so gerados pela aplicao Ponto de Venda quando a quantidade vendida exceder a
quantidade em mos ou quando a opo de entrega for selecionada.
Um pedido de venda usa os atributos na Tabela 2 da entidade pedido.
Tabela 2. Atributos do Pedido de Venda
Atributos
Descrio
Codigo
Identifica um nico pedido.
NumCliente
Identifica o cliente.
NumFuncionario
Identifica o funcionrio que efetuou o pedido.
DataPedido
Indica a data/hora em que o pedido foi includo no bando de dados.
DataRetirada
Indica a data/hora em que o pedido foi retirado pelo cliente.
Status
Indica onde o pedido est no seu tempo de vida.
EhVenda
Verdadeiro indica que o pedido um pedido de venda.

Tempo de vida do pedido de venda


Um pedido de venda tem os seguintes estado durante o seu tempo de vida:
1. SOLICITADO indica que o pedido foi solicitado. A aplicao Ponto de Venda inclui pedidos de venda no
banco de dados com o status SOLICITADO.
2.

PRONTO indica que o pedido est pronto para ser entregue. A aplicao de Solicitao de Pedido promove
os pedidos de SOLICITADO para PRONTO quando existir estoque suficiente.

3.

ENTREGUE indica que partes do pedido foram entregues. A aplicao Entrega e Recebimento promove
um pedido de venda para o status de ENTREGUE.

4.

IRACHAMAR indica que partes de um pedido foram reservadas para retirada pelo cliente. A aplicao
Entrega e Recebimento faz esta atualizao.

5.

COMPLETADO indica que todas as partes do pedido foram entregues ou foram reservadas para retirada
pelo cliente.

Organizao da Aplicao
A aplicao PDV usa o seu prprio formulrio principal como interface de usurio. Ela empresta o formulrio de
procura geral e o formulrio de detalhes dos itens (descrito em "Procurando no Estoque: Aplicao Catlogo da
Livraria Duwamish, Fase 1") para os servios de catlogo e usa o formulrio geral atores e ator (descrito em
"Construindo uma Aplicao de Solicitao e Acompanhamento de Pedido") para servios de clientes e entrada de
endereo de entrega. A aplicao tambm usa o cdigo geral de acesso a dados em dados_api.bas sempre que
possvel e usa objetos de dados definidos pelos mdulos de classe geral para representar clientes, venda, detalhe da
venda, item, e outras entidade de dados.

Interfaces de Usurio
A interface do PDV projetada para entrar um venda rapidamente sem que haja a necessidade de um dispositivo de
apontamento. A barra de ferramentas, o menu, e a navegao pelo formulrio usam teclas de atalho alm das teclas
tab e das setas e a aplicao controla o foco dinamicamente. A interface tambm fornece uma variedade de mtodos
de procura para clientes e mercadorias. A Tabela 3 descreve as funes da interface de usurio fornecidas pela
aplicao.
Tabela 3. Funes da Interface de Usurio da PDV

Controle
Caixa de texto Nome do Cliente

Boto da Barra de Ferramentas Cliente

Caixa de texto ID ou Titulo

Lista Ttulos
Barra de Ferramentas Catalogo
Caixa de texto Quantidade
Entrega check box
ou
Opo de menu venda Entrega
Lista Detalhes Venda
Lista Venda anterior
Boto da Barra de Ferramentas Submeter
ou
Opo de menu Arquivo Submeter Venda
Boto da Barra de Ferramentas Entregar Para
Boto da Barra de Ferramentas Remover
Boto da Barra de Ferramentas Limpar
ou
Opo de menu Arquivo Limpar Venda
Boto da Barra de Ferramentas Sair
ou
Opo de menu Arquivo Sair

Descrio
Aceita entrada do usurio do nome do cliente e retorna a
melhor comparao com o banco de dados.
Mostra o nome do cliente quando um cliente
selecionado.
Seleciona um cliente usando os servios do formulrio
geral atores. Fornece funes para Incluir/Altera
clientes.
Aceita entrada do usurio de um item e retorna a melhor
comparao com o banco de dados.
ou
Aceita um ttulo parcial e retorna a melhor comparao
ou preenche a lista de ttulos se mltiplos itens
satisfazem a comparao.
Mostra o item e o ttulo quando um item selecionado.
Mostra a lista de ttulos retornada da procura de ttulo.
Fornece funo completa de procura do catlogo com
construtor integrado de pedido usando servios da
procura geral e formulrios ItemDetalhe.
Aceita entrada do usurio da quantidade para o item
selecionado.
Marca o pedido para ser entregue. Automaticamente
selecionado quando o item quantidade exceder a
quantidade em estoque.
Seleciona o detalhe da venda.
Mostra detalhes da venda atual.
Mostra os detalhes da venda anterior por cliente.
Submete a venda ao banco de dados.
Fornece substituio do endereo de entrega do cliente.
Usa servios do formulrio geral ator.
Remove da venda os itens do detalhe selecionados.
Limpa os dados da venda.

Sai da aplicao PDV.

Implementao
A aplicao PDV usada para construir e submeter dados que representam vendas da livraria. Os seguintes
exemplos de cdigo mostram partes do processo de construir uma venda, e como a venda aplicada ao banco de
dados.

Construindo a venda
Uma venda criada selecionando um cliente e incluindo itens a venda. Embora estes processos no tenham que
ocorrer neta ordem, iniciaremos por selecionar um cliente. O controle do nome do cliente aceita entrada de um nome
fantasia para o cliente ou de um apelido e tenta encontrar o cliente usando estes pequenos identificadores pessoais.
Os seguintes segmentos de cdigo mostram como um objeto cliente populado pela melhor comparao do nome
fantasia quando o controle do nome do cliente (txtNomeCliente) tem o foco e o usurio pressiona a tecla ENTER:
Private Sub txtNomeCliente_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode


Case VBRUN.vbKeyReturn
' Popula o objeto cliente com a melhor comparao do banco de dados
If PDVGeral.ObterClientePretendido(m_oCliente, txtNomeCliente) Then

A seguinte procedure constri uma query, usa a interface de programao de aplicaes (API) de dados genrica
para recuperar dados do banco de dados, e popula o objeto cliente:
Function ObterClientePretendido(ByRef oCliente As cCliente, _
ByVal txtCliente As String) As Boolean
' Popula oCliente com a melhor comparao com txtCliente
Dim oRecordset As ADODB.Recordset

' Constri query


sQry = scSEL_LIKE_CLIENTE_P & txtCliente & scSEL_LIKE_CLIENTE_S

' Recupera recordset


If AcessoDadosAPI.ObterRecordset(DUWAMISHDSN, sQry, oRecordset) Then

' Seta o objeto cliente para um novo objeto


Set oCliente = Nothing
Set oCliente = New cCliente
' Popula o objeto cliente
With oCliente
.Codigo = oRecordset!Codigo
If Not IsNull(oRecordset!Apelido) Then .Apeliso = oRecordset!Apelido
If Not IsNull(oRecordset!Sobrenome) Then .Sobrenome = oRecordset!Sobrenome

O boto da barra de ferramentas Cliente obtm um objeto cliente usando os servios do formulrio geral atores, que
est documentado em "Construindo uma Aplicao de Solicitao e Acompanhamento de Pedido."
O pedido pode ser preenchido tanto entrando itens nos controles ID ou Ttulo (txtTituloISBN) como atravs do
boto da barra de ferramentas Catlogo. Em " Construindo uma Aplicao de Solicitao e Acompanhamento de
Pedido," documentamos o uso do formulrio de procura geral para construir um pedido, portanto neste artigo iremos
nos focar nos outros mtodos de incluso de itens. Quando txtTituloISDN tem o controle e o usurio pressiona a
tecla ENTER, o seguinte cdigo primeiro determina se o texto digitado um item de ID e procura por ttulos que
coincidam com o digitado se ele determinar que o texto parte de um ttulo:
If PDVGeral.ObterItemPretendido(oItem, txtTituloISBN) Then

Else
' Preenche a coleo de itens para comparao com ttulos parciais
If PDVGeral.ObterItensPretendidos(oItens, txtTituloISBN) Then

' Esconde a caixa de texto e preenche a lista de ttulos com os itens


txtTituloISBN.Visible = False
cmbTitulo.Clear
For Each oItem In oItens
cmbTitulo.AddItem oItem.Titulo
cmbTitulo.ItemData(cmbTitulo.NewIndex) = oItem.Codigo

Next

Aqui est a procedure que preenche a coleo:


Public Function ObtemItensPretendidos(ByRef oItens As cItens, _
ByVal txtItem As String) As Boolean

' Inicializa oItens


Set oItens = Nothing

Set oItens = New cItens


' Constri query
sQry = scSEL_LIKE_ITENS_P & txtItem & scSEL_LIKE_ITENS_S
If AcessoDadosAPI.ObterRecordset(DUWAMISHDSN, sQry, oRecordset) Then
If oRecordset.RecordCount Then
ObtemItensPretendidos = True
Do While Not oRecordset.EOF
Set oItem = New cItem
With oItem
.NumItem = oRecordset!NumItem
If Not IsNull(oRecordset!ItemTipoId) Then
.ItemTipoId = oRecordset!ItemTipoId
End If
If Not IsNull(oRecordset!NumAutor) Then
.NumAutor = oRecordset!NumAutor
End If

End With
' Prepara o valor da chave para o item
sChave = FormataNumItemComoChave(oItem.NumItem)
' Inclui o item na coleo de itens
oItens.Add oItem, sChave
' Libera a variavel objeto
Set oItem = Nothing
' Move para o prximo registro
oRecordset.MoveNext
Loop
End If
Set oRecordset = Nothing
End If
..

Submeter a Venda
Embora usemos a API de acesso a dados geral em dados_api.bas sempre que possvel nesta aplicao, a relao
pai/filho entre registros de venda e detalhes e a necessidade de agrupar vrias mudanas nos dados como uma nica
transao requer cdigo especial de acesso a dados. Os seguintes segmentos de cdigo mostram como os objetos de
dados de venda so includos no banco de dados aps serem processados pelo cdigo de regras de negcio:

'Obtm a conexo e inicia transao


Set oConn = New ADODB.Connection
oConn.Open sConnexao
oConn.BeginTrans
A primeira parte da transao incluir um registro na tabela de vendas. Um cursor do tipo keyset usando o
travamento de registro otimista permite que o registro seja lido aps a incluso para recuperar o Codigo gerado
automaticamente, o qual ser usado para relacionar os detalhes da venda com a entidade venda:
' Incluir venda
Set oRset = New ADODB.Recordset
Set oRset.ActiveConnection = oConn
oRset.CursorType = adOpenKeyset
oRset.LockType = adLockOptimistic
oRset.Open scTABELA_VENDAS, , , , adCmdTable
' Inclui registro de venda
oRset.AddNew
' Copia dados do objeto venda para o registro venda
With oVenda

oRset!NumCliente = .NumCliente
If .NumPedido Then
oRset!NumPedido = oVenda.NumPedido
End If
oRset!NumFuncionario = .NumFuncionario

End With
' Atualiza registro de venda
oRset.Update
' Guarda Codigo do registro de venda para ser usado nos detalhes da venda
oVenda.Codigo = oRset!Codigo
oRset.Close
Set oRset = Nothing
Usando o mesmo cursor e tipo de travamento para os detalhes da venda, o Codigo pode ser conservado para ser
usado nas entidades de transao de estoque:
' Incluir detalhes da venda
Set oRset = New ADODB.Recordset
Set oRset.ActiveConnection = oConn
oRset.CursorType = adOpenKeyset
oRset.LockType = adLockOptimistic
oRset.Open scTABELA_VENDA_DETALHES, , , , adCmdTable
For Each oSaleDet In oVendaDetalhes
oRset.AddNew
oRset!NumVenda = oVenda.Codigo
With oVendaDet
oRset!ItemId = .ItemId
oRset!PrecoUnitario =.PrecoUnitario
oRset!Quantidade = .Quantidade
End With
ORset.Update
' Guarda o Codigo do registro de detalhe da venda no objeto de detalhe da
venda
oVendaDet.Codigo = oRset!Codigo
Next
oRset.Close
Set oRset = Nothing
O seguinte cdigo ajusta o estoque em casos o cliente est levando a mercadoria. Os registros de transao de
estoque podem ser includos em lote porque no requerido nenhuma leitura aps a atualizao. Alteraes na
quantidade EmEstoque requer uma seqncia de alterao e leitura portanto cada registro travado, lido, e alterado
individualmente:
If Not oVenda.Entrega Then
Set oRset = New ADODB.Recordset
Set oRset.ActiveConnection = oConn
oRset.CursorType = adOpenKeyset
oRset.LockType = adLockBatchOptimistic
oRset.Open scTABELA_ESTOQUE_CONTROLE, , , , adCmdTable
' Inclui uma entidade de acompanhamento de estoque para cada transao de
estoque
For Each oVendaDet In oVendaDetalhes
oRset.AddNew
oRset!NumItem = oVendaDet.NumItem
oRset!NumFuncionario = oVenda.NumFuncionario
oRset!NumTransacao = oVendaDet.Codigo
oRset!EhVenda = True
oRset!Quantidade = -1 * oVendaDet.Quantidade
oRset!DataTransacao = tDate

oRset.Update
Next
oRset.UpdateBatch
oRset.Close
Set oRset = Nothing
' Adusta o campo EmEstoque para cada detalhe
For Each oVendaDet In oVendaDetalhes
sQry = scSELECIONA_ITEM_EMESTOQUE & oVendaDet.NumItem
Set oRset = New ADODB.Recordset
Set oRset.ActiveConnection = oConn
oRset.CursorType = adOpenKeyset
oRset.LockType = adLockOptimistic
oRset.Open sQry, , , , adCmdText
If Not oRset.EOF Then
oRset!EmEstoque = oRset!EmEstoque - oVendaDet.Quantidade
oRset.Update
End If
oRset.Close
Set oRset = Nothing
Next
End If
A seguinte seo grava todas as partes da transao como uma nica, e termina:
oConn.CommitTrans
oConn.Close
Set oConn = Nothing
IncluirVenda = True
Exit Function
Um erro em qualquer ponto causa a falha de toda a transao e notifica a procedure chamadora:
ErrorHandler:

oConn.RollbackTrans
oConn.Close
Set oConn = Nothing
IncluirVenda = False

Err.Raise lErrNo, OBJNAME, sErrDesc

Concluso
A aplicao PDV a aplicao com transao mais intensa da Fase 1. Como detalhado acima, cada transao de
venda em que o cliente recebe a mercadoria imediatamente faz com que registros sejam includos em trs tabelas e
alterados em uma tabela. Cada venda em que a mercadoria entregue posteriormente faz com que registros sejam
includos em quatro tabelas com alterao no estoque gerenciado mais tarde pela aplicao de Entrega. A
probabilidade de conteno de alteraes no grande quando as alteraes de estoque feita por uma nica caixa
registradora e por entrega/recebimento, mas aumenta quando mais caixas registradoras so adicionadas. A aplicao
PDV se recupera de uma coliso de dados solicitando ao usurio pressionar o boto Submeter para tentar de novo.
Mas conforme a probabilidade de coliso aumenta, a forma como elas so evitadas e a forma como elas so
resolvidas torna-se tpicos crticos do projeto. As fases remanescentes do exemplo da Livraria Duwamish ir
apresentar solues para estes problemas conforme detalhemos o caminho da migrao de uma escala desktop para
um empreendimento em larga escala.

Criando um Cliente Unificado para Entrega


e Recebimento
Entrega e recebimento da Livraria Duwamish, Fase 1
Sumrio: Descreve as aplicaes de Entrega e Recebimento. (8 pginas impressas) Conhecimento em Visual Basic,
ADO, e projeto orientado a objeto ser til. Discute:
Encapsulamento de dados

Projeto de Interface

Exemplos de cdigo

Introduo
Este artigo descreve a aplicao de Entrega e Recebimento usada na Fase 1 na aplicao do exemplo da Livraria
Duwamish. Veja introduo ao exemplo, "Livraria Duwamish," para detalhes relativos as fases. A aplicao de
Entrega e Recebimento mais uma de uma srie de aplicaes desktop que em conjunto automatizam alguns dos
processos rotineiros do negcio de uma pequena livraria.

O Grande Cenrio
O processo de incluir itens e remover itens do estoque constitui o processo de entrega e recebimento. O processo de
recebimento direcionado por um pedido de compra e o processo de entrega direcionado pela venda.
Normalmente, receber itens no estoque requer uma pessoa de recebimento para remover a lista de conferncia do
pacote e comparar com um pedido de compra previamente criado. Este pedido de compra contem o nome do
fornecedor e uma lista de itens solicitados. A pessoa de recebimento contabiliza cada item recebido, grava a
quantidade real, e muda a quantidade no estoque pela quantidade recebida.
A aplicao de Entrega e Recebimento que desenvolvemos para o exemplo da Livraria Duwamish gerencia os
ltimos passos automaticamente. Quando um pedido chega, a pessoa de recebimento seleciona o nmero do pedido
de compra de uma lista drop-down que contem os assombrosos pedidos de compra. O formulrio mostra os detalhes
do pedido de compra, incluindo o fornecedor e a lista de itens solicitados. A partir desta lista, cada item recebido
selecionado, uma quantidade informada, e uma observao opcional criada. Depois que todos os itens recebidos
tenham sido entrados, a pessoa de recebimento efetua um clique no boto Submeter, o qual faz com que a aplicao
automaticamente grave cada um dos atributos dos itens recebidos e ajuste o estoque de acordo.
Na parte de entrega da aplicao, um pedido de venda selecionado de uma lista de nmeros de pedidos de venda.
O pedido de venda mostrado inclui informao do cliente e uma lista detalhada dos itens solicitados. Da mesma
forma que o recebimento, cada um dos itens e contabilizado, a quantidade de entrega real gravada, e o estoque
diminudo pela quantidade entregue.

Nos bastidores: Movimentando o Estoque


Sem o estoque, uma operao de venda a varejo no funciona. O mesmo critrio se aplica a aplicao de Entrega e
Recebimento. Itens devem ser recebidos no estoque afim de se ter mercadoria em mos para vender.
A aplicao de Entrega e Recebimento usa uma interface de programao de aplicaes (API) de banco de dados
genrica que acessa um banco de dados Microsoft Access atravs dos Objetos de Dados ActiveX (ADO). Mais
tarde neste artigo, iremos explicar como os dados so realmente gerenciados pelo encapsulamento. Por agora iremos
explicar o bsico sobre o status do estoque e informao histrica do acompanhamento como aplicada diretamente
a entrega e recebimento. Para uma descrio mais completa da estrutura real do banco de dados veja o artigo
"Projetando um Banco de Dados Simples de Venda a Varejo: Banco de Dados da Livraria Duwamish, Fase 1."
O processo de dados de Entrega e Recebimento gerenciado atravs das tabelas Itens e AcompanhaEstoque, e
atravs de referencias das tabelas Pedidos, PedidosDetalhes, Vendas, e VendaDetalhes. A tabela Itens contem vrios
atributos associados com o item. O campo EmEstoque contem a quantidade em estoque atual de um item. Conforme
itens so recebidos no estoque, esta quantidade do item adicionada ao valor atual EmEstoque, enquanto que para

entrega a quantidade decrementada. Afim de manter dados histricos, conforme os itens entram e saem do estoque,
um registro e adicionado a tabela AcompanhaEstoque toda vez que um item recebido ou entregue. Uma referencia
a um item solicitado includa no registro adicionado que associa um pedido com um registro de
AcompanhaEstoque. Por causa da complexidade adicionada ao acompanhar recebimentos parciais ou excedente,
decidimos que, para o propsito deste exemplo, uma vez que qualquer quantidade de um item individual includo em
um pedido recebido (ou entregue), este item considerado como totalmente recebido (ou entregue). Portanto, para
cada item includo como parte de um pedido, existe somente um registro em AcompanhaEstoque.

Conceitos de Projeto de Interface


Esta aplicao incorpora um certo nmero de procedures as quais, quando combinadas, modelam o processo tpico
de entrega e recebimento. Por causa das similaridades entre os processo de entrega e recebimento, decidimos fazer
as interfaces de usurio (UIs) para os modos de entrega e recebimento similares e usar procedures gerais. Damos um
enfoque modular ao projeto, criando procedures que modelaro processo particulares, como a ProcessoItem. Esta
procedure usada na entrega e no recebimento para mudar a quantidade no estoque e adicionar um registro de
acompanhamento, assim "processando o item." Para acesso aos dados, usamos uma API geral de banco de dados que
incorpora ADO a sua interface com o banco de dados. Para o processamento real de dados, ao invs de usar um SQL
para retornar um recordset e ento trabalhar diretamente com os dados, escolhemos encapsular os dados e ento
trabalhar com uma imagem deles. ( mais fcil trabalhar com objetos que com dados puros em forma de recordsets.)
Esta metodologia mais ajustada com o conceito de programao orientada a objeto. Mais tarde neste artigo
demonstramos o uso do encapsulamento de dados e como ele se aplica ao processo de acompanhamento do
movimento de estoque.

Navegando pela Aplicao


A aplicao iniciada tanto no modo de Entrega como no modo de Recebimento atravs de uma chave na linha de
comando, a qual fornecida pela aplicao Chamadora. A aplicao de Entrega e Recebimento usa uma interface
padro do Windows, incluindo um menu e uma barra de ferramentas, que so customizadas para cada modo. Alguns
dos botes da barra de ferramentas e dos itens de menu esto desabilitados at que eles sejam necessrios.

Figura 1. A aplicao no modo de entrega

A Interface da Aplicao
A Figura 1 mostra a aplicao no modo de entrega; a UI para o modo de recebimento essencialmente o mesmo.
Tabelas 14 mostram que opes o usurio pode selecionar da barra de ferramentas, do menu, e submenus.
Tabela 1. Barra de Ferramentas
Opes de Usurio
Estado
Funo
Lista de Conferncia
Habilitado se Entrega selecionado
Imprime uma lista de conferncia
Etiqueta de Entrega
Habilitado se Entrega selecionado
Imprime uma etiqueta de entrega
Habilitado se Recebimento ou
Sair
Sai da aplicao
Entrega selecionado
Tabela 2. Item de Menu = Menu Bsico
Opes de Usurio
Estado
Funo
Permite acesso a impresso,
Arquivo
Habilitado
observao, e sair
Permite acesso a visibilidade da barra
Exibir
Habilitado
de ferramentas
Tabela 3. Item de Menu = Arquivo
Opes de Usurio
Estado
Funo
Imprime - Etiqueta de Entrega
Habilitado se Entrega selecionado
Imprime uma etiqueta de entrega
Imprime - Lista de Conferncia
Habilitado se Entrega selecionado
Imprime uma lista de conferncia
Sair
Habilitado
Sai da aplicao
Tabela 4. Item de Menu = Exibir
Opes de Usurio
Estado
Funo
Barra de Ferramentas
Desmarcado
Barra de Ferramentas no visvel
Barra de Ferramentas
Marcado
Barra de Ferramentas visvel

Projeto Orientado a Objeto e Encapsulamento de Dados


Um nmero de objetos e colees de objetos so usados para representar dados em um banco de dados. A coleo de
objetos representa uma tabela do banco de dados. O objeto representa um registro nesta tabela e as propriedades do
objeto representam os campos. Por exemplo, PedidosCompra representa uma coleo de objetos PedidoCompra.

Inicializao de um Objeto
A procedure Inicializar popula muitas das colees com dados, e tambm atualiza os dados nessas colees. Para
cada objeto, Inicializar chama a funo ObterConjuntoRegistro na API do banco de dados, a qual retorna um
recordset contendo dados que pertencem ao objeto alvo. Ento a cada propriedade atribudo o valor do campo
associado no registro corrente. Subseqentemente, cada objeto adicionado a coleo. Este processo abrange o
processo de inicializao para cada objeto da coleo. Alm da funo Inicializar, colees de pedidos so
inicializadas, quando necessrio, nas suas respectivas funes, InicializarPedidosCompra e
InicializarPedidosVenda. No segmento de cdigo que segue, itens do pedido de venda e seus atributos so
retornados conforme a coleo oPVDetalhe inicializada:
'Obtm pedidos de venda corrente para entrega.
sSQL = "SELECT Pedidos.* FROM Pedidos INNER JOIN Vendas ON " & _
"Pedidos.Codigo = Vendas.NumPedido WHERE (((Pedidos.Status)='" & scPRONTO & _
"') AND ((Pedidos.EhVenda)=True) AND ((Vendas.Entrega)=True))"
If AcessoDadosAPI.ObterRecordSet(scCONNECT, sSQL, oRS) Then
Set g_oPedidosVenda = New PedidosVenda
If oRS.RecordCount > 0 Then
For iCount = 0 To oRS.RecordCount - 1
Set oPedidoVenda = New PedidoVenda
On Error Resume Next
With o PedidoVenda
.NumPedido = oRS!NumPedido

.NumCliente = oRS! NumCliente


.NumFuncionario = oRS! NumFuncionario
.DataPedido = oRS! DataPedido
.DataRetirada = oRS! DataRetirada
.Status = oRS!Status
.SubTotal = oRS!SubTotal
.GerenciarEntrega = oRS! GerenciarEntrega
.Imposto = oRS! Imposto
.Total = oRS!Total
.EhVenda = True
.EntregaNome = oRS! EntregaNome
.EntregaEndereco1 = oRS! EntregaEndereco1
.EntregaEndereco2 = oRS! EntregaEndereco2
.EntregaCidade = oRS! EntregaCidade
.EntregaEstado = oRS! EntregaEstado
.EntregaCEP = oRS! EntregaCEP
.EntregaTelefone = oRS! EntregaTelefone
End With
On Error GoTo 0
g_oPedidosVenda.Add oPedidoVenda,
FormataNumeoParaChave(oPedidoVenda.NumPedido)
Set oPedidoVenda = Nothing
oRS.MoveNext
Next iCount
End If
oRS.Close
Set oRS = Nothing
End If

Processamento de Pedido e Movimento de Estoque


Como mencionado anteriormente, os processos de entrega e recebimento essencialmente espelham um ao outro. Em
geral, os passos para cada processo so os mesmos, exceto que um pedido de entrega deve incluir uma lista de
conferncia e uma etiqueta de entrega. A aplicao de Entrega inclui os botes da barra de ferramentas e os itens de
menu para impresso de uma lista de conferncia e uma etiqueta de entrega, mas deixamos a implementao desta
caracterstica para voc. No exemplo a seguir, iremos destacar a Entrega, lembrando que o Recebimento usa as
mesmas procedures e a mesma interface de usurio.

Selecionando um Pedido de Venda


Quando um nmero de pedido de venda selecionado da lista drop-down, a aplicao chama a funo
mostraPedido, que comum aos processo de entrega e recebimento. Esta procedure contem os processos que
mostram tanto o pedido de venda selecionado ou o pedido de compra selecionado. O pedido de venda mostrado
inclui informaes do cliente e uma lista detalhada dos itens solicitados mas ainda no entregues. No processo de
inicializao, a coleo dos detalhes do pedido de venda populada somente com itens que esto disponveis para
entrega. O seguinte segmento de cdigo ilustra como mostrar um pedido de venda usando a funo mostrarPedido:
Sub mostrarPedido(Modo As Integer)
Select Case Modo
Case scMODO_REC
.
.
.
Case scMODO_ENTR
'Esconde modo recebimento.
mskEntregaQtd = 0
cmdItemDetalhe(icMODO_ENTR).Visible = True
mostrarCliente (Val(cmbPedidos(icMODO_ENTR)))

mostrarPVDetalhes (Val(cmbPedidos(icMODO_ENTR)))
'Mostra o modo de entrega.
frmeCliente.Visible = True
lstPVDetalhe.Visible = True
lblPVDetalhe.Visible = True
mskDataEntrega = Date$
mnuEtiquetaEntrega.Enabled = True
mnuListaConf.Enabled = True
tlbEstoque.Buttons(3).Enabled = True
tlbEstoque.Buttons(4).Enabled = True

Preparando um Item
O pedido de venda contem uma lista de itens solicitados pelo cliente. Para que um item seja submetido, seus
atributos relacionados ao estoque devem ser entrados. O usurio tem a opo de selecionar um item da lista de itens
disponveis e ento informar uma quantidade ou arrastar o item para a caixa de texto quantidade. Tambm, neste
momento, uma observao pode ser digitada na caixa de texto observao. Um grupo de itens podem ser
selecionados e cada um dos seus atributos associados podem ser informados. Antes que os itens sejam submetidos,
estas entradas so usadas como valores para as propriedades do objeto AcompanhaEstoque, como ilustrado no
comeo do seguinte cdigo:
Private Sub SubmeterItem(Modo As Integer)
Dim oAcompanhaEstoque As New AcompanhaEstoque
Dim lNumFuncionario As Long
Select Case Modo
Case icMODO_REC ' Pedido de Compra / recebendo
.
.
.
Case icMODO_ENTR ' Pedido de Venda / entregando
With oAcompanhaEstoque
.EhVenda = True
.NumItem = lstPVDetalhe.SelectedItem.Text ' item selecionado
.NumTransacao = lstPVDetalhe.SelectedItem.SubItems(6) ' numero PV
If ObterUsuarioLogado(lNumFuncionario) Then
. NumFuncionario= lNumFuncionario
End If
.DataTransacao = mskDataEntrega
.Quantidade = -Val(lstPVDetalhe.SelectedItem.SubItems(4))
If lstPVDetalhe.SelectedItem.SubItems(5) = "" Then
.Observacao = " "
Else
. Observacao = lstPVDetalhe.SelectedItem.SubItems(5)
End If
End With
End Select
If ProcessaItem(oAcompanhaEstoque) Then
End If
End Sub

Submetendo um Item
Uma vez que um pedido submetido, a funo SubmeterItem chamada para cada item marcado na lista. Depois
que os valores das propriedades do objeto oAcompanhaEstoque so atribudas, a funo ProcessaItem chamada.
A funo ProcessaItem que segue muda a quantidade no estoque e adiciona o registro de acompanhamento do
estoque:
Public Function ProcessaItem(oAcompanhaEstoque As AcompanhaEstoque) As Boolean
Dim bLivro As Boolean

Dim
Dim
Dim
Dim

oItem As Object
lQtd As Integer
bRetorna As Boolean
sQry As String

ProcessaItem = False
If ObterItem(oAcompanhaEstoque.NumItem, bLivro, oItem) Then
' oAcompanhaEstoque.Quantidade um valor positivo para o recebimento
' e um valor negativo para a entrega
With oAcompanhaEstoque
lQtd = oItem.EmEstoque + .Quantidade
sQry = "UPDATE Itens SET Itens.EmEstoque = " & lQtd & _
" WHERE (((Itens.Codigo)=" & .NumItem & "))"
bRetorna = AcessoDadosAPI.ExecQuery(scCONNECT, sQry)
sQry = "INSERT INTO AcompanhaEstoque ( NumItem, " & _
"NumTransacao, NumFuncionario, EhVenda, Quantidade, " & _
"DataTransacao, Observacao ) VALUES (" & .NumItem & _
", " & .NumTransacao & ", " & .NumFuncionario & _
", " & .EhVenda & ", " & .Quantidade & ", #" & _
.DataTransacao & "#, '" & .Observacao & "')"
End With
bRetorna = AcessoDadosAPI.ExecQuery(scCONNECT, sQry)
ProcessaItem = True
End If
End Function

Concluso
Enquanto esta aplicao no caracterizada como suficientemente rica para ser uma aplicao do mundo real,
funcionalidades suficientes foram incorporadas na Fase 1 para nos permitir demonstrar as tcnicas usadas para
mover de uma aplicao desktop de uma nica loja para fornecer os recursos de computador para mover a operao
para a Web. Conforme movemos a aplicao de Entrega e recebimento atravs das vrias fases, o enfoque modular
usado na Fase 1 tornar fcil separar as procedures da aplicao principal a coloca-las em componentes distribudos.

Procurando no Estoque
O Catlogo da Livraria Duwamish, Fase 1
Sumrio: Descreve a aplicao Catlogo. (8 pginas impressas). Conhecimento em Visual Basic e em programao
de acesso a dados ser til. Discute:
Criando funcionalidades amigveis de procura em banco de dados

Usando controles ActiveX em um formulrio de procura

Exemplos de cdigo
A aplicao Catlogo do exemplo da Livraria Duwamish foi construdo com o Microsoft Visual Basic verso
5.0. Contm todas as funcionalidade para realizar procuras (com mltiplos parmetros, tais como o nmero
International Standard Book Number (ISBN), palavras chaves, autores, datas, e preos), criando novos itens, e
alterando itens existentes. O objetivo foi de modelar uma aplicao que uma pequena livraria de venda a varejo
possa usar. Ela foi projetada especificamente para demonstrar o caminho da migrao de um aplicao simples em
2-nveis (two-tier) para uma aplicao em n-nveis (n-tier), totalmente escalonvel e distribuda. Ela compartilha o
banco de dados com outras aplicaes da Livraria Duwamish, mas tem a sua prpria API de acesso aos dados. Nas
fases subsequentes, conforme a aplicao Catlogo se aproxima de um aplicao escalonvel, a API de acesso a
dados a camada de fluxo de trabalho sero compartilhadas entre todos os componentes do sistema.

Uma Viso Geral da Aplicao

Figura 1. Formulrio de Procura Inicial


O formulrio de Procura principal (Figura 1) mostrado assim que a aplicao chamada. Este formulrio mostra,
como padro, os controles para parmetros da procura para ttulo, autor, fornecedor, nmero do item, ISBN, e
palavra(s) chave(s), e fornece um boto Avanado que expande o formulrio e mostra controles para parmetros
adicionais: preo, ano, editora, e estoque. Tambm existe no formulrio principal um boto para criar um novo item,
que s aparecer se o usurio tiver permisso para faze-lo. Na execuo da procura os dados do registro apropriado
so mostrados em um controle do tipo ListView (chamado Resultado) no rodap do formulrio.

Aps a procura ser executada, o usurio pode dar um duplo clique em qualquer dos itens encontrados para ver seus
detalhes. Se permitido ao usurio alterar os itens, cada item nos detalhes dos itens poder ser modificado. Seno, o
usurio s poder ver os dados estticos, e possivelmente adicionar o item a um pedido.

O Fluxo de Dados
O mecanismo de acesso a dados usa o ADO (ActiveX Data Objects) para conversar com o banco de dados
Microsoft Access. O objeto recordset obtido atravs da funo ObterRecordset. ObterRecordset recebe dois
parmetros, um requerido e um Booleano opcional. O primeiro parmetro a string SQL de consulta (por exemplo,
"Select * From Itens"). A query montada de tal forma que retorne os dados significativos de uma combinao entre
tabelas e campos para popular as caixas de resultado. Depois, os registros no banco de dados so examinados um a
um para verificar se todos os critrios so satisfeitos. Se sim, eles so adicionados as caixas de resultado.
O segundo parmetro, se verdadeiro, retornar um recordset altervel. Seno, como padro os recordset retornados
so estticos e no alterveis. A prpria aplicao chama a funo com verdadeiro ou falso. Quando estiver somente
recuperando dados, a aplicao ir chamar a funo ObterRecordset() com o valor FALSE. Entretanto, se o usurio
estiver alterando um item existente, a aplicao ir chamar a funo ObterRecordset() com um valor TRUE. Veja a
seo "Concluso" deste artigo para uma discusso de alguns dos tpicos de migrao relativos a este modelo.
Para mais informao sobre o banco de dados e seu esquema, veja o artigo, "Projetando um Banco de Dados
Simples de Venda a Varejo: Banco de Dados da Livraria Duwamish, Fase 1." Este artigo assume um conhecimento
rudimentar do esquema do banco de dados.

Procurando
Todos os elementos da categoria de procura so implementados como controles do tipo ActiveX (chamados
ProcurarItem). Eles so elementos contm a sua prpria interface de usurio (UI) projetados para encapsular os
parmetros de procura para um critrio especfico. A Tabela 1 lista e descreve as propriedades de ProcurarItem.
Tabela 1. Propriedades de ProcurarItem
MudarCheckTitulo
Muda o ttulo da categoria de procura (por exemplo, "Autor").
MudarCheck
Muda o estado da caixa de verificao para o controle.
ObterCheck
Retorna um valor Booleano significando se o controle estava selecionado.
MudarTexto
Muda o texto que mostrado na caixa de texto.
ObterTexto
Retorna o texto que mostrado na caixa de texto.
MudarHabilitado
Habilita e desabilita o controle para alterao pelo usurio.
Retorna o estado da caixa de verificao de Coincidir Maisc./Minsc. (somente
ObterCoincidir
para controles texto).
MudarOpcao1Texto
Muda o texto mostrado prximo a cada um dos trs botes de opo para um item
MudarOpcao2Texto
de procura do tipo boto de opo. Eles no tem efeito se chamados em um controle
MudarOpcao3Texto
de texto padro.
Retorna o nmero do boto de opo que est selecionado (de 13), e retorna 0 se o
ObterOpcao
controle no do tipo boto de opo.
Muda o tipo do controle de procura de 0, 1, ou 2 para, respectivamente, controles de
MudarTipoCtrl
somente-texto, duas-opes, ou trs-opes.
Cada controle inicializado com vrios valores, tais como nome, e um flag designando se o controle reflete um
simples item de procura tipo entrada de texto ou um item de procura do tipo opo de mltiplos botes (que
inicializado tambm com o texto para cada opo). O controle ir disparar um evento Click quando for dados um
clique na caixa de verificao e um evento KeyPress quando o usurio pressiona a tecla ENTER enquanto estiver
no campo texto. (Este evento permite que o usurio digite o texto de procura e simplesmente pressione a tecla
ENTER para iniciar uma procura.) O controle contem mtodos para recuperar os dados entrados pelo usurio antes
que a procura seja executada. Faz sentido colocar toda a lgica de interface de usurio (UI) em um controle
separado, porque fazendo assim a aplicao cliente s precisa se preocupar com a localizao e inicializao do
controle. O seguinte fragmento de cdigo ilustra a simplicidade obtida por este modelo:
' Muda a localizao do controle
MeuCtrl.Left = nLeft
MeuCtrl.Height = . . .
.

.
.
MeuCtrl.MudarTipoCtrl(2)
' 1 = 2 botoes de opo
' 2 = 3 botoes de opo

' 0 = sem botoes de opo

MeuCtrl.MudarCheckTitulo("Palavra-chave")
MeuCtrl.MudarOpcao1Texto("Procura Exata")
MeuCtrl.MudarOpcao2Texto("Qualque palavra")
MeuCtrl.MudarOpcao3Texto("Todas as palavras")
. . .
MeuCtrl.ObterCheck()
' Retorna o estado do check verdadeiro / falso
MeuCtrl.ObterOpcao()
' Retorna qual boto de opo esta selecionado (1-3)
MeuCtrl.ObterTexto()
' Retorna o texto digitado pelo usurio
Observao A aplicao cliente usando o formulrio de Procura tem a opo de passar alguns parmetros que iro
definir como o formulrio de Procura ir se comportar (veja Tabela 2). Primeiro, ir chamar
MudarAlteracao(Verdadeiro/Falso). Isto ir habilitar a permisso para criar e modificar os itens. Se este no
chamado, ou se chamado com um valor de falso, o usurio no ser capaz de criar itens, e o formulrio de Detalhe
do Item ir desabilitar todos os controles do tipo texto.
O segundo parmetro opcional MudarPedido(Verdadeiro/Falso). Se este mudado para Verdadeiro, o formulrio
de Detalhe do Item ir permitir ao usurio adicionar o item corrente ao seu "carrinho de compras." Ento, depois de
sair do formulrio, a aplicao cliente ir chamar ObterTotalPedido() e ObterPedido(int) para recuperar cada
nmero de item e quantidade pedida pelo usurio.
O parmetro opcional final MudarNumFornecedor(int). Se este chamado, o controle de procura para fornecedor
mudado para o nmero de fornecedor passado. O controle est desabilitado, e desta forma funciona como um
"filtro." Esta idia pode ser usada no futuro para incluir todos os controles de itens de procura, mas, no escopo deste
exemplo, o nico controle que necessitou desta funcionalidade foi o campo de fornecedor, porque usado pela
aplicao Solicitao de Pedido para colocar os pedido em um fornecedor selecionado.
Tabela 2. Propriedades do Formulrio de Procura
MudarAlteravel()
Permite que itens selecionados sejam modificados.
Permite que itens selecionados sejam adicionados ao "carrinho de compras."
MudarPedido()
Cada item do pedido pode ento ser recuperado pela ObterPedido(). Se este
mudado para Falso, o boto de Adicionar ao Pedido no aparece.
Retorna a quantidade de pedidos feitas enquanto o formulrio de Procura se
ObterTotalPedido()
encontrava aberto.
ObterPedido()
Retorna um detalhe especifico do pedido pelo valor do ndice.
Filtra a procura automaticamente pelo nmero do fornecedor. O usurio no
MudarNumFornecedor()
tem controle sobre os valores deste parmetro.

Mostrando os Detalhes do Item


Figura 2. Formulrio Detalhe do Item
O formulrio Detalhe do Item (Figura 2) mostrado tanto quando o usurio der um duplo clique em um dos itens da
lista de resultado da procura ou quando o usurio der um clique no boto Criar Novo (se estiver disponvel). O
formulrio Detalhe do Item responsvel por mostrar todos os dados importantes do item, e de providenciar a
capacidade de alterao se necessrio. O formulrio contem controles para mostrar os seguintes campos: Ttulo,
Tipo do Item, ISBN, Preo, Autor, Estoque, nvel de reordenao, Descrio, Data da Publicao, Arquivo Grfico
do Item, Editora, Fornecedor, e Palavras-Chaves. O cdigo a seguir chamado pelo evento de duplo clique da caixa
de resultado:
' O numero de cada Item guardado no tag.
ItemDetalhe.MudarItemNum (liItem.Tag)
' Mudando a quantidade para zero faz aparecer o boto "Adicionar ao Pedido".
' Mudando a quantidade para um valor diferente de zero muda a quantidade
padro.
If mbOrdenavel Then ItemDetalhe.MudarQuantidade (0)
ItemDetalhe.MudarPodeAlterar mbAlteravel
ItemDetalhe.Show vbModal
' Checa para ver se o item mudou; se sim, altera a lista.
If ItemDetalhe.ItemMudou = True Then
' Altera o item.
liItem.Text = ItemDetalhe.ObterTitulo
liItem.SubItens(1) = ItemDetalhe.ObterItemTipo
liItem.SubItens(2) = ItemDetalhe.ObterAutor
liItem.SubItens(3) = ItemDetalhe.ObterAno
liItem.SubItens(4) = ItemDetalhe.ObterPreco
liItem.SubItens(5) = ItemDetalhe.ObterEstoque
liItem.SubItens(6) = ItemDetalhe.ObterISBN
End If
' Checa por um pedido.
If ItemDetalhe.ObterQuantidade() > 0 Then
' Atualiza o objeto detalhe de ordenao.
Set cDetalhe = New cOrdemDetalhe
cDetalhe.NumItem = liItem.Tag
cDetalhe.Quantidade = ItemDetalhe.ObterQuantidade

cDetalhe.PrecoUnitario = ItemDetalhe.ObterPreco
' mcolOrdemDetalhes uma coleo de objetos detalhe de ordenao ' se ainda no existe, devemos cria-lo.
If mcolOrdemDetalhes Is Nothing Then
Set mcolOrdemDetalhes = New Collection
End If
' Adiciona esta nova ordem a coleo.
mcolOrdemDetalhes.Add cDetalhe
End If

Criando e Modificando Itens


O formulrio deve ter a capacidade de criar e modificar os tipos, autores, fornecedores, e editoras do item, e deve
fornecer controle para entradas duplicadas. No obrigatrio o preenchimento de todos estes campos para a criao
(ou modificao) de um registro. Para fazer com que a edio seja fcil, o boto Alterar (ou Criar) est
inicialmente desabilitado e um evento anexado a cada controle que pode ser alterado (com controles de edio, isto
feito pelos eventos Change). Nestes eventos, checamos se todos os campos obrigatrios foram preenchidos, e se
sim, habilitamos o boto Alterar. O cdigo a seguir ilustra este processo:
Private Sub ItemDesc_Change()
ChecaBotaoAlterar
End Sub
Private Sub ChecaBotaoAlterar()
If ItemTitulo <> vbNullString And ItemEstoque <> vbNullString And _
ItemReordenar <> vbNullString And ItemAno <> vbNullString And
ItemPreco <> vbNullString Then
If CLng(ItemEstoque) >= 0 And CLng(ItemReordenar) >= 0 And
CLng(ItemAno) >= 0 And CDbl(ItemPreco) >= 0# Then
BotaoAlterar.Enabled = True
Else
BotaoAlterar.Enabled = False
End If
Else
BotaoAlterar.Enabled = False
End If
O formulrio Detalhe do Item contem um flag, "mbEditavel", para controlar se modificaes podem ser feitas a este
item. Quando o usurio der um clique nos botes Editora ou Fornecedor, o formulrio Detalhe do Contato
acionado e inicializado com a chamada da funo ContatoDetalhe.MudarEditavel(mbEditavel). Desta forma as
permisses de alterao so passadas da aplicao cliente original para o formulrio de Procura, para o formulrio
Detalhe do Item, e finalmente para o formulrio Detalhe do Contato.

O Campo Palavra-Chave
Itens devem Ter palavras-chaves associadas, cujo comprimento combinado no deve exceder 255 caracteres (pois
estamos usando um campo tipo Texto no Microsoft Access). Queremos fornecer ao usurio a habilidade de
facilmente adicionar e remover palavras-chaves a um item, e de forma ideal, fazer com que seja to fcil quanto
possvel adicionar as mesmas palavras-chaves a mltiplos itens. Para satisfazer isto, um combo box Palavra-Chave
fornecido junto com os botes Adicionar e Remover. Os usurios podem digitar uma nica palavra-chave e dar
um clique em Adicionar para adicionar a palavra-chave ao combo box ( feita checagem para palavras-chaves
duplicadas e para o mximo de caracteres). Os usurios podem tambm selecionar uma palavra-chave existente do
combo box e dar um clique em Remover para remove-la. Para fazer com que a adio das mesmas palavras-chaves
a mltiplos itens seja mais fcil, e em vez de Ter que adicionar cada palavra-chave individualmente e pressionar o
boto Adicionar cada vez, possvel aos usurios entrar uma string completa de palavras-chaves, que uma lista de
palavras-chaves separadas por vrgula (por exemplo, "Fico, Mistrio, Crime"). A aplicao percorre por cada

palavra-chave uma por vez, checando por palavras-chaves duplicadas e checando o comprimento total de cada
palavra-chave. Se tudo estiver de acordo ela ento adiciona a palavra-chave, retirando as vrgulas e cada espao
antes ou depois da palavra.

O Formulrio Detalhe do Contato


O formulrio Detalhe do Contato bem simples e direto. Ele inicializado com um valor Booleano a partir do
cliente (o formulrio Detalhe do Item) que especifica se os dados so alterveis, tambm como um NumContato que
especifica aonde os dados devem ser encontrados na tabela de Contatos. Ele ento mostra os campos dos dados mais
importantes do contato na janela de dilogo. De novo, todos os evento EditControl_Click so controlados e todos as
validades dos dados so checados e para Ter certeza de que todos os campos obrigatrios contem dados. Se todos os
campos obrigatrios contem dados, o boto Alterar habilitado. Da mesma forma, se qualquer um dos campos
obrigatrios estiver sem dados, o boto Alterar desabilitado. Para a criao de novas editoras ou fornecedores, o
boto Alterar contem a legenda "Criar" e nenhum cdigo passado, e portanto nenhum dado mostrado no incio.
Figura 3. Formulrio Detalhe do Contato

Concluso
Esta aplicao apresenta as funcionalidade de interface e encapsulamento para procura e catalogar processos em

uma livraria simples. Iremos evoluir este modelo de um sistema simples envolvendo cooperao entre aplicaes
separadas (cooperando no sentido de compartilhar um banco de dados e alguns formulrios) para eventualmente um
sistema completamente distribudo e escalonvel. Iremos fazer isto gradualmente por um processo de extrair partes
da API (notadamente o acesso a dados e uma parte da camada de fluxo de trabalho) que so facilmente
compartilhadas entre as interfaces separadas, melhorando-as conforme avanamos.
Por exemplo, o modelo de dados atual, onde recordsets alterveis so abertos, passados, e mantidos abertos pelo
cliente at que o cliente faa uma chamada a Recordset.Update, ir se tornar problemtico quando a Livraria
Duwamish se expandir para mais de uma loja. Ao invs disso, podemos manter os recordsets retornados
desconectados do banco de dados, e simplesmente atualizar o recordset chamando outra funo, algo como
AtulizarRecordset. Esta funo ir ento atualizar o recordset no banco de dados, permitindo que tudo esteja
desconectado e que outro usurio do sistema no seja travado por um registro de um recordset altervel que outro
usurio recupera e que falha em fech-lo.
Na Fase 2, iremos implementar um objeto COM de acesso a dados, e recordsets desconectados, para serem usados
em vrias lojas da Livraria Duwamish. Este primeiro passo para o escalonamento permite que dois escritrios
separados usando as mesmas aplicaes da Livraria Duwamish compartilhem uma nica API de acesso a dados e
no tem que se preocupar em sincronizar bancos de dados separados.

Projetando um Banco de Dados Simples de


Venda a Varejo
Banco de Dados da Livraria Duwamish, Fase 1
Sumrio: Detalha o esquema do banco de dados da Livraria Duwamish. (10 pginas impressas) Conhecimentos em
Microsoft Access e projeto genrico em banco de dados relacional ser til. Inclui:
Discusso de modelagem de transaes do negcio para o projeto do banco de dados

Especificaes da entidade banco de dados da Livraria Duwamish

Modelo do banco de dados da Livraria Duwamish (como um grfico)

Introduo
Este artigo descreve o banco de dados usado na Fase 1 da aplicao exemplo da Livraria Duwamish. Para uma
introduo e uma descrio das quatro fases do exemplo da Livraria Duwamish, veja "Uma Introduo ao Exemplo
da Livraria Duwamish."
Da mesma forma que as aplicaes da Fase 1, o projeto do banco de dados enfatiza a praticidade ao invs da pureza
tcnica. O projeto captura as entidades e processos do negcio da livraria mas deixa alguns tpicos do
escalonamento para serem referenciados nas fases subsequentes.
Neste projeto, tabelas relacionadas fornecem tamanhos eficientes para alguns dados, mas a importncia de ter um
projeto normalizado, onde cada entidade contem dados que so nicos, secundrio para a simplicidade do projeto
como um todo. O modelo ser revisado nas fases subsequentes do exemplo para suportar o crescimento do negcio
para mais de um lugar e mais de uma atividade.
O banco de dados Microsoft Access 98 .mdb fornece um repositrio de dados escalonvel apropriado para as
aplicaes de desktop que esto compreendidas nesta fase do exemplo. O modelo de dados completo, com as
definies das tabelas, especificaes de integridade referencial, e um conjunto da dados de exemplo, est incluso no
duwamish.mdb.

Um Modelo do Negcio
As sentenas das transaes do negcio a ser modelado fornece um ponto de partida para o modelo de dados. Os
substantivos nestas sentenas podem ser imaginados como dados e os verbos como os processos que operam os
dados. Os substantivos so desenvolvidos em entidades de dados com atributos que descrevem as entidades e os
relacionamentos entre entidades. Este conjunto de sentenas representa os processos primrios do negcio da livraria
com os enfatizados substantivos e verbos formando o modelo de dados bsico. As palavras usadas como
SUBSTANTIVOs esto em maisculas e aquelas usadas como VERBOs esto em itlico.
Muitas palavras nestas sentenas podem ser usadas como substantivos ou verbos. Por exemplo, PROCURAR usado
como um verbo porque nenhum registro de uma procura gravado. PEDIDO, por outro lado, usado como um
substantivo porque um pedido salvo como uma entidade de dados.
CLIENTE ou FUNCIONARIO PROCURA por ITENs
Um ITEM geralmente descreve um ttulo de livro que est disponvel na loja, mas tambm pode representar um tipo
de mercadoria relacionada. Cada tipo de mercadoria levada modelada por um ITEM.
FUNCIONARIO COLOCA PEDIDO de ITENs com FORNECEDOR
O PEDIDO de compra para um nico FORNECEDOR e contem um ou mais DETALHEs_PEDIODO. Um
DETALHE_PEDIDO contem um ITEM e uma quantidade.
FUNCIONARIO RECEBE PEDIDO de ITENs de um FORNECEDOR
O modelo de dados representa o fluxo de mercadoria pela loja para fornecer um histrico rico da fonte de dados para
anlise. Embora um simples atributo de quantidade possa ser adicionado a cada ITEM, isto no demonstra o
comportamento do estoque ao longo do tempo. Recebendo um PEDIDO muda o status do PEDIDO e gera uma ou
mais TRANSACAO_ESTOQUE. Uma TRANSACAO_ESTOQUE contem um ITEM e uma quantidade e, no caso
do recebimento, a correspondente DETALHE_PEDIDO.

CLIENTE COLOCA PEDIDO de ITENs com LOJA


O PEDIDO de venda contem um ou mais DETALHE_PEDIDO. Um PEDIDO de venda usado para pedidos de
ITENs especiais ou quando a mercadoria para ser entregue.
CLIENTE ADQUIRE ITENs na caixa registradora
Isto gera uma VENDA e geralmente gera uma TRANSACAO_ESTOQUE para os ITENs que o CLIENTE leva
embora.
LOJA ENTREGA ITENs de PEDIDO ao CLIENTE
Isto gera uma VENDA e DETALHEs da VENDA ou preenche uma VENDA gerada previamente. Tambm gera
TRANSACOES de ESTOQUE para os ITENs entregues.
Na seo a seguir, os substantivos so desenvolvidos em dados. Os verbos saem do modelo de dados para
transformarem-se em especificaes para o cdigo dentro das aplicaes que atuam no modelo de dados.
Especificaes de campos incluem tipo de dado e tambm especifica as regras de ndice e o relacionamento entre
entidades.

Entidades de Dados e Tabelas (em Grupos Funcionais)


Grupo Item
O grupo Item consiste da entidade Item e das entidades relacionadas que completam a descrio do item. Uma
entidade item existe para cada item levado da loja, e procuras so realizadas na tabela Itens.
Entidade Item
Atributos e
Nome do campo
Tipo do dado
relacionamentos do
Descrio
campo
Codigo
AutoNumerao
Chave Primria
Chave estrangeira para a
NumTipoItem
Longo
tabela TipoItem (referencia Tipo Item (todos os itens)
obrigatria)
Chave estrangeira para
NumAutor
Longo
autor na tabela Autores
Autor do livro (livros)
(opcional)
Chave estrangeira para
NumEditora
Longo
editora na tabela Contatos Editora do livro (livros)
(opcional)
Chave estrangeira para
fornecedor na tabela
Fornecedor do Item (todos
NumFornecedor
Longo
Contatos (Referencia
os itens)
obrigatria)
Chave estrangeira para a
NumImposto
Longo
tabela Imposto (Referencia Imposto do item
obrigatria)
Quantidade do item em
EmEstoque
Inteiro
estoque
Nvel do estoque para
NivelPedido
Inteiro
ativar o pedido
DataPublicao
Inteiro
Ano da publicao (livros)
ISBN (livros). Nmero do
modelo ou nmero do
ISBN
Texto(50)
estoque do fornecedor
(no-livros)
Especificao do arquivo
EspecArquivoImagem
Texto(255)
de imagem
Ttulo
Texto(50)
Ttulo do livro (livros)
Descrio
Texto(255)
Descrio do item (por

PrecoUnitario

Moeda

PalavrasChaves

Texto(255)

exemplo, fico ou nofico)


(veja comentrios da
normalizao)
Preo do item
Conjunto de palavraschaves (veja comentrios
da normalizao)

Entidade Tipo do Item


Nome do campo

Tipo do dado

Codigo
Tipo
Descrio

AutoNumerao
Texto(12)
Texto(50)

EhLivro

Sim/No

Atributos e
relacionamentos do
campo
Chave Primria

Descrio

Codigo do tipo
Descrio
Sim indica que o tipo do
item um livro

Entidade Autor
Nome do campo
Codigo
Sobrenome
Nome
Entidade Imposto

Tipo do dado
AutoNumerao
Texto(50)
Texto(50)

Nome do campo

Tipo do dado

Codigo
Descricao
Imposto

AutoNumerao
Texto(50)
Numero

Atributos e
relacionamentos do
campo
Chave Primria

Atributos e
relacionamentos do
campo
Chave Primria

Descrio
Identifica um nico autor
Sobrenome do autor
Nome do autor

Descrio

Descrio
Imposto

Grupo Pedidos
Pedidos representam uma inteno de comprar ou vender. Um funcionrio coloca um pedido de compra para um
fornecedor. Clientes colocam pedidos de vendas. Um pedido consiste de uma nica entidade pedido e de no mnimo
uma entidade detalhe do pedido.
Entidade Pedido
Atributos e
Nome do campo
Tipo do dado
relacionamentos do
Descrio
campo
Codigo
AutoNumerao
Chave Primria
Referencia o cliente do
Refere-se a um cliente na
NumCliente
Inteiro Longo
pedido (para pedidos de
tabela de Clientes
venda)
Chave estrangeira para a
Referencia ao funcionrio
NumFuncionario
Inteiro Longo
tabela Funcionrios
do pedido (para pedidos de
(Referencia obrigatria)
compra)
Chave estrangeira para
Referencia ao fornecedor
NumFornecedor
Inteiro Longo
fornecedor na tabela de
do pedido (para pedidos de
Contatos (opcional)
compra)
Data em que o pedido
DataPedido
Data/Hora
solicitado

DataRetirada

Data/Hora

Status

Texto

SubTotal

Moeda

Entrega
Imposto
Total

Moeda
Moeda
Moeda

EhVenda

Sim/No

EntregaNome

Texto(50)

EntregaEndereco1

Texto(50)

EntregaEndereco2

Texto(50)

EntregaCidade

Texto(50)

EntregaEstado

Texto(2)

EntregaCEP

Texto(10)

EntregaTelefone

Texto(50)

Data em que o pedido foi


retirado
Espao para observao
das opes do status. Os
seguintes valores so
definidos pelo sistema:
'SOLICITADO', (P/S)
'PEDIDO', (P)
'PRONTO', (S)
'RECEBIDO', (P)
'ENTREGUE', (S)
'IRACHAMER', (S)
'COMPLETADO', (P/S)
(veja comentrios da
normalizao)
Valor dos detalhes do
pedido
Valor da Entrega
Valor do Imposto
Valor total do pedido
Sim indica que o pedido
um pedido de venda; No
indica que o pedido um
pedido de compra.
Nome da etiqueta de
endereo
Linha 1 da etiqueta de
endereo
Linha 2 da etiqueta de
endereo
Cidade da etiqueta de
endereo
Estado da etiqueta de
endereo
CEP da etiqueta de
endereo
Nmero de Telefone para
entrega

Entidade DetalhePedido
Nome do campo

Tipo do dado

Codigo

AutoNumerao

NumPedido

Inteiro Longo

NumItem

Inteiro Longo

PrecoUnitario

Moeda

Quantidade

Inteiro Longo

Atributos e
relacionamentos do
campo
Chave Primria
Chave estrangeira para a
tabela de Pedidos
(Referencia obrigatria)
Chave estrangeira para a
tabela Itens (Referencia
obrigatria)

Descrio

Referencia um pedido

Referencia um item
Preo para cada unidade
Quantidade de unidades
pedidas

Grupo Vendas
Uma venda representa uma transferencia de itens para um cliente. Uma venda consiste de uma entidade venda e de
no mnimo uma entidade detalhe venda.
Entidade Venda
Atributos e
Nome do campo
Tipo do dado
relacionamentos do
Descrio
campo
Codigo
AutoNumerao
Chave Primria
Chave estrangeira para a
Referencia ao cliente da
NumCliente
Inteiro Longo
tabela Clientes (Referencia
venda
obrigatria)
Chave estrangeira para a
NumPedido
Inteiro Longo
Referencia ao pedido
tabela Pedidos (opcional)
Chave estrangeira para a
NumFuncionario
Inteiro Longo
tabela Funcionrios
Referencia ao funcionrio
(Referencia obrigatria)
DataVenda
Data/Hora
Data/hora da venda
SubTotal
Moeda
Subtotal do item da venda
Imposto sobre o item da
Imposto
Moeda
venda
Tipo de pagamento (por
TipoPagamento
Texto(50)
exemplo, dinheiro, cheque,
ou carto de crdito)
Nmero do carto de
NumCartaoCredito
Texto(50)
crdito
Data de validade no carto
DataValidade
Data/Hora
de crdito
NomeCartaoCredito
Texto(50)
Nome no carto de crdito
Sim indica que o pedido
Entrega
Sim/No
ser entregue
Entidade DetalheVenda
Atributos e
Nome do campo
Tipo do dado
relacionamentos do
Descrio
campo
Codigo
AutoNumerao
Chave Primria
Chave estrangeira para a
NumVenda
Inteiro Longo
tabela Vendas (Referencia Referencia venda
obrigatria)
Chave estrangeira para a
NumItem
Inteiro Longo
tabela Itens (Referencia
Referencia ao item
obrigatria)
PrecoUnitario
Moeda
Preo de cada unidade
Quantidade de unidades
Quantidade
Inteiro Longo
pedidas

Grupo Acompanhamento do Estoque


O grupo de acompanhamento do estoque consiste da entidade AcompanhaEstoque. Transaes do acompanhamento
do estoque so includas sempre que o estoque de uma loja muda. As causas de mudanas no estoque so: recebendo
itens de um fornecedor, vendendo itens para um cliente, ou transaes de vendas administrativas para contabilizar
itens removidos por danos ou roubo.
Entidade Acompanhamento de Estoque
Nome do campo
Tipo do dado
Atributos e
Descrio

Codigo

AutoNumerao

NumItem

Inteiro Longo

NumTransacao

Inteiro Longo

EhVenda

Sim/No

Quantidade

Inteiro Longo

DataTransacao

Data/Hora

Observao

Texto(255)

relacionamentos do
campo
Chave Primria
Chave estrangeira para a
tabela Itens (Referencia
obrigatria)
Refere-se a um
detalhepedido na tabela
DetalhesPedido ou
DetalheVenda na tabela
DetalhesVenda

Identifica o tipo do item


Referencia ao detalhe do
pedido ou detalhe da venda
que gera a transao de
estoque
Sim se gerado por uma
venda; No se gerado por
um pedido (determina a
tabela de referncia do
NumTransacao).
Mudana do estoque.
Valores positivos indicam
recebimento; negativos
entrega ou venda.
Data da transao
Observacao da transao
(veja comentrios da
normalizao)

Grupo Atores
O grupo Atores contem entidades que representam pessoas ou organizaes. A entidade contato pode representar
mltiplos tipos de atores, tais como editores ou fornecedores.
Entidade Contato
Atributos e
Nome do campo
Tipo do dado
relacionamentos do
Descrio
campo
Codigo
AutoNumerao
Chave Primria
Tipo do contato. O sistema
define os seguintes
valores:
TipoContato
Texto(12)
'FORNECEDOR',
'EDITOR'
(veja comentrios da
normalizao)
Sobrenome ou nome da
Sobrenome
Texto(50)
Empresa
Nome
Texto(50)
Nome
Endereco1
Texto(50)
Linha 1 de Endereo
Endereco2
Texto(50)
Linha 2 de Endereo
Cidade
Texto(50)
Cidade
Estado
Texto(2)
Estado
CEP
Texto(10)
CEP
PessoaContato
Texto(50)
Pessoa para contato
Telefone
Texto(50)
Telefone para contato
UltimoContato
Data/Hora
Data do ltimo contato
Entidade Cliente

Nome do campo

Tipo do dado

Codigo
Fantasia
Sobrenome
Nome
Endereco1
Endereco2
Cidade
Estado
CEP
Telefone
UltimaVenda

AutoNumerao
Texto(50)
Texto(50)
Texto(50)
Texto(50)
Texto(50)
Texto(50)
Texto(2)
Texto(10)
Texto(50)
Data/Hora

TotalVendaYTD

Moeda

Atributos e
relacionamentos do
campo
Chave Primria

Descrio

Identificador rpido
Sobrenome do cliente
Nome do cliente
Linha 1 de Endereo
Linha 2 de Endereo
Cidade
Estado
CEP
Telefone do cliente
Data da ltima venda
Compra total do cliente at
a data

Entidade Funcionario
Nome do campo

Tipo do dado

Codigo
Fantasia
Sobrenome
Nome
Iniciais
Endereco1
Endereco2
Cidade
Estado
CEP

AutoNumerao
Texto(50)
Texto(50)
Texto(50)
Texto(1)
Texto(50)
Texto(50)
Texto(50)
Texto(2)
Texto(10)

TelefoneResidencial

Texto(50)

TelefoneCelular

Texto(50)

ContatoEmergencia

Texto(50)

TelefoneEmergencia

Texto(50)

DataAdmissao

Data/Hora

Senha

Texto(50)

Atributos e
relacionamentos do
campo
Chave Primria
nico

Descrio

Identifica o usurio
Sobrenome
Nome
Iniciais
Linha 1 de Endereo
Linha 2 de Endereo
Cidade
Estado
CEP
Telefone residencial do
funcionrio
Telefone do celular do
funcionrio
Nome de pessoa para
contato em caso de
emergncia
Telefone para emergncia
Data em que o funcionrio
foi contratado
Senha do funcionrio

Relacionamentos das Entidades


O modelo de banco de dados relacional fornece armazenamento eficiente, simplifica a manuteno dos dados e
permite detalhes de cabealhos de estruturas do tipo aberto-fechado. As entidades Item tem relacionamentos com
outros tipos de entidades, incluindo referencia a uma entidade TipoItem (requerida), entidade Autor (opcional),
entidade Contato (para editores e fornecedores), e entidade Imposto (requerida). A integridade referencial assegura
que os relacionamentos entre entidades permaneam vlidas conforme os dados mudam. Se as entidades Item
contem referencia a uma entidade TipoItem e um registro de TipoItem excludo, os itens que mantm referencia
aos itens excludos da TipoItem iro violar a integridade do relacionamento referenciando um registro excludo. O
formato do banco de dados .mdb mantm as regras de integridade referencial e os relacionamentos so garantidos

pelo Microsoft Access, e pelas tecnologias de acesso a dados da Microsoft tais como a Microsoft ActiveX Data
Objects (ADO). A Figura 1 mostra os relacionamentos das entidades dentro do modelo de dados.

Figura 1. Relacionamentos das Entidades

Concluso
O modelo de banco de dados apresentado aqui enfatiza a simplicidade em detrimento de uma normalizao
completa ou de uma otimizao. As entidades de dados modelam os processos do negcio da livraria de uma
maneira direta que simplifica a programao da aplicao mas deixa alguns tpicos de escalonamento para serem
resolvidos nas prximas fases. As prximas trs fases do projeto iro apresentar refinamentos a este projeto de tal
forma que ele poder escalar de uma aplicao desktop suportando alguns usurios para suportar um sistema de alto
volume baseado na Web.

Livraria Duwamish, Setup da Fase 2 e


Cdigo Fonte
Execute o pacote do setup para instalar a aplicao exemplo da Livraria Duwamish em seu computador. Na pasta de
grupo de programa Exemplo do MSDN Livraria Duwamish, Fase 2, clique na opo Duwamish Launcher.
Clique com o boto da esquerda no item Launcher para iniciar a aplicao ou clique com o boto da direita para ver
o Guia do Usurio ou as consideraes de projeto para a aplicao.
Nota No aplicativo Launcher, clique com o boto da direita em Log On e selecione User Guide para ver a lista de
nomes e senhas de usurios que j vem com o exemplo.
A Livraria Duwamish uma aplicao exemplo da MSDN no suportada. Por favor, lembre-se de que s um
exemploo suporte tcnico da Microsoft no est preparado para responder a questes sobre a Livraria Duwamish.
Clique aqui para copias o pacote exemplo de instalao e o cdigo fonte para a Fase 2 da Livraria Duwamish.
d2setup.exe: Este executvel auto-extravel ir instalar a aplicao exemplo da Livraria Duwamish.
d2source.exe: Este executvel auto-extravel ir montar a rvore de cdigo fonte do exemplo da Livraria Duwamish
em seu computador. O cdigo compilado usa o Microsoft Visual Basic verso 5.0 do novo componente de acesso a
dados, DBDAL (dbvbdal.dll). Este download tambm contem o cdigo fonte para o componente na verso do
Microsoft Visual C++ (dbvcdal.dll).
Nota Para compilar o cdigo fonte da Fase 2, voc ir precisar do Visual Basic 5.0 Professional ou a Enterprise
Edition e, opcionalmente para o componente do Visual C++, o Visual C++ Professional ou Enterprise Edition.

Projetando uma Camada de Acesso a Dados


Livraria Duwamish, Fase 2
Sumrio: Discute custos, benefcios, e tpicos de projeto na criao de uma camada de acesso a dados. (8 pginas
impressas) Discute:
Mtodos de solicitar dados de uma fonte de dados

Mtodos de recuperar dados solicitados

Escolhendo entre recordsets conectados e desconectados

Escolhendo entre recordsets transacionais e no transacionais

Escolhendo entre conexes com cache e conexes sem cache

Introduo
Uma aplicao bem desenvolvida, no importando se grande ou pequena, deve ser escrita tendo em mente a
manuteno. Uma das melhores abordagens para uma aplicao de fcil manuteno utilizar um paradigma em
camada quando estivermos projetando a aplicao. Este enfoque dita que a aplicao deve ser projetada em pelo
menos trs camadas: uma camada de apresentao, uma camada da lgica do negcio, e uma camada de acesso a
dados (DAL). Estas camadas podem ser codificadas dentro da prpria aplicao, ou podem ser componentes
separados da aplicao. Para os programadores do Microsoft Visual Basic, escrevendo uma camada dentro da
aplicao envolve escrever a camada em seu prprio mdulo. Para programadores do Microsoft Visual C++,
significa escrever uma camada na sua prpria classe. Esta separao permite uma manuteno mais fcil do cdigo
bsico e tambm permite que quando o tempo de mudar para um componente chegar, o esforo requerido ser bem
menor. Separando a funcionalidade em um componente tambm deixa o cdigo muito mais fcil de debugar,
estender e reutilizar.
Este artigo examina alguns dos tpicos de projeto envolvidos no desenvolvimento de uma DAL, incluindo tpicos
adicionais quando desenvolvendo a camada como um componente COM separado, com referncia especfica ao
exemplo do MSDN da Livraria Duwamish.
Na Fase 1 do exemplo da Livraria Duwamish, o DAL um mdulo, mas as Fases 2 a 4 usam um componente COM.
Para maiores detalhes nas fases da Livraria Duwamish veja "Uma Introduo ao Exemplo da Livraria Duwamish."

Custos
Alm da fcil manuteno e da reutilizao do cdigo, existem diferentes benefcios em criar uma camada de acesso
a dados. Como em todo enfoque, estes benefcios vem com seus respectivos custos.

Mais Planejamento no Projeto


Uma DAL uma grande idia, mas envolve mais trabalho de projeto. Quando o cdigo incorporado na aplicao,
o acesso a dados pode ser escrito "na velocidade," conforme for necessrio, sem muito que pensar. Entretanto,
quando o acesso a dados movido para sua prpria camada, decises de projeto devem ser feitas antes que o cdigo
seja implementado afim de que a DAL cubra todos os requisitos de acesso a dados da aplicao ou sistema em
questo. Isto mais crtico ainda se a DAL se tornar um objeto COM genrico que usado por mais de uma
aplicao. Esta premeditao pode ser considerada como uma desvantagem para aqueles que pensam que o temo
RAD significa Rapid Application Design (Projeto Rpido de Aplicaes), quando de fato significa Rapid
Application Development (Desenvolvimento Rpido de Aplicaes). Tentar usar um RAD no projeto geralmente
significa que o termo ser Rapid Application Disaster (Desastre Rpido de Aplicaes).
Um aumento no tempo de projeto requerido quando da criao de um componente de acesso a dados (tal como o
DBDAL da Livraria Duwamish). Um esforo deve ser feito para garantir que a camada de acesso a dados abranja
todas as reas de funcionalidade requerida pela aplicao chamadora. Ir derrubar o propsito de um componente de
acesso a dados se abranger somente 75 porcento das especificaes de acesso a dados e forar o desenvolvedor a ter

que codificar funcionalidades de acesso a dados especficas em um a rotina ou na aplicao. De novo, isto requer um
projeto alm do tempo, mas a vantagem desta extensa funcionalidade supera a desvantagem de Ter que escrever
cdigo especfico para cada rotina.

A Nova API
Uma vez que a DAL tenha sido projetada com uma funcionalidade genrica em mente, devemos codificar as novas
assinaturas API/mtodo. Isto requer alguma premeditao, como quais so os melhores parmetros a serem
passados, quais pedidos fazem maior sentido, e assim por diante.

As Caractersticas Internas Escondidas


Se criamos nossa DAL como um componente, outros desenvolvedores no sero capazes de ver os detalhes
sangrentos dos mecanismos nativos de acesso a dados da DAL. Por outro lado, isto fornece maior segurana. Veja
as sees relacionadas a seguir no item "Benefcios."

Benefcios
Livraria Duwamish
Vamos olhar os benefcios (os quais justificam os custos) de uma camada de acesso a dados. Quando a Livraria
Duwamish alcana a Fase 2, aonde transformamos a DAL em componentes, o cdigo no somente fica menor, mas
tambm fica mais fcil de debugar porque debugando a DAL j foi feito uma vez. Esta separao do acesso a dados
da aplicao tambm nos deu mais flexibilidade na distribuio da aplicao.

Aumento na Facilidade de Manuteno


Uma das maiores vantagens de usar uma camada de acesso a dados o aumento na facilidade de manuteno.
Muitos programas tem cdigo escrito em vrios lugares, ou pior, emaranhado pela aplicao. Separando a DAL da
aplicao faz com que fique muito mais fcil de manter.
Criando um componente de acesso a dados fornece mais benefcios. Separando a DAL da aplicao no somente
cria cdigo mais fcil de manter mas tambm muito mais extensvel e reutilizvel. Se e quando o cdigo de acesso a
dados mudar, esta separao alivia a dor de cabea de Ter que recompilar e testar cada aplicao que o usa. O nico
cdigo que precisa ser testado completamente o prprio componente de acesso a dados.

Diminuio no Tamanho Total do Cdigo


Um componente de acesso a dados separado tambm resulta em reduo do tamanho do cdigo para cada aplicao
dependente. Se o cdigo DAL embutido em cada aplicao, cada aplicao carrega cdigo redundante. Uma vez
que o cdigo de acesso a dados tirado da aplicao, a aplicao encolhe e portanto permite um ambiente para uma
melhor distribuio pois diminui a largura da banda de distribuio.

Minimiza o Nmero de APIs


Usando uma DAL, reduzimos o nmero de (APIs) que o desenvolvedor tem que aprender. Eles tero apenas que
aprender um conjunto de API que relevante para a aplicao ou grupo de aplicaes. O desenvolvedor pode focar o
seu tempo em desenvolver uma aplicao ao invs de Ter que aprender um nmero de APIs.

Aumento na Segurana
Uma das vantagens de usar um componente de acesso a dados que ele esconde a implementao dos dados dos
desenvolvedores e/ou usurios finais. No existe acesso direto aos dados. Assumindo que a DAL foi projetada
corretamente, a manipulao dos dados est limitada aos modos que so controlados pela aplicao.
Freqentemente o proprietrio dos dados no quer que outros vejam os detalhes da estrutura de dados, organizao,
etc. Usando um componente de acesso a dados, no somente as estruturas de dados esto escondidas, mas tambm
as tcnicas de acesso. Escondendo estas caracterstica internas, os dados e cdigo esto protegidos.

Fazendo Seu Pedido


Existem muitas maneiras de requisitar dados de uma fonte de dados, tais como extrao por programao,
ferramentas de terceiros, requisies dinmicas, e stored procedures externas. Cada mtodo tem o seu lugar e seus

defensores. Aps uma breve descrio dos sois primeiros, gostaramos de enfocar os dois ltimos: requisies
dinmicas atravs de comandos SQL e procedimentos externos atravs de SQL stored procedures.

Extrao por Programao


Extrao por programao permite a cada programa usar seus prprios mtodos para extrair os dados. Isto tende a
ser usado com estruturas de dados proprietrias. Esta em geral a proposta mais cara em termos de recursos, mas
em alguns casos pode ser a mais eficiente porque o proprietrio dos dados conhece a estrutura dos dados.

Ferramentas de Terceiros
Este de longe o mtodo mais popular usado hoje em dia. Ao invs de cada desenvolvedor escrever as suas prprias
rotinas de extrao de dados, vendedores escreveram tais ferramentas como Open Database Connectivity (ODBC ),
DBLib, OLE DB, e ActiveX Data Objects (ADO).
Estes tipos de ferramentas fornece ao desenvolvedor tcnicas de acesso a dados que so otimizadas para as fontes de
dados ou, no caso do ODBC, fornece uma estratgia genrica de acesso a dados. Mesmo que estas ferramentas
forneam excelente acesso aos dados, elas restringem o desenvolvedor a um certo paradigma de acesso.
Empacotando uma DAL com estas ferramentas, o desenvolvedor pode aprender um conjunto fixo de API e no se
preocupar quando a estratgia muda ou substituda.

Requisies Dinmicas
Por requisies dinmicas, no queremos dizer o tipo da requisio que um usurio final pode digitar, mas sim uma
que gerada por programao. A requisio pode ser gerada como o resultado da lgica de programao ou pode ser
selecionada de uma lista de requisies predeterminadas. De qualquer forma, a natureza exata da requisio no
conhecida de antemo e gerada ou criada em tempo de execuo.
Uma das melhores linguagens para este tipo de requisio a Structured Query Language (SQL). Com a sua rica
sintaxe de linguagem e seu dialeto quase universal, o SQL primeiro candidato para gerar requisies dinmicas em
um DAL. Tambm, a maioria das ferramentas e bibliotecas de terceiros funcionam bem com o SQL.
Entretanto, uma requisio dinmica no o modo mais eficiente ou o mtodo mais seguro de requisio de dados.
O problema de segurana pode ser observado quando precisamos enviar a seguinte instruo SQL:
UPDATE Contas
SET Balano = Balano + 100.00
WHERE Conta = 12345678;
Esta instruo muito fcil de entender, mas uma quebra de segurana pode ocorrer quando temos que fornecer
informao sigilosa, tal como um nmero de conta, pela rede. Tambm, toda a instruo tem mais do que 60
caracteres de comprimentoqualquer caracter corrompido pode causar um erro at fazer com que a instruo
aponte para outra conta.
Estes tipos de requisies podem afetar o desempenho, porque no somente mais informao est sendo enviado
pela rede, mas tambm, no caso de muitos SQL, deve ser validado e compilado cada vez que o dispositivo recebe a
instruo. Se nossa aplicao ou sistema ir enviar grandes quantidades destes tipos de queries, o grande nmero de
ciclos validaes/compilaes ir degradar o acesso de qualquer um que precise acessar os dados.

Stored Procedures
Um mtodo melhor que usar instrues SQL dinmicas predeterminar quais instrues SQL precisam ser
executadas e guarda-las no mecanismo de execuo de SQL. Isto permite que o mecanismo de execuo das SQL
pre-validar e pre-compilar as instrues. Tudo o que precisamos fazer para execut-las passar os argumentos
apropriados. Neste caso, o cdigo para atualizar o balano de uma conta pode ser escrito como segue:
EXECUTE spAdicionaBalanco 12345678, 100.00
Embora a stored procedure spAdicionaBalanco diz o que a procedure faz, poderia ser escrito simplesmente como:
EXECUTE spB123 12345678, 100.00
O nome da stored procedure no importa se o desenvolvedor sabe o que ela faz. Com as stored procedures menos
parmetros precisam ser passados, as instrues SQL so pre-validadas e pre-compiladas, e a quantidade de dados
enviado pela rede menor.

Reflexo
Os tpicos levantados pelas discusses acima sobre requisies dinmicas e stored procedures sero minimizados se
a DAL estiver sendo executada na mesmo equipamento ou no mesmo lado que o mecanismo de execuo da SQL, e

se toda a comunicao com a DAL for atravs de algum outro componente. Isto far com que somente a DAL possa
criar ou gerar requisies dinmicas ou usar stored procedures e, portanto, aliviar os tpicos de segurana e
transmisso.

Livraria Duwamish
Como a Livraria Duwamish tanto um cenrio de migrao como um exemplo, usamos o mtodo de SQL
dinmicas nas fases iniciais e migramos para o uso de stored procedures nas fases posteriores. A transio entre usar
SQL dinmicas para stored procedure coincide com a mudana entre o Microsoft Access para o Microsoft SQL
Server. Como tal, as instrues SQL usadas nas ltimas fases da Livraria Duwamish so otimizadas para o SQL
Server. Existem duas grandes razes porque a Livraria Duwamish faz a transio do Access para o SQL Server:
primeira, o Access no tem a capacidade de usar stored procedures e, segunda, o Access no projetado para
gerenciar milhares de usurios simultaneamente.

Escolhendo o Seu Pedido


Existem vrias formas diferentes de recuperar dados solicitados, tais como arquivos, vetores, colees, e objetos
Recordset do ADO.

Arquivos
Usar um arquivo para recuperar informao de algum outro lugar pode parecer redundante, porque os dados
originais provavelmente j esto em um arquivo. Porm, este mecanismo til se precisarmos de somente uma parte
do arquivo, ou se precisamos que os dados recuperados continuem a existir mesmo aps o computador ser desligado.
Na maioria das vezes, porm, necessitaremos que os dados estejam prontos para o acesso de uma forma mais rpida.
Aqui aonde os seguintes mecanismos se aplicam pois eles utilizam da memria para manter os dados.

Vetores
Usar um vetor para manter e transferir dados provavelmente um dos recursos mais eficientes quando para desviar
as pegadas da memria. Os dados so agrupados em um pacote de entidade e pode ser transmitido como um grande
bloco de memria, ou um grande objeto binrio (BLOB). Embora este mecanismo seja eficiente em memria, o
mais difcil de usar eficientemente porque devemos escrever todo o cdigo para gerenci-lo. Um vetor
simplesmente um bloco de memria que podemos acessar atravs de um ndice a fim de manipular uma entrada de
dados. O vetor no tem intrinsecamente em si mesmo formas de procurar, excluir, expandir, ou adicionar. A fim de
realizar estas tarefas devemos escrever rotinas para faz-lo. Para adicionar ou alterar um elemento em um vetor,
simplesmente modificamos o contedo do vetor em um certo ndice do vetor. Existem implementaes de vetores
inteligentes que j possuem estas habilidades, mas eles no so mais simples vetores mas sim colees ou objetos.

Colees
Uma coleo COM uma forma muito eficiente de enviar dados porque ela tem a facilidade de uso de um vetor sem
as limitaes do mesmo. Em uma coleo fcil adicionar, alterar e excluir. Embora no to simples de percorrer
seus elemento como em um vetor, uma coleo COM projetada para permitir um loop de repetio. Uma das
caractersticas mais usadas de uma coleo a habilidade de procurar por um elemento especfico na coleo atravs
de uma chave associada.

Recordsets ADO
Podemos imaginar um objeto Recordset ADO como um vetor muito inteligente com as habilidades de uma coleo
(e muito mais). No somente podemos usar um recordset para manter dados, mas tambm podemos procurar,
adicionar, excluir, alterar, e etc. Se um recordset est conectado com a fonte de dados, qualquer mudana feita no
recordset pode ser enviada de volta a fonte de dados com um simples comando. Se o recordset no est conectado a
qualquer fonte de dados (isto chamado de recordset desconectado), o recordset pode ser transmitido pela rede e
manipulado em um lugar diferente de seu cdigo original.

Livraria Duwamish
Porque a Livraria Duwamish usa ADO para as suas ferramentas nativas de acesso a dados e ADO tem um excelente
objeto (Recordset) para passar dados, decidimos usar o Recordset ADO como o mecanismo de passagem de dados.

Ele no somente nos fornece um objeto de dados bem estvel (ADO deve existir por algum tempo ainda), mas
tambm no precisamos codificar todos as rotinas para os vrios mtodos.

Mantendo Contato
Existem vrias vantagens para usar recordsets desconectados, mas tambm existem vezes em que um recordset
conectado a melhor opo. Qual a diferena entre os dois?

Livraria Duwamish
O exemplo da Livraria Duwamish usa tanto recordsets conectados como desconectados. Quando um grupo de
registros solicitada somente para ser mostrado, os dados so retornados em um recordset desconectado. Quando os
dados requerem uma conexo, ou a atualizao de um registro requerida antes que qualquer cdigo possa
continuar, recordsets conectados so usados. Por exemplo, quando um pedido de venda includo no banco de
dados, um cabealho da venda criado de uma forma conectada, os campos so atualizados, e o registro gravado
de volta no banco de dados. Isto permite com que o prximo trecho de cdigo imediatamente recupere o campo
chave primria do registro do cabealho da venda (Codigo) para us-lo com os registros dos detalhes associados
com a venda. Uma vez que os registros dos detalhes da venda sejam includos no banco de dados, a conexo
finalmente rompida. Sem a conexo do cabealho da venda, o campo Cdigo no poderia ser preenchido e portanto
no estaria disponvel para ser usado com os registros dos detalhes da venda. Ambas as operaes esto dentro de
uma transao, assim se qualquer uma falhar, as operaes podem ser voltar para trs (rolled back).

Conectado
Um recordset conectado um objeto recordset que mantm uma conexo com a fonte de dados. Esta conexo pode
ser mantida durante a vida do recordset, ou pode ser desconectada a qualquer momento mudando a conexo ativa.
Se a conexo rompida, qualquer atualizao ao recordset no ser transmitida fonte de dados at que a conexo
seja restabelecida.
A vantagem de um recordset conectado que o recordset tem acesso imediato (que termo relativo!) aos dados. Quo
"imediato" dependente de como o recordset conectado a fonte de dados. Se o recordset criado para manter um
conjunto dinmico de dados, mudanas nos dados originais so refletidos no recordset. Se o recordset foi criado para
ser um conjunto esttico dos dados (snapshot), mudanas nos dados originais no so refletidos no recordset e s so
recuperados quando o recordset tenta executar uma atualizao.
A desvantagem de um recordset conectado que a conexo com a fonte de dados e carregada com o recordset, no
importando quo longe pela rede ele trafegar. Desta forma, carrega o servidor com excesso de manuteno da
conexo e aumenta o uso de recursos pelo objeto Recordset.

Desconectado
Um recordset desconectado simplesmente um recordset que foi populado com dados de uma fonte de dados e
depois desconectado dessa fonte de dados. No causa o excesso de conexo para a fonte de dados. Porm, qualquer
alterao nos dados no refletida na fonte de dados originais at que o recordset seja reconectado a fonte de dados
e o mtodo de atualizao seja acionado.

Um Proposta Tudo ou Nada


Freqentemente uma mudana nos dados pode causar mais de uma alterao nos dados. Recordsets transacionais
asseguram que todas as mudanas sejam realizadas ou, se necessrio, que todas sejam revertidas.

No-transacional
Um recordset no-transacional um no qual as mudanas nos dados so feitas permanentemente sem a chance de
dizer atravs da programao, "Opa, isso no funciona, desfaa minha ltima alterao!" Essencialmente, no existe
um comando "desfazer".

Transacional
Por outro lado, um recordset transacional permite que controlemos se nossas mudanas sero permanentes. Podemos
iniciar uma transao, realizar mudanas, e depois gravar (commit) todas as mudanas, ou "desfazer" tudo. Uma vez
que a deciso for tomada, o cdigo pode encerrar a transao.

Livraria Duwamish
A Livraria Duwamish usa tanto recordsets transacionais como recordsets no-transacionais. No caso de uma
alterao atmica como incluir um registro no estoque, ela usa um recordset no-transacional. Quando os recordsets
so dependentes de outros recordsets, ela usa recordsets transacionais.
A incluso dos detalhes da venda depois da incluso do cabealho da venda um caso clssico de recordset
transacional. O cabealho da venda deve ser includo primeiro ao banco de dados para obter a chave primria
(Codigo), e depois os detalhes so includos. Se, por qualquer motivo, os detalhes violarem as regras de integridade
referencial do banco de dados, a incluso do cabealho da venda pode ser revertida (rolled back) sem afetar o resto
do banco de dados.

Freqentes Pontas Soltas


Manter uma conexo com a fonte dos dados pode ser caro em termos dos recursos usados a menos que tenhamos
que fazer acessos freqentes a fonte de dados, em cujo caso melhor manter a conexo a fonte de dados at que
todos os acessos tenham terminados.

Livraria Duwamish
Muitas partes da Livraria Duwamish mantm uma conexo em cache enquanto elas fazem vrios acessos ao banco
de dados para agrupar vrios recordsets. Uma vez que estes vrios recordsets estejam agrupados, a conexo em
cache derrubada.

Conexes em Cache
Usando uma conexo em cache muito til quando precisamos fazer freqentes acessos a fonte de dados, porque
abrir e fechar uma conexo toda vez que queiramos afetar os dados pode ser custoso em termos de tempo, memria,
ou transmisso de dados. Por exemplo, conexes em cache so teis quando usamos recordsets transacionais, porque
a conexo ser necessria mais tarde tanto para gravar (commit) ou retornar (roll back) as mudanas.

Conexes sem Cache


O que significa sem cache? Significa simplesmente que a conexo a fonte de dados no mantida em todo o tempo
de vida de um recordset. Um ambiente sem cache muito mais fcil de trabalhar e mais rpido como um todo.

Concluso
Os tpicos de projeto descritos neste artigo so os pontos mais pertinentes que encontramos quando escrevemos a
camada de acesso a dados da Livraria Duwamishlutamos com eles e gostaramos de passar o que aprendemos para
vocs.

Desmembrando a Camada de Acesso a Dados


Livraria Duwamish, Fase 2
Sumrio: Explica o processo de remover o cdigo de acesso a dados de um aplicao e substitu-lo por chamadas a
um componente COM de acesso a dados. (5 pginas impressas) Discute:
Movendo um mdulo de API para um componente COM

Exemplos de cdigo

Introduo
A Fase 2 do exemplo da Livraria Duwamish projetado para demonstrar como desmembrar a camada de acesso a
dados das aplicaes individuais em um componente que ser comum a todas as aplicaes. A abordagem que
iremos fazer para remover o acesso a dados das aplicaes similar a abordagem que usada quando do
desenvolvimento de uma nova aplicaocolhendo informaes, analisando, planejando, e ento implementando.
Este processo torna-se um esforo cooperativo entre os desenvolvedores da aplicao e o desenvolvedor responsvel
pelo projeto do componente de acesso a dados. Veja os artigos "Projetando uma Camada de Acesso a Dados," para
examinar os tpicos envolvidos em separar o componente de acesso a dados, e "API da Camada de Acesso a Dados
da Livraria Duwamish," para detalhes da especificao dos mtodos e propriedades do componente. Este artigo
descreve o processo de substituio a camada de acesso a dados integrada em cada aplicao desktop por chamadas
a mtodos em um componente COM separadoa Camada de Acesso a Dados da Livraria Duwamish (DBDAL).
O primeiro passo no processo foi definir os requisitos em cada uma das aplicaes e isolar os segmentos de cdigo
de acesso a dados. Os segmentos de cdigo representando as funes bsicas associadas com o acesso a dados
obtendo, incluindo, e alterando registrosforam ento agrupados juntos.
O fato de que cada desenvolvedor em nosso grupo teve uma abordagem diferente para a tarefa de acesso a dados
exigiu que tivssemos de analisar as tcnicas empregadas. Por essa razo, depois que todos os segmentos de cdigo
de acesso a dados foi isolado, examinamos cada funo bsica para encontrar as similaridades bsicas, permitindonos determinar quais funes poderiam ser compartilhadas e usadas no componente de acesso a dados. Porque todas
as necessidades de cada aplicao no pode ser exatamente satisfeita, algumas modificaes adicionais for requerida
para cada cdigo da aplicao.

Aplicao PDV: Incluindo uma Venda


Na Fase 1 da aplicao Ponto de Venda (PDV), incluir uma venda requeria o agrupamento de vrias mudanas nos
dados como uma nica transao por causa da relao pai/filho entre os registros da venda e detalhes. Isto requeria
cdigo especial de acesso a dados. O cdigo que foi desenvolvido na Fase 1 ajudou a determinar alguns dos mtodos
que foram usados no componente da Fase 2. O seguinte cdigo ilustra a incluso de uma venda e seus detalhes.
Note, principalmente, a instruo oVenda.Codigo = oRset!Codigo. Isto recupera a chave primria (Codigo) do
registro includo recentemente. Este Codigo ento usado como a chave estrangeira para os registros de
VendaDetalhe que so adicionados a seguir:
Public Function IncluirVenda(oVenda As cVenda, oVendaDetItens As
cVendaDetItens, oEndereco As cEndereco, oPedidoStatus As cPedidoStatus,
oPedidoTipo As cPedidoTipo) As Boolean
Dim oDAL As New dbdal.CDataAccess
Dim oRset As ADODB.Recordset
.
.
.
' Incluir uma venda.
Set oRset = New ADODB.Recordset
If oDAL.AbrirTRecordset(scVENDAS, oRset, LT_Optimistic, OO_UsarTabela) Then
oRset.AddNew
With oVenda
oRset!NumCliente = .NumCliente

.
.
.

oRset!Entrega = .Entrega
End With
oRset.Update
' Guarda Codigo do registro de venda para usar com os detalhes da venda
oVenda.Codigo = oRset!Codigo
If oDAL.FecharTRecordset(oRset) Then
Set oRset = Nothing
Else
Err.Number = icRECORDSET_CLOSE_ERROR
Err.Description = scRECORDSET_CLOSE_ERROR
GoTo ErrorHandler
End If

Else

Err.Number = icRECORDSET_OPEN_ERROR
Err.Description = scRECORDSET_OPEN_ERROR
GoTo ErrorHandler
End If
' Incluir detalhes da venda.
Set oRset = New ADODB.Recordset
If oDAL.AbrirTRecordset(scVENDA_DETALHES, oRset, LT_Optimistic, OO_UsarTabela)
Then
For Each oVendaDetItem In oVendaDetItens
oRset.AddNew
With oVendaDetItem
oRset!NumVenda = oVenda.Codigo
oRset!NumItem = .NumItem
oRset!PrecoUnitario = .PrecoUnitario
oRset!Quantidade = .Quantidade
oRset.Update
.Codigo = oRset!Codigo
End With
Next
If oDAL.FecharTRecordset(oRset) Then
Set oRset = Nothing
Else
Err.Number = icRECORDSET_CLOSE_ERROR
Err.Description = scRECORDSET_CLOSE_ERROR
GoTo ErrorHandler
End If
Else
Err.Number = icRECORDSET_OPEN_ERROR
Err.Description = scRECORDSET_OPEN_ERROR
GoTo ErrorHandler
End If
.
.
.
' Gravar todos os partes da transao como uma so.
If oDAL.CommitTrans(TT_DropConnection) Then
' Tudo funcionou entao avisa do sucesso e sai
IncluirVenda = True

Else

Err.Number = icTRANSACTION_CLOSE_ERROR
Err.Description = scTRANSACTION_CLOSE_ERROR
GoTo ErrorHandler
End If
Set oDAL = Nothing
.
.
.
End Function

A Aplicao Catlogo
Na Fase 1 da aplicao Catlogo, o acesso aos dados foi realizado por uma funo customizada chamada
ObterRecordset. A funo ObterRecordset na aplicao Catlogo, embora definida diferente, compartilha o
mesmo nome de um mtodo na API genrica de acesso a dados. Como as procedures no so compatveis,
precisamos remover a funo contida na aplicao. Esta funo serve a um duplo propsito, fornecer um recordset
atualizvel ou no-atualizvel.
O mtodo ObterRecordset na Fase 2 do componente somente retorna um recordset no-atualizvel. Para aqueles
casos em que requerido um recordset atualizvel, o conjunto de mtodos BeginTrans, AbrirTRecordset, e
CommitTrans so fornecidos no componente. O seguinte cdigo ilustra este processo:
Private Sub btnIncluirAutor_Click()
.
.
.
oDAL.BeginTrans (sDSN)
oDAL.AbrirTRecordset scTABELA_AUTORES, oRec, adLockOptimistic, adCmdTable
' Cria um novo autor
oRec.AddNew
oRec!Nome = strNome
oRec!Sobrenome = strSobrenome
oRec.Update
mnNumAutor = oRec!Codigo
oRec.Close
oDAL.CommitTrans
Set oRec = Nothing
.
.
.
End Sub
O seguinte cdigo ilustra o mtodo ObterRecordset no componente:
Private Sub MostrarTotalItens()
Dim oBancoDadosAPI As New CAcessoDados
Dim oRec As ADODB.Recordset
If oBancoDadosAPI.ObterRecordset(sDSN, "SELECT Codigo From Itens", oRec) Then
mnTotalItens = oRec.RecordCount
StatusBar.SimpleText = "0 de " & mnTotalItens & " itens."
oRec.Close
Set oRec = Nothing
End If
End Sub

Entrega e Recebimento
Na Fase 1, a aplicao de Entrega e Recebimento acessava os dados chamando funes do mdulo de API de acesso
a dados que era compilado com a aplicao. Este mdulo se tornou a base para o componente na Fase 2. Por causa

disso, a converso foi relativamente fcil. Simplesmente incluimos MSDN: Duwamish 2, VB Camada de Acesso a
Dados como referncia no projeto. Ento removemos o mdulo API de acesso a dados da lista de arquivos inclusos
no projeto e substitumos as chamadas feitas anteriormente as funes do mdulo por chamadas aos mtodos do
novo componente. As funes que compem o mdulo foram includas na DBDAL para Fase 2. O seguinte cdigo
ilustra a chamada a ExecQuery na Fase 1 e ento a mesma chamada na Fase 2. CAcessoDados a nica classe na
DBDAL.
Fase 1:
bRetorno = AcessoDadosAPI.ExecQuery(scCONNECT, sQry)
Fase 2:
Dim oAcessoDadosAPI As New CAcessoDados
bRetorno = oAcessoDadosAPI.ExecQuery(scCONNECT, sQry)

Concluso
Na Fase 1 usamos o Microsoft ActiveX Data Objects (ADO) para gerenciar o acesso a dados. Isto nos deu uma
tecnologia comum para usar no gerenciamento dos dados atravs do ciclo de vida do exemplo da Livraria
Duwamish. Se voc tentar isolar um componente de acesso a dados e converte-lo para ADO a partir de uma
aplicao desktop clssica que usa Data Access Objects (DAO) ou Remote Data Objects (RDO), com ou sem
controles ligados a um banco de dados, ser necessrio fazer mais converses. Embora algumas sintaxes sejam
similares entre as tecnologias, algumas das funcionalidade encontradas no DAO e RDO no esto presentes no
ADO. O ADO no suporta controles ligados sem o Remote Data Service (RDS) AdvancedDataControl. Alm do
mais, conforma voc migra das aplicaes desktop para aplicaes em multi-nveis, os controles ligados tornam-se
menos utilizveis, ento uma boa idia fazer a mudana neste momento.
Na Fase 1 do exemplo da Livraria Duwamish diferentes desenvolvedores projetaram cada aplicao com poucas
diretrizes. Portanto, diferentes tcnicas de codificao foram usadas em cada uma das vrias aplicaes. Na Fase 2
nossa tarefa foi separar a camada de acesso a dados das aplicaes e compartilhar um componente COM. Isto exigiu
a combinao e o refinamento dos mtodos de acesso a dados para que eles pudessem ser compartilhados por todas
as aplicaes. Como voc j deve ter visto ilustrado, cada aplicao exigiu algumas modificaes.
Isto resume a Fase 2 do nosso exemplo. Na Fase 3 iremos substituir a lgica do negcio em cada aplicao por um
componente COM compartilhado por todos. Como voc pode imaginar, o processo ser similar ao que foi feito com
a camada de acesso a dados na Fase 2, mas muito mais extenso.