Histórico da Página
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: |
| ||||||||||
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" 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/ReservaaProdutos[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:
Return aRet
Importante:
Para utilizar este ponto de entrada é necessário que o parâmetro MV_LJRESER esteja configurado como "2" ou "3"..