Este é um exemplo para lhe mostrar como usar o GXflow na IDE do GeneXus X Evolution. Ele representa um processo simples de reserva de passagens aéreas, que consiste na entrada dos dados da reserva no sistema e os dados do cliente (caso o cliente exista no sistema). Se não existir, será feito o seu cadastro e se o cliente existir, o controle irá simplesmente verificar a disponibilidade. Se a reserva estiver disponível o processo termina e se não estiver disponível, o fluxo irá retornar para que seja atualizado os dados da reserva.
Passo 1: Criando os objetos que serão parte do processo
Duas transações serão necessárias: Reservas (Reservation) e Clientes (Customer).
Transação de reservas

Notas: Para facilitar o entendimento, nós sugerimos definir a atributo ReservationAvailable como um checkbox com os valores 1 e 0 para os estados de 'selecionado' e 'não selecionado', respectivamente. Veja também que o atributo CustomerId está definido para permitir nulos (allow nulls), que é necessário para que o exemplo funcione.
Regras
Regras para fazer com que o atributo ReservationAvailable e seu texto (Textblock) fiquem invisíveis. Neste exemplo, somente poderá ser informada a disponibilidade em um segundo passo, após o cadastro.
ReservationAvailable.Visible = False If Insert;
TextBlockReservationAvailable.Visible = False If Insert;
Transação de clientes

Procedure AssignToCustomer
Criaremos a seguinte procedure: Quando a reserva e o cliente estiverem cadastrados, este grava o cliente na reserva.
Regras
Parm(in:&ReservationId, in:&CustomerId);
Variáveis
ReservationId (Baseado no atributo ReservationId)
CustomerId (Baseado no atributo CustomerId)
Código
For each
Where ReservationId = &ReservationId
CustomerId = &CustomerId
Endfor
Passo 2: Criando o diagrama de atividades que modela o processo
Para adicionar um 'diagrama de atividades', tudo o que precisamos fazer é adicionar um objeto GeneXus de ActivityDiagram, da mesma forma que fazemos com os demais objetos.

Passo 3: Associando os objetos ao diagrama
O primeiro objeto a ser associado será a transação de reservas (Reservation). Para associa-la, arraste da lista de objetos (Folder View) para a linha que conecta o Início (Start) e o fim (End) no diagrama.

Dados relevantes (Relevant data) com o mesmo nome e tipo de dados da(s) chave(s) primária(s) serão criados. Os dados relevantes estarão disponíveis em todo o processo.
O segundo passo consiste em adicionar a condição que verifica se o cliente está gravado na reserva. Arraste da barra de ferramentas (toolbar) o simbolo condicional ao diagrama (por padrão, este está localizado a direita da interface, ao lado da barra de rolagem na altura do início do texto), como mostrado na figura abaixo.

Uma vez que a condicional tenha sido inserida, nós precisaremos dedinir o que fará com que o fluxo seja normal ou o que fará com que o fluxo tome uma rota alternativa para inserir o cliente. Primeiro precisaremos adicionar a transação de clientes (Customer) no diagrama e conexta-la na com a rota alternativa, como mostrado abaixo:

Nota: Para conectar a condicional na tarefa de 'Cliente' (Customer), clique na borda direita da condicional e arraste-a, criando a seta para o lado esquedo da tarefa. O tipo é definido nas propriedades da rota.
Para completar, será necessário definir a condição que irá fazer com que o fluxo siga uma rota ou outra. Para esta finalidade, a IDE disponibiliza o editor de condições que permite que você determine as condições baseadas nos atributos e dados relevantes. Faça um duplo-clique na seta que liga a condicional ao cliente e entre com a seguinte expressão:

Definindo esta condição, reservas sem clientes preenchidos (customerId = 0) serão desviados.
Faça um duplo-clique no símbolo condicional e este mostrará as condições, como mostrado na figura abaixo:

Agora, seguindo o fluxo normal, a transação de reservas será adicionada novamente. Como na primeira utilização desta transação neste fluxo não foi possível informar a disponibilidade (por causa das regras), esta tarefa permite informar se a reserva está disponível para ser utilizada clicando no Checkbox. Iremos mudar o nome da tarefa pressionando F2.

Após determinar se a existe a disponibilidade, outra condição precisa ser adicionada para definir o fluxo a ser seguido:

Se a reserva estiver disponível, o processo é terminado. Se não estiver disponível, o fluxo então volta a tarefa inicial para que os dados da ordem sejam alterados.
Para completar o fluxo, nós precisamos definir um curso alternativo para ser seguido quando o cliente não for informado na reserva. Então, após cadastrar o cliente, nós teremos que gravar seus dados na reserva automaticamente e seguir para informar a disponibilidade. Para fazer isso, nós devemos adicionar ao fluxo a procedure previamente criada (AssignToCustomer) e a condição como a seguir:

Uma vez que a procedure tenha sido adicionada ao diagrama, os parâmetros (Regra Parm) serão automaticamente avaliados.Se os atributos ou variáveis com o mesmo nome e tipo sejam encontrados como dados relevantes, estes serão iniciados com seus valores correspondentes. Neste caso, as variáveis ?&ReservationId? e ?&CustomerId? terão seus valores setados dos dados relevantes (relevant data).
Passo 4: Executando o processo
Agora então vamos executar o processo e testa-lo. Antes de executar o processo pela primeira vez, faça um Build All (No menu Build). Este processo só é necessário por uma limitação temporária do Beta 2. Clique com o botão direito no diagrama na lista de objetos (Folder View) e clique em 'RUN' button (Ctrl+F5 ).

Então, o GeneXus irá fazer todas as ações necessárias para executar este diagrama e mostrará as mudanças que serão necessárias para a execução. Os passos são:
-
Atualizar os objetos do workflow
-
Especificar os objetos
-
Gerar os objetos
-
Compilar os objetos do workflow
-
Impactar o diagrama na base de dados
Pode ser que nem todos os passos sejam executados, pois irá depender das mudanças que foram feitas. Em outras palavras, o GeneXus irá avaliar as alterações e fará somente o que for necessário para a atualização do processo.
Um browser será aberto automaticamente com sua aplicação, como é mostrado na imagem abaixo:

Quando o protótipo é executado, uma nova instância do processo a ser testado é gerada. Isso permite que desenvolvedor execute todos os passos sem que sejam definidos os papeis (Grupo de usuários) e que mesmo definido no diagrama, não existe a necessidade de adicionar os papeis ao desenvolvedor. Desta forma, o desenvolvedor executará todos os passos do processo.
Abaixo veremos os casos possíveis deste fluxo: O primeiro caso corresponde ao cliente que não existe e o segundo corresponde ao cliente que já existe no sistema.
Caso 1: Quando o cliente precisa ser cadastrado
Os detalhes da reserva são digitados e o atributo CustomerId é deixado em branco (O cliente não existe no sistema ainda).

A seguir, precisaremos cadastrar o cliente.


Quando o cliente e a reserva estejam cadastradas, a procedure irá gravar o cliente na reserva automaticamente pela procedure que criamos.
Para encerrar o processo, devemos somente informar se a reserva estará disponível ou não.


Caso 2: Quando o cliente já está cadastrado
Nós criaremos uma nova tarefa como mostrada na figura abaixo e digitaremos os dados da reserva, incluindo o cliente, que neste caso existe cadastrado no sistema.

Então, a reserva será marcada como 'não disponível' ('not available') e o fluxo retornará para o início, onde os dados da reserva pode ser alterados.
Related links: Structure Editor