Você está na página 1de 32

maio 2010

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

Banco de Dados Banco de Dados

20 25
Auditoria de sistemas Interbase/ Funcões nativas do MySQL
Firebir utilizando
Triggers

Autor: Felipe Santos Autor: Bruno Alcarás

Dicas Desafio The Club

28
- Dicas Delphi

30
- Cruzada

Legenda
Iniciante
Intermediário
Avançado

maio 2010 03
Bem-vindo Av. Profº Celso Ferreira da Silva, 190

Bem amigos do The Club... Jd. Europa - Avaré - SP - CEP 18.707-150


Informações: (14) 3732-1529
Suporte: (14) 3733-1588

A Copa do Mundo está aí, e de repente é aquela corrente pra


frente... Internet
http://www.theclub.com.br
Cadastro: cadastro@theclub.com.br

Enquanto o Brasil para diante da TV para acompanhar os jogos Suporte: suporte@theclub.com.br


Informações: info@theclub.com.br
da “seleção canarinho” nós continuamos firmes aqui no escritório Skype Cadastro: theclub_cadastro
Skype Suporte: theclub_linha1
aguardando suas dúvidas. theclub_linha2
theclub_linha3

Os artigos desse mês são os seguintes:

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

podem facilitar muito a vida do desenvolvedor. Taquarituba-SP - Tel. (14) 3762-1345

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.

Um grande abraço a todos.

Marcos César Silva - Editor Chefe


marcos@theclub.com.br Delphi é marca registrada da Borland International,
as demais marcas citadas são registradas
pelos seus respectivos proprietários.

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

Uma nova unit foi adicionada ao Delphi 2010


contendo os recursos da nova RTTI. Essa unit se
chama RTTI.pas. Nessa unit estão as classes e
estruturas que serão utilizadas para a reflexão de
objetos em Delphi.

As principais classes e estruturas são:

TRttiContext(Record): Esse Record é a


base da nova RTTI. É através dele que são
extraídas as informações de um tipo (classe)
Figura 1
passado por parâmetro.

TRttiType: Classe que representa o con-


teúdo de um objeto. Nela estarão contidas
informações da estrutura de um objeto Del- unit unpessoa;
phi, suas propriedades e métodos.
interface
TRttiMethod: Nesta classe estarão as in-
formações referentes aos métodos presentes uses
em um tipo. Sysutils,Classes,Variants,Math;

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 a Figura 1 implementation

Adicione uma nova unit em sua aplicação, salve { Tpessoa }


com o nome de sua preferência. Lembrando que no
uses da unit principal do projeto esse nome deverá procedure Tpessoa.GetImc;
ser incluído, além da unit RTTI. begin
fIMC:=fPeso/(Power((fAltura/100),2));
end;
Nessa nova unit crie uma classe conforme o
código a seguir: 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);

Essa procedure irá realizar a reflexão no objeto //Listando os Campos do objeto


que passarmos por parâmetro e nos mostrará seus Memo1.Lines.Add(‘Campos:’);
campos, propriedades e métodos. No exemplo da for objField in objType.GetFields do
listagem de métodos, foi incluída uma condição
para que a reflexão traga apenas a método, no begin
caso GetImc que de fato pertence a essa classe. Memo1.Lines.Add(objField.Name+’ Tipo:
Caso não utilizemos essa condição, serão listados ‘+objField.FieldType.ToString+’ Valor: ‘+objField.
todos os métodos da classe TObject, já que nossa GetValue(obj).ToString);
classe descende da mesma. end;

Repare que na procedure utilizamos vários // Listando as propriedades do objeto


dos novos tipos da RTTI para trazer as informações Memo1.Lines.Add(‘’);
e repare também que não utilizamos ponteiros Memo1.Lines.Add(‘Propriedades:’);
explicitamente em nenhum momento. As classes for objProperty in objType.GetProperties do
da nova RTTI encapsulam todos os métodos que begin
utilizam ponteiros e apresentam ao desenvolvedor Memo1.Lines.Add(objProperty.
apenas os métodos simplificados com passagem Name+’Tipo:’+objProperty.PropertyType.ToString+
de parâmetros através de variáveis comuns. Essa ‘Valor: ‘+objProperty.GetValue(obj).ToString);
é uma das principais vantagens do uso da nova end;
RTTI.
// Listando os métodos do objeto
Vale lembrar que apesar da simplificação Memo1.Lines.Add(‘’);
ocorrida com as novas classes, a RTTI do Delphi está Memo1.Lines.Add(‘Métodos:’);
mais robusta e sem dúvida pode ser comparada for objMethod in objType.GetMethods do
a Reflexão de objetos contida em linguagens de begin
grande performance como Java if not(objMethod.Name<>’GetImc’)then //
Buscamos apenas por esse método
Para testarmos nossa procedure de Reflexão Memo1.Lines.Add(objMethod.Name);
volte ao formulário principal e no evento OnClick end;
do botão “Armazenar”, faça:
end;

