4D v16

Conjuntos e seleções temporais

Página Inicial

 
4D v16
Conjuntos e seleções temporais

Conjuntos e seleções temporais    


 

 

Além das manipulações explicadas no vídeo, também se deve levar em conta que:

Em términos de memória:

  • Uma seleção necessita 4 bytes por registro da seleção, independentemente do número de registros na tabela (a diferença dos conjuntos).
  • Um conjunto requer um bit para cada registro na tabela.
    Os conjuntos se compõem de uma série de bits. Um conjunto contém tantos bits como registros em uma tabela. Cada bit de um conjunto corresponde a um relatório rápido “incluído na seleção” ou “não incluído” do enésimo registro da tabela ao momento em que se cria o conjunto.

A tabela a continuação resume as possibilidades dos conjuntos e das seleções temporais:

TemaConjuntoSeleção temporal
Espaço em memória para um registro1 bit4 bytes
Conservar a ordemNãoSim
Conservar o registro atualNãoSim
ReuniãoSimNão
InterseçãoSimNão
DiferençaSimNão
Guardar em discoSimNão
Tamanho memória de uma seleção de 10 registros de 20 00020 000 bits ou 2500 bytes10 x 4 bytes = 40 bytes
AlcanceLocal, Processo, InterprocessoProcesso, Interprocesso

Só é possível comparar conjuntos da mesma tabela.

Atenção: O funcionamento de um conjunto implica a utilização durante um tempo limitado e, eventualmente, semáforos (consulte a documentação de 4D para obter mais informações).

Na verdade, um conjunto faz corresponder um bit à posição física de cada linha da tabela. No caso de exclusão e posterior adição de registros, o conteúdo anterior de um registro físico poderia ser substituído com o novo conteúdo que não está mais em consonância com o que o conjunto é suposto para representar.

Ser metódico na utilização de conjuntos, que são uma maneira eficiente e rápida para comparar as equipes.

Para preservar uma seleção, há uma terceira solução que envolve o uso de uma matriz que contém a sua identificação usando o comando SELECTION TO ARRAY.

Você pode usar uma quarta solução usando os clusters armazenados, por exemplo, nos BLOBs.

Obviamente, quando as seleções e os conjuntos não são mais necessários, você pode liberar memória por excluí-los.

 CLEAR SET("SetName")
 CLEAR NAMED SELECTION("SelectionName")

Neste vídeo, vamos aprender como conservar uma seleção e a realizar funções (união, intersecção, diferença).

Os conjuntos são uma forma simples de interceptar as listas de registros de uma mesma tabela.

Os conjuntos são uma das formas que pode utilizar para colocar uma seleção em espera de modo que possa ser utilizado novamente mais a frente.

Ao realizar uma operação em dois conjuntos, é obtido um novo conjunto que contém o resultado da operação realizada (de acordo com a teoria de conjuntos convencionais).

Vamos aplicar estes princípios de imediato à lista de intervenções no formulário de navegação. Podemos criar um jogo da seleção atual.

Vamos a criar um botão que procure todas as intervenções que se iniciaram antes das 9:00 a.m.

