Árvore de páginas

Versões comparadas

Chave

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

PCPA135 - Pré-estrutura 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:


Nome
Tipo
Descrição
Default
Obrigatório
Referência

PARAMIXB1
Vetor
Array contendo cabeçalho da Estrutura Pré-estrutura de Produtos


X



PARAMIXB2
Vetor
Array contendo os itens que a pré-estrutura possui.







PARAMIXB3
Numérico
Opção desejada: 3-Inclusão; 4-Alteração ; 5-Exclusão


X


Idiomas:Todos

País(es):

Todos

Banco(s) de Dados:

Todos

Sistema(s) Operacional(is):

Todos


Para realizar a alteração em alguma revisão específica da estrutura, pode ser enviado no primeiro parâmetro (PARAMIXB1) a revisão desejada. A revisão deve estar identificada pelo parâmetro "AUTREVPAI" conforme o exemplo acima. Caso este parâmetro não seja enviado, será utilizada a revisão atual do produto para realizar a alteração da estrutura.
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

rotina Pré-estrutura permite simular a Criação de Estruturas de Produtos¹ que a empresa quer fabricar.

O objetivo é controlar a Criação da Estrutura do Produto antes de oficializa-la, podendo transformá-la depois em uma estrutura definitiva, se necessário.

O Sistema controla quais usuários podem transformar uma Pré-Estrutura em uma Estrutura Definitiva por meio da Senha de Usuário.

Além disso, a pré-estrutura pode ser utilizada para simulação da Formação de preços do produto, pela rotina Formação de Preços do ambiente Estoque e Custos.

Bloco de código
languagecpp
firstline1
titleExemplo Inclusão/Alteração/Exclusão:
linenumberstrue
collapsetrue
#INCLUDE 'Protheus.ch'

User Function MyPCPA135(nOpc)
Local aCab  :={}
Local aItem := {}
Local aGets	:= {}
Local lOK	:= .T.
Local cString
Private lMsErroAuto := .F.
Default nOpc := 4

//Abertura do ambiente    

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
firstline1
titleExemplo Inclusão/Alteração/Exclusão:
linenumberstrue
collapsetrue
#INCLUDE 'Protheus.ch'

