Árvore de páginas

Versões comparadas

Chave

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

MATA200 - Montagem de Produtos

Linha de Produto:

Protheus

Segmento:

Manufatura

Módulo:

SIGAPCP - Planejamento e Controle da Produção

Parâmetro(s):

Para Inclusão, Alteração e Exclusão:

NomeTipoDescriçãoDefaultObrigatórioReferência
PARAMIXB1VetorArray contendo cabeçalho da Estrutura de Produtos


PARAMIXB2VetorArray contendo os itens que a estrutura possui.


PARAMIXB3NuméricoOpção desejada: 3-Inclusão; 4-Alteração ; 5-Exclusão3
Idiomas



Para Substituição de componentes:

NomeTipoDescriçãoDefaultObrigatórioReferência
PARAMIXB1Vetor

Array contendo o componente, grupo e opcional origem e destino, contendo os campos:

"G1_CODORIG" - Produto Origem

"G1_GRPORIG" - Grupo Opcionais Origem

"G1_OPCORIG" - Opcional Origem

"G1_SEQORIG" - Sequência Origem (Deve ser passado somente quando deseja filtrar pela sequência o componente a ser substituído)

"G1_CODDEST" - Produto Destino

"G1_GRPDEST" - Grupo Opcionais Destino

"G1_OPCDEST" - Opcional Destino

"ALTEMPENHO" - Altera os Empenhos na Substituição? Opções: S = Sim e N = Não. O padrão é N











PARAMIXB2Vetor

Array contendo os itens pais que terão o componente substituído. Este array deverá conter o campo:

"G1_COD"




PARAMIXB3VetorOpção desejada: 7 - Substituição


Idiomas:Espanhol, Inglês

País(es):

Todos

Banco(s) de Dados:

Todos

Sistema(s) Operacional(is):

Todos


Descrição:

A estrutura bill of materials demonstra como um produto é montado em todos os seus níveis, apresentando seus componentes e quantidades em forma de árvore com cada elemento ligado ao nível superior (produto "pai").

É com base nas estruturas que uma Ordem de Produção gera os empenhos dos componentes do produto para sua produção, permitindo a requisição automática deste material, baixa dos materiais e apuração do custo do produto.

Para determinar a fabricação/montagem é preciso que se tenha a relação dos componentes + mão de obra adequada e, se necessário, produtos fantasma para formação do produto acabado ou intermediário.



  • Conjunto

  • Componentes

  • Quantidade

Quantidade utilizada para fabricação de uma unidade de conjunto. No caso de mão de obra, deve-se informar como quantidade, o tempo padrão gasto em cada centro de custo.

Para empenho e compra do produto, é solicitada a quantidade normal que deve ser utilizada no conjunto acrescida do percentual de perda, se definido.

Unidades de Medidas

Para informar quais as unidades de medidas que serão utilizadas na validação do cadastro de estrutura deve-se configurar o parâmetro "MV_CONSDUM".

Ao cadastrar uma nova estrutura de produtos é verificada a quantidade base juntamente com as quantidades informadas em seus componentes, consistindo assim possíveis diferenças. Caso o parâmetro não exista, o sistema utilizará a unidade de medida padrão para validação, que é quilo (KG).

Obs.: No campo conteúdo, as unidades de medida a

Espanhol , Inglês

País(es):

Todos

Banco(s) de Dados:

Todos

Sistema(s) Operacional(is):

Todos

Descrição:
A estrutura bill of materials demonstra como um produto é montado em todos os seus níveis, apresentando seus componentes e quantidades em forma de árvore com cada elemento ligado ao nível superior (produto "pai").
É com base nas estruturas que uma Ordem de Produção gera os empenhos dos componentes do produto para sua produção, permitindo a requisição automática deste material, baixa dos materiais e apuração do custo do produto.
Para determinar a fabricação/montagem é preciso que se tenha a relação dos componentes + mão de obra adequada e, se necessário, produtos fantasma para formação do produto acabado ou intermediário.
IMPORTANTE:
Para formação das estruturas são informados basicamente:
  • Conjunto
