Mostrando postagens com marcador C#. Mostrar todas as postagens
Mostrando postagens com marcador C#. Mostrar todas as postagens

quinta-feira, 9 de outubro de 2014

Resposta do WorkShop 03

Gente se houver dúvidas basta me escrever.

Segue logo baixo os arquivos contendo as resoluções do workshop 03.

Clique aqui para efetuar o download dos arquivos.

quinta-feira, 2 de outubro de 2014

Manipulando o quadro de Gantt e Criando uma regra de sequenciamento Personalizada - Treinamento API Preactor

Uma regra de sequenciamento consiste em distribuir da melhor for possível as operações/ ordens de produção pelos recursos produtivos disponíveis.

O Preactor já faz isso muito bem, pois possui inúmeras regras de sequenciamento Padrão: Minimização de Setup, Sequencia Preferida, Regras APS para frente, para trás, por prioridade, por data de entrega. 

Mas alguns empresas possuem particularidades que não são atendidas por essas regras, por isso a necessidade de desenvolver um algorítimo que interaja com o Preactor sequenciando as ordens de forma a atender essas particularidades.

O intuito desse tutorial não é te tornar um expert em regras de sequenciamento, e sim abrir sua cabeça sobre o que pode ser feito e através das funções que conhecerá. Com esse conhecimento você poderá montar sua própria regra de sequenciamento dentro do Preactor.

Para essa parte do treinamento você irá precisar baixar o modelo workshop 03



Funções PlanningBoard Preactor


A biblioteca PlanningBoard do Preactor é um grupo de funções que permitem o programador interagir com o Gráfico de Gantt. Na PlanningBoard que estão contidas as funções de sequenciamento de ordens, manipulação de calendários, movimentar da linha de tempo do Preactor, além de outras.

Vamos aprender então alguns funções básicas do PlanningBoard:

Instanciando a classe:
 IPreactor preactor = PreactorFactory.CreatePreactorObject(preactorComObject);
 //criando uma instancia da classe
 IPlanningBoard planning = preactor.PlanningBoard;



Função para mover a linha do tempo do Preactor:
IPlanningBoard planning = preactor.PlanningBoard;
//POSICIONA A LINHA DO TEMPO EM 02/10/2014 14:30
planning.TerminatorTime = new DateTime(2014,10,02,14,30,0);


Sequenciando todas as Desprogramadas:
            //SEQUENCIAMENTO PARA FRENTE
            planning.SequenceAll(SequenceAllDirection.Forwards, SequencePriority.Default);

            //SEQUENCIAMENTO PARA FRENTE POR DATA DE ENTREGA
            planning.SequenceAll(SequenceAllDirection.Forwards, SequencePriority.DueDate);

            //SEQUENCIAMENTO PARA FRENTE POR ORDEM DE CRIAÇÃO DAS ORDENS
            planning.SequenceAll(SequenceAllDirection.Forwards, SequencePriority.FileOrder);

            //SEQUENCIAMENTO PARA FRENTE POR PRIORIDADE
            planning.SequenceAll(SequenceAllDirection.Forwards, SequencePriority.Priority);

            //SEQUENCIAMENTP PARA FRENTE POR PRIORIDADE REVERSA
            planning.SequenceAll(SequenceAllDirection.Forwards, SequencePriority.ReversePriority);

            //SEQUENCIAMENTO PARA FRENTE POR CARGA/PESO 
            planning.SequenceAll(SequenceAllDirection.Forwards, SequencePriority.Weight);

            //TODAS ESSES TIPOS DE SEQUENCIAMENTO TAMBÉM PODEM SER APLICADOS PARA
            //SEQUENCIAMENTO PARA TRÁS, BASTA ALTERAR O PARÂMETRO 1 DA FUNÇÃO
            planning.SequenceAll(SequenceAllDirection.Backwards, SequencePriority.Default);


Desprogramar, ou desalocar as ordens do Gantt:
            //TODAS ESSES TIPOS DE SEQUENCIAMENTO TAMBÉM PODEM SER APLICADOS PARA
            //SEQUENCIAMENTO PARA TRÁS, BASTA ALTERAR O PARÂMETRO 1 DA FUNÇÃO
            planning.SequenceAll(SequenceAllDirection.Backwards, SequencePriority.Default);

            //DESPROGRAMAR TODAS AS ORDENS QUE ESTÃO DENTRO DO INTERVALO DE 2 MESES APÓS O TERMINADOR
            planning.UnallocateAll(planning.TerminatorTime, planning.TerminatorTime.AddMonths(2), OperationReferencePoint.ChangeStart);

            //DESPROGRAMAR UMA ORDEM, E TODAS SUAS OPERAÇÕES
            planning.UnallocateOperation(10, OperationSelection.AllOperations);
            //DESPROGRAMAR APENAS A OPERAÇÃO COMPREENDIDA PELO REGISTRO 10
            planning.UnallocateOperation(10, OperationSelection.ThisOperation);


