Histórico da Página
Ponto de Entrada
Descrição: | Este ponto de entrada está localizado na rotina Documento Entrada (MATA103) e é executado no momento da reserva de peças para um orçamento balcão especifico quando este gerou sugestão de compras. A finalidade deste ponto de entrada é permitir a manipulação / inserção de novos campos no momento de realizar a movimentação de transferência de armazéns na chamada da rotina MATA261 (tabela SD3). | ||||||
Localização: | Atualizações \ Movimentos \ Documento Entrada | ||||||
Eventos: | 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 Local nTamAEstq := 0 Local nPosAEstq Local nUltPos Local oPeca := DMS_Peca():New() Local l261IntWMS := a261IntWMS() Local cOriReqAnt := "" Local cForPedAnt := "" Private lMsErroAuto := .f. aArea := sGetArea(aArea,"SB1") aArea := sGetArea(aArea,"SB2") aArea := sGetArea(aArea,"SB5") If !Empty(Alias()) aArea := sGetArea(aArea,Alias()) EndIf /////////////////////////////////////////////////// // Posicoes no Vetor de Integracao com o MATA261 // /////////////////////////////////////////////////// nTamAEstq := 21 If l261IntWMS nTamAEstq += 1 EndIf nTamAEstq += 1 If SD3->(FieldPos("D3_IDDCF"))>0 .And. l261IntWMS nTamAEstq += 1 EndIf If SD3->(FieldPos("D3_OBSERVA")) <> 0 nTamAEstq += 1 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) oPeca:LoadB1() dbSelectArea("SB2") dbSetOrder(1) // B2_COD+B2_LOCAL //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³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)) 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 */ If VS1->VS1_STATUS == "R" .OR. VE6->VE6_ORIREQ == "3" /* Backorder */ 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) // Adiciona cabecalho com numero do documento e data da transferencia modelo II aadd (aItensNew,{ nextnumero("SD3",2,"D3_DOC",.t.), 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 AADD( aItensNew , Array(nTamAEstq) ) nPosAEstq := Len(aItensNew) // Produto Origem aItensNew[ nPosAEstq , 01 ] := SB1->B1_COD aItensNew[ nPosAEstq , 02 ] := SB1->B1_DESC aItensNew[ nPosAEstq , 03 ] := SB1->B1_UM aItensNew[ nPosAEstq , 04 ] := _cLocal aItensNew[ nPosAEstq , 05 ] := IIf(Localiza(SB1->B1_COD),FM_PRODSBZ(SB1->B1_COD,"SB5->B5_LOCALI2"),Space(15)) // Produto Destino aItensNew[ nPosAEstq , 06 ] := SB1->B1_COD aItensNew[ nPosAEstq , 07 ] := SB1->B1_DESC aItensNew[ nPosAEstq , 08 ] := SB1->B1_UM aItensNew[ nPosAEstq , 09 ] := GetMv( "MV_RESITE" )+Space(TamSx3("B2_LOCAL")[1]-Len(GetMv("MV_RESITE"))) aItensNew[ nPosAEstq , 10 ] := IIf(Localiza(SB1->B1_COD),GetMv( "MV_RESLOC" )+Space(TamSx3("B5_LOCALI2")[1]-Len(GetMv("MV_RESLOC"))),Space(15)) // aItensNew[ nPosAEstq , 11 ] := "" aItensNew[ nPosAEstq , 12 ] := SD1->D1_LOTECTL aItensNew[ nPosAEstq , 13 ] := SD1->D1_NUMLOTE aItensNew[ nPosAEstq , 14 ] := IIf( !Empty(SD1->D1_LOTECTL) , oPeca:LoteDtValid(SD1->D1_LOTECTL) , criavar('D3_DTVALID') ) aItensNew[ nPosAEstq , 15 ] := criavar('D3_POTENCI') aItensNew[ nPosAEstq , 16 ] := nQtdeRes aItensNew[ nPosAEstq , 17 ] := criavar("D3_QTSEGUM") aItensNew[ nPosAEstq , 18 ] := criavar("D3_ESTORNO") aItensNew[ nPosAEstq , 19 ] := criavar("D3_NUMSEQ") aItensNew[ nPosAEstq , 20 ] := criavar("D3_LOTECTL") aItensNew[ nPosAEstq , 21 ] := aItensNew[ nPosAEstq , 14 ] nUltPos := 21 If l261IntWMS aItensNew[nPosAEstq,++nUltPos] := criavar("D3_SERVIC") EndIf aItensNew[nPosAEstq,++nUltPos] := criavar("D3_ITEMGRD") If SD3->(FieldPos("D3_IDDCF"))>0 .And. l261IntWMS aItensNew[nPosAEstq,++nUltPos] := criavar("D3_IDDCF") EndIf If SD3->(FieldPos("D3_OBSERVA")) <> 0 aItensNew[nPosAEstq,++nUltPos] := criavar("D3_OBSERVA") EndIf If (ExistBlock("VFUNB4")) aItensNew := ExecBlock("VFUNB4", .f., .f., {aItensNew}) EndIf | ||||||
Programa Fonte: | VEIFUNB.PRW | ||||||
Função: | FM_RESITE() | ||||||
Parâmetros: |
| ||||||
Retorno: |
|
Exemplo:
Include totvs.ch
User Function VFUNB4()
Local aItensAlt := ParamIxb[1]
MsgInfo("Ponto de Entrada VFUNB4 executado com sucesso!")
Return aItensAlt