procedure TForm1. Código 2


Button1Click(Sender:
TObject);
var
objPessoa. Idade:=StrToInt(EDTIDADE.
objPessoa:Tpessoa;
Peso:=StrToInt(EDTPESO. Text);
begin
Text); objPessoa.GetImc;
objPessoa:=Tpessoa.
objPessoa. Reflection(objPessoa);
Create;
Altura:=StrToInt(EDTALTURA. end;
objPessoa.
Text);
Nome:=EDTNOME.Text;
objPessoa.
Código 3

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.

Perceba que não é difícil estendermos esse


conceito e imaginar esses dados armazenados
em uma tabela, criando assim algo semelhante ao
Object Inspector do Delphi. Ou ainda uma busca
em todo o conteúdo da VCL do Delphi criando
algo como o Object Browser, outra ferramenta
Figura 2
do Delphi.

Com a nova RTTI, tarefas antes relegadas a


segundo plano nas aplicações Delphi agora passam
a ser possíveis em aplicações mais simples, adicio-
nando robustez as mesmas.

Veja o resultado de nosso aplicativo exemplo


na figura 2:

Criando Atributos Customizados

Um dos recursos oferecidos pela nova RTTI de


forma simplificada é a criação de atributos custo-
mizados para serem inseridos e fazerem referência
a campos de uma classe ou até mesmo a própria
classe. Com esses atributos podemos personalizar
ainda mais nossas classes e realizarmos um tra-
balho de orientação a objeto em nossos projetos
muito mais profissional.

Mas o que na verdade são atributos?


Figura 3

Atributos são características que podemos


incluir nos campos de uma classe. Imagine que para essa manipulação não será necessário que um Button.
temos um campo em uma classe que armazena façamos uso de ponteiros.
um valor integer. Se quisermos que esse valor não Veja a figura 3:
ultrapasse um limite podemos inserir um atributo Na sequência criaremos um exemplo simples
vinculado a esse campo impedindo a inserção de para ilustrar a utilização de TCustomAttribute. No objeto TreeView serão exibidas as informa-
valores acima de um limite pré-definido. Criaremos uma classe TExemplo com dois campos: ções relativas a nossa classe de exemplo que criare-
ValorString e ValorInteger. Esses campos terão uma mos em seguida. Entre essas informações estarão
Com a nova RTTI, nossos atributos personali- descrição associada. Essa descrição será um atri- os atributos que criaremos com TCustomAttribute
zados são criados e gerenciados através da classe buto personalizado que criaremos descendendo de e vincularemos a essa classe de exemplo.
TCustomAttribute, que é mais uma novidade do TCustomAttribute. Em seguida criaremos um mini
Delphi 2010 no que se refere a RTTI. Object Browser utilizando um treeview para exibir Veja o código da classe de exemplo. Essa classe
a classe com seus campos e descrições. nesse primeiro momento está sem os atributos em
TCustomAttribute encapsula as tarefas de suas propriedades. A classe que será responsável
criação e personalização de atributos que podem O layout dessa aplicação exemplo será bem pelos atributos será criada na sequência:
ser vinculados a uma classe em Delphi. Também simples, consistindo apenas de um treeview e de

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

// Montamos o TreeView com


as informações trazidas pela
reflexão no objeto:
MainNode:=TreeView1.Items.
Add(nil,obj.ClassName);

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

Descrição Simplificada do Processo

De maneira simplificada o modelo operacional


do CT-e pode ser assim descrito:

1. A empresa emissora do CT-e gera um


arquivo eletrônico contendo as informações
fiscais da operação comercial em questão.
a. O arquivo eletrônico tem extensão
.XML (Extensible Markup Language) e deve
ser gerado conforme padrão pré-estabelecido
vigente.
b. Este documento eletrônico contém Figura 01: Portal do sistema público de escrituração digital
informações equivalentes às informações
contidas no modelo atual de notas fiscais em
papel.

2. O documento do CT-e emitido deve


