Ir para o conteúdo

 Voltar a PW3270 Suporte
Tela cheia

Desenvolvimento de Captura em VB.Net e/ou Java

14 de Março de 2012, 9:56 , por Desconhecido - | 1 Pessoa seguindo este artigo.
Visualizado 5071 vezes

Pessoal,

Sou funcionário do BB em Curitiba (CSO) e, como em todos os órgãos regionais do Banco, dependemos de robôs para a captura de dados para geração de informações necessárias para uso interno, bem como para agilizar os processos repetitivos. Sou totalmente contra este tipo de abordagem para obtenção de dados, embora não tenhamos muitas opções.

Talvez o mais adequado seria implementar soluções corporativos para estas demandas (o que talvez no momento não seja factível, considerando a complexidade das soluções) e, em não havendo esta possibilidade, permitir o acesso às informações através de um (ou mais) data wherehouse, que pudesse ser acessado remotamente - permitindo a extração dos dados atualizados das bases corporativas. Esta última, permitiria a aposentadoria da maioria dos robôs hoje em uso.

Convicções à parte, vamos ao que interessa: Preciso do "caminho das pedras" para desenvolver uma estrutura de captura em VB.Net e/ou Java. Atualmente possuo robôs em VBA (Access e afins), VB.Net e Java - usando o PComm.

Conto com sua preciosa ajuda.

Grato,

Geison. 

 

Autor: Geison Rodrigo dos Santos


