passarito Posted June 14, 2012 at 05:03 PM Report Share #462883 Posted June 14, 2012 at 05:03 PM 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 More sharing options...
thoga31 Posted June 14, 2012 at 05:56 PM Report Share #462898 Posted June 14, 2012 at 05:56 PM Experimenta o seguinte 😉 DateTimeToStr(dm.CMdtpaga1.Value) = '' Knowledge is free! Link to comment Share on other sites More sharing options...
nunopicado Posted June 14, 2012 at 08:25 PM Report Share #462931 Posted June 14, 2012 at 08:25 PM 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 More sharing options...
passarito Posted June 14, 2012 at 10:38 PM Author Report Share #462952 Posted June 14, 2012 at 10:38 PM 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 More sharing options...
nunopicado Posted June 14, 2012 at 11:53 PM Report Share #462965 Posted June 14, 2012 at 11:53 PM 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 More sharing options...
bsccara Posted June 15, 2012 at 01:05 AM Report Share #462971 Posted June 15, 2012 at 01:05 AM Já chego tarde mas podes usar o método IsNull para saber se um campo está preenchido. Link to comment Share on other sites More sharing options...
passarito Posted June 15, 2012 at 08:01 AM Author Report Share #462981 Posted June 15, 2012 at 08:01 AM @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 More sharing options...
passarito Posted June 15, 2012 at 10:41 AM Author Report Share #463014 Posted June 15, 2012 at 10:41 AM 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 More sharing options...
nunopicado Posted June 15, 2012 at 09:38 PM Report Share #463188 Posted June 15, 2012 at 09:38 PM (edited) 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 June 15, 2012 at 09:50 PM 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 More sharing options...
passarito Posted June 16, 2012 at 03:47 PM Author Report Share #463302 Posted June 16, 2012 at 03:47 PM 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 More sharing options...
nunopicado Posted June 17, 2012 at 02:35 AM Report Share #463376 Posted June 17, 2012 at 02:35 AM 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 More sharing options...
nunopicado Posted June 17, 2012 at 12:37 PM Report Share #463408 Posted June 17, 2012 at 12:37 PM 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 More sharing options...
passarito Posted June 18, 2012 at 10:25 AM Author Report Share #463605 Posted June 18, 2012 at 10:25 AM @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 More sharing options...
nunopicado Posted June 18, 2012 at 10:37 AM Report Share #463610 Posted June 18, 2012 at 10:37 AM 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 More sharing options...
passarito Posted June 18, 2012 at 10:56 AM Author Report Share #463616 Posted June 18, 2012 at 10:56 AM 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 More sharing options...
nunopicado Posted June 18, 2012 at 11:10 AM Report Share #463622 Posted June 18, 2012 at 11:10 AM 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 More sharing options...
passarito Posted June 18, 2012 at 11:23 AM Author Report Share #463626 Posted June 18, 2012 at 11:23 AM Experimentei a duas opções e em 3 pc's e continua a não conseguir enviar.... O mail server é exchange, será por causa disso? Link to comment Share on other sites More sharing options...
nunopicado Posted June 18, 2012 at 11:27 AM Report Share #463628 Posted June 18, 2012 at 11:27 AM 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 More sharing options...
passarito Posted June 18, 2012 at 11:29 AM Author Report Share #463629 Posted June 18, 2012 at 11:29 AM era o q estava a pensar... vou tentar isso esta tarde Link to comment Share on other sites More sharing options...
passarito Posted June 18, 2012 at 12:59 PM Author Report Share #463639 Posted June 18, 2012 at 12:59 PM Tentei no Yahoo onde tenho conta, mas quando agora vim aqui é que reparei que disseste qua não pode usar SSL Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now