Revista The Club Megazine - 03/2002



Documentos relacionados
Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

Despachante Express - Software para o despachante documentalista veicular DESPACHANTE EXPRESS MANUAL DO USUÁRIO VERSÃO 1.1

Listando itens em ComboBox e gravando os dados no Banco de Dados MySQL.

Procedimentos para Reinstalação do Sisloc

Criando Banco de Dados, Tabelas e Campos através do HeidiSQL. Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2011

Noções de. Microsoft SQL Server. Microsoft SQL Server

Android e Bancos de Dados

Daruma NFCe Conheça todos os passos para testar a NFCe Daruma

Motorola Phone Tools. Início Rápido

MANUAL DO ANIMAIL Terti Software

Manual do Painel Administrativo

ArpPrintServer. Sistema de Gerenciamento de Impressão By Netsource Rev: 02

Manual AGENDA DE BACKUP

Display de 7. PdP. Autor: Tiago Lone Nível: Básico Criação: 16/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

Sumário 1. SOBRE O NFGoiana DESKTOP Apresentação Informações do sistema Acessando o NFGoiana Desktop

Prof. Omero, pág. 63. Banco de Dados InterBase.

Introdução a Banco de Dados

NetEye Guia de Instalação

LICENCIAMENTO V14 USANDO REPRISE LICENSE MANAGER

Tutorial para envio de comunicados e SMS

Procedimentos para Instalação do Sisloc

ETEC DR. EMÍLIO HENRNANDEZ AGUILAR PROGRAMAÇÃO DE COMPUTADORES I PROFESSOR RAFAEL BARRETO

TUTORIAL: MANTENDO O BANCO DE DADOS DE SEU SITE DENTRO DO DOMÍNIO DA USP USANDO O SSH!

Manual SAGe Versão 1.2 (a partir da versão )

Vendas. Manual do Usuário. Copyright ControleNaNet

Fox Gerenciador de Sistemas

Dicas para usar melhor o Word 2007

FERRAMENTAS DE COLABORAÇÃO CORPORATIVA

Conteúdo O que é?... 4 Histórico... 4 Onde Baixar?... 4 Diferença entre Firebird e o Interbase... 4 Como instalar?... 4 Instalando o Ibexpert...

1 REQUISITOS BÁSICOS PARA INSTALAR O SMS PC REMOTO

Data Transformation Services (DTS) por Anderson Ferreira Souza

Novell. Novell Teaming 1.0. novdocx (pt-br) 6 April 2007 EXPLORAR O PORTLET BEM-VINDO DESCUBRA SEU CAMINHO USANDO O NOVELL TEAMING NAVIGATOR

O programa Mysql acompanha o pacote de instalação padrão e será instalado juntamente com a execução do instalador.

MANUAL DE NAVEGAÇÃO DO MILLENNIUM BUSINESS

Bem- Vindo ao manual de instruções do ECO Editor de COnteúdo.

Cartilha da Nota Fiscal Eletrônica 2.0 Hábil Empresarial PROFISSIONAL & Hábil Enterprise

Manual Sistema MLBC. Manual do Sistema do Módulo Administrativo

Segurança de Acesso a Banco de Dados no MS SQL Server

Revisão: Introdução. - Integração com o AutoManager; 1 Atualização de versão do banco de dados PostgreSQL

Guia Sphinx: instalação, reposição e renovação

Tutorial Plone 4. Manutenção de Sites. Universidade Federal de São Carlos Departamento de Sistemas Web Todos os direitos reservados

Escaneando seu computador com o Avira AntiVir 10

Emissão de Cupons Fiscais usando ECF-IF

Como configurar s nos celulares. Ebook. Como configurar s no seu celular. W3alpha - Desenvolvimento e hospedagem na internet

CONFIGURAÇÃO MINIMA EXIGIDA:

Upload e Download de Arquivos. Ao programador Morfik, cabe implementar em sua aplicação os mecanismos gerenciem todo o processo acima.

Portal do Senac: Área Exclusiva para Alunos Manual de Navegação e Operação

Google Drive. Passos. Configurando o Google Drive

Manual de Instalação ProJuris8

Inserindo Dados no Banco de Dados Paradox.

Manual AGENDA DE BACKUP

Manual Transferência Registro de uma estação de trabalho para outra. FullCopyConvert Data

Manual de Instalação e Configuração do SQL Express

Manual do Sistema "Vida Controle de Contatos" Editorial Brazil Informatica

Restart Informática Ltda. Equipe de Suporte [E-CAFI] Manual da equipe de Suporte. Proibida a reprodução e distribuição não autorizada.

Como criar uma conta gratuita e subir uma foto no Windows Azure

EDITORA FERREIRA MP/RJ_EXERCÍCIOS 01

INSTALAÇÃO DO SISTEMA CONTROLGÁS

AP_ Conta Aplicativo para digitação e envio de contas médicas no padrão TISS

CRIANDO BANCOS DE DADOS NO SQL SERVER 2008 R2 COM O SQL SERVER MANAGEMENT STUDIO

Persistência de Dados

Trabalhando com conexão ao banco de dados MySQL no Lazarus. Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2011

ECD1200 Equipamento de Consulta de Dados KIT DE DESENVOLVIMENTO

MANUAL DO GERENCIADOR ESCOLAR WEB

Instalação: permite baixar o pacote de instalação do agente de coleta do sistema.

FileMaker Pro 13. Utilização de uma Conexão de Área de Trabalho Remota com o FileMaker Pro 13

PORTAL DE COMPRAS SÃO JOSÉ DO RIO PRETO

Agendamento para Importação de Notas Fiscais

Como Gerar documento em PDF com várias Imagens

