
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 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 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?