quarta-feira, 1 de outubro de 2014

PARTE 2 -Manipulando dados do Preactor - Treinamento Preactor

Nessa segunda parte do treinamento iremos aprender a ler e escrever dados nas tabelas do Preactor utilizando a API do Preactor. Para essa parte do treinamento eu preciso que você faça download do modelo que iremos utilizar, para isso clique aqui.

Faça Download do arquivo "Preactor.prtdf" e o coloque na pasta do modelo que estamos trabalhando (C:\Users\Public\Documents\Preactor Configurations\Preferred Sequence (400 & 500 APS) v11.2).

O que há de diferente nesse arquivo é uma nova tabela que foi criada de nome Apontamento, ela possui a seguinte estrutura:
Apontamento,,0,600:
   Number,0,INTEGER,
      PRIMARY KEY
      HIDDEN:
   Ordem,"",STRING,
      FREE FORMAT (30):
   Recurso,"",STRING,
      FREE FORMAT (30):
   Status,"1",STRING,
      FREE FORMAT (30):
   Data de Início,-1,TIME,
      SHOW DATE:
   Data de Fim,-1,TIME,
      SHOW DATE:
   Import Marker,-1,INTEGER,
      DIALOG LEVEL 99
      DIALOG ONLY
      READ ONLY
      IMPORT MARKER;


O que podemos aprender ao ver o código da tabela:

Cabeçalho: "Apontamento,,0,600:"
Table: Apontamento
Total de Registros permitido pela tabela: 600
Fields: Number, Ordem, Recurso, Status, Data de Início, Data de Fim, Import Marker;

Iremos utilizar essas informações para podermos ler e gravar dados na tabela Apontamento.

Abra o Preactor para que as alterações do arquivo "preactor.prtdf" sejam incorporadas ao modelo.

Clique em sim.



Criando um novo registro, lendo e escrevendo dados no Preactor

Esse nosso primeiro contato com o API da Preactor será em torno de três funções básicas que são responsáveis por grande parte de nosso trabalho ao customizar um software, Ler dados, escrever e Criar novos registros. 

A sintaxe é bem simples, vejam os código logo abaixo:

public int Run(ref PreactorObj preactorComObject, ref object pespComObject)
        {
            IPreactor preactor = PreactorFactory.CreatePreactorObject(preactorComObject);
            
            //CRIAR UM NOVO REGISTRO NA TABELA DE APONTAMENTOS
            int record = preactor.CreateRecord("Apontamento");
            
            //ESCREVER NA TABELA APONTAMENTOS
            preactor.WriteField("Apontamento", "Ordem", record, "ORD-001");
            //obs:
            //A Função WriteField possui 4 parametros básicos
            // 1º - Tabela, 
            // 2º - Campo da tabela(Field), 
            // 3º - Numero do Registro, 
            //4 - Valor que vamos escrever no banco de dados

            preactor.WriteField("Apontamento", "Recurso", record, "Packing Line 2");
            preactor.WriteField("Apontamento", "Status", record, "Iniciada");
            preactor.WriteField("Apontamento", "Data de Início", record, new DateTime(2000,10,01,11,00,00));
            preactor.WriteField("Apontamento", "Data de Fim", record, new DateTime(2000, 10, 01, 12, 30, 00));
            //OBSERVAÇÃO, OS CAMPOS Number, e Import Marker são de uso do Preactor, 
            //não precisamos preencher esses campos;

            //VAMOS SALVAR OS DADOS NA TABELA DO PREACTOR

            preactor.Commit("Apontamento");
            return 0;
        }



Para ler os dados Gravados na tabela iremos utilizar duas funções, uma para contar o número total de registros da tabela e a outra para ler os dados da tabela.
  public int Lendo(ref PreactorObj preactorComObject, ref object pespComObject)
        {
            IPreactor preactor = PreactorFactory.CreatePreactorObject(preactorComObject);

            //CRIAR UM NOVO REGISTRO NA TABELA DE APONTAMENTOS
            int count = preactor.RecordCount("Apontamento");

            IList ordens = new List();
            //VAMOS LER TODAS AS ORDENS E GRAVAR SEU VALOR NA LISTA
            for (int record = 1; record <= count; record++)
            {
                //VAMOS LER OS DADOS DA TABELA (parametros: tabela, campo, número do registro)
                string ordem = preactor.ReadFieldString("Apontamento", "Ordem", record);
                ordens.Add(ordem);
                //OS DADOS SÃO SALVOS DE FORMA SEQUENCIAL, MESMO EXCLUINDO
                //UM REGISTRO DO MEIO DA FILA, A FILA É REORDENADA
                //NÃO DEIXANDO BURRACOS

            }
            MessageBox.Show("O número de registros lidos:" + ordens.Count());
            return 0;
        }