Índice: CMS 3 O que é Content Management System? Clientes 4 O que é o Cliente? 4 Configurando o i-menu/i-view para trabalhar. com o CMS.

O sistema que completa sua empresa Roteiro de Instalação (rev ) Página 1

Manual do Visualizador NF e KEY BEST

Manual de Atualização Versão

ALTERNATIVA PARA CONEXÃO VIA INTERNET DE IP MASCARADO A IP REAL

TUTORIAL DO ALUNO. Olá, bem vindo à plataforma de cursos a distância da Uniapae!!!

Como funciona? SUMÁRIO

O Primeiro Programa em Visual Studio.net

CONFIGURAÇÃO DE REDE SISTEMA IDEAGRI - FAQ CONCEITOS GERAIS

Google Drive: Acesse e organize seus arquivos

Banco de Dados BrOffice Base

Manual do Sistema "Vida em Mão - Controle Financeiro Para PALM" Editorial Brazil Informatica

Como incluir artigos:

Manual de Instalação

Iniciação à Informática

Manual de Utilização do PDV Klavix

Vamos criar uma nova Página chamada Serviços. Clique em Adicionar Nova.

SUMÁRIO 1. AULA 6 ENDEREÇAMENTO IP:... 2

BACKUP ONLINE PASSOS PARA CONFIGURAÇÃO INICIAL DO PRODUTO

TUTORIAL III: ADICIONANDO AJUDA. Adicionando Ajuda

SUMÁRIO Acesso ao sistema... 2 Atendente... 3

Orientação a Objetos

LOJA ELETRÔNICA MANUAL DE INSTALAÇÃO

Curso de Informática Básica

Atualizaça o do Maker

STK (Start Kit DARUMA) Primeiro contato com a Impressora Fiscal, a ECF chegou e agora?

MANUAL DE CONFIGURAÇÃO DO BACKUP

AMBIENTE. FORMULÁRIO: é a janela do aplicativo apresentada ao usuário. Considere o formulário como a sua prancheta de trabalho.

Barra de ferramentas padrão. Barra de formatação. Barra de desenho Painel de Tarefas

Leia isto primeiro primeir

Transcrição:

Revista The Club Megazine - 03/2002 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 são terminantemente proibidos sem autorização escrita dos titulares dos direitos autorais. Copyright The Club 2002

EDITORIAL Editorial THE CLUB Rua Acre, 950 - Avaré - SP - CEP 18.700-260 Informações: (0xx14) 3732-3689 Suporte: (0xx14) 3733-1588 Fax: (0xx14) 3732-0987 Internet http://www.theclub.com.br Cadastro: cadastro@theclub.com.br Suporte: suporte@theclub.com.br Informações: info@theclub.com.br Dúvidas Correspondência ou fax com dúvidas devem ser enviados ao - THE CLUB, indicando "Suporte". Opinião Se você quer dar a sua opinião sobre o clube em geral, mande a sua correspondência para a seção "Tire sua dúvida". Reproduçã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 são terminantemente proibidos sem autorização escrita dos titulares dos direitos autorais. Copyright The Club 2002 Impressão e acabamento: Impressos Gril - Gril Gráfica e Repr. Ind. Ltda. Tel.: (0xx14) 3762.1345 - Fax: (0xx14) 3762.1259 Rua São Paulo, 447 - Cep 18.740-000 Taquarituba - SP Tiragem: 5.000 exemplares Diretor - Presidente Celso Jefferson M. Paganelli Diretor Técnico Mauro Sant Anna Colaboradores Mário Camilo Bohm - Claudenir C. Andrade Anderson Haertel Rodrigues - Cláudio Akerman Delphi é marca registrada da Borland International, as demais marcas citadas são registradas pelos seus respectivos proprietários. O THE CLUB em conjunto com a VUE firmaram uma parceria para aplicação de testes especializados da Microsoft, Novell Cisco e outros. Eis alguns exemplos de certificação da Microsoft: MCP - Microsoft Certified Professional - Pessoa que passou em pelo menos um exame de certificação da Microsoft. MCSE - Microsoft Certified System Engineer - Pessoa que passou em 7 exames de certificação da Microsoft. Profissional totalmente habilitado para trabalhar com o ambiente do Windows 2000. Este profissional hoje é tão requisitado que, as pessoas que conquistam essa certificação tem emprego garantido na Brás e Figueiredo, o maior parceiro da Microsoft no mundo. MCDBA - Microsoft Certified DataBase Administrator - Pessoa que passou em 4 exames. Dois exames de Windows 2000 e dois de SQL Server. MCSD - Microsoft Certified Solution Developer - Pessoa que passou em 4 exames. Dois exames sobre Visual Basic ou C, um sobre SQL Server, um sobre análise de sistemas. MCSA - Microsoft Certified System Administrator - Pessoa que passou em 4 exames sobre Windows 2000. Os exames podem ser feitos no THE CLUB. Para maiores informações ligue para (14) 3732-3689. Informações sobre a certificação Microsoft e os exames disponíveis podem ser obtidos no endereço: http://www.microsoft.com/mcp. As inscrições também podem ser feitas no site da VUE: http://www.vue.com. Celso Jefferson Paganelli Presidente - The Club Editorial...03 News...04 HOTSYNC com emulador...05 Tratamento global de exceptions...08 Dicas de instruções e comandos Oracle...11 Que fazer para... Recuperar as formas de pagamento do ECF...15 Trabalhando com o campo BLOB no Interbase...16 FireBird a continuidade do Interbase Open-Source..24 Eventos...27 Dicas & Truques...30 MeGAZINE 3

