Criando um Record Layout no NetExpress

O trabalho de manutenção de uma tabela no Cobol geralmente é uma tarefa árdua. Conferir valores de cada registro em uma tabela com 100.000, chega a dar um embrulho no estômago com tantos números para olhar e analisar. Mas…. Existe uma ferramenta do NetExpress que dá uma mãozinha nessa hora, o Record Layout.

Abaixo descrevo o passo-a-passo para a geração de um Record Layout no NetExpress 3.1.

1º Passo: Vá em File > New > Record Layout

Passo 1

Passo 1

2º Passo: Encontre o arquivo .IDY do seu programa que contém o COPY com a FD do arquivo ( a FD precisa estar dentro de um COPY separado ).

Passo 2

Passo 2

3º Passo: Clique em Avançar e Concluir.

Passo 3

Passo 3

4º Passo: Salve o seu arquivo de Layout ( .STR ).

Passo 5

Passo 4

5º Passo: Abra o seu arquivo com os dados ( certifique-se de que a opção “Open as” está setada como Data, na parte de baixo dessa tela ).

Passo 6

Passo 5

6º Passo: Vá em File > Data Tools > Load Record Layout > Selecione o arquivo .STR que foi salvo no 4º passo.

Passo 6

Passo 6

E pronto, do lado esquerdo você terá os seus dados e ao lado direito vão estar as informações de cada registro separadas.

Passo 7

Passo 7

Abraços e até mais.

Nenhum comentário

Lendo arquivos XML no NetExpress 3.1 com MSXML

nfe

Olá companheiros !

Depois de um longo tempo sem atualizações, trouxe mais uma dica bacana para os amigos que como eu, estão sofrendo com a NF-e no NetExpress.

Utilizo o Uninfe para realizar o envio e retorno das notas e sempre tratei os arquivos de retorno no NetExpress com o INSPECT. Hoje porém,  me deparei com um problema mais sério, ler um XML de uma NF-e inteira e importar as informações para o meu sistema. Mais de 300 TAGS’s com INSPECT complicaria um pouco, certo ?

Já encontrei muitos exemplos de leitura de XML com as novas versões do NetExpress, a partir da versão 4 esse controle é nativo da ferramenta, mas e como fica o meu Net 3.1 ? Encontrei nesse site um demo de leitura do XML e para a minha surpresa, rodou certinho no Net 3.1, dei uma boa olhada para pegar o conceito  e resolvi criar um demo um pouco mais “didático”, para que outros também possam utilizar essa ferramenta.

Imagine poder chamar um método, passando para ele somente o nome do arquivo XML e retornando um objeto NFE com todos os dados da nota carregados ?

invoke wsrXml "CarregaNfe" using wsChave returning umaNFe

Esse é o meu objetivo, e com essa rotina ele ficou mais próximo de ser alcançado.  =)

Agora chega falatório, vamos a classe.

Para testar, declare a classe wsrXml no seu programa e simplesmente faça a chamada assim:

invoke wsrXml "LeXml"

No método “LeXml” eu deixei o caminho absoluto do arquivo XML que será aberto, não esqueça de alterar isso também antes de testar.

Daí pra frente é só animar e ler os comentários no código fonte. Ele vai imprimir na tela todas as TAG’s e Valores do arquivo XML. Só gostaria de lembrar que esse exemplo foi feito exclusivamente para um XML que tenha uma TAG principal e as suas “filhas”. O correto seria utilizar recursividade para poder ler infinitos níveis e valores no XML. Assim que eu tiver novos métodos, prometo atualizar o exemplo.

Fazer download do projeto - Ou você pode acessar a área de downloads.

O projeto foi útil pra você ? Deixe seu comentário para que eu saiba disso.

Abraço.

4 Comentários

ListView – O caminho das pedras – Parte 1

ListView

Para mim sempre foi muito penoso trabalhar com o ListView no NetExpress. Devem existir pelo menos 20 pastas com exemplos diferentes no meu PC, e todos ajudaram muito, cada um com aquela função que se propôs a ensinar. Porém, é difícil achar um exemplo que mostre de forma simples, todos os passos para utilização desse componente ( criar, inserir, alterar, excluir e assim por diante ).

