Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
Comentário: Migration of unmigrated content due to installation of a new plugin

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:
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 VFUNB4()


Local aItensAlt := ParamIxb[1]


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


Return aItensAlt