NEWS ReNet Tecnologia lança a versão 3.0 do software XTNDConnect Professional Edition A ReNet Tecnologia Ltda lançou em Março/2001 a versão 3.0 do software XTNDConnect Server Professional Edition (lê-se Extend Connect), da Extended Systems Inc, que é solução centralizada de sincronização e gerenciamento de equipamentos móveis, independente de plataforma. Suporta uma ampla variedade de plataformas como: Palm OS, Windows CE/Pocket PC, Symbian. Suporta conexão TCP/IP entre o equipamento móvel e o servidor através de RAS, PPP, rede local, e redes sem fio 802.11B, CDMA, TDMA, GSM e CDPD. Com o XTNDConnect Server, a equipe de TI tem um padrão corporativo para gerenciar de maneira centralizada os equipamentos móveis, com recursos de sincronização de servidores Groupware e/ ou servidores de banco de dados, trazendo ainda benefícios como: ferramentas para gerenciar os dados e aplicações transferidas para os equipamentos móveis, configurar tarefas para automaticamente distribuir e configurar e distribuir aplicações, log de status e erros. Sua interface intuitiva faz com que o processo de sincronização seja configurado de maneira fácil e rápida, trazendo benefícios tanto para os usuários quando para a equipe de TI. Para o usuário corporativo, a 4 integração dos equipamentos móveis com a organização significa fazer os equipamentos móveis mais úteis e fáceis de usar. A interface cliente do XTNDConnect Server PE foi desenvolvida para ser solução transparente, intuitiva e de fácil uso. A solução XTNDConnect Server permite que usuários de equipamentos móveis sincronizem dados como emails, agendas, contatos, tarefas, informações de banco de dados corporativos via ODBC, além de recursos gerenciais como: distribuição automática de aplicativos, backup e restore de dados. Tudo isso de maneira segura, pois o XTNDConnect utiliza o algorítmo de criptografia de 128 bits da CERTICOM. A solução XTNDConnect Server é testada e homologado por várias empresas parceiras como : Agilent, Compaq, Hewlett- Packard, IBM, Microsoft, Nec, Palm e Toshiba. A nova versão XTNDConnect Server 3.0 Professional Edition além dos recursos acima ainda possui : o Recurso Auto Messaging : permite que equipamentos móveis com rede wireless fiquem sempre ouvindo a rede e utilizarem a tecnologia push para receber emails, incluindo os novos recursos do Palm 705. * Nova interface gráfica para o usuário, incluindo o conceito de profiles. * Protocolo de comunicação otimização para redes wireless. * Melhorado o processo de distribuição de clientes para os equipamentos móveis. * Mail Plus para Palm OS: recurso que agiliza o processo de sincronização de e-mail. Também suporta recurso de reunião ( meeting requests ) e também melhor recurso para manipulação de arquivos anexados ( attachments ). * Novas funções de gerenciamento no recurso MMC (Microsoft Management Console). Conheça mais sobre o XTNDconnect e a soluções de computação móvel em www.renet.com.br, ou contate-nos para maiores informações. MeGAZINE ReNet Tecnologia Ltda. - Tel.: 11 3872-0423

HOTSYNC com Emulador Por: Claudio Akerman Olá amigos do The Club, estamos de volta com mais um artigo sobre a plataforma Palm. Em uma das edições anteriores, mostramos como você pode desenvolver um sistema de Conduit usando o Delphi. Para testar seu Conduit, você pode usar o Emulator do Palm para garantir que seu Conduit esteja funcionando perfeitamente antes de colocá-lo em produção em equipamentos Palm. É isso que vamos mostrar hoje! Configurando o ambiente Configurando o PC Clique com o botão direito do mouse no ícone do Hotsync Introdução O emulador é uma ótima ferramenta para se testar aplicações em desenvolvimento. Transferir uma aplicação para o Emulador é muito mais rápido do que para um dispositivo Palm. Vantagens 1) O Hotsync com o emulador é mais rápido que o realizado com o próprio dispositivo; 2) Capacidade de testar vários modelos diferentes de dispositivos; 3) Capacidade de configurar diferentes usuários; 4) Não gasta bateria; 5) Não necessita porta serial; Versão do Palm OS O sincronismo em rede, que permite o Hotsync com o emulador, está disponível nas versões do PalmOS superiores a 3.0, ou seja, a ROM utilizada no emulador deverá ser de uma versão igual ou superior a esta. 1. Marque a opção Network. As outras opções (Local e Modem) também podem estar marcadas. Entre na opção de Setup. MeGAZINE 5

1 - Escolha a aba Network. 2 - Marque os usuários que terão permissão de efetuar o HotSync. 3 - Clique neste botão para ver e anotar os dados de TCP/IP da sua estação de trabalho. Configurando o Emulador 1 - Clique com o botão direito do mouse sobre o emulador e escolha: Settings e em seguida Properties. Preencha a caixa HotSync User Name com o nome do usuário que será utilizado para efetuar o sincronismo. 6 MeGAZINE

2 - Selecione a aplicação HotSync 5 -Selecione no menu a opção Primary PC Setup. 3 - Selecione no menu a opção Modem Sync Prefs Escreva em Primary PC Name ou em Prymary PC Address os dados anotados do TCP/IP Settings de sua máquina. 6 - Selecione Modem na tela principal do HotSync Escolha a opção Network 4 -Selecione no menu a opção LANSync Prefs Clique em seguida em Select Service. 7 - Você pode deixar marcado o serviço default. Service: Aimnet Em seguida entre com o telefone 00. 8 - Agora clique no ícone do HotSync e ele irá acontecer. Escolha a opção LANSync. MeGAZINE 7

