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.