Mostrando postagens com marcador Aprenda a programar para o Preactor. Mostrar todas as postagens
Mostrando postagens com marcador Aprenda a programar para o Preactor. Mostrar todas as postagens

quinta-feira, 2 de outubro de 2014

workShop 02 - Treinamento Preactor API

Conforme o primeiro workshop a solução do problema será exposta em tópicos, num formato de passo-a-passo, ok?


1º - Criar uma nova classe workshop02;




2º - Copiar e colar o método de ler o arquivo CSV, e altera-lo para atender o layout do novo arquivo CSV ( AtualizaOrdens.csv);

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];

                        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º - Criar o método de interface com o Preactor, e fazer a função que atualize os dados da tabela de "Apontamento";


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

            try
            {
                preactor.DisplayStatus("Atualizar Apontamentos", "Lendo arquivo CSV...");
                IList itens = getApontamentosByFileCSV(arquivo);
                preactor.DestroyStatus();
                if (itens.Count == 0)
                {
                    MessageBox.Show("O arquivo está em branco.");
                    return 0;
                }
                preactor.DisplayStatus("Atualizar Apontamentos", "Aplicando Atualizações");
                var total = itens.Count;
                var count = 0;
                preactor.UpdateStatus(count, total);
                foreach (var iten in itens)
                {
                    count++;
                    preactor.UpdateStatus(count, total);
                    //BUSCAR A ORDEM NA TABELA DE APONTAMENTOS
                    var record = preactor.FindMatchingRecord("Apontamento", "Ordem", 0, iten.Ordem);
                    if(record < 0)
                        continue;

                    //SÓ AS ORDENS QUE RECEBERAM UM STATUS CONHECIDO
                    switch (iten.Status)
                    {
                        case "Iniciada":
                            preactor.WriteField("Apontamento", "Recurso", record, iten.Recurso);
                            preactor.WriteField("Apontamento", "Status", record, iten.Status);
                            break;
                        case "Liberada":
                            preactor.WriteField("Apontamento", "Recurso", record, iten.Recurso);
                            preactor.WriteField("Apontamento", "Status", record, iten.Status);
                            break;
                        case "Cancelada":
                            preactor.DeleteRecord("Apontamento", record);
                            break;
                        case "Finalizada":
                            preactor.DeleteRecord("Apontamento", record);
                            break;
                    }
                }
                MessageBox.Show("Seus registros foram atualizados com sucesso!");
                preactor.DestroyStatus();
            }
            catch (Exception ex)
            {
                preactor.DestroyStatus();
                MessageBox.Show("Falha ao atualizar os registros de Apontamento: " + Environment.NewLine + ex.Message);
            }
            return 0;

        }



4º - Criar um Botão para chamar a ação do workshop 02;


segue a codificação do Botão:
; ---------------------------------------------------------------------------
; Edit Apontamentos
; ---------------------------------------------------------------------------
;
EDIT_Apontamentos : PREDIT.EXE,
   "/FMT:Apontamento"   /NDS
   "/ActiveX:Atualizar Dados da Tabela:PESP.EventHandler:RunScriptByName:AtualizaApontamento",
   Edit Apontamento,
   Preactor Database Editor,
   Foreground,
   ALWAYS:{RETURN};

;

5º - Criar a Ação Personalizada, dentro do Preactor;





6º - Testar nossa função;

Nesse workshop eu alterei o local de execução da função, não está dentro do quadro de Gantt conforme o workshop 01, isso para que você posso ver a flexibilidade do Preactor quanto a customizações.

A ação será chamada diretamente da tela e edição da tabela de "Apontamentos", em um menu de nome "Ferramentas".


Alguns comandos utilizados

preactor.DisplayStatus("Atualizar Apontamentos", "Aplicando Atualizações");
Exibe uma janela de Status sendo seu primeiro parâmetro o Título da Janela e o segundo o descritivo do Status;

preactor.UpdateStatus(count, total);
Atualiza o Status Bar que está contido na janela, sendo seu primeiro parâmetro andamento do status (inteiro), e o segundo numero que equivale a 100% do Status Bar, pode ser o número total de elementos de uma lista, ou Array, ou mesmo número de elementos de um tabela de banco de dados que estamos lendo;

preactor.DestroyStatus();
Fecha a janela de Status aberta pelo comando DisplaySTatus. Caso você abra um DisplayStatus e se esqueça de fechar, ao chamar sua ação ela irá manter a janela aberta causando um problema para o Preactor, deixado ele inoperante, e para restaurar o Preactor você precisará matar o processo (ctrl + alt + del) e restartar o Preactor.

Dica, por essa razão sempre que você utilizar o DisplayStatus se lembre de colocar dentro do Catch de sua função um DestroyStatus.


Arquivos do work02 para download.

Dúvidas besaleel@msn.com ou comente aqui.

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