ser assinado digitalmente, de maneira a ga-
rantir a integridade dos dados, a autoria do
emissor e a validade jurídica do documento.
a. O processo de assinatura digital deve
ser feito utilizando-se certificado digital tipo
A1 ou A3 emitido por autoridade certificadora
credenciada pela Infra-estrutura de Chaves
Públicas Brasileira – ICP-Brasil (www.icpbrasil.
gov.br).
b. Neste artigo foram utilizados certifi-
cados emitidos pela empresa CertSign (www.
certisign.com.br), devidamente credenciada
no ICP-Brasil. Figura 02: Portal do Conhecimento de Transporte Eletrônico ambiente de produção.
c. A escolha do fornecedor do cer-
tificado abordado neste artigo se deu pri-
meiramente pela CertSign ser devidamente
certificada no ICP-Brasil e também pelo fato 4. Após receber o arquivo, a SEFAZ re- pessoa possa confirmar as informações im-
de ser uma das empresas líderes deste mer- aliza um processo de pré-validação e devolve pressas com as informações contidas no site
cado e dispor de Autoridade de Registro (AR) uma Autorização de Uso, permitindo com isso da SEFAZ.
sediada em nossa cidade, Salvador – Ba. No o trânsito da mercadoria e a continuação da b. O DACTE não é uma nota fiscal, nem a
entanto sinta-se o leitor livre para escolher transação comercial. substitui, servindo apenas como instrumento
entre qualquer uma das empresas disponíveis auxiliar para consulta da CT-e na internet.
no mercado, todas elas dispõem de processos 5. Para acompanhar o trânsito da
2. Os clientes iniciam o teste dos seus
semelhantes aos apresentados e toda a teoria mercadoria o sistema deve imprimir, em sistemas através do modo de homologação,
mostrada no que tange o CT-e continua sendo papel comum, geralmente em única via, uma onde é possível testar e validar livremente
válida. representação gráfica simplificada da CT-e, o sistema de software sem que os testes
chamada de DANFE (Documento Auxiliar do tenham valor fiscal. Uma vez validado o
3. O arquivo deve então ser transmiti- Conhecimento de Transporte Eletrônico) sistema o cliente solicita o acesso ao am-
do, via Internet, para a Secretaria da Fazenda a. O DACTE deve conter impressa uma biente de produção e estará livre para emitir
do Estado (SEFAZ) onde reside o contribuinte chave de acesso que possibilita a consulta o conhecimento de transporte sob a forma
emissor. do CT-e na internet, de forma que qualquer eletrônica.

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

Os certificados digitais são documentos eletrô-


