ProjetoLoja - preliminar

download ProjetoLoja - preliminar

of 21

Transcript of ProjetoLoja - preliminar

Projeto Conjunto - Departamento de Processamento de Dados COTUCA

1

Projeto de LojaEste projeto tem como objetivo a criao de um sistema que permita o gerenciamento de uma loja de departamentos, que poder, assim, vender produtos de vrias categorias, tanto presencial quanto virtualmente, atravs de uma parte do projeto que ser baseada na web. Portanto, neste projeto vinculamos os assuntos abordados em vrias disciplinas, relacionadas a seguir: Gesto da Qualidade e de Processos Bancos de Dados Programao Visual e Bancos de Dados Aplicaes e Segurana para Internet I

Cada uma dessas disciplinas solicitar a aplicao de tcnicas nelas abordadas, de modo a integrar os componentes curriculares e fornecer ao aluno uma viso ampla da aplicao dessas tcnicas no mundo do trabalho. Os processos implantados no sistema so relacionados com a gesto de um empreendimento, abordando aspectos de logstica, fluxo de caixa, estoque, relacionamento com o cliente, qualidade, rastreabilidade de produtos, dentre outros. Computacionalmente, o sistema ter trs partes principais: Para armazenar os dados e permitir a integrao das diversas atividades empresariais, ser desenvolvido um banco de dados cliente/servidor, chamado loja2010, que conter as entidades necessrias. Ser usado o servidor de banco de dados Sql Server 2008. Um mdulo de manuteno de cadastros, gesto de estoque e gesto de caixa, desenvolvido em linguagem Visual Basic.Net, usando o Visual Studio 2010. Um mdulo de acesso via web, para a implantao de loja virtual, com emisso DE boletos bancrios para pagamento. Neste mdulo haver, tambm, a implantao de capacidades de validao e segurana de dados e de criptografia de informaes. O mdulo ser desenvolvido em ASP.Net, usando o Visual Studio 2010.

Desenvolvimento do Banco de Dados O banco de dados deste sistema precisa garantir o armazenamento de dados e a manuteno da integridade das informaes referentes ao funcionamento bsico de uma loja. Assim, podemos prever que as entidades principais, numa primeira anlise, seriam: Entidade Produto Fornecedor Compras Cliente Vendas Fluxo de Caixa Descrio Dados sobre os produtos vendidos pela loja Dados sobre os fornecedores dos produtos que a loja vende Dados sobre as compras que a loja fez, de fornecedores, para compor o estoque de produtos a venda Dados sobre os clientes da loja Dados sobre as vendas que a loja fez para clientes Dados sobre o movimento financeiro da loja, contas a pagar e a receber

Como a loja uma loja de departamentos, os produtos so agrupados em categorias de produtos, para organizar melhor os vrios departamentos e, tambm, facilitar a navegao do site da loja virtual. Portanto, cada produto ter uma categoria. No entanto, as categorias, por si mesmas, so agrupamentos de sub-categorias, uma vez que dentro de um mesmo departamento podem ser vendidos produtos de natureza semelhante mas que, devido necessidade de organizao da loja, podem ser divididos em sub-categorias. Como exemplo, temos o Departamento de Produtos de Informtica, cujas sub-categorias seriam Computadores, Monitores, Impressoras, Acessrios e Software. Agrupados em Acessrios, por exemplo, teramos as categorias Perifricos, Cartuchos

Projeto Conjunto - Departamento de Processamento de Dados COTUCA

2

e Toners, Armazenamento, GPS, dentre outros. Assim, alm dos produtos, nosso modelo dever prever uma entidade que se auto-referencia, chamada de Categoria. Existe uma relao entre produtos e fornecedores, visto que um mesmo produto pode ser distribudo por vrios fornecedores distintos, bem como um mesmo fornecedor pode fornecer diversos produtos diferentes para a loja. Portanto, teremos de prever o relacionamento entre produtos e fornecedores no modelo de nosso banco de dados. Por outro lado, os produtos que vendemos so provenientes de um estoque. Esse estoque abastecido pelos fornecimentos de produtos que a loja compra de seus fornecedores. Os fornecimentos no ocorrem de uma nica vez para cada produto, nem mesmo so de um mesmo produto de um mesmo fornecedor, sem mudanas. Alm disso, o que a loja anuncia so os produtos que possui mas, tambm, o que ela vende so os produtos que esto em seu estoque. Ocorre que os produtos entram na loja atravs de seus fornecedores, e estes os vendem em lotes para a loja. Os lotes so uma informao importante do ponto de vista de rastreio dos produtos pois, caso apresentem problemas ou defeitos quando estiverem nas mos dos clientes, possvel loja rastrear sua origem e, caso necessrio, acionar o fornecedor para que este se responsabilize pela troca de produtos defeituosos. Portanto, teremos de possuir informaes sobre o estoque atual de cada produto, bem como maneiras de saber de que lote de fornecimento eles so provenientes. Teremos tambm as informaes sobre cidades e estados onde os clientes e fornecedores esto localizados. Com relao s vendas que a loja faz para seus clientes, temos a necessidade de registrar quais produtos foram vendidos em cada operao de venda, j que uma venda pode ser composta por vrios produtos, em diferentes quantidades. Alm disso, uma venda pode ser parcelada, e os dados de cada parcela a ser recebida devem ser previstos no banco de dados, para que as atividades de contas a receber e de cobrana (caso necessria) possam ser realizadas a contento. No tocante s compras de produtos que a empresa faz de seus fornecedores, tambm necessrio registrar cada uma, indicando tambm os produtos, suas quantidades, preos unitrios que compem cada compra. De forma simtrica venda, uma compra pode ser composta por vrios produtos (itens de compra) e ter seu pagamento parcelado. Assim, temos a necessidade de manter um registro dos pagamentos a serem efetuados em cada data, de forma a permitir que a atividade de contas a pagar seja realizada corretamente. Assim sendo, o banco de dados ter as seguintes tabelas e campos, descritos abaixo: loEstado - Estados da Federao Campo siglaEstado nomeEstado Formato Char(2), obrigatrio, Varchar(25), obrigatrio Descrio/Funo PK, identifica uma Unidade da Federao Nome completo do estado

