Ir para o conteúdo principal

PEX - Preencher grade com informações de um SELECT (varias linhas)

Em alguns casos, é necessário retornar dados de uma consulta SQL em uma grade de dados na mesma tela que o filtro é acionado. Neste caso, podemos fazer um evento PEX ao sair de um campo (ex: botão) para fazer um SELECT e jogar o resultado em uma grade de dados, linha por linha.

Clique aqui para baixar o processo deste exemplo

Neste exemplo, temos a opção de consultar pedidos de um vendedor selecionado. Ao selecionar o vendedor em um campo vinculado à um conector FK, e clicar em Buscar, estes pedidos aparecerão na grade de dados.

image-1649106853361.gif

Antes de tudo, vamos criar a FK que irá trazer os vendedores para o usuário selecionar. Para isso, utilize o seguinte comando SQL para criar uma VIEW: 

CREATE OR REPLACE VIEW REPRE_PEDIDO AS 
SELECT UPPER(CLI.RAZAO) AS RAZAO,
       PEDIDO.IDVENDREPRE
  FROM PEDIDO
  JOIN CLIFOREMP CLI ON CLI.IDCLIFOREMP = PEDIDO.IDCLIFOREMP

** Lembrando que, neste exemplo, foi utilizado uma base que continham muitos registros de ERP, dados nas tabelas de pedidos e cliforemp. Caso você não tenha uma base assim, mude o SQL para trazer ouros dados existentes. 

Em seguida acesse o módulo de Processos > Conectores > Novo [F2] 

image-1649160686693.png

Ao criar um novo conector, escolha o tipo "Foreing Key" e faça conforme na imagem abaixo:

image-1649160959719.png

Depois de criado, basta dar um OK para salvar as informações e vamos para a criação do procedimento. Acesse o módulo de processos novamente > Processos de negócio (BPM) > Novo[F2]

Coloque as informações do novo procedimento e vamos para a criação dos formulários.

  • Dissertativa - /*IDVENDEDOR*/ (inteiro) 

Neste campo iremos adicionar a FK criada para selecionar os vendedores. Na aba "propriedades" desse campo, procure pelo título que colocamos VENDEDOR. Lembrando que, o sistema automaticamente coloca o prefixo "FK" antes da descrição: 

image-1649164236454.png

  • Botão com descrição "Buscar". 
  • Grade de dados com descrição "Pedidos". - /*GRADEPEDIDOS*/

Faça como na imagem abaixo, criando as colunas de acordo: 

image-1649165007525.png

Depois de criado, salve as alterações e o processo. 

Agora, vamos adicionar o evento PEX ao sair do botão "Buscar"

const
  cs_vendedor = '1'; // código do formulário fk
  cs_grade = '3';    // código do formulário de grade
var
  locds : TLibCDS;
  lsSQL : string;
  liVendedor, liIdRegistro: Integer;
  loNovoRegistro: TJSONObject;
begin
    for liIdRegistro:= Pred(aoFormularios.GetJSON(cs_grade).GetArrayJSON('DADOS').Count) downto 0 do 
      begin          
      aoFormularios.GetJSON(cs_grade).GetArrayJSON('DADOS').Remove(liIdRegistro);
      end;
  liVendedor := aoFormularios.GetJSON(cs_vendedor).GetInt('TEXTO');
   
    if liVendedor > 0 then
      begin
      lsSQL := 'SELECT ''N'' AS SELECAO, PEDIDO.IDPEDIDO, UPPER(CLI.RAZAO) AS RAZAO, PEDIDO.VALORTOTALCALCULADO TOTAL '+ 
                 'FROM PEDIDO JOIN CLIFOREMP CLI ON (CLI.IDCLIFOREMP = PEDIDO.IDCLIFOREMP) '+
                'WHERE PEDIDO.DATA >= ''2019-05-01'' AND PEDIDO.DATA <= ''2022-04-04'' '+
                  'AND PEDIDO.STATUS IN (1)  AND PEDIDO.SITUACAO IN (2) AND PEDIDO.IDVENDREPRE = '+ IntToStr(liVendedor); 
      loCDS := of_CriaCDSporSQL(lsSQL); 
    try 
     if locds.of_TemDados() then 
       begin 
             loCDS.of_IniciaWhile; 
          try 
              loCDS.of_Primeiro; 
            while not loCDS.of_FimDS do
             begin 
             loNovoRegistro := TJSONObject.Create;
             loNovoRegistro.AddPair('SELECAO', locds.GetBol(['SELECAO']));
             loNovoRegistro.AddPair('IDPEDIDO', locds.GetInt(['IDPEDIDO']));
             loNovoRegistro.AddPair('RAZAO', locds.GetStr(['RAZAO']));
             loNovoRegistro.AddPair('TOTAL', Currtostr(locds.GetCurr(['TOTAL'])));
             aoFormularios.GetJSON(cs_grade).GetArrayJSON('DADOS').Add(loNovoRegistro); 
             loCDS.of_ProxReg;
             end; 
          finally 
          loCDS.of_FinalizaWhile; 
       end; 
       end; 
    finally
    loCDS.Free; 
    end; 
    end 
    else
    begin
     aoMensagem.SetStr('MENSAGEM', 'Favor informar um vendedor.');
     aoMensagem.SetStr('TIPO', 'ERRO'); 
     aoMensagem.SetInt('TIMEOUT', 5000);
     aoMensagem.SetInt('FOCO', StrToInt(cs_vendedor));
end; 
end;

** No SQL colocamos uma condicional de data, pois em nossa base existiam muitos registros, então foi adicionado no WHERE para filtrar a consulta e trazer as informações mais rápidas. 

Caso queria se conectar em outras bases  o comando  loCDS := of_CriaCDSporSQL(lsSQL);  basta informar colocando uma virgula ao lado do lsSQL o código do conector que faz a conexão com a outra base.

  • Exemplo :  loCDS := of_CriaCDSporSQL(lsSQL,32);