Exemplos:
Produto: | Protheus |
Ocorrência: | Como utilizar a rotina Empenhos Múltiplos (MATA381) via execução automática (MsExecAuto)? |
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.
1. 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. Exemplo de inclusão de empenhos 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. Observação: a chave INDEX deve, obrigatoriamente, ser o último elemento do array. 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:
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:
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. Exemplo de alteração de empenhos 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 //Altera também o lote do empenho nX := aScan(aLine,{|x| x[1] == "D4_LOTECTL"}) If nX > 0 //Encontrou o valor da quantidade. Faz a alteração do valor. aLine[nX,2] := "LOTE1" 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. Observação: a chave INDEX deve, obrigatoriamente, ser o último elemento do array. 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); 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. Exemplo para zerar os empenhos de uma ordem de produção 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 exclua os empenhos da ordem de produção correta. Observação: a chave INDEX deve, obrigatoriamente, ser o último elemento do array. Se o empenho possuir relacionamento com a lista de compras vinda da integração com o PIMS (tabela NLI), o registro na tabela NLI será excluído juntamente com o empenho. 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. Exemplo de exclusão de empenhos 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 5 - Exemplo para inclusão de empenhos com integração com o PIMS: 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 referente a integração com o PIMS podem ser enviadas através da opção AUT_D4_AGR 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. Exemplo de Inclusão de empenhos com integração com o PIMS 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 informações referente a integração com o PIMS aLineNLI := {} aAdd( aLineNLI, { "NLI_CLVAL", "02", Nil } ) aAdd( aLineNLI, { "NLI_FAZ", "001", NIL } ) aAdd( aLineNLI, { "NLI_QTCOMP", 20, NIL } ) aAdd( aLineNLI, { "NLI_PMSQTD", 15, NIL } ) aAdd( aLineNLI, { "NLI_PGQTD", 25, NIL } ) aAdd( aLineNLI, { "NLI_POPQTD", 35, NIL } ) aAdd( aLineNLI, { "NLI_NUMPEN", 01, NIL } ) aAdd( aLineNLI, { "NLI_QTDPAR", 5000, NIL } ) aAdd( aLineNLI, { "NLI_CULTRA", "01", NIL } ) aAdd( aLineNLI, { "NLI_CC", "0010" , NIL } ) aAdd( aLineNLI, { "NLI_FITSSA", "10", NIL } ) aAdd( aLineNLI, { "NLI_REQCOD", "admin", NIL } ) aAdd( aLineNLI, { "NLI_REQNOM", "admin", NIL } ) aAdd(aLine,{"AUT_D4_AGR",aLineNLI,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 informações referente a integração com o PIMS aLineNLI := {} aAdd( aLineNLI, { "NLI_CLVAL", "02", Nil } ) aAdd( aLineNLI, { "NLI_FAZ", "001", NIL } ) aAdd( aLineNLI, { "NLI_QTCOMP", 20, NIL } ) aAdd( aLineNLI, { "NLI_PMSQTD", 15, NIL } ) aAdd( aLineNLI, { "NLI_PGQTD", 41, NIL } ) aAdd( aLineNLI, { "NLI_POPQTD", 60, NIL } ) aAdd( aLineNLI, { "NLI_NUMPEN", 01, NIL } ) aAdd( aLineNLI, { "NLI_QTDPAR", 7000, NIL } ) aAdd( aLineNLI, { "NLI_CULTRA", "01", NIL } ) aAdd( aLineNLI, { "NLI_CC", "0010" , NIL } ) aAdd( aLineNLI, { "NLI_FITSSA", "10", NIL } ) aAdd( aLineNLI, { "NLI_REQCOD", "admin", NIL } ) aAdd( aLineNLI, { "NLI_REQNOM", "admin", NIL } ) aAdd(aLine,{"AUT_D4_AGR",aLineNLI,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 informações referente a integração com o PIMS aLineNLI := {} aAdd( aLineNLI, { "NLI_CLVAL", "02", Nil } ) aAdd( aLineNLI, { "NLI_FAZ", "001", NIL } ) aAdd( aLineNLI, { "NLI_QTCOMP", 20, NIL } ) aAdd( aLineNLI, { "NLI_PMSQTD", 15, NIL } ) aAdd( aLineNLI, { "NLI_PGQTD", 25, NIL } ) aAdd( aLineNLI, { "NLI_POPQTD", 40, NIL } ) aAdd( aLineNLI, { "NLI_NUMPEN", 01, NIL } ) aAdd( aLineNLI, { "NLI_QTDPAR", 900, NIL } ) aAdd( aLineNLI, { "NLI_CULTRA", "01", NIL } ) aAdd( aLineNLI, { "NLI_CC", "0010" , NIL } ) aAdd( aLineNLI, { "NLI_FITSSA", "10", NIL } ) aAdd( aLineNLI, { "NLI_REQCOD", "admin", NIL } ) aAdd( aLineNLI, { "NLI_REQNOM", "admin", NIL } ) aAdd(aLine,{"AUT_D4_AGR",aLineNLI,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 6. 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, como ultimo item do array, 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:
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:
Para alteração das informações da tabela NLI 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. Exemplo de alteração com integração com o PIMS 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 as informações da lista de compras (NLI)do empenho, conforme estão na tabela SD4. aLineNLI := {} For nX := 1 To SD4->(FCount()) aAdd(aLineNLI,{SD4->(Field(nX)),SD4->(FieldGet(nX)),Nil}) Next nX If len(aLineNLI) > 0 aAdd(aLine,{"AUT_D4_AGR",aLineNLI,NIL}) Endif //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}) //Adiciona informações referente a integração com o PIMS aLineNLI := {} aAdd( aLineNLI, { "NLI_CLVAL", "02", Nil } ) aAdd( aLineNLI, { "NLI_FAZ", "001", NIL } ) aAdd( aLineNLI, { "NLI_QTCOMP", 20, NIL } ) aAdd( aLineNLI, { "NLI_PMSQTD", 15, NIL } ) aAdd( aLineNLI, { "NLI_PGQTD", 25, NIL } ) aAdd( aLineNLI, { "NLI_POPQTD", 35, NIL } ) aAdd( aLineNLI, { "NLI_NUMPEN", 01, NIL } ) aAdd( aLineNLI, { "NLI_QTDPAR", 5000, NIL } ) aAdd( aLineNLI, { "NLI_CULTRA", "01", NIL } ) aAdd( aLineNLI, { "NLI_CC", "0010" , NIL } ) aAdd( aLineNLI, { "NLI_FITSSA", "10", NIL } ) aAdd( aLineNLI, { "NLI_REQCOD", "admin", NIL } ) aAdd( aLineNLI, { "NLI_REQNOM", "admin", NIL } ) aAdd(aLine,{"AUT_D4_AGR",aLineNLI,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 |
Observações: | Para o correto funcionamento, a versão do fonte MATA381 deve ser igual ou superior a data de |