Ponto de Entrada
Descrição: | Este ponto de entrada está localizado na rotina Orc. Por Fases (OFIXA011) e é executado no momento da reserva das peças com controle de endereçamento de um orçamento oficina quando o mesmo é exportado para a ordem de serviço. 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 \ Mov Oficina \ Orc. por Fases | ||||||
Eventos: | Function FM_IMPVSJ( aItensNImp , _cNumOrc , _cNumOSV , aItens , nOrigem, _lConfirmSX, aRecnoCriado ) Local aItensNew := {} Local aDisponivel := {} Local ni := 0 Local nItens := 0 Local cLocPad := "" Local aArea := {} Local lMovtoReserva := ( ( GetNewPar("MV_RITEORC","N") == "S" ) .and. nOrigem <> 3 ) Local lSugCompra := ( ( GetNewPar("MV_SUGCOS","N") == "S" ) .and. nOrigem <> 3 ) Local lSugAuto := ( ( GetNewPar("MV_SUGCAU","N") == "S" ) .and. nOrigem <> 3 ) Local cCodSugCompra := "", nQtdeReserv := 0, aSugCom, cMsgSugCom, aConsumo, nAtual Local aInconv Local nCont Local lCtrlLote := GetNewPar("MV_RASTRO","N") == "S" Local oPeca := DMS_Peca():New() Local nTamAEstq := 0 Local nPosAEstq Local nUltPos Local cMVRESITE := PadR( AllTrim(GetMv("MV_RESITE")), TamSX3("B2_LOCAL")[1] ) Local cMVRESLOC := PadR( AllTrim(GetMV("MV_RESLOC")), TamSX3("B5_LOCALI2")[1]) //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄH¿ //³Rubens - 18/11/2009 ³ //³Verifica se esta habilitado para trabalhar com Inconveniente ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄHÙ Local lInconveniente := (GetNewPar("MV_INCORC","N") == "S") Local iVLP := 0 Local lVSJTIPTEM := (VSJ->(FieldPos("VSJ_TIPTEM")) <> 0) Local lVSJCODTES := (VSJ->(FieldPos("VSJ_CODTES")) <> 0) Local lVSJCODIGO := (VSJ->(FieldPos("VSJ_CODIGO")) <> 0) Local lNovo Local cDocD3 := "" Local nPosLote Local nPosDisp Local l261IntWMS := a261IntWMS() Local lESTNEG := (GetMV("MV_ESTNEG") == "S") Default _cNumOrc := "" Default aItens := {} Default nOrigem := 1 Private lMsErroAuto := .f. Private lMsHelpAuto := .t. // Default _lConfirmSX := .T. Default aRecnoCriado := {} // //aArea := sGetArea(aArea,"VSJ") aArea := sGetArea(aArea,"VS1") aArea := sGetArea(aArea,"VS3") aArea := sGetArea(aArea,"VO1") aArea := sGetArea(aArea,"SB1") aArea := sGetArea(aArea,"SB2") aArea := sGetArea(aArea,"SB5") aArea := sGetArea(aArea,"SF4") aArea := sGetArea(aArea,"SD3") aArea := sGetArea(aArea,"SBM") If !Empty(Alias()) aArea := sGetArea(aArea,Alias()) EndIf aItensNImp:={} Aadd(aItensNImp , {} ) && 1 - Cabecalho do listbox Aadd(aItensNImp , {} ) && 2 - Itens do listbox DbSelectArea("VSJ") For nItens := 1 to FCount() Aadd(aItensNImp[1] , FieldName(nItens) ) Next Aadd(aItensNImp[1] , "B1_DESC" ) Aadd(aItensNImp[1] , "B1_LOCPAD" ) /////////////////////////////////////////////////// // 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 /////////////////////////////////////////////////// // Desabilitar a Sugestao de Compra caso MV_ESTNEG igual a S e Tem Reserva na Exportação do Orçamento para a OS If lSugCompra .and. lMovtoReserva If lESTNEG // STR0109 - "Não é possivel a Sugestão de Compra das Peças sem saldo com os parametros MV_ESTNEG e MV_RITEORC configurados com S." // STR0110 - "O Sistema dará continuidade ao processo de Exportação para a Ordem de Serviço, porem a Sugestão de Compra das Peças sem saldo não será realizada." ShowHelpDlg ( "VEIFUNB_FM_IMPVSJ_001", {STR0109},,{STR0110}) lSugCompra := .f. // NAO faz Sugestao de Compra EndIf EndIf // Orcamento If nOrigem == 1 DbSelectArea("VS1") DbSetOrder(1) DbSeek( xFilial("VS1") + _cNumOrc ) SF4->(dbSetOrder(1)) DbSelectArea("VS3") DbSetOrder(1) DbSeek( xFilial("VS3") + VS1->VS1_NUMORC ) Do While !VS3->(Eof()) .and. xFilial("VS3") == VS3->VS3_FILIAL .and. VS3->VS3_NUMORC == _cNumOrc If !Empty(VS3->VS3_MOTPED) VS3->(dbSkip()) Loop EndIf Aadd(aItens,{VS3->VS3_GRUITE,; // 01 VS3->VS3_CODITE,; // 02 VS3->VS3_QTDITE,; // 03 VS3->VS3_LOCAL,; // 04 - Almoxarifado " ",; // 05 - Grupo do Inconveniente " ",; // 06 - Codigo do Inconveniente VS1->VS1_TIPTEM,; // 07 VS1->VS1_CLIFAT,; // 08 VS1->VS1_LOJA,; // 09 " ",; // 10 - Seq. do Inconveniente VS1->VS1_NUMORC,; // 11 - Numero do Orcamento VS3->VS3_CODTES,; // 12 - TES " ",; // 13 - TES Mov. Estoque ??? (F4_ESTOQUE) VS3->VS3_VALPEC,; // 14 - Valor da Peca VS3->VS3_DEPGAR,; // 15 - Depto Garantia VS3->VS3_DEPINT,; // 16 - Depto Interno VS3->VS3_LOTECT,; // 17 - Lote VS3->VS3_NUMLOT,; // 18 - Sub-Lote VS3->VS3_LOCALI,; // 19 - Localização - Endereço "2",; // 20 - Origem do registro CtoD(" "),; // 21 - Validade do Lote VS3->VS3_VALDES}) // 22 - Valor de Desconto // Se Utiliza Inconveniente e foi informado no orcamento ... IF lInconveniente .and. !Empty(VS3->VS3_SEQINC) // Procura informacao do inconveniente do orcamento aInconv := OM420CONSINC( "1" , VS1->VS1_NUMORC , VS3->VS3_SEQINC ) // Procura informacao do inconveniente da OS if !Empty(aInconv[1]) .and. !Empty(aInconv[2]) aItens[Len(aItens),10] := OM420CONSINC( "2" , _cNumOSV , , aInconv[1] , aInconv[2])[4] else aItens[Len(aItens),10] := OM420CONSINC( "2" , _cNumOSV , , , , aInconv[3] )[4] endif ENDIF // If !Empty(VS3->VS3_CODTES) .and. SF4->(MsSeek(xFilial("SF4") + VS3->VS3_CODTES)) aItens[Len(aItens),13] := SF4->F4_ESTOQUE EndIf VS3->(DbSkip()) EndDo If Len(aItens) == 0 sRestArea(aArea) return .t. EndIf EndIf DbSelectArea("VO1") DbSetOrder(1) DbSeek( xFilial("VO1") + _cNumOSV ) If nOrigem <> 3 // NAO é registro digitado manualmente //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³PL 31 - Rubens - 02/10/2009 ³ //³Verifica se algum produto nao tem estoque disponivel e ³ //³pergunta se deseja gerar sugestao de compra ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ cMsgSugCom := "" DbSelectArea("SB1") DbSetOrder(7) DbSelectArea("SB2") DbSetOrder(1) For ni := 1 to Len(aItens) //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³ Verifica se a TES Mov. Estoque ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ if aItens[nI,13] <> "S" loop endif // dbSelectArea("SB1") DbSeek( xFilial("SB1") + aItens[ni,1] + aItens[ni,2] ) If !Empty(aItens[ni,4]) cLocPad := aItens[ni,4] Else cLocPad := FM_PRODSBZ(SB1->B1_COD,"SB1->B1_LOCPAD") EndIf // If lSugCompra dbSelectArea("SB2") DbSeek(xFilial("SB2")+SB1->B1_COD+cLocPad) If aItens[ni,3] > SaldoSB2() cMsgSugCom += AllTrim(SB1->B1_COD) + "-" + AllTrim(SB1->B1_DESC) + " - " + ; STR0012+": [" + AllTrim(Str(aItens[ni,3])) + "] - " + ; //Qtde Orc. STR0013+": " + cLocPad + "=[" + AllTrim(Str(SaldoSB2())) + "]" + chr(13)//Almox. nI := Len(aItens) EndIf Next nI // Existem pecas sem estoque disponivel para atender o Orcamento If !Empty(cMsgSugCom) If lSugCompra if lSugAuto lSugCompra := .t. elseIf !MsgYesNo(STR0009 + CHR(13) + CHR(10) + STR0010 ,STR0011) //"Existe um ou mais produtos sem estoque disponivel. # Deseja gerar uma sugestão de compra dos produtos sem estoque disponivel # Atenção lSugCompra := .f. EndIf Else If !lESTNEG // NAO PERMITE ESTOQUE NEGATIVO If lMovtoReserva // Se faz reserva ... cMsg := STR0102 + Chr(13) + Chr(10) // STR existem pecas com saldo insuficiente cMsg += STR0103 + Chr(13) + Chr(10) // STR configure os parametros MV_SUGCAU e MV_SUGCOS cMsg += STR0104 // STR operacao abortada RollBackSX8() MsgStop(cMsg) sRestArea(aArea) return .F. EndIf EndIf EndIf EndIf EndIf If lCtrlLote .and. lMovtoReserva nLenAItens := Len(aItens) For nI := 1 to nLenAItens SB1->(dbSetOrder(7)) SB1->(dbSeek(xFilial("SB1") + aItens[nI,1] + aItens[nI,2])) If !Empty(aItens[nI,17]) .or. Rastro(SB1->B1_COD) oPeca:LoadB1() If Empty(aItens[nI,17]) // Não foi informado o lote // Pesquisa se algum lote foi informado manualmente, para que a funcao nao considere o saldo informado ... aLotesInf := {} aEval( aItens , { |x| ; IIF( !Empty(x[17]) .and. x[1] == aItens[nI,1] .and. x[2] == aItens[nI,2] .and. x[4] == aItens[nI,4] , AADD( aLotesInf, {x[17],x[18],x[19],"",x[3] }) , ) }) // aLotes := oPeca:SaldoLoteMovimentacao( aItens[nI,4] , aItens[nI,3] , aItens[nI,17] , aItens[nI,18] , aLotesInf) For nPosLote := 1 to Len(aLotes) If nPosLote == 1 nItens := nI Else AADD(aItens,aClone(aItens[nI])) nItens := Len(aItens) EndIf aItens[ nItens ,03] := aLotes[nPosLote,5] // 03 - Quantidade aItens[ nItens ,17] := aLotes[nPosLote,1] // 17 - Lote aItens[ nItens ,18] := aLotes[nPosLote,2] // 18 - Sub-Lote aItens[ nItens ,21] := aLotes[nPosLote,7] // 21 - Data de Validade Next nPos Else aItens[nI,21] := oPeca:LoteDtValid(aItens[nI,17]) EndIf EndIf Next nI EndIf // Pecas Begin Transaction For ni := 1 to Len(aItens) DbSelectArea("SB1") DbSetOrder(7) DbSeek( xFilial("SB1") + aItens[ni,1] + aItens[ni,2] ) DbSelectArea("SB2") DbSetOrder(1) If !Empty(aItens[ni,4]) cLocPad := aItens[ni,4] Else cLocPad := FM_PRODSBZ(SB1->B1_COD,"SB1->B1_LOCPAD") EndIf DbSeek(xFilial("SB2")+SB1->B1_COD+cLocPad) If (nPosDisp := aScan(aDisponivel , { |x| x[1] == SB1->B1_COD+cLocPad })) == 0 Aadd( aDisponivel , { SB1->B1_COD+cLocPad , 0 } ) nPosDisp := Len(aDisponivel) EndIf aDisponivel[nPosDisp,2] := SaldoSB2() lNovo := .t. // Chamado do orcamento If nOrigem == 1 cQuery := "SELECT VSJ.R_E_C_N_O_ NUMREG" cQuery += " FROM "+RetSQLName("VSJ")+" VSJ JOIN "+RetSQLName("VS1")+" VS1 ON VS1_FILIAL = '"+xFilial("VS1")+"' AND VS1.VS1_NUMORC=VSJ.VSJ_NUMORC AND VS1.D_E_L_E_T_ = ' '" cQuery += " WHERE VSJ.VSJ_FILIAL = '"+xFilial("VSJ")+"'" cQuery += " AND VSJ.VSJ_NUMOSV = '"+VO1->VO1_NUMOSV+"'" cQuery += " AND VSJ.VSJ_GRUITE = '"+aItens[ni,1]+"'" cQuery += " AND VSJ.VSJ_CODITE = '"+aItens[ni,2]+"'" IF lInconveniente cQuery += " AND VSJ.VSJ_SEQINC = '"+aItens[ni,10]+"'" ENDIF If lVSJCODIGO cQuery += " AND VSJ.VSJ_QTDITE > 0 " EndIf cQuery += " AND VS1_NUMORC = '" + aItens[ni,11] + "' cQuery += " AND VSJ.VSJ_RESPEC = '" + IIf( lMovtoReserva .and. aItens[nI,13] == "S" , "1" , "0" ) + "'" cQuery += " AND VSJ.VSJ_LOTECT = '" + aItens[ni,17] + "'" cQuery += " AND VSJ.VSJ_NUMLOT = '" + aItens[ni,18] + "'" cQuery += " AND VSJ.D_E_L_E_T_ = ' '" cQuery += " AND VS1.VS1_TIPTEM = '"+aItens[ni,7]+"'" cQuery += " AND VS1.VS1_CLIFAT = '"+aItens[ni,8]+"'" cQuery += " AND VS1.VS1_LOJA = '"+aItens[ni,9]+"'" nRecno := FM_SQL(cQuery) dbSelectArea("VSJ") IF nRecno > 0 VSJ->(dbGoTo(nRecno)) RecLock("VSJ",.f.) lNovo := .f. ENDIF EndIf If lNovo RecLock("VSJ",.t.) VSJ->VSJ_FILIAL := xFilial("VSJ") If lVSJCODIGO VSJ->VSJ_CODIGO := GetSxeNum("VSJ","VSJ_CODIGO") ConfirmSX8() ENDIF EndIf VSJ->VSJ_NUMORC := _cNumOrc VSJ->VSJ_NUMOSV := VO1->VO1_NUMOSV VSJ->VSJ_GRUITE := aItens[ni,1] VSJ->VSJ_CODITE := aItens[ni,2] VSJ->VSJ_QTDITE += aItens[ni,3] VSJ->VSJ_PROIMP := Posicione("VAI",4,xFilial("VAI") + __cUserID , "VAI_CODUSR" ) VSJ->VSJ_ORIDAD := aItens[ni,20] VSJ->VSJ_RESPEC := "0" // Nao foi feito reserva de peca VSJ->VSJ_DEPGAR := aItens[ni,15] VSJ->VSJ_DEPINT := aItens[ni,16] VSJ->VSJ_LOTECT := aItens[ni,17] VSJ->VSJ_NUMLOT := aItens[ni,18] IF lInconveniente VSJ->VSJ_SEQINC := aItens[ni,10] ENDIF IF lVSJTIPTEM .and. aItens[ni,20] $ "3/4" VSJ->VSJ_TIPTEM := aItens[ni,07] ENDIF IF lVSJCODTES .and. aItens[ni,20] $ "3/4" VSJ->VSJ_CODTES := aItens[ni,12] ENDIF If nOrigem == 3 For nCont := 1 to Len(aItens[ni,21]) &("VSJ->" + aItens[nI,21,nCont,1]) := aItens[nI,21,nCont,2] Next nCont EndIf msunlock() If nOrigem == 3 AADD( aRecnoCriado , VSJ->(Recno())) EndIf If nOrigem <> 3 // NAO é registro digitado manualmente //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³Monta vetor com itens que nao foram para o almoxarifado reservado MV_RESITE³ //³Se for gerar sugestao automatica, nao imprime a relacao ³ //³Verifica se a TES Mov. Estoque ( aItens[ni,13] == "S" ) ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ If aItens[ni,3] > aDisponivel[nPosDisp,2] .and. !lSugCompra .and. aItens[ni,13] == "S" Aadd(aItensNImp[2] , {} ) For nItens := 1 to FCount() if AllTrim(FieldName(nItens)) <> "VSJ_QTDITE" Aadd(aItensNImp[2,Len(aItensNImp[2])] , FieldGet(nItens) ) Else Aadd(aItensNImp[2,Len(aItensNImp[2])] , (aItens[ni,3] - aDisponivel[nPosDisp,2]) ) EndIF Next Aadd(aItensNImp[2,Len(aItensNImp[2])] , SB1->B1_DESC ) Aadd(aItensNImp[2,Len(aItensNImp[2])] , cLocPad ) EndIf EndIf nQtdeReserv := 0 // Reserva de Peca E a TES Mov. Estoque ??? If lMovtoReserva .and. aItens[nI,13] == "S" cDocD3 := Criavar("D3_DOC") cDocD3 := IIf(Empty(cDocD3),NextNumero("SD3",2,"D3_DOC",.T.),cDocD3) cDocD3 := A261RetINV(cDocD3) // Se tiver quantidade disponivel, reserva mesmo nao tendo quantidade total disponivel // OU // pode trabalhar com Estoque Negativo (MV_ESTNEG == "S") If aDisponivel[nPosDisp,2] > 0 .or. lESTNEG nQtdeReserv := aItens[ni,3] //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³ Se nao tiver qtde total disponivel, reserva o que puder ³ //³ CI 2647 Somente reserva o que puder caso sug. de compra esteja ativada e RITEORC esteja S ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ If !lESTNEG // não pode trabalhar com Estoque Negativo (MV_ESTNEG == "N") IF nQtdeReserv > aDisponivel[nPosDisp,2] // Se a qtd pra reservar for maior que o disponivel nQtdeReserv := aDisponivel[nPosDisp,2] ENDIF EndIf //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³Marca VSJ que a peca foi reservada³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ RecLock("VSJ",.f.) VSJ->VSJ_RESPEC := "1" VSJ->(MsUnLock()) //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³PL 31 - Rubens - 28/09/2009 ³ //³Gera um registro de reserva de estoque³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ cQuery := "SELECT R_E_C_N_O_ VE6RECNO " +; " FROM " + RetSQLName("VE6") + " VE6 " +; " WHERE VE6.VE6_FILIAL = '" + xFilial("VE6") + "'" +; " AND VE6.VE6_NUMOSV = '" + _cNumOSV + "'" +; " AND VE6.VE6_INDREG = '3'" +; // Registro de Reserva " AND VE6.VE6_GRUITE = '" + SB1->B1_GRUPO + "'" +; " AND VE6.VE6_CODITE = '" + SB1->B1_CODITE + "'" +; " AND VE6.VE6_LOTECT = '" + VSJ->VSJ_LOTECT + "'" +; " AND VE6.VE6_NUMLOT = '" + VSJ->VSJ_NUMLOT + "'" +; " AND VE6.D_E_L_E_T_ = ' '" nRecno := FM_SQL(cQuery) dbSelectArea("VE6") If nRecno == 0 RecLock("VE6" , .T. ) VE6->VE6_FILIAL := xFilial("VE6") VE6->VE6_GRUITE := VSJ->VSJ_GRUITE VE6->VE6_CODITE := VSJ->VSJ_CODITE VE6->VE6_CODMAR := Posicione("SBM",1, xFilial("SBM")+VSJ->VSJ_GRUITE,"SBM->BM_CODMAR") VE6->VE6_CODUSU := CriaVar("VE6_CODUSU") VE6->VE6_CODIGO := CriaVar("VE6_CODIGO") VE6->VE6_DATREG := CriaVar("VE6_DATREG") VE6->VE6_HORREG := CriaVar("VE6_HORREG") VE6->VE6_INDREG := "3" // Reserva de Itens VE6->VE6_ORIREQ := "2" // Oficina VE6->VE6_DESORI := "OFICINA" 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_VALPEC := aItens[ni,14] ELSE dbGoTo(nRecno) RecLock("VE6" , .F. ) ENDIF VE6->VE6_QTDITE += nQtdeReserv MsUnLock() //////////////////////////////////////////////////////////////////////////////////////////////////// If !Localiza(SB1->B1_COD) //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³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,{ cDocD3, ddatabase}) // sequencia // produto, descricao, unidade de medida, local/localizacao origem // produto, descricao, unidade de medida, local/localizacao destino // numero de serie, lote, sublote, data de validade, qunatidade // 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 ] := cLocPad 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 ] := cMVRESITE aItensNew[ nPosAEstq , 10 ] := IIf(Localiza(SB1->B1_COD),cMVRESLOC,Space(15)) // aItensNew[ nPosAEstq , 11 ] := VSJ->VSJ_NUMSER aItensNew[ nPosAEstq , 12 ] := VSJ->VSJ_LOTECT aItensNew[ nPosAEstq , 13 ] := VSJ->VSJ_NUMLOT aItensNew[ nPosAEstq , 14 ] := aItens[nI,21] aItensNew[ nPosAEstq , 15 ] := criavar('D3_POTENCI') aItensNew[ nPosAEstq , 16 ] := nQtdeReserv 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("VFUNB1")) aItensNew := ExecBlock("VFUNB1", .f., .f., {aItensNew}) EndIf MSExecAuto({|x| MATA261(x)},aItensNew) If lMsErroAuto && Cancela Gravacao] MOSTRAERRO() DisarmTransaction() Break EndIf Else cLocalDis := aItens[ni,4] cLocalRes := GetMv( "MV_RESITE" )+Space(TamSx3("B2_LOCAL")[1]-Len(GetMv("MV_RESITE"))) // cLote := "" cNumLote := "" if !Empty(VSJ->VSJ_LOTECT) cLote := VSJ->VSJ_LOTECT cNumLote := VSJ->VSJ_NUMLOT endif if !Empty(aItens[ni,19]) aVetLocPec := {{aItens[ni,19],nQtdeReserv}} else aVetLocPec := OX001PRAUTLC(SB1->B1_COD,cLocalDis,nQtdeReserv,cLote,cNumLote) // Funcao de Priorizacao Automatica das Localizacoes If Len(aVetLocPec) == 1 .and. aVetLocPec[1,1] == "" .and. aVetLocPec[1,2] == 0 aVetLocPec := {{"",nQtdeReserv}} Endif endif // nQtAtend := 0 for iVLP := 1 to Len(aVetLocPec) nQtAtend += aVetLocPec[iVLP,2] Next for iVLP := 1 to Len(aVetLocPec) cLocali2Dis := aVetLocPec[iVLP,1] cLocali2Res := IIf(Localiza(SB1->B1_COD),GetMv( "MV_RESLOC" )+Space(TamSx3("B5_LOCALI2")[1]-Len(GetMv("MV_RESLOC"))),Space(15)) If Empty(cLocali2Res) cQuery := "SELECT SBF.BF_LOCALIZ FROM "+RetSqlName("SBF")+" SBF WHERE SBF.BF_FILIAL = '"+xFilial("SBF")+"' AND " cQuery += "SBF.BF_PRODUTO = '"+SB1->B1_COD+"' AND SBF.BF_LOCAL = '"+aItens[ni,4]+"' AND SBF.BF_QUANT > 0 AND " If !Empty(cLote) cQuery += "SBF.BF_LOTECTL = '"+cLote+"' AND " Endif If !Empty(cNumLote) cQuery += "SBF.BF_NUMLOTE = '"+cNumLote+"' AND " Endif cQuery += "SBF.D_E_L_E_T_ = ' ' ORDER BY SBF.BF_PRIOR" cLocali2Res := Alltrim(FM_SQL(cQuery)) Endif nQtdLocPec := aVetLocPec[iVLP,2] //////////////////////////////////////////////////////////////////////////////////////////////////// //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³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,{ cDocD3, ddatabase}) // sequencia // produto, descricao, unidade de medida, local/localizacao origem // produto, descricao, unidade de medida, local/localizacao destino // numero de serie, lote, sublote, data de validade, qunatidade // 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 ] := cLocalDis aItensNew[ nPosAEstq , 05 ] := cLocali2Dis // Produto Destino aItensNew[ nPosAEstq , 06 ] := SB1->B1_COD aItensNew[ nPosAEstq , 07 ] := SB1->B1_DESC aItensNew[ nPosAEstq , 08 ] := SB1->B1_UM aItensNew[ nPosAEstq , 09 ] := cLocalRes aItensNew[ nPosAEstq , 10 ] := cLocali2Res // aItensNew[ nPosAEstq , 11 ] := VSJ->VSJ_NUMSER aItensNew[ nPosAEstq , 12 ] := VSJ->VSJ_LOTECT aItensNew[ nPosAEstq , 13 ] := VSJ->VSJ_NUMLOT aItensNew[ nPosAEstq , 14 ] := aItens[nI,21] aItensNew[ nPosAEstq , 15 ] := criavar('D3_POTENCI') aItensNew[ nPosAEstq , 16 ] := nQtdLocPec 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("VFUNB2")) aItensNew := ExecBlock("VFUNB2", .f., .f., {aItensNew}) EndIf | ||||||
Programa Fonte: | VEIFUNB.PRW | ||||||
Função: | FM_IMPVSJ() | ||||||
Parâmetros: |
| ||||||
Retorno: |
|
Exemplo:
Include totvs.ch
User Function VFUNB2()
Local aItensAlt := ParamIxb[1]
MsgInfo("Ponto de Entrada VFUNB2 executado com sucesso!")
Return aItensAlt