loCidade - Cidades onde se localizam clientes e fornecedores Campo idCIdade nomeCidade siglaEstado Formato int, Identity(1,1), Varchar(50), obrigatrio Char(2), obrigatrio, Descrio/Funo PK, nmero que identifica uma cidade Nome da cidade FK, chave estrangeira para tabela loEstado

Projeto Conjunto - Departamento de Processamento de Dados COTUCA loCliente - Clientes da loja Campo idCliente nomeCliente sexo CPF RG dataNscimento nomeMae numeroEndereco Complemento CEP idCidade DDDTelefone Telefone eMail nomeUsuario senhaUsuario Formato int, Identity(1,1), Varchar(50), obrigatrio Char(1), obrigatrio Varchar(15), obrigatrio Varchar(12), obrigatrio DateTime, obrigatrio Varchar(50), obrigatrio Varchar(5), obrigatrio Varchar(20), opcional Varchar(8), obrigatrio Int, obrigatrio, Varchar(2), opcional Varchar(12), opcional Varchar(50), opcional Varchar(15), opcional Varchar(15), opcional Para envio de mensagens Para acesso via Internet (B2C) Para acesso via Internet Descrio/Funo PK, nmero que identifica um cliente Nome do cliente Valores aceitos: M ou F CPF do cliente RG do cliente Data de nascimento do cliente Nome da me do cliente, para o SPC Endereo residencial do cliente Nmero no endereo acima Complemento do endereo (apto, bloco) CEP do endereo do cliente FK para tabela loCidade

3

enderecoResidencial Varchar(50), obrigatrio

loFornecedor - Fornecedores da loja Campo idFornecedor nomeFornecedor enderecoFornecedor numeroEndereco Complemento CEP idCidade DDDTelefone Telefone Contato CNPJ eMail nomeUsuario senhaUsuario Formato int, Identity(1,1), Varchar(50), obrigatrio Varchar(50), obrigatrio Varchar(5), obrigatrio Varchar(20), opcional Varchar(8), obrigatrio Int, obrigatrio, Varchar(2), obrigatrio Varchar(12), obrigatrio Varchar(30), opcional Varchar(15), obrigatrio Varchar(50), opcional Varchar(15), opcional Varchar(15), opcional Para envio de mensagens Para acesso via Internet (B2B) Para acesso via Internet Descrio/Funo PK, nmero que identifica um fornecedor Nome do fornecedor Endereo do fornecedor Nmero no endereo acima Complemento do endereo (apto, bloco) CEP do endereo do fornecedor FK para tabela loCidade

Projeto Conjunto - Departamento de Processamento de Dados COTUCA

4

At este momento, nosso banco de dados teria a seguinte estrutura:loCliente loFornecedor idFornecedor nom eFornecedor EnderecoFornecedor Num eroEndereco Bairro CEP idCidade DDDTelefone Telefone Contato CNPJ em ail nom eUsuario senhaUsuario idCidade nom eCidade SiglaEstado loCidade loEstado siglaEstado nom eEstado idCliente Nom eCliente sexo CPF RG dataNascim ento Nom eMae EnderecoResidencial num eroEndereco Com plem ento CEP idCidade DDDTelefone Telefone EMail Nom eUsuario SenhaUsuario

Continuando a descrio das tabelas, temos o seguinte: loProduto - Relao de produtos venda Campo idProduto nomeProduto idCategoria PrecoVenda estoqueMinimo descricaoProduto Formato int, Identity(1,1), Varchar(30), obrigatrio int, obrigatrio, Float, obrigatrio Float, obrigatrio Text Descrio detalhada do produto URL do arquivo de imagem deste produto, dentro da pasta \images do site da loja virtual Descrio/Funo PK, nmero que identifica um produto Nome do Produto FK para tabela loCategoria

arquivoDeImagem Varchar(50)

loCategoria - Hierarquia das categorias de produtos venda Campo idCategoria Formato int, Identity(1,1), Descrio/Funo PK, nmero que identifica uma categoria Descrio da categoria FK que indica registro da categoria hierarquicamente superior, caso exista

descricaoCategoria Varchar(20), obrigatrio idCategoriaPai int, opcional,

Como um produto fornecido por um ou mais fornecedores, e um fornecedor pode fornecer um ou mais produtos. Assim, temos um relacionamento de cardinalidade M:N entre essas duas tabelas e derivamos uma terceira tabela, responsvel pela manuteno da integridade referencial: loProdutoFornecedor - Relaciona Fornecedores de Produtos Campo Formato Descrio/Funo

Projeto Conjunto - Departamento de Processamento de Dados COTUCA idProdutoFornecedor idProduto idFornecedor

5

int, Identity(1,1), int, obrigatrio,

PK; identifica uma relao Produto/Fornecedor FK para loProduto

