sexta-feira, 27 de março de 2015

Banco de Dados Pt. 2

Olá pessoal!

Primeiramente, desculpem, por ficar tanto tempo sem postar nada, prometo voltar com força total de hoje para diante... hehe

Hoje daremos sequência ao artigo sobre banco de dados Banco de Dados Pt. 1.
No primeiro artigo da série sobre banco de dados falamos sobre a criação de uma tabela de Clientes, hoje veremos os comandos necessários para a criação de uma tabela, as principais diferenças entre os tipos de campos, os tipos as divisões do SQL.

É importante saber que o SQL (Structured Query Language, ou Linguagem de Consulta Estruturada) é dividido principalmente em duas partes, sendo as mesmas: comandos de DDL e comandos de DML.

DDL quer dizer Data Definition Language ou Linguagem de Definição de Dados, estes comandos, como o próprio nome sugere, são utilizados para estruturarmos a base de dados, criar tabelas, deletar tabelas, criar campos dentro das tabelas, deletar campos das tabelas, renomear tabelas ou campos. O uso mais comum dos comandos de DDL são os comandos de criação e/ou de remoção de campos das tabelas já prontas, e criação ou exclusão de tabelas, entretanto, usamos estes comandos para procedures, triggers, views, constraints, dentre outros objetos que existem no banco de dados.

O segundo conjunto de comandos que temos dentro do SQL são os de DML Data Manipulation Language ou Linguagem de manipulação de dados, neste conjunto trabalhamos com o dado em si dentro da tabela, depois que a estrutura já foi criada pela DDL é necessário popular e manipular os dados dentro de uma ou mais tabelas da sua base de dados. Podemos atualizar um registro, pesquisar por ele, inseri-lo ou deleta-lo de uma tabela.

Veremos agora como criar a tabela de clientes citada no artigo anterior e alguns tipos de campos que podemos ter.

Primeiro para criar a tabela começamos com o comando de CREATE:
CREATE <elemento> <nome_elemento>,

Onde: CREATE é o comando, <elemento> representa o que queremos criar, não precisa ser necessariamente uma tabela, pode ser um INDEX, uma CONSTRAINT, uma VIEW, uma PROCEDURE, ou no nosso caso, uma TABLE, desta forma o comando fica assim:
CREATE TABLE clientes (campo1 tipo, campo 2 tipo, campo3, tipo)
Sugere-se o nome da tabela com todas as letras minúsculas principalmente porque há bancos de dados que são case sensitives, ou seja, fazem diferença entre letras maiúsculas e minúsculas, logo, Clientes é diferente de clientes.

Campo 1, campo 2, campoN são os nome dos dados que julgamos ser relevantes para guardar na base de dados.

E tipo se refere ao tipo do dado que estamos guardando, numérico, alfanumérico, booleano, data, etc. Vejamos o comando inteiro:

CREATE TABLE clientes (nome VARCHAR(50),
                                           endereço VARCHAR(50),
                                           cpf CHAR(11),
                                           rg CHAR(15),
                                           N_Filhos INTEGER,
                                           telefone VARCHAR(20),
                                          nome_pai VARCHAR(50),
                                          nome_mae VARCHAR(50),
                                          estado_civil CHAR(1),
                                          Data_Insercao TIMESTAMP);

Observem que escrevi o nome dos campos com todas as letras minúsculas por opção, mas NÃO PODE HAVER ACENTOS.

Agora vamos explicar cada tipo de campo:
VARCHAR e CHAR são campos alfanuméricos, ou seja o usuário pode incluir qualquer tipo de caractere. O número que vem após a definição do campo é o limite do campo, ou seja, o campo nome aceita até 50 caracteres após isto, dependendo da IDE que você estiver utilizando ou dará erro de TRUNCATE ou o que vier após os 50 caracteres será ignorado.

Diferença entre VARCHAR E CHAR - os dois tipos de campo são alfanuméricos, mas as diferenças são cruciais para uma boa modelagem de dados. VARCHAR é VARiante como o início do nome sugere, ou seja, o campo de telefone guarda até 20 caracteres, mas suponhamos que eu só use 10, neste caso o banco de dados guardará somente o espaço que utilizei durante a inserção. Já no caso do campo  rg é um char de 15, mas se eu usar só 10 posições deste campo, por exemplo, as outras 5 serão armazenadas durante a inserção também, não importa quantas posições usei durante o insert. 

INTEGER são tipos de campos que só guardam números inteiros como o nome sugere.

