Apostila C#.docx

Embed Size (px)

Citation preview

  • 5/25/2018 Apostila C#.docx

    1/48

    C# .NET

    Sistema de Automao Comercial

    Professora Giovana Carla Calsavari Amndola

    Baseada na Apostila DELPHI

    APOSTILA II

    DESENVOLVIMENTO DE APLICAES COMERCIAIS

    Francisco Ferreira da Silva

    Professor Renato Barros

  • 5/25/2018 Apostila C#.docx

    2/48

    INTRODUO

    O objetivo da disciplina de Automao Comercial o desenvolvimento um aplicativo

    comercial onde sero utilizados o leitor de cdigo de barras, a impressora fiscal e uma balana.

    O que orienta essa disciplina?

    A maioria das pessoas que esto fazendo o curso sero programadoras. Essa disciplina

    a base do desenvolvimento para montar um Sistema Comercial. O tipo de sistema que

    permita fazer pedidos, fazer baixa em estoques, fazer crditos, fazer dbitos, gerar relatrios

    comerciais, tudo automaticamente.

    2BANCO DE DADOS

    2.1Introduo

    Um Banco de Dados consiste em uma forma organizada de armazenamento deinformaes, e ainda utiliza muitos dos conceitos dos antigos arquivos de ao. Embora no

    utilizem meios magnticos especiais, esses arquivos tambm contm fichas, que passaram a

    ser denominadas registros, e em cada registro existem diversos campos.

    A Informatizao trouxe uma impressionante reduo do espao necessrio ao

    armazenamento dessas informaes e maior rapidez em consultas e pesquisas.

    Neste curso voc aprender a criar as tabelas do SQL Server 2012 que sero acessadas

    pela nossa aplicao Windows Forms. A opo pelo SQL Server 2012 considera o fato de que

    h uma verso que acompanha o prprio Visual Studio 2012, de que existe um provedor de

    dados para conexo na plataforma .NET, de que a UNILINS, atravs de um convnio com aMicrosoft, disponibiliza licenas de softwares Microsoft para todos os seus alunose de que

    existe uma verso gratuita do SQL Server, o SQL Server Express, que ser utilizado neste

    projeto.

    2.2Criando o Banco de Dados

    O SQL Server tem que estar instalado e rodando no sistema. Para saber se ele est instalado

    verifique:

    Iniciar>Painel de Controle>Programas e Recursos>Microsoft Sql Server 2012 Express LocalDB

    Para acess-lo atravs do Visual Studio 2012, v at o menu VIEW (Visualizar) e acesse a opoSQL Server Object Explorer.

    Para criar o banco de dados, no SQL Server Object Explorer, abra a opo localDB, clique com o

    boto direito do mouse sobre Databases, Add New Database. Coloque o nome da base de

    dados e o caminho onde dever ser salvo o arquivo do seu banco de dados.

    2.3 - Criando as Tabelas

    Pode ser feito de duas formas:

    1 forma: Abrindo a database recm criada, voc ver a pasta Tables. Clique com o boto

    direito do mouse em cima dessa pasta e acesse a opo Add New Table.

  • 5/25/2018 Apostila C#.docx

    3/48

    Em Name, coloque o nome do campo, em DataType o tipo de dados, em Allow Nulls marque a

    opo caso o valor do campo possa ser nulo, desmarque caso contrrio. Campos de chave

    primria nunca podem ser nulos. Em Default voc pode inserir um valor padro para o campo.

    Para criar a chave primria, clique com o boto direito sobre o campo e selecione Set Primary

    Key.

    Para dar um nome sua tabela, altere a primeira linha no painel de script, de CREATETABLE[dbo].[Table] para CREATETABLE[dbo].[Cliente].

    2 forma: Clique com o boto direito do mouse em cima da base de dados e selecione Create

    New Query. Digite o cdigo SQL para a criao da sua tabela e clique em executar ( ).

  • 5/25/2018 Apostila C#.docx

    4/48

    Script das tabelas:

    Cliente

    CREATETABLE[dbo].[Cliente]([Cod_Cli][numeric](10,0)NOTNULL,[Nome_Cli][varchar](100)NULL,[End_Cli][varchar](100)NULL,[Cidade_Cli][char](50)NULL,[UF_Cli][char](2)NULL,

    PRIMARYKEYCLUSTERED(

    [Cod_Cli]ASC

    )WITH (PAD_INDEX =OFF,STATISTICS_NORECOMPUTE =OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS =ON,ALLOW_PAGE_LOCKS =ON)ON[PRIMARY])ON[PRIMARY]

    Produto

    CREATETABLE[dbo].[produto]([cod_prod][numeric](20,0)NOTNULL,[cod_barras][varchar](15)NULL,[desc_prod][varchar](30)NULL,

    [desc_completa][varchar](200)NULL,[valor_prod][numeric](10,2)NULL,

    [qtd_prod][numeric](10,0)NULL,[qtd_min][numeric](10,0)NULL,

    PRIMARYKEYCLUSTERED

  • 5/25/2018 Apostila C#.docx

    5/48

    ([cod_prod]ASC

    )WITH (PAD_INDEX =OFF,STATISTICS_NORECOMPUTE =OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS =ON,ALLOW_PAGE_LOCKS =ON)ON[PRIMARY])ON[PRIMARY]

    3O Sistema

    Para criar o sistema, abra o Visual Studio, v at FILE>New>Project. Selecione Visual

    C#, Windows, Windows Forms Application, d um nome ao seu projeto e escolha o caminho

    onde ele ser salvo.

    Clique em OK.

    Para inserir um novo formulrio, v ao Solution Explorer, clique com o boto direito sobre o

    nome do projeto, Add>New Item> Windows Form. D um nome para o formulrio e clique emOk.

  • 5/25/2018 Apostila C#.docx

    6/48

    D um clique sobre o formulrio e altere suas propriedades na aba Properties.

  • 5/25/2018 Apostila C#.docx

    7/48

    Na propriedade Text coloque o nome do Sistema. Em Start Position, coloque a posio em que

    o formulrio ser aberto.

    Na aba Toolbox, selecione All Windows Forms e arraste o componente Menu Strip para o

    formulrio.

  • 5/25/2018 Apostila C#.docx

    8/48

    Insira os menus clicando sobre o controle.

  • 5/25/2018 Apostila C#.docx

    9/48

    Dando 2 cliques sobre o Menu, voc direcionado para o evento disparado por este controle.

  • 5/25/2018 Apostila C#.docx

    10/48

    Adicione um novo formulrio para o cadastro de clientes e altere suas propriedades.

    Para que este formulrio seja aberto, dentro do evento do clique no menu, insira o seguintecdigo:

    privatevoidclienteToolStripMenuItem_Click(objectsender, EventArgse)

    {

    frmClienteformCliente = newfrmCliente(); //criando o objeto

    formCliente, do tipo frmCliente.

    formCliente.ShowDialog(); //o mtodo ShowDialog no permite que o

    formulrio de baixo seja acessado sem que o formulrio de cima seja fechado.

    }

    Para testar seu programa, primeiro v at a classe Program.cs e coloque o formulrio deabertura do projeto.

  • 5/25/2018 Apostila C#.docx

    11/48

    Para iniciar a execuo, clique em Start ( ).

    Crie um novo formulrio para o cadastro de produtos e repita os passos anteriores para

    acess-lo.

    Criando uma tela de abertura para o programa

    Insira um novo formulrio, selecione a opo CenterScreen para a propriedade StartPosition,

    em ShowInTaskBar, selecione falso, em FormBorderStyle selecione None. Insira controles

    Label, localizados na Toolbox, em Common Controls, arrastando-os para o formulrio.Personalize a tela como quiser. Se quiser inserir imagens, adicione o controle PictureBox e

    insira a imagem na propriedade Image.

  • 5/25/2018 Apostila C#.docx

    12/48

    Para exibir a tela de abertura, volte ao formulrio principal e adicione o componente Timer (Na(aba Toolbox, selecione All Windows Forms). Av nas propriedades e altere o nome do

    componente (propriedade (Name)), Enabled True e Interval 2000 (intervalo em milissegundos

    do timer).

  • 5/25/2018 Apostila C#.docx

    13/48

    Quando o timer iniciado e o intervalo de tempo alcanado, o evento Tick disparado. Para

    codificar o evento Tick, selecione a aba de eventos do componente e d dois cliques sobre o

    evento.

  • 5/25/2018 Apostila C#.docx

    14/48

    Assim que o formulrio principal for aberto, ns iremos escond-lo, abrir a tela de abertura,

    mostra-la por 2 segundos e fech-la, exibindo novamente o formulrio principal. Para isso,

    vamos instanciar o objeto da tela de abertura no construtor do formulrio principal, que oprimeiro mtodo executado quando este formulrio aberto.

  • 5/25/2018 Apostila C#.docx

    15/48

    Como deixamos a propriedade Enabled do timer como True, assim que este formulrio foraberto o timer j comear a contar. Quando o intervalo de tempo for alcanado o evento Tick

    ser disparado e ento fecharemos a tela de abertura e voltaremos ao formulrio principal.

    necessrio parar o timer, seno o evento Tick continuar a ser acessado a cada intervalo de

    tempo.

  • 5/25/2018 Apostila C#.docx

    16/48

    Cadastro de Clientes

    Voltando ao formulrio de cadastro de clientes, vamos criar o layout. Arraste componentes

    Label, TextBox e 2 botes ao formulrio. Coloque os nomes em cada componente e crie seu

    layout de acordo com os campos da tabela Clientes do Banco de Dados.

  • 5/25/2018 Apostila C#.docx

    17/48

    Para inserir o cliente no banco de dados, vamos criar uma Stored Procedure (procedimentoarmazenado). Stored Procedures so semelhantes a subrotinas ou subprogramas

    desenvolvidos em outras linguagens de programao (p.e. C, Pascal, Basic, Java, etc.), mas que

    so guardados no banco de dados. Aceitam parmetros de entrada e retornam resultados. Isto

    , como qualquer subprograma, um procedimento permite a passagem de parmetros de

    entrada e de sada, aceitando valores e devolvendo algum tipo de resultado entidade que o

    invocou, que pode ser um outro procedimento, um gatilho ou mesmo uma aplicao externa.

    So basicamente blocos de instrues SQL compiladas num nico plano de execuo.

    V ao SQL Server Object Explorer, Pogrammability, clique com o boto direito do mouse em

    cima de Stored Procedures, Add New Stored Procedure.

    Adicione o cdigo

    CREATEPROCEDUREdbo.InserirCliente@Cod_Clinumeric(10,0),@Nome_Clivarchar(100),@End_Clivarchar(100),@Cidade_Clichar(50),@UF_Clichar(2)

    ASINSERTINTOdbo.Cliente

    (Cod_Cli,Nome_Cli

    ,End_Cli,Cidade_Cli,UF_Cli)

  • 5/25/2018 Apostila C#.docx

    18/48

    VALUES(@Cod_Cli,@Nome_Cli,@End_Cli,@Cidade_Cli,@UF_Cli)

    Clique em Update e posteriormente em Update Database.

    @Cod_Clinumeric(10,0), @Nome_Clivarchar(100), @End_Clivarchar(100),

    @Cidade_Clichar(50) e @UF_Clichar(2) so os parmetros de entrada doprocedimento.

    Para utilizar este procedimento, utilizaremos o componente DataSet do .NET Framework.V ao Solution Explorer, clique com o boto direito sobre o nome do projeto, Add>New Item>

    DataSet. D um nome para o dataset e clique em Ok.

  • 5/25/2018 Apostila C#.docx

    19/48

    V ao SQL Server Object Explorer, Pogrammability, Stored Procedures e arraste sua stored

    procedure para dentro do dataset.

  • 5/25/2018 Apostila C#.docx

    20/48

    Se quiser, selecione a query e renomeie atravs de suas propriedades. Coloquei o nome de

    Queries pois irei inserir a todos os procedimentos do sistema.

    Voltando ao formulrio de Clientes, dando 2 cliques no boto Salvar, o evento disparado

    pelo clique do boto ser criado. Insira o cdigo de insero do cliente neste evento. Depoisque o cliente foi cadastrado ou ao clicar no boto Cancelar, queremos limpar todo o

    contedo do formulrio. Para isso criamos o mtodo LimparFormulrio, que ser chamadonestas duas ocasies.

  • 5/25/2018 Apostila C#.docx

    21/48

    Devemos, porm, garantir que esse cliente foi salvo no Banco de Dados, e que no houve

    nenhum erro durante o cadastro. Para isso, usaremos o tratamento de excees.

    Tratamento de Excees em C#

    Toda linguagem que se preze, nos fornece meios de tratar uma exceo. O tratamento deexcees algo fundamental para a qualidade de nossos sistemas.

    No C#, o tratamento de excees feito atravs do seguinte bloco de cdigo:try

    {

    //Rotinas a serem executadas por sua aplicao

    }

    catch(Exceptionex){

    //Bloco executado caso ocorra alguma exceo

    }

    finally

    {

    //Bloco sempre executado ao final, independentemente

    //de ter ocorrido erro ou no

    }

    Retornando ao cdigo anterior e inserindo o tratamento de excees:

    privatevoidbtnSalvar_Click(objectsender, EventArgse)

    {try{

  • 5/25/2018 Apostila C#.docx

    22/48

    //Instancianco o objeto da classe QueriesCliente

    dsAutomacaoTableAdapters.Queriesqueries = new

    dsAutomacaoTableAdapters.Queries();

    //Envie os dados digitados no formulrio como parmetros para o

    procedimento armazenado.

    queries.InserirCliente(int.Parse(txtCodigo.Text), txtNome.Text,

    txtEndereco.Text, txtCidade.Text, txtUF.Text);//Exibir mensagem de cadastro efetuado

    MessageBox.Show("Cliente cadastrado com sucesso!", "Sucesso",

    MessageBoxButtons.OK, MessageBoxIcon.Information);

    LimparFormulario();

    }

    catch(Exceptionex)

    {

    MessageBox.Show("No foi possvel realizar o cadastro do cliente.

    Erro: "+ ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);

    }

    }

    Utilize os mesmos passos descritos acima para criar o cadastro de produtos:

    Arrastando o procedimento para dentro do DataSet:

  • 5/25/2018 Apostila C#.docx

    23/48

    No formulrio deixei a propriedade Multiline do textbox Descrio Completa como true.

  • 5/25/2018 Apostila C#.docx

    24/48

    Codificao:

  • 5/25/2018 Apostila C#.docx

    25/48

    Chamando o formulrio a partir do formulrio principal:

  • 5/25/2018 Apostila C#.docx

    26/48

    Fazendo a insero de pedidos:

    Criando um novo formulrio

  • 5/25/2018 Apostila C#.docx

    27/48

    Utilizaremos neste formulrio o componente ComboBox para selecionar o cliente e um

    DataGridView para exibir os produtos do pedido:

  • 5/25/2018 Apostila C#.docx

    28/48

  • 5/25/2018 Apostila C#.docx

    29/48

    Layout do formulrio:

    A primeira coisa que devemos fazer preencher o ComboBox com os clientes cadastrados ecolocar a data atual na data do pedido.

    Para preencher os clientes, vamos colocar a tabela de clientes dentro do DataSet (arraste atabela para dentro do DataSet).

  • 5/25/2018 Apostila C#.docx

    30/48

    O ComboBox possui uma propriedade chamada DataSource onde devemos colocar a fonte de

    dados. No nosso caso, todos os registros da tabela de clientes. Desta vez, ao invs de utilizar omtodo Fill para preencher um DataTable, usaremos o mtodo GetData, que j retorna umDataTable. A propriedade DisplayMember deve ser preenchida com o nome do campo databela de clientes que deve ser exibido. A propriedade ValueMember deve receber o nome docampo da tabela que contm o valor que queremos obter quando um cliente for selecionado(no nosso caso, o cdigo desse cliente).

    Para colocar a data atual na data do pedido, preenchemos a propriedade Text do TextBox comDateTime.Now.ToShortDateString ();. Now uma propriedade de DateTime que recupera adata e hora atuais, e ento utilizamos o mtodo ToShortDateString para recuperar umastring comente com a data em formato curto.

    Para que o cursor fique na caixa de texto que receber o cdigo de barras, utilizamos omtodo Focus(). A leitura desse cdigo ser realizada com o leitor de cdigo de Barras Cipher.

  • 5/25/2018 Apostila C#.docx

    31/48

    Cdigo de barras

    Surgimento do cdigo de barrasA idia do cdigo de barras velha, de 1973/75. A necessidade do cdigo de barras foidevido ao crescimento das vendas.Antes os produtos eram vendidos digitando um cdigo e o preo. Era um tipo de cdigointerno e para um novo produto, era gerado um novo cdigo interno e este fixado no produto.Cada vez que tinha um novo produto, era necessrio inclu-lo no cadastro. Esses produtoseram nicos, no existia uma uniformidade de dados.Ao passar pelo caixa, era preciso digitar o cdigo e o preo. O problema e as conseqnciaseram filas longas e a demora e muitas vezes o cdigo e o preo poderiam ser digitados

    errados.

    Cdigo de barras do tipo UPCO Cdigo de Produto Universal (UPC) foi a primeira simbologia de cdigo de barras adotadapara comrcio. Foi criado em 3 de abril de 1973, nos Estados Unidos, quando a indstria decarnes instituiu oficialmente o cdigo UPC como o cdigo de barras padro para marcar seusprodutos. Interesses estrangeiros no cdigo UPC levaram ao desenvolvimento e adoo deum cdigo similar, o cdigo EAN, em dezembro de 1976.O cdigo UPC Americano composto de 12 dgitos. Usado nos Estados Unidos e no Canad.Somente so usados os campos cdigo da empresa e o cdigo do produto, no tem o cdigodo pas.

  • 5/25/2018 Apostila C#.docx

    32/48

    A partir de 1977, surgiu a Empresa EAN, um grupo que fez a padronizao dos cdigos debarra. Essa padronizao no nova. O inicio foi dado pelos Estados Unidos em 1973. Aps1977, a EAN difundiu sua padronizao para o mundo inteiro e o padro mundial hoje ditadopor ela.

    A empresa EAN foi criada na Europa e estabeleceu o padro utilizado no mundo todo. AAssociao Brasileira de Automao Comercial foi criada em 1994 e atualmente utiliza o nomeEAN Brasil.

    Como os Estados Unidos j tinha seu padro UPC, a EAN difundiu seu cdigo para o restantedo mundo, mas hoje os produtos dos Estados Unidos j usam cdigos EAN.

    Os tipos de cdigos EANExistem vrios tipos de codificao EAN, as principais delas so EAN8, EAN13 e AN14, que sousadas no front de caixa.Outros cdigos como o EAN12, EAN128, no so usados no front de caixa. A maioria dos

    leitores de cdigo de barras no consegue ler o EAN12 e EAN128, necessrio um leitorespecifico. O cdigo EAN128 exige um leitor a laser.O leitor padro o leitor modelo CCD manual (com gatilho) que consiste num equipamentocom um bocal que emite luz proveniente de um conjunto de LEDs. Para fazer a leitura necessrio encostar o bocal do leitor no cdigo de barras. Essa luz ento refletida por umconjunto de lentes at um circuito integrado sensvel luz, semelhante a clulas fotoeltricas,que capta a imagem do cdigo de barras. Os leitores a laser requerem uma certa distancia dabarra, como o caso dos leitores usados em supermercados.Para os cdigos EAN128 existem aparelhos especficos para fazer a leitura porque o alcancetem que ser maior. O EAN128 geralmente usado em grandes volumes.

    O leitor de cdigo de barras normalmente usado em conjunto com o teclado.

    No h diferena na programao, seja para os leitores de cdigos comuns (front de caixa) eleitores a laser que requerem uma distncia para efetuar leitura. Os hardwares so usadospara a mesma funo - ler cdigos de barras. Quando passamos o leitor em cima do cdigo debarras a mesma coisa que digitar o valor no teclado.

    O Padro EANEAN-8 tem 8 dgitos.EAN-13 tem 13 dgitos.EAN-14tem 14 dgitos.

    EAN-128

    um caso particular

    O EAN-8 usado para embalagens pequenas mas este cdigo em relao ao preo muitocaro em termos de custos.

    O padro utilizado na grande maioria dos produtos expostos venda o EAN-13.(fig 24).

    6.5 - Definio do cdigoO cdigo EAN definido da seguinte forma:- uma margem branca para comear o cdigo a partir dele - uma margem sem nenhumanumerao.

  • 5/25/2018 Apostila C#.docx

    33/48

    Figura 24Exemplo de cdigo EAN-13

    - um cdigo de incio. Aps isso localiza o primeiro cdigo que o numero 6. Este numeroindica o inicio da leitura e no est representado numericamente para no confundir nadigitao. No meio do cdigo tem outro nmero 6 e no final tem outro numero para finalizara String e saber que foi feita a leitura inteira do cdigo.

    Quanto compra de um cdigo de barras necessrio entrar em contado com a EAN Brasil,filiar-se empresa e obter o cdigo. O taxa de uso paga anualmente e mais a filiao pela

    primeira vez.

    O funcionamento do cdigo de barraO cdigo de barras um smbolo composto de barras paralelas de largura e espaamentovariveis. Depende muito da variao do espaamento para produzir um cdigo diferente.

    Os padres mais importantes so: EAN-8, EAN-13, EAN-14, EAN-128, o UPC americano, o 2 de5 e o 3 de 9

    A leitura das barras feita da direita para a esquerda.

    Quando a luz incide no cdigo, tudo que for branco ou refletir luz ser interpretado comodigito 1 e as barras que no emitirem luz sero interpretadas como digito 0. Estacodificao feita em bit.

    Utilizadas para gerenciamento do controle de Estoque, principalmente quando se tem umvolume muito grande de dados. No sistema financeiro, na parte de caixa, pagamento debancos.

    Ao utilizar o cdigo de barras no necessria a etiquetao de produto a produto. Anteseram usados o cdigo do produto e o preo e muitas vezes quando o preo do produto eraalterado, tinha que ser alterado na gndola o preo das etiquetas. Na utilizao do cdigo de

    barras podemos controlar qualquer alterao de preo diretamente no caixa. Geralmente nose troca o preo no perodo de funcionamento de uma empresa, mas sim durante noite.

    A representao dos campos do cdigo EANOs trs primeiros dgitos do cdigo EAN representa o pais, por exemplo o Brasil o 789 e cadapas tem um nmero codificado. Com isso podemos saber a origem de determinado produto.

    OBS: O cdigo do pas necessariamente no indica que a origem do produto seja daquele pas,mas sim registrado.

    Os prximos quatro ou cinco dgitos representam o cdigo da empresa. Neste caso existem

    dois tipos de cdigo de barras - um de 4 e outro de 5 dgitos que representam a empresa.Exemplo: uma empresa como a Nestl que tem uma linha de produtos muito grande registrouno Brasil com o cdigo 789 (do pas). Quatro dgitos para representar a empresa e cinco dgitos

  • 5/25/2018 Apostila C#.docx

    34/48

    para representar o produto (numa representao de at 100.000 produtos) que socomeados pelo 0 at 99.999 unidades.

    Ao comprar um cdigo de barras com 5 dgitos para a empresa, permitimos para o cdigo doproduto uma faixa de at 9.999 unidades (10.000 produtos).

    Se o cdigo de barras conter 5 dgitos para a empresa, permitimos que o cdigo do produto vat 9.999 unidades. Se ocupar mais espao para o cdigo da empresa sobra menos espaopara o cdigo do produto.

    O cdigo que usa somente quatro dgitos para o cdigo da empresa o mais caro egeralmente comea com o nmero 1. Se o cdigo comea com um (1) ento uma dasempresa que pode ir at 99.999 cdigos para representar os produtos.

    Por ltimo, temos o digito verificador que confirma se o nmero da barra foi lidocorretamente.

    As barras das extremidades e central so iguais e obrigatrias em todos os cdigos.

    Margem de Silncio - o espao em branco antes de comear o cdigo que contm os dados.Se tiver uma margem escura ou um quadro antes de comear as barras, aqueles sointerpretados como se fizessem parte do cdigo, ento para evitar isso necessrio um espaoem branco antes de comear o cdigo - a margem de silencio.

    As combinaes de corres.Os Cdigos de Barras tem que ter as combinaes de corres corretas:

    Barra FundoPreto e BrancoAzul Escuro e AmareloMarrom e VermelhoVerde Escuro e Rosa

    No funcionam as combinaes de cores de cdigo fora do padro especificado pela EAN. Oideal para um cdigo de barras a impresso de barras pretas em fundo branco.

    Margem clara, caractere que representa o incio (seis caracteres para codificar tabela A ou B, ocdigo da empresa representada por 4 ou 5 caracteres, o caractere central, 4 ou 5 caracteres

    que representam o cdigo do produto, o digito verificador e por ltimo o caractere de guardaque ao final indica que terminou o cdigo de barras.

    A compra do cdigo de barras fornecida com o cdigo do pas e o cdigo da empresa, anumerao correspondente ao produto gerada pela prpria empresa, seqencial para cadaproduto. Para cada produto, um novo cdigo.

    Se uma empresa comprar outra empresa, ter que manter o cdigo da empresa comprada (ocdigo de barras) porque ainda existem produtos dessa empresa expostos venda emestabelecimentos comerciais que ainda no foram vendidos ao consumidor final.

    Durao do Cdigo de barras.O cdigo de barras de um produto que teve sua fabricao suspensa, no pode ser reutilizadopara outro produto.

  • 5/25/2018 Apostila C#.docx

    35/48

    Exemplo: A reutilizao do cdigo de barras para produtos comestveis em media de um adois anos para permitir que o estoque venda seja esgotado. Para os produtos nocomestveis, pelo menos cinco anos.

    Quando terminar o perodo, podemos reutilizar o cdigo mas necessrio informar s

    empresas consumidoras que o produto referente quele cdigo no existe mais e foireutilizado para outro produto, assim essas empresas podem atualizar o cadastro referente aesse cdigo de barras em seu sistema (banco de dados).

    O prazo de cinco anos necessrio para manter durante esse tempo um arquivo fiscal de tudoque foi vendido na empresa.

    Se tiver um produto que foi modificado, por exemplo a frmula, contedo, embalagem, etc,ter que ser gerado um novo nmero. Pode acontecer de ser colocado uma quantidade a maise grtis numa embalagem, ento no necessrio trocar o cdigo do produto, porque noest sendo cobrado esse contedo a mais.

    Cdigo de barras do tipo EAN8

    O cdigo de barras do tipo EAN8 foi desenvolvido a partir do EAN13. Na verdade ele umaverso compacta do EAN13 visando embalagens pequenas, como cigarros, caixa de fsforos,lpis, canetas, etc. A diferena para o EAN13 est no mtodo de codificao e no menornmero de caracteres de dados. Neste formato no existe o cdigo do fabricante, s tem ocdigo do pas, o cdigo do produto e o digito verificador. Veja no exemplo abaixo como ocdigo de barras EAN8 bem menor que o EAN13:Exemplo: Para o EAN13 tem o seguinte cdigo:

    789 4401 00004 1Figura 25Exemplo de cdigo de barras EAN-13

    7894401000041 o cdigo completo789 cdigo do pas - Brasil4401 cdigo do fabricante00004 cdigo do produto1 dgito verificador

    Para codificar a mesma fita utilizando o cdigo EAN8, o smbolo gerado ficaria bem mais

    compacto. Exemplo abaixo:

    789 0004 1Figura 26Exemplo de cdigo de barras EAN-8

    789 0004 1 o cdigo completo789 cdigo do pas - Brasil0004 cdigo do produto1 dgito verificador

    O cdigo que identifica o fabricante omitido e o cdigo do produto fica com quatro casas em

    vez de cinco. Com isto o cdigo utilizado fica com oito dgitos em vez de treze. O smbologerado fica mais compacto.

  • 5/25/2018 Apostila C#.docx

    36/48

    Quando for necessrio usar o cdigo EAN-8, compra-se um nico cdigo, individualmente. Sexistem 10.000 cdigos disponveis pela EAN que verificar antes de tudo se no possvelcolocar um cdigo EAN-13.

    Cdigo ISBN(International Standard Book Number) impressos em livros. Tornou-se padro naidentificao internacional de livros. um padro de 13 dgitos tambm, com trs dgitosiniciais identificando que o produto se trata de um livro (978 ou 979), seguido da numeraoISBN (nove dgitos) e o dgito de verificao.

    Cdigo ESSNCdigo serial para publicaes de peridicos Comea com 977 e depois o nmero doperidico. No precisa fazer o controle de qual o pas.

    Cdigo EAN-14

    Usado para serem usados em embalagem que contm mais de uma unidade. O EAN-14 omesmo EAN-13 com um dgito a mais no incio. Os 13 dgitos do prprio cdigo e o dgito amais representa de que forma esta sendo vendido o produto, representa a quantidade nolote.Ex:1Embalagem com 6 unidades.2Embalagem com 12 unidades.3Embalagem com 24 unidades.

    Esse cdigo permite vender produtos em lote com at 9 tipos de quantidade.

    Sua localizao padro geralmente em embalagem de plstico em cima desta embalagem.

    Cdigo de uso internoPara venda de produtos, por exemplo hortifrutigranjeiros e aougues. Todo cdigo de usointerno tambm tem 13 dgitos. A diferena est no primeiro dgito:- Sempre comea com 2uso interno reservado.- O prximo dgito indica o tipo de cobrana a ser feito se por peso ou por preo. Porexemplo: 0 para peso e 1 para preo.- Depois o cdigo do produto com 5 dgitos para especificar o produto.- Mais cinco dgitos para representar a quantidade ou o peso.- E o digito verificador.

    Quando o produto vendido por peso, o peso mximo que podemos vender 99.999 gramas(100 quilos). Para o cdigo do produto100.000 produtos disponveis.Se for vendido por preo, o processo o mesmo, o que muda o segundo dgito querepresenta o preo. O valor mximo que podemos representar R$ 999,99 reais.Geralmente os aougues trabalham com preo.

    Se um produto muda muito o preo, por exemplo, produtos importados, geralmente usamoscolocar o peso, porque s alterar no sistema o peso e no preciso remarcar o cdigo debarras.

    Produtos que no so vendidos com facilidade podem ter seu cdigo de barras colocados por

    preo.

    Localizao do Cdigo de barras

  • 5/25/2018 Apostila C#.docx

    37/48

    A etiqueta ou impresso do cdigo de barras colocada de preferncia e seguindo umapadronizao no canto esquerdo ou direito inferior.- Produtos na promoo: Se for vendida duas unidades na promoo necessrioembala-las numa nica unidade para colocar outro cdigo de barras, para que as barras dasunidades no fiquem expostas com o risco de serem lidas ao passar pelo caixa.

    Clculo do dgito verificador no EAN-13.Como calcular o ltimo nmero que analisa se o cdigo est certo ou errado?Vamos tomar por base o cdigo de nmero:7 8 9 1 0 1 0 2 2 0 0 9

    789 nmero que representa o Brasil.1010 representa o fabricante22009 representa o produto

    Obs: O nmero 22009, no significa que tem 22.000 produtos porque pode ser que um ou

    mais produtos saiam de linha e no permitido usar esses cdigos enquanto no vencer oprazo estabelecido em Lei.

    O calculo do dgito verificador feito da seguinte forma neste cdigo:Numere cada caractere do cdigo, da esquerda para a direita.Ex:

    7 8 9 1 0 1 0 2 2 0 0 9 ?

    13 12 11 10 9 8 7 6 5 4 3 2 1

    1) - Soma-se todos os nmeros que esto nas posies mpares a partir da posio 3:0 + 2 + 0 + 0 + 9 + 7 = 18

    2) - Soma-se todas as posies pares:9 + 0 + 2 + 1 + 1 + 8 = 21

    3) - O nmero que foi obtido no passo 2 (pares) deve ser multiplicado por 3:21 X 3 = 63

    4) - Soma-se o valor do passo 1 (18) com o valor do nmero obtido no passo 3 (63):18 + 63 = 81

    5) - Obtenha o mltiplo de 10 maior que o nmero do passo 4 (81)Mltiplo de 10 > 81 = 90

    6) - Faa a subtrao do nmero obtido (90) do nmero do passo 4 (81):90 - 81 = 9

    O nmero 9 o dgito verificador do cdigo acima.

    O cdigo de barras representa os dgitos binrios 0 e 1, determinados pela espessura das

    barras. Cada barra preta ou branca representa um nico dgito.J existem componentes que geram o cdigo de barras.A impresso ideal de cdigo de barras feita em impressora laser.

  • 5/25/2018 Apostila C#.docx

    38/48

    No cdigo EAN 128 pode ser codificadas letras que permita colocar a descrio do produto,por exemplo.Nos Estados Unidos temos um microship em teste para ser usado no lugar do cdigo de barras.A inveno atende pelo nome de Radio Frequency Identification (RFID), que em portugussignifica "Identificao por Radiofreqncia". Dentro de pouco tempo, esta tecnologia ser to

    familiar quanto o prprio carrinho de supermercado. Alm disso, estar presente em umainfinidade de produtos, de pizzas congeladas e refrigerantes a CDs e televisores.A RFID, que est cada vez mais difundida, se caracteriza por um microcircuito eletrnico quearmazena informaes sobre todos os tipos de objetos, e at de animais. Permite, alm disso,a localizao destes em poucos segundos, e a transmisso de seus dados a um dispositivoreceptor situado a poucos metros ou a vrios quilmetros de distncia.

    Voltando ao projeto:Quando o leitor termina a leitura de um cdigo de barras, ele envia um sinal de Enter, quecorresponde a pressionar a tecla Enter do teclado.Para fazer o processamento deste cdigo

    de barras devemos verificar se a tecla Enter foi pressionada dentro do TextBox de leitura docdigo de barras.

    Ns s buscaremos o produto na base de dados caso a leitura tenha sido feita corretamente.Para isso, faremos a validao do Dgito Verificador.

    Para criar uma classe que faa essa validao, v ao Solution Explorer, clique com o boto

    direito sobre o nome do projeto, Add>New Item> Class. D um nome para a classe e clique em

    Ok.

  • 5/25/2018 Apostila C#.docx

    39/48

    Criaremos, dentro desta classe, um mtodo que receba um cdigo de barras e retorne um

    valor booleano (verdadeiro ou falso), indicando se o dgito verificador vlido ou no.

    publicboolvalidarDigitoCodigoBarras(stringcodigoBarras){

    //Inicialmente atribumos "falso" varivel booleana DVvalido

    boolDVvalido = false;

    char[] vetorCodigoBarras = codigoBarras.ToArray();

    char[] vetorOrganizado = newchar[14];

    //Aplicamos os clculos necessrios para a validao do cdigo de

    barrasfor(intindice = 0; indice < vetorCodigoBarras.Length; indice++)

    {

    intnovoIndice = 13 - indice;

    vetorOrganizado[novoIndice] = vetorCodigoBarras[indice];

    }

    intsomaPosicoesPares = 0;

    intsomaPosicoesImpares = 0;

    for(inti = 2; i < vetorOrganizado.Length; i++){

    intresto = 0;

    Math.DivRem(i, 2, outresto);

    if(resto == 0)

    {

  • 5/25/2018 Apostila C#.docx

    40/48

    somaPosicoesPares +=

    int.Parse(vetorOrganizado[i].ToString());

    }

    else

    {

    somaPosicoesImpares +=

    int.Parse(vetorOrganizado[i].ToString());}

    }

    intmultiplicacaoPares = somaPosicoesPares * 3;

    intsomaImpares = multiplicacaoPares + somaPosicoesImpares;

    intmultiploDeDez = 10;

    while(multiploDeDez < somaImpares)

    {

    multiploDeDez += 10;

    }

    intDV = multiploDeDez - somaImpares;

    //caso o dgito seja vlido, atribui o valor true varivel DVvalido

    //caso contrrio no necessrio fazer nada, visto que a varivel j

    possui o valor falso

    if(DV == int.Parse(vetorOrganizado[1].ToString()))

    DVvalido=true;

    //retorna o valor da varivel

    returnDVvalido;

    }

    Para buscar o produto correspondente ao cdigo de barras lido, criaremos o procedimentoarmazenado BuscarProdutoPorCodigoBarra e o adicionaremos ao DataSet.

    CREATEPROCEDURE[dbo].[BuscarProdutoPorCodigoBarra]@codigoBarravarchar(15)

    ASSELECT*fromdbo.produtowherecod_barras=@codigoBarra

    Iremos programar o evento KeyUp. V aos eventos do TextBox e d dois cliques em KeyUp.

  • 5/25/2018 Apostila C#.docx

    41/48

    Caso o DV seja vlido, buscaremos o produto no banco de dados:

  • 5/25/2018 Apostila C#.docx

    42/48

    Caso nosso DataTable possua quantidade de linhas diferente de 0, sinal de que resultados

    foram retornados. Caso contrrio, nenhum produto com esse cdigo de barras foi encontrado,ento daremos um aviso ao usurio. Em qualquer dos dois casos, devemos apagar o contedolido no textbox do cdigo de barras e retornar o cursor ele para a prxima leitura.

    Caso o produto esteja na base de dados, faremos a insero dele no pedido.

    Utilizaremos 2 tabelas para a insero do pedido. A tabela com os dados do pedido e a tabela

    com os itens do pedido.

    Script dessas tabelas:

    CREATETABLE[dbo].[pedido](

    [cod_ped][numeric](10,0)NOTNULL,[data_ped][date]NULL,[cod_cli][numeric](10,0)NOTNULL,

    PRIMARYKEYCLUSTERED

    ([cod_ped]ASC

    )WITH (PAD_INDEX =OFF,STATISTICS_NORECOMPUTE =OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS =ON,ALLOW_PAGE_LOCKS =ON)ON[PRIMARY])ON[PRIMARY]

    GO

    ALTERTABLE[dbo].[pedido] WITHCHECKADDFOREIGNKEY([cod_cli])

    REFERENCES[dbo].[Cliente]([Cod_Cli])

  • 5/25/2018 Apostila C#.docx

    43/48

    CREATETABLE[dbo].[itens]([cod_ped][numeric](10,0)NOTNULL,[cod_prod][numeric](20,0)NOTNULL,[valor_prod][numeric](10,2)NOTNULL,[qtd_prod][numeric](10,0)NULL,

    PRIMARYKEYCLUSTERED

    ( [cod_ped]ASC,[cod_prod]ASC

    )WITH (PAD_INDEX =OFF,STATISTICS_NORECOMPUTE =OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS =ON,ALLOW_PAGE_LOCKS =ON)ON[PRIMARY])ON[PRIMARY]

    GO

    ALTERTABLE[dbo].[itens] WITHCHECKADDFOREIGNKEY([cod_ped])REFERENCES[dbo].[pedido]([cod_ped])GO

    ALTERTABLE[dbo].[itens] WITHCHECKADDFOREIGNKEY([cod_prod])REFERENCES[dbo].[produto]([cod_prod])

    Criando o DataTable dos itens do pedido:

  • 5/25/2018 Apostila C#.docx

    44/48

    Inserimos cada produto encontrado no DataTable de itens do pedido e exibimos no

    DataGridView.

  • 5/25/2018 Apostila C#.docx

    45/48

    Agora devemos salvar o pedido no banco de dados.

    Criaremos 2 procedimentos armazenados. Um para armazenar o pedido e outro para

    armazenar os itens do pedido.

    CREATEPROCEDUREdbo.InserirPedido@cod_pednumeric(10,0),@data_peddate,@cod_clinumeric(10,0)

    AS

    INSERTINTOdbo.pedido(cod_ped,data_ped,cod_cli)

    VALUES(@cod_ped,@data_ped,@cod_cli)

    CREATEPROCEDUREdbo.InserirItemPedido@cod_pednumeric(10,0),

    @cod_prodnumeric(20,0),

    @valor_prodnumeric(10,2),@qtd_prodnumeric(10,0)

    AS

  • 5/25/2018 Apostila C#.docx

    46/48

    INSERTINTO dbo.itens(cod_ped,cod_prod,valor_prod,qtd_prod)

    VALUES

    (@cod_ped,@cod_prod,@valor_prod,@qtd_prod)

    Desta vez no utilizaremos o objeto DataSet para executar os procedimentos

    armazenados. Faremos a implementao por linha de comando pois utilizaremos o conceito

    de transaes de banco de dados para fazer as inseres.

    Todo pedido deve conter itens. Caso a insero de um pedido seja feita e, por algum

    erro ou falha algum item no seja inserido, no h interesse em manter esse pedido em banco

    de dados, e uma mensagem de falha deve ser exibida.

    Uma transao uma seqncia de operaes executadas como uma nica unidade

    lgica de trabalho. Uma unidade lgica de trabalho deve mostrar quatro propriedades,

    designadas pelas iniciais ACID (atomicidade, consistncia, isolamento e durabilidade), para que

    seja qualificada como uma transao.

    Atomicidade

    Uma transao deve ser uma unidade atmica de trabalho; ou todas as suas

    modificaes de dados so executadas ou nenhuma delas executada.

    Consistncia

    Quando concluda, uma transao deve deixar todos os dados em um estado

    consistente. Em um banco de dados relacional, todas as regras devem ser aplicadas s

    modificaes da transao para manter toda a integridade dos dados. Todas as estruturas de

    dados internas, tais como ndices em rvore B ou listas duplamente vinculadas, devem estar

    corretas ao trmino da transao.

    Isolamento

    Modificaes feitas por transaes simultneas devem ser isoladas das modificaes

    feitas por qualquer outra transao simultnea. Uma transao reconhece os dados no estadoem que estavam antes de outra transao simultnea t-los modificado ou reconhece os

    dados depois que a segunda transao tiver sido concluda, mas no reconhece um estado

    intermedirio. Isso chamado serializabilidade porque resulta na capacidade de recarregar os

    dados iniciais e reexecutar uma srie de transaes de modo que os dados obtidos estejam no

    mesmo estado em que estavam depois que as transaes originais foram executadas.

    Durabilidade

    Depois que uma transao tiver sido concluda, seus efeitos ficam permanentemente

    no sistema. As modificaes persistem at mesmo no caso de uma queda do sistema.

    Para salvar o pedido, criaremos a classe pedido.cs e implementaremos o mtodoInserirPedido nela.

  • 5/25/2018 Apostila C#.docx

    47/48

    Ao clicar no boto salvar, devemos chamar este mtodo e enviar os parmetros

    necessrios.

    Para implementar a transao, utilizaremos a classe SqlTransaction.

    Veja como fica o cdigo do mtodo:

    publicvoidInserirPedido(intcod_ped, DateTimedata_ped,

    intcod_cli, DataTabledtItensPedido)

    {

    //Cria uma conexo com o banco de dados com uma string de conexo

    SqlConnectionconexao = newSqlConnection

    (@"Data Source=(localdb)\Projects;Initial

    Catalog=automacao;Integrated Security=True;Connect Timeout=30");

    //Abre a conexo

    conexao.Open();

    //Inicia uma transao com esta conexoSqlTransactiontrans = conexao.BeginTransaction();

    try

    {

    //Insere o pedido

    SqlCommandcommand = newSqlCommand("dbo.InserirPedido",

    conexao);

    command.Transaction = trans;

    command.CommandType = CommandType.StoredProcedure;

    command.Parameters.Add("@cod_ped", SqlDbType.Int);command.Parameters["@cod_ped"].Value = cod_ped;

    command.Parameters.Add("@data_ped", SqlDbType.Date);command.Parameters["@data_ped"].Value = data_ped;

    command.Parameters.Add("@cod_cli", SqlDbType.Int);

  • 5/25/2018 Apostila C#.docx

    48/48

    command.Parameters["@cod_cli"].Value = cod_cli;

    command.ExecuteNonQuery();

    //Insere cada um dos itens do pedido

    for(inti = 0; i < dtItensPedido.Rows.Count; i++)

    { SqlCommandcmdInserirItens = new

    SqlCommand("dbo.InserirItemPedido", conexao);

    cmdInserirItens.CommandType = CommandType.StoredProcedure;

    cmdInserirItens.Transaction = trans;

    cmdInserirItens.Parameters.Add("@cod_ped", SqlDbType.Int);

    cmdInserirItens.Parameters["@cod_ped"].Value = cod_ped;

    cmdInserirItens.Parameters.Add("@cod_prod", SqlDbType.Int);

    cmdInserirItens.Parameters["@cod_prod"].Value =

    dtItensPedido.Rows[i]["cod_prod"];

    cmdInserirItens.Parameters.Add("@valor_prod",

    SqlDbType.Decimal);

    cmdInserirItens.Parameters["@valor_prod"].Value =

    dtItensPedido.Rows[i]["valor_prod"];

    cmdInserirItens.Parameters.Add("@qtd_prod", SqlDbType.Int);cmdInserirItens.Parameters["@qtd_prod"].Value =

    dtItensPedido.Rows[i]["qtd_prod"];

    cmdInserirItens.ExecuteNonQuery();

    }

    //Se no ocorreu nenhum erro, confirma a insero dos dados

    trans.Commit();

    }

    catch(Exceptionex)

    {

    //Se ocorreu algum erro, desfaz a insero dos dados

    trans.Rollback();

    //Lana a exceo para o objeto que chamou este mtodothrowex;

    }

    finally

    {

    //Independente de ter ocorrido sucesso ou falha, devemos fechar a

    conexo com o banco de dados

    conexao.Close();}

    }