FK para loFornecedor int, obrigatrio, Os fornecimentos de produtos loja compem o estoque de produtos venda. Esses fornecimentos so originrios de lotes de produtos que a loja compra de cada fornecedor. Cada momento de compra, portanto, precisa ser caracterizado e descrito no banco de dados. Uma compra composta por vrios itens, ou seja, diferentes produtos que um mesmo fornecedor vende loja. O pagamento de uma compra pode ser parcelado em uma ou vrias parcelas. Assim, descrevemos as tabelas referentes s compras de produtos que abastecem o estoque da loja: loCompra - Descreve um fornecimento ao estoque

Campo idCompra idFornecedor dataCompra quantasParcelas

Formato int, Identity(1,1), int, obrigatrio, Datetime, obrigatrio Int, obrigatrio

Descrio/Funo PK, identifica uma compra FK para tabela loFornecedor Data em que a compra realizada Nmero da nota fiscal do fornecedor Nmero de parcelas, default = 1

NotaFiscalCompra Varchar(20)

loItemCompra - Descreve cada item de uma compra Campo idItemCompra idCompra idProduto precoPagoUnitario dataChegada Formato int, Identity(1,1), int, obrigatrio, int, obrigatrio, Float, obrigatrio Datetime, opcional Descrio/Funo PK, identifica um item de uma compra FK para tabela loCompra FK para loProduto, indica produto comprado Preo unitrio do produto Quantidade comprada do produto no lote Data em que o item chegou loja

quantidadeComprada float, obrigatrio

Os lotes de produtos que entram no estoque so vendidos, conforme a demanda dos clientes, e precisam ser identificados para efeito de recolhimento de impostos, gerenciamento da atividade de reposio de estoque, rastreio de produtos, dentre outras necessidades. Isso nos leva tabela abaixo: loEstoque - Produtos disponveis para venda (estoque fsico) Campo idEstoque idProdutoFornecedor idItemCompra Formato int, Identity(1,1), int, obrigatrio, int, obrigatrio, Descrio/Funo PK, identifica um lote de produtos FK, indica produto fornecido e quem o forneceu FK, indica o item de compra que descreve o lote Quantidade disponvel no estoque

quantidadeEstoqueAtual Float, obrigatrio

Projeto Conjunto - Departamento de Processamento de Dados COTUCA

6

Essas entidades e seus relacionamentos so representadas pelo diagrama a seguir:loCompra idCom pra idFornecedor dataCom pra notaFicalCom pra quantasParcelas loEstado dataChegada loProduto loFornecedor loCategoria loI temCompra * idItem Com pra idCom pra idProduto precoPagoUnitario quantidadeCom prada num LoteFornecedor dataChegada

siglaEstado nom eEstado loCidade idFornecedor nom eFornecedor EnderecoFornecedor Num eroEndereco Bairro CEP idCidade idCidade nom eCidade SiglaEstado DDDTelefone Telefone Contato CNPJ em ail nom eUsuario senhaUsuario loProdutoFornecedor

idProduto nom eProduto idCategoria loEstoque * precoVenda descricaoProduto arquivoDeIm agem idCategoria DescricaoCategoria idCategoriaPai

idEstoque idProdutoFornecedor idItem Com pra quantidadeEstoqueAtual idProdutoFornecedor idProduto idFornecedor

De forma simtrica, as vendas de produtos que esto no estoque so feitas para clientes. Uma venda tambm composta por vrios itens, em diversas quantidades. O pagamento de uma venda, pelo cliente, podem ser parcelados. Os pagamentos dessa venda pelo cliente geram os recebimentos da loja, e essas informaes devem ser todas representadas no banco de dados: loVenda - Descreve uma venda de produtos em estoque a um cliente Campo idVenda idCliente dataVenda NotaFiscalVenda quantasParcelas dataPrevista Formato int, Identity(1,1), int, obrigatrio, Datetime, obrigatrio Varchar(20) Int, obrigatrio Datetime, opcional Descrio/Funo PK, identifica uma venda FK para tabela loCliente Data em que a venda foi realizada Nmero da nota fiscal da loja para o cliente Nmero de parcelas, default = 1 Data de entrega prevista de toda a venda

Cada venda pode ser composta por um ou mais produtos vendidos. Esses produtos saem do estoque e, assim, o registro do estoque que deu origem a esse item de venda deve ser identificado, para efeito de rastreio caso seja necessrio. Atravs do idEstoque, descobrimos o registro de estoque associado e, seguindo os relacionamentos, descobrimos o item de compra relacionado, atravs deste descobrimos os dados da compra. Descobrimos tambm o fornecedor do lote.

Projeto Conjunto - Departamento de Processamento de Dados COTUCA loItemVenda - Descreve cada item de uma compra Campo idItemVenda idVenda idEstoque Formato int, Identity(1,1), int, obrigatrio, int, obrigatrio, Descrio/Funo PK, identifica um item de uma venda FK para tabela loVenda

7

FK para loEstoque, indica produto comprado e permite seu rastreamento Preo unitrio do produto Quantidade vendida do produto no lote Data em que o item foi entregue ao cliente

precoCobradoUnitario Float, obrigatrio quantidadeVendida dataEntrega float, obrigatrio Datetime, opcional

Como uma venda pode ter seus pagamentos, pelo cliente, parcelada, interessante j modelarmos uma tabela de parcelas a receber. Essa tabela ser parte do mdulo de fluxo de caixa da gesto financeira da loja, paralalmente tabela de parcelas a pagar, que tambm modelaremos em seguida e que caracteriza as parcelas que a loja tem a pagar aos seus fornecedores quando do abastecimento do estoque: cpParcelaCompra - Descreve cada parcela a pagar de uma compra Campo idParcelaCompra idCompra dataPrevistaPagamento valorParcelaAPagar dataEfetivaPagamento valorEfetivamentePago valorMulta valorJuros Formato int, Identity(1,1), int, obrigatrio, Datetime, obrigatrio Float, obrigatrio Datetime, opcional Float, opcional Float, opcional Float, opcional Descrio/Funo PK, identifica uma parcela a pagar FK para tabela loCompra

