Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.


Ponto de Entrada

Descrição:

Este Ponto de Entrada permite realizar a reserva de produtos da venda de forma automática na rotina Venda Assistida sem a apresentação da interface para o usuário.

A partir do momento que o Ponto de Entrada LJRESERV estiver compilado no RPO, o sistema automaticamente deixa de exibir a interface para o usuário selecionar as opções de reserva, ficando assim a cargo do Ponto de Entrada realizar esta operação de selecionar as opções desejadas para que o sistema efetive a reserva.

O Ponto de Entrada é invocado em dois momentos. O que identifica o momento que o ponto de entrada está executando é um parâmetro passado para o PE, onde “1” significa primeiro momento e “2” significa o segundo momento.

Momento 1: O ponto de entrada é executado para que sejam apenas selecionadas a opções de loja (SLJ) onde os produtos serão reservados e os produtos que deverão ser reservados. Neste caso é realizada um pré-filtro onde poderão ser feitas as reservas dos produtos.

Momento 2: Com base nas informações selecionadas no momento 1, o ponto de entrada é executado neste segundo momento para que agora seja escolhido o armazém/estoque onde será realizada a reserva.

Ou seja, os momentos 1 e 2 simulam como se fosse as duas interfaces que são apresentadas para o usuário realizar a reserva.

No Ponto de Entrada LJRESERV é passado como parâmetro as informações de Lojas (tabela SLJ) disponíveis para reserva, o produtos da venda para serem reservados, e as informações de Estoque disponível em cada loja/armazém. Com base nessas informações passados por parâmetro, neste PE deverá apenas ser selecionadas as opções desejadas para que o sistema efetive a reserva, como se estivesse utilizando a interface para realizar a seleção.

Observações:

Este Ponto de Entrada é utilizado somente para a rotina Venda Assistida (on-line).

Programa Fonte:

LOJA701C e LOJA701E

Parâmetros:

TipoDescrição
ExpC1Tipo de Operação em execução (1=Momento 1; 2=Momento 2)
ExpA2Array com a relação de Lojas disponíveis para efetuar a Reserva
ExpA3Produtos da venda a serem reservados
ExpA4Saldos dos Estoques nas lojas/armazém

Retorno:

Array

 

Exemplo:

#Include 'Protheus.ch'


//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Ponto de Entrada utilizado para realizar a Reserva dos produtos da venda sem a exibicao da interface para o usuario.
//Este ponto de entrada eh utilizado apenas para selecionar as opcoes que o sistema passa como parametro, ou seja,
//utiliza o mesmo conceito como se estivesse utilizando a interface (tela) para o ususario fazer a selecao das opcoes,
//porem a selecao eh feita por este PE sem a exibicao da interface.
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Este Ponto de Entrada eh é executado em dois momentos.
// 1o. momento 1º Momento (operacao= "1"): Neste momento deve ser feita a selecao das "LOJAS" onde serao reservados os produtos e a selecao dos "PRODUTOS" que serao reservados
// 2o. momento 2º Momento (operacao= "2"): Neste momento deve ser feita a selecao do "ARMAZEM" (Local de Estoque) relacionado a loja onde serao reservados os produtos
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
User Function LJRESERV()
Local aRet := {} //Retorno da funcao
Local cOperacao := PARAMIXB[1] //Tipo de Operacao em execucao
Local aLojas := PARAMIXB[2] //Lojas disponiveis para efetuar a Reserva
Local aProdutos := PARAMIXB[3] //Produtos da venda que a serem reservados
Local aEstoque := PARAMIXB[4] //Saldos dos Estoques nas lojas/armazem
Local aEstoqBKP := aClone(aEstoque)
Local nX := 0
Local nY := 0
Local nZ := 0
Local lConfirma := .F. //Simula o botao "Confirmar" (.T.=Confirma; .F.=Cancela)
Local nENTREGA := aScan( aHeader,{|x| Trim(x[2]) == "LR_ENTREGA" } ) //Posicao do Campo "LR_ENTREGA"
Local nITEM := aScan( aHeader,{|x| Trim(x[2]) == "LR_ITEM" } ) //Posicao do Campo "LR_ITEM"
Local nPosAcols := 0
Local lContinua := .F.
Local cItem := ""
Local cProduto := ""
Local lTemEstoque := .T.
Local aPrdSemEst := {} //Produtos sem estoque
Local cMsg := ""

