Introdução
O tratamento de informações armazenadas em arquivos leva em consideração o tipo de organização do arquivo e as formas de acesso aos registros que são permitidas pela organização do arquivo.
O Algoritmo de Intercalação
O algoritmo de intercalação de arquivos é também conhecido como merge e é uma técnica bastante usada para atualização de arquivos com organização sequencial, com a geração de um novo arquivo atualizado e que também possui a organização sequencial.
Normalmente temos um arquivo mestre e um arquivo de movimento. O registros do arquivo de movimento são aplicados ao arquivo mestre gerando assim um novo arquivo mestre atualizado.
O arquivo mestre atualizado é portanto o resultado da intercalação do arquivo mestre com o arquivo de movimento.
O Algoritmo de Intercalação é também chamado de balance-line, principalmente pelos analistas e programadores COBOL que desenvolviam sistemas batch em mainframe.
Balance line
O algoritmo consiste na atualização de registros do arquivo mestre a partir das transações ( inclusao, alteração, exclusao ) dos registros do arquivo de movimento que são aplicados ao arquivo mestre.
As transações do arquivo de movimento são as seguintes:
Inclusão de um novo registro no arquivo mestre
Alteração dos campos de um registro no arquivo mestre
Exclusão de um registro no arquivo mestre
Para que o algoritmo funcione corretamente é necessário que os arquivos mestre e movimento estejam ordenados pelo mesmo campo que é chamado chave.
Os registros de transações são comparados aos registros do arquivo mestre através do campo chave.
Funcionamento do Balance Line
Os registros mestre e transação são comparados pelo(s) campo(s) chave. Existem três possibilidades:
1 - Registro Mestre sem alteração/exclusão no arquivo de transações. Neste caso, o registro mestre é simplesmente copiado para o novo arquivo mestre.
Se chave do arquivo mestre é menor do que a chave do arquivo de transações Então
incluir registro do arquivo mestre no arquivo de saída
ler o proximo registro do arquivo mestre
Fim-Se
2- Registro de transações sem correspondente no arquivo mestre. Neste caso trata-se de um registro de transação que não possui registro mestre e para este cenário a única operação válida seria a inclusão de um novo registro no arquivo mestre. As outras operações ( modificação/exclusão ) teriam que ter um registro correspondente no arquivo mestre.
Se a chave do arquivo de transações é menor que a chave do arquivo mestre Então
Se operação for inserção Então
incluir registro do arquivo de transações no novo arquivo mestre
Senao
Se operação for exclusão ou modificação Então
incluir registro no arquivo de erros com mensagem "Registro mestre não encontrado. Alteração/Exclusão não permitida"
Fim-Se
Fim-Se
Ler arquivo de transações para o próximo registro
Fim-Se
3- Registro de transações com correspondente no arquivo mestre. Neste caso temos um registro de transação com um registro mestre correspondente, ou seja, que possui a mesma chave. Neste caso, temos que considerar que pode ser uma operação de modificação no registro mestre ou uma operação de exclusão no registro mestre. Caso seja uma operação de inclusão deve ser gerado um erro pois não poderia haver um novo registro mestre com uma chave já existente. Em ambos os casos, o resultado da operação é refletido no novo arquivo mestre.
Se a chave do arquivo de transações e do arquivo mestre forem iguais Então
Se a operação for de modificação ou exclusão Então
o registro do arquivo mestre sofre as atualizações (modificação ou exclusão ) indicadas no registro do arquivo de transações e atualiza o novo arquivo mestre
Senão
Se a operação for de inserção Então
Incluir registro no arquivo de erros com mensagem "Registro já existe no cadastro. Inclusão não permitida".
Fim-Se
Ler o arquivo de transacoes
Ler o arquivo mestre
Fim-Se
Erros de transação no algoritmo de intercalação
Os erros abaixo podem acontecer em uma transação durante o processamento de um algoritmo de intercalação de arquivos.
Registro Mestre já existente. Inclusão não permitida.
Registro Mestre não encontrado. Alteração não permitida.
Registro Mestre não encontrado. Exclusão não permitida.
Exemplo de algoritmo de intercalação
Faça um algoritmo para um programa de atualização de arquivo de conta corrente de um banco a partir de um arquivo de movimento bancario.
O arquivo de conta corrente possui numero-conta, cpf e saldo
O arquivo de movimento possui numero-conta, cpf, saldo e operacao. O campo operação pode ser ( I = Inclusão, E = Encerramento, C = Credito ou D = Debito ).
Os arquivos estão ordenados pelo número da conta
O Exemplo abaixo possui alguns erros. No caso, falta o tratamento adequado para cada um dos 3 casos de atualizado em um balance line.
Faça a correção do algoritmo abaixo de forma que cada um dos 3 casos trate adequadamente as operações e atualize o arquivo de erros de acordo com o erro ocorrido.
Solução:
procedimento LerMestre( registroCadastro)
inicio
leia mestre
se fim do arquivo entao
registroCadastro.chave <- 9999
fim-se
fim
procedimento LerMovimento( registroMovimento)
inicio
ler movimento
se fim do arquivo entao
registroMovimento.chave <- 9999
fim-se
fim
funcao novoSaldo( operacao, valor, saldo )
inicio
se operacao = 'C' entao
saldo <- saldo + valor
senao
saldo <- saldo - valor
fim-se
fim
procedimento mostraErro( conta, operacao, valor)
inicio
imprimir "Erro no arquivo Movimento ", conta, operacao, valor
fim
procedimento cadastroComMovimento
inicio
enquanto mestre.conta = movimento.conta faca
mestre.saldo <- novoSaldo( movimento.operacao, movimento.valor, movimento.saldo )
lerMovimento(registroMovimento)
fim-enquanto
novo-mestre <- mestre
grava novo-mestre
lerCadastro(registroCadastro)
fim
procedimento CadastroSemMovimento
inicio
novo-mestre <- mestre
grava novo-mestre
LerCadastro(registroCadastro)
fim
procedimento MovimentoSemCadastro
inicio
se movimento.operacao = "I" entao
novo-mestre <- movimento
grava novo-mestre
senao
gravar erro "Registro não cadastrado. Alteracao/Exclusao nao permitida"
fim-se
lerCadastro(registroCadastro)
fim
inicio
abrir mestre
abrir movimento
abrir novo-mestre
ordenar mestre pela conta
ordenar movimento pela conta
lerCadastro(registroCadastro)
lerMovimento(registroMovimento)
enquanto mestre.conta <> 9999 ou movimento.conta <> 9999 faca
se mestre.conta = movimento.conta entao
cadastroComMovimento
senao
se mestre.conta > movimento.conta entao
movimentoSemCadastro
senao
cadastroSemMovimento
fim-se
fim-se
fim-enquanto
fechar mestre
fechar movimento
fechar novo-mestre
fim