Como acionar a criação da SB2 para vários produtos via A120ChkAlmox

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.

Mensagem exibida

 

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:

  1. Nós trocamos para a filial 0201 através da função OpenFile
  2. Nós percorremos todos os produtos do sistema
  3. Declaramos a variável l120Auto como Private (para não ficar exibindo a pergunta)
  4. 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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

2 Responses

  1. HELITON F A SEGA disse:

    Parabéns Atilio, estou acompanhando todos os boletins da maratona advpl, conteúdos excelentes, com exemplos simples e praticos.

Deixe uma resposta

Terminal de Informação