nicos que identificam pessoas físicas ou jurídicas e
através do uso de criptografia asseguram a confia-
bilidade, privacidade, integridade, inviolabilidade Figura 03: Certificados para emissão de CT-e no site da CertSign
e autenticidade de informações de transações
realizadas via Internet.
A escolha do tipo de certificado a ser utilizado seguintes custos, por tipo de certificado, conforme
O processo de assinatura digital utilizando no desenvolvimento da sua aplicação depende mostrado na Figura 03.
certificados digitais nas operações via Internet tem muito das suas necessidades e possibilidades
validade jurídica para ser utilizado como assinatura financeiras. Veja na Figura 03: Certificados para emissão
de próprio punho, comprovando que seu proprietá- de CT-e no site da CertSign
rio concorda com o documento assinado. Os certificados tipo A1 são mais baratos, no
entanto são menos flexíveis, pois estão instalados Segundo informações do suporte online da
Os tipos mais comuns de certificados digitais em uma única máquina, têm prazo de validade Certisign e resultados de testes executados, caso o
são: reduzido e são considerados menos seguros. usuário já possua um certificado emitido para fins
de assinatura e transmissão de NFe, não é preciso
Os certificados tipo A3 do tipo SmartCard adquirir novo certificado.
• Certificados tipo A3 oferecem maior têm um custo intermediário, mas num primeiro
segurança, já que seu certificado é gerado, ar- momento, dependem da aquisição de um leitor de Sendo assim, para o desenvolvimento do proje-
mazenado e processado em cartão inteligente cartão que deve estar instalado na máquina onde to de CT-e, optou-se pelo certificado tipo A3, token
(SmartCard) ou token (espécie de hardlock o cartão será utilizado. A vantagem, no entanto é USB, adquirido previamente para o projeto de NF-e
para conexão na porta USB), que permanece que, após o prazo de 3 anos da compra do primeiro devido à sua flexibilidade e praticidade, principal-
assim inviolável e único. Apenas o detentor cartão, não será necessário adquirir novo leitor mente considerando o ambiente de desenvolvi-
da senha de acesso, criada no momento da de cartão, o que torna o custo a longo prazo mais mento do projeto realizado vários desenvolvedores
validação, pode utilizar a chave privada. O interessante. diferentes e o processo de atendimento na sede do
certificado digital tipo A3 possui validade de cliente quando utilizamos notebooks.
3 anos. Os certificados tipo A3 do tipo token USB têm
maior flexibilidade quando comparados aos outros O processo de aquisição foi feito através do
• Certificados tipo A1 são gerados e formatos pois depende apenas da disponibilidade site da CertSign com pagamento em 2 vezes via
armazenados no computador pessoal do usu- de uma porta USB na máquina onde o mesmo será cartão de crédito. Para a geração da chave, a cer-
ário, não sendo necessário o uso de cartões utilizado, facilitando e muito o processo de desen- tificadora exige documentação da empresa e de
inteligentes ou tokens. Os dados podem ser volvimento. O custo, no entanto, é o mais elevado um dos sócios e a entrega da mesma foi realizada
protegidos por uma senha de acesso, criada tendo em vista que o prazo de validade é o mesmo somente com a presença física do mesmo na sede
pelo usuário. Somente com esta senha é pos-
quando comparado ao modelo SmartCard. da representante, aqui em nossa cidade (Salvador
sível acessar, mover e copiar sua chave priva-
- Bahia), a Autoridade de Registro (AR) de nome
da. Por medida de segurança, recomenda-se
que um único computador armazene o par Existem diversas certificadoras oferencendo Dossier Digital (www.dossierdigital.com.br).
de chaves tipo A1 e apenas uma cópia de produtos e serviços de assinatura digital, dentro as
segurança seja criada. A validade deste tipo quais é possível destacar a Certisign (www.certsign. Todo o processo de pagamento, entrega de
de certificado é de 01(um) ano, contado a com.br) Serasa (www.serara.com.br). Acessando o documentação e aquisição da chave foi realizado
partir de sua data de emissão. site da CertSign no link específico de certificados em 2 dias úteis. A Figura 04 apresenta o material
digitais para emissão de CT-e, temos acesso aos recebido da certificadora.

maio 2010 13
Figura 04: Certificado digital tipo A3 modelo token
USB adquirido na CertSign

Uma vez com o certificado em mãos, é possí-


vel realizar a instalação do CD que acompanha o
mesmo, através de wizard de instalação, conforme
apresentado na Figura 05.

Figura 05: Wizard de instalação do certificado digital CertSign


Veja na Figura 05: Wizard de instalação do
certificado digital CertSign

Concluída a instalação, reinicia-se o computa-


dor, e sempre, ao conectar o token na porta USB,
é apresentada a mensagem conforme mostrado na
Figura 06, indicando a correta detecção do disposi-
tivo por parte do sistema operacional.

Figura 06: Mensagem apresentada sempre após a


conexão do token.

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

O aplicativo eToken Properties permite a visu- No momento da aquisição do token, uma


alização das informações armazenadas no token, senha de acesso ao mesmo deve ser fornecida, e
bem como diversas características do mesmo. é muito importante ressaltar que a certificadora
informa que, caso a senha seja digitada incorre-
Clicando no botão “etoken PRO” do lado tamente por 10 vezes consecutivas, todo o conte-
esquerdo da tela e depois clicando no botão údo do token é apagado e perdido, inutilizando o
“Advanced”, é solicitada uma senha para acesso mesmo para qualquer tipo de aplicação e sendo
às configurações avançadas do token, conforme Figura 08: Login para acesso a configurações necessária a aquisição de novo certificado frente
mostrado na Figura 08. avançadas do token. à certificadora.

14 maio 2010
Então, muita atenção, não erre a
senha por 10 vezes consecutivas!

Conforme mostrado na Figura 09 Na paleta


“Certificate & Keys” pode-se visualizar todos os
certificados armazenados no token e que serão
utilizados para assinar digitalmente os documentos
de CT-e emitidos.

Veja na Figura 09: Telas de configurações


avançadas do token

Para testar o seu certificado acesse o link ht-


tps://nfe.prefeitura.sp.gov.br/Loginicp.aspx
Figura 09: Telas de configurações
Se o certificado estiver instalado corretamen- avançadas do token
te, após selecionar o certificado e digitar a senha
surgirá a seguinte mensagem conforme mostrado
na Figura 10.

Veja na Figura 10: Teste de certificado aces-


