Passo a passo: | Para realizar manutenção nos empenhos da ordem de produção, pode-se utilizar o programa MATA381. Através da execução automática do programa MATA381 é possível realizar a alteração de empenhos em lotes. Cada execução do programa MATA381 irá permitir alterar os empenhos de determinada ordem de produção. A execução automática do programa MATA381 recebe 3 parâmetros. - Parâmetro 1 → Array com as informações do cabeçalho do programa de empenhos múltiplos (MATA381). Obrigatório enviar o número da ordem de produção. Pode ser enviado neste array o índice de busca dos dados na tabela SD4 e também o parâmetro AUTZERAEMP. Ambos serão citados nos exemplos.
- Parâmetro 2 → Array com as informações dos empenhos que serão processados pelo programa. Para as operações de Exclusão de empenhos e Zerar empenhos, este parâmetro é opcional.
- Parâmetro 3 → Operação que será executada pela rotina automática. Os valores aceitos são: 3 → Inclusão; 4 → Alteração; 5 → Exclusão.
- Exemplo para inclusão de empenhos:
No array com as informações do cabeçalho, é necessário enviar apenas o número da ordem de produção. No array de itens, é necessário informar todas as informações do empenho que será incluído. Informações de Endereços podem ser enviadas através da opção AUT_D4_END conforme exemplo. Quando o empenho possui controle de lote e o lote é enviado para geração do empenho, não é necessário enviar a data de validade do lote. O programa MATA381 preenche a validade do lote automaticamente. Para inclusão dos empenhos, enviar o 3° parâmetro do MATA381 com o valor 3.
Bloco de código |
---|
language | cpp |
---|
firstline | 1 |
---|
title | Exemplo de inclusão de empenhos |
---|
linenumbers | true |
---|
collapse | true |
---|
| User Function Inc381Auto()
Local aCab := {}
Local aLine := {}
Local aItens := {}
Local aEnder := {}
Local aLineEnder := {}
PRIVATE lMsErroAuto := .F.
//Monta o cabeçalho com o número da OP que será utilizada para inclusão dos empenhos.
aCab := {{"D4_OP","00130301001",NIL}}
//Adiciona novo empenho
aLine := {}
aAdd(aLine,{"D4_OP" ,"00130301001" ,NIL})
aAdd(aLine,{"D4_COD" ,"MP01" ,NIL})
aAdd(aLine,{"D4_LOCAL" ,"01" ,NIL})
aAdd(aLine,{"D4_DATA" ,CtoD("18/09/2018"),NIL})
aAdd(aLine,{"D4_QTDEORI",10 ,NIL})
aAdd(aLine,{"D4_QUANT" ,10 ,NIL})
aAdd(aLine,{"D4_TRT" ,"001" ,NIL})
//Adiciona a linha do empenho no array de itens.
aAdd(aItens,aLine)
//Adiciona novo empenho com utilização de Lote.
//A data de validade do lote é preenchida automaticamente pelo programa e não precisa ser enviada no array.
aLine := {}
aAdd(aLine,{"D4_OP" ,"00130301001" ,NIL})
aAdd(aLine,{"D4_COD" ,"MP02" ,NIL})
aAdd(aLine,{"D4_LOCAL" ,"01" ,NIL})
aAdd(aLine,{"D4_DATA" ,CtoD("18/09/2018"),NIL})
aAdd(aLine,{"D4_QTDEORI",3 ,NIL})
aAdd(aLine,{"D4_QUANT" ,3 ,NIL})
aAdd(aLine,{"D4_LOTECTL","L1" ,NIL})
aAdd(aLine,{"D4_TRT" ,"002" ,NIL})
//Adiciona a linha do empenho no array de itens.
aAdd(aItens,aLine)
//Adiciona novo empenho com endereço e lote
aLine := {}
aAdd(aLine,{"D4_OP" ,"00130301001" ,NIL})
aAdd(aLine,{"D4_COD" ,"MP03" ,NIL})
aAdd(aLine,{"D4_LOCAL" ,"01" ,NIL})
aAdd(aLine,{"D4_DATA" ,CtoD("17/09/2018"),NIL})
aAdd(aLine,{"D4_QTDEORI",10 ,NIL})
aAdd(aLine,{"D4_QUANT" ,10 ,NIL})
aAdd(aLine,{"D4_LOTECTL","L1" ,NIL})
aAdd(aLine,{"D4_TRT" ,"003" ,NIL})
aAdd(aLine,{"D4_ROTEIRO","01" ,NIL})
//Informações do endereço
aEnder := {}
aLineEnder := {}
aAdd(aLineEnder,{"DC_LOCALIZ","END01",Nil})
aAdd(aLineEnder,{"DC_QUANT" ,5 ,Nil})
//Primeiro endereço que será utilizado
aAdd(aEnder,aLineEnder)
aLineEnder := {}
aAdd(aLineEnder,{"DC_LOCALIZ","END02",Nil})
aAdd(aLineEnder,{"DC_QUANT" ,5 ,Nil})
//Segundo endereço que será utilizado
aAdd(aEnder,aLineEnder)
//Adiciona os endereços na linha do empenho
aAdd(aLine,{"AUT_D4_END",aEnder,Nil})
//Adiciona a linha do empenho no array de itens.
aAdd(aItens,aLine)
//Executa o MATA381, com a operação de Inclusão.
MSExecAuto({|x,y,z| mata381(x,y,z)},aCab,aItens,3)
If lMsErroAuto
//Se ocorrer erro.
MostraErro()
Else
Alert("Incluído com sucesso.")
EndIf
Return |
2. Exemplo para Alteração de empenhos. No array do cabeçalho, é necessário enviar o número da ordem de produção e a chave INDEX com o valor 2, para que o sistema altere a ordem de produção correta. No array de itens, pode-se enviar apenas as informações dos empenhos que estão sendo modificados. Empenhos que já estão cadastrados na tabela SD4 e não irão sofrer nenhuma alteração não precisam ser carregados no array. Informações de Endereços podem ser enviadas através da opção AUT_D4_END conforme exemplo. Quando o empenho possui controle de lote e o lote é enviado para geração do empenho, não é necessário enviar a data de validade do lote. O programa MATA381 preenche a validade do lote automaticamente. Para alterar um empenho que está cadastrado na SD4, é necessário utilizar o identificador LINPOS. A chave utilizada no LINPOS deverá ser a seguinte concatenação: - D4_COD+D4_TRT+D4_LOTECTL+D4_NUMLOTE+D4_LOCAL+D4_OPORIG+D4_SEQ. Verificar a utilização correta no exemplo.
Para excluir um empenho que está cadastrado na SD4, é necessário utilizar o identificador LINPOS em conjunto com a chave AUTDELETA. A chave utilizada no LINPOS deverá ser a seguinte concatenação: - D4_COD+D4_TRT+D4_LOTECTL+D4_NUMLOTE+D4_LOCAL+D4_OPORIG+D4_SEQ. Verificar a utilização correta no exemplo.
Para alteração das informações da tabela SDC que estão ligadas ao empenho, deve-se utilizar os identificadores LINPOS e AUTDELETA da mesma forma que é utilizado para os registros da tabela SD4.
Para adicionar um novo empenho, basta adicionar as informações deste novo empenho no array de itens. Para alteração dos empenhos, enviar o 3° parâmetro do MATA381 com o valor 4. Bloco de código |
---|
language | cpp |
---|
firstline | 1 |
---|
title | Exemplo de alteração de empenhos |
---|
linenumbers | true |
---|
collapse | true |
---|
| User Function Alt381Auto()
Local nX := 0
Local aCab := {}
Local aLine := {}
Local aItens := {}
Local aLineEnder := {}
Local aEnder := {}
PRIVATE lMsErroAuto := .F.
//Monta o cabeçalho com o número da OP que será alterada. Necessário utilizar o índice 2 para efetuar a alteração.
aCab := {{"D4_OP","00130301001",NIL},;
{"INDEX",2,Nil}}
//Seta o índice da SDC
SDC->(dbSetOrder(2))
//Busca os empenhos da SD4 para alterar/excluir.
SD4->(dbSetOrder(2))
SD4->(dbSeek(xFilial("SD4")+PadR("00130301001",Len(SD4->D4_OP))))
While SD4->(!Eof()) .And. SD4->(D4_FILIAL+D4_OP) == xFilial("SD4")+PadR("00130301001",Len(SD4->D4_OP))
//Adiciona as informações do empenho, conforme estão na tabela SD4.
aLine := {}
For nX := 1 To SD4->(FCount())
aAdd(aLine,{SD4->(Field(nX)),SD4->(FieldGet(nX)),Nil})
Next nX
//Adiciona o identificador LINPOS para identificar que o registro já existe na SD4
aAdd(aLine,{"LINPOS","D4_COD+D4_TRT+D4_LOTECTL+D4_NUMLOTE+D4_LOCAL+D4_OPORIG+D4_SEQ",;
SD4->D4_COD,;
SD4->D4_TRT,;
SD4->D4_LOTECTL,;
SD4->D4_NUMLOTE,;
SD4->D4_LOCAL,;
SD4->D4_OPORIG,;
SD4->D4_SEQ})
//Marca o empenho do produto "MP" como Excluído.
If AllTrim(SD4->D4_COD) == "MP01"
aAdd(aLine,{"AUTDELETA","S",Nil})
ElseIf AllTrim(SD4->D4_COD) == "MP02"
//Altera a quantidade do empenho do produto "9617-MP1"
//Busca a informação da quantidade (D4_QTDEORI) no array aLine.
nX := aScan(aLine,{|x| x[1] == "D4_QTDEORI"})
If nX > 0
//Encontrou o valor da quantidade. Faz a alteração do valor.
aLine[nX,2] := 10
EndIf
//Altera também o saldo do empenho
nX := aScan(aLine,{|x| x[1] == "D4_QUANT"})
If nX > 0
//Encontrou o valor da quantidade. Faz a alteração do valor.
aLine[nX,2] := 10
EndIf
ElseIf AllTrim(SD4->D4_COD) == "MP03"
//Altera os endereços utilizado no empenho do produto "9617-MP2"
//Primeiro carrega os endereços utilizados.
If SDC->(dbSeek(xFilial("SDC")+SD4->(D4_COD+D4_LOCAL+D4_OP+D4_TRT+D4_LOTECTL+D4_NUMLOTE)))
//Inicializa o array aEnder
aEnder := {}
//Busca os registros da tabela SDC
While SDC->(!Eof()) .And. ;
xFilial("SDC")+SD4->(D4_COD+D4_LOCAL+D4_OP+D4_TRT+D4_LOTECTL+D4_NUMLOTE) == ;
SDC->(DC_FILIAL+DC_PRODUTO+DC_LOCAL+DC_OP+DC_TRT+DC_LOTECTL+DC_NUMLOTE)
//Inicializa o array aLineEnder
aLineEnder := {}
//Carrega as informações da tabela SDC no array aLineEnder
For nX := 1 To SDC->(FCount())
aAdd(aLineEnder,{SDC->(Field(nX)),SDC->(FieldGet(nX)),Nil})
Next nX
//Adiciona o identificador LINPOS para identificar que o registro já existe na tabela SDC
aAdd(aLineEnder,{"LINPOS","DC_LOCALIZ+DC_NUMSERI",;
SDC->DC_LOCALIZ,;
SDC->DC_NUMSERI})
//Verifica se é o endereço "END". Se for, marca a linha para exclusão.
If AllTrim(SDC->DC_LOCALIZ) == "END01"
aAdd(aLineEnder,{"AUTDELETA","S",NIL})
ElseIf AllTrim(SDC->DC_LOCALIZ) == "END02"
//Verifica se é o endereço "END02". Se for, altera a quantidade.
//Busca a posição em que a quantidade está no array aLineEnder.
nX := aScan(aLineEnder,{|x| x[1] == "DC_QUANT"})
If nX > 0
//Encontrou a quantidade no array aLineEnder. Faz a alteração da quantidade.
aLineEnder[nX,2] := 8
EndIf
EndIf
//Adiciona o endereço no array de endereços.
aAdd(aEnder,aLineEnder)
//Próximo registro da SDC
SDC->(dbSkip())
End
//Adiciona um novo endereço para ser incluído na tabela SDC.
//Inicializa o array aLineEnder
aLineEnder := {}
//Adiciona as informações do novo endereço.
aAdd(aLineEnder,{"DC_LOCALIZ","END03",Nil})
aAdd(aLineEnder,{"DC_QUANT" ,2 ,Nil})
//Adiciona o novo endereço no array de endereços.
aAdd(aEnder,aLineEnder)
//Adiciona as informações de alteração de endereço no array do Empenho.
aAdd(aLine,{"AUT_D4_END",aEnder,Nil})
EndIf
EndIf
//Adiciona as informações do empenho no array de itens.
aAdd(aItens,aLine)
//Próximo registro da SD4.
SD4->(dbSkip())
End
//Adiciona um novo empenho
aLine := {}
aAdd(aLine,{"D4_OP" ,"00130301001" ,NIL})
aAdd(aLine,{"D4_COD" ,"MP04" ,NIL})
aAdd(aLine,{"D4_LOCAL" ,"01" ,NIL})
aAdd(aLine,{"D4_DATA" ,CtoD("17/09/2018"),NIL})
aAdd(aLine,{"D4_QTDEORI",5 ,NIL})
aAdd(aLine,{"D4_QUANT" ,5 ,NIL})
aAdd(aLine,{"D4_LOTECTL","L1" ,NIL})
aAdd(aLine,{"D4_TRT" ,"004" ,NIL})
aAdd(aLine,{"D4_ROTEIRO","01" ,NIL})
aAdd(aItens,aLine)
//Executa o MATA381, com a operação de Alteração.
MSExecAuto({|x,y,z| mata381(x,y,z)},aCab,aItens,4)
If lMsErroAuto
//Se ocorrer erro.
MostraErro()
Else
Alert("Alterado com sucesso.")
EndIf
Return |
3. Exemplo para zerar os empenhos de uma ordem de produção No array do cabeçalho, é necessário enviar o número da ordem de produção e a chave INDEX com o valor 2, para que o sistema altere a ordem de produção correta. No array de itens não é necessário enviar nenhuma informação. Mesmo que sejam enviadas as informações dos empenhos no array de Itens, essas informações serão desconsideradas no processamento de zerar os empenhos. A função de zerar os empenhos é feita da seguinte forma: 1 - Executar o ExecAuto do MATA381 utilizando a opção de Alteração (4); 2 - Nas informações do Cabeçalho, enviar o identificador AUTZERAEMP com o valor .T. Não é possível zerar apenas um empenho da ordem de produção. Sempre que esta opção for executada, todos os empenhos da OP serão zerados. Para zerar os empenhos, enviar o 3° parâmetro do MATA381 com o valor 4. Bloco de código |
---|
language | cpp |
---|
firstline | 1 |
---|
title | Exemplo para zerar os empenhos de uma ordem de produção |
---|
linenumbers | true |
---|
collapse | true |
---|
| User Function Zera381Aut()
Local aCab := {}
Local aItens := {}
PRIVATE lMsErroAuto := .F.
//Monta o cabeçalho com as informações da ordem de produção que terá os empenhos zerados.
//O parâmetro AUTZERAEMP identifica que será realizado o processo de zerar empenhos.
aCab := {{"D4_OP","00130301001",NIL},;
{"AUTZERAEMP",.T.,Nil},;
{"INDEX",2,Nil}}
//Executa o MATA381 com a operação 4, e o indicador para zerar os empenhos.
MSExecAuto({|x,y,z| mata381(x,y,z)},aCab,aItens,4)
If lMsErroAuto
//Se ocorrer erro.
MostraErro()
Else
//Processamento realizado com sucesso
Alert("Empenhos zerados com sucesso.")
EndIf
Return |
4. Exemplo de exclusão de empenhos No array do cabeçalho, é necessário enviar o número da ordem de produção e a chave INDEX com o valor 2, para que o sistema altere a ordem de produção correta. No array de itens não é necessário enviar nenhuma informação. Mesmo que sejam enviadas as informações dos empenhos no array de Itens, essas informações serão desconsideradas no processamento de exclusão dos empenhos. Para exclusão, enviar o 3° parâmetro do MATA381 com o valor 5. Sempre serão excluídos todos os empenhos da ordem. Se for necessário excluir apenas um empenho da ordem, deverá ser utilizada a operação de Alteração, junto com os identificadores AUTDELETA e LINPOS, conforme exemplo da operação de Alteração. Bloco de código |
---|
language | cpp |
---|
firstline | 1 |
---|
title | Exemplo de exclusão de empenhos |
---|
linenumbers | true |
---|
collapse | true |
---|
| User Function Del381Auto()
Local aCab := {}
Local aItens := {}
PRIVATE lMsErroAuto := .F.
//Monta o cabeçalho com a informação da Ordem de produção que terá os empenhos excluídos.
aCab := {{"D4_OP","00130301001",NIL},;
{"INDEX",2,Nil}}
//Executa o MATA381 para exclusão dos empenhos.
MSExecAuto({|x,y,z| mata381(x,y,z)},aCab,aItens,5)
If lMsErroAuto
//Se ocorrer erro.
MostraErro()
Else
//Processamento realizado com sucesso
Alert("Excluído com sucesso.")
EndIf
Return |
|