
_Créditos da imagem: ChatGPT
## 💡 Dica prática ADVPL (com SQL explícito)
### ❌ Evite este padrão
```advpl
// A query já filtrou os registros...
cQry := " SELECT FIELD1, FIELD2, FIELDN " + ;
" FROM " + RetSQLName("TABLE") + " TABLE " + ;
" WHERE TABLE.D_E_L_E_T_ = '' " + ;
" AND TABLE.FILIAL = '" + xFilial("TABLE") + "' " + ;
" AND TABLE.FIELD1 = '" + cFiltraField1 + "' " + ;
" AND TABLE.FIELD2 = '" + cFiltraField2 + "' " + ;
" AND TABLE.FIELDN = '" + cFiltraFieldN + "' " + ;
MPSysOpenQuery(cQry, cAlias)
while (cAlias)->(!EOF())
// Nova busca, novo SQL, novo custo
TABLE->(DbSeek(xFilial("TABLE")+FIELD1+(cAlias)->FIELD2+(cAlias)->FIELDN))
(cAlias)->(DbSkip())
enddo
```
👉 Problema:
* `DbSeek()` **dispara nova consulta SQL**
* resolve índice lógico
* custo alto **dentro do loop**
* gargalo silencioso
---
### ✅ Prefira este padrão
```advpl
// A própria SQL já entrega o registro exato
cQry := " SELECT R_E_C_N_O_ TBRECNO " + ;
" FROM " + RetSQLName("TABLE") + " TABLE " + ;
" WHERE TABLE.D_E_L_E_T_ = '' " + ;
" AND TABLE.FILIAL = '" + xFilial("TABLE") + "' " + ;
" AND TABLE.FIELD1 = '" + cFiltraField1 + "' " + ;
" AND TABLE.FIELD2 = '" + cFiltraField2 + "' " + ;
" AND TABLE.FIELDN = '" + cFiltraFieldN + "' " + ;
MPSysOpenQuery(cQry, cAlias)
while (cAlias)->(!EOF())
// Acesso direto via PK (R_E_C_N_O_)
TABLE->(DbGoTo((cAlias)->TBRECNO))
(cAlias)->(DbSkip())
enddo
```
👉 Vantagem:
* a **SQL faz o trabalho pesado**
* `DbGoTo()` usa chave primária
* sem reprocessar índice
* menos SQL, menos custo, mais performance
---
## Regra de ouro 🧠
> **Se a SQL já achou o registro, não peça pro ADVPL procurar de novo.
> Use `R_E_C_N_O_` e vá direto ao ponto.**
Clássico no conceito.
Atual na prática.
E elegante no desempenho. 🚀
---
#ADVPL, #Protheus, #TOTVS, #SQLNoProtheus, #PerformanceADVPL, #R_E_C_N_O_, #DbGoTo, #DbSeek, #CodigoLegado, #Refatoracao, #BoasPraticas, #DicaNinja, #DevRaiz, #ERP, #BackendBrasil 🚀🥷
Torne-se um Sponsor:
🥊(дави)={0.5x[(Налдо)+(Алине)]}🥊
Comentários
Postar um comentário