{"id":326,"date":"2019-03-25T17:30:19","date_gmt":"2019-03-25T20:30:19","guid":{"rendered":"http:\/\/xexeu.elipse.com.br\/pt\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/"},"modified":"2024-03-28T16:00:32","modified_gmt":"2024-03-28T19:00:32","slug":"conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess","status":"publish","type":"post","link":"https:\/\/kb.elipse.com.br\/en\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/","title":{"rendered":"Conectando uma aplica\u00e7\u00e3o VBA a um E3Server com a biblioteca de comunica\u00e7\u00e3o E3DataAccess."},"content":{"rendered":"<div align=\"justify\">\n<p><strong><u>NOTAS GERAIS:<br \/>\n<\/u><\/strong><\/p>\n<ol>\n<li>Este artigo se aplica ao <b>Elipse E3<\/b>, vers\u00f5es <b>4.0<\/b> ou <b>inferior<\/b>.<\/li>\n<li>A biblioteca E3DataAccess apresenta um <u><a href=\"http:\/\/kb.elipse.com.br\/pt-br\/questions\/5164\">erro<\/a><\/u> ao ser utilizada em linguagens sem tipos (typeless), como o VBScript ou o JavaScript.<\/li>\n<li>Este componente \u00e9 compat\u00edvel apenas com aplica\u00e7\u00f5es 32 bits.<\/li>\n<\/ol>\n<p><strong><u>1) Introdu\u00e7\u00e3o<\/u><\/strong><\/p>\n<p>A biblioteca <b>E3DataAccess <\/b>fornece ao usu\u00e1rio uma nova maneira de conex\u00e3o com o E3Server. Agora, qualquer aplica\u00e7\u00e3o desenvolvida em VB, Delphi, .NET ou outra linguagem com suporte a COM consegue se comunicar com o E3Server com a utiliza\u00e7\u00e3o das fun\u00e7\u00f5es fornecidas por ela.<\/p>\n<p>Este artigo ilustra o funcionamento do E3Server com uma aplica\u00e7\u00e3o desenvolvida em um ambiente VBA, atrav\u00e9s do Microsoft Excel. O mesmo procedimento tamb\u00e9m pode ser aplicado em outros ambientes de desenvolvimento, adequando seu c\u00f3digo de acordo com a sintaxe da linguagem utilizada.<br \/>\n<u><\/u><\/p>\n<p><b>2) Habilitando a biblioteca E3DataAccess para uso no VBA<\/b><\/p>\n<p>Antes de criar a aplica\u00e7\u00e3o pelo VBA, \u00e9 preciso habilitar a biblioteca <b>E3DataAccess <\/b>para uso no ambiente de desenvolvimento. Ap\u00f3s isto, ficar\u00e3o dispon\u00edveis todas as fun\u00e7\u00f5es necess\u00e1rias para a comunica\u00e7\u00e3o\u00a0 com o E3Server.<\/p>\n<p>Com o E3Studio, Microsoft Excel e VBA devidamente instalados, acesse a interface VBA da aplica\u00e7\u00e3o Excel. Na interface do VBA, adicione a biblioteca E3DataAccess na lista de refer\u00eancias do projeto. Para isto, entre na op\u00e7\u00e3o <b>References<\/b>, localizada no menu <b>Tools<\/b>:<\/p>\n<div align=\"center\"><img loading=\"lazy\" title=\"\" src=\"http:\/\/kb.elipse.com.br\/pt-br\/images\/ID59\/Figura1.PNG\" alt=\"\" width=\"550\" height=\"449\" align=\"bottom\" border=\"0\" \/><br \/>\n<span style=\"font-size: xx-small;\"><b>Figura 1<\/b>: Acessando lista de refer\u00eancias do projeto<br \/>\n<\/span><\/div>\n<p>Na lista de refer\u00eancias dispon\u00edveis, procure pela biblioteca E3DataAccess e habilite-a atrav\u00e9s da caixa de sele\u00e7\u00e3o.<\/p>\n<div align=\"center\"><img loading=\"lazy\" title=\"\" src=\"http:\/\/kb.elipse.com.br\/pt-br\/images\/ID59\/Figura2.PNG\" alt=\"\" width=\"447\" height=\"354\" align=\"bottom\" border=\"0\" \/><br \/>\n<span style=\"font-size: xx-small;\"><b>Figura 2<\/b>: Lista de refer\u00eancias dispon\u00edveis no projeto<\/span><\/div>\n<p>Caso a biblioteca n\u00e3o esteja dispon\u00edvel na lista de refer\u00eancias, \u00e9 preciso registr\u00e1-la. Para isto, clique no bot\u00e3o <b>Browse<\/b>, e uma caixa de sele\u00e7\u00e3o para a determina\u00e7\u00e3o da biblioteca ser\u00e1 exibida.<\/p>\n<div align=\"center\"><img loading=\"lazy\" title=\"\" src=\"http:\/\/kb.elipse.com.br\/pt-br\/images\/ID59\/Figura3.PNG\" alt=\"\" width=\"473\" height=\"395\" align=\"bottom\" border=\"0\" \/><br \/>\n<span style=\"font-size: xx-small;\"><b>Figura 3<\/b>: Caixa de sele\u00e7\u00e3o da biblioteca<\/span><\/div>\n<p>Procure pelo arquivo .dll chamado <b>E3DataAccess<\/b>. Ele vem juntamente no pacote do E3 vers\u00e3o 3.0, e encontra-se dentro do seu\u00a0 diret\u00f3rio de instala\u00e7\u00e3o, na subpasta <b>Bin <\/b>(exemplo: <span style=\"font-family: Courier New;\">C:\/Program Files\/Elipse E3\/Bin<\/span>). Ap\u00f3s abrir o arquivo .dll, a biblioteca <b>E3DataAccess <\/b>ficar\u00e1 dispon\u00edvel na lista de refer\u00eancias; ent\u00e3o, siga o passo anterior novamente. Confirme a modifica\u00e7\u00e3o clicando no bot\u00e3o <b>OK<\/b>.<\/p>\n<p><u><b>3) Instanciando um novo objeto E3DataAccess no projeto<\/b><\/u><\/p>\n<p>Ap\u00f3s a biblioteca <b>E3DataAccess <\/b>ter sido adicionada ao projeto, \u00e9 poss\u00edvel utiliz\u00e1-la. Neste exemplo, vamos adicionar um novo m\u00f3dulo ao projeto e instanciar um objeto do tipo <b>E3DataAccess <\/b>dentro dele.<\/p>\n<p>Para criar um novo m\u00f3dulo, uma das alternativas \u00e9 clicar com o bot\u00e3o direito do mouse em cima do nome do projeto, dispon\u00edvel via Project Explorer, e selecionar a op\u00e7\u00e3o <b>Insert&#8211;Module<\/b>.<\/p>\n<div align=\"center\"><img loading=\"lazy\" title=\"\" src=\"http:\/\/kb.elipse.com.br\/pt-br\/images\/ID59\/Figura4.PNG\" alt=\"\" width=\"550\" height=\"449\" align=\"bottom\" border=\"0\" \/><br \/>\n<span style=\"font-size: xx-small;\"><b>Figura 4<\/b>: Inserindo um novo M\u00f3dulo pelo VBA<\/span><\/div>\n<p>Feito isto, ser\u00e1 adicionado um novo m\u00f3dulo ao projeto, com o nome default de <b>Module1<\/b>, que deve ser renomeado como <b>E3ServerCOM<\/b>.<\/p>\n<p>Clique duas vezes em cima do m\u00f3dulo <b>E3ServerCOM <\/b>criado para acessar seu c\u00f3digo. Neste momento, n\u00e3o existe nenhum c\u00f3digo dentro do m\u00f3dulo. \u00c9 nele que vamos inserir a seguinte linha para a instancia\u00e7\u00e3o do objeto E3DataAccess, conforme abaixo:<\/p>\n<pre><span style=\"font-family: Courier New;\">Public E3 As New E3DATAACCESSLib.E3DataAccessManager <\/span><\/pre>\n<p>Com esta linha de c\u00f3digo, criamos um novo objeto chamado <b>E3<\/b>, derivado da classe <i>E3DATAACCESSLib.E3WebLinkMan<\/i>. Esta classe cont\u00e9m todas as fun\u00e7\u00f5es necess\u00e1rias para realizar a conex\u00e3o com o E3Server. O objeto tamb\u00e9m foi instanciado como p\u00fablico, sendo portanto acess\u00edvel em qualquer lugar do projeto.<\/p>\n<p><b>NOTA<\/b>: *quando um novo objeto <b>E3DataAccess <\/b>\u00e9 instanciado, tamb\u00e9m \u00e9 consumido um produto de Viewer do Hardkey. Isso pode ser visualizado na\u00a0op\u00e7\u00e3o de <b>Licen\u00e7as<\/b>, dispon\u00edvel no menu do E3Server. Portanto, deve-se prestar aten\u00e7\u00e3o redobrada para que n\u00e3o sejam consumidos mais produtos do que o necess\u00e1rio.<\/p>\n<p>*A partir da vers\u00e3o 4.5.208 o E3Server suporta conex\u00f5es do E3DataAccess e do E3AccessLayer ilimitadas, sem consumo de Viewer ou de qualquer outro tipo de produto.<br \/>\n<u><b><br \/>\n4) Aplica\u00e7\u00e3o E3<\/b><\/u><\/p>\n<p>A aplica\u00e7\u00e3o E3 utilizada para este exemplo \u00e9 uma aplica\u00e7\u00e3o padr\u00e3o com dois objetos <b>TagDemo <\/b>e um <b>TagInterno <\/b>dentro do Servidor de Dados para demonstra\u00e7\u00e3o dos m\u00e9todos de leitura e escrita do <b>E3DataAccess<\/b>. Al\u00e9m deles, tamb\u00e9m foi criado um Hist\u00f3rico chamado <b>Hist1 <\/b>com dois campos: <b>E3TimeStamp <\/b>e <b>TagHist<\/b>, que armazenam os valores gerados pelo <b>TagDemo2<\/b>:<\/p>\n<div align=\"center\"><img loading=\"lazy\" title=\"\" src=\"http:\/\/kb.elipse.com.br\/pt-br\/images\/ID59\/Figura5.PNG\" alt=\"\" width=\"550\" height=\"362\" align=\"bottom\" border=\"0\" \/><br \/>\n<span style=\"font-size: xx-small;\"><b>Figura 5<\/b>: Hist\u00f3rico da aplica\u00e7\u00e3o E3<\/span><\/div>\n<p>Foi criado um objeto Banco de Dados do tipo Access chamado <b>BancoDados1<\/b>, que guarda todos os dados no arquivo <b>Teste.mdb<\/b>. O objeto Hist\u00f3rico foi associado ao BancoDados1 atrav\u00e9s de sua propriedade <i>DBServer<\/i>. Tudo isto foi feito para utilizar a fun\u00e7\u00e3o de acesso ao Banco de Dados do <b>E3DataAccess<\/b>.<\/p>\n<div align=\"center\"><img loading=\"lazy\" title=\"\" src=\"http:\/\/kb.elipse.com.br\/pt-br\/images\/ID59\/Figura6.PNG\" alt=\"\" width=\"550\" height=\"361\" align=\"bottom\" border=\"0\" \/><br \/>\n<span style=\"font-size: xx-small;\"><b>Figura 6<\/b>: Banco de Dados da aplica\u00e7\u00e3o E3<\/span><\/div>\n<p>Atribua um nome qualquer a tabela do Hist\u00f3rico pela propriedade <i>TableName<\/i>, e ela ser\u00e1 gerada clicando no bot\u00e3o <b>Gerar estrutura no BD<\/b> do menu.<\/p>\n<p>Crie um novo objeto Consulta dentro do Servidor de Dados. Configure-o para se conectar ao Banco de Dados <b>BancoDados1 <\/b>rec\u00e9m criado e acessar a tabela do Hist\u00f3rico gerada. Na janela de defini\u00e7\u00e3o de consultas, crie uma consulta que retorne todos os dados da tabela do Hist\u00f3rico.<\/p>\n<div align=\"center\"><img loading=\"lazy\" title=\"\" src=\"http:\/\/kb.elipse.com.br\/pt-br\/images\/ID59\/Figura7.PNG\" alt=\"\" width=\"550\" height=\"411\" align=\"bottom\" border=\"0\" \/><br \/>\n<span style=\"font-size: xx-small;\"><b>Figura 7<\/b>: Tela de defini\u00e7\u00e3o da consulta<\/span><\/div>\n<p><u><b><br \/>\n5) Leitura e escrita de dados com o E3DataAccess<\/b><\/u><\/p>\n<p>Com a aplica\u00e7\u00e3o E3 pronta, retorne ao Excel. Selecione sua tela e crie dois Bot\u00f5es de Comando; neste exemplo, fa\u00e7a com que um deles leia o valor do <b>TagDemo1 <\/b>e o outro escreva um valor em <b>TagInterno1<\/b>. Para adicionar os bot\u00f5es, \u00e9 aconselh\u00e1vel deixar visualiz\u00e1vel a barra de ferramentas Control Toolbox; isso pode ser feito acessando a op\u00e7\u00e3o <b>View&#8211;Toolbars&#8211;Control Toolbox<\/b>:<\/p>\n<div align=\"center\"><img loading=\"lazy\" title=\"\" src=\"http:\/\/kb.elipse.com.br\/pt-br\/images\/ID59\/Figura8.PNG\" alt=\"\" width=\"550\" height=\"384\" align=\"bottom\" border=\"0\" \/><br \/>\n<span style=\"font-size: xx-small;\"><b>Figura 8<\/b>: Habilitando a barra Control Toolbox no Excel<\/span><\/div>\n<p>O componente CommandButton estar\u00e1 dispon\u00edvel na barra Control Toolbox; selecione-o e adicione os dois bot\u00f5es. Clique com o bot\u00e3o direito do mouse no primeiro CommandButton e acesse suas propriedades. Na propriedade <i>Caption<\/i>, mude seu conte\u00fado para &#8220;Ler valor&#8221; e fa\u00e7a o mesmo com o outro bot\u00e3o, mas mudando seu conte\u00fado para &#8220;Escrever valor&#8221;. Isto mudar\u00e1 o texto dos bot\u00f5es. Mude tamb\u00e9m a propriedade <i>Name <\/i>dos bot\u00f5es de leitura e escrita para: <i>readValueButton <\/i>e <i>writeValueButton<\/i>, respectivamente.<\/p>\n<p>Agora, acesse o c\u00f3digo do bot\u00e3o encarregado de ler o valor do tag da aplica\u00e7\u00e3o E3 (<i>readValueButton<\/i>). Clique duas vezes em cima do bot\u00e3o e o VBA ser\u00e1 aberto automaticamente dentro do c\u00f3digo do evento de clique do bot\u00e3o. Dentro do evento, adicione as seguintes linhas de c\u00f3digo:<\/p>\n<pre><span style=\"font-family: Courier New;\">Private Sub readValueButton_Click()<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0Dim timestamp As Variant<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0Dim quality As Integer<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0Dim value As Variant<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0E3.Server = \"E3Server_HostName\"<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0If E3.GetValue(\"Dados.TagDemo1.Value\", timestamp, quality, value) Then<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0 Range(\"D4\") = value<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0 Range(\"E4\") = quality<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0 Range(\"F4\") = timestamp<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0Else <\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0 MsgBox \"Ocorreu uma falha na conex\u00e3o!\"<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0End If<\/span>\r\n<span style=\"font-family: Courier New;\">End Sub <\/span><\/pre>\n<p>O objeto E3 neste c\u00f3digo \u00e9 o mesmo objeto p\u00fablico instanciado no m\u00f3dulo <b>E3ServerCOM<\/b>. Este objeto trata de todas as opera\u00e7\u00f5es e conex\u00f5es com o E3Server, portanto, ele \u00e9 a &#8220;chave&#8221; de todo o c\u00f3digo. Ap\u00f3s a declara\u00e7\u00e3o das vari\u00e1veis de rotina, estamos atribuindo um valor a propriedade <i>Server <\/i>do objeto E3. Atrav\u00e9s da propriedade <i>Server<\/i>, informamos o nome do servidor E3Server (tipo string) ao qual queremos obter conex\u00e3o. Isto deve ser feito antes de realizar qualquer opera\u00e7\u00e3o no dom\u00ednio.<\/p>\n<p><b>M\u00e9todo <i>GetValue(Link, TimeStamp, Qualidade, Valor)<\/i><\/b><\/p>\n<p>Para ler o valor do tag, utilizamos o m\u00e9todo <i>GetValue<\/i>. Este m\u00e9todo recebe os seguintes par\u00e2metros de entrada e sa\u00edda:<\/p>\n<ul>\n<li><i>Link <\/i>&#8211; par\u00e2metro de entrada que fornece o caminho do objeto a ser lido.<\/li>\n<li><i>Timestamp <\/i>&#8211; par\u00e2metro de sa\u00edda que recebe o timestamp do Link referenciado.<\/li>\n<li><i>Qualidade <\/i>&#8211; par\u00e2metro de sa\u00edda que recebe a qualidade do Link referenciado.<\/li>\n<li><i>Valor <\/i>&#8211; par\u00e2metro de sa\u00edda que recebe o valor do Link referenciado.<\/li>\n<\/ul>\n<p>Este m\u00e9todo, quando chamado, retorna o valor booleano <b>TRUE <\/b>se obter sucesso na opera\u00e7\u00e3o, ou <b>FALSE <\/b>caso o contr\u00e1rio. No c\u00f3digo acima, estamos lendo o dado de <b>TagDemo1 <\/b>e guardando seu valor, qualidade e timestamp nas vari\u00e1veis: <i>Value<\/i>, <i>Quality <\/i>e <i>Timestamp<\/i>.<\/p>\n<p>Se n\u00e3o ocorrer nenhum problema com a leitura dos dados (retorna TRUE), escrevemos seus valores nas c\u00e9lulas D4, E4 e F4 da planilha do Excel. Portanto, ao clicar o bot\u00e3o <b>Ler valor<\/b>, teremos uma resposta conforme abaixo:<\/p>\n<div align=\"center\"><img loading=\"lazy\" title=\"\" src=\"http:\/\/kb.elipse.com.br\/pt-br\/images\/ID59\/Figura9.PNG\" alt=\"\" width=\"550\" height=\"384\" align=\"bottom\" border=\"0\" \/><br \/>\n<span style=\"font-size: xx-small;\"><b>Figura 9<\/b>: Resposta do bot\u00e3o &#8220;Ler valor&#8221;<\/span><\/div>\n<p>Os valores foram armazenados nas respectivas c\u00e9lulas da planilha, conforme especificado no c\u00f3digo. Com o valor lido, o pr\u00f3ximo passo agora \u00e9 escrever um valor no <b>TagInterno1<\/b>, o que ser\u00e1 abordado a seguir.<\/p>\n<p>Primeiro, acesse o c\u00f3digo do evento de clique do bot\u00e3o <i>writeValueButton<\/i>, como foi feito com o primeiro bot\u00e3o. Clique duas vezes com o mouse em cima dele e ser\u00e1 aberto o c\u00f3digo do evento no VBA.<\/p>\n<p>Dentro dele, adicione as seguintes linhas de c\u00f3digo:<\/p>\n<pre><span style=\"font-family: Courier New;\"><span style=\"font-family: Courier New;\">Private Sub writeValueButton_Click()\r\n   Dim timestamp As Variant\r\n   Dim quality As Integer\r\n   Dim value As Variant<\/span><\/span>\r\n   \r\n   value = CDbl(Range(\"D7\"))\r\n   quality = Range(\"E7\")\r\n   timestamp = DateTime.Now\r\n   E3.Server = \"E3Server_HostName\"\r\n\r\n   If E3.SetValue(\"Dados.TagInterno1.Value\", timestamp, quality, value) Then\r\n      Range(\"G7\") = \"Sucesso!\"\r\n   Else\r\n      Range(\"G7\") = \"Falha!\"\r\n   End If\r\nEnd Sub<\/pre>\n<p>De forma semelhante ao c\u00f3digo anterior, utilize as c\u00e9lulas D7, E7 e G7. A c\u00e9lula D7 ser\u00e1 utilizada para armazenar qual o valor a escrever no <b>TagInterno1<\/b>; este valor \u00e9 atribu\u00eddo \u00e0 vari\u00e1vel <i>Value <\/i>convertida para o tipo double, que \u00e9 o formato do dado. A c\u00e9lula E7 receber\u00e1 o valor da qualidade do <b>TagInterno1 <\/b>e ser\u00e1 atribu\u00eddo \u00e0 vari\u00e1vel <i>Quality<\/i>. A vari\u00e1vel <i>Timestamp<\/i> receber\u00e1 a data e tempo atual do sistema e a c\u00e9lula G7 ser\u00e1 utilizada para retornar o sucesso ou n\u00e3o da opera\u00e7\u00e3o de escrita.<\/p>\n<p>Ap\u00f3s feito todos os preparos, \u00e9 feita a conex\u00e3o no E3Server atrav\u00e9s da propriedade Server do objeto E3 e chamamos o m\u00e9todo para escrever o valor.<\/p>\n<p><b>M\u00e9todo <i>SetValue(Link, TimeStamp, Qualidade, Valor)<\/i><\/b><\/p>\n<p>Este m\u00e9todo \u00e9 sintaticamente id\u00eantico ao m\u00e9todo <i>GetValue<\/i>, e possui os seguintes par\u00e2metros de entrada:<\/p>\n<ul>\n<li><i>Link <\/i>&#8211; par\u00e2metro de entrada que fornece o caminho do objeto a ser escrito.<\/li>\n<li><i>Timestamp <\/i>&#8211; par\u00e2metro de entrada que fornece o timestamp do Link referenciado.<\/li>\n<li><i>Qualidade <\/i>&#8211; par\u00e2metro de entrada que fornece a qualidade do Link referenciado.<\/li>\n<li><i>Valor <\/i>&#8211; par\u00e2metro de entrada que fornece o valor do Link referenciado.<\/li>\n<\/ul>\n<p>Assim como o m\u00e9todo <i>GetValue<\/i>, ele retorna um valor booleano <b>TRUE <\/b>quando a escrita for realizada com sucesso, e <b>FALSE <\/b>caso o contr\u00e1rio. O evento acima escreve um valor obtido na c\u00e9lula D7 com uma qualidade obtida na c\u00e9lula E7 e um timestamp com a data e hora atual obtidas do sistema. Estes dados s\u00e3o utilizados para a escrita no Link <span style=\"font-family: Courier New;\">Dados.TagInterno1.Value<\/span>, endere\u00e7o onde est\u00e1 localizado o <b>TagInterno1 <\/b>dentro da aplica\u00e7\u00e3o E3.<\/p>\n<p>Ent\u00e3o, para realizar o teste de escrita, antes de clicarmos no bot\u00e3o <b>Escrever valor<\/b>, fornecemos o valor e qualidade dele nas respectivas c\u00e9lulas (D7 e E7) da planilha; isto resultar\u00e1 em uma sa\u00edda conforme abaixo.<\/p>\n<div align=\"center\"><img loading=\"lazy\" title=\"\" src=\"http:\/\/kb.elipse.com.br\/pt-br\/images\/ID59\/Figura10.PNG\" alt=\"\" width=\"550\" height=\"383\" align=\"bottom\" border=\"0\" \/><br \/>\n<span style=\"font-size: xx-small;\"><b>Figura 10<\/b>: Resposta do bot\u00e3o &#8220;Escrever valor&#8221;<\/span><\/div>\n<p>Para confirmarmos que o valor foi realmente escrito em <b>TagInterno1<\/b>, uma forma seria ver na ferramenta WatchWindow dispon\u00edvel no pr\u00f3prio Studio. Outra maneira \u00e9 criar um novo bot\u00e3o para ler o valor de <b>TagInterno1 <\/b>da mesma forma que fizemos com <b>TagDemo1<\/b>, apenas mudando o valor do par\u00e2metro <i>Link <\/i>na chamada do m\u00e9todo de leitura.<\/p>\n<p><span style=\"color: #ff0000;\"><em><strong>Obs: Nas vers\u00f5es 4.5 ou superiores, foram adicionados dois novos m\u00e9todos: ReadValue e WriteValue. Eles substituem GetValue e o SetValue, que consequentemente devem ser evitados.<\/strong><\/em><\/span><\/p>\n<p><u><b>6) Como receber eventos com o E3DataAccess<\/b><\/u><\/p>\n<p>Outra das possibilidades da biblioteca <b>E3DataAccess <\/b>\u00e9 a recep\u00e7\u00e3o de eventos provenientes da aplica\u00e7\u00e3o E3. Ela possui um evento chamado <i>OnValueChanged<\/i>, que pode ser capturado por qualquer aplica\u00e7\u00e3o que o instancie. Com isto \u00e9 poss\u00edvel a recep\u00e7\u00e3o dos valores em tempo real, ao contr\u00e1rio do m\u00e9todo <i>GetValue<\/i>, que retorna o valor apenas quando requisitado.<\/p>\n<p>O exemplo feito at\u00e9 este momento faz a leitura do valor de <b>TagDemo1 <\/b>sempre que clicamos no bot\u00e3o correspondente. Vamos criar agora outro bot\u00e3o que ativa o evento <i>OnValueChanged<\/i> para o <b>TagDemo1<\/b>, fazendo com que o valor do tag seja enviado a uma c\u00e9lula da planilha sempre que ocorrer alguma mudan\u00e7a nele.<\/p>\n<p>Crie um novo bot\u00e3o com a propriedade <i>Name <\/i>com o valor &#8220;onEventsButton&#8221; e <i>Caption <\/i>com o valor &#8220;Ativar evento&#8221;. Ap\u00f3s isto, acesse o VBA.<\/p>\n<p>Dentro do VBA, crie um novo m\u00f3dulo classe, clicando no menu <i>Insert <\/i>e escolhendo a op\u00e7\u00e3o <b>Class Module<\/b>.<\/p>\n<div align=\"center\"><img loading=\"lazy\" title=\"\" src=\"http:\/\/kb.elipse.com.br\/pt-br\/images\/ID59\/Figura11.PNG\" alt=\"\" width=\"550\" height=\"399\" align=\"bottom\" border=\"0\" \/><br \/>\n<span style=\"font-size: xx-small;\"><b>Figura 11<\/b>: Inserindo um novo M\u00f3dulo Classe pelo VBA<\/span><\/div>\n<p>Ser\u00e1 criado um novo m\u00f3dulo classe de nome <b>Class1 <\/b>dentro da pasta <b>Class Modules<\/b>; mude o nome da classe para <b>E3ServerEvents <\/b>pelas propriedades dela. Dentro do c\u00f3digo desta classe, inserimos a linha abaixo:<\/p>\n<pre><span style=\"font-family: Courier New;\">Public WithEvents E3EVT As E3DATAACCESSLib.E3DataAccessManager\r\n<\/span><\/pre>\n<p>Com isto, estamos instanciando um novo objeto E3DataAccess de nome <b>E3EVT<\/b>. O par\u00e2metro <i>WithEvents <\/i>indica que o objeto <b>E3EVT <\/b>est\u00e1 apto a receber eventos. Selecionamos o objeto criado pela lista de sele\u00e7\u00e3o dos objetos e o evento <i>OnValueChanged <\/i>na lista de declara\u00e7\u00f5es ao lado.<\/p>\n<div align=\"center\"><img loading=\"lazy\" title=\"\" src=\"http:\/\/kb.elipse.com.br\/pt-br\/images\/ID59\/Figura12.PNG\" alt=\"\" width=\"550\" height=\"130\" align=\"bottom\" border=\"0\" \/><br \/>\n<span style=\"font-size: xx-small;\"><b>Figura 12<\/b>: Lista de sele\u00e7\u00e3o de Objetos do VBA<\/span><\/div>\n<p>Ao selecionar o objeto, ser\u00e1 criado automaticamente a declara\u00e7\u00e3o do evento <i>OnValueChanged <\/i>no c\u00f3digo da classe. Ou seja, depois de realizado isto, ter\u00edamos o seguinte c\u00f3digo.<\/p>\n<div align=\"left\">\n<pre><span style=\"font-family: Courier New;\">Public WithEvents E3EVT As E3DATAACCESSLib.E3DataAccessManager<\/span>\r\n\r\n<span style=\"font-family: Courier New;\">'Linhas geradas automaticamente<\/span>\r\n<span style=\"font-family: Courier New;\">Private Sub E3EVT_OnValueChanged(ByVal Path As String, ByVal Timestamp As Variant, ByVal Quality As Integer, ByVal Value As Variant)<\/span>\r\n\r\n<span style=\"font-family: Courier New;\">End Sub <\/span><\/pre>\n<\/div>\n<p>Este evento ser\u00e1 gerado toda vez que ocorrer uma mudan\u00e7a nos valores dos dados da aplica\u00e7\u00e3o E3. Dentro dele, coloque o c\u00f3digo que ser\u00e1 executado quando ocorrer esta mudan\u00e7a. Neste caso, fa\u00e7a com que as c\u00e9lulas D10, E10 e F10 da planilha recebam os dados dos valores, qualidades e timestamps de <b>TagDemo1<\/b>, respectivamente. O c\u00f3digo abaixo trata de fazer isto:<\/p>\n<pre><span style=\"font-family: Courier New;\">Public WithEvents E3EVT As E3DATAACCESSLib.E3DataAccessManager<\/span>\r\n\r\n'Linhas geradas\r\nPrivate Sub E3EVT_OnValueChanged(ByVal Path As String, ByVal Timestamp As Variant, ByVal Quality As Integer, ByVal Value As Variant)\r\nRange(\"D10\") = Value\r\nRange(\"E10\") = Quality\r\nRange(\"F10\") = Timestamp\r\nEnd Sub<\/pre>\n<p>Os par\u00e2metros <i>Value<\/i>, <i>Quality <\/i>e <i>Timestamp <\/i>do evento recebem todos os dados atualizados quando gerado o evento do objeto monitorado. A vari\u00e1vel <i>Path <\/i>recebe qual o caminho do objeto que ativou o evento. No caso de estarmos monitorando mais de um objeto ao mesmo tempo, conhecer a vari\u00e1vel <i>Path <\/i>\u00e9 importante para descobrir a origem da chamada do evento. Como neste exemplo s\u00f3 estaremos monitorando TagDemo1, dispensaremos o uso desta vari\u00e1vel.<\/p>\n<p>Ap\u00f3s isto, voltamos ao c\u00f3digo do m\u00f3dulo E3ServerCOM e instanciamos um novo objeto da classe rec\u00e9m criada E3ServerEvents. O nome utilizado \u00e9 <b>E3Evt1<\/b>.<\/p>\n<pre><span style=\"font-family: Courier New;\">Public E3Evt1 As New E3ServerEvents 'Linha criada<\/span>\r\n<span style=\"font-family: Courier New;\">Public E3 As New E3DATAACCESSLib.E3DataAccessManager <\/span><\/pre>\n<p>O que resta a fazer agora \u00e9 adicionar o c\u00f3digo ao evento clique do bot\u00e3o <b>onEventsButton<\/b>. Acesse o c\u00f3digo dele e insira as seguintes linhas:<\/p>\n<pre><span style=\"font-family: Courier New;\">Private Sub onEventButton_Click()<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0Set E3Evt1.E3EVT = E3<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0E3.Server = \"E3Server_HostName\"<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0If Not (E3.RegisterCallback(\"Dados.TagDemo1.Value\")) Then<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0 MsgBox \"N\u00e3o foi poss\u00edvel registrar o Link passado!\"<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0End If\r\n<\/span><span style=\"font-family: Courier New;\">End Sub <\/span><\/pre>\n<p>Na primeira linha, estamos fazendo com que a propriedade <i>E3EVT <\/i>do objeto <b>E3Evt1 <\/b>aponte para o objeto j\u00e1 instanciado <b>E3<\/b>. Desta forma, \u00e9 poss\u00edvel trabalhar tanto com o objeto <b>E3EVT<\/b> ou <b>E3 <\/b>que o efeito ser\u00e1 o mesmo. Logo ap\u00f3s, conectamos ao E3Server desejado atrav\u00e9s da propriedade Server.<\/p>\n<p><b>M\u00e9todo <i>RegisterCallback(Link)<\/i><\/b><\/p>\n<p>Este m\u00e9todo \u00e9 chamado quando desejamos monitorar os eventos de um determinado objeto da aplica\u00e7\u00e3o E3. Neste caso, queremos monitorar o objeto <b>TagDemo1<\/b>. Ele possui apenas um par\u00e2metro de entrada:<\/p>\n<ul>\n<li><i>Link <\/i>&#8211; par\u00e2metro de entrada que fornece o caminho do objeto a ser monitorado.<\/li>\n<\/ul>\n<p>\u00c9 poss\u00edvel monitorar mais do que um objeto, chamando este m\u00e9todo para cada um deles. Todas as mudan\u00e7as de valores desses objetos ativariam o mesmo evento <i>OnValueChanged<\/i> presente no m\u00f3dulo classe <b>E3ServerEvents<\/b>. No caso da monitora\u00e7\u00e3o de mais de um objeto, talvez seja necess\u00e1rio o devido tratamento do par\u00e2metro <i>Path <\/i>do evento para realizarmos a\u00e7\u00f5es diferentes dependendo da origem da mudan\u00e7a.<\/p>\n<p>Terminado a implementa\u00e7\u00e3o, agora podemos receber eventos de <b>TagDemo1 <\/b>quando clicarmos no bot\u00e3o <b>Ativar evento<\/b>.<\/p>\n<div align=\"center\"><img loading=\"lazy\" title=\"\" src=\"http:\/\/kb.elipse.com.br\/pt-br\/images\/ID59\/Figura13.PNG\" alt=\"\" width=\"550\" height=\"382\" align=\"bottom\" border=\"0\" \/><br \/>\n<span style=\"font-size: xx-small;\"><b>Figura 13<\/b>: Resposta do bot\u00e3o &#8220;Ativar evento&#8221;<\/span><\/div>\n<p>Agora \u00e9 poss\u00edvel monitorar os eventos de <b>TagDemo1<\/b>, mas como fazer para encerrar sua monitora\u00e7\u00e3o? Esta \u00e9 a fun\u00e7\u00e3o do m\u00e9todo <i>UnregisterCallback<\/i>.<\/p>\n<p><b>M\u00e9todo <i>UnregisterCallback(Link)<\/i><\/b><\/p>\n<p>Assim como o m\u00e9todo <i>RegisterCallback<\/i>, este tamb\u00e9m possui apenas um par\u00e2metro:<\/p>\n<ul>\n<li><i>Link <\/i>&#8211; par\u00e2metro de entrada que fornece o caminho do objeto a deixar de ser monitorado.<\/li>\n<\/ul>\n<p>Quando o m\u00e9todo \u00e9 chamado, ele &#8220;desregistra&#8221; o objeto da aplica\u00e7\u00e3o E3 passado por par\u00e2metro. \u00c9 retornado o valor booleano TRUE no sucesso da opera\u00e7\u00e3o.<\/p>\n<p>Para deixarmos de monitorar o objeto <b>TagDemo1<\/b>, vamos criar um novo bot\u00e3o na planilha abaixo do <b>Ativar evento<\/b>. Pelas propriedades dele, atribu\u00edmos &#8220;offEventButton&#8221; para a propriedade <i>Name <\/i>e &#8220;Desativar evento&#8221; para <i>Caption<\/i>.<\/p>\n<p>No c\u00f3digo do evento de clique do novo bot\u00e3o &#8220;offEventButton&#8221;, insira o c\u00f3digo abaixo:<\/p>\n<pre><span style=\"font-family: Courier New;\">Private Sub offEventButton_Click()<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0Set E3Evt1.E3EVT = E3<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0E3.Server = \"E3Server_HostName\"<\/span><span style=\"font-family: Courier New;\">\u00a0If Not (E3.UnregisterCallback(\"Dados.TagDemo1.Value\")) Then<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0 MsgBox \"N\u00e3o foi poss\u00edvel desregistrar o Link passado!\"<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0End If<\/span>\r\n<span style=\"font-family: Courier New;\">End Sub <\/span><\/pre>\n<p>O c\u00f3digo \u00e9 id\u00eantico ao do bot\u00e3o anterior, com exce\u00e7\u00e3o da chamada do m\u00e9todo. Substitua o m\u00e9todo <i>RegisterCallback <\/i>por <i>UnregisterCallback <\/i>para &#8220;desregistrar&#8221; o objeto <b>TagDemo1 <\/b>e, desta forma, encerrarmos a monitora\u00e7\u00e3o do mesmo.<\/p>\n<p>Agora conseguimos ativar e desativar o recebimento de eventos provenientes de <b>TagDemo1 <\/b>atrav\u00e9s dos bot\u00f5es <b>Ativar evento<\/b> e <b>Desativar evento<\/b>.<\/p>\n<p><u><b><br \/>\n7) Como realizar consultas ao objeto Banco de Dados com o E3DataAccess<\/b><\/u><\/p>\n<p>A biblioteca E3DataAccess tamb\u00e9m nos permite realizar consultas ao objeto Banco de Dados do E3. Logo, torna-se necess\u00e1rio a exist\u00eancia de um objeto Banco de Dados devidamente configurado na aplica\u00e7\u00e3o E3 e um objeto Consulta conectado a este banco. O <b>E3DataAccess <\/b>trata de realizar a consulta atrav\u00e9s do objeto Consulta da aplica\u00e7\u00e3o E3.<\/p>\n<p>No mesmo exemplo, adicione um novo bot\u00e3o na planilha com <i>Name <\/i>&#8220;queryButton&#8221; e <i>Caption <\/i>&#8220;Consultar BD&#8221;. Acesse o c\u00f3digo do evento de clique deste bot\u00e3o e complemente-o com o c\u00f3digo abaixo:<\/p>\n<pre><span style=\"font-family: Courier New;\">Private Sub queryButton_Click()<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0Dim Resposta As Variant<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0Dim Names As Variant<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0Dim Values As Variant<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0Dim rnum As Integer<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0Resposta = Array()<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0E3.Server = \"E3Server_HostName\"<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0If E3.GetE3QueryRows(\"Dados.Consulta1\", Names, Values, Resposta) Then<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0 Range(\"G16\") = \"Sucesso!\"<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0 rnum = 16<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0 For i = 0 To 20<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0\u00a0 Range(\"F\" + CStr(rnum)) = Resposta(0, i)<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0\u00a0 Range(\"D\" + CStr(rnum)) = Resposta(1, i)<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0\u00a0 Range(\"E\" + CStr(rnum)) = Resposta(2, i)<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0\u00a0 rnum = rnum + 1<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0 Next<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0Else<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0 Range(\"G16\") = \"Falha!\"<\/span>\r\n<span style=\"font-family: Courier New;\">\u00a0End If<\/span>\r\n<span style=\"font-family: Courier New;\">End Sub <\/span><\/pre>\n<p>Este c\u00f3digo faz uma consulta ao Banco de Dados e preenche na planilha os vinte primeiros resultados dela a partir das c\u00e9lulas D16, E16 e F16 at\u00e9 as vinte c\u00e9lulas subsequentes. Como sempre, antes de chamar o m\u00e9todo da consulta, \u00e9 preciso obter a conex\u00e3o com o E3Server em quest\u00e3o.<\/p>\n<p><b>NOTA<\/b>: Na aplica\u00e7\u00e3o E3 utilizada, a execu\u00e7\u00e3o da consulta retorna mais do que vinte registros. Por\u00e9m, caso sua consulta retorne menos do que vinte registros, apenas ajuste a cl\u00e1usula <i>For<\/i> do c\u00f3digo para ficar de acordo e evitar erros na execu\u00e7\u00e3o do c\u00f3digo.<\/p>\n<p><b>M\u00e9todo <i>GetE3QueryRows(Link, Names, Values, Rows<\/i>)<\/b><\/p>\n<p>Atrav\u00e9s deste m\u00e9todo, realizamos consultas ao Banco de Dados da aplica\u00e7\u00e3o E3. Ele recebe quatro vari\u00e1veis como par\u00e2metros:<\/p>\n<ul>\n<li><i>Link <\/i>&#8211; par\u00e2metro de entrada que fornece o caminho do objeto Consulta a ser executado no servidor E3.<\/li>\n<li><i>Names <\/i>&#8211; par\u00e2metro de entrada que fornece uma lista (tipo array) dos nomes das vari\u00e1veis a serem utilizadas na execu\u00e7\u00e3o da consulta, caso sejam necess\u00e1rios.<\/li>\n<li><i>Values <\/i>&#8211; par\u00e2metro de entrada que fornece uma lista (tipo array) dos valores das vari\u00e1veis, passadas pelo par\u00e2metro Names, a serem utilizadas na execu\u00e7\u00e3o da consulta, caso sejam necess\u00e1rios.<\/li>\n<li><i>Rows <\/i>&#8211; par\u00e2metro de sa\u00edda que recebe uma matriz com o resultado da consulta executada, no caso da consulta devolver algum resultado.<\/li>\n<\/ul>\n<p>Na chamada do m\u00e9todo, estamos referenciando a consulta <b>Dados.Consulta1<\/b> pelo par\u00e2metro Link, ou seja, ser\u00e1 executada esta consulta de acordo com o conte\u00fado de sua propriedade SQL. Como em nossa consulta n\u00e3o existem vari\u00e1veis sendo utilizadas, apenas passamos duas listas sem conte\u00fado pelos par\u00e2metros <i>Names <\/i>e <i>Values<\/i>. Da mesma forma, a vari\u00e1vel <i>Resposta<\/i> s\u00f3 ser\u00e1 utilizada para receber o retorno dos registros da consulta pelo par\u00e2metro Rows.<\/p>\n<p>Os \u00edndices da matriz <i>Resposta <\/i>de retorno possuem a seguinte divis\u00e3o: [coluna][linha], onde a coluna corresponde ao campo e linha ao registro retornados de acordo com o que foi requisitado pela consulta. A tabela consultada no exemplo possui tr\u00eas campos: <i>E3TimeStamp<\/i>, <i>TagHist <\/i>e <i>TagHis_Quality<\/i>. Ent\u00e3o, o primeiro registro da matriz Resposta estaria dividido da seguinte forma:<\/p>\n<ul>\n<li><b>Resposta[0][0]<\/b> &#8211; onde est\u00e1 armazenado o valor do campo <i>E3TimeStamp <\/i>do primeiro registro resultante.<\/li>\n<li><b>Resposta[1][0]<\/b> &#8211; onde est\u00e1 armazenado o valor do campo <i>TagHist <\/i>do primeiro registro resultante.<\/li>\n<li><b>Resposta[2][0]<\/b> &#8211; onde est\u00e1 armazenado o valor do campo <i>TagHist_Quality<\/i> do primeiro registro resultante.<\/li>\n<\/ul>\n<p>Logo:<\/p>\n<ul>\n<li><b>Resposta[i][j]<\/b> &#8211; \u00e9 onde est\u00e1 armazenado o valor do campo i do registro j resultante.<\/li>\n<\/ul>\n<p>Dentro da cl\u00e1usula <i>For <\/i>do c\u00f3digo s\u00e3o preenchidas as c\u00e9lulas da planilha de acordo com os valores dos registros retornados pela consulta. Com o c\u00f3digo pronto, quando clicamos no bot\u00e3o <b>Consultar BD<\/b>, obtemos o resultado a seguir:<\/p>\n<div align=\"center\"><img loading=\"lazy\" title=\"\" src=\"http:\/\/kb.elipse.com.br\/pt-br\/images\/ID59\/Figura14.PNG\" alt=\"\" width=\"550\" height=\"385\" align=\"bottom\" border=\"0\" \/><br \/>\n<span style=\"font-size: xx-small;\"><b>Figura 14<\/b>: Resposta do bot\u00e3o &#8220;Consultar BD&#8221;<\/span><\/div>\n<p>Ap\u00f3s esta \u00faltima etapa, foram demonstrados todos os tipos de opera\u00e7\u00f5es poss\u00edveis de se realizar com a biblioteca <b>E3DataAccess<\/b>. Com a aplica\u00e7\u00e3o exemplo criada pelo VBA, conseguimos ler e escrever valores, receber eventos e realizar consultas com os objetos de uma aplica\u00e7\u00e3o E3.<\/p>\n<p><u><b><br \/>\n8) Considera\u00e7\u00f5es Finais<\/b><\/u><\/p>\n<p>Com este artigo foi poss\u00edvel entender melhor o funcionamento da biblioteca E3DataAccess. Suas fun\u00e7\u00f5es de intera\u00e7\u00e3o com o E3Server s\u00e3o de simples entendimento e nos permitem realizar opera\u00e7\u00f5es fundamentais em aplica\u00e7\u00f5es E3.<\/p>\n<p>Al\u00e9m disso, ela aumentou as op\u00e7\u00f5es de desenvolvimento de aplica\u00e7\u00f5es com o E3. A biblioteca oferece ao desenvolvedor a op\u00e7\u00e3o de desenvolver aplica\u00e7\u00f5es em ambientes com os quais esteja mais familiarizado.<\/p>\n<h3>Anexos:<\/h3>\n<p><a href=\"\/wp-content\/uploads\/2019\/03\/ExE3Project.zip\">ExE3Project.zip<\/a><\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>NOTAS GERAIS: Este artigo se aplica ao Elipse E3, vers\u00f5es 4.0 ou inferior. A biblioteca E3DataAccess apresenta um erro ao ser utilizada em linguagens sem tipos (typeless), como o VBScript&hellip;<\/p>\n","protected":false},"author":28,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0},"categories":[688],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Conectando uma aplica\u00e7\u00e3o VBA a um E3Server com a biblioteca de comunica\u00e7\u00e3o E3DataAccess. - Elipse Knowledgebase<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Conectando uma aplica\u00e7\u00e3o VBA a um E3Server com a biblioteca de comunica\u00e7\u00e3o E3DataAccess.\" \/>\n<meta property=\"og:description\" content=\"NOTAS GERAIS: Este artigo se aplica ao Elipse E3, vers\u00f5es 4.0 ou inferior. A biblioteca E3DataAccess apresenta um erro ao ser utilizada em linguagens sem tipos (typeless), como o VBScript&hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/\" \/>\n<meta property=\"og:site_name\" content=\"Elipse Knowledgebase\" \/>\n<meta property=\"article:publisher\" content=\"http:\/\/www.facebook.com\/elipsesoftware\" \/>\n<meta property=\"article:published_time\" content=\"2019-03-25T20:30:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-03-28T19:00:32+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/kb.elipse.com.br\/pt-br\/images\/ID59\/Figura1.PNG\" \/>\n<meta name=\"author\" content=\"Daniel Seibel Silva\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Seibel Silva\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/\"},\"author\":{\"name\":\"Daniel Seibel Silva\",\"@id\":\"https:\/\/kb.elipse.com.br\/#\/schema\/person\/c8f79a90ce0cbb19f4d1c1cdfacdbbc5\"},\"headline\":\"Conectando uma aplica\u00e7\u00e3o VBA a um E3Server com a biblioteca de comunica\u00e7\u00e3o E3DataAccess.\",\"datePublished\":\"2019-03-25T20:30:19+00:00\",\"dateModified\":\"2024-03-28T19:00:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/\"},\"wordCount\":3547,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kb.elipse.com.br\/#organization\"},\"articleSection\":[\"E3DataAccess\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/\",\"url\":\"https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/\",\"name\":\"[:pt]Conectando uma aplica\u00e7\u00e3o VBA a um E3Server com a biblioteca de comunica\u00e7\u00e3o E3DataAccess.[:] - Elipse Knowledgebase\",\"isPartOf\":{\"@id\":\"https:\/\/kb.elipse.com.br\/#website\"},\"datePublished\":\"2019-03-25T20:30:19+00:00\",\"dateModified\":\"2024-03-28T19:00:32+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\/\/kb.elipse.com.br\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Conectando uma aplica\u00e7\u00e3o VBA a um E3Server com a biblioteca de comunica\u00e7\u00e3o E3DataAccess.\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kb.elipse.com.br\/#website\",\"url\":\"https:\/\/kb.elipse.com.br\/\",\"name\":\"Elipse Knowledgebase\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/kb.elipse.com.br\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kb.elipse.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kb.elipse.com.br\/#organization\",\"name\":\"Elipse Software\",\"url\":\"https:\/\/kb.elipse.com.br\/\",\"sameAs\":[\"http:\/\/www.facebook.com\/elipsesoftware\"],\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/kb.elipse.com.br\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kb.elipse.com.br\/wp-content\/uploads\/2019\/05\/schererelipse-com-br\/logoElipse.png\",\"contentUrl\":\"https:\/\/kb.elipse.com.br\/wp-content\/uploads\/2019\/05\/schererelipse-com-br\/logoElipse.png\",\"width\":161,\"height\":58,\"caption\":\"Elipse Software\"},\"image\":{\"@id\":\"https:\/\/kb.elipse.com.br\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/kb.elipse.com.br\/#\/schema\/person\/c8f79a90ce0cbb19f4d1c1cdfacdbbc5\",\"name\":\"Daniel Seibel Silva\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/kb.elipse.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3f74c491a22a7f66a9ab79f1826a1939?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3f74c491a22a7f66a9ab79f1826a1939?s=96&d=mm&r=g\",\"caption\":\"Daniel Seibel Silva\"},\"url\":\"https:\/\/kb.elipse.com.br\/en\/author\/daniel\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Conectando uma aplica\u00e7\u00e3o VBA a um E3Server com a biblioteca de comunica\u00e7\u00e3o E3DataAccess. - Elipse Knowledgebase","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/","og_locale":"en_US","og_type":"article","og_title":"[:pt]Conectando uma aplica\u00e7\u00e3o VBA a um E3Server com a biblioteca de comunica\u00e7\u00e3o E3DataAccess.[:] - Elipse Knowledgebase","og_description":"NOTAS GERAIS: Este artigo se aplica ao Elipse E3, vers\u00f5es 4.0 ou inferior. A biblioteca E3DataAccess apresenta um erro ao ser utilizada em linguagens sem tipos (typeless), como o VBScript&hellip;","og_url":"https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/","og_site_name":"Elipse Knowledgebase","article_publisher":"http:\/\/www.facebook.com\/elipsesoftware","article_published_time":"2019-03-25T20:30:19+00:00","article_modified_time":"2024-03-28T19:00:32+00:00","og_image":[{"url":"http:\/\/kb.elipse.com.br\/pt-br\/images\/ID59\/Figura1.PNG"}],"author":"Daniel Seibel Silva","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Daniel Seibel Silva","Est. reading time":"22 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/#article","isPartOf":{"@id":"https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/"},"author":{"name":"Daniel Seibel Silva","@id":"https:\/\/kb.elipse.com.br\/#\/schema\/person\/c8f79a90ce0cbb19f4d1c1cdfacdbbc5"},"headline":"Conectando uma aplica\u00e7\u00e3o VBA a um E3Server com a biblioteca de comunica\u00e7\u00e3o E3DataAccess.","datePublished":"2019-03-25T20:30:19+00:00","dateModified":"2024-03-28T19:00:32+00:00","mainEntityOfPage":{"@id":"https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/"},"wordCount":3547,"commentCount":0,"publisher":{"@id":"https:\/\/kb.elipse.com.br\/#organization"},"articleSection":["E3DataAccess"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/","url":"https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/","name":"[:pt]Conectando uma aplica\u00e7\u00e3o VBA a um E3Server com a biblioteca de comunica\u00e7\u00e3o E3DataAccess.[:] - Elipse Knowledgebase","isPartOf":{"@id":"https:\/\/kb.elipse.com.br\/#website"},"datePublished":"2019-03-25T20:30:19+00:00","dateModified":"2024-03-28T19:00:32+00:00","breadcrumb":{"@id":"https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/kb.elipse.com.br\/conectando-uma-aplicacao-vba-a-um-e3server-com-a-biblioteca-de-comunicacao-e3dataaccess\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/kb.elipse.com.br\/en\/"},{"@type":"ListItem","position":2,"name":"Conectando uma aplica\u00e7\u00e3o VBA a um E3Server com a biblioteca de comunica\u00e7\u00e3o E3DataAccess."}]},{"@type":"WebSite","@id":"https:\/\/kb.elipse.com.br\/#website","url":"https:\/\/kb.elipse.com.br\/","name":"Elipse Knowledgebase","description":"","publisher":{"@id":"https:\/\/kb.elipse.com.br\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kb.elipse.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/kb.elipse.com.br\/#organization","name":"Elipse Software","url":"https:\/\/kb.elipse.com.br\/","sameAs":["http:\/\/www.facebook.com\/elipsesoftware"],"logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/kb.elipse.com.br\/#\/schema\/logo\/image\/","url":"https:\/\/kb.elipse.com.br\/wp-content\/uploads\/2019\/05\/schererelipse-com-br\/logoElipse.png","contentUrl":"https:\/\/kb.elipse.com.br\/wp-content\/uploads\/2019\/05\/schererelipse-com-br\/logoElipse.png","width":161,"height":58,"caption":"Elipse Software"},"image":{"@id":"https:\/\/kb.elipse.com.br\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/kb.elipse.com.br\/#\/schema\/person\/c8f79a90ce0cbb19f4d1c1cdfacdbbc5","name":"Daniel Seibel Silva","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/kb.elipse.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/3f74c491a22a7f66a9ab79f1826a1939?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3f74c491a22a7f66a9ab79f1826a1939?s=96&d=mm&r=g","caption":"Daniel Seibel Silva"},"url":"https:\/\/kb.elipse.com.br\/en\/author\/daniel\/"}]}},"_links":{"self":[{"href":"https:\/\/kb.elipse.com.br\/en\/wp-json\/wp\/v2\/posts\/326"}],"collection":[{"href":"https:\/\/kb.elipse.com.br\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kb.elipse.com.br\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kb.elipse.com.br\/en\/wp-json\/wp\/v2\/users\/28"}],"replies":[{"embeddable":true,"href":"https:\/\/kb.elipse.com.br\/en\/wp-json\/wp\/v2\/comments?post=326"}],"version-history":[{"count":16,"href":"https:\/\/kb.elipse.com.br\/en\/wp-json\/wp\/v2\/posts\/326\/revisions"}],"predecessor-version":[{"id":16195,"href":"https:\/\/kb.elipse.com.br\/en\/wp-json\/wp\/v2\/posts\/326\/revisions\/16195"}],"wp:attachment":[{"href":"https:\/\/kb.elipse.com.br\/en\/wp-json\/wp\/v2\/media?parent=326"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kb.elipse.com.br\/en\/wp-json\/wp\/v2\/categories?post=326"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kb.elipse.com.br\/en\/wp-json\/wp\/v2\/tags?post=326"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}