sando link de validação online da prefeitura de
São Paulo.

Gerando uma CT-e para testes de


assinatura

Para testar a assinatura digital em um CT-e de


teste, utilizamos o aplicativo disponibilizado no
site http://www.igara.com.br/produto.php?cod_
produto=116. O aplicativo mostrado da Figura 11
é um demo desenvolvido em Delphi, totalmente
funcional que permite a geração de CT-e a partir de
informações digitadas pelo usuário em campos de
texto que seguem o layout específico vigente.

Após abrir o aplicativo, clicamos no botão


“Novo CT-e” e depois no botão “Salvar CT-e”. Por
Figura 10: Teste de certificado acessando link de validação online da prefeitura de São Paulo.
fim selecionamos o diretório onde desejamos sal-
var o arquivo .xml gerado. O aplicativo sugere um
nome para o arquivo gerado e este nome não deve conforme mostrado na Figura 12. que o emissor possa certificar a validade das infor-
ser alterado, pois segue padrão de nomenclatura mações fornecidas, bem como não há nada que
específico exigido com base no conteúdo da CT-e Neste artigo não entraremos em detalhes garanta que este documento não foi alterado por
em questão. sobre o processo de geração da CT-e, pois este será terceiros sem o conhecimento prévio do emitente.
o tema do próximo artigo. Para tanto é preciso assinar este documento e para
Veja na Figura 11: Aplicativo em Delphi para isso vamos utilizar o aplicativo de assinatura de
geração de CT-e Veja an Figura 12: Arquivo .xml de CT-e visu- Notas Fiscais Eletrônicas (NF-e) disponibilizado para
alizado no Internet Explorer download gratuito no portal oficial em http://www.
O arquivo gerado pode ser visualizado no nfe.fazenda.gov.br/portal/assinador.aspx.
Internet Explorer ou em qualquer outro browser Até o momento, o arquivo gerado não tem
de internet com suporte a XML, e o resultado é valor jurídico, pois ainda não foi assinado de forma Apesar do aplicativo sugerido ter a nomencla-

maio 2010 15
Figura 11: Aplicativo em Delphi para geração de CT-e

Figura 12: Arquivo .xml de CT-e visualizado no Internet Explorer

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

Após fazer o download e instalação do aplica-


tivo siga os seguintes passos:

• Menu> Tarefas> Configura Diretório


de Entrada. Selecione esta opção para indicar
o diretório onde estão localizadas as NF-e que
você deseja assinar.

• 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

Bloco de Notas do Windows e copiar todo o conte-


údo do arquivo, conforme mostrado na Figura 17.
Se você copiar o conteúdo do browser a informação
copiada apresentará problemas no validador por
incluir caracteres de controle como sinais de +
e – bem como quebras de linha e etc.

Veja na Figura 17: Arquivo .xml de CT-e carre-


Figura 17: Arquivo .xml de CT-e carregado no Bloco de Notas do Windows
gado no Bloco de Notas do Windows

Depois basta colar o conteúdo copiado no


campo do validador e pressionar o botão “Validar”.
O validador irá processar o arquivo XML em questão
e apresentará a lista de erros e problemas encon-
trados, conforme mostrado na Figura 18.

Veja na Figura 18: Arquivo .xml de CT-e carre-


gado no Bloco de Notas do Windows

A partir deste ponto basta corrigir cada um


dos problemas que eventualmente possam ser
apresentados, tomando com base as instruções
detalhadas de cada campo apresentadas no manual
de integração de CTe disponível para download em
http://www.cte.fazenda.gov.br//integracao.aspx,
até que o sistema apresenta a mensagem “Assina-
tura Válida”, informando que o arquivo de Cte está Figura 18: Arquivo .xml de CT-e carregado no Bloco de Notas do Windows

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.

Na tabela Filha gravaremos qual foi a ação


(inclusão, alteração ou exclusão), o nome da coluna
afetada, o valor que existia antes da ação e o valor
gravado após a ação.

Feito isso, em cada tabela que desejarmos rea-


lizar auditorias, criaremos Triggers que irão popular
essas tabelas logo após cada ação realizada. Figura 1 – Tabela Pai – Header_Log

Depois, basta criarmos uma interface simples


em nossos sistemas para ler a auditoria em forma
de relatórios e rotinas para limpar as tabelas pe-
riodicamente.

CRIANDO AS TABELAS DE AUDITORIA

Para criar a tabela HEADER_LOG criaremos pri-


meiro uma Generator para auto-incrementar uma
coluna de controle da tabela, conforme abaixo:

