Escolar Documentos
Profissional Documentos
Cultura Documentos
maio 2010
índice Editorial Delphi Delphi
04 05 11
Bem amigos do The Club... RTTI no Delphi 2010 Certificação Digital para CT-e
A Copa do Mundo
está aí, e de repente
é aquela corrente pra
frente...
Autor: Antonio Spitaleri Autor:Victory Fernandes
20 25
Auditoria de sistemas Interbase/ Funcões nativas do MySQL
Firebir utilizando
Triggers
28
- Dicas Delphi
30
- Cruzada
Legenda
Iniciante
Intermediário
Avançado
maio 2010 03
Bem-vindo Av. Profº Celso Ferreira da Silva, 190
O nosso consultor Antonio Spitaleri Neto esse mês nos traz o artigo
“RTTI no Delphi 2010” um recurso bastante “obscuro” nas edições
mais antigas do Delphi, mas que, na versão 2010 vem totalmente www.twitter.com/theclubbr
reformulado facilitando o seu uso até por programadores sem grande
Copyright The Club Megazine 2009
experiência.
Diretor Técnico
Nesse mês, após algum tempo, temos a volta do nosso colunista Marcos César Silva
Victory Fernandes com seu artigo ”Certificação Digital para CT-e
Abordagem prática CertiSign”, esse artigo ele dá foco ao processo Diagramação e Arte
Vitor M. Rodrigues
de assinatura digital de CT-e emitidas utilizando os certificados da
certificadora CertiSign.
Revisão
Tassiane Fileto
Felipe Santos com o artigo “Auditoria de Sistemas Interbase/Fire-
bird utilizando Triggers” nos mostra como cuidar da segurança dos Colunistas
Antonio Spitaleri Neto
nossos bancos de dados através de um recurso muito conhecido no Bruno Alcarás
Firebird, as Triggers. Felipe Santos
Victory Fernandes
Nosso consultor Jr. Bruno Alcarás no artigo “Funções Nativas do Impressão e acabamento:
MySQL” mostra alguns exemplos de funções nativas do MySQL que GRIL - Gráfica e Editora
Reprodução
E vamos todos juntos, pra frente Brasil, salve a seleção. A utilização, reprodução, apropriação, armazenamento em banco
de dados, sob qualquer forma ou meio, de textos, fotos e outras
criações intelectuais em cada publicação da revista “The Club
Megazine” são terminantemente proibidos sem autorização
escrita dos titulares dos direitos autorais.
04 maio 2010
Delphi
RTTI no
Delphi 2010
Muitas vezes utilizando a ferramenta além de atributos. Esse recurso em outras grandes alterações na RTTI, entre essas alte-
Delphi nos perguntamos como a mesma linguagens é conhecido como Reflexão. rações estão as classes criadas para o uso da
foi feita e de que forma ela “simula” nossos Sempre esteve presente em Delphi, porém mesma e que não necessitam da utilização
objetos visuais e não-visuais utilizados em não com a mesma relevância que se vê em de ponteiros para seu uso. Essa e outras
nossas aplicações. Um dos elementos mais outras linguagens como Java. alterações trouxeram a RTTI para um plano
importantes nessa simulação sem dúvida é mais próximo do desenvolvedor Delphi que
o Object Inspector, que nos mostra todas as Apesar de ser um recurso de grande trabalha com automação comercial.
propriedades e eventos contidos em cada importância em background, RTTI não
objeto que incluímos em nossa aplicação precisa ter seu uso restrito apenas a ele. Com a nova RTTI, podemos ter em
Delphi. Podemos fazer uso de RTTI diretamente nossas aplicações controle e manipulação
em nossas aplicações, para as mais diversas de propriedades e métodos, criação de
Embora faça uso de outros recursos, situações. atributos personalizados e alteração de
sem dúvida o recurso de background mais propriedades já criadas, entre outros
importante utilizado pelo Delphi para Em Delphi 7 e versões mais antigas, recursos. Todos esses recursos sem a utili-
“simular” nossas aplicações em tempo utilizar RTTI exigia um bom conhecimento zação de ponteiros. É exigido apenas que o
de projeto é a RTTI sigla para Run Time de ponteiros, o que inviabilizava seu uso desenvolvedor saiba manipular classes na
Type Information, é através de RTTI que quando o desenvolvedor não tinha uma boa linguagem Delphi.
o Delphi consegue capturar e listar todas experiência com os ponteiros. E levando em
as propriedades e métodos utilizados por consideração que ponteiros não são a base Nesse artigo estarei mostrando os
nossos objetos. do desenvolvimento em Delphi, RTTI era um principais recursos da nova RTTI disponível
grande recurso que acabava ficando relega- no Delphi 2010. Recursos que sem dúvida
Em resumo, RTTI é o recurso utilizado do a projetos de código mais avançado. serão uma grande melhoria e agregarão
pelo Delphi para que suas classes conhe- maior robustez as nossas aplicações.
çam seus métodos, campos, propriedades Na versão 2010 do Delphi, foram feitas
maio 2010 05
Desenvolvendo com RTTI
type
TRttiField: Representa as informações de
Tpessoa=class
reflexão de um Campo de um objeto. private
fNome:string;
TRttiProperty: Nessa classe estarão as fIdade:integer;
informações das propriedades constantes fPeso:integer;
em um objeto. fAltura:integer;
fIMC:Real;
public
Com essas cinco classes contidas na nova unit, procedure GetImc;
já é possível realizarmos uma completa reflexão property Nome:string read fNome write fNome;
property Idade:integer read fIdade write
de nossas classes em Delphi. É isso que faremos
fIdade;
na sequência.
property Peso:integer read fPeso write fPeso;
property Altura:integer read fAltura write
Inicie uma nova aplicação no Delphi 2010 e fAltura;
monte o layout conforme a figura 1: end;
Veja o código 1.
Código 1
maio 2010
Criamos uma classe bem simples com algu-
mas propriedades, campos e métodos. Essa classe procedure TForm1.Reflection(obj: TObject);
será utilizada em nossa reflexão. var
Context:TRttiContext;
Voltando ao formulário principal, iremos criar objType:TRttiType;
a procedure Reflection que irá listar o conteúdo de objField:TRttiField;
nosso objeto pessoa depois de criado e com valores objProperty:TRttiProperty;
devidamente inseridos em suas propriedades. objMethod:TRttiMethod;
begin
Memo1.Lines.Clear;
Veja o código 2:
objType:=Context.GetType(obj.ClassType);
maio 2010 07
Criamos uma instância de nossa classe TPessoa
e preenchemos seus campos, além de executar o
método GetImc para testarmos todos os recursos
da classe. Após isso chamamos a procedure Re-
flection que nos devolve através do componente
Memo as informações referentes aos campos,
propriedades e métodos de nossa classe.
08 maio 2010
à classe de exemplo e suas propriedades. Vale
type fDescricao:=Descricao; lembrar que atributos podem armazenar diversas
TExemplo=class end; informações além de descrições, pois são classes
private como qualquer outra em Delphi e esses atributos
podem ser aplicados não só as propriedades de
fValorInteger:integer; Veja que a classe contém apenas um campo, uma classe como também aos seus métodos e
fValorString:string; que é o texto da descrição que referenciará cada campos. Isso mostra toda a extensibilidade do
public campo da nossa classe. conceito de atributos em Delphi e com a classe
property TCustomAttributes esses atributos ficaram facil-
ValorInteger:integer Agora iremos modificar o código da classe de mente criáveis e manipuláveis.
read fValorInteger write exemplo para que as propriedades da mesma e a Iremos agora fazer o código que irá criar nossa
fValorInteger; própria classe passem a contar com esse atributo TreeView com as informações de nossa classe de
property descrição. Esses atributos serão listados no Tree- exemplo. O resultado final será semelhante ao
ValorString:string read View de nossa aplicação exemplo. Object Browser do Delphi.
fValorString write
fValorString; Segue o código: No evento OnClick do botão que inserimos no
end; formulário, faça:
type
No código seguinte criaremos a classe Des- [Descricao(‘Esta é procedure TForm1.
cricao que herdará de TCustomAttribute para que nossa classe de Exemplo’)] Button1Click(Sender:
possa ser vinculada a nossa classe de exemplo TExemplo=class TObject);
fornecendo descrições para a classe e suas pro- private var
priedades. obj:TExemplo;
fValorInteger:integer;
Veja o código: fValorString:string; // Variáveis que usaremos
public para a reflexão com RTTI:
[Descricao(‘Essa Ttype:TRttiType;
type propriedade recebe um Context:TRttiContext;
Descricao=class(TCustom valor integer’)]
Attribute) property objAttribute:TCustomAttribute;
private ValorInteger:integer objField:TRttiField;
fDescricao:string; read fValorInteger write objProperty:TRttiProperty;
public fValorInteger;
constructor [Descricao(‘Essa // Objetos para a montagem
Create(const propriedade armazena uma do TreeView:
Descricao:string); String’)] MainNode,
property property PropNode,
pDescricao:string ValorString:string AttNode:TTreeNode;
read fDescricao write read fValorString write
fDescricao; fValorString; begin
end; end;
// Criamos uma instância
implementation da classe e armazenamos
Temos aqui o mesmo código de criação da valores em suas propriedades:
{$R *.dfm} classe de exemplo, porém incluímos descrições obj:=TExemplo.Create;
na classe e nas propriedades da mesma. Basta a obj.ValorInteger:=10;
{ Descricao } chamada ao construtor da classe Descricao para obj.ValorString:=’The
incluir e vincular um texto de descrição aos campos Club!’;
constructor Descricao. da classe. Essa é mais uma facilidade trazida pelos
Create(const Descricao: Custom Attributes do Delphi 2010. // Iniciamos a reflexão
string); capturando a classe base:
begin Nesse exemplo utilizamos o atributo para Ttype:=Context.
inserir uma descrição e aplicamos essa descrição
maio 2010 09
GetType(obj.ClassType);
// Primeiro trazemos a
descrição que associamos a
classe:
for objAttribute in Ttype.
GetAttributes do
if objAttribute is
Descricao then
TreeView1.Items.AddC
hild(MainNode,Descricao(objAt
tribute).pDescricao);
// Em seguida trazemos as
descrições das propriedades: Figura 4
PropNode:=TreeView1.Items.
AddChild(MainNode,’Proprieda
des’); Essa nova maneira de utilizar a reflexão coloca pansível, dando ao desenvolvedor a possibilidade
for objProperty in Ttype. a mesma no dia a dia dos desenvolvedores Delphi, de buscar informações sobre os seus objetos e
GetProperties do estejam eles acostumados ao uso de recursos mais também sobre objetos de terceiros. Com isso os
begin
avançados ou não. aplicativos desenvolvidos em Delphi já adquirem
AttNode:=TreeView1.
um caráter no que concerne a orientação a objetos
Items.
A nova RTTI dispensa o uso de ponteiros e muito mais profissional.
AddChild(PropNode,objProperty.
Name+’ - ‘+objProperty.
trabalha com conceitos de Orientação a Objetos
GetValue(obj).ToString); de forma simples, o que facilita o seu uso.
for objAttribute in Aproveitem mais esse recurso do Delphi 2010
objProperty.GetAttributes do Além de simples a nova RTTI é altamente ex- e até a próxima!
if(objAttribute is
Descricao)then
TreeView1.Items.A
ddChild(AttNode,Descricao(obj
Attribute).pDescricao);
end;
end;
Sobre o autor
Antonio Spitaleri Neto
Consultor Técnico The Club.
Veja o resultado final na figura 4:
Conclusão
antonio@theclub.com.br
Mais um recurso do Delphi que sempre
esteve presente agora está mais acessível com a
nova RTTI.
10 maio 2010
Certificação Digital
para CT-e Abordagem
prática CertiSign
escrituração digital
Atualmente tenho sido cobrado por • Conhecimento Aéreo, modelo 10;
todos os lados a respeito de soluções para O principal objetivo da implantação desta
Conhecimento de Transporte Eletrônico • Conhecimento de Transporte Ferro- nova modalidade de conhecimento de transporte
(CT-e). Os clientes precisam adequar seus viário de Cargas, modelo 11; é o acompanhamento em tempo real das opera-
sistemas, a empresa precisa fornecer solu- ções de transporte pelo Fisco e a substituição do
ção imediata, os leitores querem saber mais • Nota Fiscal de Serviço de Transporte modelo atual de emissão de documentos fiscais
sobre o tema. Ferroviário de Cargas, modelo 27; em papel, de forma a simplificar uma série de
obrigações do contribuinte. Maiores informações
• Nota Fiscal de Serviço de Transporte, podem ser obtidas através do portal nacional de
O CT-e é um documento emitido e armazenado modelo 7, quando utilizada em transporte de Cte no ambiente de produção em http://www.
eletronicamente, com validade jurídica garantida cargas. cte.fazenda.gov.br, conforme mostrado na Figura
por processo de assinatura digital. Este novo 02 ou do portal nacional de Cte ambiente de ho-
modelo de documento fiscal eletrônico, instituído mologação (versão de testes de CTe para clientes
pelo AJUSTE SINIEF 09/07 (25/10/2007), pode ser que ainda não estão emitindo Cte) em http://hom.
utilizado para substituir um dos seguintes docu- O CTe é parte integrante do sistema público de cte.fazenda.gov.br/.
mentos fiscais: escrituração digital, cuja documentação completa
encontra-se disponível em http://www1.receita.
fazenda.gov.br/, conforme mostrado na Figura 01, Veja na Figura 02: Portal do Conhecimento de
• Conhecimento de Transporte Rodo- juntamente com demais itens que tem ocupado e Transporte Eletrônico ambiente de produção.
viário de Cargas, modelo 8; muito os desenvolvedores em todo o Brasil, tais
como SPEDContábil, SPEDFiscal, NFe e NFSe. Nesta série de artigos abordaremos os inú-
• Conhecimento de Transporte Aqua- meros conceitos envolvidos no desenvolvimento e
viário de Cargas, modelo 9; implantação de soluções para CT-e. Neste artigo, no
Veja na Figura 01: Portal do sistema público de entanto, daremos foco ao processo de assinatura
digital de CT-e emitidas, utilizando certificados emi-
maio 2010 11
tidos pela empresa certificadora CertSign (www.
certisign.com.br).
12 maio 2010
Atualmente, conforme consta no FAQ disponí-
vel no portal da CT-e, a estratégia de implantação
nacional é voluntária, onde as empresas, indepen-
dente do porte, por livre e espontânea vontade se
interessam em adotar e emitir Conhecimento de
Transporte Eletrônico. Diferentemente da NFe, o
processo de CTe ainda é facultativo, e mesmo após
o início das operações em modo de produção é
possível emitir Cte no padrão antigo.
Certificados Digitais
maio 2010 13
Figura 04: Certificado digital tipo A3 modelo token
USB adquirido na CertSign
O processo de instalação cria duas pastas no Figura 07: Programa eToken Pro-
menu Iniciar do Windows que dão acesso princi- perties
palmente à documentação de ajuda e ao aplicativo
eToken Properties, mostrado na Figura 07.
Veja na Figura 07: Programa eToken Proper-
ties
14 maio 2010
Então, muita atenção, não erre a
senha por 10 vezes consecutivas!
maio 2010 15
Figura 11: Aplicativo em Delphi para geração de CT-e
16 maio 2010
tura referente a assinatura de NFe ele é genérico e
100% funcional para assinatura de CT-e, desde que
seu diretório de Schema seja devidamente confi-
gurado com o Schema vigente de CT-e disponível
no portal nacional do projeto no link de download
dos Schemas XML http://www.cte.fazenda.gov.
br//schemas.aspx
• Menu> Tarefas> Configura Diretório Figura 15: Aplicativo de assinatura de NF-e disponibilizado no portal oficial da NF-e
de Saída. Selecione esta opção para indicar
o diretório onde serão armazenadas as NF-e
do Windows, mostrado na Figura 14 a seguir. NF-e disponibilizado no portal oficial da NF-e
assinadas.
A diferença entre o arquivo não assinado e o
• Menu> Tarefas> Configura Diretório
arquivo assinado digitalmente estará no conteúdo
de Schemas. Selecione esta opção para indicar
das últimas chaves do arquivo XML em questão,
o diretório onde se encontram armazenados
que anteriormente estavam sem preenchimento,
os schemas que determinam o layout vigente
e após a assinatura terão um conteúdo conforme,
da CT-e. O download do schema vigentes
mostrado na Figura 16.
pode ser feito no portal e deve-se operar
sempre com o layout mais novo.
Veja na Figura 16: Arquivo .xml de CT-e após o
processo de assinatura
Uma vez configurados os diretórios, antes de
Após o processo de assinatura, os campos
realizar o processo de assinatura, faz-se necessário
de DigestValue, SignatureValue e X509Certificate
selecionar qual certificado será usado no processo.
passaram a conter dados criptografados que iden-
Para isso acesse a opção Menu> Tarefas> Seleciona Figura 14: Visualizador de certificados padrão do tificam unicamente o arquivo .xml em questão e
Certificado e selecione o certificado contido no Windows atestam que o mesmo foi assinado somente por
token conforme mostrado na Figura 13.
pessoa detentora do token.
Uma vez realizados corretamente todo o
processos de configuração, estamos prontos para Neste momento fica claro que o token, por
assinar nosso primeiro CT-e. Conforme mostrado ter validade jurídica para assinatura de documen-
na Figura 15, visualizamos no grid do lado esquerdo tos, deve ser manipulado somente por pessoas
todas os arquivos de CT-e disponíveis a serem assi- devidamente autorizadas. Portanto, todo cuidado
nadas. Marcando o check-box dos CT-e desejados, é pouco!
basta então clicar na opção Menu> Tarefas> Efetuar
Assinatura XML, para que todos os CT-e selecio- Para validar o arquivo gerado o primeiro passo
nadas sejam devidamente assinados, utilizando o é acessar o do validador online de CTe no site da
certificado selecionado. SEFAZ-RS em http://www.sefaz.rs.gov.br/CTE/
CTE-VAL.aspx
Figura 13: Tela de seleção do certificado que será A CT-e assinado será armazenada no diretório
usado para a assinatura digital indicado anteriormente e é possível visualizá-lo O validador online é extremamente útil para
no grid do lado direito do aplicativo, conforme auxiliar na localização de erros na sintaxe e con-
Clicando no botão “Mostrar o Certificado” é mostrado na Figura 15. teúdo dos arquivos XML gerados. Para utiliza-lo
possível visualizar informações detalhadas do mes-
é preciso abrir o arquivo XML de Cte assinado no
mo através do visualizador de certificados padrão Veja na Figura 15: Aplicativo de assinatura de
maio 2010 17
Figura 16: Arquivo .xml de CT-e após o processo de assinatura
18 maio 2010
válido, tanto em forma quanto em conteúdo. Conclusão Mostramos como fazer a assinatura usando
como exemplo o certificado digital emitido pela
Pronto! O arquivo de CT-e está pronto para ser Com este artigo abordamos conceitos gerais empresa CertSign. No entanto, apesar das infor-
transmitido! Mas, por enquanto, é só, pois o pro- de certificação digital e assinatura digital no que mações apresentadas sobre certificados digitais
cesso de envio da CT-e será tema de outros artigos tange o conchecimento de transporte eletrônico e envolverem dados específicos do fabricante, os
que virão. Continue acompanhando a coluna que vimos como é fácil emitir e assinar tais documentos. conceitos abordados são semelhantes indepen-
em breve teremos mais artigos sobre o tema. O CT-e já é uma realidade, e muito em breve as dente da certificadora escolhida. Sendo assim, o
empresas adotarão este novo formato. conhecimento adquirido é de grande utilidade
na implementação da comunicação com outras
marcas e modelos.
Sobre o autor
Victory Fernandes
Professor do Departamento de Engenharia da UNIFACS, Engenheiro
Mestrando em Redes de Computadores, e desenvolvedor sócio da TKS Soft-
ware - Soluções de Automação e Softwares Dedicados. Pode ser contatado
em victory@igara.com.br, ou através dos sites www.igara.com.br – www.
igara.com.br/victory
victory@igara.com.br
maio 2010 19
AUDITORIA DE SISTEMAS
I NTERBASE/FIREBIRD
UTILIZANDO TRIGGERS
TRIGGERS – MUITO ALÉM DO QUE
Olá pessoal, SIMPLES GATILHOS
alguma informação ou tendo acesso a dados
Esse mês um assunto me veio muito à sigilosos? Como saber se um usuário ou algum É isso mesmo! Triggers são muito mais do que
tona: a segurança de nossos sistemas. Tenho processo não mascarou dados em tabelas, simples “gatilhos” disparados nas ações de nossos
acompanhado o desenvolvimento de diversos excluiu ou mesmo incluiu informações que bancos de dados. É muito comum o uso de Triggers
sistemas e é muito comum ver empresas que pudessem desestabilizar, por exemplo, relató- para garantir a integridade referencial dos bancos
já estão no mercado há muito tempo suas rios financeiros ou de fechamentos de vendas, de dados. Mas vale muito aprofundar o uso desse
aplicações vêm sofrendo grandes metamor- de comissões de vendedores? objeto, explorando novas aplicações para eles.
foses ao longo dos anos todos. O que era um
sistema pequeno, para atender determinada O certo é que, por mais que tenhamos E criar um sistema de auditoria é um bom
necessidade, hoje já é um sistema grande, mecanismos em nossas aplicações para blo- exemplo. Com poucas alterações em nossas apli-
com muitos recursos, módulos e interfaces. quear e inibir seu uso indiscriminado, como cações podemos implementar um simples sistema
Agora, mais comum do que ver essa mudança por exemplo, níveis de direitos de acesso às que armazene em tempo de execução, informações
nos softwares é ver a grande deficiência que telas, relatórios e processos, os problemas de importantes como Usuário, Data/Hora, Tabela,
temos em garantir a segurança de nossos segurança permanecem. Valores e registros modificados/excluídos/incluídos
produtos. E quando eu digo segurança, não nas principais tabelas de nossas aplicações.
me refiro apenas à backups, restauração de Uma forma muito interessante de au-
ambientes, recuperação de falhas, contin- mentar essa segurança é criar um sistema
gência ou redundância. Também me refiro de auditoria das ações que acontecem em ESTRUTURA DA AUDITORIA
também à segurança de acesso e ao uso de nossos bancos. E se utilizarmos um simples
nossos softwares. Como garantir que nossos objeto de nossos bancos de dados InterBase A idéia é a seguinte: teremos duas tabelas de
sistemas são seguros? Quem garante que e Firebird – as Triggers – essa tarefa se torna apoio que chamaremos de HEADER_LOG (tabela
um usuário lá na ponta não está sabotando muito simples. Pai) e VALUES_LOG (tabela Filha). Na tabela Pai
gravaremos o nome do usuário que executou a
ação, o nome da tabela acessada e a data/hora
20 maio 2010
da ação.
maio 2010 21
Veja na Figura 1 – Tabela Pai – Header_Log
22 maio 2010
INSERT INTO HEADER_LOG
VALUES
(NULL,USER,’TITULOS’,’NOW’);
maio 2010 23
E assim por diante. Já temos nossas tabelas também é importante a criação de uma interface sobre o InterBase e seus recursos. Valeu pessoal
gravando as auditorias. amigável para a visualização desses registros au- e Até lá!
ditados. O importante é que fique o exemplo de
criação de um sistema simples de auditoria que
CONCLUSÃO pode nos facilitar muito em situações indesejadas Referência:
de mal-uso de nossos sistemas.
Esse exemplo que coloquei no artigo é apenas InterBase 2009 Data Definitions Guide – cap.
uma sugestão. O importante é notar que podemos Nos vemos no próximo artigo para falar mais 10.
usar as Triggers para outras funções e explorar mais
recursos de nossos bancos. Cabe claro adaptar o
exemplo para cada situação, incluindo mais regis- Sobre o autor
tros auditados, mais tabelas, mais ações. Cabe até a Felipe Santos
inclusão de uma Stored Procedure para armazerar e Felipe Santos é especialista em InterBase. Trabalha com o InterBase desde
2001. atuando como consultor e instrutor do produto em todo Brasil. Especialista em
calcular valores antes de suas respectivas inclusões ambientes críticos. Atua e trabalha com os maiores clientes do InterBase no Brasil.
Participante ativo na comunidade, com diversos artigos publicados. Participante do
nas tabelas de auditorias. Cabe também a criação grupo de beta testers mundial do produto. Palestrante em eventos como IB Tour, Borcon
Conference, CodeRage Latin América, Delphi Developers Day, Linux Day, entre outros.
de rotinas para a limpeza dos registros de auditória Atualmente trabalhando na área técnica do InterBase na Presence Tecnologia – agente
periodicamente. Outra sugestão é a exportação oficial especializado do produto no Brasil.
24 maio 2010
FUNÇÕES NATIVAS
DO MYSQL
CURDATE()
O MySQL conta com muitas funções Retorna a data corrente. 05-03’, ‘%d/%m/%Y’)
nativas para facilitar a vida do desenvolvedor
durante a criação e manutenção do Banco de
Dados. Nesse artigo apresentarei algumas das SELECT CURDATE() Nesse exemplo será retornada a data no forma-
principais, elas estarão divididas em quatro to comumente utilizado no Brasil: dd/mm/aaaa.
grupos: Data e Hora, Criptografia, Matemática
e Manipulação de Strings.
DATEDIFF(data1, data2) 03/05/2010
Retorna a diferença entre data1 e data2.
SELECT DATE_FORMAT(‘2010-
Funções de Data e Hora 05-03’,’%W,%M of %Y’)
SELECT DATEDIFF(‘2010-05-
O MYSQL conta com algumas funções inte- 03’,’2010-05-04’)
ressantes para o manuseio de data e hora, a partir Nesse exemplo será retorna, por extenso, o dia
daqui mostrarei algumas. da semana, o mês e o ano no idioma inglês.
maio 2010 25
mingo, 2: Segunda, 3: Terça, ...) , de acordo com a PASSWORD(string) mais)
data informada. Calcula através da string passada o valor da Arredonda um valor, inteiro ou double, para
mesma criptografada. Essa função é usada pelo um valor com o número de casas decimais digitadas
MYSQL para armazenar as senhas dos usuários em decimais, caso nada seja digitado, decimais
SELECT DAYOFWEEK(‘2010-05- do banco assume o valor zero.
03’)
SELECT DAYOFYEAR(data)
Retorna o índice do dia do ano, de acordo com
a data informada. SQRT(num)
Funções de Matemáticas Retorna a raiz quadrada de num.
SELECT CEIL(1.00001)
SELECT TIME_TO_ SELECT TRUNCATE(14.999,2)
SEC(‘22:15:22’)
FLOOR(X)
Arredonda “para baixo”. Funções para Manipulação de Strin-
WEEKOFYEAR(data) gs
Retorna o índice da semana do ano, de acordo
com a data informada. SELECT FLOOR(1.9) Existem também funções específicas para ma-
nipulação de Strings, aqui estão algumas delas:
SELECT WEEKOFYEAR(‘1986-
12-19’) MOD(num1, num2) CONCAT(valor1, valor2,...)
Retorna o resto da divisão dos números Concatena as strings informadas em valor.
informados.
SELECT CONCAT(‘Bruno ‘,
Funções de Criptografia SELECT MOD(14,12) ‘Alcarás’)
select INSERT(‘Br
SELECT MD5(‘Bruno’) Alcarás’,3,1,’uno’)
ROUND(num), ROUND(num, deci-
26 maio 2010
INSTR(string, substring) REVERSE(string) UCASE(string)
Retorna a posição onde se inicia a substring Inverte a string. Retorna a string em letras maiúsculas
dentro da string informada
SELECT REPEAT(‘The
Club’,4)
Sobre o autor
REPLACE(string,substituir,substituta) Bruno Alcarás
Retira da string o definido em substituir e Consultor Técnico The Club.
adiciona substituta.
SELECT
REPLACE(‘Bruno’,’no’,’nno’) bruno@theclub.com.br
maio 2010 27
Dicas DELPHI 2 - Form Full Screen
var
HTaskbar: HWND;
OldVal: LongInt;
function DownloadJPGToBitmap(const
begin
URL : string; ABitmap: TBitmap):
try
Boolean;
// Acha o handle do TASKBAR
var
HTaskBar := FindWindow(‘Shell_
idHttp: TIdHTTP;
TrayWnd’, nil);
ImgStream: TMemoryStream;
// Desliga as teclas de
JpgImage: TJPEGImage;
sistema, só no Win 95/98/ME
begin
SystemParametersInfo(97,
Result := False;
Word(True), @OldVal, 0);
ImgStream := TMemoryStream.
// Desabilita a barra de
Create;
tarefas
try
EnableWindow(HTaskBar, False);
idHttp := TIdHTTP.Create(nil);
// Esconde a barra de tarefas
try
ShowWindow(HTaskbar, SW_HIDE);
idHttp.Get(URL, ImgStream);
finally
finally
with Form1 do
idHttp.Free;
begin
end;
BorderStyle := bsNone; // se
ImgStream.Position := 0;
desejar que apareçam os botões de
JpgImage := TJPEGImage.Create;
sistema comente essa linha
try
FormStyle := fsStayOnTop;
JpgImage.
Left := 0;
LoadFromStream(ImgStream);
Top := 0;
ABitmap.Assign(JpgImage);
Height := Screen.Height;
finally
Width := Screen.Width;
Result := True;
end;
JpgImage.Free;
end
end;
finally
ImgStream.Free;
end;
end;
No evento OnClose do form
Exemplo de uso
var
// Baixa a imagem e a joga em um
HTaskbar: HWND;
Image
OldVal: LongInt;
begin
DownloadJPGToBitmap(‘http://www.
// Acha o handle do TASKBAR
teste.com.br/teste.jpg’,Image1.
HTaskBar := FindWindow(‘Shell_
Picture.Bitmap);
TrayWnd’, nil);
28 maio 2010
// Liga as teclas de sistema, só 4 – Abrevia Nome
no Win 95/98/ME
SystemParametersInfo(97,
Word(False), @OldVal, 0); Essa função abrevia o nome de uma pessoa, exceto o primeiro e o último
// Habilita a barra de tarefas inclusive retirando as palavras dos, das, da, etc.
EnableWindow(HTaskBar, True);
// Mostra a barra de tarefas
ShowWindow(HTaskbar, SW_SHOW);
Function AbreviaNome(Nome: String):
String;
var
Nomes: array[1..20] of string;
i, TotalNomes: Integer;
3 – Calcular Idade begin
Nome := Trim(Nome);
Result := Nome;
Nome := Nome + #32;
Function CalcularIdade(Aniversario, i := Pos(#32, Nome);
DataAtual: TDate): Integer; if i > 0 then
var begin
Mes, Dia, Ano, AnoAtual, TotalNomes := 0;
MesAtual, DiaAtual: Word; while i > 0 do
begin
begin
Inc(TotalNomes);
DecodeDate(Aniversario, Ano, Mes,
Nomes[TotalNomes] :=
Dia);
Copy(Nome, 1, i - 1);
DecodeDate(DataAtual, AnoAtual, Delete(Nome, 1, i);
MesAtual, DiaAtual); i := Pos(#32, Nome);
if (Ano = AnoAtual) and (Mes = end;
MesAtual) and (Dia = DiaAtual) then if TotalNomes > 2 then
begin begin
Result := 0; for i := 2 to TotalNomes
end - 1 do
else begin
begin if Length(Nomes[i]) >
3 then
Result := AnoAtual - Ano;
Nomes[i] := Nomes[i][1]
if (Mes > MesAtual) then
+ ‘.’;
Dec(Result)
end;
else Result := ‘’;
begin for i := 1 to TotalNomes
if Mes = MesAtual then do
if (Dia > DiaAtual) then Result := Result +
Dec(Result); Trim(Nomes[i]) + #32;
end; Result := Trim(Result);
end end;
end; end;
end;
Exemplo de uso
maio 2010 29
Horizontal Vertical
30 maio 2010
maio 2010
maio 2010