documentoDePagamento Varchar(20), opcional crParcelaVenda - Descreve cada parcela a receber de uma venda efetuada Campo idParcelaVenda idVenda dataPrevistaRecebimento valorParcelaAReceber dataEfetivaRecebimento valorMulta valorJuros Formato int, Identity(1,1), int, obrigatrio, Datetime, obrigatrio Float, obrigatrio Datetime, opcional Float, opcional Float, opcional Descrio/Funo PK, identifica uma parcela a receber FK para tabela loVenda

valorEfetivamenteRecebido Float, opcional

documentoDeRecebimento Varchar(20), opcional Por fim, temos o diagrama completo abaixo:

Projeto Conjunto - Departamento de Processamento de Dados COTUCAcpParcelaCompra *idParcelaCom pra idCom pra dataPagam entoPrevista valorParcelaAPagar dataPagam entoEfetiva valorEfetivam entePago valorMulta valorJ uros docum entoDePagam ento loCliente siglaEstado idFornecedor nom eFornecedor EnderecoFornecedor Num eroEndereco Bairro idCliente Nom eCliente sexo CPF RG dataNascim ento Nom eMae EnderecoResidencial num eroEndereco Com plem ento CEP idCidade DDDTelefone Telefone EMail Nom eUsuario SenhaUsuario crParcelaVenda * idItem Venda CEP idCidade DDDTelefone Telefone Contato CNPJ em ail nom eUsuario senhaUsuario nom eEstado

8

loCompra *idCom pra idFornecedor dataCom pra notaFicalCom pra quantasParcelas

loItemCompra *idItem Com pra idCom pra idProduto precoPagoUnitario quantidadeCom prada dataChegada

loFornecedor

loEstado

loCidade

loI temVenda *idCidade nom eCidade SiglaEstado

loProdutoFornecedor *

loVenda *

idVenda idEstoque

loProduto

precoCobradoUnitario quantidadeVendida dataEntrega idProdutoFornecedor idProduto idFornecedor

idVenda loEstoque * idCliente dataVenda NotaFiscal quantasParcelas dataPrevista

loCategoriaidProduto nom eProduto idCategoria precoVenda descricaoProduto arquivoDeIm agem

idParcelaVenda idVenda dataPrevistaRecebim ento valorParcelaAReceber dataEfetivaRecebim ento valorEfetivam enteRecebido valorMulta valorJ uros docum entoDeRecebim ento loEstoque idProdutoFornecedor idItem Com pra quantidadeEstoqueAtual idCategoria DescricaoCategoria idCategoriaPai

Projeto Conjunto - Departamento de Processamento de Dados COTUCA Aps criar o banco de dados, no Sql Server Management Studio vamos criar um usurio funcionarioLoja, com senha funcLoja, que permita o acesso s tabelas e demais objetos do banco de dados:

9

Esse usurio ser associado ao banco de dados loja2010, tendo algumas tarefas pr-estabelecidas, como vemos nas prximas figuras:

Esse usurio, portanto, poder fazer o backup do banco de dados, ler e escrever dados no mesmo. Aps isso, vamos criar, no Visual Studio, um projeto Windows Form para fazer a manuteno do banco de dados e, tambm, algumas operaes do dia a dia da loja, como compras, cadastros, vendas, contas a pagar, contas a receber e fluxo de caixa. No Visual Studio, crie o projeto e chame-o de LojaFIsica, pois esta ser a parte presencial, no virtual, da loja. Mude o nome do arquivo do formulrio criado para frmPrincipal. Crie tambm um novo formulrio, chamando seu arquivo de frmCategoria. Crie outro formulrio e o chame de frmSplash. A figura abaixo ilustra o Solution Explorer inicial do projeto, com dois formulrios. Clicou-se no item My Project, o que abriu a janela de configurao do projeto. Note que o item Startup form dessa janela foi configurado para que o frmPrincipal, que conter o menu principal do sistema,

Projeto Conjunto - Departamento de Processamento de Dados COTUCA

10

seja o formulrio inicialmente exibido quando se executa o projeto. Mudou-se tambm o cone do projeto para que este seja mais adequado aos objetivos do sistema e, por fim, indicou-se uma Splash Screen:

O formulrio principal

Vemos nas figuras acima que o formulrio principal ter um menuStrip, com as opes exibidas. Na opo cadastro, teremos as sub-opes da figura direita, que faro a chamada aos formulrios de manuteno das tabelas de cadastro do banco de dados.

Projeto Conjunto - Departamento de Processamento de Dados COTUCA

11

H tambm um PictureBox e um MonthCalendar, ambos obtidos na coleo Common Controls da ToolBox. Gere o manipulador do evento OnClick da sub-opo Categorias, e digite o cdigo que chama o formulrio de Categorias:Private Sub CategoriasToolStripMenuItem_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles CategoriasToolStripMenuItem.Click frmCategoria.Show() End Sub

