Ir para o conteúdo principal

Grade - Incluir e remover linhas via PEX

Olá, neste tópico iremos apresentar como gerar e modificar uma grade dinamicamente utilizando PEX.

Serão abordados a inserção de novas linhas na grade, remoção de um índice e reorganização dos índices.
Vamos criar um processo de exemplo, contendo uma atividade onde iremos adicionar uma grade de dados, dois botões (Adicionar e Remover) e um campo para informarmos a quantidade (este campo será usado para inserir "x" linhas na grade ou remover a linha de índice "x").

Com o processo e a atividade devidamente criados, vamos criar os formulários, para este exemplo serão necessários 4 formulários:

  1.  Grade de Dados
  2.  Botão (Adicionar)
  3.  Dissertativa (N°/Índice)
  4.  Botão (Remover) 

image-1640616915882.png

Com os formulários devidamente criados, iremos configurar seus eventos.

Botão Adicionar, este botão será o responsável por inserir novas linhas na nossa grade de dados, para isso é validados a quantidade de linhas atuais da grade e os índices que serão atribuídos a ela.

const 
cs_grade = '1';
cs_Qtd = '3' ;
var
  liIdRegistro: Integer;
  loRegistro: TJSONObject;
  loNovoRegistro : TJSONObject;
  liSequencia : Integer;
  liQtd : Integer;
  liQtdAtual : Integer;
  liQtdFinal : Integer;
begin
     //Define a quantidade informado no campo "N°"
     liQtd := StrToInt(aoFormularios.GetJSON(cs_Qtd).GetStr('TEXTO'));
     
     //Define a quantidade de linhas presentes atualmente na grade
     liQtdAtual := aoFormularios.GetJSON(cs_grade).GetArrayJSON('DADOS').Count;
     
     //Verifica se a grade já possui linhas adicionados 
     if (liQtdAtual > 0) then
     begin
       //Define qual será o último indices (considerando o indice atual + o número de linhas informados para adicionar)
       liQtdFinal := liQtdAtual + liQtd;
       //Percorremos a lista até o indice final
       for liSequencia := liQtdAtual+1 to liQtdFinal do
       begin
       //Criamos e adicionamos uma nova linha na grade de dados
        loNovoRegistro := TJSONObject.Create;
        loNovoRegistro.AddPair('REGISTROS', liSequencia);
        loNovoRegistro.AddPair('NOME', '');
        loNovoRegistro.AddPair('DATA', Date);
        loNovoRegistro.AddPair('CIDADE', '');
        aoFormularios.GetJSON(cs_grade).GetArrayJSON('DADOS').Add(loNovoRegistro);
       end;          
     end
     else 
     begin
     //Percorremos a lista até o indice final
     for liSequencia:= 1 to liQtd do
      begin
      //Criamos e adicionamos uma nova linha na grade de dados
       loNovoRegistro := TJSONObject.Create;
       loNovoRegistro.AddPair('REGISTROS', liSequencia);
       loNovoRegistro.AddPair('NOME', '');
       loNovoRegistro.AddPair('DATA', Date);
       loNovoRegistro.AddPair('CIDADE', '');
       aoFormularios.GetJSON(cs_grade).GetArrayJSON('DADOS').Add(loNovoRegistro);
      end
     end; 
end;

Botão Remover, este botão será o responsável por remover o índice informado pelo usuário e reorganizar os índices da grade, garantindo que não ficarão "furos" na indexação da grade.

const 
  cs_grade = '1';
  cs_n = '3';
var 
  liIdRegistro: Integer;
  loRegistro: TJSONObject;
  loNovoRegistro : TJSONObject;
  liRemover : Integer;
  liQtd: Integer;
  liI : Integer;
begin
  //Define a quantidade informado no campo "N°"
  liQtd := aoFormularios.GetJSON(cs_grade).GetArrayJSON('DADOS').Count ;
  //Define o indice que será remover
  liRemover := StrToInt(aoFormularios.GetJSON(cs_n).GetStr('TEXTO'));
  //Percorre toda a grade
  for liI := 0 to liQtd do
  begin
    //Verifica se o indice atual da repetição é igual ao indice informado para remoção
    if liI = liRemover then
    begin
       //Remove a linha presente no indice informado
       aoFormularios.GetJSON(cs_grade).GetArrayJSON('DADOS').Remove(liRemover-1);
    end
  end;
  //Percorre a grade partindo do indice 0 até o maior indice da grade
  for liIdRegistro := 0 to Pred(aoFormularios.GetJSON(cs_grade).GetArrayJSON('DADOS').Count) do
  begin
    //Atribui a linha presente no indice atual para a variavel loRegistro
    loRegistro := aoFormularios.GetJSON(cs_grade).GetArrayJSON('DADOS').GetItemAsJson(liIdRegistro);
    //Define o novo indice da linha 
    loRegistro.SetInt('REGISTROS', liIdRegistro+1);
  end; 
end;

Demonstração: 

image-1640617020645.gif

Versão Homologada: 12.15+