Outras funções de Manipulação de dados:


public void DeletarRegistro(IPreactor preactor, int record)
{
            //EXCLUI UM ÚNICO REGISTRO
            preactor.DeleteRecord("Apontamento", record);

            //PARA LIMPAR A TABELA EXCLUINDO TODOS OS REGISTROS
            preactor.Clear("Apontamento");
}


Mas para frente abordaremos como busca uma string dentro de um campo de uma tabela.



WorkShop 01


Faça uma função que importe um arquivo CSV (download arquivo CSV ) de apontamentos, e salve os dados na tabela "Apontamento" do Preactor. Mas antes de salvar limpe sempre a tabela.

tente fazer o workshop sem olhar a resposta (workShop 01)

segunda-feira, 29 de setembro de 2014

Parte 1 – Configurando o ambiente de trabalho - Treinamento Preactor

Bem vamos começar a trabalhar? Para isso precisamos criar nosso ambiente de trabalho, faça download dos itens necessários e instale-os
  • ·         Guia de instalação do SQL Server – Clique aqui;
  • ·         Guia de Instalação Preactor 11.2 – Clique Aqui;
  • ·         Guia de Instalação Preactor 12.1 – Clique Aqui;
  • ·         Guia de Instalação do Visual Studio – Clique Aqui;


Você poderá ter instalado em sua máquina mais de uma versão do Preactor sem problemas, ok?

Configuração do Visual Studio

Ao instalar em sua máquina o Preactor ele disponibiliza uma pasta chamada SDK, onde nela contém todos as bibliotecas que iremos utilizar para desenvolver nossas funções.
Então para iniciarmos nossos trabalhos vamos até essa pasta, que possivelmente está contida em:
  • Computador 64x: C:\Program Files (x86)\Preactor International\Preactor11.2\SDK
  • Computador 86x: C:\Program Files\Preactor International\Preactor11.2\SDK

Nessa pasta estará contidos 3 arquivos:
  • ·         Guia de referencia da API Preactor (Preactor API Documentation.chm);
  • ·        Templates para Visual Studio 2008 (VS2008 Templates.vsi)
  • ·        Templates para Visual Stduio 2010 (VS2010 Templates.vsix)

Além de um pasta contendo as dll do Preactor, que utilizaremos para acessar as funções do Preactor;

Para instalar os templates, basta dar um duplo clique encima do nome do template:

Next
Finish

Close

Gerando um Projeto para trabalhar com o Preactor

1º - Criando o Projeto no Visual Studio, com a linguagem C#;

2º - Escolher o template instalado do Preactor;



3º - Veja que ao criar o Projeto, ele já adicionou as bibliotecas do Preactor;



4º - Adicionando uma classe que irá fazer conexão do nosso projeto ao Preactor, essa conexão será realizada através do método Run da Classe;



5º - Classe "Action", é a classe de inteface entre o Preactor e o nosso projeto. Veja que o Método Run possui dois parâmetros, mas para frente se houver necessidade detalharemos mais sobre esses parâmetros;



6º - Configurações do Projeto




Bem, com isso nosso projeto está criado e pronto para iniciarmos nossos trabalhos junto ao Preactor. Para isso vamos escolher um modelo do Preactor que foi copiado para sua máquina ao instalar o Preactor. 

Extraindo a Modelagem Preactor


Vá nos "Meus Documentos" de seu computador, entre na pasta "Preactor Configurations", "Preferred Sequence (400 & 500 APS) v11.2" e dê um duplo clique sobre o arquivo do modelo de nome "Preferred Sequence Example (400 & 500 APS).prpkg". Com isso o Preactor irá abrir uma tela para que você possa Instalar o modelo em sua máquina e usa-lo.






Olá Mundo