.NET Tratamento Global de Exceptions Por Mauro Sant Anna (santanna@mas.com.br). Mauro é um MSDN Regional Director, consultor e instrutor da MAS Informática (www.mas.com.br), tendo ministrado treinamentos na arquitetura.net desde outubro de 2000 para diversas empresas, dentre as quais a própria Microsoft. Este artigo não pretende abordar amplamente o mecanismo de tratamento de exceptions e sim mostrar um pequeno truque. Este truque NÃO dispensa o correto tratamento de exceptions nem a farta distribuição de try/finallys, ambos usualmente esquecidos mas isto é outra longa e triste história que ficará para outra ocasião. Muitas vezes estamos processando exceptions para tomar decisões importantes na execução dos aplicativos. No entanto, algumas vezes o tratamento e exceptions NÃO afeta a lógica do programa, pois estamos APENAS fazendo uma ou mais das seguintes tarefas: Traduzindo as mensagens de erro para Português (enquanto a versão localizada do.net Framework não está disponível); Mostrando as mensagens em uma caixa de diálogo mais bonitinha; Logando as mensagens de erro em um arquivo ou no System Log. Nestes casos mais simples E APENAS NELES é possível fazer um tratamento global de exceptions. Para isto, criaremos um método 8 que vai tratar as exceptions e o associaremos com um evento do aplicativo. Quem tiver familiaridade com o Delphi da reconhecerá o mecanismo usado, pois ele também está disponível na ferramenta da Borland. Criando a função de tratamento Crie um projeto C# com formulários no Visual Studio.NET: Criando a função de tratamento Crie um projeto C# com formulários no Visual Studio.NET:: MeGAZINE

