No artigo de hoje, vamos demonstrar em como criar os registros da SB2 para inibir a mensagem “O armazem nao existe para este produto.” no Pedido de Compras.
Imagina o seguinte cenário, a empresa tem milhares de produtos, ai vão criar uma filial nova, vamos colocar aqui que seja o código “0201”.
Ao digitar o pedido de compras, e começar a colocar os produtos, começa a aparecer a mensagem “O armazém X não existe para este produto. Deseja criar agora?” (print abaixo), ai o usuário clica no Sim, e é criado. Ai ele vai digitar o segundo produto, acontece o mesmo.
Agora imagina ele ter que digitar 300 produtos, e ter que clicar 300 vezes no Sim. Foi pensando nisso que criamos essa pequena customização.
Como ela funciona:
- Nós trocamos para a filial 0201 através da função OpenFile
- Nós percorremos todos os produtos do sistema
- Declaramos a variável l120Auto como Private (para não ficar exibindo a pergunta)
- Acionamos a função A120ChkAlmox para fazer essa checagem / criação do armazém de produto a produto
Abaixo como ficou a função:
//Bibliotecas
#Include "TOTVS.ch"
#Include "TopConn.ch"
/*/{Protheus.doc} User Function zLancSB2
Exemplo de criação de informações do armazém
@type Function
@author Atilio
@since 17/07/2023
/*/
User Function zLancSB2()
Local aArea := FWGetArea()
If FWAlertYesNo("Deseja criar a SB2 para todos os produtos no armazém 01?", "Continua?")
Processa({|| fProcessa()}, "Processando")
EndIf
FWRestArea(aArea)
Return
Static Function fProcessa()
Local aArea := FWGetArea()
Local cQueryAux := ""
Local nAtual := 0
Local nTotal := 0
Local cArmazem := "01"
//Backup da empresa e filial atual
Local cEmpBkp := cEmpAnt
Local cFilBkp := cFilAnt
Local cNumEmpBkp := cNumEmp
//Variável usada internamente no A120ChkAlmox
Private l120Auto := .T.
//Troca a filial para a que será criada as informações
cFilAnt := "0201"
cFilialEnt := cFilAnt
cNumEmp := cEmpAnt + cFilAnt
OpenFile(cNumEmp)
//Busca todos os produtos que não estão bloqueados
cQueryAux := "SELECT B1_COD FROM " + RetSQLName("SB1") + " SB1 WHERE B1_FILIAL = '" + FWxFilial("SB1") + "' AND B1_MSBLQL != '1' AND SB1.D_E_L_E_T_ = ' '"
TCQuery cQueryAux New Alias "QRY_AUX"
//Define o tamanho da régua
Count To nTotal
ProcRegua(nTotal)
QRY_AUX->(DbGoTop())
//Enquanto houver dados
While ! QRY_AUX->(EoF())
//Incrementa a régua
nAtual++
IncProc("Analisando produto '" + Alltrim(QRY_AUX->B1_COD) + "' (" + cValToChar(nAtual) + " de " + cValToChar(nTotal) + ")...")
//Aciona a checagem / criação do saldo no armazém para o produto
A120ChkAlmox(QRY_AUX->B1_COD, cArmazem)
QRY_AUX->(DbSkip())
EndDo
QRY_AUX->(DbCloseArea())
//Volta o backup da filial
cEmpAnt := cEmpBkp
cFilAnt := cFilBkp
cNumEmp := cEmpAnt + cFilAnt
OpenFile(cNumEmp)
FWRestArea(aArea)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.

Parabéns Atilio, estou acompanhando todos os boletins da maratona advpl, conteúdos excelentes, com exemplos simples e praticos.
Fala Heliton, tudo joia?
Opa, obrigado pelo carinho e feedback, é muita bondade sua.
Um grande abraço.