quinta-feira, 16 de fevereiro de 2006

Atributos de classe com Ocl (DerivationOcl)

É impressionante a facilidade que o ECO nos permite ter para resolver alguns tipos de requisitos do dia a dia. Hoje tinha que criar um campo que calculasse o valor sugerido do produto na tela de cadastro de produtos de um de meus clientes, a solução foi simples, criei um atributo derivado em minha classe produto com a seguinte OCL:

self.ItemPedidoCompras.PedidoCompra->orderBy(DataInclusao)->last.ItemPedidoCompras->Select(ee.Produto = self).Valor + (self.ItemPedidoCompras.PedidoCompra->orderBy(DataInclusao)->last.ItemPedidoCompras->Select(ee.Produto = self).Valor / 100.safeCast(Decimal) * self.Lucro)


Descrição do Modelo: O modelo possui uma classe Produto que contem um atributo chamado lucro e possui um relacionamento com a classe ItemPedidoCompra que contem o valor que foi pago este produto e possui um relacionamento com a classe PedidoCompra que por sua vez contem o atributo data de inclusão. Ufa !!!

Explicação da OCL:
Acessamos atravez da classe Produto (self) os pedidos de compras (PedidoCompra) e ordenamos por Data de Inclusão (DataInclusao) depois pegamos o ultimo PedidoCompra acessamos seus Itens (ItemPedidoCompras) e selecionamos (->Select(ee.Produto = self)) o Item que contem o valor do Produto,
ok até aqui tudo bem vamos agora adcionar lucro que é um valor em porcentagem. Ou seja teremos que pegar este valor que achamos até agora e dividir por 100 e depois multiplicar pelo nosso atributo lucro da classe Produto. Para isso basta entao somar o mesmo valor que já achamos ficando nossa OCL assim:
self.ItemPedidoCompras.PedidoCompra->orderBy(DataInclusao)->last.ItemPedidoCompras->Select(ee.Produto = self).Valor +
(self.ItemPedidoCompras.PedidoCompra->orderBy(DataInclusao)->last.ItemPedidoCompras->Select(ee.Produto = self).Valor

Agora dividimos por 100 e multiplicamos pelo nosso lucro, ficando assim:

self.ItemPedidoCompras.PedidoCompra->orderBy(DataInclusao)->last.ItemPedidoCompras->Select(ee.Produto = self).Valor + (self.ItemPedidoCompras.PedidoCompra->orderBy(DataInclusao)->last.ItemPedidoCompras->Select(ee.Produto = self).Valor / 100.safeCast(Decimal) * self.Lucro)

Obs.: 100.safeCast(Decimal) foi utilizado pelo fato do ECO ainda conter alguns bugs ao trabalhar com valores Decimais, não se esqueça tambem de pegar no site da borland o suporte aos calculos de decimais.

O Objetivo foi fazer com que a classe produto calculasse o ultimo valor (que foi pago) deste produto mais o lucro que o cliente quer ter em cima deste produto.


Resolvido o problema ;)

Nenhum comentário: