TCQuery
Executa SQL direto via DBAccess, criando um alias temporario. Sempre filtre D_E_L_E_T_ e use RetSqlName pra resolver nome fisico.
Assinatura: TCQuery cSQL NEW ALIAS cAliasTemp
Retorna: void
TCQuery executa SQL nativo no banco (MSSQL, Oracle, etc.), criando um alias temporario navegavel como uma area DBF. Bem mais rapido que filtros AdvPL pra relatorios.
Sintaxe
cQuery := "SELECT campos FROM tabela WHERE ..."
cAlias := GetNextAlias()
TCQuery cQuery New Alias (cAlias)
While !(cAlias)->(EOF())
// (cAlias)->CAMPO acessa cada linha
(cAlias)->(DBSkip())
End
(cAlias)->(DBCloseArea())Exemplo completo
cQuery := "SELECT A1_COD, A1_NOME, A1_CGC "
cQuery += " FROM " + RetSqlName("SA1") + " SA1 "
cQuery += " WHERE A1_FILIAL = '" + xFilial("SA1") + "' "
cQuery += " AND A1_MSBLQL <> '1' "
cQuery += " AND D_E_L_E_T_ = ' ' "
cQuery += " ORDER BY A1_COD "
cAlias := GetNextAlias()
TCQuery cQuery New Alias (cAlias)
While !(cAlias)->(EOF())
aAdd(aResult, { ;
(cAlias)->A1_COD, ;
AllTrim((cAlias)->A1_NOME) ;
})
(cAlias)->(DBSkip())
End
(cAlias)->(DBCloseArea())Pegadinhas obrigatorias
D_E_L_E_T_ = ' 'com espaco — Protheus marca delete logico com'*'e ativo com espaco (nao string vazia)- Filtro de filial manual — TCQuery nao respeita
xFilial()automaticamente. SempreWHERE TABELA_FILIAL = '" + xFilial("...") + "' - RetSqlName — resolve o nome fisico da tabela (com compartilhamento de empresa). Nunca hardcode
SA1010 - DBCloseArea no fim — esquecer vaza recurso
- SQL injection — nunca concatene input do usuario direto. Sanitize aspas:
StrTran(cInput, "'", "''")
TCQuery vs MpSysOpenQuery
MpSysOpenQuery e versao mais nova com suporte a parametros (evita SQL injection). Em codigo novo, prefira MpSysOpenQuery.
Parâmetros
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cSQL | Character | sim | Query SQL |
cAlias | Character | sim | Nome do alias temporario (use GetNextAlias) |
Exemplos
Lista clientes nao bloqueados
cQuery := "SELECT A1_COD FROM " + RetSqlName("SA1") + " WHERE A1_FILIAL='" + xFilial("SA1") + "' AND D_E_L_E_T_=' '"