4D v16.3

Conjuntos

Página Inicial

 
4D v16.3
Conjuntos

Conjuntos  


 

 

Os conjuntos são uma forma poderosa e rápida de manipular seleções de registros. Além da possibilidade de criar conjuntos, associá-los à seleção atual, salvá-los, carregá-los e apagá-los, 4D permite realizar três operações padrão de conjuntos:

  •  Intersecção
  •  União
  •  Diferença.

Um conjunto é uma representação de uma seleção de registros. A idéia de conjuntos está intimamente ligada à idéia de seleção atual. Os conjuntos geralmente são utilizados pelas seguintes razões:

  • Para salvar e depois restaurar uma seleção quando a ordem não tem importância
  • Para acessar a la seleção que o usuário realiza em tela (o conjunto UserSet)
  • Para realizar uma operação lógica entre las seleções.

A seleção atual é uma lista de referências que apontam a cada registro atualmente selecionado. A lista existe em memória. Apenas os registros selecionados estão na lista. Uma seleção não contém realmente os registros, apenas uma lista de referências aos registros. Cada referência a um registro utiliza 4 bytes em memória. Quando você trabalha sobre uma tabela, sempre trabalha com os registros na seleção atual. Quando uma seleção estiver ordenada, apenas a lista de referências é reorganizada. Apenas existe uma seleção atual para cada tabela em um processo.

Como uma seleção atual, um conjunto reapresenta uma seleção de registros. Um conjunto utiliza uma representação muito compacta para cada registro. Cada registro está representado por um bit (um oitavo de byte). As operações que utilizam conjuntos são muito rápidas, porque os computadores podem realizar muito rapidamente operações sobre bits. Um conjunto contém um bit por cada registro da tabela, sem importar se o registro está incluído ou não no conjunto. Na verdade, cada bit é igual a 1 ou 0, dependendo de se o registro está no conjunto ou não.

Os conjuntos são muito econômicos em termos de memória RAM. O tamanho de um conjunto, em bytes, sempre será igual ao número total de registros na tabela dividido por 8. Por exemplo, se criar um conjunto para uma tabela que contenha 10.000 registros, o conjunto assume 1.250 bytes, aproximadamente 1.2K em RAM.

Podem existir vários conjuntos para cada tabela. Na verdade, os conjuntos podem ser salvados no disco independentemente do banco. Para modificar um registro que pertence a um conjunto, primeiro deve utilizar o conjunto como seleção atual, depois modificar o registro.

Um conjunto nunca está ordenado, os registros simplesmente são marcados apenas como pertencendo ao conjunto ou não. Pelo contrário, uma seleção temporária está ordenada, mas exige mais memória na maioria dos casos. Para maior informação sobre seleções temporárias, consulte a seção  Seleções temporárias.

No momento de sua criação, um conjunto “lembra” o registro atual da seleção. A seguinte tabela compara os conceitos da seleção atual e dos conjuntos:

ComparaçãoSeleção atualConjuntos
Número por tabela1ilimitado
OrdenávelSimNão
Pode ser salvo em discoNãoSim
RAM por registro (em bytes)Número de registros selec.* 4Número total de registros/8
CombinávelNãoSim
Contém registro atualSimSim, como o do momento da criação


O conjunto pertence a tabela na qual foi criado. As operações sobre conjuntos apenas podem ser realizadas entre os conjuntos que pertencem a mesma tabela.

Os conjuntos são independentes dos dados, isso significa que depois de realizar modificações a uma tabela, um conjunto poderia não ser exato. Há muitas operações que podem fazer que um conjunto não seja exato. Por exemplo, se cria um conjunto de todos os habitantes de São Paulo e modifica os dados de um dos registros por Rio de Janeiro, o conjunto não é modificado, porque o conjunto é simplesmente a representação de uma seleção de registros. A eliminação e a substituição de registros também podem tornar o conjunto obsoleto, do mesmo jeito que a compactação de dados. A precisão dos conjuntos apenas pode ser garantido se os dados da seleção original não forem modificados.

Pode utilizar três tipos de conjuntos:

  • Conjuntos processo: um conjunto processo apenas é acessível pelo processo no qual foi criado. LockedSet é um conjunto processo. Os conjuntos processo são Apagados logo que o método de processo termine. Os conjuntos processo não necessitam um prefixo especial no nome.
  • Conjuntos interprocesso: um conjunto é interprocesso se o nome do conjunto estiver antecedido pelos símbolos (<>), um sinal “menor que” seguido por um sinal “maior que”. Nota: esta sintaxe pode ser utilizada em Windows e Macintosh. Além disso, apenas para o Macintosh, pode utilizar o diamante (Opção-shift-V).
    Um conjunto interprocesso é “visível” para todos os processos da banco.
    Em modo cliente/servidor, um conjunto interprocesso é “visível” para todos os processos da máquina onde foi criado (cliente ou servidor).
    O nome de um conjunto interprocesso deve ser único no banco.
  • Conjuntos locais/cliente: os conjuntos locais/cliente são principalmente para uso em modo cliente/servidor. O nome dos conjuntos local/cliente está antecedido pelo sinal dólar ($), exceto para o conjunto sistema UserSet. Diferente de outros tipos de conjuntos, um conjunto local/cliente é armazenado na máquina cliente.
Nota:
  • O tamanho máximo para o nome do conjunto é  255 characters (excluindo símbolos <> e $).
  • para maior informação sobre a utilização de conjuntos em modo cliente/servidor, consulte a seção 4D Server, conjuntos e seleções temporais no Manual de 4D Server.

A tabela a seguir indica os princípios de visibilidade dos conjuntos em função de seu alcance e de onde foram criados:

Um conjunto pode ser criado dentro de uma transação. É possível criar um conjunto de registro criados dentro de uma transação e um conjunto de registros criados ou modificados fora da transação. Quando a transação termina,  o conjunto criado durante la transação deve ser apagado, porque poderia não ser uma reapresentação exata dos registros, especialmente se a transação for cancelada.

O seguinte exemplo apaga os registros duplicados de uma tabela que contem informação de Pessoas. Um loop For...End for passa por todos os registros, comparando o registro atual com o registro anterior. Se o nome, endereço, e código postal forem iguais, o registro é adicionado a um conjunto. Ao final do loop, o conjunto é convertido na seleção atual e a seleção atual anterior é apagada

 CRIATE EMPTY SET([Pessoas];"Duplicados")
  ` Criar um conjunto vazio para os registros duplicados
 ALL RECORDS([Pessoas])
  ` Selecione todos os registros
  ` Ordenar os registros por código postal, endereço e nome
  ` de maneira que os duplicados estejam juntos
 ORDER BY([Pessoas];[Pessoas]CodigoPostal;>;[Pessoas]Endereço;>;[Pessoas]Nome;>)
  ` Inicializar as variáveis que conservam os campos do registro anterior
 $Nome:=[Pessoas]Nome
 $Endereço:=[Pessoas]Endereço
 $CodigoPostal:=[Pessoas]CodigoPostal
  ` Ir ao segundo registro para compará-lo com o primeiro
 NEXT RECORD([Pessoas])
 For($i;2;Records in table([Pessoas]))
  ` Loop pelos registros a partir de 2º
  ` Se o nome, endereço e código postal forem os mesmos
  ` do registro anterior, é um registro duplicado.
    If(([Pessoas]Nome=$Nome) & ([Pessoas]Endereço=$Endereço) & 
       ([Pessoas]CodigoPostal=$CodigoPostal))
  ` Adicionar registro atual (ou duplicado) ao conjunto
       ADD TO SET([Pessoas];"Duplicados")
    Else
  ` Salvar o nome, endereço e código postal deste registro para compará-lo com o próximo
       $Nome:=[Pessoas]Nome
       $Endereço:=[Pessoas]Endereço
       $CodigoPostal:=[Pessoas]CodigoPostal
    End if
  ` Passar ao próximo registro
    NEXT RECORD([Pessoas])
 End for
  ` Utilizar os registros duplicados encontrados
 USE SET("Duplicados")
  ` Apaga os registros duplicados
 DELETE SELECTION([Pessoas])
  ` Eliminar o conjunto da memória
 CLEAR SET("Duplicados")


Ao invés de apagar imediatamente os registros ao final do método, pode mostrá-los em tela ou imprimi-los, de modo a que possa realizar uma comparação mais detalhada.

4D administra um conjunto sistema chamado UserSet, o qual guarda automaticamente as seleções de registros mais recentes realizadas pelo usuário em tela. Desta forma, pode mostrar um grupo de registros com MODIFY SELECTION ou DISPLAY SELECTION, pedir ao usuário que selecione alguns entre eles, e transformar os resultados desta seleção manual em um conjunto que você pode nomear.

4D Server: apesar de seu nome não começar com o caractere "$", o conjunto sistema UserSet é um conjunto cliente. Assim, quando usar INTERSECTION, UNION e DIFFERENCE, tenha certeza de comparar UserSet apenas com outros conjuntos clientes.

Apenas há um UserSet por processo. Cada tabela não tem seu próprio UserSet. UserSet é associado a uma tabela apenas quando uma seleção de registros para a tabela é mostrada.

4D administra o conjunto UserSet para os formulários listados mostrados em modo Desenho ou utilizando os comandos MODIFY SELECTION ou DISPLAY SELECTION . Entretanto, este mecanismo não está ativo para sub-formulários.

O seguinte método ilustra como mostrar registros para permitir ao usuário selecionar alguns registros, e depois utiliza UserSet para mostrar os registros selecionados:

  ` Mostrar todos os registros e permitir ao usuário selecionar alguns deles.
  ` Depois mostre esta seleção utilizando UserSet para modificar a seleção atual.
 FORM SET OUTPUT([Pessoas];"Mostrar") ` Definir o formulário de saída
 ALL RECORDS([Pessoas]` Seleção de todas as Pessoas
 ALERT("Pressione Ctrl ou Comando e  clique para selecionar os registros.")
 DISPLAY SELECTION([Pessoas]` Mostrar as Pessoas
 USE SET("UserSet") ` Utiliza as Pessoas selecionadas
 ALERT("Você escolheu as seguintes Pessoas.")
 DISPLAY SELECTION([Pessoas]` Mostrar as Pessoas selecionadas

Os comandos APPLY TO SELECTION, DELETE SELECTION e ARRAY TO SELECTION e JSON TO SELECTION criam um conjunto sistema chamado LockedSet quando são utilizadas em um ambiente multi-processo.
Os comandos de pesquisa criam igualmente um conjunto sistema LockedSet quando encontram registros bloqueados no contexto de "pesquisa e bloqueio" (ver o comando SET QUERY AND LOCK).
LockedSet indica quais registros foram bloqueados durante a execução do comando.



Ver também 

Convenções

 
PROPRIEDADES 

Produto: 4D
Tema: Conjuntos

 
HISTÓRIA 

 
ARTICLE USAGE

Manual de linguagem 4D ( 4D v16)
Manual de linguagem 4D ( 4D v16.1)
Manual de linguagem 4D ( 4D v16.2)
Manual de linguagem 4D ( 4D v16.3)