Aqui está o método do botão:

 QUERY([Interventions];[Interventions]Intervention_Time

E vamos a criar um segundo botão que nos dará todas as intervenções que não foram realizadas aos 100%. Podemos programar este botão assim:

 QUERY([Interventions];[Interventions]Progress<100)

Pelo momento, no arquivo que importamos, o % de avance não é especificado.

Assim que primeiro vamos aplicar uma fórmula em todas as intervenções. Aqui temos uma seleção de 11,732 intervenções nas que vamos aplicar uma fórmula e especificar que:
  • O avance é igual ao valor de arredondado (devolvido por Round) do resto (calculado com Mod) de Random (que devolve um valor de 0 a 32,767), o Mod por 100 arredondado à décima mais próxima.
Se agora fazemos um relatório para comprovar o que os valores de % de avance foram cheios, vemos que vão de 0 a 100.

É claro, se fazemos clique no primeiro botão e logo no segundo, teremos perdido a seleção criada durante o primeiro clique.
Assim que no primeiro botão, pode ser útil, depois da pesquisa, conservar a informação em um conjunto que podemos chamar "Morning_Interventions".

 CREATE SET([Interventions];"Morning_Interventions")

Igualmente, aqui, logo de recuperar o conjunto das intervenções que não terminaram chamamos este conjunto "Interventions_in_progress".

 CREATE SET([Interventions];"Interventions_in_progress")

Então podemos comparar os conjuntos:

  • Seja acrescentando para obter o conjunto das intervenções pela manha + as intervenções em curso.
    Duplicamos o botão e indicamos que se trata das intervenções antes das 9:00 am + os projetos em curso;
    Logo escrevemos
     UNION("Morning_Interventions";"Interventions_in_progress";"Interventions_Result")

    em um terceiro conjunto chamado Interventions_Result para não sobrescrever os dois primeiros conjuntos.
  • Se quisermos as intervenções pela manha que, todavia estão em progresso, temos que comparar a parte comum de ambos os conjuntos, de modo que temos todas as intervenções pela manha que ainda estão em andamento. Neste caso, o comando a ser utilizado não é UNION, e sim INTERSECTION.
  • E se queremos obter as intervenções terminadas, teremos que aplicar DIFFERENCE aos 2 conjuntos: todas as intervenções pela manha menos as intervenções ainda em curso nos dará o conjunto resultante.

Podemos provar as diferentes possibilidades executando o formulário de navegação.
Tomamos todas as intervenções, há 11.732 e aqui (depois de fazer clique nos botões de pesquisa), ainda temos 11.732.

Por quê? Lembre que no vídeo anterior, adicionamos na função Navigation_Function, ao final, esta linha nos dá o número de registros encontrados depois de que é criado uma nova  seleção.

 vNumRecords:=Records in selection([Interventions])

Vamos a copiar este código e aplicar aos 2 botões de pesquisa.
Na atualidade, não temos o ponteiro da tabela aqui, vamos a processar as intervenções.

Logo podemos copiar esta linha de código para os outros 4 botões:
  • Na diferença
  • A intersecção
  • A união, vemos que nestes 3 botões, falta algo...
  • A união, vemos que nestes 3 botões, falta algo...

Agora, se voltamos ao formulário de navegação, teremos:

  • 631 631 intervenções antes das 9:00 a.m.
  • 11,192 intervenções que não foram terminadas.

As intervenções antes das 9:00 a.m. + as intervenções que estão em um 100%, as intervenções das 9:00 a.m. em curso ou das 9:00 a.m. terminadas, não muda o número que está aqui.

Por que? Porque a simples criação de um conjunto não implica seu uso.
Neste botão aqui, depois de que criamos a união que cria um terceiro conjunto, se deve indicar o conjunto particular que deve ser utilizado.

Assim que vamos a modificar o código e:

  • Aqui, adicionamos o comando USE SET.
  • Copiar, logo, vamos a colocar em os outros 2 botões.
  • Adicionamos a linha de utilização do conjunto nos outros 2 botões

E desta maneira podemos provar:

  • As intervenções em curso: temos 601
  • As intervenções terminadas: temos 30
  • O que corresponde às intervenções antes das 9:00 am: em outras palavras, 631

Para completar este enfoque, vamos a fechar o formulário e lançar novamente o método Navigation para verificar seu funcionamento.
Se fazemos clique sobre um dos três botões à direita, uma mensagem de erro indica que os conjuntos não existem. Naturalmente, os conjuntos devem existir antes poder usá-los.
Vamos a fazer seguimento à criação destes conjuntos, fazendo clique no primeiro botão de pesquisa.

Podemos ver, na lista da esquerda, o tema "Conjuntos",  que mostra a lista dos conjuntos existentes no processo que se está rastreando. Na atualidade, não há nenhum.

Quando o método se executa:
  • Damos nome a um primeiro conjunto
  • A continuação, vamos a dar nome a um segundo conjunto durante sua execução.
  • Usando o modo de seguimento, isto nos permitirá ver a criação do terceiro conjunto quando é executada a primeira linha.

E logo veremos, que como o conjunto já existe, é só a quantidade a que muda.

É necessário ter em conta que um conjunto é só uma lista de registros que não necessariamente é a seleção atual, porque agora a seleção atual da tabela Interventions contém 601 registros.

Quando passamos ao comando USE SET, a seleção agora contém um número de registros que coincidem com o número indicado no conjunto e a variável vNumRecords também se adaptará em consequência.

Outro uso dos conjuntos que é muito conveniente consiste em selecionar certo número de registros e a continuação indicar que queremos retornar a seleção atual, ou seja, que quando façamos clique no botão, tenha só estes X registros.

Para isso, devemos:

  • Programar o botão
  • Indicar que queremos uma seleção
  • Copiar uma entrada no método
  • E escrever o código correspondente.

O código é o seguinte:

 $SetName:="Userset_"+String(Milliseconds)
 GET HIGHLIGHTED RECORDS($TablePointer->;$SetName)
 USE SET($SetName)
 vNumRecords:=Records in selection($TablePointer->))

