Erro no DbGoBottom() / SQLRDD

Fórum sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

andersoncamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 103
Registrado em: 22 Ago 2004 11:54

Erro no DbGoBottom() / SQLRDD

Mensagem por andersoncamilo »

Bom dia

Estou com um problema na função DbGoBottom() com o SQLRDD e PostGreSql 8.3, o problema acontece quando excluo o último registro inserido, e tento usar a função DbGoBottom() me retorna a seguinte mensagem: Error SQLRDD/1 Tentativa de gravar um registro em tabela vazia sem antes adicionar uma linha - RollBack executed.: CARRETEIRO., antes que falem que estou tentando gravar sem dar um append blank, estou dando o append blank sim, esse erro acontece após o DbGoBottom() .

Error at ...: SR_WORKAREA:RUNTIMEERR(1820) in Module: ..\source\sqlrdd2.prg
Called from : SR_WORKAREA:RUNTIMEERR(1852) in Module: ..\source\sqlrdd2.prg
Called from : SR_WORKAREA:WRITEBUFFER(2091) in Module: ..\source\sqlrdd2.prg
Called from : DBGOBOTTOM(0) in Module:
Called from : POECODIGO(1341) in Module: APOIOXHB.PRG
Called from : TELACARRETEIRO(462) in Module: LACAD.PRG
Called from : ENTRA_DADOS(629) in Module: APOIOXHB.PRG
Called from : CADPRODUCAO(110) in Module: LACAD.PRG
Called from : CADASTROS(68) in Module: LACAD.PRG
Called from : INICIOSISTEMA(579) in Module: LATICINI.PRG
Called from : MAIN(520) in Module: LATICINI.PRG

Fazendo alguns testes percebi que isso acontece porque o maior número do campo sr_recno na tabela que foi excluido o registro e menor do que o Next Value da sequence que esta no banco de dados, dai para frente toda vez que eu tentar usar o DbGoBottom() vai dar erro, para sanar o problema eu tenho que ir na sequence da tabela e ajustar o Next Value para o numero do maior sr_recno + 1. (No Caso da sequencia do Next Value esta correto, porque se foi excluído a sequencia continua não volta, acredito que o sqlrdd deva fazer algum tipo de comparação entre o maior sr_recno com o next value).

Se for excluído qualquer outro registro que não seja o último inserido funciona tudo certinho, alguém já viu esse problema e tem alguma ideia ou uma dica para resolve-lo.

Obrigado
Anderson Camilo
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Erro no DbGoBottom() / SQLRDD

Mensagem por fladimir »

Anderson, tem como vc postar um pequeno exemplo tipo dbcreate uma tabelinha simples e já add alguns dados pra ela tudo via código e depois coloca um exemplo do q vc esta passando com esta simulação para eu simular aki no meu sqlrdd pra ver se consigo te ajudar?