Como voc pode perceber, a maneira de chamar um formulrio a partir de outro igual ao Delphi, com o uso do mtodo Show(). Para chamar esse formulrio como Modal, de forma que nenhum outro formulrio do aplicativo possa ser acessado enquanto este estiver ativo, usa-se o mtodo ShowDialog, que funciona de forma exatamente igual ao ShowModal do Delphi. Vamos criar agora um componente de acesso ao banco de dados. Esse componente usa ADO.NET, que o namespace do .Net Framework responsvel pela manipulao de dados de diversas origens, como planilhas, bancos de dados, servios web, dentre outros. Abra o Server Explorer [Ctrl-AltS] no Visual Studio. Ele possui uma entrada Data Connections, sobre a qual voc clicar com o boto direito do mouse. Escolha a opo Add Connection... Ser exibida o nosso conhecido Wizard de criao de conexes a bancos de dados: Configure-o como na figura ao lado e teste a conexo. Se tudo funcionar corretamente teremos acesso a todo o banco de dados que criamos e configuramos anteriormente. Em outras palavras, dentro do prprio Visual Studio teremos o acesso a todas aquelas ferramentas que o Sql Server Managenment Studio fornece, sem que seja necessrio usar esse aplicativo, pois ambos so integrados pelo .Net Framework. A figura seguinte ilustra esse conceito:

Projeto Conjunto - Departamento de Processamento de Dados COTUCA

12

Acesse a janela Data Sources ou o menu Data e selecione a opo Add New Data Source... Aparecer a janela ao lado. Selecione a opo Database e pressione [Next]. Escolha o modelo de banco de dados Dataset, o que far com que um arquivo DataSet seja adicionado ao nosso projeto. Com esse arquivo faremos o acesso ao banco de dados quando precisarmos. Na janela seguinte, escolha a conexo que criamos, pressione [Next] e, em seguida, salve o nome da conexo como loja2010CS. Ser feita a recuperao das informaes sobre o banco de dados e essa operao poder demorar um pouco.

Projeto Conjunto - Departamento de Processamento de Dados COTUCA Selecione os objetos do banco de dados que faro parte de nosso Dataset. Selecione todas os checkboxes, como na figura ao lado: Observe que mudamos o nome do DataSet, colocando-o como dsLoja2010. Pressione [Next]. Vamos agora selecionar todas as tabelas e demais itens do banco de dados. Estamos praticamente realizando uma cpia local do banco de dados. Essa cpia poder ser sincronizada com o servidor de banco de dados quando necessrio, realizando as alteraes devidas e mantendo a integridade dos dados. Caso o Visual Studio solicite a atualizao do servidor, autorize-o e pressione [OK].

13

Abra o formulrio de Categorias, usando o Solution Explorer. Observe que temos agora um item dsLoja2010.xsd no Solution Explorer. Clique sobre ele e o Server Explorer exibir detalhes sobre essa conexo de dados. Como trouxemos todos os objetos de dados do Banco, teremos algo como o diagrama que criamos no servidor Sql Server, e que vemos abaixo:

Acesse a opo do menu Data | Show Data Sources. Aparecer a janela Data Sources. Clique sobre a tabela loCategoria para expandir seus detalhes. No DropDownList que aparece ao lado dessa tabela, selecione DataGridView, como vemos na figura abaixo e, em seguida, arraste a tabela loCategoria por sobre o formulrio loCategoria. Ser depositado um Navegador e um

Projeto Conjunto - Departamento de Processamento de Dados COTUCA

14

DataGridView no formulrio, ambos j configurados e vinculados com a tabela loCategoria e seus campos.

Agora selecione novamente loCategoria na janela Data Sources e, no DropDownList, selecione Details. Arraste a tabela novamente para o formulrio, direita do DataGridView como vemos na figura abaixo, e teremos agora cada campo individual. Note os ttulos desses campos. O Visual Studio analisou o nome de cada campo e separou as letras maisculas das minsculas, gerando palavras separadas para os ttulos exibidos:

Modifique a propriedade name do DataGridView para gvCategoria. Modifique tambm as propriedades HeaderText e Width de cada coluna do gvCategoria, acessando-as com a propriedade Columns. Mude tambm a propriedade Text dos labels que identificam os campos de detalhe ao lado direito do gvCategoria, dando ttulos mais adequados aos textBoxes.

Projeto Conjunto - Departamento de Processamento de Dados COTUCA

15

Observe que o Visual Studio j nomeou os textBoxes de forma adequada (idCategoriaTextBox, por exemplo) e os vinculou a campos do Dataset. Ancore a parte inferior do gvCategoria. Mude o ttulo do formulrio. Abaixo ilustramos a execuo do programa, com o acesso opo de Manuteno de Categorias:

Faa com que o textBox idCategoriaTextBox fique como ReadOnly, pois esse campo no pode ser digitado pelo usurio e deve ser gerado automaticamente pelo mecanismo de banco de dados. Os dados acima foram digitados diretamente no Sql Server, para que tivssemos como testar o funcionamento inicial desse formulrio. No entanto, usar um DataGridView para a digitao de dados organizados hierarquicamente no uma boa idia. Seria mais interessante se tivssemos um componente TreeView no formulrio, que permitiria a criao de itens em formato de rvore, como o Windows Explorer. Coloquemos ento um componente TreeView no formulrio, abaixo dos campos de detalhe e direita do DataGridView. Chame esse componente de tvCategoria. Ancore a parte inferior do controle ao formulrio, para que, quando o formulrio mudar de altura, o treeView acompanhe essa mudana. Na toolbox, abra a coleo Menus & Toolbars e adicione ao formulrio um componente ContextMenuStrip; mude sua propriedade Name para cmsMenuArvore. Clique sobre o TreeView e, na propriedade ContextMenuStrip indique esse menu, de forma que qualquer clique com o boto direito no TreeView ativar esse menu e o tornar disponvel para realizarmos as operaes cujos eventos sero associadas a ele. Observe quem, abaixo do formulrio, o Visual Studio agrupou vrios componentes, que vemos na figura abaixo:

Projeto Conjunto - Departamento de Processamento de Dados COTUCA

