É interessante como uma coisa tão simples, como abertura de banco de dados, pode se tornar tão chato e trabalhoso. Explico:
Imagine que, para cumprir determinada tarefa, sejam necessários até 10 arquivos de dados. Destes, 5 são essenciais, 3 são opcionais e 2 são temporários, que deverão ser apagados ao final. Isso não é tão difícil de acontecer. Eu próprio tenho situações em que preciso abrir até mais do que isso.
Pra piorar um pouco, imagine que cada um desses 10 arquivos tem diversos índices, e que a cada situação serão necessários certos índices, para cumprir a tarefa. Vou piorar um pouco mais. Destes índices, nem todos existem e deverão ser criados, portanto.
IFs aninhados poderiam ser a solução. Mas numa conjuntura dessas, seria um emaranhado de IFs, que acabaria mandando a manutenabilidade pra baixo.
Aí que se vê a necessidade de um sub-sistema de controle de arquivos de dados. Uma função um pouco mais elaborada ajuda, sem dúvida. Mas ainda assim, não torna o trabalho muito mais fácil.
Conforme eu comentei com o colega, num sistema antigo é difícil querer impor mudanças tão radicais. O ideal seria, conforme o tempo permitir, ir desenvolvendo algo mais aprofundado e implantar isso nos projetos futuros. Uma coisa posso garantir: depois que fiz isso, meu trabalho com bancos de dados simplesmente acabou. Exemplo simples:
Código: Selecionar todos
dbDefGroup Tempor create kill vital tag "iSM1_EMINRO"
dbDefGroup SaiMAP create vital tag if(nOrd=1, "iSM1_EMINRO", "iSM1_DATSAI")
dbDefGroup Fornec tag "iFOR_CODIGO"
dbDefGroup EntMP2 vital tag "iEM2_MAPDATENT" if nOptMAP=_kANALITICO
dbDefGroup EntMP1 vital tag "iEM1_CODIGO"
dbDefGroup MatPri create vital exclusive reindexIF _kTRUE
if !dbOpenGrp()
// Algum arquivo não pôde ser aberto
end
...
...
...
dbCloseGrp()
O "Tempor" acima será criado se não existir. Existindo, será zerado por causa da cláusula "ZERO". O arquivo "Fornec" é o único opcional. Não é tão importante. Se não existir, não será criado. O arquivo "EntMP2" só será aberto se uma certa opção de configuração assim exigir. O arquivo "MatPri" terá seus índices recriados incondicionalmente. Após a configuração inicial, a função dbOpenGrp() executará no sub-sistema e tentará cumprir as exigências desse pseudo-script.
Por fim, se a abertura tiver retornado com sucesso, a função dbCloseGrp() fechará todos os arquivos e ainda apagará o arquivo "Tempor" e seus índices relacionados.
Pra entender a profundidade dessas facilidades, só tentando fazer a mesma coisa através de código comum. Certamente ficaria monstruoso. Isso que eu não dei como exemplo o meu pior caso, que é três vezes maior que esse exemplo.
Por isso eu ressalto: mesmo que a criação de um esquema desses dê trabalho, quando pronto, a recompensa é infinitamente maior. Pode-se então dedicar o tempo ganho com tarefas bem mais nobres.