Postagens

Mostrando postagens de maio, 2018

Enviar Arquivos por FTP com Delphi

Imagem
Hoje vamos trabalhar com envio de arquivos via FTP, parece que é muito difícil, mas nem tanto, apenas seguir algumas regras e o resultado sera bem legal. Adicione um componente IdFTP da paleta Indy Clients conforme figura abaixo:  Preenche as seguintes propriedades através de um evento de um botão ou no evento de sua preferencia em seu formulário:  Após os dados de conexão serem devidamente informados é hora de disparar o método de conexão através da chamada IdFTP1.Connect. Em caso de erro, verifique os dados da conexão e tente novamente. Em seguida precisamos determinar a pasta onde iremos posicionar nossos arquivos com o comando IdFTP1.ChangeDir, veja a imagem abaixo:  Neste exemplo o protótipo devera extrair imagens de um campo tipo Blob  do Firebird comumente usado para armazenar imagens. O resultado, você pode conferir na imagem abaixo: Fácil não? A aplicação destes recursos são muitas.

Percorrer todos os Edits do Form em Delphi

Imagem
Olá. Em algum projeto você ja precisou percorrer todos os controles do formulário que esta trabalhando?  Imagine se precisar limpar todos os TEdit do seu form, tendo em mente que são 5 ou 6 destes componentes, talvez fazer um código tabajara e limpar manualmente seja a melhor opção, agora e se fosse 50 TEdits a serem limpos? Ai já não é la muito inteligente fazer tudo no braço. Melhor maneira de resolver este problema é fazer um método varrer todo o formulário em busca destes componentes.  Em Delphi podemos fazer isso de uma maneira bem tranquila, veja o código abaixo: O que acontece durante a execução do código acima é que, toda vez que um novo componente é colocado no Form (que é um objeto conteiner) ele é adicionado numa lista de objeto e evidentemente posso percorrer esta lista, no if dentro do laço acontece o teste pra saber se o componente na posição atual é de uma determinada classe (neste caso TEdit) case seja verdadeiro, acionamos a propriedade Cle...

POO Delphi - Criando classe genérica de manipulação de arquivos .INI

Imagem
Olá. Neste artigo vamos falar um pouco de Programação Orientada a Objetos utilizando Delphi, confesso que é um tema recorrente e a implementação da especificação POO em Delphi é meio estranha, comparando-se com o JAVA, mas funciona que é uma maravilha e como facilita nossa vida. Neste exemplo vamos criar uma classe cuja finalidade é tornar o acesso simplificado as seções de arquivos de configuração .INI.  Com o Delphi aberto e já estando em um novo projeto, crie uma nova Unit no Delphi e declare os seguintes métodos e dependências conforme a figura abaixo: Para começar o entendimento do código da figura acima começamos pela seção Type que marca o inicio da declaração da classe TFile . Logo abaixo temos a seção private que segue o conceito de todas as linguagens de programação que diz que toda variável private apenas a unidade que a declara tem acesso a ela, ou seja, pFile só pode ser acessada de dentro da Classe TFile . Na seção Public encontramos um método Create...

Conhecendo o FireDac - trabalhando com Macros

Imagem
Olá. Macros são definidos na programação como um padrão de entrada que é substituído por um novo padrão de saída, ou seja, executam um processamento automático em algum ponto, em outros drives como DBX até podíamos utilizar variáveis e/ou parâmetros ou mesmo filtros utilizando condições como where e tal. Contudo não era possível por exemplo usar um parâmetro substituindo o nome da tabela. Ex.: "select * from :tabela" . No FireDac pode ser feito uso de variáveis de substituição como um processador de templates e substituir o texto da variável, usando caracteres "!" representando string e "&" representando (SQL). Interessante não.? Até mais. Fonte: guintherpauli.blogspot.com.

Conhecendo FireDac - Trabalhando com múltiplos bancos de dados.

Imagem
Olá. Existe muitas boas opções de bancos de dados no mercado e alguns bem conhecidos, tais como Oracle, MSSQL Server, MySQL, PostGres, Firebird e entre outros. E sempre uma tarefa bem difícil optar por um deles dado as suas qualidade individuais, contudo se seu projeto precisar dar suporte a múltiplos SGBD´s , o FireDac consegue atender tranquilamente a demanda sem perder as características individuais de cada um e o melhor de tudo, sem muito malabarismo por parte da equipe de desenvolvimento. A estratégia usada pelo componente é uma especie de diretiva de compilação semelhante a do pascal, veja o exemplo: Desta forma ao executar a instrução o componente sabe qual dialeto usar, não sendo mais necessário chamadas a API ou mesmo componente de terceiros. Até o próximo post. fonte: guintherpauli.blogspot.com

