quarta-feira, 23 de março de 2016

Gerar Planilha Excel a partir um Relatório do Delphi 7

Essa semana na empresa me foi solicitado que gerasse algumas Planilhas Excel a partir de certos relatórios para alguns clientes. Portanto disponibilizo aqui a solução mais simples que eu implementei para essa questão.

Para o exemplo, iremos gerar uma planilha Excel a partir de uma tabela de Produtos fictícia. Primeiramente criei uma conexão para a tabela via dbExpress (1 TSQLQuery da paleta "dbExpress", 1 TDataSetProvider da paleta "Data Access" e 1 TClientDataSet da paleta "Data Access"). Não esqueça de fazer a ligação entre os 3 componentes através das propriedades DataSet e ProviderName. Além disso criei um botão para Gerar a planilha Excel:


Após adicionar os objetos à tela, criaremos uma procedure responsável por gerar de fato o Excel. Na seção public do form, declare o cabeçalho da procedure (que no caso chamei de ExportaExcel):

public
    { Public declarations }
    procedure ExportaExcel(DataSet: TDataSet; Arq: string);

Após criar o cabeçalho, digite simultaneamente SHIFT + CTRL + C para criar automaticamente a procedure no fim do form. Após isso, digite o conteúdo da mesma:

procedure TFRelatorioProdutos.ExportaExcel(DataSet: TDataSet;
Arq: string);
var
  ExcApp: OleVariant;
  i,l: integer;
begin
  ExcApp := CreateOleObject('Excel.Application');
  ExcApp.Visible := True;
  ExcApp.WorkBooks.Add; QryProd.First;
  l := 1; //Adicionar titulos
  for i := 0 to QryProd.Fields.Count - 1 do
  begin
    ExcApp.WorkBooks[1].Sheets[1].Cells[l,i + 1] :=
      QryProd.Fields[i].DisplayName;
  end;
  l := 2;
  QryProd.First;
  while not QryProd.EOF do
  begin
    for i := 0 to QryProd.Fields.Count - 1 do
      ExcApp.WorkBooks[1].Sheets[1].Cells[l,i + 1] :=
        QryProd.Fields[i].DisplayText;
      QryProd.Next; l := l + 1; end;
      ExcApp.WorkBooks[1].SaveAs(Arq);
end;

Após criarmos nossa procedure responsável por gerar de fato o Excel, dê um duplo clique no botão "Gerar Excel" e digite os seguintes comandos para abrir a query e logo em seguida chamar nossa procedure :


  QryProd.Close;
  ExQryProd.SQL.Clear;
  ExQryProd.SQL.Add(' select CODIGO, DESCRICAO, UNIDADE, ' +
                    ' QUANTIDADE, PRECO_VAREJO ' +
                    ' from PRODUTOS ');
  ExQryProd.Prepared := True;
  QryProd.Open;



  try
    ExportaExcel(QryProd, '');
  Except;
    //
  end;

Agora basta rodar sua aplicação e fazer o teste prático para criar sua planilha Excel
a partir dos dados contidos na tabela fictícia Produtos.

Conclusões

Notamos neste artigo a facilidade de se gerar planilhas Excel a
partir de querys no Delphi 7. Forte abraço e até o próximo tutorial.

--

segunda-feira, 1 de setembro de 2014

(PARTE 2) Gerar PDF e enviá-lo por E-mail no Delphi 7: Enviar automaticamente por E-mail um PDF gerado pelo Delphi 7


Na parte 1 deste tutorial ((PARTE 1) Gerar PDF e enviá-lo por E-mail no Delphi 7: Gerar PDF a partir do Quick Report utilizando ExportQR), mostrei como gerar um documento PDF no Delphi 7 a partir de um relatório Quick Report, utilizando o componente ExportQR.

Nesta parte 2, mostro como enviar automaticamente por e-mail um PDF gerado pelo Delphi.

Enviando por e-mail automaticamente um PDF gerado a partir do Quick Report

Antes de iniciarmos o tutorial, é necessário que você baixe as DLLs
abaixo e as coloque na pasta "C:\Windows\System32":

Download Dlls E-mail Delphi

O tutorial se baseia numa continuação da 1ª parte, a qual termina
com um botão no qual o PDF é gerado em um local pré-determinado.
Antes de qualquer coisa, é necessário incluir na cláusula "Uses" a
palavra IdMessage. Após esses comandos da 1ª parte, é necessário
criar no cabeçalho do evento Click do botão as seguintes variáveis:


var
  cc, assunto, sDiretorioArquivo : String;
  IdMessage1 : TIdMessage;
  IdSMTP1 : TIdSMTP;
  mmMensagem : TMemo;

Agora volte ao fim do clique do BitBtn novamente e digite o seguinte:

Note que neste momento a variável sDiretorioArquivo recebe como texto
o diretório que foi digitado na última linha da 1ª parte do Tutorial. Uma
dica seria configurar esse diretório automaticamente, sendo assim o
usuário criaria o PDF e enviaria ao destinatário automaticamente:


  sDiretorioArquivo  := Edit1.Text;

