Árvore de páginas

EECAE104 - MsExecAuto Rotina Automática de Container e Lotes

Descrição:

Possibilita a realização das manutenções de Container e Lotes, tais como Inclusão, Alteração e Exclusão através do mecanismo de rotina automática.

Produto:

Microsiga Protheus

Segmento:Comércio Exterior
Módulo:SIGAEEC - Easy Export Control
Rotina:
RotinaNome Técnico
EECAE104.PRW

Container/Lotes

AVGERAL.PRWFunção genérica para os módulos de Comércio Exterior
País(es):Todos
Banco(s) de Dados:Todos Homologados pela TOTVS
Tabelas Utilizadas:

EX9 - Capa do Container/Lotes

EXA - Itens do Container/Lotes

Parâmetros:
NomeTipoDescriçãoObrigatório
nOpcNuméricoOpção: 3=Incluir; 4=Alterar; 5=Excluir;
X
aDadosArray of RecordArray com os dados para integração automáticaX

Observações:

Alguns campos das tabelas de pedidos podem receber o tratamento via dicionario de dados (SX3), o qual permite ser utilizado somente por alguns módulos (X3_USADO).
Para esses casos é necessário executar a preparação do ambiente passando a opção do módulo ativo.

Exemplo: PREPARE ENVIRONMENT EMPRESA "99" FILIAL "01" Modulo "EEC" TABLES "EX9", "EXA"

Integração automática do Pedido de Exportação

Para realizar a inclusão automática de um Container é necessário a utilização da função MsExecAuto utilizando o programa EECAE104 responsável pela manutenção dos Container/Lotes

Para a utilização da rotina automática deve-se utilizar arrays multi dimensionais no envio dos dados para o processamento que segue o mesmo critério dos Containers que são colocados via tela. Esses arrays são definidos da seguinte forma:

Modelo do array:

    1. nome do campo;
    2. dados a serem inseridos;
    3. validação caso queira substituir a validação do dicionário de dados (SX3);

Para o caso de uma alteração e necessidade de deletar um item o mesmo deve receber no array uma linha onde o nome do campo deve ser AUTDELETA e o dado a ser enviado "S" para o caso de excluir o item do pedido ou "N" para manter, ou até mesmo não mandar nada quando não se deseja a exclusão. Abaixo alguns exemplos:

    • O array para o cabeçalho:

aAdd(aCab, {"EX9_PREEMB", EEC->EEC_PREEMB , Nil})

    • O array para os itens que recebe três parâmetros e a cada item deve ser adicionado num array principal para envio dos itens:

aAdd(aItem, {"EXA_PREEMB", EXA->EXA_PREEMB, NIL} )

quando for uma alteração e houver a necessidade de deletar um item deve-se passar a seguinte linha no array do item:

aAdd(aItem, {"AUTDELETA" , "S" , Nil} )

Após passar as informações de um item no array o mesmo deve ser incluído num outro array de itens e dessa forma manter a estrutura definida para cada item:

aadd( aItens, aClone( aItem ))

    • Para o caso de alteração do número do container é necessário passar o conteúdo original no campo de container e uma linha contendo o nome do campo "ATUCONTAIN" e no segundo o valor que será atribuído ao container:

aAdd(aCab, {"ATUCONTAIN",  "00003"  , Nil})


Para um melhor entendimento segue abaixo um RDMake com a inclusão, alteração e exclusão de um Container/Lotes.

RDMake de exemplo para integração automática da rotina de Pedido de Exportação.
#INCLUDE "TOTVS.CH"



User Function IncContainer()
Local cEmbarq  := ""
Local lRot     := .T.


Private lMsErroAuto := .F.

   /************************
   //Inicializa o ambiente
   *************************/
   RpcSetType(3)
   RpcSetEnv("99", "01")
   nModulo := 29
   cModulo := "EEC"
   __CUSERID := "000000"

   cEmbarq := xFilial("EEC") + "EDTRADE-716"

   while lRot
         //Executa a integração para Incluir o container/lote
         If MsgYesNo("Deseja Incluir o Container para o embarque?", "Aviso")
            MyEECAE104(cEmbarq, 3)
         //Executa a Alteração do container/lote
         elseIf MsgYesNo("Deseja Alterar o Container para o embarque?", "Aviso")
            MyEECAE104(cEmbarq, 4)
         //Executa a exclusão do container/lote
         elseIf MsgYesNo("Deseja excluir o Container do embarque?", "Aviso")
            MyEECAE104(cEmbarq, 5)
         //pergunta para sair da rotina de manutenção do container/lotes
         elseIf MsgYesNo("Deseja SAIR da rotina?", "Aviso")
            lRot := .F.
         EndIf
   enddo

Return

