Página 1 de 1

Posicionamento quando apaga registro indexado

Enviado: 24 Mai 2016 14:20
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

Posicionamento quando apaga registro indexado

Enviado: 24 Mai 2016 14:51
por JoséQuintas
Talvez após excluir, um SKIP, e invalidar todo tbrowse para que seja redesenhado por completo.

Posicionamento quando apaga registro indexado

Enviado: 24 Mai 2016 16:12
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

Posicionamento quando apaga registro indexado

Enviado: 24 Mai 2016 17:44
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()

Posicionamento quando apaga registro indexado

Enviado: 25 Mai 2016 09:43
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

Posicionamento quando apaga registro indexado

Enviado: 25 Mai 2016 10:54
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()