CREATE GENERATOR GEN_CTRL_


LOG;

Agora, criamos nossa tabela HEADER_LOG:


Figura 2 – Trigger na tabela pai para auto-incrementar o número de controle da auditoria

CREATE TABLE HEADER_LOG (


CTRL_LOG INTEGER NOT NULL Agora vamos criar a tabela VALUES_LOG, que Nesse exemplo estou incluindo cinco campos
PRIMARY KEY, armazenará valores afetados: para armazenar os valores afetados. Para cada caso
USUARIO VARCHAR(50), vale aumentar ou diminuir conforme a necessida-
TABELA VARCHAR(50), de. Também nessa tabela vamos criar uma Cons-
DATAHORA TIMESTAMP); CREATE TABLE VALUES_LOG ( traint de Foreign Key para montar o relacionamento
CTRL_LOG INTEGER, com a tabela Pai:
ACAO CHAR(1),
Por fim, criaremos uma Trigger para auto- CAMPO1 VARCHAR(50),
incrementar o valor do número de controle da OLD_VLW1 VARCHAR(100), ALTER TABLE VALUES_LOG
auditoria: NEW_VLW1 VARCHAR(100), ADD CONSTRAINT FK_
CAMPO2 VARCHAR(50), VALUESLOG_1 FOREIGN KEY
OLD_VLW2 VARCHAR(100), (CTRL_LOG)
SET TERM ^ ; NEW_VLW2 VARCHAR(100), REFERENCES HEADER_LOG
CREATE TRIGGER HEADERLOG_ CAMPO3 VARCHAR(50),
BI FOR HEADER_LOG (CTRL_LOG)
OLD_VLW3 VARCHAR(100), ON DELETE CASCADE;
ACTIVE BEFORE INSERT
NEW_VLW3 VARCHAR(100),
POSITION 0
CAMPO4 VARCHAR(50),
AS
BEGIN OLD_VLW4 VARCHAR(100),
Importante notar a ação de Delete Cascade,
IF (NEW.CTRL_LOG IS NEW_VLW4 VARCHAR(100),
CAMPO VARCHAR(50), pois em caso de exclusão dos registros Pai, os filhos
NULL) THEN
NEW.CTRL_LOG = GEN_ OLD_VLW5 VARCHAR(100), serão automaticamente excluídos também.
ID(GEN_CTRL_LOG,1); NEW_VLW5 VARCHAR(100)
END^ ); Pronto. Vamos ver como ficarão essas tabelas
SET TERM ; ^ agora criadas via utilitário gráfico IBExpert:

maio 2010 21
Veja na Figura 1 – Tabela Pai – Header_Log

Veja na Figura 2 – Trigger na tabela pai para


auto-incrementar o número de controle da au-
ditoria

Veja na Figura 3 – Tabela Filha – Values_Log

CRIANDO AS TRIGGERS DE AUDITO-


RIA

Agora que temos a estrutura pronta, vamos


montar as Triggers de auditoria dentro das tabelas
que desejamos auditar. Colocarei um exemplo
para uma tabela fictícia de títulos financeiros. Essa
Figura 3 – Tabela Filha – Values_Log
tabela tem a seguinte estrutura:

Trigger After Insert: Detalhando: na primeira parte incluímos o


