Página 1 de 1

Deleção de registro tbrowse c/array

Enviado: 09 Mai 2005 19:12
por MARCELOG
Olá amigos,

o negócio é o seguinte:

consegui fazer uma tbrowse com base em array multdimensional.

Entretanto, para manipular o objeto, especialmente deletar algum registro, não sei como obter o seu número para utilizar ADEL().

É lógico que já fiz teste com números fixos, e também criei uma coluna com número sequencial.

Mas para evitar erro, após a utilização da função ADEL(), é preciso ASIZE() para corrigir o tamanho da array.

Assim, a coluna criada perde a eficácia, pois ao usar ADEL(), ou deletei o registro ? e os demais foram "puxados" para esquerda.

Logo, se a array tinha 5 itens e eu apaguei o 3º, ela continua tendo 5 itens, mas o número 4 da minha coluna sequencial agora é o terceiro item, e o número 5 um registro NIL. Ex:
antes de ADEL(x,3)
{A1,A2,A3,A4,A5}
1 2 3 4 5

Depois de ADEL(x,3)

{A1,A2,A4,A5,NIL}
1 2 4 5

Se der um ADEL(x,CampoSequencial4), o item excluído será A5 e não A4, que agora é A3.

Espero ter sido claro.

Alguém tem uma dica para me dar.

Obrigado.

MGS

Enviado: 09 Mai 2005 20:11
por janio
Prezado MarceloG,

Passei por um problema semelhante ao seu e não sei se a minha solução serve pra vc tbem...

Esse negócio de ficar alterando tamanho de array dá uma dor de cabeça danada... então o que eu fiz...

No meu caso eu precisei desse negócio pra cancelar os produtos de uma venda... em vez de eu ficar excluindo da array aquele produto que eu cancelava... eu achei melhor acrescentar mais uma coluna na minha matriz pra dizer se o produto estava CANCELADO (S) ou NAO (N)...

Então, se eu precisar excluir um produto da venda, por exemplo, em vez de eu excluir aquele produto da matriz... e ficar mudando tamanho de matriz... etc... etc... simplemeste acrescento que aquele item da matriz é cancelado com um FLAG (S)...

aí na hora de passar pro banco de dados... eu só passo os que não estão com o flag de cancelado... a minha manipulação com os itens da array sempre levará em consideração o seu flag...

Pra saber a posição do item na matriz, vc pode continuar usando o numero sequencial que já faz uso...

Espero que tenha sido claro...

um abraço,

Janio

Enviado: 10 Mai 2005 08:56
por Grings
.

Enviado: 10 Mai 2005 18:04
por MARCELOG
Consegui!

E esta vitória não pode ficar no fundo baú.

JÂNIO, isto pode te interessar.

Primeiro o crio a array.
Alimento a mesma com os dados que eu quero.
Se inexistir nenhum dado, acrescento o dado (ou array) vazio (NIL).
Crio o Tbrowse com a array.
Antes do While, crio uma variável com valor 1 (para o primeiro elemento).
A medida que me movo pelo tBrowse, vou modificando essa variável, ou seja:
ao verificar no teclado K_UP, a variável criada é diminuída em 1
ao verificar no teclado K_PGUP, a variável criada é diminuída em RowCount() - o tamanho da janela, sendo que, se o resultado apresentar número menor ou igual a 0, a variável passa a ter o número 1.
Isso se dá porque HitTop() foi encontrada.
O inverso é fácil, basta apenas somar os valores ao invés de diminuir, sendo que, se o valor obtido for maior que o tamanho da array (LEN(array), a variável passa a ter este valor.
Assim:

Adel(array,variável)
Asize(array,Len(array)-1)
obj:refreshall() / obj:refreshcurrent()

funciona perfeitamente.

Dúvida:

Não sei porque não é possível criar rotina genérica para cria um tbrowse com array?