MsgAlert("Passou pelo P.E. LJRESERV com cOperacao := " + cOperacao)
Do Case

    //Operacao 1: Selecao das "LOJAS" onde serao reservados os produtos e selecao dos "PRODUTOS" que serao reservados
    Case cOperacao == "1"

        ////--------------------------------------------------
        // Escolha da LOJA onde sera feita a reserva
        //-------------------------------------------
        aLojas[1][1] := .T. //Neste exemplo, sempre considera a escolha (selecao) da primeira loja

        // Estrutura do array aLojas
//-------------------------------------------
        // Escolha dos PRODUTOS que serao reservados
        //-------------------------------------------
        For nX:=1 To Len(aProdutos)

            //Localiza o item no aCols
            nPosAcols := aScan( aCols, { |x| x[nITEM] == aProdutos[nX][2] } )

            //Selecionando apenas os produtos, cujo a opcao do campo "LR_ENTREGA" seja "3-Entrega" ou "5-Entrega c/Pedido s/Reserva"
            If !Empty(aCols[nPosAcols][nENTREGA]) .And. (aCols[nPosAcols][nENTREGA] == "3" .OR. aCols[nPosAcols][nENTREGA] == "5") // 3=Entrega, 5=Entrega c/Pedido s/Reserva
                aProdutos[nX][1] := .T.
            EndIf

        Next nX

        lConfirma := .T. //Confirma as informacoes selecionadas.

     //Operacao 2: Selecao do "ARMAZEM" (Local de Estoque) relacionado a loja onde serao reservados os produtos
    Case cOperacao == "2"

        //Efetua a reserva dos produtos
        For nX:=1 To Len(aProdutos)

            cItem := aProdutos[nX][2] //Item da venda
            cProduto := aProdutos[nX][3] //Codigo do Produto

            //Faz a Reserva no primeiro Local de Estoque (Armazem) encontrado para a loja escolhida que possua saldo
            For nY := 1 To Len(aEstoque)

                If aEstoque[nY][8] == cItem .And. aEstoque[nY][4] == cProduto

                    lTemEstoque := .F.

                    For nZ:=1 To Len(aEstoque[nY][5])

                        //Verifica se tem a qtde. suficiente em estoque para reservar
                        If aEstoque[nY][5][nZ][2] >= aEstoque[nY][6] .And. aEstoque[nY][5][nZ][1] == aEstoque[nY][9]
                            aEstoque[nY][5][nZ][2] -= aEstoque[nY][6] //Subtrai a qtde
                            lTemEstoque := .T.
                            Exit
                        EndIf

                    Next nZ

                    If lTemEstoque
                        aEstoque[nY][1] := .T. //Seleciona
                        Exit
                    EndIf

                EndIf

            Next nY

            If !lTemEstoque
                aAdd( aPrdSemEst, AllTrim(cProduto) + " - " + AllTrim(Posicione("SB1",1,xFilial("SB1")+cProduto,"B1_DESC")) )
            EndIf

        Next nX

        lConfirma := .T.

        //Se nao tem estoque suficiente para reservar todos os produtos, entao aborta todas as reservas
        If Len(aPrdSemEst) > 0
            cMsg := "Não existe estoque suficiente para o(s) seguinte(s) produto(s):" + Chr(13) + Chr(10) + Chr(13) + Chr(10)
            For nX:=1 To Len(aPrdSemEst)
                cMsg += aPrdSemEst[nX] + Chr(13) + Chr(10)
            Next nX
            Alert(cMsg)
            aEstoque := aEstoqBKP //Devolve o array sem alteracoes
            lConfirma := .F. //Cancela
        EndIf

EndCase

aRet := { lConfirma, aLojas, aProdutos, aEstoque }

Return aRet