TIMESTAMP guarda uma data e uma hora no mesmo campo, normalmente estes campos são seguidos de um valor padrão, um default aí o comando ficaria assim:
data_insercao TIMESTAMP DEFAULT CURRENT_TIMESTAMP - com isto estou informando  que se não for informado nada para este campo durante a inserção o banco deverá gravar a data e a hora corrente. É interessante ressaltar também que timestamp é um sintaxe nativa do MySQL, se você estiver usando o SQL Server, por exemplo, o tipo do dado passa a ser DATETIME, que significa a mesma coisa.

Pessoal, existem vários e vários tipos de campos diferentes aqui mostrei só os mais comuns, existem também vários outros comandos de DDL, nos próximos artigos, continuaremos nos aprofundando nisso, vou ficando por aqui, pra não ficar tão cansativo.

Abraços!

terça-feira, 8 de outubro de 2013

Banco de Dados - Pt. 1

Banco de Dados ou Base de Dados! O que vem a ser isto? O Banco de Dados é um grupo de registros organizados de uma forma regular. Nesta primeira parte, falarei sobre a conceituação disto, suas principais denominações e uso.

Bom… Uma Base de Dados é organizada em Tabelas. Cada tabela possui os seus Campos e cada campo possui o seu tipo.

Vamos entender melhor -->  Suponhamos que eu tenha a tabela de Clientes na minha base de dados; Questiona-se: O que é interessante guardar sobre os clientes? Vamos armazenar nesta tabela, o Nome, Endereço, CPF, RG, N de Filhos,  Telefone, Nome do Pai, Nome da Mãe e Estado Civil. Cada uma das informações que eu quero guardar nesta Tabela, torna-se um campo; Logo, vamos imaginar assim:

Clientes
Nome Endereço CPF RG Nº de Filhos Telefone Nome do Pai Nome da Mãe Estado Civil

Viu só? Cada uma das informações que desejamos guardar dentro da tabela de clientes, torna-se um campo (de novo)! Por que? Cada uma destas informações é variável e mudará de acordo com cada registro. Veja bem, você terá vários e vários clientes dentro da mesma tabela!


Clientes
Nome Endereço CPF RG Nº de Filhos Telefone Nome do Pai Nome da Mãe Estado Civil
Misael Soler Aqui 2345678909 45987989 1 34047070 Félix Eugênia Casado
Rodolfo Alí 23423424 312312312 1 44234234 Félix Eugênia Solteiro

Viu só!? E por aí vai… as tabelas não tem fim! E cada vez que inserimos um novo registro em uma tabela, geramos uma nova linha na tabela, logo, cada linha corresponde a um registro na base de dados (também chamada de Tupla) e cada coluna à um campo!

Quantas tabelas podemos ter em uma base de dados? Quantas forem necessárias… tudo depende da relevância que os dados têm para a gente…

E quantos registros podemos inserir em uma tabela? Quantos forem necessários também!

Ah, legal! Mas, e como visualizamos estes dados!?

Antes, vou deixar uma pergunta no ar, e vamos ver quem sabe me responder:> Você sabe a diferença entre dado e informação!? Na minha próxima atualização eu respondo… até lá, vamos trocando figurinha com os leitores...

Os dados são visualizados por meio dos SGBD. Um Sistema Gerenciador de Banco de Dados. Você conhece algum? Eu aposto que sim, existem várias ferramentas no mercado, e eu já trabalhei com várias delas: Oracle, SQL Server, MySQL, FireBird, PostGree, Access, dentre outros vários!

O objetivo das atualizações deste gênero, é falar sobre a linguagem padrão para o uso dos Bancos de Dados: O SQL!

Hoje, tivemos uma breve introdução, logo logo, vamos mergulhar fundo e descobrir que a Base de Dados de todo sistema é o coração do mesmo! Este artigo tem o objetivo complementar as vídeo aulas que já postei sobre banco de dados, com um pouco mais de conceitos.

terça-feira, 1 de outubro de 2013

Impressão com o método Canvas - Final

Hoje vamos terminar a série de artigos sobre Impressão com o Método Canvas.

Para fazer isto, podemos montar uma procedure que monte o relatório desejado, desta forma, será possível chamar esta procedure sempre que quisermos um botão imprimir na tela!

Bom, faça o seguinte: Na área de declaração de Procedures, digte:

procedure MontaRelatorio;

Depois, pressione as teclas CTRL + SHIFT + C, para que o Delphi crie automaticamente o código:

procedure TForm1.MontaRelatorio;
Begin

End;

Antes do comando begin, crie às variáveis:

coluna, linha      : Single;
I, J, cont, espaco : Integer;
ilogo              : TBitmap;
Data : String;

Logo, nosso código ficará assim

