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.
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 – “/” .
Exemplo Inclusão/Alteração/Exclusão:
Bloco de código |
---|
language | cpp |
---|
firstline | 1 |
---|
title | Exemplo Inclusão/Alteração/Exclusão: |
---|
linenumbers | true |
---|
collapse | true |
---|
| #INCLUDE 'Protheus.ch'
User Function MyPCPA200() Local
Local nOpc := Aviso("EXECAUTO","Qual operação?",{"Alterar","Incluir","Excluir","Sair"},2)
Do Case
Do Case CaseCase nOpc == 1 //Alterar empenho runPCPA200empenho
runPCPA200(4) Case
Case nOpc == 2 //Incluir empenho
empenho runPCPA200runPCPA200(3) Case
Case nOpc == 3 //Excluir empenho
empenho runPCPA200runPCPA200(5) EndCase If
EndCase
If nOpc != 4
4 UU_MyPCPA200() EndIfReturn
EndIf
Return
Static Function runPCPA200(nOpc) Local
Local aCab := {} Local
Local aItem := {} Local
Local aGets aGets := {} Local
Local cString := "" Local
Local cProdutos := ""
Private
Private lMsErroAuto := .F.
Default
Default nOpc := 3
ConOut
ConOut(Repl("-",80)) ConOut
ConOut(PadC("Teste de rotina automatica para estrutura de produtos",80))
//Verifica se os produtos que serão utilizados existem cadastrados. SB1
SB1->(dbSetOrder(1)) If
If !SB1->(dbSeek(xFilial("SB1")+"PA001")) cProdutos
cProdutos += "PA001, " EndIf
If
EndIf
If !SB1->(dbSeek(xFilial("SB1")+"PI001")) cProdutos
cProdutos += "PI001, " EndIf
If
EndIf
If !SB1->(dbSeek(xFilial("SB1")+"PI002")) cProdutos
cProdutos += "PI002, " EndIf
If
EndIf
If !SB1->(dbSeek(xFilial("SB1")+"PI003")) cProdutos
cProdutos += "PI003, " EndIf
If
EndIf
If !SB1->(dbSeek(xFilial("SB1")+"MP001")) cProdutos
cProdutos += "MP001, " EndIf
If
EndIf
If !SB1->(dbSeek(xFilial("SB1")+"MP002")) cProdutos
cProdutos += "MP002, " EndIf
If
EndIf
If !SB1->(dbSeek(xFilial("SB1")+"MP003")) cProdutos
cProdutos += "MP003, " EndIf
If
EndIf
If !Empty(cProdutos) Alert
Alert("Cadastre os seguintes produtos: " + PadR(cProdutos,Len(cProdutos)-2)) Return EndIf
If nOpc == 3 aCabReturn
EndIf
If nOpc == 3
aCab := {{"G1_COD" , "PA001" , NIL},; //Código do produto PAI.
{"G1_QUANT" , 5 , NIL},; //Quantidade base do produto PAI.
{"ATUREVSB1", "N" , NIL},; //A variável ATUREVSB1 é utilizada para gerar nova revisão quando MV_REVAUT=.F.
{"NIVALT" , "S" , NIL}} //A variável NIVALT é utilizada para recalcular ou não os níveis da estrutura.
//Adiciona o componente MP001 com sequência em branco na estrutura do PA001. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" , "PA001" , NIL}) aadd
aadd(aGets, {"G1_COMP" , "MP001" , NIL}) aadd
aadd(aGets, {"G1_TRT" , Space(3) , NIL}) aadd
aadd(aGets, {"G1_QUANT" , 1 , NIL}) aadd
aadd(aGets, {"G1_INI" , CTOD("01/01/01"), NIL}) aadd
aadd(aGets, {"G1_FIM" , CTOD("31/12/49"), NIL}) aadd
aadd(aGets, {"G1_PERDA" , 0 , NIL}) aadd
aadd(aItem,aGets)
//Adiciona o componente PI001 com sequência em branco na estrutura do PA001. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" ,"PA001" , NIL}) aadd
aadd(aGets, {"G1_COMP" ,"PI001" , NIL}) aadd
aadd(aGets, {"G1_TRT" ,Space(3) , NIL}) aadd
aadd(aGets, {"G1_QUANT" ,1 , NIL}) aadd
aadd(aGets, {"G1_PERDA" ,0 , NIL}) aadd
aadd(aGets, {"G1_INI" ,CTOD("01/01/01") , NIL}) aadd
aadd(aGets, {"G1_FIM" ,CTOD("31/12/49") , NIL}) aadd
aadd(aItem,aGets)
//Adiciona o componente MP001 com sequência "001" na estrutura do PA001. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" ,"PA001" , NIL}) aadd
aadd(aGets, {"G1_COMP" ,"MP001" , NIL}) aadd
aadd(aGets, {"G1_TRT" ,"001" , NIL}) aadd
aadd(aGets, {"G1_QUANT" ,1 , NIL}) aadd
aadd(aGets, {"G1_PERDA" ,0 , NIL}) aadd
aadd(aGets, {"G1_INI" ,CTOD("01/01/01") , NIL}) aadd
aadd(aGets, {"G1_FIM" ,CTOD("31/12/49") , NIL}) aadd
aadd(aItem,aGets)
//Adiciona o componente MP001 com sequência "005" na estrutura do PA001. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" ,"PA001" , NIL}) aadd
aadd(aGets, {"G1_COMP" ,"MP001" , NIL}) aadd
aadd(aGets, {"G1_TRT" ,"005" , NIL}) aadd
aadd(aGets, {"G1_QUANT" ,1 , NIL}) aadd
aadd(aGets, {"G1_PERDA" ,0 , NIL}) aadd
aadd(aGets, {"G1_INI" ,CTOD("01/01/01") , NIL}) aadd
aadd(aGets, {"G1_FIM" ,CTOD("31/12/49") , NIL}) aadd
aadd(aItem,aGets)
//Adiciona o componente MP001 na estrutura do PA001.
//Como o G1_TRT não foi informado no array, o programa irá criar um novo TRT para este
//componente, pois ele já está informado nesta estrutura. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" , "PA001" , NIL}) aadd
aadd(aGets, {"G1_COMP" , "MP001" , NIL}) aadd
aadd(aGets, {"G1_QUANT" , 1 , NIL}) aadd
aadd(aGets, {"G1_PERDA" , 0 , NIL}) aadd
aadd(aGets, {"G1_INI" , CTOD("01/01/01") , NIL}) aadd
aadd(aGets, {"G1_FIM" , CTOD("31/12/49") , NIL}) aadd
aadd(aItem,aGets)
//Adiciona o componente MP002 com sequência em branco na estrutura do PA001. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" , "PA001" , NIL}) aadd
aadd(aGets, {"G1_COMP" , "MP002" , NIL}) aadd
aadd(aGets, {"G1_TRT" , Space(3) , NIL}) aadd
aadd(aGets, {"G1_QUANT" , 2 , NIL}) aadd
aadd(aGets, {"G1_PERDA" , 0 , NIL}) aadd
aadd(aGets, {"G1_INI" , CTOD("01/01/01") , NIL}) aadd
aadd(aGets, {"G1_FIM" , CTOD("31/12/49") , NIL}) aadd
aadd(aItem,aGets)
//Adiciona o componente MP003 com sequência em branco na estrutura do PA001. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" , "PA001" , NIL}) aadd
aadd(aGets, {"G1_COMP" , "MP003" , NIL}) aadd
aadd(aGets, {"G1_TRT" , Space(3) , NIL}) aadd
aadd(aGets, {"G1_QUANT" , 1 , NIL}) aadd
aadd(aGets, {"G1_PERDA" , 0 , NIL}) aadd
aadd(aGets, {"G1_INI" , CTOD("01/01/01") , NIL}) aadd
aadd(aGets, {"G1_FIM" , CTOD("31/12/49") , NIL}) aadd
aadd(aItem,aGets)
//Adiciona o componente MP003 com sequência em branco na estrutura do PI001. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" , "PI001" , NIL}) aadd
aadd(aGets, {"G1_COMP" , "MP003" , NIL}) aadd
aadd(aGets, {"G1_TRT" , Space(3) , NIL}) aadd
aadd(aGets, {"G1_QUANT" , 3 , NIL}) aadd
aadd(aGets, {"G1_PERDA" , 0 , NIL}) aadd
aadd(aGets, {"G1_INI" , CTOD("01/01/01") , NIL}) aadd
aadd(aGets, {"G1_FIM" , CTOD("31/12/49") , NIL}) aadd
aadd(aItem,aGets)
//Adiciona o componente MP002 com sequência em branco na estrutura do PI001. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" , "PI001" , NIL}) aadd
aadd(aGets, {"G1_COMP" , "MP002" , NIL}) aadd
aadd(aGets, {"G1_TRT" , Space(3) , NIL}) aadd
aadd(aGets, {"G1_QUANT" , 1 , NIL}) aadd
aadd(aGets, {"G1_PERDA" , 0 , NIL}) aadd
aadd(aGets, {"G1_INI" , CTOD("01/01/01") , NIL}) aadd
aadd(aGets, {"G1_FIM" , CTOD("31/12/49") , NIL}) aadd
aadd(aItem,aGets)
//Adiciona o componente MP001 com sequência em branco na estrutura do PI001. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" , "PI001" , NIL}) aadd
aadd(aGets, {"G1_COMP" , "MP001" , NIL}) aadd
aadd(aGets, {"G1_TRT" , Space(3) , NIL}) aadd
aadd(aGets, {"G1_QUANT" , 1 , NIL}) aadd
aadd(aGets, {"G1_PERDA" , 0 , NIL}) aadd
aadd(aGets, {"G1_INI" , CTOD("01/01/01") , NIL}) aadd
aadd(aGets, {"G1_FIM" , CTOD("31/12/49") , NIL}) aadd
aadd(aItem,aGets)
//Adiciona o componente PI002 com sequência em branco na estrutura do PI001. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" , "PI001" , NIL}) aadd
aadd(aGets, {"G1_COMP" , "PI002" , NIL}) aadd
aadd(aGets, {"G1_TRT" , Space(3) , NIL}) aadd
aadd(aGets, {"G1_QUANT" , 1 , NIL}) aadd
aadd(aGets, {"G1_PERDA" , 0 , NIL}) aadd
aadd(aGets, {"G1_INI" , CTOD("01/01/01") , NIL}) aadd
aadd(aGets, {"G1_FIM" , CTOD("31/12/49") , NIL}) aadd
aadd(aItem,aGets)
//Adiciona o componente MP001 com sequência em branco na estrutura do PI002. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" , "PI002" , NIL}) aadd
aadd(aGets, {"G1_COMP" , "MP001" , NIL}) aadd
aadd(aGets, {"G1_TRT" , Space(3) , NIL}) aadd
aadd(aGets, {"G1_QUANT" , 1 , NIL}) aadd
aadd(aGets, {"G1_PERDA" , 0 , NIL}) aadd
aadd(aGets, {"G1_INI" , CTOD("01/01/01") , NIL}) aadd
aadd(aGets, {"G1_FIM" , CTOD("31/12/49") , NIL}) aadd
aadd(aItem,aGets)
//Adiciona o componente MP002 com sequência em branco na estrutura do PI002. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" , "PI002" , NIL}) aadd
aadd(aGets, {"G1_COMP" , "MP002" , NIL}) aadd
aadd(aGets, {"G1_TRT" , Space(3) , NIL}) aadd
aadd(aGets, {"G1_QUANT" , 1 , NIL}) aadd
aadd(aGets, {"G1_PERDA" , 0 , NIL}) aadd
aadd(aGets, {"G1_INI" , CTOD("01/01/01") , NIL}) aadd
aadd(aGets, {"G1_FIM" , CTOD("31/12/49") , NIL}) aadd
aadd(aItem,aGets)
//Adiciona o componente MP003 com sequência em branco na estrutura do PI002. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" , "PI002" , NIL}) aadd
aadd(aGets, {"G1_COMP" , "MP003" , NIL}) aadd
aadd(aGets, {"G1_TRT" , Space(3) , NIL}) aadd
aadd(aGets, {"G1_QUANT" , 1 , NIL}) aadd
aadd(aGets, {"G1_PERDA" , 0 , NIL}) aadd
aadd(aGets, {"G1_INI" , CTOD("01/01/01") , NIL}) aadd
aadd(aGets, {"G1_FIM" , CTOD("31/12/49") , NIL}) aadd
aadd(aItem,aGets)
//Adiciona o componente PI003 com sequência em branco na estrutura do PI002. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" , "PI002" , NIL}) aadd
aadd(aGets, {"G1_COMP" , "PI003" , NIL}) aadd
aadd(aGets, {"G1_TRT" , Space(3) , NIL}) aadd
aadd(aGets, {"G1_QUANT" , 1 , NIL}) aadd
aadd(aGets, {"G1_PERDA" , 0 , NIL}) aadd
aadd(aGets, {"G1_INI" , CTOD("01/01/01") , NIL}) aadd
aadd(aGets, {"G1_FIM" , CTOD("31/12/49") , NIL}) aadd
aadd(aItem,aGets)
//Adiciona o componente MP001 com sequência em branco na estrutura do PI003. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" , "PI003" , NIL}) aadd
aadd(aGets, {"G1_COMP" , "MP001" , NIL}) aadd
aadd(aGets, {"G1_TRT" , Space(3) , NIL}) aadd
aadd(aGets, {"G1_QUANT" , 1 , NIL}) aadd
aadd(aGets, {"G1_PERDA" , 0 , NIL}) aadd
aadd(aGets, {"G1_INI" , CTOD("01/01/01") , NIL}) aadd
aadd(aGets, {"G1_FIM" , CTOD("31/12/49") , NIL}) aadd
aadd(aItem,aGets)
//Adiciona o componente MP002 com sequência em branco na estrutura do PI003. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" , "PI003" , NIL}) aadd
aadd(aGets, {"G1_COMP" , "MP002" , NIL}) aadd
aadd(aGets, {"G1_TRT" , Space(3) , NIL}) aadd
aadd(aGets, {"G1_QUANT" , 1 , NIL}) aadd
aadd(aGets, {"G1_PERDA" , 0 , NIL}) aadd
aadd(aGets, {"G1_INI" , CTOD("01/01/01") , NIL}) aadd
aadd(aGets, {"G1_FIM" , CTOD("31/12/49") , NIL}) aadd
aadd(aItem,aGets)
//Adiciona o componente MP003 com sequência em branco na estrutura do PI003. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" , "PI003" , NIL}) aadd
aadd(aGets, {"G1_COMP" , "MP003" , NIL}) aadd
aadd(aGets, {"G1_TRT" , Space(3) , NIL}) aadd
aadd(aGets, {"G1_QUANT" , 1 , NIL}) aadd
aadd(aGets, {"G1_PERDA" , 0 , NIL}) aadd
aadd(aGets, {"G1_INI" , CTOD("01/01/01") , NIL}) aadd
aadd(aGets, {"G1_FIM" , CTOD("31/12/49") , NIL}) aadd
aadd(aItem,aGets)
ConOut
ConOut("Teste de Inclusao") ConOut
ConOut("Inicio: "+Time()) nStart
nStart := Seconds() MSExecAuto
MSExecAuto({|x,y,z| PCPA200(x,y,z)},aCab,aItem,3) //Inclusao ConOutInclusao
ConOut("Fim: " + cValToChar(Seconds()-nStart) + " Segundos.") ElseIf
ElseIf nOpc == 4 4
//--------------- Exemplo de Alteração ------------------------------------ aCab
aCab := {{"G1_COD" , "PA001" , NIL},; //Código do produto PAI.
{"G1_QUANT" , 5 , NIL},; //Quantidade base do produto PAI.
{"ATUREVSB1", "S" , NIL},; //A variável ATUREVSB1 é utilizada para gerar nova revisão quando MV_REVAUT=.F.
{"AUTREVPAI", " " , NIL},; //A variável AUTREVPAI é utilizada para indicar qual a revisão do produto pai será considerada. Caso não seja enviado, será utilizada a revisão atual do produto.
{"NIVALT" , "S" , NIL}} //A variável NIVALT é utilizada para recalcular ou não os níveis da estrutura.
//Altera o componente MP001 com sequência em branco. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" ,"PA001" ,NIL}) aadd
aadd(aGets, {"G1_COMP" ,"MP001" ,NIL}) aadd
aadd(aGets, {"G1_TRT" ,Space(3) ,NIL}) aadd
aadd(aGets, {"G1_QUANT" ,10 ,NIL}) aadd
aadd(aGets, {"G1_PERDA" ,1 ,NIL}) aadd
aadd(aGets, {"G1_INI" ,CTOD("01/01/20") ,NIL}) aadd
aadd(aGets, {"G1_FIM" ,CTOD("31/12/49") ,NIL}) aAdd
aAdd(aGets, {"LINPOS" ,"G1_COD+G1_COMP+G1_TRT","PA001","MP001",Space(3)}) aadd
aadd(aItem,aGets)
//Adiciona o componente PI003 com sequência em branco na estrutura do PA001. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" ,"PA001" ,NIL}) aadd
aadd(aGets, {"G1_COMP" ,"PI003" ,NIL}) aadd
aadd(aGets, {"G1_TRT" ,Space(3) ,NIL}) aadd
aadd(aGets, {"G1_QUANT" ,5 ,NIL}) aadd
aadd(aGets, {"G1_PERDA" ,1 ,NIL}) aadd
aadd(aGets, {"G1_INI" ,CTOD("01/01/20") ,NIL}) aadd
aadd(aGets, {"G1_FIM" ,CTOD("31/12/49") ,NIL}) aadd
aadd(aItem,aGets)
//Deleta o componente MP002 da estrutura do PA001. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" ,"PA001" ,NIL}) aadd
aadd(aGets, {"G1_COMP" ,"MP002" ,NIL}) aadd
aadd(aGets, {"G1_TRT" ,Space(3) ,NIL}) aadd
aadd(aGets, {"G1_QUANT" ,5 ,NIL}) aadd
aadd(aGets, {"G1_PERDA" ,1 ,NIL}) aadd
aadd(aGets, {"G1_INI" ,CTOD("01/01/20") ,NIL}) aadd
aadd(aGets, {"G1_FIM" ,CTOD("31/12/49") ,NIL}) aAdd
aAdd(aGets, {"LINPOS" ,"G1_COD+G1_COMP+G1_TRT","PA001","MP002",Space(3)}) aAdd
aAdd(aGets, {"AUTDELETA","S" ,NIL}) aadd
aadd(aItem,aGets)
//Adiciona o componente PI002 com sequência "001" na estrutura do PI001. aGets
aGets := {} aadd
aadd(aGets, {"G1_COD" ,"PI001" ,NIL}) aadd
aadd(aGets, {"G1_COMP" ,"PI002" ,NIL}) aadd
aadd(aGets, {"G1_TRT" ,"001" ,NIL}) aadd
aadd(aGets, {"G1_QUANT" ,5 ,NIL}) aadd
aadd(aGets, {"G1_PERDA" ,1 ,NIL}) aadd
aadd(aGets, {"G1_INI" ,CTOD("01/01/20") ,NIL}) aadd
aadd(aGets, {"G1_FIM" ,CTOD("31/12/49") ,NIL}) aadd
aadd(aItem,aGets)
ConOut
ConOut("Teste de Alteracao") ConOut
ConOut("Inicio: "+Time()) nStart
nStart := Seconds() MSExecAuto
MSExecAuto({|x,y,z| PCPA200(x,y,z)},aCab,aItem,4) //Alteração ConOutAlteração
ConOut("Fim: " + cValToChar(Seconds()-nStart) + " Segundos.")
ElseIf ElseIf nOpc == 5 5
//--------------- Exemplo de Exclusao ------------------------------------ SG1
SG1->(dbSetOrder(1))
//Verifica se o produto PA001 possui estrutura. Se existir, executa a exclusão. If
If SG1->(dbSeek(xFilial("SG1")+"PA001")) aCab
aCab := {{"G1_COD" , "PA001" , NIL},;
{"NIVALT" , "S" , NIL}} //A variável NIVALT é utilizada para recalcular ou não os níveis da estrutura. ConOut
ConOut("Teste de Exclusao do codigo PA001") MSExecAuto
MSExecAuto({|x,y,z| PCPA200(x,y,z)},aCab,NIL,5) //Exclusao ConOutExclusao
ConOut("Fim exclusao do codigo PA001.") EndIf
EndIf
//Verifica se não aconteceu nenhum erro, e tenta excluir a estrutura do PI001 se existir. If
If !lMsErroAuto .And. SG1->(dbSeek(xFilial("SG1")+"PI001")) aCab
aCab := {{"G1_COD" , "PI001" , NIL},;
{"NIVALT" , "S" , NIL}} //A variável NIVALT é utilizada para recalcular ou não os níveis da estrutura.
ConOut
ConOut("Teste de Exclusao do codigo PI001") MSExecAuto
MSExecAuto({|x,y,z| PCPA200(x,y,z)},aCab,NIL,5) //Exclusao ConOutExclusao
ConOut("Fim exclusao do codigo PI001.") EndIf
EndIf
//Verifica se não aconteceu nenhum erro, e tenta excluir a estrutura do PI002 se existir. If
If !lMsErroAuto .And. SG1->(dbSeek(xFilial("SG1")+"PI002")) aCab
aCab := {{"G1_COD" , "PI002" , NIL},;
{"NIVALT" , "S" , NIL}} //A variável NIVALT é utilizada para recalcular ou não os níveis da estrutura.
ConOut ConOut("Teste de Exclusao do codigo PI002") MSExecAuto
MSExecAuto({|x,y,z| PCPA200(x,y,z)},aCab,NIL,5) //Exclusao ConOutExclusao
ConOut("Fim exclusao do codigo PI002.") EndIf
EndIf
//Verifica se não aconteceu nenhum erro, e tenta excluir a estrutura do PI003 se existir. If
If !lMsErroAuto .And. SG1->(dbSeek(xFilial("SG1")+"PI003")) aCab
aCab := {{"G1_COD" , "PI003" , NIL},;
{"NIVALT" , "S" , NIL}} //A variável NIVALT é utilizada para recalcular ou não os níveis da estrutura.
ConOut ConOut("Teste de Exclusao do codigo PI003") MSExecAuto
MSExecAuto({|x,y,z| PCPA200(x,y,z)},aCab,NIL,5) //Exclusao ConOutExclusao
ConOut("Fim exclusao do codigo PI003.") EndIf EndIf
EndIf
EndIf
//Verifica se ocorreu algum erro, e exibe a mensagem. If lMsErroAuto If
If lMsErroAuto
If IsBlind() If
If IsTelnet() VTDispFile
VTDispFile(NomeAutoLog(),.t.) Else cString
Else
cString := MemoRead(NomeAutoLog()) Conout
Conout("Aviso de Erro:",cString) EndIf Else MostraErro() EndIf Else MsgInfo("
EndIf
Else
MostraErro()
EndIf
Else
MsgInfo("Operação realizada com sucesso","OK") EndIf ConOut
EndIf
ConOut(Repl("-",80))
Return
|
|
Sintaxe: | PCPA200 - Estrutura de Produtos ( PARAMIXB1, PARAMIXB2, PARAMIXB3 ) --> Nil |
Retorno: | Nil (nulo) Nil |
Observações: | Na opção exclusão, não é necessário a utilização do segundo parâmetro (PARAMIXB2), pois serão excluídos todos os componentes relacionados ao produto pai informado no cabeçalho da rotina automática (PARAMIXB1) |
#INCLUDE 'Protheus.ch'
User Function MyPCPA200( Local nOpc := Aviso("EXECAUTO","Qual operação?",{"Alterar","Incluir","Excluir","Sair"},2)
Do Case
Case nOpc == 1 //Alterar empenho
runPCPA200(4)
Case nOpc == 2 //Incluir empenho
runPCPA200(3)
Case nOpc == 3 //Excluir empenho
runPCPA200(5)
EndCase
If nOpc != 4
U_MyPCPA200()
EndIf
Return
Static Function runPCPA200(nOpc)
Local aCab := {}
Local aItem := {}
Local aGets := {}
Local cString := ""
Local cProdutos := ""
Private lMsErroAuto := .F.
Default nOpc := 3
ConOut(Repl("-",80))
ConOut(PadC("Teste de rotina automatica para estrutura de produtos",80))
//Verifica se os produtos que serão utilizados existem cadastrados.
SB1->(dbSetOrder(1))
If !SB1->(dbSeek(xFilial("SB1")+"PA001"))
cProdutos += "PA001, "
EndIf
If !SB1->(dbSeek(xFilial("SB1")+"PI001"))
cProdutos += "PI001, "
EndIf
If !SB1->(dbSeek(xFilial("SB1")+"PI002"))
cProdutos += "PI002, "
EndIf
If !SB1->(dbSeek(xFilial("SB1")+"PI003"))
cProdutos += "PI003, "
EndIf
If !SB1->(dbSeek(xFilial("SB1")+"MP001"))
cProdutos += "MP001, "
EndIf
If !SB1->(dbSeek(xFilial("SB1")+"MP002"))
cProdutos += "MP002, "
EndIf
If !SB1->(dbSeek(xFilial("SB1")+"MP003"))
cProdutos += "MP003, "
EndIf
If !Empty(cProdutos)
Alert("Cadastre os seguintes produtos: " + PadR(cProdutos,Len(cProdutos)-2))
Return
EndIf
If nOpc == 3
aCab := {{"G1_COD" , "PA001" , NIL},; //Código do produto PAI.
{"G1_QUANT" , 5 , NIL},; //Quantidade base do produto PAI.
{"ATUREVSB1", "N" , NIL},; //A variável ATUREVSB1 é utilizada para gerar nova revisão quando MV_REVAUT=.F.
{"NIVALT" , "S" , NIL}} //A variável NIVALT é utilizada para recalcular ou não os níveis da estrutura.
//Adiciona o componente MP001 com sequência em branco na estrutura do PA001.
aGets := {}
aadd(aGets, {"G1_COD" , "PA001" , NIL})
aadd(aGets, {"G1_COMP" , "MP001" , NIL})
aadd(aGets, {"G1_TRT" , Space(3) , NIL})
aadd(aGets, {"G1_QUANT" , 1 , NIL})
aadd(aGets, {"G1_INI" , CTOD("01/01/01"), NIL})
aadd(aGets, {"G1_FIM" , CTOD("31/12/49"), NIL})
aadd(aGets, {"G1_PERDA" , 0 , NIL})
aadd(aItem,aGets)
//Adiciona o componente PI001 com sequência em branco na estrutura do PA001.
aGets := {}
aadd(aGets, {"G1_COD" ,"PA001" , NIL})
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(aItem,aGets)
//Adiciona o componente MP001 com sequência "001" na estrutura do PA001.
aGets := {}
aadd(aGets, {"G1_COD" ,"PA001" , NIL})
aadd(aGets, {"G1_COMP" ,"MP001" , NIL})
aadd(aGets, {"G1_TRT" ,"001" , 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(aItem,aGets)
//Adiciona o componente MP001 com sequência "005" na estrutura do PA001.
aGets := {}
aadd(aGets, {"G1_COD" ,"PA001" , NIL})
aadd(aGets, {"G1_COMP" ,"MP001" , NIL})
aadd(aGets, {"G1_TRT" ,"005" , 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(aItem,aGets)
//Adiciona o componente MP001 na estrutura do PA001.
//Como o G1_TRT não foi informado no array, o programa irá criar um novo TRT para este
//componente, pois ele já está informado nesta estrutura.
aGets := {}
aadd(aGets, {"G1_COD" , "PA001" , NIL})
aadd(aGets, {"G1_COMP" , "MP001" , 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(aItem,aGets)
//Adiciona o componente MP002 com sequência em branco na estrutura do PA001.
aGets := {}
aadd(aGets, {"G1_COD" , "PA001" , NIL})
aadd(aGets, {"G1_COMP" , "MP002" , NIL})
aadd(aGets, {"G1_TRT" , Space(3) , NIL})
aadd(aGets, {"G1_QUANT" , 2 , 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(aItem,aGets)
//Adiciona o componente MP003 com sequência em branco na estrutura do PA001.
aGets := {}
aadd(aGets, {"G1_COD" , "PA001" , 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(aItem,aGets)
//Adiciona o componente MP003 com sequência em branco na estrutura do PI001.
aGets := {}
aadd(aGets, {"G1_COD" , "PI001" , NIL})
aadd(aGets, {"G1_COMP" , "MP003" , NIL})
aadd(aGets, {"G1_TRT" , Space(3) , NIL})
aadd(aGets, {"G1_QUANT" , 3 , 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(aItem,aGets)
//Adiciona o componente MP002 com sequência em branco na estrutura do PI001.
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(aGets, {"G1_FIM" , CTOD("31/12/49") , NIL})
aadd(aItem,aGets)
//Adiciona o componente MP001 com sequência em branco na estrutura do PI001.
aGets := {}
aadd(aGets, {"G1_COD" , "PI001" , 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(aItem,aGets)
//Adiciona o componente PI002 com sequência em branco na estrutura do PI001.
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(aItem,aGets)
//Adiciona o componente MP001 com sequência em branco na estrutura do PI002.
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(aItem,aGets)
//Adiciona o componente MP002 com sequência em branco na estrutura do PI002.
aGets := {}
aadd(aGets, {"G1_COD" , "PI002" , 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(aGets, {"G1_FIM" , CTOD("31/12/49") , NIL})
aadd(aItem,aGets)
//Adiciona o componente MP003 com sequência em branco na estrutura do PI002.
aGets := {}
aadd(aGets, {"G1_COD" , "PI002" , 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(aItem,aGets)
//Adiciona o componente PI003 com sequência em branco na estrutura do PI002.
aGets := {}
aadd(aGets, {"G1_COD" , "PI002" , 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(aItem,aGets)
//Adiciona o componente MP001 com sequência em branco na estrutura do PI003.
aGets := {}
aadd(aGets, {"G1_COD" , "PI003" , 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(aItem,aGets)
//Adiciona o componente MP002 com sequência em branco na estrutura do PI003.
aGets := {}
aadd(aGets, {"G1_COD" , "PI003" , 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(aGets, {"G1_FIM" , CTOD("31/12/49") , NIL})
aadd(aItem,aGets)
//Adiciona o componente MP003 com sequência em branco na estrutura do PI003.
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(aItem,aGets)
ConOut("Teste de Inclusao")
ConOut("Inicio: "+Time())
nStart := Seconds()
MSExecAuto({|x,y,z| PCPA200(x,y,z)},aCab,aItem,3) //Inclusao
ConOut("Fim: " + cValToChar(Seconds()-nStart) + " Segundos.")
ElseIf nOpc == 4
//--------------- Exemplo de Alteração ------------------------------------
aCab := {{"G1_COD" , "PA001" , NIL},; //Código do produto PAI.
{"G1_QUANT" , 5 , NIL},; //Quantidade base do produto PAI.
{"ATUREVSB1", "S" , NIL},; //A variável ATUREVSB1 é utilizada para gerar nova revisão quando MV_REVAUT=.F.
{"AUTREVPAI", " " , NIL},; //A variável AUTREVPAI é utilizada para indicar qual a revisão do produto pai será considerada. Caso não seja enviado, será utilizada a revisão atual do produto.
{"NIVALT" , "S" , NIL}} //A variável NIVALT é utilizada para recalcular ou não os níveis da estrutura.
//Altera o componente MP001 com sequência em branco.
aGets := {}
aadd(aGets, {"G1_COD" ,"PA001" ,NIL})
aadd(aGets, {"G1_COMP" ,"MP001" ,NIL})
aadd(aGets, {"G1_TRT" ,Space(3) ,NIL})
aadd(aGets, {"G1_QUANT" ,10 ,NIL})
aadd(aGets, {"G1_PERDA" ,1 ,NIL})
aadd(aGets, {"G1_INI" ,CTOD("01/01/20") ,NIL})
aadd(aGets, {"G1_FIM" ,CTOD("31/12/49") ,NIL})
aAdd(aGets, {"LINPOS" ,"G1_COD+G1_COMP+G1_TRT","PA001","MP001",Space(3)})
aadd(aItem,aGets)
//Adiciona o componente PI003 com sequência em branco na estrutura do PA001.
aGets := {}
aadd(aGets, {"G1_COD" ,"PA001" ,NIL})
aadd(aGets, {"G1_COMP" ,"PI003" ,NIL})
aadd(aGets, {"G1_TRT" ,Space(3) ,NIL})
aadd(aGets, {"G1_QUANT" ,5 ,NIL})
aadd(aGets, {"G1_PERDA" ,1 ,NIL})
aadd(aGets, {"G1_INI" ,CTOD("01/01/20") ,NIL})
aadd(aGets, {"G1_FIM" ,CTOD("31/12/49") ,NIL})
aadd(aItem,aGets)
//Deleta o componente MP002 da estrutura do PA001.
aGets := {}
aadd(aGets, {"G1_COD" ,"PA001" ,NIL})
aadd(aGets, {"G1_COMP" ,"MP002" ,NIL})
aadd(aGets, {"G1_TRT" ,Space(3) ,NIL})
aadd(aGets, {"G1_QUANT" ,5 ,NIL})
aadd(aGets, {"G1_PERDA" ,1 ,NIL})
aadd(aGets, {"G1_INI" ,CTOD("01/01/20") ,NIL})
aadd(aGets, {"G1_FIM" ,CTOD("31/12/49") ,NIL})
aAdd(aGets, {"LINPOS" ,"G1_COD+G1_COMP+G1_TRT","PA001","MP002",Space(3)})
aAdd(aGets, {"AUTDELETA","S" ,NIL})
aadd(aItem,aGets)
//Adiciona o componente PI002 com sequência "001" na estrutura do PI001.
aGets := {}
aadd(aGets, {"G1_COD" ,"PI001" ,NIL})
aadd(aGets, {"G1_COMP" ,"PI002" ,NIL})
aadd(aGets, {"G1_TRT" ,"001" ,NIL})
aadd(aGets, {"G1_QUANT" ,5 ,NIL})
aadd(aGets, {"G1_PERDA" ,1 ,NIL})
aadd(aGets, {"G1_INI" ,CTOD("01/01/20") ,NIL})
aadd(aGets, {"G1_FIM" ,CTOD("31/12/49") ,NIL})
aadd(aItem,aGets)
ConOut("Teste de Alteracao")
ConOut("Inicio: "+Time())
nStart := Seconds()
MSExecAuto({|x,y,z| PCPA200(x,y,z)},aCab,aItem,4) //Alteração
ConOut("Fim: " + cValToChar(Seconds()-nStart) + " Segundos.")
ElseIf nOpc == 5
//--------------- Exemplo de Exclusao ------------------------------------
SG1->(dbSetOrder(1))
//Verifica se o produto PA001 possui estrutura. Se existir, executa a exclusão.
If SG1->(dbSeek(xFilial("SG1")+"PA001"))
aCab := {{"G1_COD" , "PA001" , NIL},;
{"NIVALT" , "S" , NIL}} //A variável NIVALT é utilizada para recalcular ou não os níveis da estrutura.
ConOut("Teste de Exclusao do codigo PA001")
MSExecAuto({|x,y,z| PCPA200(x,y,z)},aCab,NIL,5) //Exclusao
ConOut("Fim exclusao do codigo PA001.")
EndIf
//Verifica se não aconteceu nenhum erro, e tenta excluir a estrutura do PI001 se existir.
If !lMsErroAuto .And. SG1->(dbSeek(xFilial("SG1")+"PI001"))
aCab := {{"G1_COD" , "PI001" , NIL},;
{"NIVALT" , "S" , NIL}} //A variável NIVALT é utilizada para recalcular ou não os níveis da estrutura.
ConOut("Teste de Exclusao do codigo PI001")
MSExecAuto({|x,y,z| PCPA200(x,y,z)},aCab,NIL,5) //Exclusao
ConOut("Fim exclusao do codigo PI001.")
EndIf
//Verifica se não aconteceu nenhum erro, e tenta excluir a estrutura do PI002 se existir.
If !lMsErroAuto .And. SG1->(dbSeek(xFilial("SG1")+"PI002"))
aCab := {{"G1_COD" , "PI002" , NIL},;
{"NIVALT" , "S" , NIL}} //A variável NIVALT é utilizada para recalcular ou não os níveis da estrutura.
ConOut("Teste de Exclusao do codigo PI002")
MSExecAuto({|x,y,z| PCPA200(x,y,z)},aCab,NIL,5) //Exclusao
ConOut("Fim exclusao do codigo PI002.")
EndIf
//Verifica se não aconteceu nenhum erro, e tenta excluir a estrutura do PI003 se existir.
If !lMsErroAuto .And. SG1->(dbSeek(xFilial("SG1")+"PI003"))
aCab := {{"G1_COD" , "PI003" , NIL},;
{"NIVALT" , "S" , NIL}} //A variável NIVALT é utilizada para recalcular ou não os níveis da estrutura.
ConOut("Teste de Exclusao do codigo PI003")
MSExecAuto({|x,y,z| PCPA200(x,y,z)},aCab,NIL,5) //Exclusao
ConOut("Fim exclusao do codigo PI003.")
EndIf
EndIf
//Verifica se ocorreu algum erro, e exibe a mensagem.
If lMsErroAuto
If IsBlind()
If IsTelnet()
VTDispFile(NomeAutoLog(),.t.)
Else
cString := MemoRead(NomeAutoLog())
Conout("Aviso de Erro:",cString)
EndIf
Else
MostraErro()
EndIf
Else
MsgInfo("Operação realizada com sucesso","OK")
EndIf
ConOut(Repl("-",80))
Return