quarta-feira, maio 31, 2017

Nova fonte de informações técnicas de PowerBuilder

Recentemente tenho visitado muitas empresas no Brasil para entender como está o PowerBuilder. Para minha boa surpresa, várias destas empresas possuem pessoas que me conhecem daqui do Blog e comentam que já utilizaram bastante o Blog para resolver seus problemas.

Fico muito lisonjeado em ouvir isto e tenho vontade de começar novamente a publicar artigos técnicos aqui no Blog, porém a função que ocupo hoje me exige foco em outras questões e acabo não conseguindo dar a atenção necessária a este canal.

Entretanto, existe pessoas que estão no seu ápice de desenvolvimento PowerBuilder e hoje tem um conhecimento muito maior que o meu. Desta forma, gostaria de compartilhar o Blog que dois grandes amigos meus criaram com o mesmo objetivo que este blog.

No link abaixo você pode acessar várias publicações sobre dicas e soluções para problemas que o Armando e o Breno estão postando várias vezes por semana.

Utilizem a ferramenta e em caso de dúvida, sugestões ou contribuições, fiquem a vontade para enviar para eles.

http://raccoon.ninja/pt/tag/powerbuilder/

terça-feira, março 14, 2017

Empresas que utilizam PowerBuilder - 2017

Ultima Atualização da Lista: 01/06/2017 10:00