16

dsLoja2010 o componente que representa o dataSet que criamos com a conexo ao banco de dados. Datasets so objetos que contm as tabelas de dados onde voc pode, temporariamente, armazenar os dados para uso em sua aplicao. Se sua aplicao exige trabalhar com dados, voc pode carreg-los em um dataset, que fornece sua aplicao uma cpia local em memria dos dados, para trabalhar com eles. Voc pode trabalhar com os dados em um dataset mesmo se sua aplicao ficar desconectada do servidor de banco de dados. O dataset mantm informaes sobre as mudanas feitas nos dados, de forma que as atualizaes podem ser rastreadas e enviadas de volta ao banco de dados quando sua aplicao novamente se reconectar ao servidor.

LoCategoriaBindingSource1 o componente que faz a ligao (vinculao, colagem) entre os controles de um formulrio aos dados do dataSet. Esse componente possui muitas funes. Primeiramente, ele simplifica a ligao de controles do formulrio com os dados, ao fornecer controle de uso, notificao de alteraes e outros servios entre os controles Windows Forms e uma origem de dados (data source). Isto feito ao associar o componente BindingSource sua origem de dados com o uso da propriedade DataSource. No caso deste nosso formulrio, loCategoriaBindingSource1.DataSource est associada ao dataset dsLoja2010. Para cenrios de vinculao mais complexos, voc pode opcionalmente configurar a propriedade DataMember a uma coluna ou lista (tabela, por exemplo) especficos da origem de dados. Em nosso formulrio, essa propriedade foi configurada como loCategoria, de forma que esse controle de vinculao se refere lista (tabela) loCategoria. Em seguida, voc associa os controles do formulrio ao BindingSource, ligando-os. A partir dessa etapa, todas as interaes do formulrio com os dados feito por meio de chamadas ao componente BindingSource. A navegao e a atualizao do datasource so feitas atravs de mtodos como MoveNext, MoveLast e Remove. Operaes tais como ordenao e filtragem so realizadas atravs das propriedades Sort e Filter. Alm disso, o componente BindingSource pode agir como um data source fortemente tipado, ou seja, um componente que trabalha apenas com o tipo de dados da tabela a ele associada. No caso do nosso formulrio, um tipo referente ao registro da tabela loCategoria foi criado e associado ao BindingSource, de forma que ele est especializado em funcionar com os campos desse registro.

LoCategoriaTableAdaptar executa queries e comandos SQL no banco de dados, trazendo tambm dados do banco para o programa e armazenando-os num objeto da classe DataTable. Tambm so usados para enviar dados atualizados pela aplicao de volta para o banco de dados. TableAdapterManager - fornece a funcionalidade de salvar dados em tabelas relacionadas. Esse componente usa os relacionamentos de chaves estrangeiras que relacionam tabelas de dados para determinar a ordem correta para enviar os Inserts, Updates e Deletes de um dataset para o banco de dados sem violar a integridade referencial (constraints) das chaves estrangeiras no banco de dados.

As constraints de chave estrangeiras so as regras de consistncia em um banco de dados, que controlam o comportamento dos comandos de insero, atualizao e remoo de registros relacionados. So essas constraints que impedem registros pais de serem removidos enquanto registros filhos relacionados ainda existem em outra tabela. O processo geral de salvar dados em tabelas relacionadas, usando um TableAdapterManager chamado de Atualizao Hierrquica. O salvamento de dados modificados originrios de tabelas relacionadas um pouco mais complexo do que salvar dados de uma tabela isolada. Isto ocorre porque os comandos Insert, Update e Delete para cada tabela relacionada devem ser executados em uma ordem especfica

Projeto Conjunto - Departamento de Processamento de Dados COTUCA

17

para evitar a violtao das regras de chaves estrangeiras definidas no banco de dados. Por exemplo, considere uma aplicao de digitao de pedidos com a qual voc pode gerenciar tanto clientes e pedidos j existentes quanto novos. Se voc tiver de remover um registro de cliente j;a existente, primeiro dever remover todos os pedidos desse clilente. Se voc est adicionando um novo registro de cliente (com um pedido), primeiramente voc dever incluir o registro do cliente, antes de inserir os registros de pedidos devido s regras de chave estrangeiras configuradas nas tabelas. O TableAdapterManager ajuda-nos a fazer esse controle. Voltando programao do formulrio, para preencher o TreeView, usaremos o acesso ao banco de dados de forma totalmente programada, para nos habituarmos a essa forma de acesso aos dados e, tambm, nos habituarmos aos eventos e funcionamento do TreeView. Um TreeView formado por vrios TreeNodes ligados de maneira hierrquica, como uma rvore n-ria, de forma que cada n pode ter vrios ns subordinados. Para incluir um n em um TreeView, podemos usar o mtodo Add da coleo Nodes do TreeView. Nodes a rvore propriamente dita, ou a relao de ns que forma a rvore. O mtodo Add possui vrias sobrecargas, mas a que mais nos interessa a que permite criar um n com duas informaes : a chave de identificao e pesquisa desse n, que fica no campo Name do n, e o texto que ser exibido, que seria a descrio do n, e que fica no campo Text do n. Assim, quando precisarmos incluir um novo n na rvore, incluiremos um TreeNode com o mtodo Add, ligando-o ao n atualmente selecionado da rvore, como vemos abaixo: Nodes.Add("chave", "descrio") A chave ser usada para descobrir o n pai de cada novo n que quisermos incluir na rvore, atravs do mtodo Find do TreeView. No cdigo do formulrio frmCategoria, digite as linhas abaixo. As linhas entre quadros j existem e no devem ser modificadas:Imports System.Data Imports System.Data.SqlClient Public Class frmCategoria Dim estaIncluindo As Boolean = False ... Private Sub frmCategoria_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Me.LoCategoriaTableAdapter.Fill(Me.DsLoja2010.loCategoria) atualizarArvoreDeCategorias() ... End Sub Private Sub atualizarArvoreDeCategorias()