Com o Projeto devidamente configurado e o modelo extraído podemos criar nossa primeira interação entre o Preactor e o C#.Net;

  1. Adicione a Referencia em seu projeto system.windows.forms;
  2. crie uma MessageBox.Show("Olá Mundo!"); dentro do método Run da Classe "Action";
  3. Vamos Criar um botão no arquivo de configuração "Preactor.prmdf", que está localizado na Pasta do Modelo,    "/ActiveX:Olá Mundo: PESP.EventHandler:RunScriptByName: OlaMundo"
  4. Vá no visual Studio, Menu Debug, "Starting Debugging", ou aperte a tecla "F5";
  5. Abra o modelo:
  6. Vamos configurar a Ação Olá Mundo, Vá no menu "Configuração" => "Scriprs de Eventos" => "Ações Personalizadas", clique em "Editar" => "Inserir", e preencha o formulário com os dados de seu Projeto:


8. Para finalizar vamos criar a chamada da Ação Personalizada pelo Botão "OlaMundo".Vá em  "Configuração" => "Scriprs de Eventos" =>   "Scriprs de Eventos" => "Editar" => "Inserir" e preenche o formulário conforme imagem abaixo:



Para finalizar essa primeira parte de nosso tutorial, vamos no menu principal, e abrir o quadro de Gantt, e executar nossa ação:



Com isso finalizo essa primeira parte de nosso tutorial, até a próxima:

PARTE 3 - Buscando registros no Preactor;


Treinamento Preactor APS – Interface de customização API

Para quem não sabe o que é o Preactor:

O Preactor é um sistema avançado para planejamento e sequenciamento do Produção. Sua função é distribuir as ordens de produção ao longo do tempo, levando em consideração N variáveis que possam interferir no processo de produção do produto final.

Os softwares APS são ferramentas especializadas em soluções avançadas de planejamento e programação de operações, capazes de levar em consideração, praticamente todas as variáveis e restrições inerentes ao ambiente produtivo, gerando planos de produção viáveis e factíveis.

O que veremos neste treinamento?

O objetivo desse treinamento é dar orientação básicas sobre o API de desenvolvimento da Preactor. Para isso iremos trabalhar os seguintes tópicos:
  • ·         Funções de Leitura e escrita;
  • ·         Criando Scripts de Integração;
  • ·         Gerando Relatórios para o Preactor;
  • ·         Criando Regras de Sequenciamento personalizadas;

O Preactor está na versão 12 sp1 mas como essa versão está apresentando alguns bugs, o treinamento estará focado na versão mais estável do Preactor 11 sp 2, mas se você preferir, poderá utilizar a versão mais nova do sistema sem grandes problemas.

NOTA, os bugs da versão 12.1 encontrados são:

  • ·         Falha na função TestOperation, entra em loop infinito quando há ordens com quantidade zero sequenciados ou se o testeOP for realizado nessa ordem;
  • ·         Falha na Função GetProcessQuantity, entra em loop infinito quando há ordens com quantidade zero sequenciados ou se o testeOP for realizado nessa ordem;
  • ·         Falha na Função FindMathRecord, Ela não encontra o valor buscado quando o campo que estamos realizando a busca for uma EVALUATE field;
  • ·         Estouro de Memória: Em alguns casos o mal uso de funções recursivas tem causado estou de memória física e o software é fechado;


Requisitos do sistema:

  • SQL Server Express 2008 R2 ou superior – Download
  • Preactor 11.2 – Download
  • Visual Studio Express 2008 ou Superior – Download

Links para download das versões mais recentes do Preactor:



Agora vamos ao que interessa:

PARTE 1 - Configurando o ambiente de trabalho;
PARTE 2 - Lendo e escrevendo dados nas tabelas do Preactor;
PARTE 3 - Buscando e Atualizando dados do Preactor;
PARTE 4 - Manipulando o quadro de Gantt e Criando uma regra de sequenciamento Personalizada - Treinamento API Preactor;

sexta-feira, 1 de agosto de 2014

SAP .Net Connector 3.0 - Net Framework 4.0 - Executando uma RFC e lendo os dados de uma tabela - Parte 3

Parte 3


Para encerrar o tutorial veremos como acessar os dados de uma RFC e como gravar dados em uma tabela dentro da RFC. Para isso daremos continuidade ao nosso projeto.

Serei bem direto nessa etapa pois creio que o código fonte fala por si só.


Lendo os dados de uma tabela

1º criei um classe de nome Material para receber os dados da tabela que iremos ler:

Public Class Material
    Private _code As String
    Private _descricao As String
    Private _quantidade As Double

    Public Property Code As String
        Get
            Return _code
        End Get
        Set(value As String)
            _code = value
        End Set
    End Property

    Public Property Descricao As String
        Get
            Return _descricao
        End Get
        Set(value As String)
            _descricao = value
        End Set
    End Property

    Public Property Quantidade As Double
        Get
            Return _quantidade
        End Get
        Set(value As Double)
            _quantidade = value
        End Set
    End Property
