DNATech :: 💡 Dica prática ADVPL (com SQL explícito)

_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

Postagens mais visitadas