sexta-feira, 6 de março de 2015

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;

segunda-feira, 12 de agosto de 2013

ClientDataSet - Clicando no Título das Colunas do DBGrid para Ordenar


Veja nesta dica como é simples realizar a tarefa de ordenação dos dados de um DBGrid que está ligado a um ClientDataSet, criando e selecionando índices em memória.
O código abaixo mostra como realizar a ordenação clicando no titulo da coluna desejada. Clicando uma uma vez será utilizada a ordem crescente e na segunda, a ordem decrescente.

Primeiramente, no evento onCreate do Form, criaremos um índice Crescente e um Decrescente para cada campo do DBGrid, com o seguinte código:

procedure TForm1.FormCreate(Sender: TObject);
var
  i : integer;
begin
  for i := 0 to clientdataset1.FieldCount - 1 do
  begin
    CLIENTDATASET1.IndexDefs.Add('a' + CLIENTDATASET1.Fields[i].FieldName, 
      CLIENTDATASET1.Fields[i].FieldName, []);
    CLIENTDATASET1.IndexDefs.Add('d' + CLIENTDATASET1.Fields[i].FieldName,
      CLIENTDATASET1.Fields[i].FieldName, [ixDescending]);
  end;
end;
Em seguida, programaremos o evento onTitleClick do DBGrid:

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
  if 'a' + Column.FieldName = CLIENTDATASET1.IndexName then
    CLIENTDATASET1.IndexName := 'd' + column.FieldName
  else
    CLIENTDATASET1.IndexName := 'a' + column.FieldName;
end;
Pronto! Seu DBGrid em ordem Crescente e Decrescente de qualquer coluna, com apenas um click!

segunda-feira, 22 de julho de 2013

Enviando e-mails com Delphi 5

Este resumo não está disponível. Clique aqui para ver a postagem.

Repositório do Delphi


O repositório do Delphi é um local para armazenamento de objetos, como formulários e projetos, que facilita o compartilhamento desses objetos por vários projetos. Quando você clica em File|New... para criar um novo objeto, você pode escolher um dos itens do repositório.

Acrescentando um formulário ao repositório 

     Abra um projeto DPR, e dentro dele o formulário "Form" (Form1.pas). Esse formulário está sendo compartilhado dentro do mesmo projeto, mas se você quiser reutilizá-lo em outros projetos, pode acrescentá-lo ao repositório. 
     Para isso, clique com o botão direito e em Add to Repository. Você deve informar o título do item, uma descrição e qual a página onde ele será inserido (se você digitar um nome de página que não existe, uma nova será criada), além do seu nome para indicar qual o autor desse item. Opcionalmente você pode escolher um ícone que será usado para representar o item. Para o exemplo digite o seguinte: 

   Title: Formulário para uma tabela
   Description: Formulário de banco de dados para uma tabela
   Page: Forms (default)
   Author: seu nome 

     O botão "Browse" permite você procurar um ícone , para representar sua classe de formulário, caso não informe ele irá mostrar o seguinte ícone . Clique Ok. O novo item será adicionado ao repositório. Agora crie um novo projeto com File|New Application e veremos como o item pode ser reutilizado. 

     Formas de criar novos objetos 
     Se você clicar em File|New... e na página "Forms", você verá que o novo item ("Formulário para uma tabela") está dentro do repositório. Agora ele está disponível em qualquer projeto, permitindo criar novos formulários a partir dele. 

     Existem três opções para criar novos objetos a partir do repositório: copiar [copy] o item, herdar [inherit] do item (criar uma nova classe derivada) ou usar [use] o item diretamente. 