End Class

2º criei um método dentro da classe RfcTableReader de nome getMateriais, onde iremos ler os dados da tabela SAP e montar uma lista de materias:


Public Function getMateriais(ByRef rfcFunction As IRfcFunction) As IList(Of Material)
        Try
            'RECUPERANDO A TABELA TB_MATERIAIS DA RFC
            Dim rfcTabMateriais As IRfcTable = rfcFunction.GetTable("TB_MATERIAIS")
            'CRIANDO UMA LISTA QUE IRÁ CONTER DOS DADOS LIDOS DA RFC-TABLE
            Dim itens As IList(Of Material) = New List(Of Material)

            'EXECUTANDO O LOOP DOS DADOS DA TABELA SAP
            For Each row As IRfcStructure In rfcTabMateriais
                Dim it As New Material
                'TESTANDO SE O EXISTE VALOR NA VARIAVEL SAP
                If Not (IsDBNull(row.GetValue("DSCODE"))) Then
                    it.Code = row.GetString("DSCODE")
                End If
                If Not (IsDBNull(row.GetValue("DSDESCRIPT"))) Then
                    it.Descricao = row.GetString("DSDESCRIPT")
                End If
                If Not (IsDBNull(row.GetValue("DSQUANT"))) Then
                    it.Quantidade = row.GetString("DSQUANT")
                End If
                'VERIFICANDO SE O MATERIAL POSSUI CÓDIGO
                If Not String.IsNullOrEmpty(it.Code) Then
                    itens.Add(it) 'ADD REGISTRO A LISTA
                End If
            Next
            Return itens
        Catch exSap As RfcAbapRuntimeException
            Throw New Exception("ABAP error run Time: " & exSap.Message)
        Catch exSap As RfcAbapBaseException
            Throw New Exception("ABAP base error" & exSap.Message)
        Catch ex As Exception
            Throw
        End Try
    End Function


leia atentamente os comentários que estão dentro da função para que você tenha maior conhecimento da mesma, ok?

3º Executando a RFC e lendo os dados da tabela Material utilizando o que criamos até o momento:

Antes alguns detalhes importantes,
Criando uma instancia IRfcFunction, ela serve para executar todos os comandos da RFC e dentro dela estão contidas todas as tabelas, parametros etc dessa função.
No nosso exemplo iremos chamar a RFC "FRC_MATERIAL":
Dim rfcFunction As IRfcFunction = repositorio.CreateFunction("RFC_MATERIAL")

Após chamar a RFC é necessário a passagens dos parametros da função, caso necessário, como data, período, usuário, lote etc, cada RFC possui seus próprios parâmetros.
rfcFunction.SetValue("DATA", Now)
rfcFunction.SetValue("USER", "camilo.correa.silva.silva")

Para finalizar essas observações, após definir a RFC, passar os devidos parâmetros, basta invocar a função, ou executa-la. Para isso você irá utilizar a função "invoke" e passar para ela as configurações de acesso definidas na segunda parte desse tutorial [ 2ª parte ].
rfcFunction.Invoke(dest)

Veja como ficou nosso código:
   Public Sub LerDadosRFC()
        Try
            '1º - MONTAR OS PARAMETROS PARA CONEXÃO SAP
            Dim con As New SAPConnect()
            'A FUNÇÃO REGISTER ABRE A CONEXÃO COM SAP
            RfcDestinationManager.RegisterDestinationConfiguration(con)
            Dim dest As RfcDestination = RfcDestinationManager.GetDestination("homologacao")
            Dim repositorio As RfcRepository = dest.Repository
            Try
                'CHAMANDO A RFC - PASSANDO PARAMETROS
                Dim rfcFunction As IRfcFunction = repositorio.CreateFunction("RFC_MATERIAL")

                'PASSANDO OS PARAMETROS DE LEITURA DA RFC
                rfcFunction.SetValue("DATA", Now)
                rfcFunction.SetValue("USER", "camilo.correa.silva.silva")

                'EXECUTANDO A RFC
                rfcFunction.Invoke(dest)

                'CHAMANDO A FUNÇÃO QUE LÊ OS DADOS CONTIDOS NA TABLE DA RFC
                Dim materiais As IList(Of Material) = getMateriais(rfcFunction)

            Catch exSap As RfcAbapRuntimeException
                Throw New Exception("ABAP error run Time: " & exSap.Message)
            Catch exSap As RfcAbapBaseException
                Throw New Exception("ABAP base error" & exSap.Message)
            Catch ex As Exception
                Throw
            Finally
                'FECHA A CONEXÃO COM SAP
                RfcDestinationManager.UnregisterDestinationConfiguration(con)
            End Try

        Catch exSap As RfcCommunicationException
            Throw New Exception("Falha na comenicação com SAP: " & exSap.Message)
        Catch exSap As RfcLogonException
            Throw New Exception("Falha no Login: " & exSap.Message)
        Catch ex As Exception
            Throw New Exception("Erro: " & vbCrLf & ex.Message)
        End Try
    End Sub