5252 comentários

  • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
    16 de Março de 2012, 17:30

     

    Olá,

    VB.Net não está disponível, java está disponível com uma API bem simples (dê uma olhada nessa conversa para mais detalhes). Pessoalmente eu prefiro usar rexx para a montagem de robôs que acessem o SisBB.

     

    • 459c818f9448f15e7f0e58a42edadcaf?only path=false&size=50&d=404Geison Rodrigo dos Santos(usuário não autenticado)
      30 de Março de 2012, 10:52

       

      Caro Perry,

      Antes de mais nada, obrigado pela resposta. De fato, eu já havia visto o post sobre o assunto (java e rexx). Estava procurando algo que fosse menos traumático (que envolvesse menos tempo e esforços para migração), uma vez que não somos uma área de desenvolvimento (não é o nosso negócio), e o que fazemos é para atender a necessidades específicas, que no momento não podem ser atendidas pela Ditec. Nossos robôs (praticamente todos) são desenvolvidos em VBA (no Access ou Excel) e, apesar de desenvolver Java há algum tempo, não sou expert no assunto.

      De qualquer modo, obrigado pela dica. Vou ter que usar um pouco de tempo para conseguir fazer o trem funcionar em Java - uma vez que aprender uma nova linguagem (Rexx) talvez demande um que não tenho agora.

      Abraço e bom trabalho! 

      • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
        30 de Março de 2012, 11:23

         

        Olá,

        Bom, fica registrado mais um voto pelo futuro desenvolvimento de uma "typelib" VB para acesso à lib3270. (-:

        Você chegou a cogitar o uso de OpenOffice?  Pelo que sei a linguagem de script dele (starbasic) é similar a do excel; se for mesmo a curva de aprendizado seria menor e como já existe uma typelib openoffice do pw3270 pode ser que isso resolva o seu problema.

         

      • 47f08fafa545bf61c50fc0cd0dbf7244?only path=false&size=50&d=404Erlon Guimaraes(usuário não autenticado)
        11 de Setembro de 2012, 16:16

         

        Caro Geison,

        Meu caso assemelha-se ao seu, mas na via contrária, uma vez que trabalho na Caixa, usávamos o Attachment Extra e recentemente algums micros novos vieram com o PW3270. Também não sou da área de TI, e somos dependentes desses robôs para retirar algumas informações dos sistemas corporativos.

        Como usávamos o Extra, nossas macros em VBA estavam adaptadas àquele software, enquanto agora, temos que readaptá-las, gradativamente, uma vez que nem todos os micros possuem o PW3270.

        Exatamente por não ser da área de TI mas tentar usar ao máximo os recursos que estão disponíveis, estava procurando na net exemplos de códigos para captura de dados no PW3270 por meio do VBA, e por isso me interessei na sua colocação, de possuir os robôs em VBA.

        Assim, pergunto a você ou aos demais, se seria possível, por favor, postar ou enviar códigos VBA de captura de dados no PW3270? Não precisa ser código complexo, apenas que tivesse a conexão com o PW3270, a verificação da conexão e do status do host, uma forma de digitar dados em determinadas posições (parâmetros de consulta) para depois capturar os dados nas telas seguintes e colá-los num xls ou mdb.

        Grato pela atenção!

        Abraço a todos!

        • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
          11 de Setembro de 2012, 19:47

           

          Olá, Interessante esse tópico reativar justo hoje. Semana passada fui contactado via e-mail por um usuário com problema semelhante que me passou alguns fontes em VB que usavam o Pcomm para acesso via HLLAPI (não sei se é a mesma API que os seus scripts usam mas é possível que sim), baseado nos exemplos que ele passou pretendo implementar uma DLL que possua as mesmas chamadas interagindo com o pw3270; se correr tudo bem os scripts devem precisar de uma única alteração no nome da DLL. Todo o resto deve funcionar igual facilitando a migração de scripts já existentes.

           

           

          • 47f08fafa545bf61c50fc0cd0dbf7244?only path=false&size=50&d=404Erlon Guimaraes(usuário não autenticado)
            18 de Setembro de 2012, 17:11

             

            Perry,

            Para ser sincero eu não sei qual a DLL que utilizamos, pois, nas macros VBA que usamos no Excel chama-se um arquivo de extensão *.edp, que é o "ambiente" de emulação do Attachmate Extra, e aí os comandos de digitação no emulador e de captura do mesmo são colocados no resto do código.

            Para exemplificar como fazemos, colei abaixo um dos códigos VBA que utilizamos no Excel:

            'Reconhece o Extra e logado!
                Dim Sessions As Object
                Dim System As Object
                Set System = CreateObject("EXTRA.System")
                If (System Is Nothing) Then
                    MsgBox "NÃO FOI POSSÍVEL ACESSAR EXTRA. OPERAÇÃO CANCELADA."
                    Stop
                End If
                Set Sessions = System.Sessions

                If (Sessions Is Nothing) Then
                    MsgBox "NÃO FOI POSSÍVEL ACESSAR EXTRA. OPERAÇÃO CANCELADA."
                    Stop
                End If
                
            '________________________________
            'Estabelece Tempo de espera padrão
                g_HostSettleTime = 500

                OldSystemTimeout& = System.TimeoutValue
                If (g_HostSettleTime > OldSystemTimeout) Then
                    System.TimeoutValue = g_HostSettleTime
                End If

            '________________________________
            'Variáveis
                Dim Sess0 As Object
                Set Sess0 = System.ActiveSession
                If (Sess0 Is Nothing) Then
                    MsgBox "NÃO FOI POSSÍVEL ACESSAR EXTRA. OPERAÇÃO CANCELADA."
                    Stop
                End If
                If Not Sess0.Visible Then Sess0.Visible = True
                Sess0.Screen.WaitHostQuiet (g_HostSettleTime)
             (...)

            Aí, para capturar do Extra um texto de 22 caracteres de comprimento, que esteja na linha 20, coluna 1, usamos o seguinte comando no VBA:

            variavel = Sess0.Screen.Getstring(20, 1, 22)

             E para enviar comandos ou digitar algo no Extra, por exemplo, na linha 19, coluna 66, a letra A, e depois enviar o comando Enter, usamos:

            Sess0.Screen.Putstring "A", 19, 66
            Sess0.Screen.SendKeys ("<Enter>")
            Sess0.Screen.WaitHostQuiet (10)

            De qualquer maneira, se a sua DLL puder ser utilizada por nós, então ficaremos muito gratos a você!

            Grande abraço!

            • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
              18 de Setembro de 2012, 17:35

               

              Olá,

              Esse sample que você mandou está usando um objeto COM; a implementação que estou fazendo uma DLL mais simples que implementa as chamadas HLLAPI para interagir com o terminal. Por enquanto tivemos que dar uma parada por falta de ambiente de teste devido à greve.

               

              • 47f08fafa545bf61c50fc0cd0dbf7244?only path=false&size=50&d=404Erlon Guimaraes(usuário não autenticado)
                19 de Setembro de 2012, 10:52

                 

                Grande Perry,

                Tanto melhor será então, já que será possível interagir com o terminal pela DLL.

                Realmente a greve mudou alguns prazos. Mas quando vier, será muito bem-vinda!

                Abraços!

              • 60c31a628f193227fee802ef94843821?only path=false&size=50&d=404Edson Almeida(usuário não autenticado)
                16 de Outubro de 2012, 11:49

                 

                Olá Perry,

                Assim como o Geison e Erlon, tbem possuímos Bds que buscam informações nos emuladores 3270 em vba e estamos aguardando o desenvolvimento de sua DLL (São vários Bds e reconstruí-los demandaria um tempo que não temos no momento).

                Assim, seria possível nos informar sobre o desenvolvimento dessa DLL? Aproveito para agradecer sua cooperação nesse importante projeto.

                Abraços

                • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                  17 de Outubro de 2012, 7:48

                   

                  Olá,

                  Os últimos builds da versão 5 já incluem suporte parcial ao hllapi através do plugin

                   

                  Por enquanto somente algumas funções estão disponíveis:

                  1 Conecta à uma sessão ativa do emulador;

                  2 Desconecta do emulador;

                  3 Envia uma string;

                  40 Posiciona o cursor;

                  8 Obtém string na área desejada;

                  4 Espera por um tempo até que a sessão esteja disponível;

                  2000 Obtém a revisão atual do pw3270

                  Algumas diferenças:

                  A DLL a ser carregada se chama "libhllapi.dll" e é instalada no path do sistema; o nome da função exportada é "hllapi"; os parâmetros são os mesmos do pcom;
                  A função 8 (obtem string) parece ter algum problema na passagem de parâmetros o que exige que a string seja inicializada com espaços. O código que foi usado no teste foi:

                  HllFunctionNo = 8

                  HllLength = (linha * 80) - (linha * 80 - 80)

                  HllReturnCode = linha * 80 - 79

                  HllData = space(HllLength)

                  dummy& = hllapi&(HllFunctionNo, HllData, HllLength, HllReturnCode)

                  Form1.Text3.Text = Mid(HllData, col1, col2 + 1 - col1)

                   

                   

                   

                  • 60c31a628f193227fee802ef94843821?only path=false&size=50&d=404Edson Almeida(usuário não autenticado)
                    17 de Outubro de 2012, 9:03

                     

                    Valeu, Perry.

                    Abraços e bom trabalho

                  • 459c818f9448f15e7f0e58a42edadcaf?only path=false&size=50&d=404Geison Rodrigo dos Santos(usuário não autenticado)
                    17 de Outubro de 2012, 10:24

                     

                    Show de bola!

                    Obrigado pela ajuda. Ficamos te devendo por essa!

                    Abraço,
                    Geison. 

                  • F547fa86275f6e9c90eb390ca4a4662a?only path=false&size=50&d=404Hélio Pitozi de Mattos(usuário não autenticado)
                    10 de Abril de 2014, 20:25

                     

                    Perry, boa noite

                    Sou novo no forum e gostaria de algumas informações.

                    Baixei vários instaladores do pw3270 versão 5, porém em nenhuma a DLL libhllapi foi instalada.

                    O arquivo não faz parte do executável de instalação??? Tenho que baixar separadamente??

                    Desde já agradeço.

                    Meu objetivo e fazer interação entre OpenOffice e o emulador para busca de dados do mainframe.

                    Obrigado.

                    • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                      10 de Abril de 2014, 20:42

                       

                      Olá,

                      Você usou os últimos instaladores da versão 5 que mandei para a área de arquivos essa semana (09/04/2014)? Marcou a opção que instala o plugin HLLAPI (ele não é instalado por default)?

                      Só uma pergunta: OpenOffice para windows né? Se for para linux tem opção melhor que o hllapi.

                       

                      • F547fa86275f6e9c90eb390ca4a4662a?only path=false&size=50&d=404Hélio Pitozi de Mattos(usuário não autenticado)
                        11 de Abril de 2014, 8:37

                         

                        Olá e bom dia,

                        Usei as duas versões de 32 e 64 bits, porém não a opção de marcar instalação de plugins ou extras como mencionado em outros posts.

                        Opções PW3270 e GTK 3.8.1 Runtime são default

                        Opção para disponível para marcar Software Development Kit.

                        E quanto a pergunta. Sim OpenOfiice para windows.

                        Desde já agradeço.

                        • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                          11 de Abril de 2014, 8:40

                           

                          Olá,

                          Isso explica. As dlls de hllapi só são instaladas se a opção do plugin correspondente estiver marcada.

                           

                          • 4e8bceb100429e7594a9c6490e6cd649?only path=false&size=50&d=404Bruno Silva Baena de Souza(usuário não autenticado)
                            11 de Abril de 2014, 13:00

                             

                            Olá Perry,

                            acabei de baixar a última rev 2931 da versão 5 e ao tentar instalar o arquivo de 32 bits, o log informa que foi extraído o arquivo libhllapi.ddl para a pasta c:\windows\system32, porém o arquivo não está lá.

                            Então eu descompactei o arquivo do instalador e coloquei ele manualmente na pasta, porém o vba ainda acusa que não foi possível encontrar o arquivo ao tentar carregar a dll (Erro em tempo de execução 53).

                             Também  tentei instalar o arquivo de 64 bits, desta vez o log informa que o arquivo foi colocado na pasta system32, porém ele se encontra na pasta C:\Windows\SysWOW64\

                            O vba agora informa "Erro ao carregar a DLL" (Erro em tempo de execução 48).

                            A variável PATH está setada corretamente para estas pastas.

                             Alguma  sugestão do que pode estar ocorrendo?

                            Obrigado. 

                            Bruno

                            • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                              11 de Abril de 2014, 13:36

                               

                              Olá,

                              Tudo em windows é mais difícil: Segundo a documentação da Microsoft ( msdn​.mic​roso​ft.c​om/e​n-us​/lib​rary​/win​dows​/des​ktop​/ms6​8138​2(v=​vs.8​5).a​spx&​nbsp​; ) não existe erro 48, daí, fica difícil saber o que está acontecendo.

                               

                              Tente copiar a DLL para o diretório atual para ver se ele consegue carregar.

                               

                              • 4e8bceb100429e7594a9c6490e6cd649?only path=false&size=50&d=404Bruno Silva Baena de Souza(usuário não autenticado)
                                11 de Abril de 2014, 15:37

                                 

                                Segue transcrição do erro 48, segundo a documentação do VBA:

                                Uma biblioteca de vínculo
                                dinâmico (DLL) é uma biblioteca especificada na cláusula Lib de uma
                                instrução Declare. As causas e soluções desse erro são as seguintes:O arquivo não é um DLL executável.

                                Se o arquivo for um arquivo de texto de origem, deverá ser

                                compilado e vinculado ao formulário de DLL executável.

                                O arquivo não é um DLL do Microsoft Windows.

                                Obtenha o DLL do Microsoft Windows equivalente do arquivo.

                                O arquivo está em um DLL anterior do Microsoft Windows que é
                                incompatível com o modo de proteção do Microsoft Windows.

                                Obtenha uma versão atualizada do DLL.

                                O DLL faz referência a outro DLL que não está presente.

                                Obtenha o DLL referido e torne-o disponível para o outro DLL.

                                O DLL ou um dos DLLs referidos não está em um diretório
                                especificado por seu caminho.

                                Mova o DLL para um diretório referido ou coloque seu diretório

                                atual no caminho. 

                                Acho que o problema pode ser o item 4, pois quando utilizo um programa de verificar a ddl (chamado Dependency Walker) me informa que os módulos "LIBGCC_S_SEH-1.DLL", "LIBSTDC++-6.DLL", "IESHIMS.DLL" e "SYSNTFY.DLL" não foram localizados.

                                Mas é só um palpite, outros usuários estão conseguindo acessar a ddl sem problemas?

                                 Obrigado. 

                                • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                                  12 de Abril de 2014, 7:12

                                   

                                  Olá,

                                  As duas primeiras são do MinGW e devem existir no diretório do pw3270; as duas últimas eu não reconheci mas é bem provável que o empacotador também tenha colocado lá. Usuários (como eu) que tem algumas aplicações baseadas no MinGW instaladas não devem sentir o problema pelo fato delas existirem no path.

                                  Vou dar uma pesquisada para ver se tem como inibir a necessidade desses módulos.

                                   

                                • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                                  14 de Abril de 2014, 8:37

                                   

                                  Olá,

                                  Gerei dois novos pacotes seguindo as instruções do forum para não gerar dependências externas do MinGW; você poderia testar se o problema desapareceu?

                                  Outra pergunta: Você usa libreoffice né? Qual versão? Teria como testar uma oxt específica para o libreoffice?

                                   

                                  • 9ec7fff18064aedad16edaf7aea3e395?only path=false&size=50&d=404luiz e ferreira(usuário não autenticado)
                                    16 de Abril de 2014, 0:30

                                     

                                    Grande Perry,

                                    Com certeza a mensagem acima não me foi direcionada, mas como solicitou feedback sobre a instalação (ou quase), ao tentar instalar como o Plugin para Rexx, retorna a seguinte mensagem de erro: "Error openingo file for writing: C:\Program Files\ooRexx\rx3270.cls" , se opto por ignorar, outro erro se sucede, com rx3270.dll.

                                    Luiz Eduardo

                                    • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                                      16 de Abril de 2014, 9:04

                                       

                                      Olá,

                                      Estranho, o diretório do ooRexx deveria existir e ser gravável! O interpretador rexx foi instalado na pasta default ("C:\Program Files\ooRexx") ou em outro lugar? 

                                       

                                       

                                      • 9ec7fff18064aedad16edaf7aea3e395?only path=false&size=50&d=404luiz e ferreira(usuário não autenticado)
                                        17 de Abril de 2014, 8:20

                                         

                                        Na sua pergunta está minha resposta: não instalei o interpretador Rexx no referido computador... (SUCKS) ;(

                                      • 9ec7fff18064aedad16edaf7aea3e395?only path=false&size=50&d=404luiz e ferreira(usuário não autenticado)
                                        17 de Abril de 2014, 8:50

                                         

                                        Perry,

                                        Mudando um pouco de assunto, é complicado montar uma versão "Portable" do PW3270? Eu e outros colegas da Caixa temos dificuldades de instalar versões sobre versões. (Quando conseguirmos uma que atenda, ai a submeteremos à área de TI).

                                        Grato,

                                         

                                        Luiz Eduardo

                                         

                                        PS: Agora, com o ooREXX instalado, nenhuma mensagem de erro, como era de se esperar. Obrigado.

                                        • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                                          17 de Abril de 2014, 13:55

                                           

                                          Olá,

                                          Na versão windows é bem provável que funcione se você copiar todo o diretório do aplicativo para um pendrive. Só a parte de HLLAPI é que fica um pouco complicada porque a DLL tem que estar no path.

                                           

                                          • 9ec7fff18064aedad16edaf7aea3e395?only path=false&size=50&d=404luiz e ferreira(usuário não autenticado)
                                            12 de Junho de 2014, 22:29

                                             

                                            Olá,

                                            Inicialmente, Perry, grato pela atenção.

                                             

                                            Agora, envio esta mensagem mais para reativar este forum...

                                            Alguém conseguiu algo efetivo? Poderia compartilhar?

                                             

                                            Grato a todos!

                          • 4e8bceb100429e7594a9c6490e6cd649?only path=false&size=50&d=404Bruno Silva Baena de Souza(usuário não autenticado)
                            11 de Abril de 2014, 14:18

                             

                            Algumas informações adicionais, fiz a instalação do tipo full, com todas as opções marcadas.

                            Meu SO é Windows 7 64bits e o Office 2010 32 bits.

                            Obrigado 

            • F67d3f0200b42e6d005d0baeb59eee75?only path=false&size=50&d=404cristina martos(usuário não autenticado)
              14 de Novembro de 2013, 9:27

               

              tbm uso o excel e estao trocando o extra pelo pw3270 tem alguem rodando macro do excel por ele ja?

          • 459c818f9448f15e7f0e58a42edadcaf?only path=false&size=50&d=404Geison Rodrigo dos Santos(usuário não autenticado)
            14 de Setembro de 2012, 9:34

             

            Perry,

            Você não faz ideia do quanto estou ansioso por esta DLL!!!

            É bem provável que você tenha uma série de outras demandas, e possivelmente esta necessidade não esteja dentro do seu escopo de trabalho. Contudo, sua ajuda será muito importante, não só para mim, mas para todos aqueles que hoje têm a mesma necessidade.

            Att.,
            Geison.

            • 47f08fafa545bf61c50fc0cd0dbf7244?only path=false&size=50&d=404Erlon Guimaraes(usuário não autenticado)
              18 de Setembro de 2012, 17:17

               

              Geison,

              Você havia dito que utilizava o VBA (Access e afins) para capturar dados no PW3270. Você ainda os faz? No post acima, em resposta ao do Perry, coloquei qual o código usamos no Excel/Access para capturar dados do Attachmate Extra, mas este está sendo gradativamente substituído pelo PW3270 aqui, e não sei como fazer a captura/digitação de dados...

              Você tem algum código parecido no VBA para captura e digitação de dados no PW3270?

              Isso também nos seria de grande valia! Obrigado!

               Abraços!

        • 47f08fafa545bf61c50fc0cd0dbf7244?only path=false&size=50&d=404Erlon Guimaraes(usuário não autenticado)
          11 de Setembro de 2012, 19:02

           

          Aliás, escrevi errado, era Attachmate :-)

          E queria ainda parabenizar o trabalho dos desenvolvedores, como o Perry Werneck pelo trabalho desempenhado com essa ótima ferramenta!

          Abraços!

  • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
    7 de Outubro de 2012, 13:52

     

    Olá,

    Pelo que eu me lembro o x3270 usa um set próprio de fontes em formato "X" então não sei o quão complicado seria convertê-las para TTF e instalar no windows. Porém, um detalhe me chamou a atenção no screenshot que você mandou: Ele mostra o wc3270 rodando numa tela texto do windows, ou seja, é bem provável que esteja usando a fonte default do tema atual do windows; você consegue ver qual a fonte que está sendo usada abrindo o menu propriedades->fonte (no meu windows 7 64 bits com tema personalizado a fonte é "Lucida Console") e setar a mesma fonte no menu de fontes do pw3270.

    Fiz uns testes aqui e o processo funcionou com algumas excessões: As fontes "Monospaced" e "Consolas" que, provavelmente, são do tipo "bitmap" não aceitaram muito bem a variação automática de tamanho.

     

    • 05a2c621b49f83ae9ea191a9b63a441d?only path=false&size=50&d=404Manuel Calado(usuário não autenticado)
      8 de Outubro de 2012, 4:01

       

      Ok, obrigado.

       

      Assim já fica melhor.

      • 2ad05cdbbd824e18bace8af6a20f78df?only path=false&size=50&d=404Renier Cardoso Pestana(usuário não autenticado)
        29 de Novembro de 2012, 10:52

         

        Pessoal, bom dia! Estou usando um código VB.net pra enviar strings diretamente para a tela do simulador pw3270, a idéia é evitar o retrabalho dos usuários, ou seja, um robô. Utilizo a seguinte instrução VB para fazer isso: System.Windows.Forms.SendKeys.Send(comando), onde o parâmetro 'comando' é a string com os caracteres a serem enviados à tela do emulador. Funciona para maioria dos caracteres, porém caracteres como '/' e outros são simplesmente ignorados, sei que isso é um problema de codificação, pois o emulador deve usar EBCDIC e a função deve tá enviando em ASCII. Vocês tem alguma idéia de como resolver esse problema? Meu e-mail é reniermcpestana@gmail.com, qualquer coisa podem entrar em contato.

        Desde já agradeço. 

        Atenciosamente,

         Renier Cardoso 

        • 60c31a628f193227fee802ef94843821?only path=false&size=50&d=404Edson Almeida(usuário não autenticado)
          29 de Novembro de 2012, 13:17

           

          Boa tarde Renier,

           Teria como "colar" o código vb completo na tela?

           abraços

          Edson

          • 2ad05cdbbd824e18bace8af6a20f78df?only path=false&size=50&d=404Renier Cardoso Pestana(usuário não autenticado)
            29 de Novembro de 2012, 18:21

             

            Boa tarde, Edson. Nao precisa. Meu código se resume a formar uma string com o que eu quero colocar na tela do emulador e passar pra função e esta se encarrega de colocar na tela.. Assim:

            NativeWin32.SetForegroundWindow(iHandle) 'Chama a tela do emulador para frente.

             Delay()

             System.Windows.Forms.SendKeys.Send(comando) 'Envia o comando à tela ativa (emulador)

        • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
          29 de Novembro de 2012, 13:19

           

          Olá,

          Não conheço essa função SendKeys.Send, porém, *acho* que ela serve para enviar uma tecla direto para a janela do emulador. Se for isso o charset correto seria o do sistema mesmo já que a janela está no charset do windows; a conversão para EBCDIC é feita internamente pelo próprio emulador.

          Só fiquei na dúvida numa coisa: Se o que você quer é controlar o aplicativo porque não usar a API HLLAPI da versão 5 ou o plugin de comunicação via PIPE da versão 4? Isso permitiria que você controlasse o emulador direto sem precisar mandar teclas para a janela.

          • 60c31a628f193227fee802ef94843821?only path=false&size=50&d=404Edson Almeida(usuário não autenticado)
            29 de Novembro de 2012, 15:27

             

            Boa tarde Perry,

            No antigo emulador 3270 o modulo abaixo funcionava perfeitamente, agora com o novo (v5), apesar da conexão funcionar, ainda não conseguimos encontrar a Tela...

            Conforme dicas suas verificamos que algumas funções permanecem, porém a função  8 não está disponível no módulo antigo.

            Seria possível vc apontar as correções no módulo abaixo visando o funcionamento na v5 ou colar a função 8?

            Obrigado e bom trabalho.

             

             ------------- DICAS -----------------------------------------------------------------------------

            Por enquanto somente algumas funções estão disponíveis:

            1 Conecta à uma sessão ativa do emulador;

            2 Desconecta do emulador;

            3 Envia uma string;

            40 Posiciona o cursor;

            8 Obtém string na área desejada;

            4 Espera por um tempo até que a sessão esteja disponível;

            2000 Obtém a revisão atual do pw3270

            Algumas diferenças:

            A DLL a ser carregada se chama "libhllapi.dll" e é instalada no path do sistema; o nome da função exportada é "hllapi"; os parâmetros são os mesmos do pcom;
            A função 8 (obtem string) parece ter algum problema na passagem de parâmetros o que exige que a string seja inicializada com espaços. O código que foi usado no teste foi:

            HllFunctionNo = 8

            HllLength = (linha * 80) - (linha * 80 - 80)

            HllReturnCode = linha * 80 - 79

            HllData = space(HllLength)

            dummy& = hllapi&(HllFunctionNo, HllData, HllLength, HllReturnCode)

            Form1.Text3.Text = Mid(HllData, col1, col2 + 1 - col1)

             

            ---------MÓDULO ANTERIOR ------------------------------------------------------------------
            Option Compare Database

            Option Explicit

            Private HllFunctionNo As Long
            Private HllData       As String * 8000
            Private HllLength     As Long
            Private HllReturnCode As Long

            ' trocar a linha abaixo pela linha seguinte:
            'Private Declare Function hllapi& Lib "PCSHLL32.DLL" (Func&, ByVal DataString$, Length&, RetC&)

            Private Declare Function hllapi& Lib "libhllapi.dll" (Func&, ByVal DataString$, Length&, RetC&)

            Global Sessão         As String
            Global Tela           As String
            --------------------------------------------------------
            Public Function Aguardar(ByVal linha As Integer, Coluna As Integer, TEXTO As String) As Boolean
               If Copiar(linha, Coluna, Len(TEXTO)) = TEXTO Then
                  Aguardar = True
               Else
                  Aguardar = False
               End If
            End Function
            --------------------------------------------------------
            Public Sub Atualizar()
              Dim i As Integer
              i = 0
              Do While i < 20
              HllFunctionNo = 4
              HllData = ""
              HllLength = 0
              HllReturnCode = 0
              hllapi& HllFunctionNo, HllData, HllLength, HllReturnCode
             
              HllFunctionNo = 5
              HllData = ""
              HllLength = 0
              HllReturnCode = 0
              hllapi& HllFunctionNo, HllData, HllLength, HllReturnCode
              Tela = Left(HllData & Space(1920), 1920)
             i = i + 1
            Loop
            End Sub
            --------------------------------------------------------
            Public Function Colar(ByVal linha As Integer, Coluna As Integer, ByVal TEXTO As String) As Integer
              HllFunctionNo = 15
              HllData = TEXTO
              HllLength = Len(TEXTO)
              HllReturnCode = ((linha - 1) * 80) + Coluna
              hllapi& HllFunctionNo, HllData, HllLength, HllReturnCode
              Colar = CInt(HllReturnCode)
            End Function
            --------------------------------------------------------
            Public Function Conectar() As Integer
              HllFunctionNo = 1
              HllData = Sessão
              HllLength = 4
              HllReturnCode = 0
              hllapi& HllFunctionNo, HllData, HllLength, HllReturnCode
              Conectar = CInt(HllReturnCode)
              HllFunctionNo = 9
              HllData = "NORESET "
              HllLength = 8
              HllReturnCode = 0
              hllapi& HllFunctionNo, HllData, HllLength, HllReturnCode
            End Function
            --------------------------------------------------------
            Public Function Copiar(ByVal linha As Integer, Coluna As Integer, Tamanho As Integer) As String
            Dim v As Variant
            Dim t As Boolean
            Copiar = Mid(Tela, ((linha - 1) * 80) + Coluna, Tamanho)
            Atualizar
            v = CopiarEspecial(2, 2, 3)
            If v = "Ter" Then
            v = ""
            Exit Function
            End If
            t = IsNumeric(Copiar = Mid(Tela, ((linha - 1) * 80) + Coluna, Tamanho))
            If t = False Then
             Copiar = 0
            Else
            Copiar = Mid(Tela, ((linha - 1) * 80) + Coluna, Tamanho)
            End If
            End Function

            --------------------------------------------------------
            Public Function CopiarEspecial(ByVal linha As Integer, Coluna As Integer, Tamanho As Integer) As String
              CopiarEspecial = Mid(Tela, ((linha - 1) * 80) + Coluna, Tamanho)
             
            End Function

            --------------------------------------------------------
            Public Function Cursor() As Integer
              HllFunctionNo = 7
              HllData = ""
              HllLength = 0
              HllReturnCode = 0
              hllapi& HllFunctionNo, HllData, HllLength, HllReturnCode
              Cursor = HllLength
            End Function
            --------------------------------------------------------
            Public Function CursorC() As Integer
               Dim VAR As Integer
               VAR = Cursor()
               CursorC = IIf(VAR Mod 80 = 0, 80, VAR Mod 80)
            End Function
            --------------------------------------------------------
            Public Function CursorL() As Integer
               Dim VAR As Integer
               VAR = Cursor()
               CursorL = IIf(VAR Mod 80 = 0, VAR / 80, Int(VAR / 80) + 1)
            End Function
            --------------------------------------------------------
            Public Function Desconectar() As Integer
              HllFunctionNo = 2
              HllData = ""
              HllLength = 0
              HllReturnCode = 0
              hllapi& HllFunctionNo, HllData, HllLength, HllReturnCode
              Desconectar = CInt(HllReturnCode)
            End Function
            --------------------------------------------------------
            Public Function Enviar(ByVal origem As String, Destino As String, ByVal Opção As Integer) As Integer
              Dim tipo As String
              Select Case Opção
                     Case 1
                          tipo = "ASCII CRLF"
                     Case 2
                          tipo = ""
              End Select
              HllFunctionNo = 90
              HllData = Trim(origem & " " & Destino & " " & tipo)
              HllLength = Len(Trim(origem & " " & Destino & " " & tipo))
              HllReturnCode = 0
              hllapi& HllFunctionNo, HllData, HllLength, HllReturnCode
              Enviar = HllReturnCode
            End Function
            --------------------------------------------------------
            Public Function Localizar(ByVal TEXTO As String) As Integer
              HllFunctionNo = 6
              HllData = TEXTO
              HllLength = Len(TEXTO)
              HllReturnCode = 0
              hllapi& HllFunctionNo, HllData, HllLength, HllReturnCode
              Localizar = CInt(HllReturnCode)
            End Function
            --------------------------------------------------------
            Public Function Posicionar(ByVal linha As Integer, Coluna As Integer) As Integer
              HllFunctionNo = 40
              HllData = ""
              HllLength = 0
              HllReturnCode = (80 * (linha - 1)) + Coluna
              hllapi& HllFunctionNo, HllData, HllLength, HllReturnCode
              Posicionar = CInt(HllReturnCode)
            End Function
            --------------------------------------------------------
            Public Function Receber(ByVal origem As String, Destino As String, ByVal Opção As Integer) As Integer
              Dim tipo As String
              Select Case Opção
                     Case 1
                          tipo = "ASCII CRLF"
                     Case 2
                          tipo = ""
              End Select
              HllFunctionNo = 91
              HllData = Trim(origem & " " & Destino & " " & tipo)
              HllLength = Len(Trim(origem & " " & Destino & " " & tipo))
              HllReturnCode = 0
              hllapi& HllFunctionNo, HllData, HllLength, HllReturnCode
              Receber = HllReturnCode
            End Function
            --------------------------------------------------------
            Public Function Teclar(TEXTO As String) As Integer
              Dim TelaAnterior As String
              Atualizar
              TelaAnterior = Tela
              HllFunctionNo = 3
              HllData = TEXTO
              HllLength = Len(TEXTO)
             
              HllReturnCode = 0
              hllapi& HllFunctionNo, HllData, HllLength, HllReturnCode
              Teclar = CInt(HllReturnCode)
              Do While TelaAnterior = Tela
                 Atualizar
              Loop
              Atualizar
            '  Atualizar
            '  Atualizar
            End Function

            --------------------------------------------------------
            Public Function Teclar2(TEXTO As String) As Integer
              Dim TelaAnterior As String
              Atualizar
              TelaAnterior = Tela
              HllFunctionNo = 3
              HllData = TEXTO
              HllLength = Len(TEXTO)
             
              HllReturnCode = 0
              hllapi& HllFunctionNo, HllData, HllLength, HllReturnCode
              Teclar2 = CInt(HllReturnCode)
             ' Do While TelaAnterior = Tela
             '    Atualizar
             ' Loop
              Atualizar
            '  Atualizar
            '  Atualizar
            End Function
            --------------------------------------------------------
            Public Function Teclar1(TEXTO As String) As Integer
              Dim TelaAnterior As String
              Atualizar
              TelaAnterior = Tela
              HllFunctionNo = 3
              HllData = TEXTO
              HllLength = Len(TEXTO)
             
              HllReturnCode = 0
              hllapi& HllFunctionNo, HllData, HllLength, HllReturnCode
              Teclar1 = CInt(HllReturnCode)
            '  Do While TelaAnterior = Tela
                 Atualizar
            '  Loop
              Atualizar
            '  Atualizar
            '  Atualizar
            End Function

            --------------------------------------------------------
            Public Sub Atualiza(n As Integer)
            Dim cont As Integer

            For cont = 1 To n
                Atualizar
            Next cont

            End Sub

            -------------------------------------------------------- 

            • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
              14 de Dezembro de 2012, 8:49

               

              Olá,

              Desculpe a demora mas o meu tempo disponível deu  uma encurtada esses dias. Meu conhecimento de VB não é grande o bastante para analisar todo esse código, porém, pelo que deu para ver...

              Ele usa as funções 5,6,7,15,90 e 91 que ainda não foram implementadas na API do pw;

              Para ler a tela ele usa a função 5 ao invés da 8; como são bem semelhantes posso implementar a 5 mas acho que o mais rápido e fácil é mudar a função "atualizar" para usar a chamada 8 da forma abaixo:

              Public Sub Atualizar()
              Dim i As Integer
              i = 0
              Do While i < 20
              HllFunctionNo = 4
              HllData = ""
              HllLength = 0
              HllReturnCode = 0
              hllapi& HllFunctionNo, HllData, HllLength, HllReturnCode

              HllFunctionNo = 8
              HllLength = 1920
              HllData = space(HllLength)
              HllReturnCode = 0
              hllapi& HllFunctionNo, HllData, HllLength, HllReturnCode
              Tela = Left(HllData & Space(1920), 1920)
              i = i + 1
              Loop
              End Sub

               

          • 2ad05cdbbd824e18bace8af6a20f78df?only path=false&size=50&d=404Renier Cardoso Pestana(usuário não autenticado)
            29 de Novembro de 2012, 18:27

             

            Perry, obrigado pela resposta. Então, pra ser sincero não tinha conhecimento da existência dessa API e também que o emulador usado no cliente era daqui do softwarepublico.com. 

            Você pode me dizer onde encontro material para aprender a utilizar essa API?

             Obrigado. 

              

  • 60c31a628f193227fee802ef94843821?only path=false&size=50&d=404Edson Almeida(usuário não autenticado)
    17 de Outubro de 2012, 11:22

     

    Agora só falta o setor de TI atualizar os sistemas para a versão 5

    • D46ccf69150cbb88fb3cc7184f3c24da?only path=false&size=50&d=404Pedro Alves(usuário não autenticado)
      31 de Outubro de 2012, 12:23

       

      Por acaso já conseguiram a versão 5 da pw3270 ?

      • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
        31 de Outubro de 2012, 16:54

         

        Olá,

        Para qual ambiente? A versão windows está na área de arquivos do forum; as versões linux estão no Suse Build Service em https://build.opensuse.org/project/repositories?project=home%3APerryWerneck

         

  • 60c31a628f193227fee802ef94843821?only path=false&size=50&d=404Edson Almeida(usuário não autenticado)
    1 de Novembro de 2012, 13:27

     

    Porém os setores de TI das unidades públicas terão que atualizar seus aplicativos para a versão 5. Não adianta tu baixar a versão e inserir o host, vai abrir com restrições em algumas funções (ex: Receber e exportar arquivo, entre outros). 

    • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
      1 de Novembro de 2012, 14:08

       

      Olá,

      Você chegou a testar a transferência de arquivos da versão 5? Deu algum problema? Qual? Estranho que o código dessa parte é o mesmo das outras versões; só a parte gŕafica que foi atualizada.

       

      • 60c31a628f193227fee802ef94843821?only path=false&size=50&d=404Edson Almeida(usuário não autenticado)
        5 de Novembro de 2012, 10:25

         

        Perry, a única que fiz foi baixar a versão 5 e conectar com o host do app utilizado na empresa. Daí surgiu a msg de erro descrita abaixo:
        Primeira msg box:
         Receber arquivo

        (pw3270.exe:3064):GLib-GIO-ERROR**:No GSettings schemas are installed on the system

         Enviar arquivo

        (pw3270.exe:4064):GLib-GIO-ERROR**:No GSettings schemas are installed on the system 

        Segunda msg box:

         this application has requested the Runtime to terminate it in an unusual way.

        Please contact the application's support team for more information.

        Trava do sistema:

        Detalhes:

        Assinatura do problema:
          Nome do Evento de Problema:    APPCRASH
          Nome do Aplicativo:    pw3270.exe
          Versão do Aplicativo:    0.0.0.0
          Carimbo de Data/Hora do Aplicativo:    5091a6a9
          Nome do Módulo de Falhas:    libglib-2.0-0.dll
          Versão do Módulo de Falhas:    2.32.4.0
          Carimbo de Data/Hora do Módulo de Falhas:    50450cf1
          Código de Exceção:    40000015
          Deslocamento de Exceção:    00038667
          Versão do sistema operacional:    6.1.7601.2.1.0.256.48
          Identificação da Localidade:    1046
          Informações Adicionais 1:    14b4
          Informações Adicionais 2:    14b40b94241087619e797edae7a1cc70
          Informações Adicionais 3:    0b83
          Informações Adicionais 4:    0b832cc1a5ba4ba10901871c54c66ff9

        Leia nossa declaração de privacidade online:
          go.m​icro​soft​.com​/fwl​ink/​?lin​kid=​1042​88&a​mp;c​lcid​=0x0​416

        Se a declaração de privacidade online não estiver disponível, leia nossa declaração de privacidade offline:
          C:\Windows\system32\pt-BR\erofflps.txt
         

        • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
          7 de Novembro de 2012, 7:40

           

          Olá,

          Algum dos componentes do gtk3 parece estar faltando; recompilei usando gtk2; você tem como confirmar se o arquivo pw3270-5.0.0-gtk-2.24.7-i686-install.exe da área de arquivos apresenta o mesmo problema? 

          • 60c31a628f193227fee802ef94843821?only path=false&size=50&d=404Edson Almeida(usuário não autenticado)
            7 de Novembro de 2012, 9:38

             

            Bom dia Perry, 

            A versão "pw3270-5.0.0-gtk-2.24.7-i686-install.exe" abriu perfeitamente a opção de enviar e receber. Não fiz o teste nas demais opções ainda, mas aparentemente foi corrigido. Valeu.

            Aproveito para dirimir dúvidas sobre tais opções:

            Na opção RECEBER:

            "Arquivo Local":  Porque tenho que procurar por um arquivo que não baixei ainda?? Nessa opção não deveríamos renomear o arquivo a ser baixado?

            "Arquivo no Servidor": Sem problemas. Host do arquivo a ser baixado

             "Opções de Transferência": Arquivo texto, adicionar/remover CR no final da linha, Remapear caracteres ASCII, Servidor é TSO, Acrescentar, Tamanho do buffer... (Tais informações são necessárias? Não é muito técnico para o usuário final??)

            Na opção ENVIAR:

            "Arquivo Local": Sem problemas

            "Arquivo no Servidor": Sem problemas.

            "Opção de Transferência": Não deveria ter a opção "binário"? Como fazer para enviar um arquivo texto para binário nas atuais opções?

            "Fomato do Registro": ????

            "Space allocations units": ????

            LRECL - BLKSIZE - Tamanho Buffer... (Há necessidade de tais informações? E se há, não é muito técnico para os usuários leigos que visam apenas transferir um arquivo texto via linguagem de máquina??)

            Obrigado pelos retornos

            Abraços e bom trabalho.

            • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
              9 de Novembro de 2012, 7:39

               

              Olá,

              Na opção RECEBER:

              "Arquivo Local": O botão procurar ajuda caso você precise receber um arquivo que já exista ou mudar o path para recebimento de arquivo. Na prática essa caixa serve apenas para definir o nome/caminho que será usado para gravar o arquivo local.

               "Opções de Transferência": Sim, são técnicas e nem sempre usada mas isso não significa que nunca serão usadas, tanto que a maioria delas é simplemente repassada ao IND$FILE no início da transferência, ou seja, são enviadas direto para o HOST. Alguns usuários podem precisar setar parâmetros específicos da transferência e isso não seria possível se elas não existirem na caixa de diálogo.

              Para simplificar posso ocultá-las numa caixa "Opções avançadas" ou criar uma opção de configuração que oculte esses campos extras da caixa de diálogo. O que acha?

              Arquivo texto, adicionar/remover CR no final da linha, Remapear caracteres ASCII, Servidor é TSO, Acrescentar, Tamanho do buffer... (Tais informações são necessárias? Não é muito técnico para o usuário final??) 

              Na opção ENVIAR: 

              "Opção de Transferência": Não deveria ter a opção "binário"? - Binário é o inverso de "texto", ou seja, se o campo texto está desmarcado o arquivo é binário.

              "Fomato do Registro","Space allocations units",LRECL - BLKSIZE - Tamanho Buffer são opções passadas direto ao IND$FILE para definir parâmetros da transferência; novamente não são necessárias para algums, porém, pode ser para outros.  

              • 60c31a628f193227fee802ef94843821?only path=false&size=50&d=404Edson Almeida(usuário não autenticado)
                12 de Novembro de 2012, 7:37

                 

                Olá Perry,

                A proposta da caixa "Opções avançadas" visando a simplificação é interessante. Há ganhos nos dois lados.

                Valeu pelas dicas.

                Abraços e bom trabalho 

Essa comunidade não possui posts nesse blog