Olá,
Uma possível forma de transformar esse código utilizando a FWTemporaryTable
é a seguinte:
local oTempTable as object
local cAliasTRB as character
local nX as numeric
oTempTable := FWTemporaryTable():New() //Cria o objeto da tabela temporária
oTempTable:SetFields(aLayout[1]) //Adiciona os campos
cAliasTRB := oTempTable:GetAlias() //Recupera o alias
For nX := 1 to Len(aLayout[2])
//O segundo parâmetro precisa ser um array, caso o valor de aLayout[2][nX] seja uma string
//pode ser necessário transformar isso em um array, por exemplo com a função StrTokArr2
// oTempTable:AddIndex("k_" + cValToChar(nX), StrTokArr2(aLayout[2][nX], "+", .F.) )
oTempTable:AddIndex("k_" + cValToChar(nX), aLayout[2][nX])
Next nX
DBSelectArea(cAliasTRB) //Deixa a tabela temporária na workarea ativa
DBSetOrder(1) //Força o primeiro índice
//Após o uso da tabela, por boas práticas, devemos apagar ela
//isso é feito com o método delete, ele fecha a tabela e apaga a mesma
oTempTable:Delete()
FreeObj(oTempTable) //Elimino a variável de objeto da memória após apagar a mesma do banco
Isso é apenas um exemplo baseado em seu código e variáveis, sendo bem possível que alterações no código sejam necessários para que ele venha a funcionar corretamente.
Documentação: https://tdn.totvs.com.br/display/framework/FWTemporaryTable