[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
andersoncamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 103
Registrado em: 22 Ago 2004 11:54

Erro no DbGoBottom() / SQLRDD

Mensagem por andersoncamilo »

Ola Fladimir

Eu fiz uns testes e consegui detectar o que provoca o erro, montei até um exemplo em cima do programa demo que vem junto na pasta samples, o erro aconte quando se deleta o ultimo registro da tabela e depois você usa um scopo.

Mas isso não resolve o meu problema porque pode acontecer de ter que deletar esse registro, e no meu caso eu utilizo o scopo, para controlar a empresa que esta em uso.

Segue abaixo o fonte dos testes.

Código: Selecionar todos

/*
* SQLRDD Test
* Copyright (c) 2003 - Marcelo Lombardo  <marcelo@xharbour.com.br>
* All Rights Reserved
*/

#include "sqlrdd.ch"

#define RECORDS_IN_TEST                   1000
#define SQL_DBMS_NAME                       17
#define SQL_DBMS_VER                        18

/*------------------------------------------------------------------------*/

REQUEST DBFNTX
REQUEST DBFCDX
REQUEST DBFFPT
REQUEST DBFDBT

Function Main( cRDD, cDSN )


   local aStruct := {{"CODE_ID","C",8,0 },;
                     {"CARDID","C",1,0},;
                     {"DESCR","C",50,0},;
                     {"PERCENT","N",10,2},;
                     {"DAYS","N",8,0},;
                     {"DATE_LIM","D",8,0},;
                     {"ENABLE","L",1,0},;
                     {"OBS","M",10,0},;
                     {"VALUE","N",18,6},; 
                     {"ID_EMPRESA","C",4,0} }
					 
   local nCnn, i

   ? ""
   ? "Teste.exe"
   ? ""
   ? "Teste com SQLRDD "
   ? ""

   ? "Connecting to database..."
   
*   SR_SetUseSequences(.T.)         // DESABILITA O CONTADOR DE SEQUENCIA AUTOMATICO
   SR_UseDeleteds( .F. )           // NÃO MANTER REGISTROS DELETADOS NAS TABELAS
   SR_SetFastOpen(.T.)             // ABRE AS TABELAS EM MODO COMPARTILHADO
   SR_SetGoTopOnScope(.F.)         // NÃO EXECUTA O DBGOTOP() AUTOMATICO NOS ORDSCOPE
   SR_MaxRowCache( 10 )            // Quantidade máxima de linhas mantidas em cache em tabelas do SQLRDD. O Default é 1000.
   SR_SetBaseLang( 2 )             // linguagem portugues
   SR_Msg(2)                       // portugues
   SR_SETSYNTHETICINDEX(.F.)       // vale o que for configurado pela função SR_SetSyntheticIndexMinimun().
   SR_SETSYNTHETICINDEXMINIMUN(10) // Quantidade mínima de colunas na chave de índice para criá-lo como Sintético. Os valores aceitos são entre 0 e 10.
   SETPGSOLDBEHAVIOR(.T.)          // CONSIDERAR CAMPOS NULL COMO VAZIO


   If !Connect("SQLRDD", "POSTGRES NATIVE")
      alert('Nao foi possivel conectar ao banco de dados...!')
      close all
      quit
   EndIf

   ? "Connected to        :", SR_GetConnectionInfo(, SQL_DBMS_NAME ), SR_GetConnectionInfo(, SQL_DBMS_VER )
   ? "RDD in use          :", cRDD
   ? "Creating table      :", dbCreate( "TEST_TABLE", aStruct, "SQLRDD" )

   USE "TEST_TABLE" EXCLUSIVE VIA "SQLRDD"

   ? "Table opened. Alias :", select(), alias(), RddName()
   ? "Fieldpos( CODE_ID ) :", Fieldpos( "CODE_ID" )
   ? "Fieldpos( DESCR )   :", Fieldpos( "DESCR" )

   ? "Creating 02 indexes..."

   Index on ID_EMPRESA + CODE_ID       tag TEST_TABLE_IND01 to TEST_TABLE
   Index on str(DAYS) + dtos(DATE_LIM) tag TEST_TABLE_IND02 to TEST_TABLE

   ? "Appending " + alltrim(str(RECORDS_IN_TEST)) + " records.."

   s := seconds()
   
   For i = 1 to RECORDS_IN_TEST
      Append Blank
	  Replace ID_EMPRESA WITH '0001'
      Replace CODE_ID  with strZero( i, 5 )
      Replace DESCR    with dtoc( date() ) + " - " + time()
      Replace DAYS     with (RECORDS_IN_TEST - i)
      Replace DATE_LIM with date()
      Replace ENABLE   with .T.
      Replace OBS      with "This is a memo field. Seconds since midnight : " + alltrim(str(seconds()))
	  
   Next

   ? "dbClearIndex()      :", dbClearIndex()
   ? "dbCloseArea()       :", dbCloseArea()

   USE "TEST_TABLE" SHARED VIA "SQLRDD"

   ? "Opening Indexes"
   dbsetindex('TEST_TABLE')
   
   ? "Set Order to 1      :", OrdSetFocus(1)
   ? "Seek                :", dbSeek( "000100002" )

   ? "found()             :", found()
   ? "Recno(),bof(),eof() :", recno(), bof(), eof()
   ? "dbUnLock()          :", dbUnLock()
   ? "RLock(), dbRLockList:", rlock(), sr_showVector( dbRLockList() )
   ? "Writes to the WA    :", FIELD->DESCR := "Hello, SQL!", FIELD->PERCENT  := 23.55
   ? "dbCommit()          :", dbCommit()
   ? " "
 
   ? "Press any key to browse()"

   inkey(0)
   clear

   ? "Order 1, key is     :", OrdSetFocus(1), ordKey()

   ? "TOP Scope           :", OrdScope( 0 )
   ? "BOTTOM Scope        :", OrdScope( 1 )

   ? "Press any key to browse() with another index and scope"
   inkey(0)
   dbGoTop()
   clear
   browse(row()+1,1,row()+20,80)

   clear
     
   DbGoBottom()
   alert("Recno antes de deletar os registros: " + str(recno()) )
   
&& ---------------- se comentar esse bloco aqui o problema desaparece -----------------   

   if trava()
      delete
      unlock 
	  
      DbGoBottom()
	  
      delete
      DbUnlock() 

	else
      alert("Nao foi possivel bloquear o Registro...!")
   endif	  

&& -------------------------------------------------------------------------------------
 
    DbGoBottom()
	alert( "Recno depois de deletar os 2 registros: " + str(recno()) )
  
  
   ? "Order 1, key is     :", OrdSetFocus(1), ordKey()

   
   
&& ---------------- ou se não utilizar scope também não acontece o erro  ----------------------   


   set scope to '0001' , '9999'

   ? "TOP Scope           :", OrdScope( 0 )
   ? "BOTTOM Scope        :", OrdScope( 1 )

   ? "Press any key to browse() with another index and scope"
   inkey(0)
   dbGoTop()
   clear
   browse(row()+1,1,row()+20,80)

   SET SCOPE TO            && Desativa ESCOPO


   DbGoBottom()
   if trava()
      alert('vou apagar o registro: ' + str(recno()))	  
      delete
      DbUnlock() 
   endif		 
	  
   DbGoBottom()

   alert( "Recno depois de deletar 3º registro: " + str(recno()) )
 
    ? "Pressione qualquer tecla para incluir um novo registro registro()"
   inkey(0)

   if inclui()
      Replace ID_EMPRESA with '0001'
      poecodigo({'ID_EMPRESA','CODE_ID'},5)
      replace DESCR    with dtoc( date() ) + " - " + time()
      Replace DAYS     with (RECORDS_IN_TEST - i)
      Replace DATE_LIM with date()
      Replace ENABLE   with .T.
      Replace OBS      with "This is a memo field. Seconds since midnight : " + alltrim(str(seconds()))
      DbCommit()
   endif
   
Return NIL


**************
func trava
**************

private tt
for tt=1 to 10
   if rlock()
      exit
   endif
   inkey(0.1)
next tt
if !rlock()
*   alert('Registro do arquivo: ' + dbf() + ';Bloqueado em outro terminal.. !')
   alert('Registro ' + if(UsaSgbd,'da Tabela: ','do Arquivo: ') + alias() + ';Esta Sendo Utilizado Em Outro Terminal,;' + ;
         'Libere o Registro para continuar...')

endif
return rlock()

***************
func inclui
***************

private ordem,tt
ordem = indexord()
for tt=1 to 10
   append blank 
   alert('Recno no append blank: ' + str(recno()))
   if !neterr()
      exit
   endif
   inkey(0.1)
next tt

if neterr()
   alert( if(UsaSgbd,'Tabela ',' Arquivo ')  + ' Bloqueado por Outro Usuario - NÆo e poss¡vel incluir registros !')
endif

return !neterr()

*******************
procedure PoeCodigo
*******************
local cCampoTemp
private cCampoAux

para campo,tama,OrdemPara,MemoriaPara

OrdemPara   = if(pcount()>2,OrdemPara,1)
MemoriaPara = if(pcount()>3,MemoriaPara,.t.)

cCampoAux = ''

if type('campo') = 'A'      && Aqui testa para verificar se tem mais de um campo a chave
   for xyz = 1 to len(campo) - 1
       cCampoTemp = campo[xyz]      
       cCampoAux += &cCampoTemp.
   next xyz
   campo = campo[len(campo)]
endif

m->registro = recno()
m->ordem    = indexord()
m->tama     = tama
set order to ordempara
alert('Recno do inclui: ' + str(recno()))
do while .t.
   DbGoBottom()
   ProvAux = strzero(val(&campo) + 1,m->tama)
   seek cCampoaux + ProvAux
   if found()
      if empty(&campo.)                      && Coloquei esse bloco de codigo para evitar o loop 
         IF trava()  &&rlock()                          && enterno quando o valor do registro era em branco.
            replace &campo. with ProvAux
         endif
      endif
      loop
   else 
      if CodigoUnico()
         exit
      endif
   endif
enddo
DbGoto( m->registro )
set order to m->ordem
return

********************
function codigounico
********************

DbGoto( m->registro )


if trava() && rlock()
   replace &campo. with ProvAux
endif   
DbCommit()

seek cCampoAux + ProvAux
* alert('Registro: ' + str(m->Registro) +';Recno: ' + str(recno()) )
if found() .and. m->registro = recno()
   return .t.
endif
return .f.


/*------------------------------------------------------------------------*/

#include "connect.prg"

/*------------------------------------------------------------------------*/

Obrigado

Anderson Camilo
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Erro no DbGoBottom() / SQLRDD

Mensagem por fladimir »

Anderson eu testei aki e não sei pq ocorre o problema... analisei via debug e não consegui entender tb... sou novato em sqlrdd infelizmente, desculpe...

Talvez o Leo consiga te ajudar ou outro colega... mas eu vou testar a noite com mais calma se tiver alguma novidade t falo.

[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
andersoncamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 103
Registrado em: 22 Ago 2004 11:54

Erro no DbGoBottom() / SQLRDD

Mensagem por andersoncamilo »

Bom dia

Pessoal consegui resolver o problema coma ajuda do Luiz Culik, da seguinte forma:

delete
commit
unlock
sr_dbrefresh() ou um dbgotop()


Obrigado pela ajuda de todos

Anderson Camilo
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Erro no DbGoBottom() / SQLRDD

Mensagem por fladimir »

Vlw Anderson por compartilhar, q bom q conseguistes... em q lugar do código vc colocou este trecho q mencionastes...

[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
andersoncamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 103
Registrado em: 22 Ago 2004 11:54

Erro no DbGoBottom() / SQLRDD

Mensagem por andersoncamilo »

Fladimir

O Luiz falou que sempre após um "delete" deve se usar um commit, e depois do unlock usar Sr_dbrefresh() ou um dbgotop().

Anderson Camilo
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Erro no DbGoBottom() / SQLRDD

Mensagem por fladimir »

Entendi... seria então tipo uma particularidade da ferramenta SQLRDD para trabalhar sem erros...

Obrigado por compartilhar conosco...

[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Erro no DbGoBottom() / SQLRDD

Mensagem por Mário Isa »

Bom dia.
Como estou procurando uma solução para tentar utilizaro mysql estou vindo aqui para algumas tentativas.
No código do andersoncamilo o que está tentando abrir ali ?
Um mysql ?
Um firebird ?
Um dbf ?
Com indices .CDX ???

Se eu criar um banco SQL eu consigo me conectar utilizando aqueles mesmos comandos ?

Obrigado.
Mário
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Erro no DbGoBottom() / SQLRDD

Mensagem por Pablo César »

Oi Mário, no HMG também você pode ver mysql e outros RDDs, veja em:

C:\hmg.3.1.1\SAMPLES\MYSQL.1
C:\hmg.3.1.1\SAMPLES\MYSQL.2
C:\hmg.3.1.1\SAMPLES\MYSQL.3
C:\hmg.3.1.1\SAMPLES\RDD.SQL\mysql
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Erro no DbGoBottom() / SQLRDD

Mensagem por Mário Isa »

mas vcs acham q usar o letodb seria menos penoso q o mysql ?
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Erro no DbGoBottom() / SQLRDD

Mensagem por Pablo César »

Na minha opinião, com certeza seria menos penoso. Mas em HMG ainda estão gatinhando com LETODB. O único tópico que fala sobre LETODB é: http://www.hmgforum.com/viewtopic.php?f ... 5&start=20. Eu não testei, mas acredito que é algo que vale a pena conhecer. A questão que em HMG precisa converter a LIB para .A

Neste artigo tem um utilitário que faz isso (também não testei).
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Erro no DbGoBottom() / SQLRDD

Mensagem por sygecom »

Mario,
O LetodDB, é uma ótima solução, até hoje tenho sistema rodando com ele, pequeno mais tenho.

O Mysql, tem uma particularidade nas licença de uso, fique esperto quanto a isso.

Qualquer coisa que optar que não seja o LetoDB na família dos SQL você pode usar o SQLRDD, mas pense bem antes de usar, você vira refém dele depois que se torna dependente dele, e para evoluir com outras possibilidade de compilador tem que sempre ver se o SQLRDD pode evoluir junto ou não.

Agora a melhor escolha que você vai fazer vai ser depois que você testar cada um desses, analisar todas seus problemas e ver qual deles supre todas suas necessidades, perco um tempo fazendo isso agora e nunca mais fique na duvida.

Particularmente, se eu tivesse que escolher hoje, eu partiria para PostgreSQL( lib da contrib ).
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Responder