Em seguida, preencha as configurações do cabeçalho, corpo e anexos
do e-mail:


  IdMessage1 := TIdMessage.Create(nil);  
  IdSMTP1 := TIdSMTP.Create(nil);

  //e-mail do Remetente
  IdMessage1.From.Address := 'teste@mail.com';

  //e-mail do Destinatário
  IdMessage1.Recipients.EMailAddresses := 'abc@mail.com';

  IdMessage1.Body.Clear;
  IdMessage1.Body.Add('Sr(a) Fulano(a).');
  IdMessage1.Body.Add('PDF anexado referente à (...)');
  IdMessage1.Body.Add('');
  IdMessage1.Body.Add('Pela atenção, obrigado.');

  IdMessage1.Subject := 'Empresa - Doc: (...) '; //Assunto
  IdMessage1.Body.Add('Corpo da mensagem');

  //Anexando o PDF criado na parte 1 deste tutorial
  TIdAttachment.Create(IdMessage1.MessageParts,
  TFileName(sDiretorioArquivo + '.pdf'));

E por fim configure o servidor de e-mails, que no caso utilizamos como
exemplo o Yahoo:


  //Configuração do IdSMTP
  //Configurações remente
  IdSMTP1.AuthenticationType  := atLogin;
  IdSMTP1.Host := 'smtp.mail.yahoo.com.br'; //Host
  IdSMTP1.Username := 'remetente@mail.com'; //Remetente
  IdSMTP1.Password := '123'; //Senha do Remetente
  IdSMTP1.Port := '25'; //Porta padrão do Yahoo
  IdSMTP1.Connect; //Estabelece a conexão
  IdSMTP1.Authenticate; //Realiza a autenticação

  try
    IdSMTP1.Send(IdMessage1); //Envia a mensagem

    Form1.Refresh;
    Form1.Refresh;

    ShowMessage('Envio realizado com sucesso');
  except
    on e:exception do
    begin
      Application.MessageBox(Pchar(e.Message),
      Pchar('Erro.'), mb_ok+mb_iconerror);

      end;
   end;

  IdSMTP1.Disconnect;
Agora basta rodar a aplicação, informar dados válidos do servidor de
e-mail do Remetente e usar a criatividade para solucionar o problema
de sua empresa.

Conclusões

Notamos neste artigo a facilidade de envio de e-mails com anexos em
PDF gerados pelo Delphi 7. Forte abraço e até o próximo tutorial.

--

quinta-feira, 14 de novembro de 2013

Exibir Quantidade de Dias em uma Subtração de Datas em Delphi 7

Uma dica para os desenvolvedores, que assim como eu, também já tiveram essa dificuldade pela frente. Num módulo do sistema da minha empresa, necessitava exibir para um dono de concessionária quantos dias determinada Ordem de Serviço de um cliente estava aberta no sistema.

A solução para isto é a seguinte:


  • criar uma variável do tipo Extended:
 var  
  diasAtraso : Extended;  

  • alimentar esta variável com a subtração de datas que interessa ao negócio:
  diasAtraso := Date - QryPadraoDATA.AsDateTIME;  

  • finalmente exibe-se a quantidade de dias entre as 2 datas:
  ShowMessage(FloatToStr(Abs(diasAtraso)) + ' dias');


Conclusões

Notamos neste artigo a facilidade em calcular a quantidade de dias
entre 2 datas e exibir o resultado, utilizando a ferramente Delphi 7.
Forte abraço e até o próximo tutorial.

--

sexta-feira, 1 de fevereiro de 2013

Firebird: Comparando campos DateTime sem ignorar as Horas através de SQLTimeStamp no Delphi 7


Uma dica para os desenvolvedores, que assim como eu, também já tiveram essa grande dificuldade pela frente.

Eu possuo uma coluna do tipo Date no banco de dados e a aplicação alimenta-a com Data e Hora. O problema surge quando preciso num relatório filtrar os lançamentos num determinado período, e ao gerar no relatório vários lançamentos são ignorados, visto que a data deles tem horas diversas.


A solução para isso, utilizando componentes DBExpress, para comparar um intervalo entre duas datas foi a seguinte:

  • 2 componentes TDateTimePicker da paleta Win32 (DTPckInicial e DTPckFinal);
  • adicionar na propriedade Time do DTPckInicial: 00:00:01
  • adicionar na propriedade Time do DTPckFinal23:59:59
  • na bloco USES adicione SqltimSt;
  • utilizar as 3 linhas do código abaixo ao filtrar os lançamentos compreendidos nas datas selecionadas nos dois componentes TDateTimePicker:

Query.SQL.Add(' AND ( CAMPO_TIPO_DATA BETWEEN :DATA_INI AND :DATA_FIM )');
Query.ParamByName('DATA_INI').AsSQLTimeStamp := DateTimeToSQLTimeStamp(DTPckInicial.DateTime);
Query.ParamByName('DATA_FIM').AsSQLTimeStamp := DateTimeToSQLTimeStamp(DTPckFinal.DateTime);

Conclusões

