Convertendo o arquivo sdfbra.txt gerado pela rotina Gestão de Ambientes(APCFG300) para uma release diferente da original.
Tags: advpl, totvs, protheus
Published: 2023-11-13 17:37:13

Ao gerar um compatibilizador pela rotina **Gestão de Ambientes(APCFG300)** localizado no módulo **Configurador(SIGACFG)** no menu **Base de Dados -> Gestão de Ambientes -> Cadastro de Projetos**, o projeto fica vinculado a release do ambiente em que foi gerado, 12.1.2210 por exemplo, impossibilitando usar os mesmos arquivos gerados para executar a rotina **UPDDISTR** em um ambiente com release diferente da que originou os arquivos.

A função abaixo (Fonte no final do artigo) tem o objetivo de contornar essa limitação e possibilitar a conversão do arquivo sdfbra.txt para ser utilizado em outras releases do sistema.

**Execução da função:**

![Tela Inicial](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q0mns5ijxdlnus3bv9ry.JPG)

Clique em **Ok** para seguir com o processo.

![Selecionar Arquivo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d4kyfq2rnqj9j6a31vu6.JPG) 

Selecione o arquivo desejado e clique em **Abrir**.

![Selecionar Release](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/owrwl9et64hiialne7gz.JPG)

Na tela você pode ver a release atual do arquivo selecionado e as opções de release para conversão. Selecione a release desejada e clique em **Ok**.

![Tela Final](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ef5v2uxk40uz4v643kmu.JPG)

Com o arquivo convertido e a mensagem de conclusão informando o caminho onde o arquivo foi gerado clique em **Fechar** para finalizar.

A partir de agora você pode utilizar os arquivos para executar o **UPDDISTR** no sistema.

**Fonte: custom.acfg001.prw**