procedure TForm1.MontaRelatorio;
var
  coluna, linha      : Single;
  I, J, cont, espaco : Integer;
  ilogo              : TBitmap;
  Data : String;
Begin

End;

Pronto, já podemos começar  programar. Atente-se para o seguinte: Os próximos comandos que vierem agora estarão sempre entre os comandos de Begin e End.

Application.ProcessMessages; //Permite que a aplicação processe as mensagens que estão na fila de mensagens.
coluna := Printer.PageWidth  / 200; //Aqui estamos pegando  a largura da página (Printer) e dividindo por 200, ou seja, 200% para termos o valor inserido dividido por 200% lembra da segunda parte do artigo?
  linha  := Printer.PageHeight / 200; //Aqui estamos pegando a altura da página e dividindo por 200, da mesma forma que na coluna,  isto são coisas opcionais, só faço isto para  ficar mais fácil de pensar;
  Printer.BeginDoc; //Começamos a desenhar o relatório aqui.

With Printer.Canvas do
Begin

Agora, vamos desenhar retângulos para começar o nosso formulário.
Aqui, desenhamos um retângulo na linha 002, até a linha 020 todas as vezes que usarmos o coluna * alguma coisa, temos que utilizar a função Round, porque  coluna é número dividido por 200, e o resultado desta divisão pode ser quebrado, o que implica em confusão no código;

Rectangle(Round(coluna * 005), Round(linha * 002),Round(coluna * 195), Round(linha * 020));      

Aqui, desenhamos outro retângulo um pouco mais abaixo do primeiro, no entanto, note que e este retângulo ficará dentro do primeiro que foi desenhado e é bem menor que o primeiro;

Rectangle(Round(coluna * 045), Round(linha * 003),Round(coluna * 095), Round(linha * 018));      

Pen.Width := 1; (Vide artigo 2)

Com estas duas linhas, desenhamos uma linha na mesma posição em X que no segundo retângulo, e como a linha é menor que o tamanho do retângulo, sabemos que esta linha estará dentro deste;

Lembre-se, MoveTo começa a linha, e LineTo termina a linha com coordenadas iniciais e finais;

MoveTo(Round(Coluna * 045), Round(linha * 012));
LineTo(Round(Coluna * 094.6), Round(linha * 012));

Podemos inserir uma imagem na página, assim:

ilogo := TBitmap.Create;  //Iniciamos a variável do tipo TBitmap;
ilogo.Assign(imgLogo.Picture.Bitmap);  //No caso, imgLogo é um componente TImage que está instanciado no Form;
StretchDraw(Rect(Round(coluna * 010), Round(linha * 004), Round(coluna * 031),Round(linha * 018)), ilogo); //StretchDraw, desenha um retângulo na tela, no entanto, a imagem que está na variavel ilogo, ficará encaixada certinho dentro do retângulo que está desenhado, entenderam?

Como já disse, o restante é opcional, particularmente, gosto de separar coisas diferentes dentro de retângulos, assim, o relatório fica mais organizado, depois o conteúdo vai dentro da área que compreende a extensão do retângulo, e o que é mais legal, você não precisa seguir uma ordem do tipo:
Desenha retângulo, insere conteúdo, desenha retângulo, insere conteúdo.

Como  o você indica o número da coluna e da linha, podemos desenhar o relatório sem seguir necessariamente uma ordem:
Rectangle(Round(coluna * 005), Round(linha * 021.5),Round(coluna * 195), Round(linha * 52.5));
Rectangle(Round(coluna * 005), Round(linha * 52.3),Round(coluna * 195), Round(linha * 086.5));
Rectangle(Round(coluna * 005), Round(linha * 086.5),Round(coluna * 195), Round(linha * 105));
Rectangle(Round(coluna * 005), Round(linha * 105),Round(coluna * 195), Round(linha * 115));
Rectangle(Round(coluna * 005), Round(linha * 115),Round(coluna * 195), Round(linha * 195));

E depois vem o conteúdo, observe que até agora a gente só inseriu retângulos…

Font.Style := [fsBold];
Font.Name  := ‘Tahoma’;
Font.Size  := 010;
TextOut(Round(coluna*050), Round(linha*04.5), ‘Nº Relatório’);
Font.Size := 007; //Até aqui, formatamos o texto, daqui pra frente, com a função TextOut, estamos escrevendo na linha e na coluna indicada;
TextOut(Round(Coluna*050),Round(linha*014), ‘Teste:’);
Font.Name :=’Tahoma’;
Font.Size := 008;
TextOut(Round(coluna*100), Round(linha*005), ‘Status:’); //Note que como não reformatamos o texto e escrevemos 2 vezes em locais diferentes, o próximo texto assume a formatação anterior.
TextOut(Round(coluna*100), Round(linha*16.7), ‘Data Abertura:’);
End; //Este end é referente ao Begin da senteça With.