Em outras palavras, vamos a:

  • Criar um nome de conjunto (ou seja, uma parte de texto + a conversão a texto dos Miles segundos).
  • Obter os registros ressaltados, ou seja, aqueles que nos que foi feito clique na tabela em questão e criar o conjunto correspondente.
  • Utilizar este conjunto
  • Voltar a calcular o número de registros aos que esta cifra corresponde
  • A continuação, apagar o conjunto para liberar memória.

Podemos provar:

  • Todas as intervenções
  • Podemos selecionar algumas
  • E traçamos o botão de seleção

Neste nível, temos:

  • Um nome de conjunto
  • O conjunto será criado aqui, assim que temos 3 elementos neste conjunto
  • O usaremos para que se converta na seleção atual da tabela Interventions
  • Recalculamos o número de registros
  • Recalculamos o número de registros

Em nosso array, agora temos a lista de registros que selecionamos.

Um conjunto se compõe de um bit por registro e, portanto não conserva a ordem de classificação.

Quando seja necessário conservar esta informação, deve utilizar comandos relacionados com as seleções temporais:
COPY NAMED SELECTION e USE NAMED SELECTION

Aqui vamos a adicionar um botão que nos permite:

  • Criar uma primeira seleção (seleção temporal T1)
  • Vamos a copiar o código na seleção temporal
  • E duplicar o botão: T2
Agora temos a possibilidade de armazenar duas seleções que levarão em conta a ordem de classificação.

As seleções existem na memória, mas não se utilizarão.

A continuação, vamos a:
  • Duplicar estes botões
  • Modificar sua fórmula para solicitar o uso destas seleções (e aqui não é necessário especificar a tabela.).

Demos uma olhada a este exemplo. Se tomarmos todas as intervenções:

  • Tomemos as primeiras
  • Seleção
  • Ordenamos por data e hora de intervenção
  • Criamos uma primeira seleção
  • A continuação, tomamos a mesma seleção
  • Vamos a ordenar por objeto e hora de intervenção
  • E criamos a segunda seleção.

Agora:

  • Se chamarmos à primeira seleção, vem ordenada de acordo aos critérios indicados: data e hora.
  • Se fizermos clique no segundo botão, se ordenam como solicitamos primeiro por objeto e logo por data.

 
 

 
PROPRIEDADES 

Produto: 4D
Tema: Conjuntos e seleções temporais

 
HISTÓRIA 

 
ARTICLE USAGE

Autoformação ( 4D v16)