terça-feira, 14 de julho de 2015

Como tornar um servidor datasnap rest compatível com o cache off-line do HTML5


Por padrão, servidores DataSnap stand-alone WebBroker não permitem usar o "novo" HTML5 Aplicação manifesto de arquivo de cache.
Enquanto eu estava me preparando os conteúdos e as demonstrações do meu "HTML5 e aplicação web DataSnap desenvolvimento" eu configurei os componentes DataSnap para suportar esse recurso HTML5. Há apenas uma alteração a fazer ao "WebApplication REST" padrão gerado pelo assistente. No WebModuleUnit há o componente utilizado TWebFileDispatcher. Este componente tem as WebFileExtensions propriedade que é uma coleção de valores-chave contendo todas as extensões de arquivos permitidas relacionada com o mime-type.
A imagem abaixo mostra o que precisa ser configurado.

quarta-feira, 29 de abril de 2015

Função para gerar senhas aleatórias


Essa é uma dica simples e que para os que trabalham com redes sem fio pode ser muito útil. O que a função faz é gerar um string com caracteres hexadecimais, mas que podem ser adaptados para qualquer outro tipo. Esta função recebe como parâmetros o comprimento da senha como um integer, e outros três parametros do tipo boolean que indicam se estarão presentes letras minúsculas, maiúsculas e números.

Aqui vai o código e as explicações seguem logo abaixo.

function GeraSenhaHex(Digitos: Integer; Min: Boolean; Mai: Boolean; Num: Boolean): string;
const
   MinC = 'abcdef';
   MaiC = 'ABCDEF';
   NumC = '1234567890';
var
   p, q : Integer;
   Char, Senha: String;
begin
   Char := '';
   If Min then Char := Char + MinC;
   If Mai then Char := Char + MaiC;
   If Num then Char := Char + NumC;
   for p := 1 to Digitos do
   begin
      Randomize;
      q := Random(Length(Char)) + 1;
      Senha := Senha + Char[q];
   end;
   Result := Senha;
end;

Explicações:

Primeiro criamos as constantes que trarão os caracteres referentes a letras minúsculas, maiúsculas, e números, depois, iniciamos como vazia, só por desencargo de consciência já que o delphi faz isso por padrão, a variável "Char", que conterá todos os caracteres a serem usados para a geração da senha randômica.

Após isso, testamos os parâmetros para letras maiúsculas, minúsculas e números, acrescentando à "Char" cada um dos que forem verdadeiros segundo os parâmetros passados na chamada da função.

E depois, para finalizar, um laço com o número de repetições igual aos dígitos passados também como parâmetro na chamada, que usando a função Random do delphi gera números aleatórios dentro do limite estabelecido pelo cumprimento da variável "Char", lembrando que o fato de acrescentar o "+ 1" é por que as posições dos caracteres dentro de um string iniciam em 1, e a função Random gera números de 0 até o valor estipulado como limite. Por exemplo uma String = 'teste' temos os valores a seguir:

String[1] = 't'
String[2] = 'e'
String[3] = 's'
String[4] = 't'
String[5] = 'e'

segunda-feira, 9 de março de 2015

Como Identar código no Delphi

O comando para identar o código é: 

- CTRL + SHIFT + i (para avançar o código, ou seja, mover pra a direita) 
- CTRL + SHIFT + u (para retroceder o código ou mover para a esquerda). 

Lembrando de selecionar o código antes de utilizar as teclas de atalho. 

sexta-feira, 6 de março de 2015

dbExpress Suporte ao MySQL no Delphi 2010 e XE


Parece ser frequente as dúvidas relacionadas a utilização do driver dbExpress para MySQL, na grande maioria usuários das versões 2010 e XE do Delphi
O arquivo readme.html que está localizado no diretório onde o Delphi foi instalado, documenta as versões de MySQL e dos outros bancos suportados pelo dbExpress. No caso do MySQL o arquivo inclui as combinações de versões de server e bilbiotecas clientes suportadas, infelizmente o MySQL a cada nova versão traz inúmeras alterações nas API’s e acabe dificultando uma pouco nosso trabalho.

Abaixo informações que você deve saber.

Versões de servidores MySQL oficialmente suportadas e testadas.

MySQL 5.1, 5.0.27, 4.1 (Todas) (Driver dbxMYS.dll, Client libmysql.dll)

Combinação das versões de servidores e clientes MySQL que foram testadas

LibMySQL.dll (5.1.XX) Client - DBXMys.dll MySQL 4.0.XX Server
LibMySQL.dll (5.1.XX) Client - DBXMys.dll MySQL 5.0.XX Server
LibMySQL.dll (5.1.XX) Client - DBXMys.dll MySQL 5.1.XX Server
Em resumo, você tem que instalar a versão do cliente do MySQL 5.1.xx para que sua aplicação cliente funcione com servidores MySQL 4.0.XX, 5.0.XX e 5.1XX

