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.

  1. #1 by André Bononi at April 24th, 2009

    Parabéns, Alexandre, pela iniciativa. Belo blog. Já gostei de cara, principalmente pela primeira dica. SorteredColleciton será muito útil nas minhas aplicações. Valeu ! Parabéns, boa sorte e conte comigo. Sempre que puder estarei aqui dando meus “pitacos” e passando alguma dica. Até.

    André - RSYS

  2. #2 by Paulo at February 6th, 2010

    Parabens!!!,
    Estou tentando usar a rotina para ler XML mas no NetExpress 3.0, compila sem problema algun , mas , não consegue achar o arquivo xml passo o endereço e nome para lsArquivo mas o retorno de AbreXML sempre é OLEFALSE, sera que só funciona apartir do 3.1?

(will not be published)
  1. Nenhuma trackback.