static function MyEECAE104(cEmbarq, nOpc)
Local aCab     := {}
Local aItem    := {}
Local aItens   := {}

   if nOpc == 3 // inclusão do container 

      if EEC->( dbsetorder(1),msseek( cEmbarq ) )
         if EE9->( dbsetorder(2),msseek( EEC->EEC_FILIAL+EEC->EEC_PREEMB ) )
            cContainer := "001"
            cLote := "1"
            aCab := {}
            aAdd(aCab, {"EX9_PREEMB", EEC->EEC_PREEMB       , Nil})
            aAdd(aCab, {"EX9_CONTNR", cContainer            , Nil})
            aAdd(aCab, {"EX9_DTRETI", dDatabase             , Nil})
            aAdd(aCab, {"EX9_DTPREV", dDatabase + 5         , Nil})

            While EE9->(!EOF()) .AND. EE9->( EE9_FILIAL+EE9_PREEMB ) == cEmbarq
               aItem := {}
               aAdd(aItem, {"EXA_PREEMB", EE9->EE9_PREEMB        , Nil})
               aAdd(aItem, {"EXA_CONTNR", cContainer             , Nil})
               aAdd(aItem, {"EXA_COD_I" , EE9->EE9_COD_I         , Nil})
               aAdd(aItem, {"EXA_SEQEMB", EE9->EE9_SEQEMB        , Nil})
               aAdd(aItem, {"EXA_LOTE"  , cLote                  , Nil})
               aAdd(aItem, {"EXA_QTDE"  , EE9->EE9_SLDINI        , Nil})
               aAdd(aItem, {"EXA_PESOLQ", EE9->EE9_PSLQUN        , Nil})
               aAdd(aItem, {"EXA_PESOBR", EE9->EE9_PSBRUN        , Nil})
               aAdd(aItens, aItem)
               EE9->( dbskip() )
            EndDo
         EndIf
      EndIf

   elseIf nOpc == 4 // alteração do container 
      if EX9->( dbsetorder(1),msseek(cEmbarq) )

            cContainer := "002"
            cLote := "1"
            aCab := {}
            aAdd(aCab, {"EX9_PREEMB", EX9->EX9_PREEMB       , Nil})
            aAdd(aCab, {"EX9_CONTNR", EX9->EX9_CONTNR       , Nil})
            aAdd(aCab, {"EX9_DTRETI", dDatabase             , Nil})
            aAdd(aCab, {"EX9_DTPREV", dDatabase + 30        , Nil})
            aAdd(aCab, {"ATUCONTAIN", cContainer            , Nil})

            if EXA->( dbsetorder(1),msseek( EX9->(EX9_FILIAL+EX9_PREEMB+EX9_CONTNR) ) )
               while EXA->(!EOF()) .AND. EXA->(EXA_FILIAL+EXA_PREEMB+EXA_CONTNR) == EX9->(EX9_FILIAL+EX9_PREEMB+EX9_CONTNR)

                  aItem := {}
                  aAdd(aItem, {"EXA_PREEMB", EXA->EXA_PREEMB        , Nil})
                  aAdd(aItem, {"EXA_CONTNR", EXA->EXA_CONTNR        , Nil})
                  aAdd(aItem, {"EXA_COD_I" , EXA->EXA_COD_I         , Nil})
                  aAdd(aItem, {"EXA_SEQEMB", EXA->EXA_SEQEMB        , Nil})
                  aAdd(aItem, {"EXA_LOTE"  , cLote                  , Nil})
                  aAdd(aItem, {"EXA_QTDE"  , EXA->EXA_QTDE/2        , Nil})
                  aAdd(aItem, {"EXA_PESOLQ", EXA->EXA_PESOLQ        , Nil})
                  aAdd(aItem, {"EXA_PESOBR", EXA->EXA_PESOBR        , Nil})
                  aAdd(aItens, aItem)

                  aItem := {}
                  aAdd(aItem, {"EXA_PREEMB", EXA->EXA_PREEMB        , Nil})
                  aAdd(aItem, {"EXA_CONTNR", EXA->EXA_CONTNR        , Nil})
                  aAdd(aItem, {"EXA_COD_I" , EXA->EXA_COD_I         , Nil})
                  aAdd(aItem, {"EXA_SEQEMB", EXA->EXA_SEQEMB        , Nil})
                  aAdd(aItem, {"EXA_LOTE"  , soma1(cLote)           , Nil})
                  aAdd(aItem, {"EXA_QTDE"  , EXA->EXA_QTDE/2        , Nil})
                  aAdd(aItem, {"EXA_PESOLQ", EXA->EXA_PESOLQ        , Nil})
                  aAdd(aItem, {"EXA_PESOBR", EXA->EXA_PESOBR        , Nil})
                  aAdd(aItens, aItem)

                  EXA->( dbskip() )
               enddo
            endif

      endif
   elseIf nOpc == 5 // exclusão do container
      if EX9->( dbsetorder(1),msseek(cEmbarq) )
         aCab := {}
         aAdd(aCab, {"EX9_PREEMB", EX9->EX9_PREEMB       , Nil})
         aAdd(aCab, {"EX9_CONTNR", EX9->EX9_CONTNR       , Nil})
      endif
   EndIf

   MsAguarde({|| MSExecAuto( {|X,Y,Z| EECAE104(X,Y,Z)},aCab ,aItens, nOpc) }, "Integrando Container Automático")

   If lMsErroAuto
      MostraErro()
      lMsErroAuto := .F.
   Else
      cAcao := iif( nOpc == 3 , " incluido",iif(nOpc==4," alterado"," excluido"))
      MsgInfo("Container para o embarque "+ alltrim(cEmbarq) + cAcao+" com sucesso!", "Aviso")
   EndIf

Return