//--------------
// Neste array esta a relacao de Lojas (SLJ) disponiveis para realizar reserva de produto
// Devem ser selecionadas apenas as lojas na qual deseja fazer a reserva.
//---------------------------------------------------------------------------------------------
//[1] - .T. ou .F. (para selecao)
//[2] - Codigo da loja (LJ_CODIGO)
//[3] - Nome da loja (LJ_NOME)
//---------------------------------------------------------------------------------------------//---------------------------------------------------------------------------------------------
// Estrutura do array aProdutos
//---------------------------------------------------------------------------------------------
// Neste array estao os produtos da venda.
// Devem ser selecionados apenas o produtos que desejar fazer a reserva.
//---------------------------------------------------------------------------------------------
//[1] - .T. ou .F. (para selecao)
//[2] - Item do produto na aCols
//[3] - Codigo do Produto
//[4] - Descricao
//[5] - Quantidade
//---------------------------------------------------------------------------------------------//---------------------------------------------------------------------------------------------
// Estrutura do array aEstoque
//---------------------------------------------------------------------------------------------
// Neste array estao as informacoes relacionadas ao saldo em estoque dos produtos selecionados.
// Devem ser selecionados em qual Loja/Armazem deseja fazer a reserva do produto.
//---------------------------------------------------------------------------------------------
//[1] - .T. ou .F. (para selecao)
//[2] - Codigo da Loja (SLJ->LJ_CODIGO)
//[3] - Nome da Loja (SLJ->LJ_NOME)
//[4] - Codigo do Produto
//[5] - Array com a qtd em Estoque:
// [1]-Local (Armazem)
// [2]-Qtde Estoque (SB2)
//[6] - Quantidade a Reservar
//[7] - Texto para ser mostrado no ListBox da tela, quando utilizada a interface
//[8] - Numero do item no aCols
//[9] - Armazem
//---------------------------------------------------------------------------------------------Do Case
//Operacao 1: Selecao das "LOJAS" onde serao reservados os produtos e selecao dos "PRODUTOS" que serao reservados
Case cOperacao == "1"
//-------------------------------------------
// Escolha da LOJA onde sera feita a reserva
//-------------------------------------------
aLojas[1][1] := .T. //Neste exemplo, sempre considera a escolha (selecao) da primeira loja
//-------------------------------------------
// Escolha dos PRODUTOS que serao reservados
//-------------------------------------------
For nX:=1 To Len(aProdutos)
//Localiza o item no aCols
nPosAcols := aScan( aCols, { |x| x[nITEM] == aProdutos[nX][2] } )
//Selecionando apenas os produtos, cujo a opcao do campo "LR_ENTREGA" seja "3-Entrega"
If !Empty(aCols[nPosAcols][nENTREGA]) .And. aCols[nPosAcols][nENTREGA] == "3" //3=Entrega
aProdutos[nX][1] := .T.
EndIf
Next nX
lConfirma := .T. //Confirma as informacoes selecionadas.
//Operacao 2: Selecao do "ARMAZEM" (Local de Estoque) relacionado a loja onde serao reservados os produtos
Case cOperacao == "2"
//Efetua a reserva dos produtos
For nX:=1 To Len(aProdutos)
cItem := aProdutos[nX][2] //Item da venda
cProduto := aProdutos[nX][3] //Codigo do Produto
//Faz a Reserva no primeiro Local de Estoque (Armazem) encontrado para a loja escolhida que possua saldo
For nY := 1 To Len(aEstoque)
If aEstoque[nY][8] == cItem .And. aEstoque[nY][4] == cProduto
lTemEstoque := .F.
For nZ:=1 To Len(aEstoque[nY][5])
//Verifica se tem a qtde. suficiente em estoque para reservar
If aEstoque[nY][5][nZ][2] >= aEstoque[nY][6] .And. aEstoque[nY][5][nZ][1] == aEstoque[nY][9]
aEstoque[nY][5][nZ][2] -= aEstoque[nY][6] //Subtrai a qtde
lTemEstoque := .T.
Exit
EndIf
Next nZ
If lTemEstoque
aEstoque[nY][1] := .T. //Seleciona
Exit
EndIf
EndIf
Next nY
If !lTemEstoque
aAdd( aPrdSemEst, AllTrim(cProduto) + " - " + AllTrim(Posicione("SB1",1,xFilial("SB1")+cProduto,"B1_DESC")) )
EndIf
Next nX
lConfirma := .T.
//Se nao tem estoque suficiente para reservar todos os produtos, entao aborta todas as reservas
If Len(aPrdSemEst) > 0
cMsg := "Não existe estoque suficiente para o(s) seguinte(s) produto(s):" + Chr(13) + Chr(10) + Chr(13) + Chr(10)
For nX:=1 To Len(aPrdSemEst)
cMsg += aPrdSemEst[nX] + Chr(13) + Chr(10)
Next nX
Alert(cMsg)
aEstoque := aEstoqBKP //Devolve o array sem alteracoes
lConfirma := .F. //Cancela
EndIf
EndCase

aRet := { lConfirma, aLojas, aProdutos, aEstoque }

---------

Caso haja a necessidade de utilizar outro tipo de reserva ou entrega, usar como exemplo o Tipo de entrega 5, como é mostrado na imagemabaixo:

Image AddedReturn aRet

Importante:

Para utilizar este ponto de entrada é necessário que o parâmetro MV_LJRESER esteja configurado como "2" ou "3"..