Estava lendo um blog outro dia e vi novamente sobre usar um método Edit em um datasource para marcar ou não um registro em uma grid, sem ter a necessidade de alterar a tabela e criar um campo só para esta seleção.

No entanto, isso é um pouco chato na primeira vez que se vai fazer, por questões de escopo (acredito eu), no meu caso se complicou mais e tive que usar o modelo abaixo, já que queria preencher um MAP com os recids que estavam marcados.

A solução:

Form: É um formulário simples, onde eu listo os itens da InventTable.

No método classdeclaration:

1
2
3
4
public class FormRun extends ObjectRun
{
    Map     myMap;
}

No DataSource InventTable eu criei o seguinte método:

1
2
3
4
5
6
7
8
edit NoYes markInvent(
    boolean         _set,
    InventTable     _invent,
    NoYes           _mark
    )
{
    return element.inventMark(_set, _invent, _mark);
}

De volta ao form, eu criei os outros dois métodos que me faltavam:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public void initMyMap()
{
    myMap = new Map(Types::Int64, Types::Int64);
}
 
edit NoYes inventMark(
    boolean         _set,
    InventTable     _invent,
    NoYes           _mark
    )
{
    NoYes   click;
    ;
 
    if(!myMap)
        element.initMyMap();
 
 
    if (_set)
    {
        if (_mark)
        {
            myMap.insert(_invent.RecId,_invent.RecId);
            click = NoYes::Yes;
        }
        else
        {
            if (myMap.exists(_invent.RecId))
                myMap.remove(_invent.RecId);
 
            click = NoYes::No;
        }
    }
    else
        click = myMap.exists(_invent.RecId);
 
    return click;
}

Explicação:

No class declaration eu declaro o meu map;
No DataSource eu crio o método e associo esse metodo a um checkbox que coloquei na minha grid;
Quando clico no checkbox, chamo o método markInvent e envio os parametros: set = true, _invent = registro atual, _mark = sim ou não;
O método markInvent por sua vez apenas chama o inventMark que irá fazer o processamento necessário e retornar um sim ou não;
Este último método apenas verifica qual o valor passado em mark, se sim, adiciona o valor ao map, se não remove o valor.

Obs.: O único motivo de eu chamar um método do formulário ao invés de executar tudo no primeiro edit é que se eu faço no datasource ele não atualizava meu MAP, eu acredito que por uma questão de escopo, mas não posso afirmar.

[]s
Pichler