TABLE TITULOS (
registro na tabela Pai de auditoria, incluindo Null no
CTRL_TITULO – Sequêncial
primeiro campo (Ctrl_Log), para forçar o uso do va-
de controle dos Títulos
SET TERM ^ ; lor do Generator. Depois incluímos a palavra-chave
EMPRESA – Código da
CREATE TRIGGER TITULOS_AI0 User no campo Usuário, para gravar o nome do
Empresa associada ao
FOR TITULOS
Título usuário corrente do banco de dados. Esse recurso
ACTIVE AFTER INSERT
COD_RESPONSAVEL – Código POSITION 0 irá funcionar perfeitamente em aplicações que uti-
do Cliente, Fornecedor ou AS lizam a autenticação do próprio InterBase/Firebird,
responsável pelo título BEGIN criando seus usuários nas tabelas administrativas
SITUACAO – Indica se o INSERT INTO HEADER_LOG do banco. Por fim incluímos o nome da tabela e a
título está em aberto, VALUES data/hora corrente.
está liquidado, está (NULL,USER,’TITULOS’,’NOW’);
autorizado, etc.
INSERT INTO VALUES_LOG Na segunda parte, incluímos os valores audi-
TIPO_TITULO – Indica se o
VALUES tados na tabela Filha. Selecionamos cinco colunas
título é um Contas a Pagar
((SELECT MAX(CTRL_LOG) para serem auditadas. Para cada uma incluímos
ou um Contas a Receber
FROM HEADER_LOG), o valor antigo e o valor novo. Mas como se trata
DT_LANC – Indica a data de ‘I’,
lançamento do título de uma inclusão de registros, não existem valores
‘CTRL_TITULO’,
DT_VENCTO – Indica o NULL, antigos, então incluímos o valor Null nas colunas
vencimento do título CAST (NEW.ctrl_titulo AS Old_Vlw da tabela de auditoria. Também incluímos
COD_MOEDA – Indica se o VARCHAR(100)), na segunda coluna o valor ‘I’ representando a ação
título é um Cheque, um ‘SITUACAO’, de Insert.
Boleto, uma Duplicata, NULL,
enfim... CAST (NEW.situacao AS
Abaixo seguem como ficarão essas Triggers
VLR_TITULO – Indica o VARCHAR(100)),
‘DT_VENCTO’, para as ações de Update e Delete.
valor do título
NULL,
SALDO – Indica o saldo
CAST (NEW.dt_vencto AS Trigger Before Update:
restante a pagar ou VARCHAR(100)),
receber do título ‘VLR_TITULO’,
OBS – Campo para NULL,
observações sobre o título CAST (NEW.dt_vencto AS SET TERM ^ ;
); VARCHAR(100)), CREATE TRIGGER TITULOS_BU0
‘SALDO’, FOR TITULOS
NULL, ACTIVE BEFORE UPDATE
CAST (NEW.saldo AS POSITION 0
Nessa tabela criaremos três Triggers de audi- VARCHAR(100)));
toria, uma para cada ação – Inclusão, Alteração e AS
end^
Deleção de registros. Vejamos como ficará: SET TERM ; ^ begin

22 maio 2010
INSERT INTO HEADER_LOG
VALUES
(NULL,USER,’TITULOS’,’NOW’);

INSERT INTO VALUES_LOG


VALUES ((SELECT
MAX(CTRL_LOG) FROM HEADER_
LOG),
‘U’,
‘CTRL_TITULO’,
CAST (OLD.ctrl_ Figura 4
titulo AS VARCHAR(100)),
CAST (NEW.ctrl_ VERIFICANDO A GRAVAÇÃO DOS RE-
INSERT INTO VALUES_LOG GISTROS DE AUDITORIA
titulo AS VARCHAR(100)),
VALUES ((SELECT
‘SITUACAO’,
MAX(CTRL_LOG) FROM HEADER_ Vamos simular uma inclusão na tabela de
CAST (OLD.
LOG), Titulos:
situacao AS VARCHAR(100)),
‘U’,
CAST (NEW.
‘CTRL_TITULO’,
situacao AS VARCHAR(100)),
CAST (OLD.ctrl_ INSERT INTO TITULOS
‘DT_VENCTO’,
titulo AS VARCHAR(100)), VALUES (2, ‘01’, ‘45545’,
CAST (OLD.dt_
NULL, ‘A’, ‘P’,
vencto AS VARCHAR(100)),
‘SITUACAO’, ‘3-MAY-2010
CAST (NEW.dt_
CAST (OLD. 08:09:27’, ‘30-JUN-2010’,
vencto AS VARCHAR(100)), ‘CH’, 100, 100,
situacao AS VARCHAR(100)),
‘VLR_TITULO’, ‘Teste de Titulo’);
NULL,
CAST (OLD.dt_
‘DT_VENCTO’,
vencto AS VARCHAR(100)),
CAST (OLD.dt_
CAST (NEW.dt_ Agora executamos a query abaixo para ver o
vencto AS VARCHAR(100)),
vencto AS VARCHAR(100)), resultado auditado:
NULL,
‘SALDO’,
‘VLR_TITULO’,
CAST (OLD.saldo
CAST (OLD.dt_
AS VARCHAR(100)), Select
vencto AS VARCHAR(100)),
CAST (NEW.saldo h.ctrl_log, h.usuario,
NULL,
AS VARCHAR(100))); h.tabela, h.datahora,
‘SALDO’,
end v.acao,
CAST (OLD.saldo
^ v.campo1, v.old_vlw1,
AS VARCHAR(100)),
SET TERM ; ^ v.new_vlw1,
NULL);
v.campo2, v.old_vlw2,
end
v.new_vlw2,
Trigger Before Delete: ^
v.campo3, v.old_vlw3,
SET TERM ; ^
v.new_vlw3,
v.campo4, v.old_vlw4,
SET TERM ^ ;
v.new_vlw4,
CREATE TRIGGER TITULOS_BD0 Os pontos de chamada das Triggers de Update
v.campo5, v.old_vlw5,
FOR TITULOS e Delete são sempre no Before, para gravar antes
v.new_vlw5
ACTIVE BEFORE DELETE dos registros serem afetados. Vale notar acima
from header_log h join
POSITION 0 que na Trigger de Delete não gravamos as colunas
values_log v
AS New_Vlw na tabela de auditoria pois não exis-
on (h.ctrl_log = v.ctrl_
begin tem novos valores em registros que estão sendo
log)
INSERT INTO HEADER_LOG alterados.
VALUES
(NULL,USER,’TITULOS’,’NOW’); Vejam como ficará visualizando via IBExpert:
Resultado:
Veja a Figura 4

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.

