Jump to content

Problema básico


passarito
 Share

Recommended Posts

Boas,

Tenho um programa a trabalhar com BD Access e resolvi fazer uma aplicaçãozita para correr nas tarefas agendadas num certo dia da semana de forma a enviar automaticamente um relatório.

A ideia será fazer uma exportação para um ficheiro TXT para depois ser enviado por mail.

Depois de esclarecer o que pretendo, uma coisa simples, vêm os problemas de não estar muito familiarizado com o Delphi e a aplicação ser algo fora da minha restrita normal utilização do Delphi.

Já consegui criar um ficheiro de texto 😄 . Afinal não era "file of text" mas sim "TextFile". valha-nos santa internet! 😁

Esta era só para verem onde estou... em menos 1!

Bom agora o problema:

Queria testar se um campo TDateTime está preenchido ou não. Usei a sintaxe abaixo, mas não está a funcionar.

dm.CMdtpaga1.Value=''

Erro: incompatible types: 'String' and 'TDateTime'

Tentei arranjar uma variavel TDateTime e igualá-la a '' mas também não funcionou....

Alguma ideia?

P.S. Mais tarde voltarei à carga com outras dúvidas básicas! 😄

Link to comment
Share on other sites

Certo! 🙂

Já agora ponho uma achazita... Em vez de criares um ficheiro de texto com essa coisa arcaica chamada textfile, usa uma TStringList para o efeito:

