Necessito de ajuda com tabelas temporárias em SELECTs

Atualmente eu alimento meu relatório com várias SELECT, porem percebi que a maioria necessitava das mesmas tabelas, ocasionando em uma baita repetição de código, e varias requisições iguais ao banco.

Assim sendo pensei na seguinte solução:utilizar um Alias como tabela(sou novo na programação com advpl), porem não funcionou. Imaginei então que uma tabela temporária seria uma boa solução, a qual teria todos os dados que eu iria utilizar e seria bem menor que as tabelas originais, contudo não consegui executar utilizando "DECLARE GLOBAL TEMPORARY TABLE".

Vocês acham que vale a pena o esforço? Se sim, como vocês sugerem que eu o faça?

Bom dia Patrick,

Você pode utilizar da classe FWTemporaryTable: http://tdn.totvs.com/display/framework/FWTemporaryTable

Após a criação da tabela, popular ela com um 'insert into'.

Vale a pena ressaltar que a tabela temporária pode ser utilizada somente pela thread que criou a mesma.

Ai me surgem algumas duvidas: Eu quero todos os campos do alias, basta eu passar o alias, ou é necessário eu adicionar um a um com o “aadd”? O “insert into” eu executo utilizando um “TcSqlExec”? E para utilizar dentro do select, eu coloco dentro de “%table:%”? Obrigado pela ajuda

Você precisa adicionar os campos que deseja trabalhar, a documentação tem os exemplos de como enviar os campos (método New ou SetFields). Para o insert into, sim você pode utilizar do TcSqlExec com o nome real da tabela temporária, método GetRealName.

Como eu utilizo a tabela tmeporaria dentro de um “BeginSql…EndSQL”? Eu criei uma static function como o exemplo da TOTVS, sem utilizar da linha 41 até 60, estou correto?

Você pode estar usando da seguinte maneira: Local cTable := ‘%’ + oTable:GetRealName() + ‘%’

BeginSql Alias _cAlias

	%NoParser%
	SELECT * FROM %Exp:cTable%

EndSql

Muito obrigado, é isto mesmo

include 'protheus.ch'

User Function ExFWTemporaryTable() Local aFields := {} Local oTempTable Local nI Local cAlias := "MEUALIAS" Local cQuery

//------------------- //Criação do objeto //------------------- oTempTable := FWTemporaryTable():New( cAlias )

//-------------------------- //Monta os campos da tabela //-------------------------- aadd(aFields,{"DESCR","C",30,0}) aadd(aFields,{"CONTR","N",3,1}) aadd(aFields,{"ALIAS","C",3,0})

oTemptable:SetFields( aFields ) oTempTable:AddIndex("indice1", {"DESCR"} ) oTempTable:AddIndex("indice2", {"CONTR", "ALIAS"} ) //------------------ //Criação da tabela //------------------ oTempTable:Create()

//------------------------------------ //Executa query para leitura da tabela //------------------------------------ cQuery := "select * from "+ oTempTable:GetRealName() MPSysOpenQuery( cQuery, 'QRYTMP' )

DbSelectArea('QRYTMP')

while !eof() for nI := 1 to fcount() varinfo(fieldname(nI),fieldget(ni)) next dbskip() Enddo

//--------------------------------- //Exclui a tabela //--------------------------------- oTempTable:Delete()

return