Base de conhecimento
Encontre respostas para suas dúvidas em quatro fontes de conhecimento diferentes ao mesmo tempo, simplificando o processo de pesquisa.

Cross Segmento - TOTVS Backoffice Linha Protheus - ADVPL - Utilização da função LASTREC() retorna '0'

time.pngTempo aproximado para leitura: 00:04:00 min

Dúvida

A função LASTREC() retorna "zero", quando na verdade o retorno da Query é maior que "zero"

Ambiente
Cross Segmento - TOTVS Backoffice (Linha Protheus) – ADVPL – A partir da versão 11.8

Solução
A função LastRec() retorna '0' devido estar utilizando Query, e a função TcGenQry() e que é especifica para execução de Query's, isto vale para o comando ADVPL TCQuery, que por trás executa TcGenQry().
Uma Query aberta no AdvPL cria um cursor de leitura, que permite apenas duas instruções de navegação: DBKSip(), para avançar para o próximo registro do cursor, e DBGoTop() – que fecha o cursor e abre novamente, submetendo a query novamente ao Banco de Dados. Um cursor no AdvPL não permite alteração (DBRLock, REPLACE, FieldPut), não permite voltar para registro anterior – DbSkip(-1) – e não permite ir direto ao último registro – DBGoBottom().
A TCGenQry só suporta statements de query (SELECT).

Funciona sim em Tabela Temporária e não em Query

Exemplo: 

/*EXEMPLO DE UTILIZAÇÂO DA FUNÇÂO LASTREC()*/

#include 'protheus.ch'
#include 'parmtype.ch'
#include "TOTVS.ch"
#include "RWMAKE.CH"
#include "tbiconn.ch"

/*/{Protheus.doc} TLastRec2
//TODO Descrição auto-gerada.
@author rodrigo.santiago
@since 14/12/2018
@version 1.0
@return ${return}, ${return_description}
@type function
/*/

user function TLastRec2()

Local nHandle :=0
Local cRDD :="TOPCONN"
Local cBanco :="MSSQL/P1217"
Local cServidor :="localhost"
Local nPorta :=7890
Local nI :=0
Local cTable :="TMP"

PREPARE ENVIRONMENT EMPRESA "01" FILIAL "010101"

nHandle := TCLink( cBanco, cServidor, nPorta )

If TCCanOpen(cTable)
TCDelFile(cTable)
EndIf

DBCreate('TMP', {{"FIELD_NAME", "C", 10, 0}, ;
{"FIELD_ID", "N", 15, 4}}, cRDD)

DBUseArea(.F., cRDD, cTable, cTable, .F., .F.)

FOR nI :=0TO9
DBAppend()
(cTable)->FIELD_NAME := 'TEST' + CValToChar(nI)

DOCASE

CASE nI = 0
(cTable)->FIELD_ID := 0

CASE nI = 1
(cTable)->FIELD_ID := 12345

CASE nI = 2
(cTable)->FIELD_ID := 12345.1234

CASE nI = 3
(cTable)->FIELD_ID := 1234567890

CASE nI = 4
(cTable)->FIELD_ID := -1234567890

CASE nI = 5
(cTable)->FIELD_ID := -1234567890.1234

CASE nI = 6
(cTable)->FIELD_ID := -1234567890.12345

CASE nI = 7
(cTable)->FIELD_ID := 0.123

CASE nI = 8
(cTable)->FIELD_ID := 0.1234

CASE nI = 9
(cTable)->FIELD_ID := 0.12345

ENDCASE

DBCommit()

NEXT

DBCloseArea()
DBUseArea(.F., cRDD, cTable, cTable, .F., .F.)

WHILE (cTable)->(!EOF())
Conout('['+ (cTable)->FIELD_NAME +'] = '+CValToChar((cTable)->FIELD_ID))
DBSkip()

ENDDO
conout("Total de registros da tabela Temporaria -> "+CValToChar( LastRec() ))
DBCloseArea()
Conout('------------------------------------------------')
cQuery := 'SELECT * FROM ' + cTable

DBUseArea(.F., cRDD, tcGenQry(, , cQuery), 'QRY', .T., .T.)
WHILE QRY->(!EOF())
Conout('['+FieldGet(1) +'] = '+CValToChar(FieldGet(2)))
DBSkip()

ENDDO

conout("Total de registros de uma Query -> "+CValToChar( LastRec() ))
DBCloseArea()
TCunlink()

Return


Saiba mais
LastRec()

 

Esse artigo foi útil?
Usuários que acharam isso útil: 0 de 1

1 Comentários

  • Avatar
    EVERSON DA COSTA ALMEIDA

    E o que se usa para saber o tamanho do retorno da consulta, quando precisamos determinar o tamanho de uma regua de processamento?

     

    0
    Ações de comentário Permalink
Por favor, entre para comentar.
X Fechar

Olá ,

Há pendência referente a um de seus produtos contratados para a empresa ().

Entre em contato com o Centro de Serviços TOTVS para tratativa.

Ligue! 4003-0015 opção 4 e 9 ou registre uma solicitação para CST – Cobrança – Verificação de pendências financeiras . clique aqui.

TOTVS

X Fechar

Olá ,

Seu contato não está cadastrado no Portal do Cliente como um perfil autorizado a solicitar consultoria telefônica.

Por gentileza, acione o administrador do Portal de sua empresa para: (1)configurar o seu acesso ou (2)buscar um perfil autorizado para registro desse atendimento.

Em caso de dúvidas sobre a identificação do contato administrador do Portal, ligue (11) 4003-0015, opção 7 e, em seguida, opção 4 para buscar o suporte com o time de Assessoria ao Portal do Cliente. . clique aqui.

TOTVS

X Fechar

Olá ,

Para o atendimento de "Consultoria Telefônica" você deverá estar de acordo com o Faturamento.

TOTVS

X Fechar

Olá,

Algo inesperado ocorreu, e o usuario nao foi reconhecido ou você nao se encontra logado

Por favor realize um novo login

Em caso de dúvidas, entre em contato com o administrador do Portal de Clientes de sua empresa para verificação do seu usuário, ou Centro de Serviços TOTVS.

Ligue! 4003-0015 opção 4 e 9 ou registre uma solicitação para CST – Cadastros . clique aqui.

TOTVS

Chat _

Preencha os campos abaixo para iniciar o atendimento:

Chat _