Postagem em destaque
- Gerar link
- Outros aplicativos
BlackTDN :: Tips & Tricks ~ ADVPL : Query View & dbGoTop
Segundo o TDN a Função: DBGoTop tem o propósito de posicionar o “ponteiro” da tabela corrente em seu primeiro registro: físico e/ou lógico.
Mas, quando executada sobre uma “View”, seu propósito é diferente: DBGoTop quando executada em uma consulta “SQL” remonta-a. Então é um desperdício usar DBGoTop logo que uma “View” é retornada pela TCGenQry em dbUseArea. DbUseArea sempre garantirá o posicionamento no primeiro registro da “View” usar dbGoTop logo após o retorno forçará o sistema a tentar uma segunda consulta ao SGBD (ainda bem que o programador do dbAcces é um cara esperto e, prevendo isso, verifica a necessidade de reprocessar ou não a consulta).
Evite, como boa prática, o uso de dbGoTop em uma “View” a não ser que seu real intento seja remontá-la.
Um exemplo prático:
1: #include "protheus.ch" 2: #include "topconn.ch" 3: #include "tbiconn.ch" 4: 5: User Function GoTopView() 6: 7: /* 8: Constante CRLF Chr(13)+Chr(10) para inline. 9: Um desperdicio usa-la varias vezes. Obtenha seu valor uma unica vez 10: e reutilize-o. 11: */ 12: Local cCRLF := CRLF 13: 14: Local cQuery := "" 15: 16: /* 17: GetNextAlias() uma boa pratica para obter o proximo Alias temporario 18: disponivel para uso 19: */ 20: Local cAliasVSC7 := GetNextAlias() 21: 22: Local nRegs := 0 23: 24: RpcSetType(3) 25: 26: /* 27: RetSqlName necessita da Preparacao do Ambiente para consulta ao SX2 28: */ 29: PREPARE ENVIRONMENT EMPRESA "01" FILIAL "01" 30: 31: /* 32: PtInternal(1,cPTMsg) Informa mensagem a ser Mostrada no Monitor do appServer 33: */ 34: PtInternal(1,"dbGoTop View BlackTDN Sample") 35: 36: /* 37: TCInternal(1,cTCMsg) Informa mensagem a ser Mostrada no Monitor do dbAccess 38: */ 39: TCInternal(1,"dbGoTop View BlackTDN Sample") 40: 41: cQuery += "SELECT" + cCRLF 42: cQuery += " SC7.R_E_C_N_O_ SC7RECNO" + cCRLF 43: cQuery += "FROM" + cCRLF 44: cQuery += " " + RetSqlName("SC7") + " SC7" + cCRLF 45: cQuery += "WHERE" + cCRLF 46: cQuery += " SC7.D_E_L_E_T_ = ' '" + cCRLF 47: cQuery += "AND" + cCRLF 48: cQuery += " SC7.C7_FILIAL = '" + xFilial("SC7") + "'" + cCRLF 49: cQuery += "ORDER BY" + cCRLF 50: cQuery += " SC7.C7_FILIAL" 51: 52: TCQUERY ( cQuery ) ALIAS ( cAliasVSC7 ) NEW 53: 54: /* 55: TcSetField informa ao dbAccess o tipo do campo 56: */ 57: TcSetField( cAliasVSC7 , "SC7RECNO" , "N" , 15 , 0 ) 58: 59: /* 60: Um desperdicio aqui: uma vez que dbUseArea me garantira o posicionamento 61: no primeiro registro da View. EVITE ISSO 62: */ 63: ( cAliasVSC7 )->( dbGoTop() ) 64: 65: While ( cAliasVSC7 )->( !Eof() ) 66: ++nRegs 67: ( cAliasVSC7 )->( dbSkip() ) 68: End While //Tudo que vem Logo apos um END/NEXT eh considerado comentario por isso que End While 69: 70: /* Se eu precisar reprocessar a View dbGoTop garante a sua remontagem */ 71: ( cAliasVSC7 )->( dbGoTop() ) 72: 73: RESET ENVIRONMENT 74: 75: Return( nRegs ) |
Vamos executar o exemplo em modo “debug” e usar o dbMonitor para “rastrear” a execução da “Query” e constatar o DESPERDÍCIO de dbGoTop logo após o retorno de uma consulta.
Fica a dica: Evite chamar, desnecessariamente, dbGoTop logo após o retorno de uma consulta.
[]s
иαldσ dj
- Gerar link
- Outros aplicativos
Comentários
Postagens mais visitadas
BlackTDN :: RLeg ~ Desvendando a Função ParamBox
- Gerar link
- Outros aplicativos
Protheus :: Chamando Funções do Menu Diretamente e sem a Necessidade de Login
- Gerar link
- Outros aplicativos
DbUseArea sempre garantirá o posicionamento no primeiro registro da “View”
ResponderExcluirEu sempre afirmei isso para outros programadores,
ninguem acreditava.
Então toma aí agora rapaziada!