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.
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]
Ao criar um novo conector, escolha o tipo "Foreing Key" e faça conforme na imagem abaixo:
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:
- 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:
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);