desses registros para arquivos externos, mantendo felipe.santos@presence.com.br


assim um backup dos registros auditados. Por fim,

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.

SELECT DATE_FORMAT(data, forma-


ADD_DATE(data, dias) to) Monday,May of 2010
Adiciona o número de dias a data informada. Retorna a data no formato passado com
parâmetro;
SELECT ADD_DATE(‘2010-05-
03’,31)
SELECT DAYOFWEEK(data)
SELECT DATE_FORMAT(‘2010-
Retorna o índice do dia da semana (1: Do-

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 PASSWORD(‘Bruno’) SELECT ROUND(1.6548,2)

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 DAYOFYEAR(‘2010-04- O MYSQL também conta com muitas funções


01’) para manipulação de números, algumas delas serão SELECT SQRT(9)
mostradas aqui:

TIME_TO_SEC(hora) CEILING(X), CEIL(X) TRUNCATE(num, decimais)


Arredonda “para cima”. Decimais define quantas casas decimais serão
Retorna a hora convertida em segundos. mantidos após o truncamento 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’)

O MYSQL também tem algumas boas funções


para criptografar e descriptografar seus dados.
POW(num1, num2), POWER(num1, INSERT(string,posição, substituídas,
num2) valor)
MD5(string) Retorna num1 elevado a num2 Insere o valor na string de acordo com a po-
O MD5 é um algoritmo unidirecional, ou seja, sição (posição inicial) e substituídas (numero de
depois de criptografado não permite que seja caracteres a serem substituídos)
descriptografado. SELECT POW(2,12)

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 REVERSE(‘The Club’) SELECT UCASE(‘bruno’)


SELECT INSTR(‘BRUNO’,
‘NO’)

SELECT RIGHT(string, pos)


Retorna os caracteres da string definidos
LCASE(string), LOWER(string) em pos, iniciando a contagem da esquerda para Conclusão
Retorna a string em letras minúsculas. direita
Essas pequenas funções, além de interessantes
nos ajudam a cuidar do nosso Banco de Dados,
select LCASE(‘BRUNO’) SELECT RIGHT(‘Boa economizando tempo na manutenção e deixando
Tarde!!’, 8); o seu trabalho mais produtivo. Apesar de existir um
grande número de funções que não irão nos servir,
sempre encontramos uma ou outra que desenvolve
LTRIM(string) um importante papel para o Banco de Dados.
Retira os espaços em branco do lado esquerdo SOUNDEX(string1) =
da string. SOUNDEX(string2)
Compara a string1 com a string2 e retorna E isso é tudo pessoal, até outra hora.
0 caso elas não se pareçam ou 1 caso tenham
SELECT LTRIM(‘ pronuncias parecidas (em ingles), útil para procura
Bruno’) de nomes iguais escritos com grafias diferentes em
sua base de dados . No exemplo abaixo o retorno Referência
será 1.
MySQL 5.1 Reference Manual
REPEAT (string, quantidade)
Repete uma string de acordo com o que foi SELECT SOUNDEX(‘Bruno’) =
definido em quantidade. SOUNDEX(‘Brunno’)

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

1 – Baixar uma imagem JPeg da Internet e transfor- No evento OnCreate do form


ma-la em Bitmap.
program Project1;

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

Label1.Caption := Format(‘A idade é


%d’, [CalcularIdade(StrToDate(‘19/1
2/1986’), Date)]);

maio 2010 29
Horizontal Vertical

30 maio 2010
maio 2010
maio 2010

Você também pode gostar