Pensando nisso, resolvi criar uma aplicação demo simples, com a proposta de ensinar o caminho das pedras, para aqueles que estão iniciando a utilização, de uma maneira prática.

Estou disponibilizando hoje a primeira versão dessa aplicação e espero que os todos possam contribuir ao longo do tempo, para que sejam adicionadas novas funções, e assim teremos um guia de referência prático para utilização do tão temido ListView.

Algumas funções que estão nessa primeira versão:

1. Criação de 2 ListView’s na mesma tela utilizando apenas 1 controlador.

2. Adicionando colunas.

3. Criando novas linhas.

4. Pegando a linha selecionada.

5. Pegando a linha selecionada com duplo clique.

6. Adicionando check-boxes.

7. Pegando as informações de quais check-boxes foram selecionadas.

Esse demo foi criado utilizando o programa controlador único, que eu já havia disponibilizado no site do ClubeCobol, semana passada. Os demais objetos utilizados, são os objetos padrão do NetExpress ( ListView e ListViewItem ). Ou seja, qualquer um com NetExpress vai poder rodar a aplicação.

Ainda existem muitos métodos que podem ser adicionados, e se tudo der certo, ainda teremos as partes 2, 3, 4 5 desse artigo, publicando novas funções ao projeto.

Para fazer o download da aplicação, clique aqui.

, ,

9 Comentários

Microsoft Natal - E o Wii ficou para trás

project-natal

Se você ainda não tem um Wii e ficava louco vendo tudo que se pode fazer com aquela pequena belezinha, prepare-se. Foi apresentado ao público na E3, essa semana, o Project Natal. Bom, não vou me estender aqui, vejam o vídeo.


É, eu sei, eu sei…

Nenhum comentário

Criando uma caixa de mensagem com a API do Windows em NetExpress 3.1

yesorno

Quem usa DialogSystem já se acostumou a criar as caixas de mensagens e chamar direto pelo próprio Dialog. Já tinha visto alguns exemplos de criação das MessageBoxes dinamicamente, mas sempre achei trabalhoso demais.

Não faz muito tempo, comecei um projeto novo, que iria utilizar muitas dessas caixas, tanto de questionamento quanto de avisos para o usuário, resolvi então pesquisar um pouco mais sobre o assunto e colocá-lo em prática.

A idéia era simples: Criar uma classe para tratar essas mensagens, que deixasse a chamada do método mais simples possível.

E não é que deu certo ?

Agora para chamar uma MessageBox só preciso disso:

invoke wsrMsg "Question" using z"Confirma exclusão ?" returning wsResult

e para avisos, ainda mais simples:

invoke wsrMsg "Warning" using z"Data inválida"

Então vamos lá, o que é preciso para que você possa cria a sua classe também.

- No inicio do programa, declare o windows.cpy.
- Em special-names: call-convention 66 is WAPI.

E enfim, o método:

      *>================================================================
      *> Mensagem Sim / Não
      *>================================================================
       method-id. "Question".
 
       local-storage section.
 
       77 lsHwnd pic 9(09) comp-5.
       77 lsMsg pic x(255).
       77 lsCaption pic x(255).
       77 lsuType UINT.
       77 lsResult LRESULT.
 
       linkage section.
 
       77 lnkMsg pic x(255).
       77 lnkResult pic 9(09) comp-5.
 
       procedure division using lnkMsg returning lnkResult.
           // Pega o handle da janela que estiver ativa
           call WAPI "GetActiveWindow" returning lsHwnd
 
           // Move o texto e o título da janela
           move lnkMsg to lsMSG
           move z"Atenção !" to lsCaption
 
           // Seleciona o tipo de icone que irá aparecer
           move MB-ICONQUESTION to lsuType
 
           // Seleciona quais botões deverão aparecer
           add MB-YESNO to lsuType
 
           // Chamando a API
           call wapi MessageBoxA using by value lsHwnd
                           by reference lsMSG
                           by reference lsCaption
                           by value lsuType
                           returning lsResult
 
           move lsResult to lnkResult
 
       exit method
       end method "Question".

Já tem aí uma receita de bolo bacana pra quem quer começar.  Agradecimentos especiais ao Grande Mestre Jedi Alexandre Cortez.

