Workflow Exemplo - Atualização de Preços
-
Upload
proteusinfo3265 -
Category
Documents
-
view
80 -
download
54
description
Transcript of Workflow Exemplo - Atualização de Preços
Exemplo Atualização de Preços
Neste exemplo, efetuaremos todos os passos para a construção de um processo simples de Workflow. O objetivo deste Workflow é fazer que a cada inclusão de um produtouma pessoa deverá receber um email contendo o código e descrição deste produto e deverá informar neste email o valor de venda deste produto. Após a resposta desteusuário, o Microsiga Protheus® atualizará a base de dados do Protheus.
Passo 1: Construindo o HTML:
Para este exemplo, faremos um HTML muito simples. O mesmo foi feito no FrontPage Express®. Abaixo segue o código do HTML (Graveo com o nome de Curso.HTM, emum diretório abaixo do RootPath chamado Workflow.):
<html>
<head>
<meta httpequiv="ContentType"
content="text/html; charset=iso88591">
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
<title>Favor Atualizar o Preço de Venda do Produto</title>
</head>
<body bgcolor="#FFFFFF">
<form action="mailto:%WFMailTo%" method="POST"
name="FrontPage_Form1">
<p>Favor Atualizar o Preço de Venda deste Produto</p>
<p>Data : %DATA%</p>
<table border="2">
<tr>
<td width="100">Código</td>
<td width="200">Descrição</td>
<td width="90">Preço Venda</td>
</tr>
<tr>
<td>%TB.CODIGO%</td>
<td><input type="text" size="20"
name="%TB.DESCRICAO%" value="%TB.DESCRICAO%"></td>
<td><input type="text" size="16" name="%TB.PRECO%"
value="%TB.PRECO%"></td>
</tr>
</table>
<p><input type="submit" name="B1" value="Enviar"></p>
</form>
<p> </p>
<p> </p>
</body>
</html>
Repare que no código acima existe o trecho mailto:%WFMailTo%, que teve que ser incluído na mão.
Em alguns editores de HTML, ao gravar o mesmo poderá ser acrescentado o número 25 no trecho acima: mailto:%25WFMailTo%25. Basta tirar estes números.
Neste HTML temos quatro objetos que serão substituídos por dados do Microsiga Protheus®: DATA, TB.CODIGO, TB.DESCRICAO, TB.PRECO.
Neste exemplo, a tabela somente terá os dados de um só produto, mas poderia ter mais. O código da página HTML permaneceria o mesmo.
Passo 2 : Cadastrando Processos e Status:
Para podermos fazer uma rastreabilidade dos processos do Workflow, devemos cadastrar o processo e os Status deste processo.
Vamos cadastrar então o Processo em questão. No ambiente Configurador, cadastre o Processo com o Código PRECOS.
No mesmo ambiente, cadastre dois Status para este processo: 10001, colocando a descrição de ‘Email Enviado’ e o 10002, colocando a descrição de ‘EmailRespondido’.
Passo 3: Criando o Ponto de Entrada com o Processo do Workflow:
Vamos então criar o ponto de Entrada que é disparado a cada inclusão de um produto. O nome do ponto de Entrada é MT010INC. Comentaremos cada linha do programa.
User Function MT010INC()
Local oHTML
//Crio o objeto oProcess, que recebe a inicialização da classe TWFProcess. Repare que o primeiro Parâmetro é o código do processo que cadastramos acima e o segundouma descrição qualquer.
oProcess := TWFProcess():New( "PRECOS", "Atualizacao de Precos" )
//Crio uma task. Um Processo pode ter várias Tasks(tarefas). Para cada Task informo um nome para ela e o HTML envolvido. Repare que o path do HTML é sempreabaixo do RootPath do Microsiga Protheus®.
oProcess:NewTask( "PRECOS01", "\WORKFLOW\CURSO.HTM" )
//Informo o título do email.
oProcess:cSubject := "Atualizacao de Precos"
//Informo qual função o Workflow executará ao ler a resposta do usuário.
oProcess:bReturn := "U_CURSO01R()"
//Informo o tempo de espera máximo para a resposta do usuário e a função a ser executada caso este tempo seja ultrapassado.
oProcess:bTimeOut := "U_CURSO01T()",0, 0, 5
//Simplesmente passo o valor da propriedade oProcess:oHTML para uma variável local para facilitar
oHTML := oProcess:oHTML
//Começo a preencher os valores do HTML. Inicialmente preencho o objeto DATA(no Html %DATA%) com a data base do sistema.
oHTML:ValByName('DATA',dDataBase)
//Preencho os itens da tabela : Código, Descrição do Produto e preço.
dbSelectArea("SB1")
aadd((oHtml:valByName('TB.CODIGO')),B1_COD)
aadd((oHtml:valByName('TB.DESCRICAO')),B1_DESC)
aadd((oHtml:valByName('TB.PRECO')),TRANSFORM( B1_PRV1,'@E 99,999.99' ))
//Informo para qual endereço(s) vai o email
oProcess:cTo := [email protected]
//Informo o código do usuário no Microsiga Protheus® que receberá o email. Isto é útil para usar a consulta de Processos por usuário.
oProcess:UserSiga := "000000"
//Coloco aqui um ponto de Rastreabilidade. Os dois primeiros parâmetros são sempre os abaixo passados e o terceiro indica o código do Status acima cadastrado.
RastreiaWF(oProcess:fProcessID+'.'+oProcess:fTaskID,oProcess:fProcCode,'10001')
//Aqui faço a gravação do ID do Processo (que é gerado pelo Workflow e único para cada processo) em um campo criado pelo usuário nesta tabela. Isto servirá para
rastrear qual processo está ligado a determinado produto. É este código que deverá ser informado na caixa de ID da tela de rastreabilidade.
RecLock('SB1')
SB1>B1_WFID := oProcess:fProcessID
MsUnlock()
//Inicio o Processo, enviando o email.
oProcess:Start()
Return .T.
Agora, crie a função que trata o retorno do Email. Assim que o Workflow lê da caixa postal uma mensagem deste processo, ele executa a função abaixo, definida acimana propriedade bReturn.
//Sempre é passado como último parâmetro a variável oProcess, que contém todas as propriedades do email respondido.
User Function CURSO01R(oProcess)
dbSelectArea("SB1")
dbSetOrder(1)
//Pego o código do produto, através do método RetByName, para achar o produto correto no cadastro.
dbSeek(xFilial()+oProcess:oHtml:RetByName('TB.CODIGO')[1])
RecLock("SB1")
//Gravo o valor do preço de venda informado pela pessoa que respondeu o email
SB1>B1_PRV1 := Val(oProcess:oHtml:RetByName('TB.PRECO')[1])
MsUnlock()
//Coloco mais um ponto de rastreabilidade, usando o Status 10002.
RastreiaWF(oProcess:fProcessID+'.'+oProcess:fTaskID,oProcess:fProcCode,'10002')
Return .T.
Vamos agora criar uma função que trata o TimeOut. Ela simplesmente mostra uma mensagem no console do Microsiga Protheus®. Repare que ela recebe também comoúltimo parâmetro a variável do processo, igual a função de retorno.
User Function CURSO01T(oProcess)
ConOut('TimeOut executado')
Return .T.