Exemplo de Sub-Rotina de Carga Incremental

De Qknow
Ir para: navegação, pesquisa

This document is available in English. Click on flag at side.

EnglishFlag.jpg

Introdução

Como visto no artigo sobre carga incremental, o script pode ser implementado por processos de concatenação e união (CONCATENATE e JOIN) para cada tabela que se deseja implementar o incremento. No entanto, se várias são as tabelas destinadas a este tipo de carga, a criação de uma rotina reutilizável é mais eficiente, pois pode ser invocada de qualquer lugar do script sempre que necessário.

Rotinas reutilizáveis são definidas pelas instruções SUB..END SUB e devem ser posicionadas nas primeiras guias do script (a esquerda). Qualquer chamada a uma rotina definida em nível de script deve ocorrer somente após a definição da rotina ter ocorrido, motivo pelo qual as definições são realizadas antes. O exemplo de código a seguir cria uma rotina para os três tipos de operação de carga incremental: Novos registros, registros atualizados ou registros excluídos.

SET v_SalvaQVD = 1;
LET vPasta.Extracao = 'Q:\SelfStudy\Incremental Load';

SUB GravaQVD(pAlias, pQVD, pDropTable, pIncremental, pExists, pNumRec, pPk, pTableType)

	// Parâmetros:	                pAlias 			- Nome da Tabela de Origem em Memória carregada do DB.
	// 				pQVD			- Nome do Arquivo .Qvd a ser gravado em disco.
	//				pDropTable		- Indicador de Exclusão da Tabela em Memória Após Gravar Qvd.
	// 				pIncremental	        - Tipo de Carga Incremental. Ver guia Incremental Load.
	// 				pExists			- Indica se Arquivo .Qvd já existe no disco.
	//				pNumRec			- Número de Registros Afetados.
	//				pPk			- Chave primária da tabela. Apenas para carga tipo 3.
	//				pTableType		- Carga de Arquivo ou de Database. Apenas para carga tipo 3.
	
	Trace 'Iniciando Rotina de Gravação do Qvd';
	Trace pExists: $(pExists);
	IF pExists = -1 and pNumRec > 0 THEN
		Trace 'Identificado Arquivo Qvd Existente';
		SWITCH $(pIncremental)
			CASE 1
				Trace 'Realizando Load Incremental Tipo 1';
				$(pQVD):
				CONCATENATE ($(pAlias)) LOAD * FROM $(vPasta.Extracao)\$(pQVD).QVD (QVD);
			CASE 2
				Trace 'Reazliando Load Incremental Tipo 2';
				$(pQVD):
				CONCATENATE ($(pAlias)) LOAD * FROM $(vPasta.Extracao)\$(pQVD).QVD (QVD) WHERE NOT Exists ($(pPk));
			CASE 3
				Trace 'Realizando Load Incremental Tipo 3';
				CONCATENATE ($(pAlias)) LOAD * FROM $(vPasta.Extracao)\$(pQVD).QVD (QVD) WHERE NOT Exists ($(pPk));
				IF pTableType = 1 THEN
					INNER JOIN LOAD $(pPk) FROM [$(vPasta.Extracao)\$(pQVD).xls] (biff, embedded labels, table is $(pQVD)$);
				ELSEIF pTableType = 2 THEN
					INNER JOIN SQL SELECT $(pPk) FROM $(pAlias);
				ELSE
					SET v_SalvaQVD = 0;
				ENDIF;
		END SWITCH;
	ENDIF;

	IF v_SalvaQVD = 1 and pNumRec > 0 THEN
		Trace 'Gravando Qvd em Disco';
	  	STORE $(pAlias) INTO $(vPasta.Extracao)\$(pQVD).QVD (QVD);
	ENDIF;

	IF pDropTable = 1 THEN
	  	DROP TABLE $(pAlias); 
  	ENDIF;
  
END SUB;