Produto a ser produzido - Produto Acabado ou Intermediário.
  • Componentes
Produtos ou materiais utilizados na produção do conjunto - Matéria-prima ou Produto Intermediário.
  • Quantidade
Quantidade utilizada para fabricação de uma unidade de conjunto. No caso de mão de obra, deve-se informar como quantidade, o tempo padrão gasto em cada centro de custo.
Para empenho e compra do produto, é solicitada a quantidade normal que deve ser utilizada no conjunto acrescida do percentual de perda, se definido.
Unidades de Medidas
Para informar quais as unidades de medidas que serão utilizadas na validação do cadastro de estrutura deve-se configurar o parâmetro "MV_CONSDUM".
Ao cadastrar uma nova estrutura de produtos é verificada a quantidade base juntamente com as quantidades informadas em seus componentes, consistindo assim possíveis diferenças. Caso o parâmetro não exista, o Sistema utilizará a unidade de medida padrão para validação, que é quilo (KG).
Obs.: No campo conteúdo, as unidades de medida a

serem consideradas deverão ser separadas pelo símbolo – “/” .


Bloco de código
languagecpp
titleExemplo
: User
Inclusão/Alteração/Exclusão:
linenumberstrue
collapsetrue
#INCLUDE 'TOTVS.CH'
#INCLUDE 'PROTHEUS.CH'
#INCLUDE 'RWMAKE.CH'
#INCLUDE "TBICONN.CH"

User Function MyMATA200(PARAMIXB3)

Local PARAMIXB1
 := {}
Local PARAMIXB2 := {}
Local aGets     := {}
Local lOK       := .T.
Local 
cStringPrivate
cString   := ''

Private lMsErroAuto := .F.

Default PARAMIXB3 := 3

//------------------------//| Abertura do ambiente |//----------------------------
PREPARE ENVIRONMENT EMPRESA "99" FILIAL "01" MODULO "PCP" TABLES "SB1","SG1","SG5"
ConOut(Repl("-",80))
ConOut(PadC("Teste de rotina automatica para estrutura de produtos",80))
//------------------------//| Teste de Inclusao 
|//-------------------------------

dbSelectArea("SB1")
dbSetOrder(1)

If !SB1->(MsSeek(xFilial("SB1")+"PA001"))

    lOk := .F.

    ConOut("Cadastrar produto acabado: PA001")
EndIfIf

EndIf

If !SB1->(MsSeek(xFilial("SB1")+"PI001"))

    lOk := .F.

    ConOut("Cadastrar produto intermediario: PI001")
EndIfIf

EndIf

If !SB1->(MsSeek(xFilial("SB1")+"PI002"))

    lOk := .F.

    ConOut("Cadastrar produto intermediario: PI002")
EndIfIf

EndIf

If !SB1->(MsSeek(xFilial("SB1")+"PI003"))

    lOk := .F.

    ConOut("Cadastrar produto intermediario: PA003")
EndIfIf

EndIf

If !SB1->(MsSeek(xFilial("SB1")+"MP001"))

    lOk := .F.

    ConOut("Cadastrar produto materia prima: MP001")
EndIfIf

EndIf

If !SB1->(MsSeek(xFilial("SB1")+"MP002"))

    lOk := .F.

    ConOut("Cadastrar produto materia prima: MP002")
EndIfIf

EndIf

If !SB1->(MsSeek(xFilial("SB1")+"MP003"))

    lOk := .F.

    ConOut("Cadastrar produto materia prima: MP003")
EndIfIf

EndIf

If !SB1->(MsSeek(xFilial("SB1")+"MP004"))

    lOk := .F.

    ConOut("Cadastrar produto materia prima: MP004")
EndIfIf

EndIf

If PARAMIXB3==3

    PARAMIXB1 := {{"G1_COD","PA001",NIL},;

                {"G1_QUANT",1,NIL},;
{"NIVALT","S",NIL}} // A variavel NIVALT eh utilizada pra recalcular ou nao a

                {"NIVALT","S",NIL}} // A variavel NIVALT eh utilizada pra recalcular ou nao 
a estrutura
    
