Função para criar tabelas em todas as filiais/empresas

Olá pessoal…

Recentemente ajudando um amigo no Skype, criei uma função que percorre todas as filiais/empresas do Protheus e cria tabelas em todas elas conforme o dicionário.

Essa função, ela pega a unidade de negócios, e todas as empresas, e percorre elas. Ao posicionar na empresa, pega todas as filiais, e percorre todas elas.

Quando está percorrendo as filiais, ai você pode chamar as funções para criação de tabelas, como ChkFile e DbSelectArea, ou se for uma atualização utilizar a X31UpdTable, lembrando de passar o alias dentro delas como “SB1”, e se for mais de uma tabela pode copiar a linha e colar abaixo.

Lembrando que essa função foi testada em um cenário com unidade de negócios, caso não dê certo, você pode adaptar as funcionalidades.

Abaixo a função criada.

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zTstEmp
Função que percorre as empresas / filiais e cria as tabelas no banco
@author Daniel Atilio
@since 16/12/2017
@version 1.0
	@example
	u_zTstEmp()
/*/

User Function zTstEmp()
	Local aAreaM0  := SM0->(GetArea())
	Local cFilBk   := cFilAnt
	Local cEmpBk   := cEmpAnt
	Local cUnidNeg
	Local aUnitNeg := Iif(lAllFil, FWAllGrpCompany(), {SM0->M0_CODIGO})
	Local aEmpAux  := Iif(lAllFil, FWAllCompany(), {cEmpAnt})
	Local nGrp
	Local nEmp
	Local nAtu
 
	//Percorrendo os grupos de empresa
	For nGrp := 1 To Len(aUnitNeg)
		cUnidNeg := aUnitNeg[nGrp]
		 
		//Percorrendo as empresas
		For nEmp := 1 To Len(aEmpAux)
			cEmpAnt := aEmpAux[nEmp]
			aFilAux := FWAllFilial(cEmpAnt)
			
			//Percorrendo as filiais listadas
			For nAtu := 1 To Len(aFilAux)
				//Se o tamanho da filial for maior, atualiza
				If Len(cFilAnt) > Len(aFilAux[nAtu])
					cFilAnt := cEmpAnt + aFilAux[nAtu]
				Else
					cFilAnt := aFilAux[nAtu]
				EndIf
				 
				//Posiciono na empresa
				SM0->(DbGoTop())
				SM0->(DbSeek(cUnidNeg+cFilAnt))
			 
				//Aqui você pode usar ChkFile(), DbSelectArea() ou X31UpdTable() para criar / atualizar tabelas, e o TAB1, você pode colocar os alias que você deseja, como por exemplo, "SB1", "SA1", "SA2", etc
				ChkFile("TAB1")
			Next
		Next
	Next
	
	cFilAnt := cFilBk
	cEmpAnt := cEmpBk
	RestArea(aAreaM0)
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. Edivaldo Duque de Souza disse:

    Nas terças, mais certo e útil que o paredão no BBB é o Ti publicando algo sobre AdvPL e Protheus. Excelente publicação, essa função vai gerar um ganho absurdo de tempo.

Deixe uma resposta

Terminal de Informação