.NET Na classe do formulário, crie um método como o mostrado a seguir. O nome do método e dos argumentos podem variar, mas os tipos dos argumentos devem ser mantidos: public void DeuPau(object sender, System.Threading.ThreadExceptionEventArgs t) { // Trata exception MessageBox.Show (this, t.exception.message, Deu Pau ); } onde a exception foi gerada; Embora estejamos fazendo o tratamento no formulário principal, ele funciona para todos os formulários. Testando Para testar o nosso programa, devemos causar o disparo de algumas exceptions. Acrescente botões ao formulário: Associando o tratamento global Precisamos agora associar as exceptions ao método acima. No construtor do formulário acrescentaremos uma linha de código: public Form1() { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // Application.ThreadException+=new System.Threading.ThreadExceptionEventHandler(DeuPau); } Note o seguinte: Não há nada de mágico no código acima. A classe Application foi especialmente preparada de forma a permitir que um método criado depois trate as exceptions; Este mecanismo depende do message loop dentro do método Application.Run(), o que por sua vez significa que este mecanismo só está disponível para programas que usem formulários; O fato do programa não terminar quando ocorrer uma exception também é uma característica de como é feito o tratamento das exceptions no código do message loop : o processamento da mensagem do Windows que disparou a exception é terminado (por exemplo um click no botão ou item de menu), mas as próximas mensagens são processadas normalmente; Caso o código que processe o evento trate a exception, o tratamento global não será executado. Este é um comportamento desejável; Não temos informações específicas de onde ocorreu ou o que exatamente ocorreu. Não podemos também reiniciar o código de Coloque o código seguinte para processar os eventos Click: // Divisão por zero private void button1_click(object sender, System.EventArgs e) { decimal x = 0; decimal y = 10 / x; Text = y.tostring(); } // Arquivo não existe private void button2_click(object sender, System.EventArgs e) { System.IO.StreamReader Arq = new System.IO.StreamReader( xxx.www ); } // Acesso a referência nula private void button3_click(object sender, System.EventArgs e) { object O = null; Text = O.ToString(); } // Cast inválido MeGAZINE 9

.NET private void button4_click(object sender, System.EventArgs e) { int i = 10; object O = i; double d = (double) O; } // Conversão inválida private void button5_click(object sender, System.EventArgs e) { Convert.ToInt32( Z ); } Veja um exemplo do tratamento: Tratando cada exception Você pode identificar a exception disparada e dar um tratamento especial a cada uma delas. Você pode também dar um tratamento padrão às exceptions desconhecidas. Veja o código para fazer isto: public void DeuPau(object sender, System.Threading.ThreadExceptionEventArgs t) { // Trata exception string Msg; if (t.exception is DivideByZeroException) Msg = Não posso dividir por zero ; else if (t.exception is System.IO.IOException) Msg = Problema no acesso a arquivo ; else if (t.exception is NullReferenceException) Msg = Referência nula acessada ; else if (t.exception is InvalidCastException) Msg = Problema na conversão de tipos ; else if (t.exception is FormatException) Msg = Não posso converter o texto suprido ; else Msg = Exception desconhecida\r\n + t.exception.message; MessageBox.Show(this, Msg, Deu Pau ); } Conclusão O tratamento global de exceptions, embora esteja longe de resolver todas as questões relacionadas ao tema, é uma técnica útil para fazer um tratamento simples. 10 MeGAZINE

ORACLE Dicas de Instruções e Comandos Oracle... Mário Camilo Bohm - Bohm,Interal Fone (011) 4221.6151 - mario@bohminteral.com.br Neste mês, vamos discutir algumas dicas bastante úteis para programação SQL e para administração de bases Oracle. Divirtam-se! LIMITANDO O NÚMERO DE LINHAS DO SELECT Vamos tomar como hipótese uma tabela de CLIENTES com mais de 100.000 registros. Depois de ordená-la por um determinado campo, LIMCRED por exemplo, que equivale ao limite de crédito do cliente, podemos desejar ver apenas os registros mais significativos, que contém os maiores limites de crédito. Podemos para isso utilizar então a cláusula ROWNUM e definir para ela um parâmetro, que corresponderá ao número de linhas que iremos desejar no retorno do SELECT. Veja que simples: MeGAZINE 11

ORACLE GROUP BY E A CLÁUSULA HAVING Imaginemos agora que queremos totalizar nossas vendas por cliente, utilizando para isso um join da tabela CLIENTES com a tabela PEDIDOS, que guarda no campo CHAVE_CLIENTE a identificação do CLIENTE daquele pedido, fundamentando uma CONSTRAINT FOREIGN KEY. Podemos para isso utilizar a cláusula GROUP BY, agrupando, totalizando e calculando a média das vendas por cliente. É evidente que iremos obter tantos registros quantos forem os clientes com negócios dentro da seleção que fizermos, o que nem sempre é necessário e importante para nossas análises. Podemos desejar como resultado, por exemplo, apenas os clientes com mais de R$ 3.150.000,00 de pedidos acumulados. Para isso, podemos utilizar a cláusula HAVING dentro de nosso GROUP BY. Veja que simples: 12 MeGAZINE

ORACLE Agora temos apenas os clientes que tem vendas acumulada acima do parâmetro que definimos na cláusula HAVING. Simples não? LISTANDO OS OBJETOS DE UM USUÁRIO Para identificarmos e listarmos os objetos de um determinado usuário Oracle, podemos utilizar a VIEW USER_OBJECTS do dicionário de dados. Vamos utilizar então essa VIEW para listarmos, em ordem de TIPO DE OBJETO e depois de NOME DE OBJETO, todos os objetos do usuário em que estivermos conectados: MeGAZINE 13

ORACLE A partir daí fica fácil, por exemplo, listarmos apenas os objetos TABLE do usuário, em ordem de nome do objeto: Simples também não é mesmo? Você vai notar, contudo, que os objetos CONSTRAINT não aparecem nessa VIEW, porque na verdade são objetos que dependem da existência de outros e estão relacionados na VIEW USER_CONSTRAINTS. No próximo mês continuaremos com novas e interessantes dicas. Até lá! 14 MeGAZINE

Por: Claudenir C. Andrade - Analista de Sistemas para Automação Comercial claudenir@bematech.com.br DELPHI Que fazer para... Recuperar as formas de pagamento do ECF? Em um PDV existem vários controles que devem ser emitidos pelo próprio ECF ou controles internos do software para manter a consistência entre o ECF e o Software de automação comercial. Entre estes controles podemos enumerar vários deles, por exemplo, Número de itens cancelados, Número de Itens Vendidos, Número de Reduções ou Fechamentos Realizados, Total de Cancelamentos, total de Sangrias e Suprimentos realizados, etc.. Entre todos estes controles existe um muito critico e de importância vital para o controle do caixa Formas de Pagamento. No ECF as formas de pagamento devem ser cadastradas no começo do dia fiscal, antes de realizar qualquer venda no PDV. Toda vez que o operador realiza um fechamento de caixa, Redução z Além de zerar os totalizadores existentes o ECF também irá eliminar os valores e as descrições das formas de pagamento cadastradas no começo do dia. Que problema!! Já imaginou se no meio do dia seu cliente necessita cadastrar uma forma de pagamento? Impossível fazer isso em alguns ECFS. Na Bematech, utilizando a DLL BemaFI32.dll ao realizar uma venda e fechar o cupom fiscal, a dll com um comando interno cadastra as formas de pagamento automaticamente no ECF, exonerando o software da tarefa de todos os dias, ao abrir o caixa, enviar as formas de pagamento, pré-fixadas, para o ECF. Esta vantagem pode ser uma faca de dois gumes, porque? Porque assim como você tem esta facilidade de ter o cadastramento das formas de pagamento dinamicamente, ou seja no ato da venda, o seu software possui uma probabilidade maior de estar sem sincronia, as formas de pagamento cadastradas no ECF com as formas de pagamento cadastradas em seu software. Por isso, em nossa que fazer para.. deste mês estamos falando exatamente sobre isso, como ler as formas, as descrições, das formas de pagamento do ECF. Segue abaixo um algoritmo que o que fazemos é 1) Chamar a função da dll que nos devolve as formas de pagamento com seus valores 2) Destrinchar os valores das descrições 3) Armazenar as descrições em um array Com isso teremos este array a nossa disposição para alimentar um Combo ou um list Box, exibir para o usuário as formas de pagamentos disponíveis ou, conforme comentamos nos parágrafos iniciais, emitir um relatório das formas de pagamento. Tenho a certeza que o algoritmo abaixo será muito útil em sua aplicação. procedure TForm1.Leitura_FormasdePagamento ; Var sformas: string; sdescricao: string; iconta:integer; aformaspagamento: array[0..16] of string; iret :Integer; for iconta := 1 to 3016 do sformas := sformas + ; iret := Bematech_FI_VerificaFormasPagamento ( sformas ); sdescricao:= Dinheiro ; iconta:=0; While (iconta<=16) do sdescricao:=copy( sformas, 0, 16); if (Trim(sDescricao)= ) then exit; sformas:=copy(sformas,59,strlen (Pchar(sFormas)) - 60); aformaspagamento[iconta]:=trim(sdescricao); iconta:=iconta+1; MeGAZINE 15