// estrutura
aGets := {}

    aadd(aGets,{"G1_COD","PA001",NIL})
aadd

    aadd(aGets,{"G1_COMP","PI001",NIL})

    aadd(aGets,{"G1_TRT",Space(3),NIL})

    aadd(aGets,{"G1_QUANT",1,NIL})

    aadd(aGets,{"G1_PERDA",0,NIL})

    aadd(aGets,{"G1_INI",CTOD("01/01/01"),NIL})

    aadd(aGets,{"G1_FIM",CTOD("31/12/49"),NIL})

    aadd(PARAMIXB2,aGets)

    aGets := {}

    aadd(aGets,{"G1_COD","PI001",NIL})

    aadd(aGets,{"G1_COMP","PI002",NIL})

    aadd(aGets,{"G1_TRT",Space(3),NIL})

    aadd(aGets,{"G1_QUANT",1,NIL})

    aadd(aGets,{"G1_PERDA",0,NIL})

    aadd(aGets,{"G1_INI",CTOD("01/01/01"),NIL})

    aadd(aGets,{"G1_FIM",CTOD("31/12/49"),NIL})

    aadd(PARAMIXB2,aGets)

    aGets := {}

    aadd(aGets,{"G1_COD","PI001",NIL})

    aadd(aGets,{"G1_COMP","MP002",NIL})

    aadd(aGets,{"G1_TRT",Space(3),NIL})

    aadd(aGets,{"G1_QUANT",1,NIL})

    aadd(aGets,{"G1_PERDA",0,NIL})

    aadd(aGets,{"G1_INI",CTOD("01/01/01"),NIL})
aadd

    aadd(aGets,{"G1_FIM",CTOD("31/12/49"),NIL})

    aadd(PARAMIXB2,aGets)

    aGets := {}

    aadd(aGets,{"G1_COD","PI002",NIL})

    aadd(aGets,{"G1_COMP","MP001",NIL})

    aadd(aGets,{"G1_TRT",Space(3),NIL})

    aadd(aGets,{"G1_QUANT",1,NIL})

    aadd(aGets,{"G1_PERDA",0,NIL})

    aadd(aGets,{"G1_INI",CTOD("01/01/01"),NIL})

    aadd(aGets,{"G1_FIM",CTOD("31/12/49"),NIL})

    aadd(PARAMIXB2,aGets)

    aGets := {}

    aadd(aGets,{"G1_COD","PA001",NIL})

    aadd(aGets,{"G1_COMP","PI003",NIL})

    aadd(aGets,{"G1_TRT",Space(3),NIL})

    aadd(aGets,{"G1_QUANT",1,NIL})

    aadd(aGets,{"G1_PERDA",0,NIL})

    aadd(aGets,{"G1_INI",CTOD("01/01/01"),NIL})

    aadd(aGets,{"G1_FIM",CTOD("31/12/49"),NIL})

    aadd(PARAMIXB2,aGets)

    aGets := {}

    aadd(aGets,{"G1_COD","PA001",NIL})

    aadd(aGets,{"G1_COMP","MP004",NIL})
