Árvore de páginas

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:
NomeTipo Descrição

aItensNew

Matriz

Campos da SD3 que deverão ser atualizados ou inseridos novos campos pelo ponto de entrada para serem utilizados no ExecAuto da rotina de transferência de peças entre armazéns (MATA261).

Retorno:
NomeTipoDescrição

aItensNew

Matriz

Campos da SD3 atualizados pelo ponto de entrada para serem utilizados no ExecAuto da rotina de transferência de peças entre armazéns (MATA261).

Exemplo:

Include totvs.ch

User Function VFUNB2()


Local aItensAlt := ParamIxb[1]


MsgInfo("Ponto de Entrada VFUNB2 executado com sucesso!")


Return aItensAlt