Posicionamento quando apaga registro indexado

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Posicionamento quando apaga registro indexado

Mensagem por rubens »

Boa tarde...

Alguém pode postar um exemplo de como faz para posicionar a linha do browse no próximo item quando apaga um registro indexado?

Quando não está indexado e apaga um registro é normal, vai para o próximo, mas quando tá indexado o controle fica doido e normalmente para no ultimo registro.

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Posicionamento quando apaga registro indexado

Mensagem por JoséQuintas »

Talvez após excluir, um SKIP, e invalidar todo tbrowse para que seja redesenhado por completo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Posicionamento quando apaga registro indexado

Mensagem por rubens »

Eh eu pensei em fazer o seguinte

Código: Selecionar todos

se !eof()
    dar um dbskip()
    armazenar o recno()  em proximoregistro
    voltar registro anterior dbskip(-1)
se eof()
   voltar 1 registro dbskip(-1) 
   armazenar o recno()  em proximoregistro
   dbskip()
fim se
apagar registro
depois de apagar, dar um dbgoto( proximoregistro)
É mais ou menos isso que vocês fazem ?

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Posicionamento quando apaga registro indexado

Mensagem por alxsts »

Olá!

Veja se o código abaixo resolve o teu caso:

Código: Selecionar todos

      dbDelete()
      
      while deleted() .and. !oBrowse:hitTop()
         oBrowse:up():forceStable()
      enddo
      
      oBrowse:refreshAll():forceStable()
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Posicionamento quando apaga registro indexado

Mensagem por rubens »

Alxsts

Não entendi muito bem a lógica aí mas coloquei no código e não adiantou. Quando apago um registro o browse continua indo para o ultimo registro do arquivo.

AS linhas com * eh como eu uso, acrescentei os seus comandos no lugar delas...

Código: Selecionar todos

   IF lAPAGA
		BEEP()
      IF ALERT("Tem certeza que deseja apagar o registro ?",{'Sim','Nao'})==1
      	BEEP()
      	IF ALERT("Pergunto novamente; Tem certeza que deseja apagar o registro ?",{'Sim','Nao'})==1
			   MOSTRA("TENTANDO APAGAR REGISTRO !!!")
	         WHILE(.T.)
	            IF RECLOCK()
	               DELREC()
	               DBUnlock()
	               EXIT
	            ENDIF
	         ENDDO
         ENDIF
      ENDIF

   ENDIF
ELSE
   BEEP() ; MENSAGEM("Voce nao esta autorizado a executar esta operacao...")
ENDIF

IF ALIAS()="CP"
   nTOTAL := TOTALCP()
ENDIF

while deleted() .and. !oTab:hitTop()
	oTab:up():forceStable()
enddo
oTab:refreshAll():forceStable()


NIVEL := cNIVEL
*oTab:RIGHT() 
*oTab:LEFT() 
*oTab:REFRESHALL()
*DO WHILE ! oTab:stabilize() 
*ENDDO
Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
dbsh
Usuário Nível 3
Usuário Nível 3
Mensagens: 128
Registrado em: 14 Jul 2004 14:19
Localização: ES

Posicionamento quando apaga registro indexado

Mensagem por dbsh »

Atualmente meu browse esta assim
Este fragmento de código é só uma orientação, você tem que adaptar no seu sistema

Código: Selecionar todos

   //coloca onde vc testa as teclas digitadas
    CASE ( nKey == K_DEL ) .and. !noappend
        IF ( !Eof() )
            IF ( DELETED() )
                IF AlertaSN( 'Confirma desmarcar registro marcado para Excluçao' ) = 1
                    IF RecLock()
                        EVAL( delete )
                        RECALL
                        oB:refreshAll()
                        WHILE ( !oB:stabilize() )
                        END
                        AtuaRel := .t. //caso tenha browse filho, relacionado
                    ENDIF
                ENDIF
            ELSEIF AlertaSN( 'Excluir Registro Corrente do Sistema' ) = 1
                IF RecLock() .and. (Delete = NIL .or. EVAL( DELETE ) //executa Code Block antes se excluir
                    DELETE
                    IF SET( 11 )
                        Skipped( -1, lAppend, cRel )
                    END
                    Refresh -= ( nRefresh - 1 ) //força variavel de tempo, deixar atualizar antes do tempo configurado
                    AtuaRel := .t.   //força browse filho atualizar caso tenha browse relacionado
                ENDIF
            ENDIF
            UNLOCK
        ENDIF

STATIC FUNCTION Skipped( nRequest, lAppend, cRel )

LOCAL nCount

nCount := 0
IF ( RecCount() != 0 )
    IF ( nRequest == 0 )
        SKIP 0
        IF !EOF()
            IF INDEXORD() > 0 .and. cRel # NIL //verifica relacionamento, caso seja um browse filho
                IF &( INDEXKEY() ) < cRel
                    GoTopSeek( cRel )
                ENDIF
                IF &( INDEXKEY() ) > cRel
                    GoBottomSeek( cRel )
                ENDIF
            ENDIF
        ENDIF
    ELSEIF ( nRequest > 0 .and. !Eof() )
        // forward
        WHILE ( nCount < nRequest )
            SKIP 1
            IF ( EOF() )
                IF ( lAppend )
                    // eof record allowed if append mode
                    nCount ++
                ELSE
                    // back to last actual record
                    SKIP - 1
                END

                EXIT
            ELSEIF INDEXORD() > 0 .and. cRel # NIL .and. &( INDEXKEY() ) > cRel
                GoBottomSeek()          //Skip -1
                EXIT
            ENDIF

            nCount ++
        END

    ELSEIF ( nRequest < 0 )
        // backward
        WHILE ( nCount > nRequest )
            SKIP - 1
            IF ( BOF() )
                EXIT
            END
            IF INDEXORD() > 0 .and. cRel # NIL
                IF &( INDEXKEY() ) > cRel
                    GoBottomSeek()
                ENDIF
                IF &( INDEXKEY() ) < cRel
                    SKIP 1
                    EXIT
                ENDIF
            ENDIF
            nCount --
        END
    END
END

RETURN ( nCount )

STATIC FUNCTION GoTopSeek( cRel )

IF INDEXORD() = 0 .or. cRel = NIL
    GO TOP
ELSE
    SEEK cRel Soft
ENDIF

RETU !EOF()


STATIC FUNCTION GoBottomSeek( cRel )

IF INDEXORD() = 0 .or. cRel = NIL
    GO BOTTOM
ELSE
    SEEK LEFT( cRel, LEN( cRel ) - 1 ) + CHR( ASC( RIGHT( cRel, 1 ) ) + 1 ) soft
    SKIP - 1
ENDIF

RETU !EOF()




010011110010000001110011011101010110001101100101011100110111001101101111001000001110100100100000011000110110111101101110011100110111010001110010011101011110110101100100011011110010000001100001001000000110111001101111011010010111010001100101
01001101011000010111001001100011011011110111001100100000010000010110111001110100011011110110111001101001011011110010000001000100011001010010000001000010011011110110111001101001
0101010001100101011011000011101000100000001010000011001000110111001010010011100100101101001110010011100000110100001100110010110100110101001100100011100100110000
Responder