Quando formos finalizar o relatório, temos que utilizar o comando:

Printer.EndDoc;

E assim vai.

Não faz sentido montar um relatório todinho aqui, porque isto fica a gosto de cada um!
O importante é saber que indicamos a coluna e a linha que queremos e depois o que queremos desenhar no canvas do formulário.

Até a próxima!

segunda-feira, 30 de setembro de 2013

Impressão com o Método Canvas - Pt. 2

Dando sequência à série sobre o método Canvas no Delphi, hoje falarei um pouco mais sobre o código.
No exemplo que vamos ver, desenvolvi um formulário que só possui as Querys, o PrinterDialog e uma imagem, pois achei legal colocar uma logo marca no canto superior esquerdo.

Mas… antes de começar, direto nisto, vamos ver o que é possível fazer com o método Canvas:

O método Canvas serve para desenhar em cima de alguns objetivos. Pode-se utilizá-lo em Imagens do tipo Bitmap (e unicamente Bitmap, se tentarmos utilizar uma imagem do tipo JPEG com funções do Canvas o Delphi apresentará erro de tipo de arquivo), nos formulários, para desenhar no Form mesmo, e também podemos utilizar no Printer, neste último, faremos uma impressão mesmo.

O que faz o método Canvas e onde posso utiliza-lo? Este tipo de implementação pode ser feita tanto em um formulário que tenha dados, como por exemplo uma ficha, e depois podemos criar o botão “Imprimir” e desenvolver o relatório com o que acabou de ser preenchido. Isto é muito utilizado em sistemas que emitem Nota Fiscal, por exemplo. Também é possível, a título de sugestão, criar um segundo formulário, que só tenha o componente PrinterDialog e as Querys que você precisa para emitir o relatório.

Muito bem, agora que sabemos o que o método Canvas faz e onde podemos utiliza-lo, vamos ver suas principais funcionalidades:

Desenhado uma linha:
Form1.Canvas.MoveTo(X, Y); //Sendo X e Y valores inteiros e aqui, representados pelo começo da linha
Form1.Canvas.LineTo(X,Y) ;// Sendo X e Y valores inteiros e aqui representados pelo valor final da linha;

Temos algumas opções para o uso da linha, tais como:

Form1.Canvas.Pen.Width := 2;  //Neste caso, quanto maior o número, mais grossa será a linha;
Form1.Canvas.Pen.Color := clRed; // Aqui, atribuo a cor vermelha para a linha; Lembre cl+cor em inglês para ter qualquer cor;
Form1.Canvas.Pen.Style := psSolid; //Este é  default, mas temos vários estilos de linhas (tracejado) tais como: psDash, psDot, psDashDot e psDashDotDot;

Desenhando um Retângulo:
Form1.Canvas.Rectangle(10, 10, 10, 10); // procure pensar assim: os 2 primeiros números é o lugar de X e Y (respectivamente) que eu quero o retângulo seja desenhado; os 2 últimos valores são respectivamente, a largura e a altura do retângulo; O próprio Delphi explica de um jeito diferente, sendo o primeiro valor a posição de X para o canto superior esquerdo e o segundo valor, a posição de Y para o canto superior esquerdo; os próximos 2 valores são X e Y do canto inferior direito, mas procure pensar da forma como sugeri, os 2 primeiros valores são posições de X e Y na tela e os 2 últimos são largura e altura;

Todas as propriedades que foram utilizadas para formatar a linha também podem ser utilizadas para formatar o retângulo;

Desenhando uma Elipse:
Form1.Canvas.Elipse(10, 10, 10, 10); //Pense da mesma forma como o retângulo, não tem segredo.

Escrevendo em uma Imagem:
Pense desta forma: Altere a fonte e escreva; Altere a fonte e escreva; Claro, isto se você quiser letras diferentes.

Image1.Canvas.Font.Style := [fsBold]; //Atribui negrito à fonte, para fonte em itálico, digite fsItalic, para fonte normal, abra e feche o colchetes, para Sublinhado, digite fsUnderline, para taxado (com um risco cortando a palavra) digite fsStrikeOut, para mais de um atributo, coloque-os seguido de vírgula dentro dos colchetes;
Image1.Canvas.Font.Color := clGreen; // Coloca a cor verde na letra, mesma lógica de mudar a cor da linha;
Image1.Canvas.TextOut (10, 10, ‘Digite o texto aqui’); //Aqui, temos 3 parâmetros: A posição de X, a posição de Y e finalmente o texto que queremos escrever; Seguindo estas linhas de código, colocamos a cor verde em negrito, demos margem de 10 pixels em X e Y e escrevemos o texto “Digite o texto aqui”;

