Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
Comentário: Inserir mais informações

...

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 tabela exige o nome de um ALIAS para esta tabela, para ser possível referenciá-la. A criação, abertura e fechamento de uma tabela são feitas através das funções abaixo:

  • DBCreate – Cria uma nova tabela usando a RDD informada, com o nome e estrutura informados comom parâmetro.
  • DBUseArea – Abre uma tabela sob um determinado ALIAS usando uma RDD informada como parämetro
  • DBCloseArea – Fecha um ALIAS no processo atual. 

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.  Pode receber um parametro numérico, indicando a quantidade de registros para mover o ponteiro de navegação. Pode receber um valor negativo, indicando que a navegação deve seguir em direção do topo da tabela (registros anteriores ao atual).
  • DBSeek– posiciona no registro cuja expressao de indice corresponda ao valor informado como parametro

Existem funções auxiliares para determinar o estado ou registro atual da tabela e o estado da última operação executada, a seguir:

  • Bof – Quando .T., indica que uma navegação para um registro anterior atingiu o topo (ou primeiro registro visivel) da tabela. 
  • EOF – Quanto .T., indica que a tabela está em "fim de arquivo" – isso indica por exemplo que a última operação de navegação ultrapassou o último registro da tabela. 
  • Recno - Retorna o número do identificador sequencial deste registro. Caso o ALIAS esteja em EOF(), ela retorna um numero maior que o último identificador físico de registro
  • LastRec - Retorna o número do maior identificador de registro (recno) da tabela. Caso a tabela n"ao tenha nenhum registro, retorna 0 (zero). 
  • IndexOrd - Retorna o numero da ordem do indice aberto atualmente selecionado. Retorna 0 (zero) caso a ordem atual seja a ordem de inserção fisica de registros (ordem de RECNO).
  • IndexKey - Retorna a expressao Advpl de indexação da ordem atualmente selecionada, ou da ordem informada como parämetro
  • DBFilter - Retorna a expressão AdvPL usada para determinar a visibilidade lógica (filtro), caso algum filtro esteja em uso. 
  • NetErr - Retorna .T. caso a ultima operação ISAM de abertura de tabela (DbUseArea) falhou devido a restrição de acesso de abertura de tabela no modo informado – Por exemplo, tentar abrir uma tabela em modo exclusivo quando a mesma já está aberta em modo compartilhado não gera um erro em AdvPL, para verificar se a operação de abertura foi realizada com sucesso, usamos a função NetErr()
  • Deleted – Retorna .T. caso o registro atual esteja marcado logicamente como "deletado" e não seja utilizado. 

Para realizar operações de inclusão, atualização e eliminação de registros, utilizamos as funções a seguir:

  • DBAppend – Insere um novo registro na tabela. O registro inicialmente é criado na memória com os valores default de acordo com o tipo do campo ( Campos do tipo Caractere contém uma string com N espaços em branco, onde N é o tamanho do campo na tabela, campos do tipo "D" Data AdvPL inicializados com uma data vazia, tipo L (lógico) contém o valor .F. (falso), campo numérico contém 0 (zero), e campo "M" Memo contém uma strig vazia (""). O novo registro inserido permanece automaticamente bloqueado (em lock) pelo processo atual. 
  • DBDelete – Marca um registro para ser "deletado", tornando ele invisível para as operações de navegação ISAM. 
  • DBRLock / RLock– Tenta bloquear um registro para permitir o processo atual realizar alterações em seu conteúdo.
  • FLock – Tenta bloquear a tabela inteira, para evitar que outros processos obtenham bloqueio de registros e somente o processo atual consiga alterar registros na tabela. 
  • DBRUnlock / DBUnlock – Realiza o bloqueio de registro(s) bloqueados para alteração. 
  • DBCommit – Envia as alterações de dados pendentes em um ALIAS para o driver/RDD (não tem relação com transacionamento).  

A navegação nos dados de uma tabela ISAM estã sujeita a aplicação de filtros de visibilidade lógica. Isto singifica que, após definido um filtro de visualização de dados, a proxima operação de navegação nos dados posicionará no próximo registro da ordem em uso atual que atenda a condição de filtro. Um filtro pode ser qualquer expressão AdvPL que referencie os campos da tabela e retorne .T. (veradeiro) caso o registro deva ser logicamente visivel pela aplicação. As funções e comandos abaixo lidam com filtros:

  • DBSetFilter – aplica um filtro de visibilidade logica 
  • DBClearFilter – limpa um filtro previamente definido
  • SET DELETED ON – Habilita o filtro de registros logicamente marcados para deleção (comportamento DEFAULT), para que estes não sejam visiveis nas operações de navegação ISAM.
  • SET DELETED OFF – Desliga o filtro de registros marcados para deleção, para que os mesmos SEJAM visíveis nas operações de navegação ISAM. 

Exstem ainda funções genéricas que atuam sobre todos os ALIAS abertos no processo atual da aplicação, como por exemplo:

  • DBCloseAll – Fecha todos os ALIAS abertos do processo atual, para todas as RDDs 
  • DBCommitAll – Garante que todos os ALIAS abertos no processo atual realizaram as alterações de regitro pendentes.
  • DBClearAllFilter – Limpa todas as expressões de filtro para todas as tabelas / ALIAS abertos. 
  • DBUnlockAll – Solta todos os registros bloqueados de todos os ALIAS abertos no processo atual.

Estrutura da tabela e tipos de campos

O conceito de RDDs parte da premissa que as tabelas de dados devem armazenar valores compativeis com os tipos de variáveis AdvPL. Por isso, ao criarmos uma tabela através da função DBCreate, informamos um array com o nome, tipo , tamanho e numero de casas decimais dos campos que devem compor a estrutura da tabela. Os tipos podem ser "C" caractere, "N" numérico , "D" Data AdvPL, "L" lógico ou booleano, e "M" Memo – tamanho variável. A quantidade e tamanho máximo de campos e índices que podem ser usadas em uma tabela dependem do Driver e/ou RDD utilizados. Alguns drives inclusive exigem que, quando usado campo(s) do tipo "M" memo, estes sejam os últimos campos da estrutura – como é o caso das RDDs CTREE.

Modo de Abertura de tabelas 

...

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

Deleção lógica de registros

Por compatiblidade, as RDDs implementadas no AdvPL trabalham com uma implementação diferenciada de eliminar registros. A eliminação de um regitro em particular deve primeiro obter o bloqueio deste regitro, para então ser marcado para deleção através da função DBDelete(). A eliminação física deste registro somente é realizada pelo driver ou RDD quando executado o comando PACK – que exige que a tabela em questão seja aberta em modo exclusivo. Por default qualquer registro marcado para deleção não ]e logicamente visivel para as operações de navegação ISAM – exceto para a função DBgoto()

Utilização de Transacionamento 

...