User Function MyPCPA200(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)    |
RpcSetEnv( "99" , "01" , Nil, NIL})
   aadd(aGets, {"G1_QUANT",1           Nil, "PCP", Nil )
ConOut(Repl("-",80))
ConOut(PadC("Teste de rotina automatica para estrutura de produtos",80))


//Verificacao do ambiente para teste     , NIL})
   aadd(aGets, {"G1_PERDA",0                , NIL} |
dbSelectArea("SB1")
dbSetOrder(1)
   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.
   If !SB1->(MsSeek(xFilial("SB1")+"PA001"))
	lOk := .F.
	ConOut("Cadastrar produto acabado: PA001")
EndIf

If !SB1->(MsSeek(xFilial("SB1")+"PI001"))
	lOk := .F.
	ConOut("Cadastrar produto intermediario: PI001")
EndIf

If !SB1->(MsSeek(xFilial("SB1")+"PI002"))
	lOk := .F.
	ConOut("Cadastrar produto intermediario: PI002")
EndIf

If !SB1->(MsSeek(xFilial("SB1")+"PI003"))
	lOk := .F.
	ConOut("Cadastrar produto intermediario: PA003")
EndIf

If !SB1->(MsSeek(xFilial("SB1")+"MP001"))
	lOk := .F.
	ConOut("Cadastrar produto materia prima: MP001")
EndIf

If !SB1->(MsSeek(xFilial("SB1")+"MP002"))
	lOk := .F.
	ConOut("Cadastrar produto materia prima: MP002")
EndIf

If !SB1->(MsSeek(xFilial("SB1")+"MP003"))
	lOk := .F.
	ConOut("Cadastrar produto materia prima: MP003")
EndIf

If !SB1->(MsSeek(xFilial("SB1")+"MP004"))
	lOk := .F.
	ConOut("Cadastrar produto materia prima: MP004")
EndIf

If nOpc==3 .And. lOk
	aCab := {	{"GG_COD"		,"PA001"			,NIL},;
				{"GG_QUANT"		,2		     		,NIL}} 

	aGets := {}
   	aadd(aGets, 	{"G1GG_COD"  		,"PI002"          , PA001"			,NIL})
   	aadd(aGets, 	{"G1GG_COMP" 		,"PI003PI001"          , 			,NIL})
   	aadd(aGets, 	{"G1GG_TRT"  ,Space(3)		,"   "      , 			,NIL})
   	aadd(aGets, 	{"G1GG_QUANT",1                , 		,1					,NIL})
   	aadd(aGets, 	{"G1GG_PERDA",0                , 		,0					,NIL})
   	aadd(aGets, 	{"G1GG_INI"  		,CTOD("01/01/01") 	, NIL})
   	aadd(aGets, 	{"G1GG_FIM"  		,CTOD("31/12/49") 	, NIL})
   	aadd(aItem,aGets)

	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")
   MSExecAuto({|x,y,z| PCPA200(x,y,z)},aCab,aItem,3) //Inclusão
   ConOut("Fim inclusao.")
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"  := {}
	aadd(aGets,	{"GG_COD"		,"PA001"			,NIL})
	aadd(aGets,	{"GG_COMP"		,"MP001"			,NIL})
	aadd(aGets,	{"GG_TRT"		,Space(3)			,NIL})
	aadd(aGets,	{"GG_QUANT"		,1					,NIL})
	aadd(aGets,	{"GG_PERDA"		,0					,NIL})
	aadd(aGets,	{"GG_INI"		,CTOD("01/01/01")	,NIL})
	aadd(aGets,	{"GG_FIM"		,CTOD("31/12/49")	,NIL})
	aadd(aItem,aGets)
	
	aGets := {}
	aadd(aGets,	{"GG_COD"		,"PA001"			,NIL})
	aadd(aGets,	{"GG_COMP"		,"MP002"			,NIL})
	aadd(aGets,	{"GG_TRT"		,Space(3)			,NIL})
	aadd(aGets,	{"GG_QUANT"		,2					,NIL})
	aadd(aGets,	{"GG_PERDA"		,0					,NIL})
	aadd(aGets,	{"GG_INI"		,CTOD("01/01/01")	,NIL})
	aadd(aGets,	{"GG_FIM"		,CTOD("31/12/49")	,NIL})
	aadd(aItem,aGets)

	aGets := {}
	aadd(aGets,	{"GG_COD"		,"PI002"			,NIL})
	aadd(aGets,	{"GG_COMP"		,"MP003"			,NIL})
	aadd(aGets,	{"GG_TRT"		,Space(3)			,NIL})
	aadd(aGets,	{"GG_QUANT"		,3					,NIL})
	aadd(aGets,	{"GG_PERDA"		,0					,NIL})
	aadd(aGets,	{"GG_INI"		,CTOD("01/01/01")	,NIL})
	aadd(aGets,	{"GG_FIM"		,CTOD("31/12/49")	,NIL})
	aadd(aItem,aGets)

	aGets := {}
	aadd(aGets,	{"GG_COD"		,"PI002" 			,NIL})
	aadd(aGets,	{"GG_COMP"		,"MP001" 			,NIL})
	aadd(aGets,	{"GG_TRT"		,Space(3)			,NIL})
	aadd(aGets,	{"GG_QUANT"		,1					,NIL})
	aadd(aGets,	{"GG_PERDA"		,0					,NIL})
	aadd(aGets,	{"GG_INI"		,CTOD("01/01/01")	,NIL})
	aadd(aGets,	{"GG_FIM"		,CTOD("31/12/49")	,NIL})
	aadd(aItem,aGets)

	aGets := {}
	aadd(aGets,	{"GG_COD"		,"PI001"			,NIL})
	aadd(aGets,	{"GG_COMP"		,"MP002"			,NIL})
	aadd(aGets,	{"GG_TRT"		,Space(3)			,NIL})
	aadd(aGets,	{"GG_QUANT"		,1					,NIL})
	aadd(aGets,	{"GG_PERDA"		,0					,NIL})
	aadd(aGets,	{"GG_INI"		,CTOD("01/01/01")	,NIL})
	aadd(aGets,	{"GG_FIM"		,CTOD("31/12/49")	,NIL})
	aadd(aItem,aGets)

	aGets := {}
	aadd(aGets,	{"GG_COD"		,"PA001"			,NIL})
	aadd(aGets,	{"GG_COMP"		,"PI003" 			,NIL})
	aadd(aGets,	{"GG_TRT"		,Space(3)			,NIL})
	aadd(aGets,	{"GG_QUANT"		,1					,NIL})
	aadd(aGets,	{"GG_PERDA"		,0					,NIL})
	aadd(aGets,	{"GG_INI"		,CTOD("01/01/01")	,NIL})
	aadd(aGets,	{"GG_FIM"		,CTOD("31/12/49")	,NIL})
	aadd(aItem,aGets)

	aGets := {}
	aadd(aGets,	{"GG_COD"		,"PA001"			,NIL})
	aadd(aGets,	{"GG_COMP"		,"MP004" 			,NIL})
	aadd(aGets,	{"GG_TRT"		,Space(3)			,NIL})
	aadd(aGets,	{"GG_QUANT"		,1					,NIL})
	aadd(aGets,	{"GG_PERDA"		,0					,NIL})
	aadd(aGets,	{"GG_INI"		,CTOD("01/01/01")	,NIL})
	aadd(aGets,	{"GG_FIM"		,CTOD("31/12/49") 	,NIL})
   	aadd(aItem,aGets)

   //Deleta o componente MP002 da estrutura do PA001.
   	aGets := {}
   	aadd(aGets, 	{"G1GG_COD"  		,"PA001"          PI003"			,NIL})
   	aadd(aGets, 	{"G1GG_COMP" ,"MP002"          		,"MP003" 			,NIL})
   	aadd(aGets, 	{"G1GG_TRT"  		,Space(3)         			,NIL})
   	aadd(aGets, 	{"G1GG_QUANT",5                		,1					,NIL})
   	aadd(aGets, 	{"G1_PERDA",1                GG_PERDA"		,0					,NIL})
   	aadd(aGets, 	{"G1GG_INI"  		,CTOD("01/01/2001") 	,NIL})
   	aadd(aGets, 	{"G1GG_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.
   	aadd(aItem,aGets)
	ConOut("Teste de Inclusao")
	ConOut("Inicio: "+Time())
	MSExecAuto({|x,y,z| PCPA135(x,y,z)},aCab,aItem,3) //Inclusao
	ConOut("Fim: "+Time())
ElseIf nOpc == 4 .And. lOk
	//--------------- Exemplo de Alteração ------------------------------------
	aCab := { {"GG_COD", "PA001", NIL}}
	
	aGets := {}
   	aadd(aGets, 	{"G1GG_COD"  		,"PI001"          PA001"			,NIL})
   	aadd(aGets, 	{"G1GG_COMP" 		,"PI002MP001"          			,NIL})
   	aadd(aGets, 	{"G1GG_TRT"  ,"001"            		,Space(3)			,NIL})
   	aadd(aGets, 	{"G1GG_QUANT",5                		,5					,NIL})
   	aadd(aGets, 	{"G1GG_PERDA",1                		,1					,NIL})
   	aadd(aGets, 	{"G1GG_INI"  		,CTOD("01/01/2001") 	,NIL})
   	aadd(aGets, 	{"G1GG_FIM"  		,CTOD("31/12/49")49")	,NIL})
	aAdd(aGets, {"AUTDELETA"    ,"S"                ,NIL})
   aadd(aItem,aGets)

   ConOut("Teste de Alteracao")
   MSExecAuto({|x,y,z| PCPA200(x,y,z)},aCab,aItem,4) //Alteração
   ConOut("Fim alteracao.")

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")
      	aAdd(aGets, {"LINPOS"       ,"GG_COD+GG_COMP+GG_TRT","PA001","MP001",Space(3)})
	aadd(aItem,aGets)
	
	aGets := {}
	aadd(aGets,	{"GG_COD"		,"PA001"			,NIL})
	aadd(aGets,	{"GG_COMP"		,"PI003" 			,NIL})
	aadd(aGets,	{"GG_TRT"		,"001"	     		,NIL})
	aadd(aGets,	{"GG_QUANT"		,5					,NIL})
	aadd(aGets,	{"GG_PERDA"		,1					,NIL})
	aadd(aGets,	{"GG_INI"		,CTOD("01/01/20")	,NIL})
	aadd(aGets,	{"GG_FIM"		,CTOD("31/12/49")	,NIL})
	aAdd(aGets, {"LINPOS"       ,"GG_COD+GG_COMP+GG_TRT","PA001","PI003",Space(3)})
	aadd(aItem,aGets)

	ConOut("Teste de Alteracao")
	ConOut("Inicio: "+Time())
	MSExecAuto({|x,y,z| PCPA200PCPA135(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"))
      aItem,4) //Alteração
	ConOut("Fim: "+Time())

ElseIf lOk
	//--------------- Exemplo de Exclusao ------------------------------------
	aCab := {	{"G1GG_COD" 		, "PI001" , NIL},;
               {"NIVALT" , "S"     , NIL}} //A variável NIVALT é utilizada para recalcular ou não os níveis da estrutura.

      PA001"			,NIL}} 
	ConOut("Teste de Exclusao do codigo PI001PA001")
      	ConOut("Inicio: "+Time())
	MSExecAuto({|x,y,z| PCPA200PCPA135(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"))
      //Exclusao
	lOk := !lMsErroAuto
	ConOut("Fim: "+Time())


	aCab := {	{"G1GG_COD" 		, "PI002PI001" 			, 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")
	ConOut("Inicio: "+Time())
	MSExecAuto({|x,y,z| PCPA135(x,y,z)},aCab,NIL,5) //Exclusao
	lOk := !lMsErroAuto
	ConOut("Fim: "+Time())
	
	aCab := {	{"GG_COD"		,"PI002"			,NIL}} 
	ConOut("Teste de Exclusao do codigo PI002")
      do codigo PI002")
	ConOut("Inicio: "+Time())
	MSExecAuto({|x,y,z| PCPA200PCPA135(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"))
      5) //Exclusao
	lOk := !lMsErroAuto
	ConOut("Fim: "+Time())

	aCab := {	{"G1_COD" , "PI003" , NIL},;
               {"NIVALT" , "S"     , NIL}} //A variável NIVALT é utilizada para recalcular ou não os níveis da estrutura.

      GG_COD"		,"PI003"			,NIL}} 
	ConOut("Teste de Exclusao do codigo PI003")
      	ConOut("Inicio: "+Time())
	MSExecAuto({|x,y,z| PCPA200PCPA135(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()
      : "+Time())
EndIf
If lMsErroAuto
	//MostraErro()
	If IsBlind()
		If IsTelnet()
         			VTDispFile(NomeAutoLog(),.t.)
      Else
         		Else
			cString := MemoRead(NomeAutoLog())
         			Conout("Aviso de Erro:",cString)
      		EndIf
   	Else
      		MostraErro()
   	EndIf
Else
	If lOk
		Aviso("Aviso","Incluido  MsgInfo("Operação realizada com sucesso","OK")
EndIf
ConOut(Repl("-",80))
Return
com sucesso",{"Ok"})
	Else
		Aviso("Aviso","Fazer os devidos cadastros",{"Ok"})
	EndIf
Endif
Return

Sintaxe:

PCPA135 - Pré

Sintaxe:

PCPA200 -Estrutura de Produtos ( PARAMIXB1, PARAMIXB2, PARAMIXB3 ) --> Nil

Retorno:

Nil (nulo)

   Nil

Observações:
Dica
titleRevisões
Dica
titleOperação de Alteração

Para a operação de Alteração de estruturas, não é necessário enviar todos os componentes da estrutura no segundo parâmetro (PARAMIXB2). O programa irá fazer alterações somente para os componentes que forem informados no segundo parâmetro.

Para alterar um componente que faz parte da estrutura será necessário utilizar o parâmetro LINPOS, conforme exemplo acima.

Para excluir um componente que faz parte da estrutura será necessário utilizar os parâmetros LINPOS e AUTDELETA, conforme exemplo acima.

Para adicionar um novo componente na estrutura, não é necessário utilizar os parâmetro LINPOS e AUTDELETA, sendo necessário apenas as informações do componente para que a inclusão seja feita.

A operação de alteração é realizada quando o terceiro parâmetro (PARAMIXB3) é enviado com o valor 4.

Dica
titleOperação de Exclusão

Para a operação de Exclusão, o segundo parâmetro (PARAMIXB2) é ignorado pois são excluídos todos os componentes relacionados ao produto PAI, que é informado no primeiro parâmetro (PARAMIXB1).

A operação de exclusão é realizada quando o terceiro parâmetro (PARAMIXB3) é enviado com o valor 5.