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()