4D v16 R6 introduziu um novo conceito de comunicação entre processos: objecto partilhado e variáveis de colecção partilhadas! Graças a isto, é possível partilhar facilmente informação entre processos.
Até agora, as selecções de entidades não eram partilháveis entre processos. Contudo, isso mudou… temos o prazer de anunciar que em 4D v18 R5 as selecções de entidades são partilháveis!
Já lá vão os dias da construção de uma lista de chaves primárias para mover uma selecção de entidades para outro processo. Melhore o seu código multi-processo , incluindo as selecções de entidades ORDA como objectos partilhados.
Continue a ler para saber mais.
HDI: Partilhar as selecções de entidades ORDA
princípio
Com 4D v18 R5, a maioria das selecções de entidades são partilháveis . Isto significa:
- são não alteráveis (não permite a adição de novas entidades).
- podem ser partilhadas entre vários processos ou trabalhadores.
Algumas selecções de entidades são não partilháveis (por exemplo, se tiverem sido criadas com dataClass.newSelection() ou Create entity selection()) Isto significa:
- são alteráveis (permite a adição de novas entidades)
- não podem ser partilhados entre vários processos
selecções de entidades partilháveis
Começando com 4D v18 R5, a maioria das selecções de entidades usadas (recuperadas com consulta(), all(), …) são partilháveis.
Vejamos um exemplo para melhor compreender.
Exemplo
No exemplo abaixo, construímos duas selecções de entidades:
- uma para facturas pagas.
- uma para as facturas não pagas.
Podemos querer passá-los a um trabalhador para delegar o envio:
- e-mails de reconhecimento de facturas pagas.
- mensagens de correio electrónico de lembrete para facturas não pagas.
Aqui está o código:
If //Put entity selections in a shared object
End use
CALL WORKER Storageinfo(Storage.info=Null)
Use (Storage)
Storage .info:=New shared object()
End use
Storage
End if (Storage.info)
Use
Storage .info.paid:=ds.Invoices.query("status=:1"; "Paid")
.info.unpaid:=ds.Invoices.query("status=:1"; "Unpaid") xml-ph-0034@de
Aqui está o método sendMails :
var $info
host; $1: Object
var $paid ; $unpaid: cs.InvoicesSelection
$server $invoice : cs.InvoicesEntity
var $server Object ; $transporter; $email; $status: //Prepare emails s
$server :=New object
.var:="exchange.company.com"
$server .user
:="$email" myName@company.com$server.password:="minha senha"
$transporter :=SMTP New transporter($server)
:=New object
$email .from:=" "
//Get entity selections
$info :=$1
$paid :=$info.paid
$unpaid:=$info.unpaid
//Loops on entity selections
For each ($invoice; $paid)
$email .to:=$invoice.customer.address // email address of the customer
$email .subject:="Pagamento OK para factura # "+String($invoice.number)
$status :=$transporter.send($email)
End for each $email
For each ($invoice; $unpaid)
$email .to:=$invoice.customer.address // email address of the customer
$email .subject:="Por favor pague a factura # "+String($invoice.number)
$status :=$transporter.send( )
End for each
Como pode ver, o trabalhador pode lidar com as selecções da entidade!
indo e vindo entre as selecções de entidades partilháveis / não partilháveis
Em alguns casos, poderá ter uma selecção de entidade não partilhável. Se precisar de a partilhar com outro processo, basta utilizar o novo .copy() função de classe disponível nos objectos de selecção de entidades.
Aqui está um exemplo disso mesmo:
O Form.products é uma nova selecção de entidade vazia obtida com a nova função de classeSelection(). Assim, não é partilhável e aceita a adição de uma entidade.
Form.products:=ds.Products.newSelection()
//Form.product is entered by the user
Form .
products.add(Form.product)
Se tentar colocá-lo “como está” no objecto partilhado $sharedObj, receberá um erro:
var $sharedObj : Object
$sharedOb j:=New shared object()
Use ($sharedObj)
//Error "Not supported value type in a shared object or a shared collection"
$sharedObj.
products:=Form.products
End use
Uma vez que a ORDA pensa em tudo, há uma nova função .copy() função de classe disponível nos objectos de selecção de entidades.
Devolve uma cópia da selecção da entidade em questão, para que possamos pedir esta cópia para ser partilhada ou não.
var $sharedObj : Object
$sharedObj
:=New shared object()
Use ($sharedObj)
//Returns a shareable copy of the Form.products entity selection
$sharedObj .products:=Form.products.copy(ck shared)
End use
É isso mesmo!
Claro que com esta nova função de classe, também se pode transformar uma selecção de entidade partilhável numa não partilhável, omitindo o parâmetro opcional.
Note-se que o comando OB Copy também foi actualizado:
- aceita uma selecção de entidade como parâmetro.
- As selecções de entidade aninhadas no objecto a copiar são também copiadas de acordo com a opção passada.
Descarregue o IDH e verifique a documentação para saber mais!