Fácil, não é? Agora já sabemos quais as principais funcionalidades do método Canvas, e onde podemos utiliza-lo. Ainda exitem outras diversas funções deste método de impressão, aqui procurei mostrar somente as principais. Na próxima atualização vamos ver como fazer de fato os relatórios utilizando este recurso.

terça-feira, 24 de setembro de 2013

Instalando o componente de conexão Zeos no Delphi 7.0

Nesta vídeo aula aprenderemos a instalar o componente de conexão Zeos na versão do Delphi 7.0, este é um dos componentes que podemos utilizar para nos conectar com o Banco de Dados. A grande vantagem deste componente é a facilidade de se conectar a qualquer plataforma.




O site que cito nesta vídeo aula não existe mais. Agora mantenho somente este blog.

Até a próxima.

segunda-feira, 23 de setembro de 2013

Impressão com o Método Canvas - Pt. 1

Dentre os diversos desafios que a minha profissão oferece, há um tempo atrás fui confrontado com um desafio interessante!

Fazer a impressão de relatórios por meio do método Canvas. Imagine só fazer um relatório inteirinho no código! Pois é… é assim que foi feito.

Vantagens? Bom se você considerar o fato de que por meio deste não é necessário nenhum componente externo para fazer relatórios é uma vantagem bem relevante... principalmente porque desta forma você manipula do jeito que quiser o seu relatório, sem correr o risco de sair fora da folha, ou de não ter espaço. Você estará livre dos problemas insensatos do QReport (que já está obsoleto, mas ainda é visto por aí) de simplesmente não aparecer o campo relacionado, e estará livre dos sub relatórios do Report Builder, por exemplo. É só instanciar uma nova query e montar o select desejado, depois escrever o campo na posição desejada… mas bom, isto nós veremos com calma mais adiante.

Desvantagens? Pense na manutenção disto. Pronto, não preciso dizer mais nada. Não que seja complicado, aliás, muito pelo contrário, é até divertido de montar os relatórios, só que demora muito. Se compararmos com componentes externos, depois que o relatório está pronto, mudar um campo de lugar ou mesmo substituí-lo por outro é mais rápido do que alterar o código.

Claro que se pusermos na balança, há mais vantagens do que desvantagens, principalmente pelo fato de que só teremos “problemas” (isto mesmo, entre aspas) com o método Canvas quando formos mudar as posições dos campos, e não substituí-los.

Consideração Importante: Um relatório é medido em Pixels na tela. Qual a importância de termos isto em mente? De uma impressora para outra sempre teremos problemas de pixels, pois as medidas são diferentes, uma impressora pode utilizar mais ou menos pixels para impressão, principalmente de uma marca para outra.

Aí não dá pra pedir para o usuário comprar a impressora X ou Y em função do seu relatório ter sido testado só na impressora X ou Y, não é mesmo? E o que é pior! Já imaginou, fazer um relatório diferente para cada modelo e marca de impressora que houver no mercado?!

E aí, como resolvemos este tipo de problema? Trabalhando com porcentagem e não com medidas fixas.

Entendendo melhor, se quisermos escrever alguma coisa no meio da folha e imaginar que ela tenha, por exemplo, 250 pixels de largura, num primeiro momento, faríamos assim:

250 / 2 = 125, logo, é só informar no código que a coluna 125 e a linha 1 (X e Y, reparou!?) que teríamos o meio da página na primeira linha. Mas uma folha para a impressora X pode ter a medida de 500 pixels, o que resultaria em ¼ deste valor, e o nosso relatório já começaria desalinhado.

Como eu já disse, pra resolver isto, pegamos sempre a porcentagem da folha, e informamos a posição em porcento, e não em valores reais. Se eu disser que quero 50% do total de colunas da linha 1 eu sempre estarei no meio da folha, entendeu? Assim, não importa se  uma impressora considere 500 ou 250 pixels.

Nas próximas atualizações falaremos um pouco mais de código e veremos como pegar o tamanho da página, como proporcionar isso, dentre diversas outras abordagens.

Procurei dividir este assunto em partes pra não ficar muito cansativo e depois de terminar os artigos, vou confeccionar vídeo aulas sobre o mesmo assunto.. acredito que seja de grande importância e enquanto estive pesquisando, descobri que muitas pessoas têm dúvidas sobre isso!

Pessoal, vou ficando por aqui! Espero que tenham gostado e até a próxima! Um forte abraço!