Eventos: | /* ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± ±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍ»±± ±±ºPrograma ³ FM_RESITE º Autor ³ Rubens Takahashi º Data ³ 04/10/09 º±± ±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍ͹±± ±±ºDesc. ³ Registra a Reserva do Item na Entrada da Nota Fiscal de º±± ±±º ³ Entrada º±± ±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±± ±±ºUso ³ SIGAOFI º±± ±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±± ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß */ Function FM_RESITE(_cProduto, _cLocal, _cPedC, _cItemPedC, _cDtDigit, _nQtdeCompra, _cFornece, _cLoja, _cDoc, _cSerie, _cSugCom)
Local lReserva := ( GetNewPar("MV_RITEORC","N") == "S" ) Local aArea, nSaldo, nQtdeRes, cSugCompra Local cQuery, cQueryTmp
Local cOriReqAnt := "" Local cForPedAnt := "" Local cDocumento := ""
Local lVSJSUGCOM := (VSJ->(FieldPos("VSJ_SUGCOM")) <> 0) Local nRecVSJ := 0
Local aItemMov := {} Local oEst := DMS_Estoque():New()
Private lMsErroAuto := .f.
aArea := sGetArea(aArea,"SB1") aArea := sGetArea(aArea,"SB2") aArea := sGetArea(aArea,"SB5") If !Empty(Alias()) aArea := sGetArea(aArea,Alias()) EndIf
dbSelectArea("VE6") dbSetOrder(4) // VE6_INDREG + VE6_CODIGO + VE6_GRUITE + VE6_CODITE
dbSelectArea("VSJ") dbSetOrder(1) // VSJ_NUMOSV+VSJ_GRUITE+VSJ_CODITE
dbSelectArea("SB1") dbSetOrder(1) // B1_COD dbSeek(xFilial("SB1")+_cProduto)
dbSelectArea("SB2") dbSetOrder(1) // B2_COD+B2_LOCAL
if ExistBlock("PRESITE") ExecBlock("PRESITE", .f., .f., {_cProduto, _cLocal, _cPedC, _cItemPedC, _cDtDigit, _nQtdeCompra, _cFornece, _cLoja, _cDoc, _cSerie, _cSugCom}) Return Endif //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³Monta um cursor com os registros que sofrerão alteracao³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ cQuery := "SELECT VE6.R_E_C_N_O_ NUMREG, VE6_NUMOSV, VE6_NUMORC, VE6_PEDCOM, VE6_ITEMPC" cQuery += " FROM "+RetSQLName("VE6")+" VE6" cQuery += " WHERE VE6_FILIAL = '" + xFilial("VE6") + "'" cQuery += " AND VE6_SUGCOM = '" + _cSugCom + "'" cQuery += " AND VE6_GRUITE = '" + SB1->B1_GRUPO + "'" cQuery += " AND VE6_CODITE = '" + SB1->B1_CODITE + "'" cQuery += " AND VE6_INDREG IN ('0', '4')" // S O M E N T E C O M P R A cQuery += " AND (VE6_NUMORC <> ' ' OR VE6_NUMOSV <> ' ')" // Deve possuir numero de Orcamento ou OS cQuery += " AND VE6.D_E_L_E_T_ = ' '" cQuery += " ORDER BY R_E_C_N_O_" TCQUERY cQuery NEW ALIAS "TVE6" dbSelectArea("TVE6") While !TVE6->(Eof())
dbSelectArea("VE6") VE6->(dbGoTo(TVE6->NUMREG))
If OX001020B_RetornaStatusOrcamento(VE6->VE6_ORIREQ,If(VE6->VE6_ORIREQ == "2",VE6->VE6_NUMOSV,VE6->VE6_NUMORC),VE6->VE6_GRUITE,VE6->VE6_CODITE) == "C" // se status for igual a cancelado, deve armazenar no padrão TVE6->(dbSkip()) Loop Endif Do Case // Verifica origem da Sugestao de Compra // // Orcamento de BALCAO // Case VE6->VE6_ORIREQ == "1" .OR. VE6->VE6_ORIREQ == "3" /* Backorder */
VS1->(dbSetOrder(1)) If !VS1->(dbSeek( xFilial("VS1") + VE6->VE6_NUMORC )) TVE6->( dbCloseArea() ) sRestArea(aArea) Return EndIf
// Verifica origem da Sugestao de Compra // // OFICINA // Case VE6->VE6_ORIREQ == "2"
VO1->(dbSetOrder(1)) // VO1_NUMOSV
// Posiciona na OS para verificar se ainda precisa fazer a reserva IF !VO1->(dbSeek(xFilial("VO1") + VE6->VE6_NUMOSV )) TVE6->( dbCloseArea() ) sRestArea(aArea) Return ENDIF EndCase
// Se tiver a quantidade necessaria ... IF VE6->VE6_QTDITE <> VE6->VE6_QTDATE
nQtdeRes := (VE6->VE6_QTDITE - VE6->VE6_QTDATE)
// RESERVA PARCIAL IF nQtdeRes > _nQtdeCompra nQtdeRes := _nQtdeCompra ENDIF
// Calcula o Saldo em que foi dada entrada da nota fiscal // para verificar se possui saldo para fazer a reserva do item SB2->(DbSeek(xFilial("SB2")+SB1->B1_COD+_cLocal)) nSaldo := SaldoSB2()
// Qtde que foi solicitado a compra. // Se nao tiver saldo total, nao reserva nada IF nQtdeRes > nSaldo nQtdeRes := nSaldo ENDIF
// Atualiza o Registro de Ocorrencia de Sug. de Compra dbSelectArea("VE6") RecLock("VE6" ,.F.) VE6->VE6_PEDCOM := _cPedC VE6->VE6_ITEMPC := _cItemPedC VE6->VE6_DATATE := _cDtDigit VE6->VE6_CODFOR := _cFornece VE6->VE6_LOJFOR := _cLoja //VE6->VE6_SERNFI := _cSerie //VE6->VE6_NUMNFI := _cDoc VE6->VE6_QTDATE += nQtdeRes cSugCompra := VE6->VE6_SUGCOM MsUnLock() //
Do Case // Verifica origem da Sugestao de Compra // // Orcamento de BALCAO // Case VE6->VE6_ORIREQ == "1" .OR. VE6->VE6_ORIREQ == "3" /* Backorder */ /* Alex - 25/10/2021 - Não é mais necessário verificar se está na fase de reserva; durante a entrada de peças, no momento da criação da sugestão de compras, as peças são reservadas incondicionalmente, ignorando o parâmetro MV_FASEORC */ cOriReqAnt := VE6->VE6_ORIREQ cForPedAnt := VE6->VE6_FORPED
VS3->(dbSetOrder(2)) IF VS3->(dbSeek(xFilial("VS3") + VS1->VS1_NUMORC + SB1->B1_GRUPO + SB1->B1_CODITE)) While !VS3->(eof()) .and. xFilial("VS3") + VS1->VS1_NUMORC + SB1->B1_GRUPO + SB1->B1_CODITE == VS3->VS3_FILIAL + VS3->VS3_NUMORC + VS3->VS3_GRUITE + VS3->VS3_CODITE If VS3->VS3_QTDAGU == 0 VS3->(DbSkip()) Loop Else Exit Endif Enddo Else TVE6->( dbCloseArea() ) sRestArea(aArea) Return ENDIF
// Se a qtde disponivel para reserva for maior do que a qtde aguardada, acerta a quantidade a ser reservada ... If nQtdeRes > VS3->VS3_QTDAGU nQtdeRes := VS3->VS3_QTDAGU EndIf
// Atualiza saldo a ser reservado _nQtdeCompra -= nQtdeRes
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³Gera um registro de reserva de estoque³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ dbSelectArea("VE6") RecLock("VE6" , .T. ) VE6->VE6_FILIAL := xFilial("VE6") VE6->VE6_DATREG := Criavar("VE6_DATREG") VE6->VE6_HORREG := Criavar("VE6_HORREG") VE6->VE6_CODUSU := Criavar("VE6_CODUSU") VE6->VE6_NUMORC := VS3->VS3_NUMORC VE6->VE6_GRUITE := VS3->VS3_GRUITE VE6->VE6_CODITE := VS3->VS3_CODITE VE6->VE6_LOTECT := SD1->D1_LOTECTL VE6->VE6_NUMLOT := SD1->D1_NUMLOTE VE6->VE6_ORIREQ := cOriReqAnt VE6->VE6_DESORI := IIF(cOriReqAnt == "3", "BACKORDER", "COMPRAS") VE6->VE6_CODMAR := Posicione("SBM",1, xFilial("SBM")+VS3->VS3_GRUITE,"SBM->BM_CODMAR") VE6->VE6_INDREG := "3" // Reserva de Itens VE6->VE6_FORPED := cForPedAnt VE6->VE6_SUGCOM := cSugCompra VE6->VE6_CODIGO := CriaVar("VE6_CODIGO") VE6->VE6_PEDCOM := _cPedC VE6->VE6_ITEMPC := _cItemPedC VE6->VE6_CODFOR := _cFornece VE6->VE6_LOJFOR := _cLoja VE6->VE6_SERNFI := _cSerie If FieldPos('VE6_SDOC') > 0 VE6->VE6_SDOC := FGX_UFSNF(_cSerie) EndIf VE6->VE6_NUMNFI := _cDoc VE6->VE6_QTDITE += nQtdeRes MsUnLock()
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³Movimentacao interna do Item ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ aItensNew:={} DbSelectArea("SB5") DbSetOrder(1) DbSeek( xFilial("SB5") + SB1->B1_COD ) DbSelectArea("SB1") DbSetOrder(1)
cDocumento := nextnumero("SD3",2,"D3_DOC",.t.) // Adiciona cabecalho com numero do documento e data da transferencia modelo II aadd (aItensNew,{ cDocumento, ddatabase}) // sequencia // produto, descricao, unidade de medida, // local/localizacao O R I G E M // produto, descricao, unidade de medida, // local/localizacao D E S T I N O // numero de serie, lote, sublote, data de validade, // Q U A N T I D A D E // quantidade na 2 unidade, estorno, numero de sequencia
aItemMov := oEst:SetItemSD3(SB1->B1_COD ,; //Código do Produto _cLocal ,; // Armazém de Origem GetMv( "MV_RESITE" ) ,; // Armazém de Destino FM_PRODSBZ(SB1->B1_COD,"SB5->B5_LOCALI2") ,; // Localização Origem GetMv( "MV_RESLOC" ) ,; // Localização Destino nQtdeRes ,; // Qtd a transferir SD1->D1_LOTECTL ,; // Nro de lote SD1->D1_NUMLOTE ) // Nro de Sub-Lote)
aAdd(aItensNew, aClone(aItemMov))
If (ExistBlock("VFUNB4")) aItensNew := ExecBlock("VFUNB4", .f., .f., {aItensNew}) EndIf
MSExecAuto({|x| MATA261(x)},aItensNew) If lMsErroAuto TVE6->( dbCloseArea() ) MOSTRAERRO() sRestArea(aArea) Return EndIf MsUnLock()
// Atualiza a Qtde Aguardada dbSelectArea("VS3") RecLock("VS3",.f.) VS3->VS3_QTDAGU -= nQtdeRes VS3->VS3_QTDRES += nQtdeRes VS3->VS3_RESERV := "1" VS3->VS3_LOTECT := VE6->VE6_LOTECT VS3->VS3_NUMLOT := VE6->VE6_NUMLOT VS3->VS3_DOCSDB := cDocumento MsUnLock()
// Verifica origem da Sugestao de Compra // // OFICINA // Case VE6->VE6_ORIREQ == "2"
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³Reserva o Item se a OS estiver ABERTA³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ If lReserva .and. VO1->VO1_STATUS == 'A'
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³Procura o registro de peca em espera para aplicacao³ //³Se nao achar, provavelmente ja foi requisitado tudo³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ cQuery := "SELECT R_E_C_N_O_ " cQuery += " FROM "+RetSQLName("VSJ") cQuery += " WHERE VSJ_FILIAL = '" + xFilial("VSJ") + "'" cQuery += " AND VSJ_NUMOSV = '" + VO1->VO1_NUMOSV + "'" cQuery += " AND VSJ_GRUITE = '" + SB1->B1_GRUPO + "'" cQuery += " AND VSJ_CODITE = '" + SB1->B1_CODITE + "'" cQuery += " AND D_E_L_E_T_ = ' '" cQueryTmp := "" If lVSJSUGCOM cQueryTmp := " AND VSJ_SUGCOM = '" + cSugCompra + "'" EndIf nRecVSJ := FM_SQL(cQuery+cQueryTmp) If nRecVSJ == 0 .and. lVSJSUGCOM // Não encontrado, procurar com Sugestao de Compras em Branco ( registros antigos ) cQueryTmp := " AND VSJ_SUGCOM = ' '" // Procurar registro antigo ( esta com o campo em branco ) nRecVSJ := FM_SQL(cQuery+cQueryTmp) EndIf If nRecVSJ == 0 // !VSJ->(dbSeek(xFilial("VSJ") + VO1->VO1_NUMOSV + SB1->B1_GRUPO + SB1->B1_CODITE)) TVE6->( dbCloseArea() ) sRestArea(aArea) Return EndIf
// Atualiza saldo a ser reservado _nQtdeCompra -= nQtdeRes
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³Indica que as pecas foram reservadas³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ dbSelectArea("VSJ") DbGoto(nRecVSJ) RecLock("VSJ",.f.) VSJ->VSJ_RESPEC := "1" MsUnLock()
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³Gera um registro de reserva de estoque³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ dbSelectArea("VE6") RecLock("VE6" , .T. ) VE6->VE6_FILIAL := xFilial("VE6") VE6->VE6_DATREG := Criavar("VE6_DATREG") VE6->VE6_HORREG := Criavar("VE6_HORREG") VE6->VE6_CODUSU := Criavar("VE6_CODUSU") VE6->VE6_CODITE := VSJ->VSJ_CODITE VE6->VE6_ORIREQ := "3" VE6->VE6_DESORI := "COMPRAS" VE6->VE6_CODMAR := Posicione("SBM",1, xFilial("SBM")+VSJ->VSJ_GRUITE,"SBM->BM_CODMAR") VE6->VE6_GRUITE := VSJ->VSJ_GRUITE VE6->VE6_INDREG := "3" // Reserva de Itens VE6->VE6_LOTECT := VSJ->VSJ_LOTECT VE6->VE6_NUMLOT := VSJ->VSJ_NUMLOT VE6->VE6_NUMOSV := VSJ->VSJ_NUMOSV VE6->VE6_NUMSER := VSJ->VSJ_NUMSER VE6->VE6_SUGCOM := cSugCompra VE6->VE6_CODIGO := CriaVar("VE6_CODIGO") VE6->VE6_PEDCOM := _cPedC VE6->VE6_ITEMPC := _cItemPedC VE6->VE6_CODFOR := _cFornece VE6->VE6_LOJFOR := _cLoja VE6->VE6_SERNFI := _cSerie If FieldPos('VE6_SDOC') > 0 VE6->VE6_SDOC := FGX_UFSNF(_cSerie) EndIf VE6->VE6_NUMNFI := _cDoc
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³Se a qtde no VSJ for menor do q a qtde da sugestao, reserva a qtde da VSJ ³ //³Isso acontece quando requisitar e devolver antes atender a SUGESTAO DE COMPRA³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ VE6->VE6_QTDITE += IIf( nQtdeRes > VSJ->VSJ_QTDITE , VSJ->VSJ_QTDITE , nQtdeRes) MsUnLock()
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³Movimentacao interna do Item ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ aItensNew:={} DbSelectArea("SB5") DbSetOrder(1) DbSeek( xFilial("SB5") + SB1->B1_COD ) DbSelectArea("SB1") DbSetOrder(1) cDocumento := nextnumero("SD3",2,"D3_DOC",.t.) // Adiciona cabecalho com numero do documento e data da transferencia modelo II aadd (aItensNew,{ cDocumento, ddatabase}) // sequencia // produto, descricao, unidade de medida, // local/localizacao O R I G E M // produto, descricao, unidade de medida, // local/localizacao D E S T I N O // numero de serie, lote, sublote, data de validade, // Q U A N T I D A D E // quantidade na 2 unidade, estorno, numero de sequencia
aItemMov := oEst:SetItemSD3(SB1->B1_COD ,; //Código do Produto _cLocal ,; // Armazém de Origem GetMv( "MV_RESITE" ) ,; // Armazém de Destino FM_PRODSBZ(SB1->B1_COD,"SB5->B5_LOCALI2") ,; // Localização Origem GetMv( "MV_RESLOC" ) ,; // Localização Destino nQtdeRes ,; // Qtd a transferir VSJ->VSJ_LOTECT ,; // Nro de lote VSJ->VSJ_NUMLOT ,; // Nro de Sub-Lote VSJ->VSJ_NUMSER ) // Nro de Série
aAdd(aItensNew, aClone(aItemMov))
If (ExistBlock("VFUNB5")) aItensNew := ExecBlock("VFUNB5", .f., .f., {aItensNew}) EndIf
MSExecAuto({|x| MATA261(x)},aItensNew) If lMsErroAuto TVE6->( dbCloseArea() ) MOSTRAERRO() sRestArea(aArea) Return EndIf MsUnLock() ENDIF
EndCase ENDIF
TVE6->(dbSkip())
End
TVE6->(dbCloseArea()) dbSelectArea("VE6") sRestArea(aArea)
Return |