Pessoal,
 a 12 anos atrás eu realizei uma pesquisas ( http://thiagocpereira.blogspot.com.br/2005/07/powerbuilder-empresas-que-utilizam.html ) e publiquei aqui da empresas que utilizavam PowerBuilder.

Como muitas pessoas me questionam quais empresas ainda continuam utilizando PowerBuilder, estou refazendo a pesquisa e gostaria do apoio de vocês.

Abaixo a lista de empresas que utiliza PowerBuilder, baseado na pesquisa anterior e em alguns ajustes que já fiz. Gostraria do apoio de vocês para me enviar empresa desta lista que não utilizam mais PowerBuilder e empresas que utilizam PowerBuilder e não estão aqui.


1. Ambev
2. AMIL planos de saúde.
3. Ápia Consultoria e Sistemas Ltda
4. Attps informática (Belo Horizonte)
5. Banco ABN-AMRO
6. Banco BBA
7. Banco BBM
8. Banco BMG
9. Banco do Nordeste
10. Banco Finaustria
11. Banco SAFRA.
12. Banco Mercantil
13. Banco Santander
14. Banco Tokio-Mitsubishi S.A.
15. Banco Votorantim
16. BANESTES
17. Bank Boston
18. Basf S.A
19. BCP
20. Banque Nationale de Paris
21. Bolsa de Valores do Estado de São Paulo
22. Bozano
23. Caixa Econômica Federal
24. Carioca Engenharia ( Christiane Nielsen )
25. Carrefour
26. Caterpillar do Brasil
27. Cibrafértil Cia Brasileira de Fertilizantes S/A (Salvador)
28. CITROSUCO PAULISTA S/A ( Maior exportadora de Suco de Laranja do País )
29. CODESA (Porto de Vitória)
30. Companhia de Informática de Pernambuco
31. Companhia de Processamento de dados de Uberaba
32. Confederação Nacional da Indústria
33. Consorcio RodoBens
34. Construtora Norberto Odebrecht
35. Coperguaçu ( Maior Cooperativa de criação de frangos do país )
36. Companhia Ciderurgica de Tubarão
37. Credicard S/A
38. CSG International
39. Cumerlato & Schuster
40. DBMS COMPSIS
41. DBMS Tecnologia da Informação
42. Deten Química (Salvador)
43. ECAD MasterSaf
44. Electronic Data Systems do Brasil ( Banco GM )
45. Electronic Data Systems do Brasil ( Cartão de Crédito )
46. Electronic Data Systems do Brasil ( GM )
47. Electronic Data Systems do Brasil ( Visanet )
48. Energisa (Cataguases  MG)
49. Engenharia e Teleinformática Ltda ( Salvador/BA )
50. Firestone
51. Fundação Baiana de Cardiologia
52. Fundação José Silveira (Salvador)
53. Golden Cross
54. GoodLife Belo Horizonte
55. HSBC
56. IBM do Brasil
57. Laboratório Clínico Delboni Auriemo
58. Line Informática (Uberlandia)
59. LOGOCENTER
60. MasterSaf
61. Matera System
62. Nutris Tecnologia E Sistemas De Nutrição Ltda
63. OAB Minas Gerais
64. PENSKE
65. Pif Paf Alimentos
66. Pirelli Cabos S.A.
67. Pirelli Pneus S.A.
68. Pixeon (Salvador)
69. Porto Seguro – Seguros
70. PowerLogic
71. Prefeitura Municipal de Patrocinio/MG
72. Prefeitura Municipal de Uberaba
73. Processamento de dados de Uberlandia
74. Prodabel (Belo Horizonte)
75. Prodemge -  Processamento de Dados de Minas Gerais
76. Racional Engenharia
77. Redecard S/A
78. RK Hotéis e Turismo S/A
79. Salux
80. Seguros de Saúde
81. Staff Informática (Joinville)
82. Shell do Brasil
83. Shop Tour
84. SICS – HELP Informática
85. TecBan
86. Tecnovia Informática
87. TotalBanco
88. Tools Software
89. Tecnovia
90. Telecomunicações Do Paraná S.A. ( Brasil Telecom )
91. Trends Advance
92. Tribanco de Uberlandia
93. Uma Das Cias Elétricas Do RS Cigna Seguradora
94. Unibanco
95. Unitech Tecnologia de Informação
96. Universidade de Uberaba
97. Universidade do Extremo Sul Catarinense
98. Universidade do Rio dos Sinos Procergs
99. Universidade Federal de Minas Gerais – UFMG (Belo Horizonte)
100. Universidade Federal do Rio Grande do Sul
101. Unnisa S/A
102. Vale
103. Van Communications
104. Visanet Companhia de Meios de Pagamento S/A
105. Volkswagen do Brasil S/A
106. Votorantim Mineração e Metais
107. Xerox do Brasil
108. Zeus Rio Solutions




segunda-feira, junho 08, 2015

Qual o futuro do PowerBuidler?

         Uma das grandes questões sobre o PowerBuilder é qual o futuro do mesmo? Várias empresas têm grande parte das suas aplicações em PowerBuilder e não sabem para onde seguir.

Outro ponto e como colocar uma aplicação PowerBuilder na internet. Devo reescreve-la toda novamente?

Baseado na dúvidas acima e que também são problemas para a attps ( www.attps.com.br ), estive representando a attps na Conferência de PowerBuilder que occorreu em Charllote - Carolina do Norte - USA ( Charlotte PowerBuilder Conference 2015 ).

Estavam presente no evento os maiores evangelistas de PowerBuilder do mundo, destacando o Chris Pollach ( http://chrispollach.blogspot.com.br/ ), Bruce Armstrong ( http://www.brucearmstrong.org/ ) e o Matt Balent (http://www.ncpbug.org ).

Chris Pollach descreveu muito bem a conferencia no seu post http://chrispollach.blogspot.com.br/2015/06/pbc.html e não irei repetir aqui o que está bem dito por ele.

Porém, respondendo as questões acima:

Como evoluir a minha aplicação para Web?
Este ponto foi muito discutido pelos participantes do evento e o caminho mais simples e com maior sucesso para disponibilizar a aplicação na Web foi a utilização do Appeon ( www.apppeon.com ). No passado eu tinha feito um teste com o Appeon, quando trabalhava na Energisa ( www.energisa.com.br ) e tinha me decepcionado muito, porém após os relatos feitos no evento, resolvi testar a ferramenta.

Para a minha surpresa, conseguir migrar uma aplicação grande para a Web com sucesso com apenas 16 horas. É claro que existem alguns pontos a ajustar, mas nada crítico. A aplicação funcionou 100% e ficou excelente. Não vou me aprofundar no Appeon aqui, pois este é assunto para um outro post, mas vale destacar que realmente é um caminho muito bom para quem está no PowerBuilder e precisar disponibilizar a aplicação na web.

A opção de reescrever a aplicação em outra linguagem como Java e .Net foi pouco recomendada pelo investimento necessário e os custos envolvidos. Quem fez esta escolha não gostou dos resultados se a opção for apenas migrar por migrar, mas se for para reconstruir a aplicação, talvez neste caso o custo se pague com os ganhos obtidos por uma aplicação melhor.

Qual o futuro do Power Builder?
Esta é a questão que não queria calar. Na primeira apresentação do evento este assunto era pauta de conversa entre os participantes. Porém, todos os apresentadores fugiam do assunto e o motivo era claro, ninguém sabia a resposta.

Porém, na última apresentação do evento, Mr       Dirk Boessmann, Senior SAP VP, teve um bate-papo com os participantes para conversarmos sobre este assunto. Resumidamente, a SAP deixou o PowerBuilder de lado de 2010 até 2015, pelo produto não ser a prioridade em seu portfólio de produtos. Este ponto explica porque algumas vezes tentei comprar licenças do PowerBuilder e não consegui. Porém, ocorreu um movimento de grandes empresas no mundo e que usam PowerBuilder cobrando uma posição da SAP, o que fez a empresa procurar saber o que é o tal do PowerBuilder. Com isto, eles identificaram que o Power Builder precisava de uma atenção especial e resolveram retomar o mesmo. Neste ponto entra outro problema, porque nos anos que o PowerBuilder ficou parado, a SAP desmontou todo o time de PowerBuilder e não tem mais capacidade de evolui-lo. Para resolver está questão, a SAP resolveu transferir o desenvolvimento / sustentação do PowerBuilder para outra empresa e, após uma análise de mercado, a SAP fechou uma parceria com a Appeon que será responsável por manter o PowerBuilder.

O CEO da Appeon, Mr. Armeen Mazda, que estava presente no evento, comentou que a Appeon tem todo interesse em evoluir o PowerBuilder e pretende liberar melhorias de forma rápida, seguindo metodologias Ágeis de desenvolvimento de software.

Uma questão colocada por um participante e que a resposta foi boa é se não existe um conflito de interesse entre o PowerBuilder e o Appeon, já que o Appeon é uma ferramenta que complementa o PowerBuilder e, que de agora em diante a Appeon não iria aproveitar todo este conhecimento para evoluir o Appeon e não o PowerBuilder. A resposta do Mr. Armeen é que o objetivo deles, e o mais interessante para o negócio, é que o PowerBuilder cresça e não o Appeon e que neste caso a tendência é que o PowerBuilder comece a incorporar funcionalidade do Appeon.

A comunidade de PowerBuilder ficou muito entusiasmada com a notícia, pois desta forma o PowerBuilder tem uma chance de crescer em muito, já que terá uma empresa praticamente dedicada a evolução da mesma, o que poderá colher bons frutos no futuro. Digamos que a Appeon pode se tornar uma “PowerSoft” que foi a época de ouro do PowerBuilder.

Agora é aguardar e ver quais são os próximos caminhos.

Abaixo alguns links sobre a parceria SAP e Appeon.



sábado, março 15, 2014

Mudanças......

Pessoal,
recentemente eu tenho recebido várias questões referentes ao Power Builder e acredito que falhei em não ter comunicado aqui as mudanças que ocorreram na minha vida profissional nos últimos anos.

Como nunca é tarde, valos lá...

Desde 2008 eu deixei de de realizar atividades técnicas e passei a trabalhar mais com atividades gerenciais. Quem conhece o conceito de carreira em Y, eu mudei da linha técnica para a linha gerencial.

Porém, como todos que já passaram por isto sabem como é, a transição não é fácil, principalmente para quem é apaixonado pela tecnologia como eu. Desta forma, até 2010 eu ainda "brincava" com a parte técnica.

Hoje eu tenho uma carreira 100% gerencial e deixo a parte técnica apenas para lazer e quando o tempo permite, o que é raro.

Com relação ao Power Builder, a última vez que instalei um Power Builder foi em 2009. Por decisão própria e por não acreditar que no futuro do Power Builder (Vou escrever um post sobre isto), resolvi abandonar totalmente o Power Builder. Desta forma e infelizmente, não consigo mais ajuda-los em questões técnicas referentes ao Power Builder. O primeiro motivo é porque não consigo mais me lembrar das soluções e o segundo motivo é que não possuo nem mesmo uma instalação do Power Builder para relembrar.

Hoje ocupo um cargo de gestão na attps informatica ( www.attps.com.br ) e me dedico 100% a questões estratégicas. Porém, continuo apaixonado pela tecnologia, mas me permito escolher onde quero me divertir. Como parceiros GOLD ALM da Microsoft, procuro direcionar todos os meus esforços para a ALM, incluindo o TFS, SQL Server e Visual Studio.

Pretendo retomar os meus Posts, direcionando este Blog para assuntos de gestão, tecnologias que ainda gosto de "brincar" e o Microsoft ALM.

Abraços a todos e fiquem a vontade para enviar os comentários.

sexta-feira, outubro 11, 2013

Windows 8.1 não hiberna


Pessoal, instalei o Windows 8.1 e a princípio estava tudo funcionando. Após instalar todos os softwares ele parou de Hibernar, Sleep e Shutdown.

Após N tentativas de resolver, formatei novamente e tudo voltou a funcionar. Instalei os softwares novamente e começou a apresentar o mesmo problema.

Resolvi desinstalar software por software até descobrir que o problema estava sendo causado pelo cliente da VPN utilizada na empresa (SonicWall Global VPN Client Version 4.7.3.0403).

Verifiquei no site do fornecedor e baixei a nova versão do cliente da VPN (SonicWall Global VPN Client Version 4.8.6.0826) e resolveu o problema.

sexta-feira, outubro 21, 2011

SQL - Utilização do Comando Merge

Artigo enviado por Daniel Carvalho

Prezados

            O comando MERGE, antes exclusivo do Oracle, agora também está presente no SQL Server (2008 em diante). Ele é muito interessante para situações onde se deseja fazer um UPDATE ou INSERT, baseado na existência ou não dos dados na tabela destino. Sua performance é MUITO melhor que efetuar o select para verificar a existência, e então decidir entre o update ou o insert, pois o merge faz tudo ao mesmo tempo, para todos os registros.

A sintaxe básica do comando é:

MERGE INTO
USING
ON ()
WHEN MATCHED THEN
UPDATE SET
WHEN NOT MATCHED THEN
INSERT ()
VALUES ()

Como exemplo, suponha que se deseje atualizar uma tabela de pessoas jurídicas, baseado em uma tabela genérica com todos os clientes. O comando seria algo assim:

MERGE INTO tb_pj dst
USING (select cod_cli,
             nome_cli,
             cpfcnpj
        from tb_cli
       where cli_tip = 'PJ') ori (ori é um alias qualquer, para o select dos clientes PJ)
   ON (dst.cod_cli = ori.cod_cli) (join da ori com dst, para definir a existência dos dados)
WHEN MATCHED THEN UPDATE (lista das colunas que serão atualizadas, caso já exista)
  SET dst.hdrdathor = getdate(),
      nome = ori.nome,
      dst.cnpj = ori.cpfcnpj
WHEN NOT MATCHED THEN INSERT ( (colunas da dst que receberão valores)
      hdrdathor,
      cod_cli,
      nome_cli,
      cnpj )
VALUES ( (lista de valores que serão inseridos)
      getdate(),
      ori.nome_cli,
      ori.cpfcnpj )

Equipe DTP

terça-feira, julho 19, 2011

VAGAS Grupo attPS Informática



O grupo attPS Informática está selecionando profissionais para fazer parte do seu quadro de funcionários.
Segue abaixo as atuais vagas do grupo.

As indicações são bem vindas!

Os interessados deverão encaminhar currículo para rhbhz@attps.com.br.

                                              
Belo Horizonte
São Paulo
Vaga
Nº de vagas
Vaga
Nº de vagas
ANALISTA DESENVOLVEDOR - Júnior
1
ANALISTA DE NEGOCIOS - SENIOR
2
ANALISTA DESENVOLVEDOR .NET - Pleno
10
ANALISTA DE SUPORTE - JÚNIOR
1
ANALISTA DE SISTEMAS (VB)
1
ANALISTA PROGRAMADOR C# - JÚNIOR
2
Analista Negócios Contábil
1
ANALISTA PROGRAMADOR C# - PLENO
2
Analista Sênior Java
1
ANALISTA PROGRAMADOR C# - SÊNIOR
2
CONSULTOR DE IMPLANTAÇÃO
2
ANALISTA PROGRAMADOR - PLENO
1
DESENVOLVEDOR JAVA PLENO
4
ANALISTA DE SISTEMAS
1
Desenvolvedor Sharepoint Pleno
1
ASSISTENTE DE INFORMÁTICA
1
ENGENHEIRO DE SOFTWARE
1
HELP DESK
1

sábado, abril 30, 2011

Mudanças no suporte do SQL Server 2000 e SQL Server 2005

O SQL Server 2000 está em período de suporte estendido, que se encerra em 09 abril de 2013. A partir desta data não haverá atualizações para a versão. O suporte online continua disponível por 12 meses. O SQL Server 2005 está em período de suporte estendido desde 12 de abril de 2011. A versão mais atual é o SQL Server 2008 R2.
Saiba mais sobre o SQL Server 2008 R2.

segunda-feira, abril 18, 2011

Iniciando os testes unitários no Visual Studio 2010

Para quem está começando, link que simples, mas funcional.

http://qualidadeteste.wordpress.com/2011/04/12/iniciando-os-testes-unitarios-no-visual-studio-2010/

terça-feira, abril 05, 2011

PowerBuilder - Ativação do PBDebug (-DEB)


Texto criado por Daniel Carvalho

 Fui designado para resolver um problema de performance que estava acontecendo na integração de um sistema, o problema era o seguinte, quando um sistema erá disparado a partir de outro ele demorava 2 HORAS para terminar o processo, mas quando era feito diretamente, não levava mais do que 2 minutos. No mínimo INTRIGANTE!
Ficou comigo então a missão de descobrir o problema de performance e a sua solução!
A primeira coisa a ser feita foi colocar alguns logs dentro do sistema, gerei uma versão e copiei esta para uma outra pasta sem DLL e sem INI, lá só estavam o .EXE e as PBDs. Criei um arquivo BAT que passava a misteriosa string para o sistema: RSE#9#Rel. SEDE por Agência-Debito #1#SQLSERVER##OLE DB#amdteslgn0603#amdteslgn0603 #amdteslgn0603#amdteslgn0603#AMDTESDBS0603# ATTBHZS015 #PROVIDER='SQLOLEDB', DATASOURCE='ATTBHZS015', OJSyntax = 'ANSI'#4#
Na primeira execução notei que TUDO estava lento. Quando fechei o arquivo de log notei que havia um estranho no ninho, um arquivo de nome “XXXXXXX.DBG”. Fiquei ali olhando para aquele arquivo e me perguntando quem diabos tinha colocado ele ali, e pelo horário e owner notei que tinha sido EU! O problema disso é que esse arquivo só deveria ser criado quando fosse passado o parâmetro “/PBDEBUG” para o sistema, o que não era o caso, pois dentro da string misteriosa não havia nenhum sinal deste termo. Apaguei o invasor e tentei executar o sistema passando o nome do arquivo TXT, como se fosse uma execução em lote, e tudo correu sem problemas de performance.
Foi aí que começou a minha luta contra o NADA, pois de alguma forma dentro da string misteriosa existia algum termo não documentando pela Sybase que gerava o arquivo de debug “.DBG”. Retirei toda a string e fui colocando letra por letra e executando o sistema para ver onde que o arquivo .DBG começava a ser gerado, para minha sorte e espanto consegui chegar rapidamente ao “TERMO SECRETO”, ele encontra-se no início da string e nunca encontrei documentação nenhuma falando a respeito dele, o termo misterioso é “-Deb”. Para verificar se isso era realmente o problema conversei com o pessoal da sistema e eles substituíram o “-“ por um espaço e adivinhem.......... O problema de performance foi RESOLVIDO!!!! Agora o problema é explicar para um usuário final que a retirada de um traço resolve o problema de performance.

PowerBuilder - RuntTime Errors

Link muito interessante contendo a relação de Runtimes Erros do PowerBuilder



Contribuição de Brun o Henrique S. Quaresma

quinta-feira, março 31, 2011

quinta-feira, janeiro 20, 2011

.NET Framework System Requirements

No link abaixo encontra-se os requisitos (Memória e processador) e sistemas operacionais suportados pelas diversas versões do .Net Framework.

.NET Framework System Requirements

Mudando as configurações de IDE do Visual Studio

Aconteceu um problema comigo ao instalar o Visual Studio e após isto umas três pessoas já me tiveram o mesmo problema.

Ao instalar o Visual Studio 2010 eu escolhi a opção de configurar a IDE para desenvolvimento e Team Projects. A minha surpresa é que ao concluir a instalação não tinha as opções de criar projetos para desenvolvimento (Web Sites, C# applications, etc...).

Após uma longa pesquisa na Internet e tentar restaurar as configurações via linha de comando, registry e etc., descobri o procedimento correto, conforme informado abaixo:
1. Abra o Visual Studio 2010
2. Vá à opção Tools --> Import and Export Settings...
3. Marque a opção Import selected environment setting e clique em Next
4. Selecione No, just import new…. E clique em Next
5. Selecione a opção desejada e clique Next. No meu caso é a opção General Development Settings, que permite desenvolver qualquer tipo de projeto.
6. Clique em Finish para aplicar as configurações.

Pronto, com o procedimento acima você consegue resolver o problema inicial.

terça-feira, janeiro 04, 2011

PowerBuilder – Enviando e-mail por SMTP - Parte 4 / 4


4)   Abaixo o código para enviar um e-mail

String ls_ret

uo_email luo_email

luo_email = Create uo_email

/* ***** Configurações do Servidor ***** */
luo_email.is_Server_SMTP = 'smtp.xyz.com.br'
luo_email.is_Server_Port = '25'
luo_email.is_Server_UserId = 'teste'
luo_email.is_Server_UserPass = '*******'
luo_email.ib_Server_smtpAuth = True
luo_email.ib_Server_TLS_Encryption = False
/* ***** Fim Configurações do Servidor ***** */

/* ***** Dados para envio do E-Mail ***** */
luo_email.is_email_to_address[] = {'teste@gmail.com, teste@msn.com'}
luo_email.is_email_from_address = 'teste@yahoo.com'
luo_email.is_email_subject = 'Teste'
luo_email.is_email_body = 'Teste de email'
luo_email.is_email_attach[] = {'D:\foto.JPG'}
luo_email.ib_email_receipt = False
/* ***** Fim Dados para envio do E-Mail ***** */

ls_ret = luo_email.of_send_email()
If ls_ret <> ''Then
               MessageBox('Teste', 'Falha no envio: ' + ls_ret)
Else
               MessageBox('Teste', 'Email enviado com sucesso.')
End If

Destroy luo_email

PowerBuilder – Enviando e-mail por SMTP - Parte 3 / 4

 3)   Criar o Objeto  n_mail (abaixo o export do objeto)

$PBExportHeader$uo_email.sru
forward
global type uo_email from nonvisualobject
end type
end forward

global type uo_email from nonvisualobject
end type
global uo_email uo_email

type variables

/* ***** Configurações do Servidor ***** */
String is_Server_SMTP // IP ou nome do servidor de SMTP
String is_Server_Port = '25' // Porta SMTP no servidor (default = 25)
String is_Server_UserId // ID ou login no servidor SMTP
String is_Server_UserPass // Password no servidor SMTP

Boolean ib_Server_smtpAuth // Se o servidor necessita de autenticação por login/senha (is_Server_UserId, is_Server_UserPass) (Default = False)
Boolean ib_Server_TLS_Encryption // Se o servidor SMTP requer criptografia TLS (Default = False)

//Ex. Para GMail:
//is_Server_SMTP = "smtp.gmail.com"
//is_Server_Port = "465"
//is_Server_UserId =
//is_Server_UserPass =
//ib_Server_smtpAuth = True
//ib_Server_TLS_Encryption = True

/* ***** Fim Configurações do Servidor ***** */

/* ***** Dados para envio do E-Mail ***** */
String is_email_to_name[] // Nomes para aparecer no endereço de email (destinatários) - Opcional
String is_email_to_address[] // Endereços de email (destinatários)
String is_email_from_name // Nome para aparecer no sender do email - Opcional
String is_email_from_address // Sender do email
String is_email_subject // Título do email
String is_email_body // Corpo (texto) do email
String is_email_attach[] // Anexos do email - Opcional
Boolean ib_email_receipt // Se deseja receber confirmação de recebimento (Default = False)

//Ex. de e-mail:
//is_email_to_name[1] = 'José da Silva'
//is_email_to_address[1] = 'jose@email.com'
//is_email_from_name[] 'Maria da Silva'
//is_email_from_address[] 'Maria@email.com'
//is_email_subject = 'Teste de e-mail'
//is_email_body 'Este é um email de teste'
//is_email_attach[1] = 'D:\Teste.txt'
//ib_email_receipt = False

/* ***** Fim Dados para envio do E-Mail ***** */

/* ***** Outras variáveis ***** */

end variables
forward prototypes
public function string of_send_email ()
public function string of_server_data ()
public function string of_email_data ()
end prototypes

public function string of_send_email ();
// Função principal para envio de email. Necessita do preenchimento das variáveis de instância de configuração do servidor
// e dos dados do e-mail.

String ls_ret
Long i
Boolean lb_ret

n_smtp ln_smtp

SetPointer(HourGlass!)

/* ***** Validações ***** */
// Dados do servidor
ls_ret = of_server_data()
If ls_ret <> '' Then Return ls_ret

// Dados do email
ls_ret = of_email_data()
If ls_ret <> '' Then Return ls_ret

/* ***** Fim Validações ***** */

/* ***** Dados para envio do email ***** */
ln_smtp.of_ResetAll()

// Propriedades do servidor
ln_smtp.of_SetServer(is_server_SMTP)
ln_smtp.of_SetPort(Long(is_server_Port))

If ib_Server_smtpAuth Then
               ln_smtp.of_SetLogin(is_Server_UserId, is_Server_UserPass)
End If

// Dados do email
ln_smtp.of_SetReceipt(ib_email_receipt)
ln_smtp.of_SetLogFile(False)
ln_smtp.of_SetSubject(is_email_Subject)
ln_smtp.of_SetBody(is_email_body, False)
ln_smtp.of_SetFrom(is_email_from_address, is_email_from_name)

// Destinatários
For i = 1 To UpperBound(is_email_to_address[])
               If UpperBound(is_email_to_name[]) >= i Then
                               ln_smtp.of_AddAddress(is_email_to_address[i], is_email_to_name[i])
               Else
                               ln_smtp.of_AddAddress(is_email_to_address[i])
               End If
Next

// Anexos
For i = 1 To UpperBound(is_email_attach[])
               ln_smtp.of_AddAttachment(is_email_attach[i])
Next

/* ***** Fim Dados para envio do email ***** */

/* ***** Envia o e-mail ***** */
If ib_Server_TLS_Encryption Then
               lb_ret = ln_smtp.of_SendTLSMail()
Else
               lb_ret = ln_smtp.of_SendMail()
End If

If lb_ret Then
               // Email enviado com sucesso
               Return ''
Else
               // Falha no envio do email
               return ln_smtp.of_GetLastError()
End If
/* ***** Fim Envia o e-mail ***** */

end function

public function string of_server_data ();
// Valida os dados de configuração do servidor

is_server_SMTP = Trim(is_server_SMTP)
If IsNull(is_server_SMTP) or is_server_SMTP = '' Then Return 'Especifique o servidor SMTP'

is_Server_Port = Trim(is_Server_Port)
If IsNull(is_Server_Port) or IsNumber(is_Server_Port) = False or is_Server_Port = '0' Then Return 'Especifique a porta do servidor SMTP'

If ib_Server_smtpAuth Then
               is_Server_UserId = Trim(is_Server_UserId)
               If IsNull(is_Server_UserId) or is_Server_UserId = '' Then Return 'A opção de autenticação está marcada, então informe o usuário do servidor SMTP'

               is_Server_UserPass = Trim(is_Server_UserPass)
               If IsNull(is_Server_UserPass) or is_Server_UserPass = '' Then Return 'A opção de autenticação está marcada, então informe a senha do servidor SMTP'
End If

Return ''

end function

public function string of_email_data ();
// Valida os dados de envio do email

Long i

If UpperBound(is_email_to_address[]) = 0 Then Return 'Informe pelo menos 1 (um) destinatário'
If UpperBound(is_email_to_address[]) > 0 and UpperBound(is_email_to_name[]) > 0 and UpperBound(is_email_to_address[]) <> UpperBound(is_email_to_name[]) Then
               Return 'A lista de nomes dos destinatários está com tamanho diferente da lista de emails dos destinatários'
End If

For i = 1 To UpperBound(is_email_to_name[])
               is_email_to_name[i] = Trim(is_email_to_name[i])
Next
For i = 1 To UpperBound(is_email_to_address[])
               is_email_to_address[i] = Trim(is_email_to_address[i])
Next

is_email_from_name = Trim(is_email_from_name)
is_email_from_address = Trim(is_email_from_address)
If IsNull(is_email_from_address) or is_email_from_address = '' Then Return 'Informe o sender do email'

is_email_subject = Trim(is_email_subject)
If IsNull(is_email_subject) or is_email_subject = '' Then Return 'Informe o título do email'

is_email_body = Trim(is_email_body)
If IsNull(is_email_body) or is_email_body = '' Then Return 'Informe o texto para o corpo do email'

Return ''

end function

on uo_email.create
call super::create
TriggerEvent( this, "constructor" )
end on

on uo_email.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on