Histórico da Página
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 e DCR_IDOPER com o mesmo valor do original. 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 ou Código do Script : 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. |
---|