Notamos neste artigo a facilidade em se manipular campos DateTime,
inclusive os utilizando como parâmetros sem ignorar as horas,
utilizando a ferramente Delphi 7. Forte abraço e até o próximo tutorial.


--

quinta-feira, 31 de maio de 2012

Alterando uma linha específica no componente Memo do Delphi 7


Veja neste tutorial como alterar uma linha específica do Memo no Delphi 7, facilitando para que não se adicione linhas extras no componente.


A simples solução está descrita abaixo:


 Memo1.Lines.Strings[INDEX] := Memo1.Lines.Strings[INDEX] + 'TEXTO ADICIONAL';  



Conclusões

Notamos neste tutorial a facilidade em se alterar uma
linha específica do componente Memo utilizando a
ferramente Delphi 7. Forte abraço e até o próximo
tutorial.


--



sábado, 14 de abril de 2012

InputBox com Password (Janela de mensagem) no Delphi 7

Veja neste tutorial como criar um InputBox com Password, com um Edit e máscara para senha.


Este tutorial visa auxiliar quem precisa criar um janela de mensagem

que esconda o que está sendo digitado (senha). Primeiramente crie
as seguintes funções na sua Unit:



 function InputBoxPass(const ACaption, APrompt, ADefault: string): string;  
 function InputSenha(const ACaption, APrompt: string; var Value: string): Boolean;  
 function GetAveCharSize(Canvas: TCanvas): TPoint;  


E as implemente com os seguintes códigos:

 function TForm1.GetAveCharSize(Canvas: TCanvas): TPoint;   
  var   
  I: Integer;   
  Buffer: array[0..51] of Char;   
  begin   
  for I := 0 to 25 do Buffer[I] := Chr(I + Ord('A'));   
  for I := 0 to 25 do Buffer[I + 26] := Chr(I + Ord('a'));   
  GetTextExtentPoint(Canvas.Handle, Buffer, 52, TSize(Result));   
  Result.X := Result.X div 52;   
  end;
Em seguida:

 function TForm1.InputBoxPass(const ACaption, APrompt,    
  ADefault: string): string;    
  begin    
  Result := ADefault;    
  InputSenha(ACaption, APrompt, Result);    
  end;   
E por fim:

 function TForm1.InputSenha(const ACaption, APrompt: string;    
  var Value: string): Boolean;    
  var    
  Form: TForm;    
  Prompt: TLabel;    
  Edit: TEdit;    
  DialogUnits: TPoint;    
  ButtonTop, ButtonWidth, ButtonHeight: Integer;    
  begin    
  Result := False;    
  Form := TForm.Create(Application);    
  with Form do    
  try    
   Canvas.Font := Font;    
   DialogUnits := GetAveCharSize(Canvas);    
   BorderStyle := bsDialog;    
   Caption := ACaption;    
   ClientWidth := MulDiv(180, DialogUnits.X, 4);    
   ClientHeight := MulDiv(63, DialogUnits.Y, 8);    
   Position := poMainformcenter;    
   Prompt := TLabel.Create(Form);    
   with Prompt do    
   begin    
   Parent := Form;    
   AutoSize := True;    
   Left := MulDiv(8, DialogUnits.X, 4);    
   Top := MulDiv(8, DialogUnits.Y, 8);    
   Caption := APrompt;    
   end;    
   Edit := TEdit.Create(Form);    
   with Edit do    
   begin    
   Parent := Form;    
   Left := Prompt.Left;    
   Top := MulDiv(19, DialogUnits.Y, 8);    
   Width := MulDiv(164, DialogUnits.X, 4);    
   {} MaxLength := 20;    
   {} Passwordchar := '*';    
   {} Font.Color := clBlue;    
   Text := Value;    
   SelectAll;    
   end;    
   ButtonTop := MulDiv(41, DialogUnits.Y, 8);    
   ButtonWidth := MulDiv(50, DialogUnits.X, 4);    
   ButtonHeight := MulDiv(14, DialogUnits.Y, 8);    
   with TButton.Create(Form) do    
   begin    
   Parent := Form;    
   Caption := 'Ok';    
   ModalResult := mrOk;    
   Default := True;    
   SetBounds(MulDiv(38, DialogUnits.X, 4), ButtonTop, ButtonWidth, ButtonHeight);    
   end;    
   with TButton.Create(Form) do    
   begin    
   Parent := Form;    
   Caption := 'Cancelar';    
   ModalResult := mrCancel;    
   Cancel := True;    
   SetBounds(MulDiv(92, DialogUnits.X, 4), ButtonTop, ButtonWidth,ButtonHeight);    
   end;    
   if ShowModal = mrOk then    
   begin    
   Value := Edit.Text;    
   Result := True;    
   end;    
  finally    
   Form.Free;    
  end;    
  end;   
Finalmente, adicione um Button e um Label no
formulário, e no evento onClick do botão,
digite:

 Label1.Caption := InputBoxPass('Login','Senha:','');  




Conclusões

Notamos neste artigo a facilidade em se criar um InputBox com
Password em detrimento de um ShowMessage comum
utilizando a ferramente Delphi 7. Forte abraço e até o próximo
tutorial.


--