Mostrando postagens com marcador Scheduling. Mostrar todas as postagens
Mostrando postagens com marcador Scheduling. Mostrar todas as postagens

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


WorkShop 01 - Preactor API

Resolução workshop 01:

Irei mostrar a resolução do workshop em tópicos, seguindo uma sequencia lógica de trabalho, ok?

1º - Dentro de meu projeto Olá Mundo, eu criei uma classe contendo exatamente as mesmas propriedades do arquivo CSV:
 public class Apontamento
    {
        private string _ordem;
        private string _recurso;
        private string _status;
        private DateTime _dataDeInicio;
        private DateTime _dataDeFim;

        public string Ordem
        {
            get { return _ordem; }
            set { _ordem = value; }
        }

        public string Recurso
        {
            get { return _recurso; }
            set { _recurso = value; }
        }

        public string Status
        {
            get { return _status; }
            set { _status = value; }
        }

        public DateTime DataDeInicio
        {
            get { return _dataDeInicio; }
            set { _dataDeInicio = value; }
        }

        public DateTime DataDeFim
        {
            get { return _dataDeFim; }
            set { _dataDeFim = value; }
        }

        public override bool Equals(object obj)
        {
            if (obj is DBNull) return false;
            if (obj == null) return false;
            var m = (Apontamento) obj;
            return m.Ordem == _ordem;
        }

        public override int GetHashCode()
        {
            return base.GetHashCode();
        }
    }
2º Criei uma função para ler os dados do arquivo CSV e passar os valores para uma lista de Apontamentos:
 private IList getApontamentosByFileCSV(string pathFile)
        {
            try
            {
                IList apos = new List();

                if (!File.Exists(pathFile))
                {
                    MessageBox.Show("O arquivo de Apontamento não foi encontrado.");
                    return new List();
                }
                StreamReader rd = new StreamReader(pathFile, Encoding.Default);
                try
                {
                    var count = 0;
                    while (!rd.EndOfStream)
                    {
                        count++;
                        var linha = rd.ReadLine();
                        if (count == 1) continue;
                        if (string.IsNullOrEmpty(linha)) continue;

                        var colunas = linha.Split(';');
                        Apontamento iten = new Apontamento();
                        iten.Ordem = colunas[0];
                        iten.Recurso = colunas[1];
                        iten.Status = colunas[2];
                        iten.DataDeInicio = parseDate(colunas[3]);
                        iten.DataDeFim = parseDate(colunas[4]);

                        apos.Add(iten);
                    }
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                  rd.Close();  
                }


                return apos;
            }
            catch (Exception ex)
            {
                throw new Exception("Falha ao recuperar os dados do arquivo CSV:" + Environment.NewLine + ex.Message);
            }
        }
3º Criei um método que faz a comunicação com o Preactor, recebe a lista de apontamentos baseado no arquivo CSV e grava na tabela do Preactor:
OBS: a diferença entre este novo método e o OláMundo (Run) é um novo parâmetro que foi adicionado a função, "ref string arquivo". Eu achei essa forma mais simples configurar o nome e local onde o arquivo csv se encontra, mas você poderia também ter deixa o caminho e nome do arquivo fixos em seu projeto, ok?


 public int ImportApontamento(ref PreactorObj preactorComObject, ref object pespComObject, ref string arquivo)
        {
            IPreactor preactor = PreactorFactory.CreatePreactorObject(preactorComObject);
            try
            {
                //RECUPERAR OS DADOS DO ARQUIVO CSV
                IList itens = getApontamentosByFileCSV(arquivo);
                if (itens.Count == 0) return 0;

                //LIMPAR TABELA DE APONTAMENTOS
                preactor.Clear("Apontamento");

                preactor.DisplayStatus("Apontamentos","Importando arquivos de apontamentos.");
                var count = itens.Count;
                var i = 0;
                preactor.UpdateStatus(i, count);
                //INSERIR O GRUPO DE REGISTROS
                foreach (var iten in itens)
                {
                    i++;
                    preactor.UpdateStatus(i, count);
                    //CRIAR UM NOVO REGISTRO NA TABELA DE APONTAMENTOS
                    int record = preactor.CreateRecord("Apontamento");

                    //ESCREVER NA TABELA APONTAMENTOS
                    preactor.WriteField("Apontamento", "Ordem", record, iten.Ordem);
                    if (!string.IsNullOrEmpty(iten.Recurso))
                        preactor.WriteField("Apontamento", "Recurso", record, iten.Recurso);
                    if (!string.IsNullOrEmpty(iten.Status))
                        preactor.WriteField("Apontamento", "Status", record, iten.Status);
                    if (iten.DataDeInicio != DateTime.MinValue)
                        preactor.WriteField("Apontamento", "Data de Início", record, iten.DataDeInicio);
                    if (iten.DataDeFim != DateTime.MinValue)
                        preactor.WriteField("Apontamento", "Data de Fim", record, iten.DataDeFim);
                }
                preactor.DestroyStatus();
                //VAMOS SALVAR OS DADOS NA TABELA DO PREACTOR
                preactor.Commit("Apontamento");
                MessageBox.Show("Seus dados foram importados com sucesso!");
            }
            catch (Exception ex)
            {
                preactor.DestroyStatus();
                MessageBox.Show("Falha ao importar os Apontamentos:" + Environment.NewLine + ex.Message);
            }

            return 0;

        }
4º Criei um botão no arquivo de configuração prmdf, já fizemos isso no olá mundo.


5º Cadastrei a ação dentro do Preactor conforme a ação Olá Mundo, acompanhe o passo a passo:

clique em Editar
Clique em "Novo Registro" em seguida "Adicionar->", digite o nome "arquivo" E clique Ok


Vá para o Menu Script de Eventos => Script de Eventos


Clique em "Parameters.."

Clique Sobre o nome "arquivo"


No campo "File Name", adicione o caminho e o nome do arquivo que iremos importar

6º Vamos Testar nossa ação, vá no Visual Studio e aparte a tecla de atalho "F5", e vamos debugar nosso código:



Com isso encerramos nosso primeiro WorkShop, não detalhei as ações pois elas são bem simples, igual uma receita de bolo, basta seguir o passo-a-passo que não tem erro.

Se houver algum dúvida sobre esse workshop me escreva besaleel@msn.com ou faça um comentário aqui no blog que responderei o mais breve possível.

Se preferir faça o download da solução completa do WorkShop 01.