segunda-feira, 20 de junho de 2011

Consulta entre datas Usando SQL

Essa é minha primeira dica aqui. Antes de mais nada, gostaria de agradecer muito ao Planeta Delphi, que com suas dicas tem me ajudado a aprender a programar no Delphi. Bom, eu sou iniciante ainda, apesar de estar no meu terceiro programa, que possui uso real em um escritório, estou contente pois estou aprendendo "na raça", sem curso e nem nada, apenas com as dicas daqui e o help do Delphi.

Bom, essa dica se destina a quem estiver tendo problemas na hora de fazer consultas SQL entre datas.

Quem nunca recebeu a mensagem "EDataBase Error: Unassigned Code" quando fez essa pesquisa? O que acontece é que mesmo que utilizemos funções de conversão de data como StrToDate, StrToDateTime e similares, ainda assim não estaremos no mesmo formato de data utilizado nos SGBDs (eu uso o Interbase 7.5).

Acontece que mesmo para os campos de data simples "Date", quando vamos nos relacionar com esses dados devemos estar no tipo primário do BD, que é SqlTimeStamp. Assim sendo, devemos incluir na cláusula "uses" da nossa unit que contém a consulta a unit "SqlTimSt", que nos proporcionará o uso do tipo de dados referido acima.

Devemos então realizar duas conversões:

1 - Converter o tipo de dados DateTime nativo do Delphi em SqlTimeStamp
2 - Passar esse dado convertido como parâmetro da busca.

Eu utilizei dois DateTimePickers do Delphi, pra quem não conhece é "aquele calendariozinho" utilizado para que o usuário selecione a data como se estivesse acertando a data no calendário do Windows, pois ele já nos fornece os dados no formato DateTime nativo do Delphi e nos poupa linhas de código adicionais para ter informação convertida nesse formato, por[em quem quiser fazer isso a partir de um Edit por exemplo, que fique à vontade.

Bom, segue o código que eu usei e funcionou direitinho:


procedure TForm_Planilha.SpeedButton5Click(Sender: TObject);

var
D1,D2 : TDateTime;

begin
      D1 := DateTimePicker_Inicial.DateTime;
      D2 := DateTimePicker_Final.DateTime;

      DM.Query_Geral.Close;
      DM.Query_Geral.CommandText := 'Select * from GERAL Where DATA_FATURA >= :D1 and DATA_FATURA <= :D2';
      DM.Query_Geral.ParamByName('D1').AsSQLTimeStamp := DateTimeToSQLTimeStamp (D1);
      DM.Query_Geral.ParamByName('D2').AsSQLTimeStamp := DateTimeToSQLTimeStamp (D2);
      DM.Query_Geral.Open;
end;