Nestepost do blogue , descobriu o poder que as selecções de entidades partilháveis podem oferecer. 4D centra-se na partilha de dados porque, a longo prazo, conduz ao desempenho.
Mas estamos conscientes de que esta estratégia pode não ser a sua estratégia actual. Seguimos as discussões no fórum e compreendemos os seus comentários e sentimentos.
Para suavizar este passo e dar-lhe mais flexibilidade e ferramentas, fizemos alguns melhoramentos relativamente à natureza (partilhável ou não partilhável) das selecções de entidades.
Antes de continuar, recomendamos vivamente que leia este post no blogue e este para que possa fazer sentido das melhorias descritas abaixo.
HDI: Melhorias nas selecções de entidades
4D v18 R5 oferece mais possibilidades de lidar com selecções de entidades não partilháveis (alteráveis). Ajuda-o a trabalhar da forma a que está habituado.
Por outro lado, se estiver disposto a trabalhar com selecções de entidades partilháveis, ajudámo-lo a preparar-se para esta nova era em 4D v18 R5. Em 4D v18, introduzimos uma forma flexível que pode utilizar de forma transparente para preparar o seu código.
Em poucas palavras: prepare-se em 4D v18, corra em 4D v18 R5, e prepare-se para mais desempenho!
sobre as selecções de entidades alteráveis
adicionar uma entidade à selecção de uma entidade
Um caso de utilização frequente é exibir uma selecção de entidade numa caixa de listagem (produtos, facturas, etc.) e permitir que o utilizador adicione novas entidades.
Vamos trabalhar num dataclass de Produtos.
Quando o formulário é carregado, Form.products é criado, é a fonte de dados da caixa de listagem:
Case of
: (Form event code=On Load)
Form .products:=ds.Products.all()
End case
Quando o utilizador adiciona um novo produto:
Form.products.add(Form.product)
Se correr este código como em 4D v18 R5, receberá um erro ao correr o add() porque ds.Products.all() devolve uma selecção de entidade partilhável (não alterável).
Estamos cientes deste inconveniente. É por isso que vai descobrir que o 4D v18 copy() está disponível para preparar o seu código para se preparar para 4D v18 R5.
Se copy() é executado em 4D v18: apenas copia a sua selecção de entidade
Se copy() é executado em 4Dv18 R5, por defeito, copia a sua selecção de entidade não alterável como alterável para que não tenha problemas com a acção de adição!
Por isso, basta preparar o seu código desta forma:
Case of
.
: (Form event code=On Load)
Form .products:=ds.Products.all() copy()
End case
manter a natureza das selecções de entidades
As selecções de entidades criadas a partir de uma selecção de entidade original mantêm a mesma natureza.
exemplos
Ordenar uma caixa de listagem
Vamos trabalhar novamente no exemplo dos produtos expostos. Esta selecção de entidades expostas foi definida como alterável porque o utilizador necessita de adicionar novos produtos.
Qualquer tipo de acção nas colunas da caixa de listagem mantém a natureza alterável da selecção da entidade para que ainda se possam adicionar produtos.
Executar uma consulta
Se efectuar uma consulta sobre uma selecção de entidade, a natureza da selecção da entidade é mantida para o resultado.
No nosso exemplo, se o utilizador executar uma pesquisa sobre os produtos apresentados:
Form.products:=Form.products.query("nome = :1"; Form.search)
O resultado da consulta é alterável, pelo que ainda podem ser adicionados novos produtos porque Form.products é alterável.
Estes são apenas dois exemplos. Verifique a documentação para verificar todos os casos em que a natureza da selecção original é mantida.
código genérico
Pode ser útil verificar a natureza da selecção de uma entidade em código genérico, a fim de a utilizar da forma apropriada. Imagine um método que receba uma selecção de entidade que possa ou não ser partilhável.
No exemplo abaixo, recebemos uma selecção de entidade em Products. Antes de a passarmos a um TRABALHADOR, temos de verificar se é partilhável. Se não for, tornamo-lo numa selecção de entidade partilhável.
Para isso, utilizamos a nova OB Is shared() função.
var $products; $1: cs.ProductsSelection
$products :=$1
If (Not(OB Is shared($products))))
$products :=$products.copy(ck shared)
End if
//Generate the catalog of products
CALL WORKER ("trabalhador"; "buildCatalog"; $products; Current form window)
Nota: Há também uma nova função isAlterable() disponível nas selecções de entidades para verificar se estas são alteráveis.
Descarregue o IDH acima para mais exemplos!
Continue a trabalhar como antes
Se quiser continuar o comportamento das versões 4D anteriores (sem quaisquer conceitos de selecção de entidades partilháveis), pode utilizar a função makeSelectionsAlterable() função de classe disponível no objecto de datastore.
Isto tornará as alterações trazidas com 4D v18 R5 completamente transparentes para si.