Enjoy..

5 Comentários

Registros em ordem alfabética com a SortedCollection

Dados bagunçados

Esse é um problema que muitos programadores cobol, assim como eu, enfrentam ( ou enfrentavam ). Como ordenar uma lista de registros em ordem alfabética, em tempo de execução ? As soluções mais conhecidas são criar um arquivo sort, ou um auxiliar no disco ( e depois apagá-lo ).

Quando você trabalha com banco de dados fica fácil, basta colocar um ORDER BY no seu select, e as informações aparecem do jeitinho certo. Mas imagine que você tem um arquivo indexado, com a seguinte estrutura:

Clientes
- Código pic 9(008).  // Primary key
- Razão Social pic x(150). // Alternate key
- Nome Fantasia pic x(050).

E se você precisar listar os clientes, em ordem alfabética, pelo “Nome Fantasia” ?

Antes de mais nada, o que é essa tal de SortedCollection ?
SortedCollection é um tipo de coleção onde os registros adicionados são ordenados, bem diferente de uma coleção comum (OrderedCollection), em que os itens adicionados seguem a sequência em que foram criados.

Por exemplo, se você adicionar três itens: João; Pedro; Alexandre, em uma OrderedCollection, no momento da leitura, eles serão retornados exatamente nessa ordem, enquanto que, em uma SortedCollection seria retornado: Alexandre; João; Pedro.

Voltando assunto…

Vamos ordenar o nosso registro de clientes por “Nome Fantasia”. Para isso, declare a classe SortedCollection na sua class-control, também será necessária a classe CharacterArray, que será usada para armazenar o registro.

class-control.
  SortedCollection is class "srtdclln"
  CharacterArray is class "chararry"

Na working, algumas variáveis necessárias:

77 umaListaMat          object reference value null.
77 umaString            object reference value null.
77 umaColecao           object reference value null.
77 size                 pic 9(009)  comp-5 value zeros.
77 indice               pic 9(009)  comp-5 value zeros.

E ainda na working, um item que merece atenção, o grupo que receberá o nosso registro e que será adicionado a nossa coleção:

01 wlListaMat.
  05 wlFantasia            pic  x(050) value spaces.
  05 wlRazao               pic  x(150) value spaces.
  05 wlCodigo              pic  9(008) value zeros.

Agora sim, a nossa procedure que irá adicionar os itens na coleção:

adicionaItens section.
 
  // Pegamos o tamanho do registro, para informar a coleção
  move length of wlListaMat to s
 
  // Criamos uma instância da coleção, com o tamanho correto.
  invoke SortedCollection "ofReferences"
        using s returning umaListaMat
 
  initialize registro
  start do registro
  leitura sequencial do registro
  perform until fs-status > 03
    // Movimentando as variáveis do registro para a lista
    initialize wlListaMat
    move reg-codigo    to wlCodigo
    move reg-razao     to wlRazao
    move reg-fantasia  to wlFantasia
 
    // Criando um objeto string com os valores da lista para ser adicionado a coleção
    invoke CharacterArray "withByteLengthValue"
        using s wlListaMat
        returning umaString
 
    // Adicionando o objeto string na coleção
    invoke umaListaMat "add" using umaString
 
    leitura sequencial do registro
  end-perform
exit.

Agora vamos para a leitura da nossa coleção:

lerColecao section.
  // Pegamos o tamanho da coleção
  invoke umaListaMat "size" returning size
 
  move 0                  to indice
  perform until indice >= size
    add 1              to indice
 
    // Pega o item da coleção ( retorna um objeto string )
    invoke umaListaMat "at" using indice returning umaString
 
    // Recupera o texto desse objeto string, movendo para a lista
    invoke umaString "getValue" returning wlListaMat
 
    // Pronto, aqui as variáveis da lista já estão com os valores ordenados
  end-perform
 
  // Limpando os objetos da memória
  invoke umaListaMat "finalize" returning umaListaMat
  invoke umaString "finalize" returning umaString
exit.

Pronto, temos uma coleção carregada, e ordenada corretamente, sem precisar criar nenhum arquivo adicional.

Qualquer dúvida, é só postar nos comentários.

2 Comentários