```
#INCLUDE "TOTVS.CH"

/*/{Protheus.doc} ACFG001
Converte arquivo sdfbra.txt gerado pela rotina APCFG300 - Gestão de Ambientes
para a release desejada (12.1.033, 12.1.2210 ou 12.1.2310)

*** Função sob licença de uso livre não podendo ser comercializada. ***

@type function
@version 12.1.2310 
@author Thiago Berna - www.berna.dev
@since 11/11/2023
/*/
User Function ACFG001
	Local aParam        as array
	Local aOpc          as array
	Local oArquivo      as object
	Local cLinhas       as character
	Local cArquivo      as character
	Local cDesRls       as character
	Local cOriRls       as character
	Local cOriEncRls    as character
	Local nPosRls       as numeric
	Local nPosOpcOri    as numeric
	Local nPosEncRls    as numeric
	Local nOpcA			as numeric
	aParam      := {}
	aOpc        := {"12.1.033 ", "12.1.2210", "12.1.2310"}
	cLinhas     := ""
	cArquivo    := ""
	cDesRls     := ""
	cOriRls     := ""
	cOriEncRls  := ""
	nPosRls     := 0
	nPosEncRls  := 0
	nOpcA		:= 0

	FormBatch("Converter SDFBRA.TXT",;
		{"Essa rotina tem como objetivo converter o arquvio sdfbra.txt para a release desejada",;
		"12.1.033, 12.1.2210 ou 12.1.2310. Função sob licença de uso livre não podendo ser ",;
		"comercializada.",;
		"Desenvolvido por Thiago Berna - www.berna.dev"},; 
		{{1, .T., {|o| nOpcA := 1, o:oWnd:End()}}, {2, .T.,{|o| nOpcA := 2, o:oWnd:End()}}})
	
	If nOpcA == 1
		//Carrega o arquivo para processamento
		cArquivo    := tFileDialog("Arquivos SDFBRA (sdfbra.txt)", "Seleção de Arquivos", , , .F., )

		If Empty(cArquivo)
			MsgInfo("Nenhum arquivo selecionado!", "Atenção")
		Else

			//Lê o arquivo selecionado.
			oArquivo := FWFileReader():New(cArquivo)

			If !oArquivo:Open()
				MsgInfo("Falha ao abrir o arquivo! " + oArquivo:Error():Message, "Atenção")
			Else
				cLinhas := oArquivo:FullRead()
			EndIf

			oArquivo:Close()

			//Identifica os parâmetros EM_RELEASE e EM_ENCREL do arquivo sdfbra.txt original.
			nPosRls     := AT("EM_RELEASE", cLinhas)
			nPosEncRls  := AT("EM_ENCREL", cLinhas)
			cOriRls     := SubStr(cLinhas, nPosRls + 10, 9)
			cOriEncRls  := SubStr(cLinhas, nPosEncRls + 10, 20)

			//Não disponibiliza a release de origem nas opções de release de destino.
			nPosOpcOri := AScan(aOpc, {|x| x == cOriRls})
			If nPosOpcOri > 0
				ADel(aOpc, nPosOpcOri)
				ASize(aOpc, Len(aOpc) - 1)
			EndIf

			//Seleciona a release de destino.
			AAdd(aParam ,{9, "Release de Origem: " + cOriRls, 200, 40, .T.})
			AAdd(aParam, {2, "Release de Destino", Len(aOpc), aOpc, 50, "", .T.})

			If ParamBox(aParam, "Parâmetros", , , , , , , , , .F., .T.)
				//Corrige problema da função ParamBox ao manter a opção inicial selecionada.
				If ValType(MV_PAR02) == "N"
					cDesRls := aOpc[MV_PAR02]
				Else
					cDesRls := MV_PAR02
				EndIf

				//Ajusta o parâmetro EM_ENCREL no arquivo sdfbra.txt de destino.
				//Obs.: Parâmetros de conhecimento público podendo ser visualizados sem restrição
				//dentro do arquivo sdfbra.txt gerado pela rotina padrão APCFG300 - Gestão de Ambientes.
				If cDesRls == "12.1.033 "
					cLinhas := SubStr(cLinhas, 1, nPosEncRls + 9) + "48F5ACB296E9D740CB7C" + SubStr(cLinhas, nPosEncRls + 30)
				ElseIf cDesRls == "12.1.2210"
					cLinhas := SubStr(cLinhas, 1, nPosEncRls + 9) + "48F5ACB296EBD642DB7C" + SubStr(cLinhas, nPosEncRls + 30)
				ElseIf cDesRls == "12.1.2310"
					cLinhas := SubStr(cLinhas, 1, nPosEncRls + 9) + "48F5ACB296EBD742DB7C" + SubStr(cLinhas, nPosEncRls + 30)
				EndIf

				//Ajusta o parâmetro EM_RELEASE no arquivo sdfbra.txt de destino.
				//Obs.: Parâmetros de conhecimento público podendo ser visualizados sem restrição
				//dentro do arquivo sdfbra.txt gerado pela rotina padrão APCFG300 - Gestão de Ambientes.
				cLinhas := SubStr(cLinhas, 1, nPosRls + 9) + cDesRls + SubStr(cLinhas, nPosRls + 19)

				//Renomeia o arquivo original para gerar um backup.
				FRename(cArquivo, SubStr(cArquivo, 1, AT("SDFBRA.TXT", UPPER(cArquivo)) - 1) + "bkp_sdfbra_" + DTOS(dDataBase) + "_" + StrTran(Time(),":","") + ".txt")

				//Gera um novo arquivo sdfbra.txt com os dados atualizados.
				oArquivo := FWFileWriter():New(cArquivo, .T.)

				If !oArquivo:Create()
					MsgInfo("Falha ao criar o novo arquivo! " + oArquivo:Error():Message, "Atenção")
				Else
					If !oArquivo:Write(cLinhas)
						MsgInfo("Falha ao escrever o novo arquivo! " + oArquivo:Error():Message, "Atenção")
					EndIf
					oArquivo:Close()
					MsgInfo("Arquivo " + cArquivo + " atualizado com sucesso!", "Atenção")
				EndIf
			Else
				MsgInfo("Processo cancelado pelo usuário!", "Atenção")
			EndIf
		EndIf
	Else
		MsgInfo("Processo cancelado pelo usuário!", "Atenção")
	EndIf

	FWFreeVar(@oArquivo)
	FWFreeVar(@aParam)
	FWFreeVar(@aOpc)

Return

```