var lst:TStringList;
.
.
lst:=TStringList.Create;
lst.Add('linha 1');
lst.Add('linha 2');
.
.
lst.Add('linha n');
lst.SaveToFile('ficheiro.txt);
lst.free;

Com isto podes depois aceder directamente linha a linha do que puseres no texto, antes e depois de gravares no ficheiro. Entre outras coisas, a TStringList tem um array de strings, pelo que podes aceder à linha 5 simplesmente usando lst[4].

Melhor ainda... 🙂 Em vez de passares para ficheiro de texto para depois mandares por mail, usa os componentes Indy para enviar directamente através do Delphi... 🙂

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

UAU....não vou usar, mas isso do TStringList é de uma potencialidade....

Assim de repente, o que me ocorreu foi, se eu quizer alterar um caracter qualquer posso simpllesmente fazer lst[4,7]:='x' como se um array bidimensional se tratasse?

e ainda se tiver todas aquelas potencialidades de inserir, alterar, apagar pedaços de texto... é melhor parar...

Bom mas isto não necessita do TStringList porque é do tipo, while not eof ... testa condição, se V escreve no ficheiro e ... Next!

Nada para ser usado mais tarde!

Melhor ainda... Em vez de passares para ficheiro de texto para depois mandares por mail, usa os componentes Indy para enviar directamente através do Delphi...

Não vou usar, porque isto deveria ser um coisita rápida... quer dizer, em Pascal era, aqui cada linha que faço tenho de fazer uma pesquisa exaustiva à internet....

Já tive de arranjar um Delphi tipo testes (com gestão de BD) porque o Delphi 3 não tinha o incday 😛 e não só 😛 :P. Isto vai ser só para o show-off portanto... é programar, compilar, mostrar e desinstalar tudo!

Só tenho é de ser rápido 😁

Link to comment
Share on other sites

Assim de repente, o que me ocorreu foi, se eu quizer alterar um caracter qualquer posso simpllesmente fazer lst[4,7]:='x' como se um array bidimensional se tratasse?

e ainda se tiver todas aquelas potencialidades de inserir, alterar, apagar pedaços de texto... é melhor parar...

Sim, mas não assim...

lst[4][7]:='x'; // Altera para 'x' o 7º caracter da 5ª linha (a linha é começada em 0).

Inserir e apagar linhas é mato. Procurar também.

Apagar pedaços de texto? Bem, podes sempre usar todo o texto como se fosse uma unica string (lst.text='linha 1'+'linha 2'+etc) e apagar por aí os pedaços que te interessem eliminar.

Quanto ao EOF, nada mais simples:

for i:=0 to lst.count-1 do  // lst.count devolve o numero de linhas presentes na TStringList
  begin
  .
  .
  .
  end;

Outros métodos interessantes:

lst.clear - limpa todas as linhas

lst.insert - insere uma linha

lst.delete - apaga uma linha

lst.indexof - procura o nº de linha pelo texto

Enviar mail pelo delphi são meia duzia de linhas... A suite Indy já tras componentes prontos para isso, é só definir as propriedades (de, para, assunto, etc.) e enviar.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

@bsccara,

não chegas nada atrasado.... eu vou continuar com isso hoje e se calhar pelo fim-de-semana dentro.

É um método a ter em conta.

Aliás esse método e o do @Thoga31fez-me lembrar como resolvi o mesmo problema em ASP/VBScript em que para fazer o mesmo teste usei a função isdate().

@nunopicado

não digas mais nada que me está a dar uma azia..... o quanto isso me fez falta nalguns velhinhos programas de Pascal

Quanto ao Indy, estive a tentar e tenho algumas dúvidas:

- Não tenho nenhum form, posso colocar o componente num Data Module que é a única coisa que tenho?

- Dei uma pesquisadela na net e fiquei todo confuso... apresentam propriedades que eu não encontro no meu... será por o meu ser o Delphi 7?

* Tenho o BoundIP que penso ser o IP do servidor ou o Host que será o nome

* Username, password, port tb é claro

- Agora, onde coloco o(s) mail(s) receptor(es)?

- Onde anexo o corpo da mensagem?

Link to comment
Share on other sites

Fazer um pequeno report....

@Thoga31, a tua solução DateTimeToStr(dm.CMdtpaga1.Value) = '' não funcionou.

Causa: O Delphi atribuia a dm.CMdtpaga1.Value o valor 0, quando passava para string atribuia a data 31-12-1989 salvo erro.

Depois testei a solução do @bsccara dm.CMdtpaga1.isNull e funcionou... como vês não chegaste tarde 😉

Depois de mais algumas brigas, acho que isto está a começar a ganhar andamento...

Link to comment
Share on other sites

hehheeh o TStringList é brutal de tão simples (e tão útil)...

Quanto ao Indy, algumas propriedades mudaram num dos updates de versão. Deve ser isso que te está a confundir.

De qualquer maneira, não te deve fazer mossa para o efeito. Não precisas de datamodule, basta criares a mensagem em RunTime.

Olha o exemplo:

uses
  IdSMTP,IdMessage;
.
.
.
.
procedure SendStringList(Lst: TStrings;Para,Assunto:String);
var
  smtp : TIdSMTP;       // Conexão ao servidor
  msg  : TIdMessage;  // Mensagem a enviar

begin
    msg:=TIdMessage.Create(nil);  // Cria a mensagem

    try
       with msg.Recipients.Add do  // Define o destinatário da mensagem
            begin
                 Name:=Para;
                 Address:=Para;
            end;

       // Define o remetente da mensagem
       msg.From.Name:='Passarito';
       msg.From.Address:='Passarito@teu.dominio.pt';

       // Define o assunto da mensagem
       msg.Subject:=Assunto;

       // Usa o parametro dado (LST) como corpo da mensagem
       msg.Body.Text:=lst.Text;

       // Cria a conexão ao servidor
       smtp:=TIdSMTP.Create(nil);

       try
          // Define os dados do servidor
          smtp.Host:='smtp.teudominio.pt'; 
          smtp.Port:=25; 

          // Define os dados de autenticação ao servidor
          smtp.Username:='teu username no servidor';
          smtp.Password:='tua pass no servidor';

          // Liga ao servidor
          smtp.Connect;

          try
             // Envia a mensagem definida através da conexão estabelecida
             smtp.Send(msg);
          finally
             // Desliga do servidor
             smtp.Disconnect;
          end;
       finally
          // Liberta a conexão
          smtp.Free;
       end;
    finally
       // Liberta a mensagem
       msg.Free;
    end;
end;

Para usar, basta-te chamar o procedimento, passando a TStringList contendo o conteudo por parametro, bem como o endereço e o assunto da mensagem:

SendStringList(TStrings(lst),'destino@xpto.pt','Envio de Email');

Podes agora ajustar às tuas necessidades... 😉

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Na 6ª feira já deixei aquilo pronto... não fiz com o Indy porque não me entendi com aquilo e acho que as propriedades do Indy do BD7 são diferentes dessas.

Btw, aquilo ficou a trabalhar com um Bat File o programa cria o filcheiro de texto e depois um outro envia-o para as pessoas que quero. 2º feira vou ver o resultado na cara das pessoas.

Ah, e obrigado a todos pelas ajudas

Link to comment
Share on other sites

Só tens de lhe acrescentar a seguinte linha para funcionar no Delphi 7:

smtp.AuthenticationType:=atLogin;

No Indy 10 isto já vem por default. No Indy 9 (versão que acompanha o Delphi 7) tem de ser incluido.

De resto testei no Delphi 7 e funcionou lindamente (sim, dei-me ao trabalho de instalar o Delphi 7 para testar isto lol)

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Ora, fiz um pequeno demo para o envio de email via Delphi (com o Indy v9 presente no Delphi 7).

Está na nossa área de downloads:

https://www.portugal-a-programar.pt/files/file/30-sendemailzip/

Isto é meramente académico, pelo que faltam muitas validações de dados, etc. Mas já dá para testarem.

Passarito: Batch files... 🙂 Nem parece teu! lol

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

@Nunopicado, és um gajo do caraças....

Pronto, fizeste-me ir experimentar o Indy... com o teu exemplo e as tuas várias explicações lá fui tentando executar a coisa, mas está a dar-me a volta à cabeça com um constante erro: "5.7.1 Client was not authenticated"

Olha aqui o meu código:

 Msg:=TIdMessage.Create(nil);  // Cria a mensagem
 // Define o remetente da mensagem
 msg.From.Name:='passarito';
 msg.From.Address:='passarito@myserver.pt';
 // Define o destinatário da mensagem
 lst:=TStringList.Create;
 lst.LoadFromFile('destinos.txt');
 for i:=0 to lst.count-1 do  // lst.count devolve o numero de linhas presentes na TStringList
   with msg.Recipients.Add do begin
  //Name:=lst[i];
  Address:=lst[i];
   end;
 lst.free;
 // Define o assunto da mensagem
 msg.Subject:='Relatório Semanal';
 lst:=TStringList.Create;
 lst.LoadFromFile('rl_report.txt');
 msg.Body.Text:=lst.Text;
 lst.free;

 smtp:=TIdSMTP.Create(nil); // Cria a conexão ao servidor
 // Define os dados do servidor
 smtp.Host:='xxx.0.2.xxx'; //ip do meu servidor (tb tentei com o nome do srv)
 smtp.Port:=25;
 smtp.AuthenticationType:=atLogin;  //até podia ser sem autenticação
 // Define os dados de autenticação ao servidor
 smtp.Username:='passarito';
 smtp.Password:='passarito passw';
 smtp.Connect;    // Liga ao servidor
 smtp.Send(msg);  // Envia a mensagem definida através da conexão estabelecida
 smtp.Disconnect; // Desliga do servidor
 smtp.Free;	   // Liberta a conexão
 msg.Free;	    // Liberta a mensagem

consegues ver onde estou a falhar?

Link to comment
Share on other sites

Dizes que não precisava ser autenticado?

Experimenta substituir smtp.AuthenticationType:=atLogin; por smtp.AuthenticationType:=atNone; e não metas as linhas do username e password.

Vê como se porta. Assim de repente, era suposto trabalhar bem como tens, mas cada server é um... 🙂

Por acaso o teu server não obriga a conexão SSL pois não?

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Tinha ideia de te dizer mas não disse... já tinha tentado o smtp.AuthenticationType:=atNone; mas não funcionou na mesma.

"Acho" que o meu servidor não necessita... acho, porque o "gajo" às vezes tem vontade própria!"

Com o bat file, eu uso o clemail (não sei se conheces?) e a linha de comandos que uso é esta e a coisa funciona.

clemail -from passarito1@myserver.pt -smtpserver xxx.0.2.xxx -to passarito2@myserver.pt -subject "Relatorio Semanal" -bodyfile "rl_report.txt"

e

....ainda...

usei o F8 (stepover) e com o atNone ele aborta manda a mensagem no smtp.Send(msg); se tiver atLogin; ele menda a mensagem no smtp.Connect;

Link to comment
Share on other sites

Testa uma coisa (se já não o fizeste):

Corre o meu exemplo (já está compilado) e mete os dados do teu servidor, e envia uma coisa qualquer a ver se ele conecta.

Podes também verificar se os endereços de destino que ele insere estão correctos (não há espaços a mais ou algo do genero).

É que o erro 5.7.1 do SMTP é mais genérico que um comprimido para a dor de cabeça. Tem para lá erros para todos os gostos, com o mesmo código.

A julgar pelo descritivo que ele te mostra, seria erro de autenticação (username/password), mas tudo é possível. Experiementa por o atNone, e tirar mesmo o username e password, caso não o tenhas feito!

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Por acaso não tens uma conta num servidor standard (mesmo gratuitos) para testar?

(Nota: Não pode ser gmail, estes usam SSL e para isso já é preciso mais um bocado de trabalho).

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.