Árvore de páginas

Ponto de Entrada

Descrição:

Este ponto de entrada é chamado após a confirmação da entrada da nota fiscal de entrada da mercadoria e ativado quando existe pedido de compra vinculado ao item. Este ponto de entrada esta localizado na função (FM_RESITE()) responsável por Registrar a Reserva do Item na Entrada da Nota Fiscal de Entrada.

Este Ponto de Entrada tem como finalidade substituir por completo o tratamento da função FM_RESITE().

Localização:

Atualizações / Movimentos / Documento de Entrada

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

Programa Fonte:

VEIFUNB.PRW

Função:

FM_RESITE()

Parâmetros:
NomeTipoDescrição
_cProdutoCaractereCódigo do Produto

_cLocal

Caractere

Código do Almoxarifado

_cPedC

Caractere

Código do Pedido de compra

_cItemPedC

Caractere

Numero item do pedido de compra

_cDtDigit

Caractere

Data de digitação

_nQtdeCompra

Numérico

Quantidade a ser comprada

_cFornece

Caractere

Código do fornecedor

_cLojaCaractereLoja do Fornecedor
_cDocCaractereNumero da NFe
_cSerieCaractereSerie da NFe
_cSugComCaractereCódigo da Sugestão
Retorno:

Não há.


Exemplo:

/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma  ³ PRESITE º Autor ³ Jose Luis Filho     º Data ³  07/02/23  º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc.     ³ Ponto de Entrada para substituir a função FM_RESITE        º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso       ³ SIGAOFI                                                    º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function PRESITE(_cProduto, _cLocal, _cPedC, _cItemPedC, _cDtDigit, _nQtdeCompra, _cFornece, _cLoja, _cDoc, _cSerie, _cSugCom)

Local _cProduto:= ParamIXB[1]
Local _cLocal:= ParamIXB[2]
Local _cPedC:= ParamIXB[3]
Local _cItemPedC:= ParamIXB[4]
Local _cDtDigit:= ParamIXB[5]
Local _nQtdeCompra:= ParamIXB[6]
Local _cFornece:= ParamIXB[7]
Local _cLoja:= ParamIXB[8]
Local _cDoc:= ParamIXB[9]
Local _cSerie:= ParamIXB[10]
Local _cSugCom:= ParamIXB[11]

msgalert("Ponto de Entrada PRESITE executado com Sucesso!")

dbSelectArea("VE6")


Return