1) Introdução
As fórmulas são utilizadas quando se necessita armazenar e transferir conjuntos de valores para determinados agrupamentos de variáveis, de forma a criar configurações ou setups pré-definidos que podem ser usados em várias situações. O módulo de fórmulas fornece ferramentas para facilitar a criação e manutenção desses conjuntos de valores, sendo que o nome dado para cada conjunto de valores é a fórmula. Cada fórmula deve ser associada à um Template, que pode ser compreendido como a formatação das tabelas de um Banco de Dados. O Template informa quantas variáveis farão parte da fórmula, o tipo de dados que poderá ser armazenado em cada variável, e os tipos de permissões e restrições. As fórmulas criadas para um determinado template poderão ser enviadas e/ou carregadas para um template e também para grupos de variáveis, desde que obedeçam a uma relação um por um com cada elemento do template.
Cada grupo de variáveis é definido como uma Unidade (Unit) e podem ser definidas várias unidades para um mesmo template. Assim, se você for enviar valores de uma fórmula para um conjunto de tags, a fórmula é a origem dos dados e as Unidades são o destino dos dados. Caso queira guardar em uma fórmula os valores atuais de certos tags, estes últimos são a origem dos dados e a fórmula o destino. O template apenas define a quantidade, tipos e restrições dos dados nessas operações. Para utilizar este recurso, clique com o botão direito do mouse no nome do projeto e selecione o item Fórmula.
Exemplos de utilização de fórmulas no E3
As fórmulas podem ser utilizadas em alguns casos de aplicação. Por exemplo:
Para mostrar o uso de fórmulas no E3, vamos criar um projeto que reproduza o primeiro exemplo de aplicação citado. Este projeto simula o carregamento de valores a serem utilizados para a fabricação de balas por três máquinas. Inicialmente teremos cinco tipos de balas.
2) Criação do projeto
Para iniciar, crie um projeto padrão com o nome "TreinaFormulas" dentro da pasta "C:\TreinaFormulas", selecionando apenas a opção de armazenar dados em disco. O nome do banco de dados deve ser "Formulas.mdb". Depois renomeie a tela criada para "Formulas" e configure o "Viewer" para abrir esta tela.
Criação dos dados e da fórmula
Crie, dentro do servidor de dados, três pastas com os nomes "Maquina1", "Maquina2" e "Maquina3". Dentro de cada uma dessas pastas, crie quatro tags internos com os nomes "Acucar", "Agua", "Glicose" e "Xarope".
Agora, insira uma fórmula no seu projeto dando o nome da tabela como "Balas" e selecionando o banco de dados "ServidorDB". Todos os dados da fórmula, como formatação e valores, serão gravados nesta tabela.
Na área de trabalho, insira quatro templates com os nomes "Acucar", "Agua", "Glucose" e "Xarope". Para demonstrar o uso das restrições, vamos selecionar, para os dois primeiros itens, limites absolutos e para o quarto item vamos selecionar o limite restrito. Os valores devem ser setados conforme a figura 1. Leia a explicação para cada restrição na janela de seleção das mesmas, acessada através do botão com reticências, localizado ao lado direito da área de edição da restrição. Estas restrições servem para não permitir que valores inválidos sejam colocados nos tags e possam causar algum problema no processo como desperdício, produto com defeito, etc.
Figura 1 - Criando restrições
Feito isso, selecione a guia de "Unidades" e crie três itens com os nomes "Maquina1", "Maquina2" e "Maquina3". Depois, referencie cada um dos itens aos respectivos tags conforme mostrado na figura 2. Estas associações serão gravadas, também, na tabela do banco de dados, juntamente com os dados da fórmula.
Figura 2 - Associando os tags
Para finalizar a configuração da fórmula, crie cinco conjuntos de valores e configure conforme mostrado na figura 3. Estes conjuntos serão os produtos e valores iniciais que utilizaremos, podendo modificá-los depois.
Figura 3 - Ajustando os valores
Configuração da tela para manipulação da fórmula
Para manipulação da fórmula, crie uma tela conforme mostrado na figura 4.
Figura 4 - Tela de manipulação da fórmula
Todos os textos da tela são "Labels". Ao lado de cada texto "Bala de" deve ser colocado um "Display" que irá mostrar qual bala está selecionada. Os retângulos brancos são "SetPoints" para a manipulação dos valores dos tags. O ideal é que sejam criados os objetos para uma das máquinas e depois copiados para as outras duas, modificando-se apenas o nome da máquina.
Depois de criar a tela, crie um tag interno dentro de cada pasta do servidor de dados (Maquina1, Maquina2 e Maquina3) com o nome "BalaAtual". Referencie cada Display posicionado ao lado dos textos "Bala de" ao respectivo tag. Referencie os SetPoints aos seus respectivos tags. Lembrando que todos os tags estão dentro das pastas de dados referentes às máquinas.
Para carregar os itens na ComboBox deve ser inserido o item "Consulta" na tela e configurado para buscar a tabela "Balas_Values" e selecionado apenas o campo "Name" da mesma. Depois, deve-se configurar um script no evento "OnStartRunning" da ComboBox da seguinte maneira:
Sub ComboBox1_OnStartRunning()
Set RS = Screen.Item("Consulta1").GetADORecordset()
For aux = 1 To RS.RecordCount
AddItem CStr(RS.Fields("Name"))
RS.MoveNext
Next
End Sub
Feito isso, precisamos criar um procedimento para que os valores do item selecionado na ComboBox sejam carregados nos tags. Para isto, devemos criar um novo evento para a ComboBox que seja chamado quando o índice for mudado, ou seja, quando o item selecionado for mudado.
Para criar o novo evento, deve-se selecionar a opção "Outros Eventos" na área de script da ComboBox. Para adicionar um novo evento basta clicar no botão com o sinal de adição. O evento deverá ser criado conforme mostrado na figura abaixo.
Figura 5 - Criando o evento
No evento criado na ComboBox deverá ser criado o seguinte script:
Sub ComboBox1_ListIndexChange()
If Value <> "" Then
Set RS = Screen.Item("Consulta1").GetADORecordset()
For aux = 1 To RS.RecordCount
If Value = RS.Fields.Item("Name") then
Application.GetObject("Formula1").LoadFormulaValuesQuiet "Maquina1", Value Application.GetObject_("Dados.Maquina1.BalaAtual").Value = Value
Exit Sub
End If
RS.MoveNext
Next
End If
End Sub
Feito este script a ComboBox já está terminada. Siga este padrão para fazer os scripts para as outras duas ComboBox. Agora, precisamos configurar os botões para manipulação dos valores e das balas.
Para o botão "Criar Nova" o script deverá navegar através dos RecordSets do Banco de Dados para saber se o nome da bala a ser criada já existe através de uma variável auxiliar com o nome de "igual" e, neste caso, não permitir que a mesma seja adicionada. Caso contrário a mesma será adicionada normalmente. Abaixo segue o script a ser feito:
Sub CommandButton1_Click()
igual = 0
Set RS = Screen.Item("Consulta1").GetADORecordset()
For aux = 1 To RS.RecordCount
If Screen.Item("ComboBox1").Value = RS.Fields("Name") Then
igual = 1
End If
RS.MoveNext
Next
If igual = 0 And Screen.Item("ComboBox1").Value <> "" Then
Application.GetObject("Formula1").CreateValue &_ _&Application.GetObject("Dados.Maquina1.BalaAtual").Value)
Set RS = Screen.Item("Consulta1").GetADORecordset()
RS.MoveLast
Screen.Item("ComboBox1").AddItem RS.Fields("Name")
Screen.Item("ComboBox2").AddItem RS.Fields("Name")
Screen.Item("ComboBox3").AddItem RS.Fields("Name")
Application.GetObject("Dados.Maquina1.Acucar").Value = 0
Application.GetObject("Dados.Maquina1.Glucose").Value = 0
Application.GetObject("Dados.Maquina1.Xarope").Value = 0
Application.GetObject("Dados.Maquina1.Agua").Value = 0
End If
Application.Deactivate()
Application.Activate()
End Sub
O script acima deve ser seguido como padrão para serem criados os scripts para os outros dois botões de criação. Para criar uma nova bala deve-se digitar o nome na ComboBox e depois clicar no botão "Criar Nova". Depois disso, deverão ser setados os valores para os ingredientes da bala. Para isso, devemos configurar um script para o botão "Salvar" conforme mostrado abaixo.
Sub CommandButton8_Click()
If Application.GetObject("Dados.Maquina1.Agua").Value >= 5 and &_
_&Application.GetObject("Dados.Maquina1.Agua").Value <= 15 then
Application.GetObject("Formula1").SetValueData &_
_&Application.GetObject("Dados.Maquina1.BalaAtual").Value, "Agua", &_
_&Application.GetObject("Dados.Maquina1.Agua").Value
Else
MsgBox("O valor digitado para água é inválido, _
pois este item possui restrições!")
End If
If Application.GetObject("Dados.Maquina1.Acucar").Value >= 5 and &_
_&Application.GetObject("Dados.Maquina1.Acucar").Value <= 20 then
Application.GetObject("Formula1").SetValueData &_
_&Application.GetObject("Dados.Maquina1.BalaAtual").Value, "Acucar", &_
_&Application.GetObject("Dados.Maquina1.Acucar").Value
Else
MsgBox("O valor digitado para açúcar é inválido, _ pois este item possui restrições!")
End If
Application.GetObject("Formula1").SetValueData &_
_&Application.GetObject("Dados.Maquina1.BalaAtual").Value, "Glucose", &_
_&Application.GetObject("Dados.Maquina1.Glucose").Value
Application.GetObject("Formula1").SetValueData &_
_&Application.GetObject("Dados.Maquina1.BalaAtual").Value, "Xarope", &_
_&Application.GetObject("Dados.Maquina1.Xarope").Value
If Screen.Item("ComboBox2").Value = &_
_&Application.GetObject("Dados.Maquina1.BalaAtual").Value then
Application.GetObject("Formula1").LoadFormulaValuesQuiet "Maquina2", &_
_&Screen.Item("ComboBox2").Value
End If
If Screen.Item("ComboBox3").Value = &_
_&Application.GetObject("Dados.Maquina1.BalaAtual").Value then
Application.GetObject("Formula1").LoadFormulaValuesQuiet "Maquina3", &_
_&Screen.Item("ComboBox3").Value
End If
End Sub
Este script também verifica se os valores ajustados para os itens com limites configurados estão dentro do intervalo passado e mostra uma mensagem de erro quando ocorre de estar fora.
Agora já podemos criar e modificar os valores para as balas. Entretanto, ainda precisamos configurar a aplicação para permitir a exclusão da bala que selecionarmos. Para isso, vamos configurar um script para o botão "Deletar Seleção". Este script precisará de proteções e alguns outros procedimentos para não causar confusão e excluir a bala de todos os locais onde ela estiver selecionada. Portanto, o script será o seguinte:
Sub CommandButton9_Click()
indice = Screen.Item("ComboBox1").ListIndex
Application.GetObject("Formula1")_
.DeleteValue Screen.Item("ComboBox1").Value
if Screen.Item("ComboBox2").Value = Screen.Item("ComboBox1").Value then
Screen.Item("ComboBox2").Enabled = false
Screen.Item("ComboBox2").Value = ""
Screen.Item("ComboBox2").Enabled = true
Application.GetObject("Dados.Maquina2.Acucar").Value = 0
Application.GetObject("Dados.Maquina2.Glucose").Value = 0
Application.GetObject("Dados.Maquina2.Xarope").Value = 0
Application.GetObject("Dados.Maquina2.Agua").Value = 0
end if
if Screen.Item("ComboBox3").Value = Screen.Item("ComboBox1").Value then
Screen.Item("ComboBox3").Enabled = false
Screen.Item("ComboBox3").Value = ""
Screen.Item("ComboBox3").Enabled = true
Application.GetObject("Dados.Maquina3.Acucar").Value = 0
Application.GetObject("Dados.Maquina3.Glucose").Value = 0
Application.GetObject("Dados.Maquina3.Xarope").Value = 0
Application.GetObject("Dados.Maquina3.Agua").Value = 0
end if
Screen.Item("ComboBox1").RemoveItem(indice)
Screen.Item("ComboBox1").Enabled = false
Screen.Item("ComboBox1").Value = ""
Screen.Item("ComboBox1").Enabled = true
Application.GetObject("Dados.Maquina1.Acucar").Value = 0
Application.GetObject("Dados.Maquina1.Glucose").Value = 0
Application.GetObject("Dados.Maquina1.Xarope").Value = 0
Application.GetObject("Dados.Maquina1.Agua").Value = 0
Screen.Item("ComboBox2").RemoveItem(indice)
Screen.Item("ComboBox3").RemoveItem(indice)
End Sub
Perceba que o script procura e apaga o item selecionado da tabela do banco de dados, seta todos os valores pra 0 para então remover o item selecionado de todos os ComboBox. Este script deve ser seguido como padrão para os outros dois botões de remoção.
Agora podemos executar o domínio e fazer os testes de funcionamento de todos os recursos da aplicação.
3) Conclusões
Esta aplicação não visa mostrar a melhor maneira de configurar-se a aplicação, mas sim uma das maneiras de utilização de fórmulas com o maior número de recursos sem a utilização das ferramentas prontas do módulo de fórmulas. Também procuramos mostrar a atualização dos dados da fórmula utilizando uma outra ferramenta do E3 muito útil para a busca de dados nas tabelas de bancos de dados que é o E3Query, a consulta do E3.
Toda e qualquer dúvida referente a fórmulas ou, especificamente, a esta aplicação podem ser esclarecidas com o pessoal do suporte técnico da Elipse Software (e mail: suporte@elipse.com.br, suporte-sp@elipse.com.br ou suporte-pr@elipse.com.br).