4º Gravando dados em uma tabela do SAP

As funções para leitura e gravação são bem parecidas e intuitivas, por exemplo, para se ler um campo de uma tabela SAP getValue("NOME DO CAMPO"), para se escrever em um campo, setValue("NOME DO CAMPO", valor). 
Dito isso, existe apenas um comando a mais que deve ser inserido para gerar uma nova linha na tabela SAP antes de inserirmos os valores, que é o comando "Append()"

Veja logo baixo como ficou nosso código de gravação em uma tabela SAP:

 Public Sub GravarDadosRFC(ByVal materiais As IList(Of Material))
        Try

            '1º - MONTAR OS PARAMETROS PARA CONEXÃO SAP
            Dim con As New SAPConnect()
            'A FUNÇÃO REGISTER ABRE A CONEXÃO COM SAP
            RfcDestinationManager.RegisterDestinationConfiguration(con)
            Dim dest As RfcDestination = RfcDestinationManager.GetDestination("homologacao")
            Dim repositorio As RfcRepository = dest.Repository
            Try
                'CHAMANDO A RFC - PASSANDO PARAMETROS
                Dim rfcFunction As IRfcFunction = repositorio.CreateFunction("RFC_MATERIAL")

                'PASSANDO OS PARAMETROS DE LEITURA DA RFC
                rfcFunction.SetValue("DATA", Now)
                rfcFunction.SetValue("USER", "camilo.correa.silva.silva")

                'INSTANCIANDO A TABELA MATERIAL
                Dim rfcTabMateriais As IRfcTable = rfcFunction.GetTable("TB_MATERIAIS")

                'INSERINDO OS REGISTROS DA TABELA DO SAP
                For Each material As Material In materiais
                    'CRIAR UM NOVO REGISTRO NA TABELA
                    rfcTabMateriais.Append()
                    'PASSANDO OS VALORES PARA TABLE
                    rfcTabMateriais.SetValue("DSCODE", material.Code)
                    rfcTabMateriais.SetValue("DSDESCRIPT", material.Descricao)
                    rfcTabMateriais.SetValue("DSQUANT", material.Quantidade)
                Next

                'EXECUTANDO A RFC e INSERINDO OS VALORES
                rfcFunction.Invoke(dest)
              
            Catch exSap As RfcAbapRuntimeException
                Throw New Exception("ABAP error run Time: " & exSap.Message)
            Catch exSap As RfcAbapBaseException
                Throw New Exception("ABAP base error" & exSap.Message)
            Catch ex As Exception
                Throw
            Finally
                'FECHA A CONEXÃO COM SAP
                RfcDestinationManager.UnregisterDestinationConfiguration(con)
            End Try

        Catch exSap As RfcCommunicationException
            Throw New Exception("Falha na comenicação com SAP: " & exSap.Message)
        Catch exSap As RfcLogonException
            Throw New Exception("Falha no Login: " & exSap.Message)
        Catch ex As Exception
            Throw New Exception("Erro: " & vbCrLf & ex.Message)
        End Try
    End Sub



Conclusão


Podemos perceber que para fazer uma integração com SAP via RFC é bem simples. Para isso você deve saber meia dúzia de comandos e ter uma código bem estruturado.

Espero que tenha conseguido ajudar pessoas que como eu tiveram dificuldade de fazer sua primeira integração .Net com SAP.

Se existir alguma dúvida sobre meu código basta me escrever ou postar um comentário, ok?

Para finalizar, como eu havia prometido, segue o link para download da solução que desenvolvemos para esse tutorial:

[ Solução .Net 4.0, visual Studio 2010 RFC Tutorial ]
senha para desconpacta: besaleel.blogspot.com.br