No mtodo atualizarArvoreDeCategorias() declaramos uma varivel Nos, que ser um vetor de TreeNodes. Um TreeNode cada um dos ns de um TreeView. Um vetor de TreeNodes ser o resultado da busca dos elementos que vamos incluir na rvore. Declaramos tambm duas variveis string que sero teis para a definio das chaves de cada n da rvore. Em seguida damos incio atualizao do TreeView e o limpamos, com os comandos abaixo:Dim Nos() As TreeNode Dim idCategoria, idCategoriaPai As String tvCategoria.BeginUpdate() tvCategoria.Nodes.Clear()

Projeto Conjunto - Departamento de Processamento de Dados COTUCA

18

Agora devemos percorrer a tabela de categorias, desde o primeiro at seu ltimo registros e, a cada registro, obter o valor do campo idCategoriaPai, para que possamos "encaixar" o registro lido no n superior a ele na rvore:For registro = 0 To Me.DsLoja2010.loCategoria.Rows.Count - 1 Try idCategoriaPai = Convert.ToString(Me.DsLoja2010.loCategoria.Rows( registro).Field(Of Integer)("idCategoriaPai")) Catch ex As Exception idCategoriaPai = "0" End Try

Se voc observar a janela do dataSet dsLoja2010, ver que existe um componente loCategoria, que representa a tabela com os dados de categoria. No comando for acima percorremos todas os seus registros (Rows, linhas) e convertemos, para string, o valor do campo idCategoriaPai.loCategoria.Rows tabela registros ndice (registro).Field (Of Integer) campos tipo do campo ("idCategoriaPai") nome do campo desejado

Agora que sabemos o valor do campo idCategoriaPai, podemos procurar, no TreeView, o n que contm essa chave. Esse n ser o pai do novo n que vamos incluir:Nos = tvCategoria.Nodes.Find(idCategoriaPai, True) 'Encontra pai do n atual

Se o tamanho do vetor Nos for maior que zero, significa que foram encontrados ns cuja chave corresponde a idCategoriaPai. Podemos ento obter o primeiro desses ns (ainda mais porque iremos supor que no h ns com descrio repetida) e este ser o pai do novo n.Try idCategoria = Convert.ToString(Me.DsLoja2010.loCategoria.Rows( _ registro).Field(Of Integer)("idCategoria")) Catch ex2 As Exception idCategoria = "0" End Try If Nos.Length > 0 Then

Nos comandos acima, copiamos, na varivel idCategoria, o valor do campo idCategoria desse registro e verificamos o tamanho do vetor Nos para descobrir se pelo menos um n foi descoberto com a chave igual a idCategoriaPai do novo registro. Em seguida, dentro do if, faremos a incluso de um novo n na rvore, subordinado ao n que acabamos de encontrar, e o novo n ter como chave o idCategoria determinado acima, e sua descrio ser o valor do campo descricaoCategoria do registro lido da tabela:Try Nos(Nos.Length - 1).Nodes.Add(idCategoria, _ Me.DsLoja2010.loCategoria.Rows( registro).Field(Of String)("DescricaoCategoria")) Catch ex3 As Exception MessageBox.Show("Erro na inclusao "+Nos.Length+" idCat="+idCategoria) End Try

Se, por outro lado, o tamanho do vetor Nos for igual a zero, significa que no encontramos um n cuja chave seja igual ao idCategoriaPai da categoria lida da tabela. Isso indica que essa categoria ficar logo no nvel zero do TreeView e que podemos inclu-lo diretamente, como fazemos abaixo:Else tvCategoria.Nodes.Add(idCategoria, _ Me.DsLoja2010.loCategoria.Rows( registro).Field(Of String)("DescricaoCategoria")) End If

Projeto Conjunto - Departamento de Processamento de Dados COTUCA

19

Em seguida, avanamos a leitura dos registros da tabela para o prximo registro, retornamos ao for e, quando este terminar, teremos a atualizao do TreeView completa e podemos encerr-la:Next tvCategoria.EndUpdate() End Sub

O cdigo do mtodo atualizarArvoreDeCategorias, portanto, preenche a rvore a partir dos dados presentes na tabela. Sempre que incluirmos ou excluirmos registros na TABELA, faremos a chamada a esse mtodo, de forma que a tabela, j modificada, ser relida e a rvore ser montada novamente. Vamos agora definir as opes do menu suspenso cmsMenuArvore, como vemos na figura ao lado. No evento onClick da opo Expandir , digite o cdigo abaixo:tvCategoria.SelectedNode.Expand()

No evento onClick da opo Contrair, digite o cdigo abaixo:tvCategoria.SelectedNode.Collapse()

No evento onClick do boto de incluso do componente de navegao entre os registros, digite o cdigo abaixo:estaIncluindo = True

Essa varivel, declarada logo no incio da classe frmCategoria, servir para indicar ao programa se a operao de incluso de novos registros de categoria est sendo realizada. Como quando esse boto clicado, um novo registro ser includo, a varivel recebe true para indicar essa situao. No evento onCLick do boto de excluso de registros, digite o cdigo abaixo:estaIncluindo = False

