1) Introdução
As Fórmulas são módulos destinados ao armazenamento e transferência de conjuntos de valores para determinados agrupamentos de variáveis, de forma a criar configurações pré-definidas. O módulo de Fórmulas do E3 fornece todas as ferramentas necessárias para a criação destes conjuntos de valores (as Fórmulas) e associá-los a um Template. Um Template é a formatação das tabelas de um Banco de Dados, e 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 podem ser enviadas e/ou carregadas em um Template ou em grupos de variáveis, desde que obedeçam a uma relação 1:1 com cada elemento do template.
Os grupos de variáveis são também chamados Unidades, e várias unidades podem ser definidas para um mesmo Template. Assim, ao 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. Já ao 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:
- Quando o cliente precisa armazenar valores e carregá-los em tags num determinado momento.
- Quando o cliente precisa de tags retentivos, ou seja, tags que, mesmo quando o domínio é finalizado, não perdem o último valor adquirido.
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
Dentro do servidor de dados, crie três pastas com os seguintes nomes: Maquina1, Maquina2 e Maquina3. Dentro de cada uma dessas pastas, crie quatro tags internos com os nomes Acucar, Agua, Glicose e Xarope.
Depois, insira uma fórmula no seu projeto com uma tabela chamada Balas e selecione 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, serão selecionados limites absolutos para os dois primeiros itens, e um limite restrito para o quarto item. Os valores devem ser setados conforme a figura 1. Cada restrição é explicada na respectiva janela de seleção, que é acessada através do botão com reticências, localizado ao lado direito da área de edição da restrição. Estas restrições impedem que valores inválidos sejam colocados nos tags e possam causar algum problema no processo, como desperdício e produto com defeito, entre outros.
Figura 1: Criando restrições
Feito isso, selecione a aba Unidades e crie três itens: Maquina1, Maquina2 e Maquina3. Depois, referencie cada um dos itens com respectivos tags, conforme mostrado na figura 2. Estas associações serão também gravadas 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-os conforme mostrado na figura 3. Estes conjuntos serão os produtos e valores iniciais que utilizaremos, e podem ser modificados 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 desta 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) chamado BalaAtual. Referencie cada Display posicionado ao lado dos textos “Bala de” ao respectivo tag. Referencie os SetPoints aos seus respectivos tags. Lembre que todos os tags estão dentro das pastas de dados referentes às máquinas.
Para carregar os itens na ComboBox, insira o item Consulta na tela e configure-o para buscar a tabela Balas_Values, selecionado apenas o campo Name desta. Depois, configure o seguinte script no evento OnStartRunning da ComboBox:
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 este 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, adicione 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 chamada igual e, neste caso, não permitir que a mesma seja adicionada. Caso contrário, ela será adicionada normalmente. Para isto, siga o script abaixo:
Sub CommandButton1_Click()
igual = 0
Set RS = Screen.Item("Consulta1").GetADORecordset()
Set TagName = Application.GetObject("Dados.Maquina1.BalaAtual")
SetFocus()
For aux = 1 To RS.RecordCount
If Screen.Item("ComboBox1").Value = RS.Fields("Name") Then
igual = 1
MsgBox "Receita ja existe!"
End If
RS.MoveNext
Next
If igual = 0 And Screen.Item("ComboBox1").Value <> "" Then
Tagname.Value = Screen.Item("ComboBox1").Value
Application.GetObject("Formula1").CreateValue(TagName.Value)
RS.MoveLast
Screen.Item("ComboBox1").AddItem Tagname.Value
Screen.Item("ComboBox2").AddItem Tagname.Value
Screen.Item("ComboBox3").AddItem Tagname.Value
Application.GetObject("Dados.Maquina1.Acucar").Value = 0
Application.GetObject("Dados.Maquina1.Glicose").Value = 0
Application.GetObject("Dados.Maquina1.Xarope").Value = 0
Application.GetObject("Dados.Maquina1.Agua").Value = 0
End If
End Sub
O script acima funciona como padrão para a criação dos scripts para os outros dois botões. 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 configurados os valores para os ingredientes da bala. Para isso, devemos configurar um script no botão Salvar, conforme mostrado abaixo.
Sub CommandButton8_Click() SetFocus()'tira o foco dos setpoints para validar o valor If Application.GetObject("Dados.Maquina1.Agua").Value >= 5 and _ Application.GetObject("Dados.Maquina1.Agua").Value <= 15 then'filtra os valores 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'filtra os valores 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, "Glicose", _ Application.GetObject("Dados.Maquina1.Glicose").Value Application.GetObject("Formula1").SetValueData _ Application.GetObject("Dados.Maquina1.BalaAtual").Value, "Xarope", _ Application.GetObject("Dados.Maquina1.Xarope").Value IF Screen.Item("ComboBox1").Value = _ Application.GetObject("Dados.Maquina1.BalaAtual").Value then Application.GetObject("Formula1").LoadFormulaValuesQuiet "Maquina1", _ Screen.Item("ComboBox1").Value End If If Screen.Item("ComboBox1").Value = _ Application.GetObject("Dados.Maquina1.BalaAtual").Value then Application.GetObject("Formula1").LoadFormulaValuesQuiet "Maquina1", _ Screen.Item("ComboBox1").Value End If End Sub
Este script também verifica se os valores ajustados para os itens estão dentro dos limites configurados, mostrando uma mensagem de erro quando estes estiverem 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 requer proteções e alguns outros procedimentos para que a bala seja acidentalmente excluída de todos os locais onde ela estiver selecionada. Portanto, o script será o seguinte:
Sub CommandButton9_Click() VarDel = Screen.Item("ComboBox1").Value if MsgBox ("Deseja deletar a formula de "& VarDel & "?", 4) = 6 then'verifica se deseja deletar a formula 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.BalaAtual").Value = "" Application.GetObject("Dados.Maquina2.Acucar").Value = 0 Application.GetObject("Dados.Maquina2.Glicose").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.BalaAtual").Value = "" Application.GetObject("Dados.Maquina3.Acucar").Value = 0 Application.GetObject("Dados.Maquina3.Glicose").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.BalaAtual").Value = "" Application.GetObject("Dados.Maquina1.Acucar").Value = 0 Application.GetObject("Dados.Maquina1.Glicose").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 if End Sub
Note que o script procura e apaga o item selecionado da tabela do banco de dados, e então configura todos os valores como 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) Considerações finais
Esta aplicação não visa mostrar a melhor maneira de se configurar 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 suporte técnico da Elipse Software.
Existe algum vídeo que mostra como fazer?