aadd

    aadd(aGets,{"G1_TRT",Space(3),NIL})

    aadd(aGets,{"G1_QUANT",1,NIL})

    aadd(aGets,{"G1_PERDA",0,NIL})

    aadd(aGets,{"G1_INI",CTOD("01/01/01"),NIL})

    aadd(aGets,{"G1_FIM",CTOD("31/12/49"),NIL})

    aadd(PARAMIXB2,aGets)

    aGets := {}

    aadd(aGets,{"G1_COD","PI003",NIL})

    aadd(aGets,{"G1_COMP","MP003",NIL})

    aadd(aGets,{"G1_TRT",Space(3),NIL})

    aadd(aGets,{"G1_QUANT",1,NIL})

    aadd(aGets,{"G1_PERDA",0,NIL})

    aadd(aGets,{"G1_INI",CTOD("01/01/01
"),NIL}) aadd(aGets,{"G1_FIM",CTOD("31/12/49"),NIL}) aadd(PARAMIXB2,aGets) If lOk ConOut("Teste de Inclusao") ConOut("Inicio: "+Time()) MSExecAuto({|x,y,z| mata200(x,y,z)},PARAMIXB1,PARAMIXB2,PARAMIXB3) //Inclusao ConOut("Fim: "+Time()) EndIfElse //--------------- Exemplo de Exclusao ------------------------------------ If lOk SG1->(dbSetOrder(1)) SG1->(dbSeek(xFilial("SG1")+PadR('PA001',Len(SG1->G1_COD)))) PARAMIXB1 := {{"G1_COD","PA001",NIL},; {"NIVALT","S",NIL}} // A variavel NIVALT eh utilizada pra recalcular // ou nao a estrutura ConOut("Teste de Exclusao do codigo PA001") ConOut("Inicio: "+Time()) MSExecAuto({|x,y,z| mata200(x,y,z)},PARAMIXB1,NIL,5) //Exclusao lOk := !lMsErroAuto ConOut("Fim: "+Time()) EndIf If lOk SG1->(dbSetOrder(1)) SG1->(dbSeek(xFilial("SG1")+PadR('PI001',Len(SG1->G1_COD)))) PARAMIXB1 := {{"G1_COD","PI001",NIL},; {"NIVALT","S",NIL}} // A variavel NIVALT eh utilizada pra recalcular // ou nao a estrutura ConOut("Teste de Exclusao do codigo PI001") ConOut("Inicio: "+Time()) MSExecAuto({|x,y,z| mata200(x,y,z)},PARAMIXB1,NIL,5) //Exclusao lOk := !lMsErroAuto ConOut("Fim: "+Time()) EndIf If lOk SG1->(dbSetOrder(1)) SG1->(dbSeek(xFilial("SG1")+PadR('PI002',Len(SG1->G1_COD)))) PARAMIXB1 := {{"G1_COD","PI002",NIL},; {"NIVALT","S",NIL}} // A variavel NIVALT eh utilizada pra recalcular
"),NIL})
    aadd(aGets,{"G1_FIM",CTOD("31/12/49"),NIL})
    aadd(PARAMIXB2,aGets)

    If lOk
        ConOut("Teste de Inclusao")
        ConOut("Inicio: "+Time())
        MSExecAuto({|x,y,z| mata200(x,y,z)},PARAMIXB1,PARAMIXB2,PARAMIXB3)
        //Inclusao
        ConOut("Fim: "+Time())
    EndIf
Else
    //--------------- Exemplo de Exclusao ------------------------------------
    If lOk
        SG1->(dbSetOrder(1))
        SG1->(dbSeek(xFilial("SG1")+PadR('PA001',Len(SG1->G1_COD))))
        PARAMIXB1 := {{"G1_COD","PA001",NIL},;
        {"NIVALT","S",NIL}} // A variavel NIVALT eh utilizada pra recalcular
        // ou nao a estrutura
        ConOut("Teste de Exclusao do codigo PA001")
        ConOut("Inicio: "+Time())
        MSExecAuto({|x,y,z| mata200(x,y,z)},PARAMIXB1,NIL,5)
        //Exclusao
        lOk := !lMsErroAuto
        ConOut("Fim: "+Time())
    EndIf

    If lOk
        SG1->(dbSetOrder(1))
        SG1->(dbSeek(xFilial("SG1")+PadR('PI001',Len(SG1->G1_COD))))
        PARAMIXB1 := {{"G1_COD","PI001",NIL},; {"NIVALT","S",NIL}} // A variavel NIVALT eh utilizada pra recalcular
        // ou nao a estrutura
        ConOut("Teste de Exclusao do codigo PI001")
        ConOut("Inicio: "+Time())
        MSExecAuto({|x,y,z| mata200(x,y,z)},PARAMIXB1,NIL,5)
        //Exclusao
        lOk := !lMsErroAuto
        ConOut("Fim: "+Time())
    EndIf

    If lOk
        SG1->(dbSetOrder(1))
        SG1->(dbSeek(xFilial("SG1")+PadR('PI002',Len(SG1->G1_COD))))
        PARAMIXB1 := {{"G1_COD","PI002",NIL},; {"NIVALT","S",NIL}} // A variavel NIVALT eh utilizada pra recalcular
        // ou nao a estrutura
        ConOut("Teste de Exclusao do codigo PI002")
        ConOut("Inicio: "+Time())
        MSExecAuto({|x,y,z| mata200(x,y,z)},PARAMIXB1,NIL,5)
        //Exclusao
        lOk := !lMsErroAuto
        ConOut("Fim: "+Time())
    EndIf

    If lOk
        SG1->(dbSetOrder(1))
        SG1->(dbSeek(xFilial("SG1")+PadR('PI003',Len(SG1->G1_COD))))
        PARAMIXB1 := {{"G1_COD","PI003",NIL},; {"NIVALT","S",NIL}} // A variavel NIVALT eh utilizada pra recalcular
        // ou nao a estrutura
        ConOut("Teste de Exclusao do codigo PI003")
        ConOut("Inicio: "+Time())
        MSExecAuto({|x,y,z| mata200(x,y,z)},PARAMIXB1,NIL,5) //Exclusao
        ConOut("Fim: "+Time()) EndIf
    EndIf

    If lMsErroAuto
        If IsBlind()
            If IsTelnet()
                VTDispFile(NomeAutoLog(),.t.)
            Else
                cString := MemoRead(NomeAutoLog())
                Aviso("Aviso de Erro:",cString)
            EndIf
        Else
            MostraErro()
        EndIf
    Else
        If lOk
            Aviso("Aviso","Operacao efetuada com sucesso",{"Ok"})
        Else 
            Aviso("Aviso","Fazer os devidos cadastros",{"Ok"})
        EndIf
    Endif

Return
Bloco de código
languagecpp
titleExemplo Substituição:
linenumberstrue
collapsetrue
#INCLUDE 'TOTVS.CH'
#INCLUDE 'PROTHEUS.CH'
#INCLUDE 'RWMAKE.CH'
#INCLUDE "TBICONN.CH"

User Function MyMATA200()

Local PARAMIXB1 := {}
Local PARAMIXB2 := {}
Local PARAMIXB3 := 7

Private lMsErroAuto := .F.

//------------------------//| Abertura do ambiente |//---------------------------------------------
RPCSetType(3)
PREPARE ENVIRONMENT EMPRESA "99" FILIAL "01" MODULO "SIGAPCP" TABLES "SB1","SG1","SG5","SC2","SD4"
ConOut(Repl("-",80))
ConOut(PadC("Teste de rotina automatica para estrutura de produtos",80))
//------------------------//| Teste de Substituição |//--------------------------------------------

aadd(PARAMIXB1,{"G1_CODORIG","9475-MP3",NIL})
aadd(PARAMIXB1,{"G1_GRPORIG","",NIL})
aadd(PARAMIXB1,{"G1_OPCORIG","",NIL})

aadd(PARAMIXB1,{"G1_SEQORIG","001",NIL}) //Este campo não é obrigatório. Se for passado, filtrará o componente a ser substituído por uma sequência específica.

aadd(PARAMIXB1,{"G1_CODDEST","9475-MP4",NIL})
aadd(PARAMIXB1,{"G1_GRPDEST","",NIL})
aadd(PARAMIXB1,{"G1_OPCDEST","",NIL})
aadd(PARAMIXB1,{"ALTEMPENHO","S",NIL}) //Se altera os empenhos. S = Sim e N = Não.
//Este campo não é obrigatório. Se ele não estiver no array, será considerado N - Não.

// Informar os itens Pais que será feito a substituição do componente origem pelo componente destino

aadd(PARAMIXB2,{"G1_COD","94751-PA",NIL})   
aadd(PARAMIXB2,{"G1_COD","PI002",NIL})  

MSExecAuto({|x,y,Z| mata200(x,y,z)},PARAMIXB1,PARAMIXB2,PARAMIXB3) //Substituição

If lMsErroAuto  
    MostraErro()    
Else
    alert("Substituição efetuada com sucesso")  
Endif

Return
Bloco de código
languagecpp
titleExemplo Exclusão de Item especifico:
linenumberstrue
collapsetrue
#INCLUDE 'TOTVS.CH'
#INCLUDE 'PROTHEUS.CH'
#INCLUDE 'RWMAKE.CH'
#INCLUDE "TBICONN.CH"

User Function ExcMyMATA200()

Local cItemPai := "PA-20868       "
Local cFilho1  := "MP-20868       "
Local cFilho2  := "MP-20868-2     "
Local cSeqTrt  := "   "
Local aCab     := {}
Local aItem    := {}
Local aDetalhe := {}

Private lMsErroAuto := .F.

aCab := {{"G1_COD"	    , cItemPai	, NIL},;
         {"ATUREVSB1"	, "S"		, NIL},;
         {"NIVEL1"		, "S"		, NIL},;
         {"NIVALT"		, "S"		, NIL},;
         {"G1_QUANT"    , 1         , NIL}}

aadd(aDetalhe, {"G1_COD"    , cItemPai              , NIL})
aadd(aDetalhe, {"G1_COMP"   , cFilho1               , NIL})
aadd(aDetalhe, {"G1_TRT"    , cSeqTrt             
//
 
ou
 
nao a estrutura ConOut("Teste de Exclusao do codigo PI002") ConOut("Inicio: "+Time()) MSExecAuto({|x,y,z| mata200(x,y,z)},PARAMIXB1,NIL,5) //Exclusao lOk := !lMsErroAuto ConOut("Fim: "+Time()) EndIf If lOk SG1->(dbSetOrder(1)) SG1->(dbSeek(xFilial("SG1")+PadR('PI003',Len(SG1->G1_COD)))) PARAMIXB1 := {{"G1_COD","PI003",NIL},; {"NIVALT","S",NIL}} // A variavel NIVALT eh utilizada pra recalcular
, NIL})
aadd(aDetalhe, {"G1_INI"    , dDataBase             , NIL})
aadd(aDetalhe, {"G1_FIM"    , DaySum(dDataBase, 365), NIL})
aadd(aDetalhe, {"G1_FIXVAR" ,"V"                    , NIL})
aadd(aDetalhe, {"G1_QUANT"  , 1                     , NIL})
aadd(aDetalhe, {"G1_PERDA"  , 0                     , NIL})

aadd(aItem,aDetalhe)

dbSelectArea('SG1')
SG1->(dbSetOrder(1))
if SG1->(dbSeek(xFilial('SG1')+cItemPai))
    
// ou nao a estrutura ConOut("Teste de Exclusao do codigo PI003") ConOut("Inicio: "+Time())
MSExecAuto({|x,y,z| mata200(x,y,z)},aCab,aItem,4) //Alteração ou Exclusão de Item não enviado no array aItem
Else
    MSExecAuto({|x,y,z| mata200(x,y,z)},
PARAMIXB1
aCab,
NIL
aItem,
5) //Exclusao ConOut("Fim: "+Time()) EndIfEndIfIf lMsErroAuto If IsBlind() If IsTelnet() VTDispFile(NomeAutoLog(),.t.) Else cString := MemoRead(NomeAutoLog()) Aviso("Aviso de Erro:",cString) EndIf Else MostraErro() EndIfElse If lOk Aviso("Aviso","Operacao
3)
Endif

If lMsErroAuto  
    MostraErro()    
Else
    alert("Alteração/Exclusão item efetuada com sucesso"
,{"Ok"}
)
Else Aviso("Aviso","Fazer
 
os devidos cadastros",{"Ok"}) EndIfEndifReturn
 
Endif

Return

Sintaxe:

MATA200 - Montagem de Produtos ( PARAMIXB1PARAMIXB2 [ PARAMIXB3 ] ) --> Nil

Retorno:

Nil (nulo)

   Nil

Observações:Na opção exclusão, posicione a tabela SG1 com o produto (PA ou PI) que terá sua estrutura excluída.
No processo de exclusão de um item específico, o sistema gera uma nova versão da estrutura contendo apenas os itens enviados no parâmetro de itens "aItem".