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