Trabalhando com campo Blob no Interbase. Um das características mais úteis da maioria dos bancos de dados modernos é a habilidade para armazenar dados binários, por exemplo, dados de qualquer tipo, formato, ou tamanho. O InterBase foi de fato o primeiro banco de dados a caracterizar tal tipo de campo, e se refere a isto como um BLOB. Aqui está como foi definido na documentação do InterBase: O InterBase fornece um tipo (BLOB) para armazenar dados que não podem ser armazenados facilmente em um dos tipos de dados padrões do SQL. Um BLOB é usado para armazenar dados muito grandes de tamanho indeterminado e variável, como imagens, arquivos de som, segmentos de vídeo ou qualquer outro tipo de informação multimidia. A ferramenta básica para se trabalhar com campos Blob são os métodos do TBlobField chamados LoadFromFile e SaveToFile. Se a única coisa que você quer fazer com um BLOB é carregar um arquivo externo que contém os dados do BLOB em uma tabela da banco de dados, ou salvar os dados do BLOB em uma tabela do banco de dados para um arquivo externo, estes são os únicos métodos que você precisará. Porém, você pode fazer muito mais com o BLOB utilizando os componentes nativos do Delphi. Este artigo mostra técnicas para pegar dados Blob dentro e fora dos campos em registros de banco de dados, memória, arquivos e componentes do Delphi. O exemplo que acompanha este artigo usa uma base de dados Interbase, os componentes da palheta Interbase Express, e um ClientDataSet, mas os mesmos métodos e técnicas trabalharão com a maioria dos componentes dataset do Delphi. O banco de dados Interbase tem apenas duas tabelas. A primeira é Blobs, e a estrutura é mostrada na figura 1. O BLOB_TYPE_DOMAIN é um VarChar(32) usado para receber uma descrição de texto do tipo BLOB no registro. A segunda tabela, Blob_Type, contém uma lista de tipos Blobs válidos e é usado para validar o valor do campo Blob_Type na tabela Blobs. A validação do campo Blob_Type é feito por triggers Before Insert e Before Update. O valor do campo Blob_ID é fornecido por um generator. CREATE TABLE Blobs ( Blob_ID INTEGER NOT NULL, Blob_Type BLOB_TYPE_DOMAIN, Text_Data BLOB SUB_TYPE TEXT SEGMENT SIZE 80, Binary_Data BLOB SUB_TYPE 0 SEGMENT SIZE 512, PRIMARY KEY( Blob_ID )); Figura 1: Estrutura da tabela Blobs Trabalhando com Bitmaps Os métodos LoadFromFile e SaveToFile são métodos da classe TBlobField. TBlobField é a classe de objeto de campo usada por campos Blob se você instanciar o campo em tempo de design usando o Fields Editor, ou deixar o Delphi criar o campo dinamicamente em tempo de execução. A figura 2 mostra o código do botão Load File no form BitMap da aplicação exemplo mostrada na figura 3. Este código começa configurando a propriedade InitialDir do componente TOpenDialog chamado OpenBmpDialog e então ele chama o método Execute para 16 MeGAZINE

