
🚨 Quando o `DBInfo()` te entrega `_SC01`… mas o MSSQL diz que a tabela “não existe” 👀
Hoje esbarrei em um detalhe MUITO interessante do ecossistema Protheus + DBAccess + TOPCONN envolvendo tabelas temporárias.
## O Problema
Você possui uma área temporária aberta:
```advpl
cTable := TMP1->(dbInfo(DBI_FULLPATH))
```
E recebe algo como:
```text
_SC01
```
Tudo parece normal…
```advpl
TCCanOpen("_SC01") // .T.
```
```advpl
TCObject("_SC01", @cType)
// "TEMPORARY TABLE"
```
Porém:
```advpl
TCSQLExec("SELECT * FROM _SC01")
```
❌ Falha dizendo que a tabela não existe.
---
## O Motivo
`_SC01` NÃO é o nome físico da tabela no SQL Server.
Ele é apenas um alias lógico controlado pelo DBAccess.
O MSSQL enxerga algo como:
```text
##TMPSC0001_ABC123
```
Ou seja:
* `DBInfo()` → retorna o nome lógico associado à área
* `TCObject()` → identifica o tipo do objeto no DBAccess
* `TCConfig("GETTEMPNAME=...")` → resolve o nome físico real da temporary table
---
## Solução
Criei estas helpers:
```advpl
static method GetAliasTableName(cAlias) class \[MySQLToolsClass\]
local cTableRealName
paramtype 1 var cAlias as character optional default Alias()
// https://tdn.totvs.com/display/tec/DBInfo
cTableRealName := (cAlias)->(dbInfo(DBI_FULLPATH))
return(cTableRealName)
static method GetTmpRealNameByAlias(cAlias) class \[MySQLToolsClass\]
local cType as character
local cTableRealName as character
paramtype 1 var cAlias as character optional default Alias()
cTableRealName := \[MySQLToolsClass\]():GetAliasTableName(cAlias)
// https://tdn.totvs.com/display/tec/TCObject
if ((TCObject(cTableRealName,@cType)).and.(cType=="TEMPORARY TABLE"))
// https://tdn.totvs.com/display/tec/TCConfig
cTableRealName := TCConfig("GETTEMPNAME="+cTableRealName)
endif
return(cTableRealName)
```
---
## Resultado
Agora consigo fazer:
```advpl
cRealTable := \[MySQLToolsClass\]():GetTmpRealNameByAlias("TMP1")
TCSQLExec("SELECT COUNT(*) FROM " + cRealTable)
```
🔥 Funcionando perfeitamente.
---
## Resumo técnico
### `DBInfo(DBI_FULLPATH)`
Obtém o nome associado à área/alias.
### `TCObject()`
Permite identificar se o objeto é uma `"TEMPORARY TABLE"`.
### `TCConfig("GETTEMPNAME=...")`
Resolve o nome físico REAL da tabela temporária no banco.
---
Esse tipo de detalhe mostra como entender a camada DBAccess/TOPCONN faz MUITA diferença na hora de otimizar, depurar ou criar frameworks internos no Protheus.
---
#Protheus #ADVPL #TLPP #TOTVS #DBAccess #TOPCONN #SQLServer #ERP #Desenvolvimento #Backend #Programação
Comentários
Postar um comentário