Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

 Este documento é material de especificação dos requisitos de inovação, trata-se de conteúdo extremamente técnico.                                                             

  

Informações Gerais

 

Especificação

Produto

Microsiga Protheus

Módulo

SIGAWMS

Segmento Executor

Distribuição e Logística

Projeto1

M_DL_WMS002

IRM1

PCREQ-_

Requisito1

PCREQ-_

Subtarefa1

PDRDL-_

Chamado2

 

Release de Entrega Planejada

11.80.14

Réplica

 

País

(x) Brasil  (  ) Argentina  (  ) Mexico  (  ) Chile  (  ) Paraguai  (  ) Equador

(  ) USA  (  ) Colombia   (  ) Outro _____________.

Outros

 

   Legenda: 1 – Inovação 2 – Manutenção (Os demais campos devem ser preenchidos para ambos os processos). 

Objetivo

O plano de expedição consiste na aglutinação dos mesmos produtos de diferentes cargas/pedidos ao executar uma ordem de serviço de expedição. A ideia é que seja possível selecionar as ordens de serviço que serão consideradas na aglutinação. Neste primeiro momento, é levado em consideração apenas produtos de pedidos da mesma montagem de carga, posteriormente será criado uma tela para selecionar inclusive pedidos de cargas diferentes. Esta ação otimiza a busca de saldo no armazém priorizando a expedição de endereços de tipo pulmão quando a junção dos pedidos que compõe o plano solicitarem uma quantidade maior que uma norma do produto.

Definição da Regra de Negócio

 

Alteração:

A execução das ordens de serviço pelo WMSA150 realiza uma busca das DCF selecionadas e uma por uma posiciona no registro e chama o método ExecuteDCF, a ideia é logo após o posicionamento utilizar das características do registro para buscar as ordens que podem ser aglutinadas. Encontrado os dados, será somado a variável da quantidade do DCF posicionado no objeto com as quantidades de todas as ordens de serviço do array e a partir desse ponto segue o fluxo normal, mas será precisa alterar também o status de cada DCF, para que não seja executada em seguida, e a criação da DCR para respeitar o array de ordens aglutinadas encontradas, o que mantém o funcionamento do estorno.

Detalhes Alteração:

Primeiramente, deve conter no dicionário o parâmetro MV_WMSACEX que pode ser criado aplicando o update WMSU0033, acessado via WMSUMAIN.

Alterar a classe WMSDTCOrdemServico com a criação dos atributos:

  • cPlnExp > Código do plano de expedição
  • aOrdAglu > Array de ordens de serviço aglutinadas

*Lembrando que a criação de cada atributo precisa vir com os métodos Getters e Setters correspondentes.

Como o atributo cPlnExp da classe corresponde ao campo DCF_PLNEXP, ele precisa ser considerado nos métodos LoadData (utilizar FieldPos ao atribuir o valor) , RecordDCF e UpdateDCF (utilizar o método Getter e Setter criado).

 

Quando o parâmetro MV_WMSACEX for diferente de '0' e o serviço em execução for de separação (Self:oServico:ChkSepara()), dentro do método ExecuteDCF da classe WMSDTCOrdemServicoExecute logo após a validação se o 'Self:cIdDCF' está preenchido, criar a chamada de um método que realizará a busca das ordens de serviço semelhantes e adicionará ao array aOrdAglu. Este método precisa ser criado na WMSDTCOrdemServico para futuras aplicações.

O select de busca precisa prever a informação do campo DCF_PLNEXP e para o filtro deve ser utilizado os atributos da classe.

Quando o atributo cPlnExp possuir valor diferente de vazio, o filtro precisa respeitar o plano de expedição, serviço, armazém, produto, lote, sub-lote, endereço e status diferente de '3=Executado', quando estiver vazio, precisa considerar a carga e a função WMSCarga() ao invés do plano de expedição. Quando MV_WMSACEX for '2', considerar no filtro o cliente e loja, conforme exemplo:

 

         DCF.DCF_FILIAL = '"+xFilial("DCF")+"'

AND DCF.DCF_SERVIC = '"+Self:oServico:GetServico()+"'

AND DCF.DCF_CODPRO = '"+Self:oProdLote:GetProduto()+"'

If MV_WMSACES == '2' // Se aglutina por cliente

AND DCF.DCF_CLIFOR = '"+Self:GetCliFor()+"'

AND DCF.DCF_LOJA   = '"+Self:GetLoja()+"'

EndIf

If !Empty(Self:GetPlnExp())

AND DCF.DCF_PLNEXP = '"+Self:GetPlnExp()+"'

ElseIf WmsCarga(Self:GetCarga())

AND DCF.DCF_CARGA = '"+Self:GetCarga()+"'

EndIf