Sequenciar uma única operação ou Ordem:
            //SEQUENCIAR TODAS AS OPERAÇÕES DA ORDEM 10 PARA FRENTE EM 01/01/2000 14:30
            var data = new DateTime(2000, 01, 01, 14, 30, 0);
            planning.SequenceOperation(10, SequenceOperationSelection.AllForwards, data);

            //SEQUENCIAR APENAS A OPERAÇÃO 10 EM 01/01/2000 14:30
            planning.SequenceOperation(10, SequenceOperationSelection.ThisOperation, data);


WorkShop 03



Com base nas funções que você aprendeu até o momento utilize o modelo do Workshop 03 e crie uma regra de sequenciamento personalizada.

Sua regra de sequenciamento deve ler o campo "Atributo 2" de cada ordem e sequenciar as operações de acordo com a sequencia de cadastro da tabela "Atributo 2", que segue a seguinte ordem:Regra 01, Regra 02, Regra 03, regra 04;

Explicando melhor: leia o campo "Atributo 2" das ordens, e sequencie 
1º todas as ordens "Regra 01", 
2º todas as ordens "Regra 02", e assim por diante.



Mãos a obra e boa sorte.

dúvidas: besaleel@msn.com




quarta-feira, 1 de outubro de 2014

3ª PARTE - Buscando Dados em uma tabela - Treinamento Preactor

Funções para buscar informações nas tabelas


O API da Preactor possui funções para facilitar a vida do programar ao buscar alguma informação dentro das tabelas do Preactor. Por exemplo, quando queremos identificar uma ordem pelo seu Número, ou pelo recurso que ela está alocado, ou mesmo buscar todas as operações de uma ordem.

Creio que essa função sem sombra de dúvidas é a mais utilizada ao se trabalhar com Preactor.

preactor.FindMatchingRecord("TABELA","CAMPO", posição, ValorBuscado);
Sobregarca:
preactor.FindMatchingRecord("TABELA", "CAMPO", posição, ValorBuscado, SearchDirection.Backwards);

A função básica possui 4 parâmetros:

  1. Tabela: "Apontamento";
  2. Campo ou Field: "Ordem";
  3. Posição, ou a partir de qual posição dentro da fila você deseja buscar sua informação: posição ou record ;
  4. Valor: valor a ser buscado, pode ser uma string, double, date, int bool;
  5. O quinto parâmetro da sobrecarga indica a direção de sua busca, "SearchDirection.Forwards" você quer buscar a informação do início da fila para o final, ou "SearchDirection.Backwards" do final da fila para o início;


Veja o exemplo abaixo onde iremos procurar dentro da tabela de Apontamento uma ordem A001:

public int Run(ref PreactorObj preactorComObject, ref object pespComObject)
        {
            IPreactor preactor = PreactorFactory.CreatePreactorObject(preactorComObject);

            var ordem = "A001";

            int record = preactor.FindMatchingRecord("Apontamento", "Ordem", 0, ordem);
            if (record > 0)
            {
                MessageBox.Show("A ordem: " + ordem + " foi encontrada, registro núm. " + record);
                return 0;
            }
            MessageBox.Show("A ordem " + ordem + " não foi encontrada!");
            return 0;

        }
Infelizmente esse método se resumo a buscar apenas um valor em um campo, ele não funciona também para buscarmos um trecho de uma string dentro de outra.

Quando precisamos buscar dois campos em uma tabela, efetuamos uma busca por um campo (ex: Recurso), em seguida lemos os valores do outro campo( ex: Ordem), aí se encontrarmos o que procuramos saímos da função e retornamos o resultado.

Veja esse exemplo em que buscamos os registros que possuem o Recurso: "Packing Line 1" e que o campo ordem possua o valor "A001":

 public int Run(ref PreactorObj preactorComObject, ref object pespComObject)
        {
            IPreactor preactor = PreactorFactory.CreatePreactorObject(preactorComObject);

            
            var recurso = "Packing Line 1";
            int record = preactor.FindMatchingRecord("Apontamento", "Ordem", 0, recurso);
            while (record > 0)
            {
                var ordem = preactor.ReadFieldString("Apontamento", "Ordem", record);
                if(ordem == "A001")
                    break;              
                //VEJA QUE A PRÓXIMA BUSCA SERÁ A PARTIR DO REGISTRO "RECORD"
                record = preactor.FindMatchingRecord("Apontamento", "Ordem", record, recurso);
            }

            if (record > 0)
            {
                MessageBox.Show("O recurso " + recurso + " e a ordem A001 possuem o registro " + record);
                return 0;
            }
            MessageBox.Show("O recurso " + recurso + " e a ordem A001, não foram encontrados!");
            return 0;
        }
Uma observação, vale apena lembrar que o Preactor tem seus registros indexados como uma fila, por esse motivo, veja que no final do while, nós refazemos a busca a partir do registro "Record", sendo que "Record" nada mais é do que uma índice dentro da fila.



WorkShop 02

Para o workshop 02 faça download do modelo (Clique aqui para Download).
Importe o arquivo CSV AtualizaOrdens.csv que está contido na pasta Import-Export Files do modelo. Busque na tabela de "Apontamento" os registros das ordens que estão contidas no arquivo CSV e atualize o nome do Recurso e o Status, se o Status do arquivo for "finalizada", você deverá excluir o registro da tabela de Apontamento.
Mãos a obra.


Resposta do workShop 02