Conhecendo o FireDac - Trabalhando com Arrays

Imagem
Olá. Recentemente publiquei um post falando sobre a importação de dados para um banco através de um arquivo de retorno veja aqui  Importando registros de arquivo de retorno de folha de pagamento para um servidor na nuvem  . Foi utilizado uma operação de insert por meio da propriedade do DataSet conforme figura abaixo. Contudo existe uma forma bem mais elegante de se fazer esta operação utilizando Arrays através do FireDac . Este mesmo código poderia ser construído da seguinte forma. Veja: O resultado será uma string SQL neste formato: insert into tabela (conta, funcionario, valor) values  ('2', 'XXXXXX', 20), ('3', 'ZZZZZZ', 10), ('4', 'GGGGGG', 40), ('5', 'BBBBBB', 30) Qual a vantagem? será executado vários insert´s de uma unica vez no banco de dados. Fácil não? Até mais.

Conhecendo o FireDac - Trabalhando com Banco de Dados desconectado

Imagem
Olá. O FireDac é um conjunto de componentes de acesso a dados muito versátil para acesso a dados, atualmente faz parte do conjunto de componentes nativos do Delphi e proporciona acesso a qualquer banco que esteja pensando em utilizar em seus projetos. Com ele posso desenvolver de modo multiplataforma (banco de dados) sem perder nenhuma característica individual de cada banco.  Uma característica bem interessante no FireDac é a capacidade de alternar entre os estado Online e Offline sem levantar exceções por perda de conexões. Esta feature é bem interessante quando estamos em um ambiente onde a conexão é instável, permitindo a aplicação seguir seu funcionamento sem falhas de conexão. Para utilizar este recurso segue o exemplo de código conforme a figura abaixo.: No evento FormCreate apenas a conexão com o banco é ativada e a query Qr1 é aberta e o comando FetchAll é acionado, totalizando todos os registros retornados pelo resultset . No evento do botão btnOffLine a c...

Uma estrategia para não sincronizar dados todas as vezes que o aplicativo é iniciado.

Imagem
Olá. Este post não tem a pretensão de mostrar a melhor estratégia pra sincronizar dados entre a servidores na nuvem e seu aplicativo no seu device, mas pode te ajudar a ter uma ideia de como fazer isso.  Atualmente estou trabalhando em um projeto de aplicativo e estou fazendo em Delphi XE 10.2 é meu primeiro trabalho de cunho profissional (para dispositivos móveis) com esta ferramenta. No tocante a sincronizar os dados do banco de dados SQLite e o servidor na internet rodando MySQL houve a necessidade de saber quando foi a ultima vez que um outro software também feito exclusivamente para este projeto sincronizou estes dados na internet. Para esta tarefa utilizou-se a seguinte estratégia: Criar uma tabela chamada SINC no servidor web chamada com os campos ID e DATA_SINC, representando o código qualquer e a data e hora que os dados forma sincronizados. Veja a figura: Em seguida foi alterado no programa importador que apos o envio dos registros, criar um registro co...

Selecionando apenas o ultimo registro inserido com SQLite

Olá. Não é muito difícil surgir a necessidade de se buscar apenas o ultimo registro em bases de dados. Em todos os casos é muito simples de ser feito. O SQLite a exemplo do MySQL também possui um parâmetro chamado LIMIT que determina quantos registros a query deve retornar. Bem diversas são as formas de ser fazer isso e utilizando o poder da própria engine do banco de dados podemos ter sucesso utilizando a seguinte instrução.: SELECT * FROM SUATABELA ORDER BY SEUCAMPO DESC LIMIT 1 Exemplo: select * from secretarias order by codigo desc limit 1 Simples não?

Detectando conexões de Internet WiFi, 3G/4G e Conexão de rede em Android utilizando Delphi

Imagem
Olá. Hoje precisei garantias que um recurso bastante comum estava disponível para um projeto que estou trabalhando, a internet. Em dispositivos móveis podemos utiliza-la usando conexões de rede WiFi e/ou 3G/4G. Então para que o aplicativo não levante uma exceção já que é necessário verificar os dados no servidor, preciso garantias que ela esteja disponível em uma destas formas. Já trabalhei em projetos nativos utilizando o Android Studio e este é meu primeiro trabalho profissional usando o Delphi para dispositivos móveis, e no geral tenho gostado, contudo verificar a disponibilidade me deixou meio decepcionado, pois precisei de uma Biblioteca de terceiros (desenvolvida por um MVP da Embarcadeiro que não recordo o nome) pra fazer isso e sinceramente acho que merecia um recurso nativo. Bom pode ser que exista, mas eu não encontrei ninguém falando disto.  Então para resolver o problema utilizei a seguinte biblioteca. unit NetworkState; interface uses {$IFDEF IOS}...

