DNATech :: 🚨 Quando o `DBInfo()` te entrega `_SC01`… mas o MSSQL diz que a tabela “não existe” 👀

🚨 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

Postagens mais visitadas