O que fazer caso você tenha outras versões do Delphi na mesma máquina?

Caso isso aconteça o IDE poderá carregar uma das versões antigas do driver dbExpress para MySQL, isso acontece porque o diretório bin da versão anterior do Delphi está a frente na variável de sistema PATH, para resolver este problema, no menu Tools -> Options -> Environment Variables adicione o PATH da versão atual do Delphi a frente de todas as variáveis. Lembre-se que casa você use a versão anterior instalada na sua máquina, você deverá atualiza a variável de ambiente PATH novamente.

Espero que essas dicas tenham ajudado. 

Post Origial blog do Andreano.
http://www.andreanolanusse.com/pt/dbexpress-suporte-ao-mysql-no-delphi-2010-e-xe/

Usando Coalesce em Comandos SQL


Nessa dica, vou expor uma situação comum para nós desenvolvedores, que pode ser resolvida de várias formas, (como tudo em programação), mas sempre existe a forma correta ou a que vai garantir a integridade do sistema, e ainda, ser resolvida em pouquíssimo tempo.

Imaginem a seguinte situação, uma empresa possui uma entidade chamada TitulosPagar, nessa entidade estão gravados os titulos a pagar com as suas respectivas datas de vencimento. Nessa mesma entidade temos um campo chamado Prorrogado, que é preenchido quando o fornecedor concede uma prorrogação no título para que o mesmo seja pago após a data de vencimento sem juros etc.

Vocês ja devem ter imaginado que o sistema em questão possui um relatório de Titulos a Pagar em um determinado período. Certo?

Nesse caso o mesmo poderia usar o um Sql simples como o abaixo:

Select titulo, valor, vencimento
From titulosPagar
Where dataVcto between :dataIni and :dataFim

Tranquilo né. O Sql retorna todos os títulos a pagar com vencimento no período passado nos parâmetros dataIni e dataFim.

Vamos complicar, um belo dia o cliente liga para você pedindo para que nesse mesmo relatório de titulos a pagar considerasse a data de prorrogação também, ou seja deve ser listado todos os títulos analisando a data de vencimento, e também a data de prorrogação. 

Saída rápida, fazer duas querys, com dois Sql diferentes, um analisando o período pela data de vencimento e o outro analisando pela data de prorrogação, depois gravar tudo em um ClientDataSet e ligar o Client ao relatório. Beleza? Funciona com certeza, mas da um trabalhão, sem falar no tempo de processamento, dependendo o tamanho da entidade de TitulosPagar o processo será demorado.

Solução:
Criar o seguinte comando SQL.

Select titulo, valor, vencimento
From titulosPagar
Where Coalesce(Prorrogado, dataVcto) between :dataIni and :dataFim

Bingo! Temos uma query apenas, um processamento, e a solução com certeza não demorou mais que 1 minuto para alterar a query.

Sistema Fechando Sozinho


Amigos, acompanhando os grupos de discussão sobre programação e outros, percebi que muitas pessoas estão enfrentando um problema em comum.
Programas feitos em Delphi e ou VB, fechando sozinho, do nada o sistema fecha, como se alguém tivesse clicado em finalizar processo.

Também passei por isso, e depois de muitos testes descobri a causa.
O Bradesco, contratou uma empresa para desenvolver uma solução de segurança para eles, a mesma criou um processo que é inicializado quando o site do banco é aberto, e que verifica todos os outros processos que estão rodando. Caso considere o programa suspeito imediatamente encerra o processo.

Se você tem o costume de usar o compactador de exe chamado UPX, esse processo de segurança irá identificar o seu sistema como um programa malicioso ou suspeito, e irá finalizá-lo. 
Fato já comprovado! Para piorar o processo inicializado pelo site do Bradesco não é finalizado quando o browser é fechado, ou seja, para você conseguir usar o seu programa precisa reinicializar a máquina. 

sexta-feira, 15 de agosto de 2014

COMO RETIRAR SOMENTE OS NUMEROS DE UMA STRING

Segue uma função básica de como extrair de uma string somente números no formato currency.

function StrToCurr(Texto: String): Currency;
var
  nI: Integer;
  TextoLimpo: String;
begin
  TextoLimpo := '';
  For nI := 1 to Length(Texto) do begin
    if Texto[nI] in ['0'..'9',','] then
       TextoLimpo := TextoLimpo + Texto[nI];
  end;
  Result := StrToCurr(TextoLimpo);
end;

Curso de Delphi: 7.Consultas SQL