Buscando uma substring dentro de outra string

Olá. Uma dica rápida para busca de um pequeno pedaço de texto denominado substring utilizando o Delphi. Mas porque vou precisar disso?. Bom a resposta é simples, porque você é desenvolvedor e um dia vai trabalhar com dados vindo de outros sistemas ou outros formatos de dados. No meu caso precisei verificar a existência dos dados bancários contidos no cadastro de funcionários e verificar se existiam pagamentos dentro de um arquivo de retorno vindo do banco.  Os parâmetros são case-sensitive e evidentemente fazem diferenciação entre maiúsculas e minusculas, tenha cuidado. Duvidas e sugestões comentai. Uma forma bem rápida de fazer isso é: if pos(lblContaCorrente.caption,QrPagamentos.FieldByName('conta').AsString)> 0 then    ShowMessage(‘Pagamento Existente' );

Integração entre sistemas heterogêneos

Imagem
Olá. Um dos maiores desafios encontrados hoje entre os desenvolvedores  é justamente propor a integração entre diferentes tipos de sistemas. Mesmo sendo uma necessidade recorrente não deixa de ser um bom desafio proporcionar esta integração e consequentemente ter que desenvolver novas features em sistemas que estão sendo usados na industria e comércio. Hoje são várias as linguagens, técnicas e ferramentas disponíveis no mercado, umas mais fáceis e outras nem tanto. Recentemente tive que fazer uma integração entre um sistema feito em Delphi e que agora tinha a necessidade de exibir uma parte das informações em dispositivos móveis. Desenvolver uma nova ferramenta esta fora de questão então o jeito foi recorrer a Engenharia de Software para resolver o problema. Primeiro passo foi desenvolver uma camada de software que pudesse retornar os dados em um formato leve e de fácil manipulação.  Segundo passo foi definir o formato destes dados e temos no mercado algumas alternativ...

Removendo acentos de uma string

Imagem
Olá, quem nunca precisou remover acentos de uma string que atire a primeira pedra. Então  em todas as linguagens este recurso é necessário para manter a conformidade na exibição de informações principalmente sistemas rodando em plataformas diferentes. Tá mas eu poderia alterar o encoding e tal, sim pode, mas nem sempre é possível por outras razões. Veja em Delphi como fazer isso. Não é de minha autoria, mas pode usar que funciona, eu testei..hehehe...

DBExpress e mysql

Para conectar.. coloque as dll referentes a sua versão do servidor MYSQL na pasta C:\Program Files (x86)\Embarcadero\Studio\15.0\bin

Percorrer os campos de uma tabela em tempo de execução

Imagem
Olá. Todo bom desenvolvedor uma hora ou outra vai precisar importar dados de uma tabela pra outra. Se a tabela for pequena não deverá ter tantos problemas, contudo se for uma daquela com dezenas de campos ai já fica bem chato de fazer. Uma boa saída é fazer em runtime a descoberta dos campos da tabela e consequentemente percorrer seus fields. Porém só vai funcionar se as tabelas forem estruturalmente iguais. Segue o código.: A lógica é que primeiro precisamos percorrer a query QrOrigem que é passada por parâmetro. Em seguida precisamos descobrir o total de campos da tabela, pra isso usamos a propriedade FieldList.Count. Em seguida basta pegar o campo dentro do laço mais interno usado a propriedade FieldList.Field[index].AsVariant e fazermos atribuição na QrDestino que também foi passada por parâmetros. E o resto é meio que auto explicativo. Parece que é difícil mas é bem tranquilo. Duvidas e sugestões é só falar.

Importando registros de arquivo de retorno de folha de pagamento para um servidor na nuvem. - Part 1

Imagem
Olá, a todos. Neste post, vamos falar da necessidade de importar dados de uma base qualquer ou apenas um grupo de registros a um servidor remoto através da internet. Em muitas regiões temos acesso bem limitado devido a problemas de infraestrutura e outras mazelas. Mas diante da necessidade de enviar estes dados para a internet possivelmente pra serem consumidos por outro serviço ou coisa do tipo, temos a necessidade de escrever este tipo de programa. Lembrando que esta talvez não seja a melhor forma de fazer este envio de dados, uma vez que não será usado uma api RestFull . Contudo o resultado final será o mesmo, talvez com menos elegância.  Tá mas porque não usar RestFull ? A resposta mais sensata é que pra um projeto pequeno e onde não haja necessidade de uma performance tão espetacular e estas importações será executada talvez menos que uma dezena de vezes por mês... Bom, deixando de conversa fiada. Vamos ao que interessa. O projeto parte da necessidade de Importar algu...