P145NUMOP - Manipulação do número das ordens de produção do MRP
Linha de Produto: | Protheus | ||||||||||||||||||
Segmento: | Manufatura | ||||||||||||||||||
Módulo: | SIGAPCP - Planejamento e Controle da Produção | ||||||||||||||||||
Parâmetro(s): |
| ||||||||||||||||||
Idiomas: | Todos | ||||||||||||||||||
País(es): | Todos | ||||||||||||||||||
Banco(s) de Dados: | Todos | ||||||||||||||||||
Sistema(s) Operacional(is): | Todos |
Ponto de Entrada
| Descrição: | O ponto de entrada P145NUMOP permite manipular o número das ordens de produção que serão geradas pelo MRP. |
| Localização: | Função PCPA145OP. |
| Eventos: | Após a abertura da thread para criação da ordem de produção. |
| Programa Fonte: | PCPA145.PRW |
Sintaxe: | P145NUMOP( ) → aRetorno |
| Retorno: | O ponto de entrada deve retornar um array com as seguintes informações: aRetorno[1] → Valor para o campo C2_NUM; aRetorno[2] → Valor para o campo C2_ITEM; aRetorno[3] → Valor para o campo C2_SEQUEN; aRetorno[4] → Valor para o campo C2_ITEMGRD; aRetorno[5] → Valor para o campo C2_GRADE (Somente "S" ou " "). |
| Observações: | O controle de geração da numeração da ordem de produção deverá ser feito inteiramente dentro do ponto de entrada, inclusive tratativas para não gerar numeração duplicada no processo em multi-thread. Não é permitida a utilização de qualquer componente de interface gráfica nesse ponto de entrada, visto que a função será executada em background e em múltiplas threads simultaneamente. |
#INCLUDE "PROTHEUS.CH"
Static _nTamC2Num := GetSx3Cache("C2_NUM" , "X3_TAMANHO")
Static _nTamC2Ite := GetSx3Cache("C2_ITEM" , "X3_TAMANHO")
Static _nTamC2Seq := GetSx3Cache("C2_SEQUEN" , "X3_TAMANHO")
Static _nTamItGrd := GetSx3Cache("C2_ITEMGRD", "X3_TAMANHO")
User Function P145NumOP()
Local aChaves := {}
Local aDataHWC := PARAMIXB[1]
Local aRetorno := Array(5)
Local cChaveGbl := ""
Local cChaveGrd := ""
Local cChvGrdPrd := ""
Local cGrade := "MONITOR"
Local cOPPai := PARAMIXB[2]
Local cProduto := ""
Local lGrade := .F.
// Verifica se o produto possui grade
cProduto := aDataHWC[1]
// Possui grade se o código do produto iniciar com o nome da grade ou se a op pai já tiver grade
lGrade := SubStr(cProduto, 1, Len(cGrade)) == cGrade .Or. !Empty(SubStr(cOpPai, _nTamC2Num+_nTamC2Ite+_nTamC2Seq+1, _nTamItGrd))
If !lGrade
// Sem grade de produto
If Empty(cOPPai)
aRetorno[1] := GetNumSC2(.T.) //C2_NUM
aRetorno[2] := "01" //C2_ITEM
aRetorno[3] := "001" //C2_SEQUEN
aRetorno[4] := " " //C2_ITEMGRD
aRetorno[5] := " " //C2_GRADE
// Monta chave global
cChaveGbl := "NUM_OP" + aRetorno[1] + aRetorno[2]
// Guarda a sequencia na global para incrementar depois
PutGlbValue(cChaveGbl, aRetorno[3])
Else
aRetorno[1] := SubStr(cOpPai, 1, _nTamC2Num)
aRetorno[2] := SubStr(cOpPai, _nTamC2Num+1, _nTamC2Ite)
aRetorno[4] := " "
aRetorno[5] := " "
// Monta chave global
cChaveGbl := "NUM_OP" + aRetorno[1] + aRetorno[2]
// Tenta adquirir o lock da global
While !GlbNmLock(cChaveGbl)
Sleep(100)
End
// Recupera a sequencia anterior da global
aRetorno[3] := GetGlbValue(cChaveGbl)
// Incrementa a sequencia
aRetorno[3] := Soma1(aRetorno[3])
// Salva nova sequencia na global
PutGlbValue(cChaveGbl, aRetorno[3])
// Libera o lock para outras threads
GlbNmUnlock(cChaveGbl)
EndIf
Else
// Com grade de produto
If Empty(cOPPai)
// Monta a chave da global que irá armazenar o número das ops desta grade
cChvGrdPrd := "GRADE_PRODUTO_" + cGrade
// Adquire o lock
While !GlbNmLock(cChvGrdPrd)
Sleep(100)
End
// Recupera o número da op desta grade
aRetorno[1] := GetGlbValue(cChvGrdPrd)
// Gera o número da op se não existir.
If Empty(aRetorno[1])
aRetorno[1] := GetNumSC2(.T.)
EndIf
// Guarda o número da op para os outros produtos da grade
PutGlbValue(cChvGrdPrd, aRetorno[1])
// Libera o lock para outras threads
GlbNmUnlock(cChvGrdPrd)
aRetorno[2] := "01"
aRetorno[3] := "001"
aRetorno[5] := "S"
// Monta a chave para controlar o item da grade
cChaveGrd := "GRADE_OP" + aRetorno[1] + aRetorno[2] + aRetorno[3]
// Tenta adquirir o lock da global
While !GlbNmLock(cChaveGrd)
Sleep(100)
End
// Recupera o valor do item grade
aRetorno[4] := GetGlbValue(cChaveGrd)
// Se não existir inicia o primeiro item, se não incrementa
If Empty(aRetorno[4])
aRetorno[4] := "001"
Else
aRetorno[4] := Soma1(aRetorno[4])
EndIf
// Grava o novo item grade na global
PutGlbValue(cChaveGrd, aRetorno[4])
// Libera o lock para outras threads
GlbNmUnlock(cChaveGrd)
// Monta chave global
cChaveGbl := "NUM_OP" + aRetorno[1] + aRetorno[2] + aRetorno[4]
// Guarda a sequencia na global para incrementar depois
PutGlbValue(cChaveGbl, aRetorno[3])
While !GlbNmLock("CHAVES_P145NUMOP")
Sleep(100)
End
// Salva as chaves para limpar no fim do processamento
If GetGlbVars("CHAVES_P145NUMOP", @aChaves)
aAdd(aChaves, cChvGrdPrd)
aAdd(aChaves, cChaveGrd)
PutGlbVars("CHAVES_P145NUMOP", aChaves)
Else
PutGlbVars("CHAVES_P145NUMOP", {cChvGrdPrd, cChaveGrd})
EndIf
GlbNmUnlock("CHAVES_P145NUMOP")
Else
// Recupera valores da op pai
aRetorno[1] := SubStr(cOpPai, 1, _nTamC2Num)
aRetorno[2] := SubStr(cOpPai, _nTamC2Num+1, _nTamC2Ite)
aRetorno[4] := SubStr(cOpPai, _nTamC2Num+_nTamC2Ite+_nTamC2Seq+1, _nTamItGrd)
aRetorno[5] := "S"
// Monta chave global
cChaveGbl := "NUM_OP" + aRetorno[1] + aRetorno[2] + aRetorno[4]
// Tenta adquirir o lock da global
While !GlbNmLock(cChaveGbl)
Sleep(100)
End
// Recupera a sequencia anterior da global
aRetorno[3] := GetGlbValue(cChaveGbl)
// Incrementa a sequencia
aRetorno[3] := Soma1(aRetorno[3])
// Salva nova sequencia na global
PutGlbValue(cChaveGbl, aRetorno[3])
// Libera o lock para outras threads
GlbNmUnlock(cChaveGbl)
EndIf
EndIf
While !GlbNmLock("CHAVES_P145NUMOP")
Sleep(100)
End
// Salva as chaves para limpar no fim do processamento
If GetGlbVars("CHAVES_P145NUMOP", @aChaves)
aAdd(aChaves, cChaveGbl)
PutGlbVars("CHAVES_P145NUMOP", aChaves)
Else
PutGlbVars("CHAVES_P145NUMOP", {cChaveGbl})
EndIf
GlbNmUnlock("CHAVES_P145NUMOP")
Return aRetorno
// Ponto de entrada executado no final da geração de documentos
User Function PA145GER()
Local nTotal := 0
Local nIndex := 0
Local cChave := ""
Local aChaves := {}
// Recupera as chaves utilizadas no processamento do ponto de entrada P145NumOP
If GetGlbVars("CHAVES_P145NUMOP", @aChaves)
nTotal := Len(aChaves)
// Percorre as chaves limpando as globais
For nIndex := 1 To nTotal
cChave := aChaves[nIndex]
ClearGlbValue(cChave)
Next
EndIf
Return Nil