Quando o mouse for clicado sobre um n da rvore, queremos que os dados referentes a esse n sejam apresentados nos textBoxes direita do formulrio. Isso feito no tratador de evento abaixo, referente ao evento AfterSelect do TreeView:Private Sub tvCategoria_AfterSelect(ByVal sender As System.Object, ByVal e... Dim idCategoria As String = tvCategoria.SelectedNode().Name Try Dim registro As DataRow = Me.DsLoja2010.loCategoria.FindByidCategoria(idCategoria) Dim posicao As Integer = Me.DsLoja2010.loCategoria.Rows.IndexOf(registro) LoCategoriaBindingSource1.Position = posicao Catch MessageBox.Show("Erro de busca: no achou na tabela de dados a categoria selecionada.") End Try End Sub

Acima, obtermos o valor da chave do n selecionado (selecteNode().Name). Usamos esse valor como parmetro para o mtodo FindByIdCategoria da tabela loCategoria, mtodo esse que procurar o registro cujo valor do campo idCategoria igual ao parmetro.

Projeto Conjunto - Departamento de Processamento de Dados COTUCA

20

Em seguida, descobrimos o ndice desse registro na tabela de categorias, usando o mtodo indexOf e passando o registro acessado acima como parmetro. Aps isso, fazemos com que a propriedade Position do loCategoriaBindingSource1, que o componente que vincula os controles de dados tabela, passe a indicar o ndice desse registro. Feito isso, os campos do formulrio sero atualizados com o valor dos campos desse registro. Agora selecione o componente loCategoriaBindingSource1. O evento AddingNew desse componente executado quando um novo registro de dados criado na tabela, de forma que os controles do formulrio vinculados a ela possam ser configurados ou outros tipos de comandos possam ser executados. Quando esse evento for disparado, um novo registro est sendo criado e, assim, o momento correto para colocarmos, no campo idCategoriaPai do novo registro, a chave da categoria qual a nova categoria que estamos incluindo ficar subordinada. Como nem sempre o usurio saber qual essa chave, o fato de o aplicativo colocar seu valor adequadamente no campo far com que erros no ocorram devido a esse campo. O usurio do nosso programa dever digitar apenas a descrio da categoria, pois o primeiro campo (idCategoria) um identity (auto-incremento) e ser definido pelo servidor de banco de dados aps o novo registro ter sido gravado definitivamente em sua tabela. Digite o cdigo abaixo, portanto:DsLoja2010.loCategoria.idCategoriaPaiColumn.DefaultValue= tvCategoria.SelectedNode.Name

Name a propriedade de um TreeNode que contm a chave do item. No comando acima, fazemos com que a chave do n "pai" seja usada como valor do campo idCategoriaPai do novo registro.Private Sub LoCategoriaBindingSource1_AddingNew(ByVal sender As System.Object, ByVal e As System.ComponentModel.AddingNewEventArgs) Handles _ LoCategoriaBindingSource1.AddingNew DsLoja2010.loCategoria.idCategoriaPaiColumn.DefaultValue= tvCategoria.SelectedNode.Name End Sub

No evento onClick do boto que salva os dados inseridos, digite o cdigo abaixo:Private Sub LoCategoriaBindingSource1BindingNavigatorSaveItem_Click(ByVal sender As ... Dim idCategoriaPai = tvCategoria.SelectedNode.Name Me.Validate() Me.LoCategoriaBindingSource1.EndEdit() Me.TableAdapterManager.UpdateAll(Me.DsLoja2010) atualizarArvoreDeCategorias() Dim noPai() As TreeNode = tvCategoria.Nodes.Find(idCategoriaPai, True) noPai(noPai.Length - 1).Expand() estaIncluindo = False End Sub

Assim, sempre que um registro de categoria for includo, haver a atualizao do TreeView. Por fim, no evento onClick da opo do menu cmsMenuArvore, digite o seguinte, para remover o n atualmente selecionado e atualizar o banco de dados de forma a que a tabela fique sem essa categoria. Observe que, antes da remoo, verificado se o n atual possui 0 ns subordinados:Private Sub RemoverToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e ... If tvCategoria.SelectedNode.GetNodeCount(True) = 0 Then Dim idCategoriaPai As String Dim idCategoria As String = tvCategoria.SelectedNode().Name Try Try idCategoriaPai = tvCategoria.SelectedNode.Parent.Name Catch idCategoriaPai = ""

Projeto Conjunto - Departamento de Processamento de Dados COTUCAEnd Try Me.DsLoja2010.loCategoria.Rows.Find(idCategoria).Delete() ' apaga registro da tabela Me.TableAdapterManager.UpdateAll(Me.DsLoja2010) atualizarArvoreDeCategorias() If idCategoriaPai "" Then Dim noPai As TreeNode() = tvCategoria.Nodes.Find(idCategoriaPai, True) noPai(noPai.Length - 1).ExpandAll() End If Catch MessageBox.Show("Erro de excluso: esta categoria ainda possui sub-categorias.") End Try Else MessageBox.Show("Erro de excluso: esta categoria ainda possui sub-categorias.") End If End Sub

21

Selecione o tvCategoria e codifique os dois tratadores de eventos abaixo:Private Sub tvCategoria_NodeMouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles tvCategoria.NodeMouseClick tvCategoria.SelectedNode = e.Node tvCategoria.SelectedNode.Expand() End Sub Private Sub tvCategoria_NodeMouseHover(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeNodeMouseHoverEventArgs) Handles tvCategoria.NodeMouseHover tvCategoria.SelectedNode = e.Node End Sub

Procure testar o programa, corrigir possveis erros. Remova, tambm, o DataGridView e coloque o TreeView na sua posio. Observe as melhorias que poderiam ser feitas no funcionamento, tornando-o mais amigvel, e procure implementar essas melhorias.