DBSkip
Avanca (ou recua) registros na tabela ativa. Operador padrao em loops While/Enddo de varredura.
Assinatura: DBSkip([nQtd]) -> NIL
Retorna: NIL
DBSkip move o ponteiro N registros pra frente (positivo) ou pra tras (negativo). E o jeito padrao de iterar uma tabela em AdvPL.
Sintaxe
DBSelectArea("SA1")
DBGoTop()
While !Eof()
ConOut(SA1->A1_NOME)
DBSkip() // proximo registro
EndDo
Pegadinhas
- Sem Eof() — esquecer a condicao gera loop infinito (DBSkip apos Eof continua chamando).
- While com filtro — combinar com
SA1->A1_FILIAL == xFilial("SA1") .And. !Eof()pra nao varrer outras filiais. - DBSkip(-1) retrocede um registro — util em casos pontuais, mas rara em codigo limpo.
- DBSetFilter ativo — DBSkip pula registros filtrados; resultado pode parecer "errado" sem voce notar.
Padrao com xFilial e indice
SC6->(DBSetOrder(1))
SC6->(DBSeek(xFilial("SC6") + cNumPed))
While !SC6->(Eof()) .And. ;
SC6->C6_FILIAL == xFilial("SC6") .And. ;
SC6->C6_NUM == cNumPed
ConOut("Item " + SC6->C6_ITEM + ": " + SC6->C6_PRODUTO)
SC6->(DBSkip())
EndDo
Parâmetros
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
nQtd | Numeric | não | Quantidade de registros a pular (default 1). Negativo retrocede. |
Exemplos
Loop com proteção contra filial errada
SE1->(DBSetOrder(1))
SE1->(DBSeek(xFilial("SE1") + cCliente))
While !SE1->(Eof()) .And. SE1->E1_FILIAL == xFilial("SE1") .And. SE1->E1_CLIENTE == cCliente
nTotal += SE1->E1_VALOR
SE1->(DBSkip())
EndDo