Os conceitos aplicados neste script são explicados a seguir:

  • Todas as linhas entre SUB...END SUB não são executadas quando o script é recarregado. Ao contrário, apenas a definição da existência da rotina passa a existir. Assim, esta SUB poderá ser acionada a partir de qualquer ponto do script após sua definição.
  • Os nomes entre parênteses são parâmetros da rotina, incluindo pAlias, pQVD, pDropTable, pIncremental, pExists, pNumRec, pPk, pTableType. Estes parâmetros são informados quando a rotina é invocada (chamada) de qualquer outra parte do script.
  • As linhas assinaladas em verde com o início definido por duas barras sequenciais são ignorados na execução da rotina. Estas linhas são consideradas comentários e servem apenas para documentar o código do script. Cada linha possui uma breve explicação dos parâmetros.
  • O comando Trace é utilizado para apresentar mensagens durante o processo de recarga. Mais informações sobre esta instrução podem ser encontradas no artigo sobre mensagens de acompanhamento de rotinas.
  • A instrução IF pExists = -1 and pNumRec > 0 THEN avalia o conteúdo de dois parâmetros. O primeiro informa se o arquivo .QVD já existe, o que define a carga como incremental. O segundo se algum registro novo, modificado ou excluído foi encontrado, para que a ação de incremento possa ser feita.
  Nota: Para maiores informações sobre a geração dos arquivos .QVD no processo de carga incremental, leia este artigo.
  • O teste da instrução SWITCH para o parâmetro $(pIncremental) pode ser avaliado ainda como 3. Neste caso, além de realizar a carga incremental para novos registros e registros atualizados, linhas que foram excluídas da tabela de origem são igualmente eliminadas do arquivo .QVD, como neste exemplo.
  • Cabe a instrução CONCATENATE reunir os dados obtidos da tabela original com aqueles presentes no arquivo .QVD gerado pelas cargas anteriores. Já a instrução INNER JOIN alinha os registros existentes entre as duas fontes quando há possibilidade de exclusão de dados.
  • As variáveis v_SalvaQVD e vPasta.Extracao são utilizadas para definir se será necessário gravar o arquivo .QVD e para onde a gravação deve ocorrer, respectivamente. O arquivo .QVD será salvo no caminho definido pela variável vPasta.Extracao quando v_SalvaQVDestiver configurado para 1.

Chamada da Rotina de Carga Incremental

Qualquer sub-rotina pode ser acionada por meio da instrução CALL seguida do nome da rotina e dos parâmetros que houver. No exemplo a seguir, a tabela Clientes é alvo de uma carga incremental considerando que clientes não podem ser excluídos da tabela, mas podem ter seus registros atualizados ou novos clientes podem ingressar nos dados. Portanto, uma chamada típica da carga incremental é:

CALL GravaQVD ('ClientesDB', 'Clientes', 0, 2, $(v_FileExists), NoOfRows('ClientesDB'), 'ClienteID', 1);

Lembre-se!


	// Parâmetros:	                pAlias 			- Nome da Tabela de Origem em Memória carregada do DB.
	// 				pQVD			- Nome do Arquivo .Qvd a ser gravado em disco.
	//				pDropTable		- Indicador de Exclusão da Tabela em Memória Após Gravar Qvd.
	// 				pIncremental	        - Tipo de Carga Incremental. Ver guia Incremental Load.
	// 				pExists			- Indica se Arquivo .Qvd já existe no disco.
	//				pNumRec			- Número de Registros Afetados.
	//				pPk			- Chave primária da tabela. Apenas para carga tipo 3.
	//				pTableType		- Carga de Arquivo ou de Database. Apenas para carga tipo 3.

O primeiro parâmetro indica o nome da tabela que foi carregada em memória resultante de uma instrução SELECT ou LOAD Neste caso, a tabela em memória foi chamada de ClientesDB resultante de um comando semelhante a:

ClientesDB:
LOAD * FROM [qknow_clientes_v1.0.xls] (biff, embedded labels, table is Clientes$) Where DataModificação > '$(v_Parametro)'

