Вы находитесь на странице: 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








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.
2 BANCO DE DADOS
2.1 Introduo
Um Banco de Dados consiste em uma forma organizada de armazenamento de
informaes, 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 a
Microsoft, 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.2 Criando 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 opo
SQL 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.
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 CREATE TABLE
[dbo].[Table] para CREATE TABLE [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 ( ).

Script das tabelas:

Cliente
CREATE TABLE [dbo].[Cliente](
[Cod_Cli] [numeric](10, 0) NOT NULL,
[Nome_Cli] [varchar](100) NULL,
[End_Cli] [varchar](100) NULL,
[Cidade_Cli] [char](50) NULL,
[UF_Cli] [char](2) NULL,
PRIMARY KEY CLUSTERED
(
[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

CREATE TABLE [dbo].[produto](
[cod_prod] [numeric](20, 0) NOT NULL,
[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,
PRIMARY KEY CLUSTERED
(
[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]


3 O 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 em
Ok.



D um clique sobre o formulrio e altere suas propriedades na aba Properties.
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.

Insira os menus clicando sobre o controle.

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



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 seguinte
cdigo:

private void clienteToolStripMenuItem_Click(object sender, EventArgs e)
{
frmCliente formCliente = new frmCliente(); //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 de
abertura do projeto.


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.


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).




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.

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 o
primeiro mtodo executado quando este formulrio aberto.


Como deixamos a propriedade Enabled do timer como True, assim que este formulrio for
aberto 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.



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.



Para inserir o cliente no banco de dados, vamos criar uma Stored Procedure (procedimento
armazenado). 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
CREATE PROCEDURE dbo.InserirCliente
@Cod_Cli numeric(10,0),
@Nome_Cli varchar(100),
@End_Cli varchar(100),
@Cidade_Cli char(50),
@UF_Cli char(2)
AS
INSERT INTO dbo.Cliente
(Cod_Cli
,Nome_Cli
,End_Cli
,Cidade_Cli
,UF_Cli)
VALUES
(@Cod_Cli,
@Nome_Cli,
@End_Cli,
@Cidade_Cli,
@UF_Cli)
Clique em Update e posteriormente em Update Database.


@Cod_Cli numeric(10,0), @Nome_Cli varchar(100), @End_Cli varchar(100),
@Cidade_Cli char(50) e @UF_Cli char(2) so os parmetros de entrada do
procedimento.

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.

V ao SQL Server Object Explorer, Pogrammability, Stored Procedures e arraste sua stored
procedure para dentro do dataset.

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. Depois
que 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 chamado
nestas duas ocasies.


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 de
excees 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 (Exception ex)
{
//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:

private void btnSalvar_Click(object sender, EventArgs e)
{
try
{
//Instancianco o objeto da classe QueriesCliente
dsAutomacaoTableAdapters.Queries queries = 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 (Exception ex)
{
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:




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


Codificao:


Chamando o formulrio a partir do formulrio principal:


Fazendo a insero de pedidos:

Criando um novo formulrio


Utilizaremos neste formulrio o componente ComboBox para selecionar o cliente e um
DataGridView para exibir os produtos do pedido:



Layout do formulrio:



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

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


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 o
mtodo Fill para preencher um DataTable, usaremos o mtodo GetData, que j retorna um
DataTable. A propriedade DisplayMember deve ser preenchida com o nome do campo da
tabela de clientes que deve ser exibido. A propriedade ValueMember deve receber o nome do
campo 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 com
DateTime.Now.ToShortDateString();. Now uma propriedade de DateTime que recupera a
data e hora atuais, e ento utilizamos o mtodo ToShortDateString para recuperar uma
string comente com a data em formato curto.

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




Cdigo de barras

Surgimento do cdigo de barras
A idia do cdigo de barras velha, de 1973/75. A necessidade do cdigo de barras foi
devido ao crescimento das vendas.
Antes os produtos eram vendidos digitando um cdigo e o preo. Era um tipo de cdigo
interno 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 produtos
eram nicos, no existia uma uniformidade de dados.
Ao passar pelo caixa, era preciso digitar o cdigo e o preo. O problema e as conseqncias
eram filas longas e a demora e muitas vezes o cdigo e o preo poderiam ser digitados
errados.

Cdigo de barras do tipo UPC
O Cdigo de Produto Universal (UPC) foi a primeira simbologia de cdigo de barras adotada
para comrcio. Foi criado em 3 de abril de 1973, nos Estados Unidos, quando a indstria de
carnes instituiu oficialmente o cdigo UPC como o cdigo de barras padro para marcar seus
produtos. Interesses estrangeiros no cdigo UPC levaram ao desenvolvimento e adoo de
um 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 cdigo
do pas.

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

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

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

Os tipos de cdigos EAN
Existem vrios tipos de codificao EAN, as principais delas so EAN8, EAN13 e AN14, que so
usadas 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 leitor
especifico. O cdigo EAN128 exige um leitor a laser.
O leitor padro o leitor modelo CCD manual (com gatilho) que consiste num equipamento
com 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 um
conjunto 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 da
barra, como o caso dos leitores usados em supermercados.
Para os cdigos EAN128 existem aparelhos especficos para fazer a leitura porque o alcance
tem 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) e
leitores a laser que requerem uma distncia para efetuar leitura. Os hardwares so usados
para a mesma funo - ler cdigos de barras. Quando passamos o leitor em cima do cdigo de
barras a mesma coisa que digitar o valor no teclado.

O Padro EAN
EAN-8 tem 8 dgitos.
EAN-13 tem 13 dgitos.
EAN-14 tem 14 dgitos.
EAN-128 um caso particular

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

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

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


Figura 24 Exemplo de cdigo EAN-13

- um cdigo de incio. Aps isso localiza o primeiro cdigo que o numero 6. Este numero
indica o inicio da leitura e no est representado numericamente para no confundir na
digitao. No meio do cdigo tem outro nmero 6 e no final tem outro numero para finalizar
a 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 barra
O cdigo de barras um smbolo composto de barras paralelas de largura e espaamento
variveis. 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 de
5 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 como
digito 1 e as barras que no emitirem luz sero interpretadas como digito 0. Esta
codificao feita em bit.

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

Ao utilizar o cdigo de barras no necessria a etiquetao de produto a produto. Antes
eram usados o cdigo do produto e o preo e muitas vezes quando o preo do produto era
alterado, 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 no
se troca o preo no perodo de funcionamento de uma empresa, mas sim durante noite.

A representao dos campos do cdigo EAN
Os trs primeiros dgitos do cdigo EAN representa o pais, por exemplo o Brasil o 789 e cada
pas 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 registrou
no Brasil com o cdigo 789 (do pas). Quatro dgitos para representar a empresa e cinco dgitos
para representar o produto (numa representao de at 100.000 produtos) que so
comeados pelo 0 at 99.999 unidades.

Ao comprar um cdigo de barras com 5 dgitos para a empresa, permitimos para o cdigo do
produto 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 v
at 9.999 unidades. Se ocupar mais espao para o cdigo da empresa sobra menos espao
para o cdigo do produto.

O cdigo que usa somente quatro dgitos para o cdigo da empresa o mais caro e
geralmente comea com o nmero 1. Se o cdigo comea com um (1) ento uma das
empresa 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 lido
corretamente.

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 so
interpretados como se fizessem parte do cdigo, ento para evitar isso necessrio um espao
em 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 Fundo
Preto e Branco
Azul Escuro e Amarelo
Marrom e Vermelho
Verde Escuro e Rosa

No funcionam as combinaes de cores de cdigo fora do padro especificado pela EAN. O
ideal 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, o
cdigo 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 guarda
que 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, a
numerao correspondente ao produto gerada pela prpria empresa, seqencial para cada
produto. Para cada produto, um novo cdigo.

Se uma empresa comprar outra empresa, ter que manter o cdigo da empresa comprada (o
cdigo de barras) porque ainda existem produtos dessa empresa expostos venda em
estabelecimentos 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 reutilizado
para outro produto.
Exemplo: A reutilizao do cdigo de barras para produtos comestveis em media de um a
dois anos para permitir que o estoque venda seja esgotado. Para os produtos no
comestveis, 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 foi
reutilizado para outro produto, assim essas empresas podem atualizar o cadastro referente a
esse cdigo de barras em seu sistema (banco de dados).

O prazo de cinco anos necessrio para manter durante esse tempo um arquivo fiscal de tudo
que 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 mais
e grtis numa embalagem, ento no necessrio trocar o cdigo do produto, porque no
est 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 uma
verso 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 menor
nmero de caracteres de dados. Neste formato no existe o cdigo do fabricante, s tem o
cdigo do pas, o cdigo do produto e o digito verificador. Veja no exemplo abaixo como o
cdigo de barras EAN8 bem menor que o EAN13:
Exemplo: Para o EAN13 tem o seguinte cdigo:

789 4401 00004 1
Figura 25 Exemplo de cdigo de barras EAN-13
7894401000041 o cdigo completo
789 cdigo do pas - Brasil
4401 cdigo do fabricante
00004 cdigo do produto
1 dgito verificador



Para codificar a mesma fita utilizando o cdigo EAN8, o smbolo gerado ficaria bem mais
compacto. Exemplo abaixo:

789 0004 1
Figura 26 Exemplo de cdigo de barras EAN-8
789 0004 1 o cdigo completo
789 cdigo do pas - Brasil
0004 cdigo do produto
1 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 smbolo
gerado fica mais compacto.

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

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

Cdigo ESSN
Cdigo serial para publicaes de peridicos Comea com 977 e depois o nmero do
peridico. 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 o
mesmo EAN-13 com um dgito a mais no incio. Os 13 dgitos do prprio cdigo e o dgito a
mais representa de que forma esta sendo vendido o produto, representa a quantidade no
lote.Ex:
1 Embalagem com 6 unidades.
2 Embalagem com 12 unidades.
3 Embalagem 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 interno
Para venda de produtos, por exemplo hortifrutigranjeiros e aougues. Todo cdigo de uso
interno tambm tem 13 dgitos. A diferena est no primeiro dgito:
- Sempre comea com 2 uso interno reservado.
- O prximo dgito indica o tipo de cobrana a ser feito se por peso ou por preo. Por
exemplo: 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 produto 100.000 produtos disponveis.
Se for vendido por preo, o processo o mesmo, o que muda o segundo dgito que
representa 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 usamos
colocar o peso, porque s alterar no sistema o peso e no preciso remarcar o cdigo de
barras.

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

Localizao do Cdigo de barras
A etiqueta ou impresso do cdigo de barras colocada de preferncia e seguindo uma
padronizao no canto esquerdo ou direito inferior.
- Produtos na promoo: Se for vendida duas unidades na promoo necessrio
embala-las numa nica unidade para colocar outro cdigo de barras, para que as barras das
unidades 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 fabricante
22009 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 o
prazo 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.
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 portugus
significa "Identificao por Radiofreqncia". Dentro de pouco tempo, esta tecnologia ser to
familiar quanto o prprio carrinho de supermercado. Alm disso, estar presente em uma
infinidade 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 que
armazena 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 dispositivo
receptor 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, que
corresponde 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 do
cdigo 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.

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.


public bool validarDigitoCodigoBarras(string codigoBarras)
{
//Inicialmente atribumos "falso" varivel booleana DVvalido
bool DVvalido = false;

char[] vetorCodigoBarras = codigoBarras.ToArray();
char[] vetorOrganizado = new char[14];

//Aplicamos os clculos necessrios para a validao do cdigo de
barras
for (int indice = 0; indice < vetorCodigoBarras.Length; indice++)
{
int novoIndice = 13 - indice;
vetorOrganizado[novoIndice] = vetorCodigoBarras[indice];
}

int somaPosicoesPares = 0;
int somaPosicoesImpares = 0;

for (int i = 2; i < vetorOrganizado.Length; i++)
{
int resto = 0;
Math.DivRem(i, 2, out resto);
if (resto == 0)
{
somaPosicoesPares +=
int.Parse(vetorOrganizado[i].ToString());
}
else
{
somaPosicoesImpares +=
int.Parse(vetorOrganizado[i].ToString());
}
}

int multiplicacaoPares = somaPosicoesPares * 3;
int somaImpares = multiplicacaoPares + somaPosicoesImpares;

int multiploDeDez = 10;
while (multiploDeDez < somaImpares)
{
multiploDeDez += 10;
}

int DV = 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
return DVvalido;
}



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

CREATE PROCEDURE [dbo].[BuscarProdutoPorCodigoBarra]
@codigoBarra varchar(15)
AS
SELECT * from dbo.produto
where cod_barras = @codigoBarra

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


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


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 contedo
lido 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:
CREATE TABLE [dbo].[pedido](
[cod_ped] [numeric](10, 0) NOT NULL,
[data_ped] [date] NULL,
[cod_cli] [numeric](10, 0) NOT NULL,
PRIMARY KEY CLUSTERED
(
[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

ALTER TABLE [dbo].[pedido] WITH CHECK ADD FOREIGN KEY([cod_cli])
REFERENCES [dbo].[Cliente] ([Cod_Cli])

CREATE TABLE [dbo].[itens](
[cod_ped] [numeric](10, 0) NOT NULL,
[cod_prod] [numeric](20, 0) NOT NULL,
[valor_prod] [numeric](10, 2) NOT NULL,
[qtd_prod] [numeric](10, 0) NULL,
PRIMARY KEY CLUSTERED
(
[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

ALTER TABLE [dbo].[itens] WITH CHECK ADD FOREIGN KEY([cod_ped])
REFERENCES [dbo].[pedido] ([cod_ped])
GO

ALTER TABLE [dbo].[itens] WITH CHECK ADD FOREIGN KEY([cod_prod])
REFERENCES [dbo].[produto] ([cod_prod])
Criando o DataTable dos itens do pedido:


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


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.

CREATE PROCEDURE dbo.InserirPedido
@cod_ped numeric(10,0),
@data_ped date,
@cod_cli numeric(10,0)
AS
INSERT INTO dbo.pedido
(cod_ped
,data_ped
,cod_cli)
VALUES
(@cod_ped,
@data_ped,
@cod_cli)

CREATE PROCEDURE dbo.InserirItemPedido
@cod_ped numeric(10,0),
@cod_prod numeric(20,0),
@valor_prod numeric(10,2),
@qtd_prod numeric(10,0)
AS
INSERT INTO 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 estado
em 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 mtodo
InserirPedido nela.
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:
public void InserirPedido(int cod_ped, DateTime data_ped,
int cod_cli, DataTable dtItensPedido)
{
//Cria uma conexo com o banco de dados com uma string de conexo
SqlConnection conexao = new SqlConnection
(@"Data Source=(localdb)\Projects;Initial
Catalog=automacao;Integrated Security=True;Connect Timeout=30");
//Abre a conexo
conexao.Open();
//Inicia uma transao com esta conexo
SqlTransaction trans = conexao.BeginTransaction();

try
{
//Insere o pedido
SqlCommand command = new SqlCommand("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);
command.Parameters["@cod_cli"].Value = cod_cli;

command.ExecuteNonQuery();

//Insere cada um dos itens do pedido
for (int i = 0; i < dtItensPedido.Rows.Count; i++)
{
SqlCommand cmdInserirItens = 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 (Exception ex)
{
//Se ocorreu algum erro, desfaz a insero dos dados
trans.Rollback();

//Lana a exceo para o objeto que chamou este mtodo
throw ex;
}
finally
{
//Independente de ter ocorrido sucesso ou falha, devemos fechar a
conexo com o banco de dados
conexao.Close();
}
}

Вам также может понравиться