mostrar a caixa de diálogo. Se o usuário escolher um arquivo e clicar no botão OK, o código verifica se o ClientDataSet, cdsblob, está em modo Browse. Neste caso o método Edit do ClientDataSet é chamado. Depois o método LoadFromFile é chamado para carregar o conteúdo do arquivo selecionado para dentro do campo Binary_Data do registro corrente. procedure TfrmBmp.btnLoadFileClick(Sender: TObject); with OpenBmpDlg do InitialDir := ExtractFilePath( Application.ExeName + gfiledir); if not Execute then Exit; if dmmain.cdsblob.state = dsbrowse then dmmain.cdsblob.edit; dmmain.cdsblobbinary_data.loadfromfile( OpenBmpDlg.FileName); Figura2: Código do botão Load File do form BitMap Este código só trabalha porque o campo cdsblob ClientDataSet foi instanciado em tempo de design usando o Fields Editor, assim que o objeto instanciado TBlobField chamado cdsblobbinary_data poderia se usado para chamar o método LoadFromFile. Se você tentar usar: dmmain.cdsblob.fieldbyname( Binary_Data ). LoadFromFile(OpenBmpDlg.FileName; você receberá um erro Undeclared identifier: LoadFromFile. Isto acontece porque o método FieldByName retorna uma referencia de objeto TField e TField não tem o método LoadFromFile. Se você quer usar o FieldByName ou o array de Fields para acessar os campos, você terá que converter a referência para TBlobField como mostrado na instrução abaixo: dmmain.cdsblob.tblobfield(fieldbyname( Binary_Data )).LoadFromFile(OpenBmpDlg.FileName; O botão Save File do form BitMap usa um código quase igual. A única diferença é que ele usa um TSaveDialog e chama o método SavetoFile O BitMap é o tipo mais fácil para se trabalhar com o Delphi, porque ele pode ser mostrado através de um componente DBImage. O único truque para mostrar bitmaps é como você quer controlar o tamanho da imagem em relação ao tamanho do componente DBImage. Existem duas escolhas. A primeira, é mostrar o bitmap com o tamanho atual configurando a propriedade Strech do DBImage para False. Se o Bitmap for maior que o componente DBImage, você só poderá ver parte da imagem. Isto é provavelmente insatisfatório desde que não exista um caminho para adicionar um scroll bar para o DBImage para permitir que os usuários movam para outras áreas da imagem. Resolver o problema em relação a largura e altura é fácil se todas as imagens tiverem o mesmo tamanho. Tudo o que você tem que fazer é ter certeza de configurar as propriedades Width e Height do DBImage para estar compatível em relação a largura e altura dos seus bitmaps em tempo de design. O exemplo tem bitmaps em ambas orientações portrait e landscape. Para resolver o problema, o método SetImageSize, mostrado na figura 4, foi chamado a partir do evento AfterScroll do ClientDataSet cdsblob. O DBImage tem uma propriedade Picture do tipo TPicture que é uma referência ao objeto TPicture que guarda o bitmap. O SetImageSize usa as propriedades Picture.Width e Picture.Height do DBImage para determinar se a orientação da imagem é portrait ou landscape. Se a orientação for portrait, o método configura a altura do DBImage para a altura do painel que o contém menos dois pixels e calcula a largura do DBImage para preservar a relação entre a largura e a altura. Se a orientação for landscape, o método configura a largura do DBImage para a largura do painel menos dois pixels, e calcula a altura para manter a relação entre a largura e a altura. procedure TfrmBmp.SetImageSize; if dbibmp.picture.height > dbibmp.picture.width then if dbibmp.picture.height > 0 then dbibmp.height := pnlbmp.height - 2; dbibmp.width := Trunc(dbiBmp.Height * (dbibmp.picture.width / dbibmp.picture.height)); dbibmp.left := (pnlbmp.width-dbibmp.width) div 2; dbibmp.top := 1; end else if dbibmp.picture.width > 0 then dbibmp.width := pnlbmp.width - 2; dbibmp.height := Trunc(dbiBmp.Width * (dbibmp.picture.height / dbibmp.picture.width)); dbibmp.top := (pnlbmp.height-dbibmp.height) MeGAZINE 17

div 2; dbibmp.left := 1; Figura 4: O método SetImageSize Para pegar uma imagem que está no DBImage e jogá-la para a área de transferência, chame a propriedade CopyToClipboard do componente DBImage. Para colar um bitmap da área de transferencia para um DBImage, chame o método PasteFromClipBoard. Veja na figura 5 código do botão Copy and Paste. procedure TfrmBmp.btnCopyClipboardClick (Sender: TObject); dbibmp.copytoclipboard; procedure TfrmBmp.btnPasteClick(Sender: TObject); dbibmp.pastefromclipboard; Figura 5: Evento OnClick do botão Copy and Paste. Uma das desvantagens do bitmap é que neste formato não há compressão, então os arquivos são muito grandes. Se você precisar salvar um bitmap para um arquivo e quiser diminuir o seu tamanho, você pode convertê-lo para o formato JPEG. O formato JPEG diminui muito o tamanho do arquivo. Veja na figura 6 o código para salvar a imagem bitmap para jpeg. procedure TfrmBmp.btnSaveJpegClick(Sender: TObject); var JpegImage: TJpegImage; JpegImage := TJpegImage.Create; try JpegImage.Assign(dbiBmp.Picture.Bitmap); JpegImage.SaveToFile(ExtractFilePath( Application.ExeName) + gfiledir + Bitmap.jpg ); finally JpegImage.Free; Figura 6: Salvando um bitmap para jpeg. Este método inicia criando uma instância da classe TJpegImage. O código converte o bitmap que está sendo mostrado no DBImage chamando o método Assign do objeto JpegImage, e passando a propriedade Bitmap do objeto Picture referenciado pela propriedade Picture do componente DBImage como parâmetro. Isto converte o bitmap para jpeg. Depois o método SaveToFile do objeto JPegImage é chamado para salvar a imagem para o arquivo BitMap.jpg. Finalmente o objeto JPegImage é liberado. Você pode reduzir a compressão e aumentar a qualidade da imagem jpeg modificando a propriedade CompressionQuality do objeto JpegImage como descrito no help. Usando Blob em Queries Para incluir um dado BLOB em uma query INSERT ou UPDATE, você deve usar um parâmetro para dados Blob. A figura 7 mostra o código do evento OnClick do botão Insert Query do form Bitmap. Este código carrega um arquivo bitmap na memória, então usa uma query INSERT para adicionar um novo registro, que inclui um bitmap na tabela. O método inicia criando um objeto FileStream que abre o arquivo Greenstone.bmp para leitura. Uma variável string chamada Buff é usada para guardar o bitmap na memória. O próximo passo é configurar o tamanho do buff para o tamanho do arquivo chamando SetLenght e passando o Buff como primeiro parâmetro e BinFile.Size como segundo parâmetro. A próxima linha chama o método Read para ler o arquivo inteiro para a string. Note que você não pode passar a variável string Buff como primeiro parâmetro para o método Read porque este parâmetro é um ponteiro sem tipo para localizar na memória. Instanciado você deve passar o primeiro elemento da array string, o qual é um ponteiro para o inicio do bloco de memória onde as informações estão gravadas. procedure TfrmBmp.btnInsertQueryClick(Sender: TObject); var BinFile: TFileStream; Buff: string; with dmmain.ibsqlmisc do // Cria objeto FileStream BinFile := TFileStream.Create(ExtractFilePath( Application.ExeName) + gfiledir + Greenstone.bmp, fmopenread or fmsharedenywrite); try // aloca memória para o buffer SetLength(Buff, BinFile.Size); 18 MeGAZINE

// carrega arquivo para o buffer BinFile.Read(Buff[1], BinFile.Size); // instrucao SQL para inserir a imagem. dmmain.ibsqlmisc.sql.add( INSERT INTO Blobs (Blob_Type, Binary_Data) + VALUES (:BlobType, :BlobData) ); dmmain.ibtranmisc.starttransaction; try // atribui parametros dmmain.ibsqlmisc.params.byname( BlobType ).AsString := btbmp; dmmain.ibsqlmisc.params.byname( BlobData ).AsString := Buff; // Executa query. dmmain.ibsqlmisc.execquery; finally dmmain.ibtranmisc.commit; finally BinFile.Free; dmmain.cdsblob.refresh; Figura 7: Código do evento OnClick do botão Insert Query. O data module do exemplo contém um componente IBSQL, ibsqlmisc, que é usado para inserir um novo registro. A instrução INSERT INTO Blobs (Blob_Type, Binary_Data) VALUES (:BlobType, :BlobData) é incluida na propriedade SQL se o componente IBSQL e os valores forem informados para os dois parâmetros na instrução SQL. Note que o parâmetro BlobData é informado usando a sua propriedade AsString da variável string Buff que contém o bitmap. Finalmente o código começa uma transação, executa a query, dá um commit na transação e libera o FileStream. A atualização de um campo Blob em um registro existente é feito exatamente da mesma forma. Isto pode parecer estranho para usar uma variável string para armazenar o Blob, mas esta é única opção disponível para os componentes IBSQL e IBDataSet porque seus parametros estão em uma propriedade AsBlob. Se você está usando componente dataset do BDE ou qualquer outro componente dataset que usem o objeto TParam para parametros, você terá a opção de usar a propriedade AsBlob. Você pode usar um PCHAR para armazenar o Blob e informar o PCHAR para o parâmetro usando: Query1.ParamByName( BlobData ).AsBlob := SomePCharThatContainsTheBlob; Trabalhando com imagens JPEG O trabalho com imagens JPEG é muito similar ao trabalho com bitmaps, mas existe uma importante diferença. O primeiro destes é que o componente DBImage não mostra as imagens JPEG. Ao invés disso você deve usar um TImage e mover o JPEG do campo da base de dados via programação. Veja o código da figura 8, ele mostra o código do evento OnClick do botão View JPEG e o método LoadImageFromFile que pega a imagem JPEG do campo e mostra no componente image. procedure TfrmJpeg.btnViewClick(Sender: TObject); LoadImageFromField (imgjpeg, dmmain.cdsblobbinary_data); SetImageSize; procedure TfrmJpeg.LoadImageFromField(Image: TImage; ImageField: TBlobField); var MemStrm: TMemoryStream; Jpg: TJPEGImage; if ImageField.IsNull then Image.Picture.Assign(nil); Exit; Jpg := TJPEGImage.Create; try MemStrm := TMemoryStream.Create; try ImageField.SaveToStream(MemStrm); MemStrm.Seek(0, sofrombeginning); with Jpg do PixelFormat := jf24bit; Scale := jsfullsize; Grayscale := False; Performance := jpbestquality; ProgressiveDisplay := True; ProgressiveEncoding := True; LoadFromStream(MemStrm); Image.Picture.Assign(Jpg) finally MemStrm.Free; MeGAZINE 19

finally Jpg.Free; Figura 8: Método que mostra um JPEG da tabela em um componente Image. O LoadImageFromFile tem dois parametros. O primeiro é o componente Image que será usado para mostrar a imagem JPEG. O segundo é o campo BlobField para o campo que contém a imagem JPEG. O método começa checando se o campo tem alguma informação. Se não, ele configura a propriedade Picture do componente Image para nil. Se o campo contém informação, instancias do objeto TJPEGImage e do objeto MemoryStream serão criadas. Depois o método SaveToStream do objeto BlobField é chamado para copiar a imagem JPEG do campo para o MemoryStream. O código do bloco with configura as propriedades do objeto JPEGImage e chama o método LoadFromStream para carregar a imagem JPG no objeto JPEGImage do MemoryStream. Usando a área de transferência com um componente Image é diferente de usar a área de transferencia com o componente DBImage, como mostrado na figura 9. Visto que o componente Image não tem o método Clipboard, o objeto Clipboard do Delphi é usado para copiar uma imagem fora de, ou colar uma imagem dentro, do componente Image. procedure TfrmJpeg.btnCopyClipboardClick(Sender: TObject); Clipboard.Open; Clipboard.Assign(imgJpeg.Picture); Clipboard.Close; procedure TfrmJpeg.btnPasteClipboardClick(Sender: TObject); imgjpeg.picture.bitmap.assign(clipboard); Figura 9: Código dos botões Copy e Past do form JPEG. A figura 10 mostra como converter uma imagem JPEG para um bitmap e salvá-lo em um arquivo. Um objeto Bitmap é criado e o método Assign é chamado para converter o JPEG do componente Image para um bitmap e lê-lo no objeto BitMap. Salvar o bitmap para um arquivo é realizado chamando o método SavetoFile do objeto BitMap. procedure TfrmJpeg.btnSaveAsBmpClick(Sender: TObject); var BmpImage: TBitmap; BmpImage := TBitmap.CREATE; try BmpImage.Assign(imgJpeg.Picture.Graphic); BmpImage.SaveToFile(ExtractFilePath( Application.ExeName) + gfiledir + Jpeg.bmp ); finally BmpImage.Free Figura 10: Converting um JPEG para um bitmap. Veja o código do evento OnClick botão Save BMP to DB mostrado na figura 11. Este código mostra como usar BlobStream para ler uma imagem de qualquer objeto que tenha um método SaveToStream. Este exemplo cria um objeto Bitmap como um bitmap. O método então insere um novo registro no ClientDataSet determinando um valor para o campo Blob_Type, cria um objeto BlobStream, e chama o método SaveToStream para carregar o bitmap no campo. Finalmente o BlobStream é liberado, o registro é gravado e o Bitmap é liberado. Note que você deve liberar o BlobStream antes de gravar o registro ou o campo será nulo. procedure TfrmJpeg.btnSaveBmpToDbClick(Sender: TObject); var BmpImage: TBitmap; Bs: TStream; BmpImage := TBitmap.Create; try BmpImage.Assign(imgJpeg.Picture.Graphic); with dmmain.cdsblob do Insert; dmmain.cdsblobblob_type.asstring := btbmp; Bs := CreateBlobStream( dmmain.cdsblobbinary_data, bmwrite); try BmpImage.SaveToStream(Bs); finally Bs.Free; 20 MeGAZINE