AND DCF.DCF_LOCAL  = '"+Self:oOrdEndOri:GetArmazem()+"'

AND DCF.DCF_ENDER  = '"+Self:oOrdEndOri:GetEnder()+"'

AND DCF.DCF_LOTECT = '"+Self:oProdLote:GetLoteCtl()+"'

AND DCF.DCF_NUMLOT = '"+Self:oProdLote:GetNumLote()+"'

AND DCF.DCF_STSERV <> '3'

AND DCF.D_E_L_E_T_ = ' '

*Importante manter esta ordem no filtro do select para que o banco de dados utilize do índice mais apropriado. Deixar um comentário a respeito.

Retornar os campos DCF_ID, DCF_NUMSEQ, DCF_QUANT, R_E_C_N_O_ e adicionar cada linha no array aOrdAglu.

Incrementar em uma variável o DCF_QUANT para que depois seja substituído a quantidade do objeto Self:nQuant pela quantidade sumarizada.

 

Voltando para o método ExecuteDCF da classe WMSDTCOrdemServicoExecute, alterar o bloco que atualiza o status da DCF posicionada no objeto para repetir para cada recno do aOrdAglu quando Len(aOrdAglu) > 0.

O bloco que precisa repetir para atualizar o status é:

// Atualiza status

Self:SetStServ('3')

Self:SetOk("")

Self:UpdateDCF()

Self:UpdStatus()

*Importante manter o funcionamento atual do método quando o sistema não utilizar a funcionalidade, ou seja, quando o parâmetro MV_WMSACEX for igual a '0'.

Porém será preciso reposicionar o objeto para atualizar cada DCF. Utilizar o método GoToDCF(nRecno), passando o recno de cada DCF do array por parâmetro. Ao terminar o laço de atualização do status, é preciso voltar a DCF posicionada original para que o Self:UnLockDCF() realize sua função corretamente, assim como o restante do processo.

 

Assim como a atualização do status para cada ordem de serviço, é preciso criar os registros DCR. Na classe WMSDTCMovimentosServicoArmazem método RecordD12, alterar o bloco "Grava relacionamento movimento serviço armazém" para cada ordem de serviço do array quando Len(aOrdAglu) > 0, substituindo...

oRelacMov:SetIdDCF(cIdDCF)

oRelacMov:SetSequen(cSequen)

Pelos valores do array aOrdAglu, assim como a quantidade de cada DCF. Utilizar de uma variável auxiliar para atribuir a quantidade do array para não alterar a variável utilizada atualmente.

Os registros DCR desse movimento precisam ter o mesmo DCR_IDORI, que seria o iddcf do próprio objeto, não precisando ser alterado. DCR_IDMOV, DCR_IDOPER e DCR_IDOPER QUANT com o mesmo valor do originalmétodo. DCR_QUANT, DCF_IDDCF e DCR_SEQUEN correspondente a cada registro do array.

Neste passo não é preciso voltar o objeto oRelacMov para o valor posicionado original, mas ele deve continuar com o funcionamento atual quando Len(aOrdAglu) == 0 e, como não estamos na classe WMSDTCOrdemServico, validar se o array tem sua definição correta (Type("Self:oOrdServ:aAgluDCF") == "A").

 

Rotina

Tipo de Operação

Opção de Menu

Regras de Negócio

WMSDTCOrdemServico

Alteração

 

 

WMSDTCOrdemServicoExecute

Alteração

 

 

WMSDTCMovimentosServicoArmazem

Alteração

 

 

 

Exemplo de Aplicação:

  • Configurar o parâmetro MV_WMSACEX com o valor '1=Aglutina por Carga' ou '2=Aglutina por Carga/Cliente'
  • Criar vários pedidos de venda que realizam montagem de carga e que geram o serviço WMS na montagem de carga, com os mesmos produtos entre eles.
  • Criar uma ou mais cargas com os pedidos criados
  • Ao executar os serviços, os movimentos da D12 devem juntar a quantidade dos produtos iguais em um único movimento respeitando a norma.
  • Verificar se os dados da DCR consistem
  • Estornar e executar várias vezes para garantir que o estorno não deixe lixo na base 

Tabelas Utilizadas

  • DCF – Ordem de Serviço

  • D12 – Movimentos Serviço WMS

  • DCR – Relacionamento Movimentos Distribuição

 

 

Dicionário de Dados


Arquivo : DCF – Ordem de Serviço

  

Campo

DCF_PLNEXP

Tipo

C

Tamanho

6

Valor Inicial

 

Mandatório

Sim (  ) Não (x)

Descrição

Plano de Expedição

Título

Plano Exped.

Picture

@!

Help de Campo

Código do plano de expedição.

 

 

 

 

 Este documento é material de especificação dos requisitos de inovação, trata-se de conteúdo extremamente técnico.