Árvore de páginas

Você está vendo a versão antiga da página. Ver a versão atual.

Comparar com o atual Ver Histórico da Página

Versão 1 Próxima »

As funções básicas de acesso a dados do AdvPL (Acesso a Banco de Dados - Funções genéricas) encapsulam as tabelas de dados das RRDs (Drivers e RDDs) permitindo dois modos de acesso ( exclusivo / compartilhado ), e um mecanismo de bloqueio total e parcial para atualização de registros em tabelas abertas em modo compartilhado por mais de um processo. Uma tabela de dados deve ser aberta pela aplicação para ser possível ler, incluir e alterar dados. A abertura de qualquer tabela deve especificar um ALIAS – ou "apelido" : Trata-se de uma string que identifica a tabela aberta dentro do processo atual. Através do ALIAS da tabela, podemos endereçar as colunas da tabela de modo direto ( ALIAS->CAMPO ) para leitura e atribuição de valores, e/ou chamar funcões que devem atuar neste ALIAS, usando a sintaxe ALIAS->(FUNCAO()). Uma função chamada sem informar o ALIAS atua sobre a área de trabalho atual – que corresponde ao último ALIAS aberto, ou ao último ALIAS selecionado através da função DBSelectArea. Como podemos manter no mesmo processo múltiplas tabelas abertas em múltiplos drivers ou RDDs, cada abertura de tabeal exige o nome de um ALIAS para esta tabela, para ser possível referenciá-la.

As tabelas são abertas em um modo de navegação ISAM, onde o alias aberto está sempre posicionado em um determinado registro da tabela ( chamado de registro corrente ), ou em EOF() – final de arquivo , registro em branco – e é permitido criar e abrir um ou mais índices, e é possível posicionar em qualquer registro da tabela usando as funções de navegação de dados do ISAM: 

  • DBGoTo – Posicionamento através do identificador físico de registro – ou RECNO
  • DBGoTop - Posiciona no primeiro registro da ordem de índice selecionada 
  • DBGoBottom – Posicional no último registro da ordem de índice selecionada. 
  • DBSkip – posiciona por default no próximo regisrtro da ordem de indice selecionada. 
  • DBSeek – posiciona no registro cuja expressao de indice corresponda ao valor informado como parametro

Modo de Abertura de tabelas 

A função DbUseArea permite duas configurações de acesso a uma tabela : Modo de compartilhamento e modo de edição. Os modos de compartilhamento podem ser SHARED (compartilhado) ou EXCLUSIVE (excclusivo). Uma tabela aberta no modo compartilhado pode ser aberta em modo compartilhado por outros processos, enquanto uma tabela aberta em modo exclusivo nao pode ser aberta por nenhum outro processo, independente do modo escolhido. Somente é possível abrir uma tabela em modo exclusivo se apenas o seu processo está abrindo a tabela. Somente é possível abrir a tabela em modo compartilhado se nenhum outro processo abriu a tabela em modo exclusivo. Quanto ao modo de edição, é possível abrir uma tabela em modo de edição (default), ou em modo READONLY (somente leitura). Um ALIAS de uma tabela aberta em modo de somente leitura não aceita operações de bloqueio ou alteração de dados. Uma tabela aberta em modo EXCLUSIVE não precisa usar nenhuma função de bloqueio de registro para realizar alterações. 

Ordenação de registros

Uma tabela aberta sem utilizar nenhum índice usa a ordenação do identificador de registro (ou RECNO). Trata-se de um identificador numérico único, sequencial, iniado em 1, que representa a ordem cronológica de inserção de registros. Quando criamos, abrimos ou selecionamos um índice para uso – vide funções DBCreateIndexDBSetIndexDBSetOrder – a ordem de navegação de registros corresponde a ordem binária ascendente da expressão de indice – calculada a partir dos campos informados na chave do índice em uso. Somente podemos usar a função DBSeek() se existe um indice aberto e selecionado para o ALIAS em questão. 

Acesso compartilhado e atualização de registros

Uma tabela aberta em modo compartilhado de edição comporta-se como um cursor dinâmico no Banco de Dados, ordenado pela expressão do índice em uso, com visibilidade lógica de registros total ou limitada por uma expressão de filtro. Uma operação de atualização de dados de um determinado registrro da tabela envolve as etapas de posicionamento no registro, obtenção de um bloqueio exclusivo (ou LOCK de registro), e a atualização dos valores dos campos deste registro endereçando o campo na forma ALIAS->CAMPO e usando o operador de atribuição do AdvPL ( := ) , ou ainda a função FieldPut(). Já a leitura de um valor de um campo de um registro da tabela requer apenas posicionar no registro e obter seu valor usando a expressao ALIAS->CAMPO. Nas operações de leitura do AdvPL não existe a operação de bloqueio para leitura ou bloqueio compartilhado. Qualquer processo pode obter o valor atual armazenado em um registro na base de dados, recuperado pela aplicação no momento do posicionamento do registro, inclusive se um determinado regisrtro possui um bloqueio (lock) para atualizacão. O valor retornado será sempre o último valor atualizado na base de dados. 

Utilização de Transacionamento 

Alguns drivers ou RDDs, como a "TOPCONN" por exemplo suporta operações com transacionamento. Uma vez iniciada a transação, novos registros e alterações feitas nas tabelas abertas pela RDD somente serão efetivadas na base de dados após a finalização com sucesso (ou COMMIT) da transação. A visibilidade dos dados alterados durante a transação por outro processo depende do nivel de isolamento (DBAccess - Isolation Level) utilizado para o Banco de Dados. A maioria dos bancos de dados, por questões de adequação de comportamento com as aplicações AdvPL usam um nivel de isolamento que permite outros processos ler novos registros e conteúdos de registros alterados dentro de um processo transacionado, mesmo antes da transação ser efetivada (ou comitada) no banco de dados. A RDD TOPCONN permite o controle explicito de transacionamento através da função TCCommit(). O ambiente AdvPL usado por exemplo no ERP Microsiga delimita um bloco transacionado usando os comandos BEGIN TRANSACTION e END TRANSACTION. 







  • Sem rótulos