Se você marcar a opção "Copy" e clicar Ok, o Delphi cria uma cópia separada do objeto original que está no repositório. Qualquer alteração no original posteriormente não vai afetar essa cópia e qualquer alteração na cópia é independente do que está no repositório. Note que a unidade do formulário não foi salva e está em memória como "Unit2". Isso permite você salvar com um nome qualquer. 

     A opção "Inherit" (herdar) faz diferente: faz uma referência ao original (ou seja, acrescenta o formulário original dentro do projeto) e cria uma nova classe derivada da original, TForm1. O novo formulário será chamado de 'FormBase1', com a classe 'TFormBase1'. A unidade do formulário não foi salva ainda. Nesse caso, qualquer alteração no original, que está no repositório, será herdada pela classe derivada. 

     A opção "Use" não copia o objeto original, mas compartilha com o projeto atual. Nesse caso, alterações feitas no item dentro do projeto afetam o item no repositório e vice-versa. Se vários projetos usarem o mesmo item, todos eles compartilham o mesmo item. 

     Adicionando um projeto ao repositório 
     Para reutilizar um projeto inteiro, você pode acrescentá-lo ao repositório com o menu Project|Add to Repository... e informar a descrição do item como antes. 

     Gerenciando o repositório 
     Para gerenciar as páginas do repositório e os itens de cada página, você pode clicar em   Tools|Repository. Na caixa de diálogo você pode criar, renomear ou excluir uma página do repositório (você só pode excluir se ela estiver vazia). É possível também mudar a ordem das páginas. 

     Você pode mover os itens entre páginas arrastando o item da lista da esquerda e soltando sobre a página desejada. Também é possível renomear ou alterar características de um item ou excluir o item. 

     Compartilhando o repositório numa equipe 
     Quando uma equipe de desenvolvedores trabalha em conjunto, é importante que eles possam compartilhar o repositório, de forma que novos itens adicionados a ele estejam disponíveis para toda a equipe. 

     Para compartilhar o repositório, você deve usar um diretório na rede que seja acessível a todos os desenvolvedores. Por exemplo, se G: é uma letra de drive que aponta para a rede, você pode usar G:\REPOS. Você deve também copiar os arquivos do repositório do Delphi para esse diretório. 

     Os arquivos do repositório do Delphi são armazenados num subdiretório OBJREPOS, abaixo do diretório onde o Delphi foi instalado (geralmente C:\Arquivos de Programas\Borland\Delphi6). Além desses arquivos, o Delphi usa um arquivo de texto chamado DELPHI32.DRO, localizado no subdiretório BIN do Delphi. 

     Para compartilhar o repositório na rede, faça o seguinte: 
     • Crie um diretório compartilhado (e.g. G:\REPOS). Verifique que todos os desenvolvedores têm acesso a ele e usam a mesma letra de drive; 
     • Copie o repositório de um computador para o diretório compartilhado (G:\REPOS), ou seja, todos os arquivos do subdiretório OBJREPOS do Delphi, mais DELPHI32.DRO, do subdiretório BIN; 
     • Em cada um dos computadores, no Delphi, clique em Tools|Environment Options. Na página Preferences Em "Shared Repository", digite o caminho do diretório compartilhado. 

Agora lembre-se que qualquer alteração ou acréscimo feito por um desenvolvedor afeta todos os outros. É importante também notar que quando você quiser compartilhar um objeto, ele deve ser salvo num diretório compartilhado também, acessível a todos (por exemplo, G:\BIBLIOTECAS). 

Autor    : Celso Rodrigues

segunda-feira, 17 de junho de 2013

Mainmenu e popupmenu personalizados utilizando canvas (muito simples)


Olá Pessoal!!!

Bom estou aqui com mais uma dica que interessa a muitas pessoas! Personalizar 
uma aplicação sem utilizar componentes externos.
Estaremos Pesonalizando os Menus de Nossa aplicação.
  Mas antes quero esclarecer algumas coisas para quem esta procurando por isso:
  -A dica é para personalizar os Menus da aplicação, tanto MainMenu quanto popupMenu.
  -Para quem utiliza Delphi 7 (Exemplo) pode utilizar os Componentes ActionMainMenuBar e 
  ActionManager para fazer alguns MainMenus bacanas(em breve mostrarei passo-a-passo como 
  utilizar estes componentes que são muito legais de trabalhar).
  -Neste exemplo estarei trabalhando com Canvas!
  
 Então... Mãos à Obra!!!!

   Neste exemplo que faremos utilizarei o Componentes MainMenu mas o que vai ser aplicado nele
 pode ser sem problemas aplicado para um popupmenu.

 Vamos deixar os nossos menus com uma aparência bem legal!.

 Eventos Utilizados no componente: onDrawItem, onMeasureItem.

 1º- Crie uma nova aplicação.
 2º- Coloqueno formulario o componente MainMenu (Standard Palette).
 3º- Ative a propriedade OwnerDraw do componente MainMenu.
 3º- Abra o "Editor de Menus" dando 2 clique no componente e crie 1 menu.
        (insira Caption, Name...)

 4º- Acesse o Evento onDrawItem de deste item do Menu e vamos implementar o seguinte código:
}
procedure TForm1.Arquivo1DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selected: Boolean);
begin
  //Pinta a opção
  
  if Selected then  //verifica se o item está selecionado
    BEGIN
      ACanvas.Brush.Color :=  $00EFD3C6;        //cor de fundo do item (Lembrando que podemos printar um Imagem).
          //   Canv.Brush.Color :=  clAppWorkSpace;
      ACanvas.Rectangle(Arect);                         //Desenharemos uma retangulo em todo o Item selecionado.
      ACanvas.pen.Color:=$00C66931;             //seta a cor da borda do retangulo.
      InflateRect (ARect, -1,-1);
    end
    else
    ACanvas.Brush.Color:=clMenu;                        //se não estiver selecionado o item coloca a cor normal do item.
        //-->  dietrich 01/02/2007
        
        //coloca o texto
    ACanvas.pen.Color:=clBlack;  //cor
    ACanvas.TextRect(ARect,ARect.Left+5, ARect.Top+1,'Sair');//local onde sera escrito o texto ARect

end;

Curso de Delphi: 7.Consultas SQL