O segundo parâmetro pQVD é definido para informar o nome do arquivo .QVD que será gravado pelo processo de carga. Neste caso, o parâmetro foi preenchido com o nome Clientes, portanto o resultado será a gravação de um arquivo chamado Clientes.QVD. O terceiro parâmetro, pDropTable, informa a rotina se a tabela que está sendo carregada deve ser excluída da memória no final do processamento. Esse recurso é especialmente útil quando o arquivo .QVW é destinado ao processo de extração e/ou transformação, já que não precisará manter os registros em memória. No exemplo acima, a instrução CALL utiliza o valor zero (0) no parâmetro, indicando que a tabela não será excluída ao final do processamento da sub-rotina.

Na sequencia, o parâmetro pIncremental recebe o valor 2 (dois) indicando, de acordo com a sub-rotina, que se trata de uma carga incremental para fins de novos registros e registros atualizados. Em seguida, pExists é o parâmetro preenchido com a variável v_FileExists indicando se há um arquivo prévio chamado Clientes.Qvd em disco. Se o arquivo existe o processo é uma carga incremental, doutra forma será uma carga completa (primeira carga). Para entender como testar se o arquivo existe em disco verifique o artigo correspondente a carga incremental simples.

A sub-rotina possui ainda um parâmetro para indicar se houveram registros modificados ou inseridos desde a última carga. Logo, pNumRec é preenchido por meio da chamada da função NoOfRows('ClientesDB') que conta quantas linhas existem na tabela carregada em memória. Caso nenhum registro seja carregado desde a última operação de reload, então o valor retornado pela função será zero e, neste caso, não haverá necessidade de regravação do arquivo .QVD.

O parâmetro seguinte, definido como pPk deve receber o campo designado como chave primária ou chave candidata. Ou seja, um campo que possa identificar exclusivamente cada registro, cada linha. Pode ser que seja um campo proveniente da tabela de origem ou que tenha sido gerado via funções hash. De qualquer forma, este parâmetro é útil somente para a carga incremental do tipo 3. Ou seja, somente quando pIncremental é informado com o valor três (3) que indica uma carga para novos registros, registros modificados ou excluídos da tabela de origem. Na chamada acima, este parâmetro não tem efeito sobre o resultado.

O último parâmetro da rotina prevê que a tabela original possa ser um arquivo persistido em disco no formato Excel ou uma conexão com um banco de dados. Válido apenas para pIncremental igual a 3, o parâmetro pTableType deve ser preenchido com os valores 1 ou 2, para tabelas Excel ou tabelas de banco de dados, respectivamente. Isso se dá para que seja possível realizar a operação de INNER JOIN a partir da chave primária/candidata, excluindo do arquivo .QVD qualquer linha que não exista na fonte de dados original. No entanto, esta fonte pode ser proveniente de um arquivo no qual a instrução será um LOAD ou de uma tabela de banco, onde a instrução será um SELECT. Para a chamada acima, como a carga não é do tipo 3, o valor 1 informado não é processado.

Este artigo aborda os conceitos para profissionais com alguma familiaridade nas instruções apresentadas e no processo de carga incremental simples. Caso seja necessário, para melhor entendimento, recomenda-se a leitura completa do artigo sobre carga incremental simples, onde são conceituados os modelos e os comandos necessários.


Lembre-se!

  • Parâmetros definidos na rotina são uma espécie de variáveis, mas só existem durante a execução da SUB pelo comando CALL.
  • Variáveis que antecedem a execução da rotina, como v_SalvaQVD e vPasta.Extracao existirão após a conclusão do script.
  • Para eliminar variáveis da memória basta atribuir a função NULL() ou usar a sintaxe LET vVariavel = .
  • Recomenda-se eliminar quaisquer variáveis que não sejam úteis ao dasboard ou à próxima execução.


Instruções Utilizadas:


Faça o download de exemplos de cargas incrementais nos links a seguir:


Idea 1.jpg

Entenda como funciona o processo de carga incremental.

Veja aqui!


Envelope01.jpg
Procurando Algo? Fale Conosco!

Voltar | Página Principal