Adicionar/Modificar campos de pesquisa automática
Nota: o tópico abaixo aplica-se apenas a relatórios personalizados (não aos relatórios padrão que utilizam o modo «Design»)
Os valores predefinidos dos campos do pipeline de dados do AutoSearch podem ser configurados através do código do separador «Calc». Para tal, certifique-se primeiro de que o campo está configurado com AutoSearch = True no separador Dados; em seguida, aceda ao separador Cálculo, selecione o objeto Relatório de nível superior na árvore de estrutura e crie um evento em ReportBeforeAutoSearchDialogCreate. Segue-se um exemplo de código, seguido de uma explicação:
var
ppTemp : TppAutoSearchField;
begin
ppTemp := Report.AutoSearchCriteriaByName('EVENTS', 'COMPANY');
if ppTemp <> nil then
begin
ppTemp.SearchExpression := 'ABC COMPANY';
end;
se ReplaceSpecialFields('!PROFILE!') = 'Administrador do sistema' then
begin
ppTemp := Report.AutoSearchCriteriaByName('EVENTS', 'DEPARTMENT');
if ppTemp <> nil then
begin
ppTemp.SearchOperator := soInList;
ppTemp.SearchExpression := 'DEPT1,DEPT2,DEPT3';
end;
end;
ppTemp := Report.AutoSearchCriteriaByName('EVENTS', 'EVENT_DATE');
if ppTemp <> nil then
begin
ppTemp.SearchExpression := DateToStr(CurrentDate - 7) + ',' + DateToStr(CurrentDate);
end;
end;
O código acima pressupõe que existem três campos configurados como campos de pesquisa automática no separador «Dados» do pipeline da tabela EVENTS: COMPANY, DEPARTMENT e EVENT_DATE. Este código define novos valores predefinidos para os três campos da Pesquisa Automática. A primeira secção do código procura um campo de pesquisa automática existente no pipeline «EVENTS» denominado «COMPANY». O valor é então definido como «ABC COMPANY». É verdade que, neste caso, o valor «ABC COMPANY» poderia ter sido definido como predefinido diretamente no separador «Dados». No entanto, muitas vezes é útil definir um valor «padrão» para os campos de pesquisa automática no separador «Dados», de modo a garantir ao utilizador que quaisquer chamadas iniciais para ativar este pipeline ANTES da caixa de diálogo de pesquisa automática não irão devolver muitos (ou quaisquer) registos. Portanto, o separador «Calc» é um bom local para garantir que o valor predefinido é reposto para um valor adequado.
Na segunda secção do código, o campo «DEPARTAMENTO» é alterado em relação ao seu valor de filtro predefinido, mas apenas quando o relatório é executado por um «Administrador do Sistema». O valor de filtro predefinido para «DEPARTAMENTO», tal como configurado no separador «Dados», é «= DEPT3». Esta é normalmente uma boa opção predefinida, mas se for um «administrador de sistemas» a gerar o relatório, este terá geralmente de apresentar dados relativos a vários departamentos ao mesmo tempo, pelo que a opção predefinida deveria ser a inclusão dos três. Note, portanto, que, em primeiro lugar, o SearchOperator foi alterado para soInList (em vez da configuração padrão soEqual [=] definida no separador «Dados»). É raro ter de alterar o SearchOperator no código do separador «Calc», mas, se for necessário, estes são os valores aceitáveis:
soEqual = O valor do campo deve ser igual ao valor da pesquisa.
soNotEqual = O valor do campo não pode ser igual ao valor da pesquisa.
soLessThan = O valor do campo deve ser inferior ao valor de pesquisa.
soLessThanOrEqualTo = O valor do campo deve ser menor ou igual ao valor de pesquisa.
soGreaterThan = O valor do campo deve ser superior ao valor de pesquisa.
soGreaterThanOrEqualTo = O valor do campo deve ser maior ou igual ao valor de pesquisa.
soLike = O valor do campo deve começar com o valor da pesquisa. É automaticamente inserido um curinga no final do valor do critério de pesquisa que utilize este operador, fazendo com que funcione como um «começa por».
soNotLike = O valor do campo não deve começar pelo valor da pesquisa.
soBetween = O valor do campo deve situar-se entre os dois valores dos critérios de pesquisa.
soNotBetween = O valor do campo não deve situar-se entre os dois valores dos critérios de pesquisa.
soInList = O valor do campo deve constar na lista de valores de pesquisa.
soNotInList = O valor do campo não deve constar na lista de valores de pesquisa.
soBlank = O valor do campo deve ser nulo. (Não é necessário introduzir nenhum valor de pesquisa para este operador.)
soNotBlank = O valor do campo não pode ser nulo. (Não é necessário introduzir nenhum valor de pesquisa para este operador.)
Em seguida, neste segundo exemplo, a SearchExpression é definida como «DEPT1, DEPT2, DEPT3». Uma vez que o SearchOperator é agora «soInList», o SearchExpression aceita uma lista de valores separados por vírgulas.
Por fim, definimos dinamicamente as duas datas para um intervalo de datas. Ao definir o valor do filtro predefinido no separador «Dados», é pouco comum/improvável que os utilizadores saibam quais são as melhores datas predefinidas, uma vez que, normalmente, essas datas são relativas à data em que o relatório é executado. Este exemplo pressupõe que o campo EVENT_DATE está configurado como «Between» ['Between'] no separador «Dados». Assim, neste caso, a SearchExpression também exigirá uma lista das duas datas, separadas por vírgulas: a data «de» e a data «até». Utilize a função DateToStr para converter datas em valores de cadeia de caracteres (texto). Consulte a janela «Code Toolbox» (canto inferior direito)... na secção «Language» para se lembrar de outras funções úteis, como a CurrentDate.
Segue-se um segundo exemplo que define por predefinição o campo EVENT_DATE para todos os eventos do mês atual:
var
, ppTemp : TppAutoSearchField;
iYear, iMonth, iDay, iToYear, iToMonth : Integer;
begin
ppTemp := Report.AutoSearchCriteriaByName('EVENTEQUIP', 'EVENT_DATE');
if ppTemp <> nil then
begin
DecodeDate(CurrentDate, iYear, iMonth, iDay);
if iMonth = 12 then
begin
iToMonth := 1;
iToYear := iYear + 1;
end else
begin
iToMonth := iMonth + 1;
iToYear := iYear;
end;
ppTemp.SearchExpression := DateToStr(EncodeDate(iYear, iMonth, 1)) + ',' +
DateToStr(EncodeDate(iToYear, iToMonth, 1));
end;
end;
Também é possível criar critérios de pesquisa automática totalmente novos no código do separador «Calc» (em vez de se limitar a modificar os valores dos campos de pesquisa automática existentes). Segue-se um exemplo que permite adicionar novos critérios ou modificar os critérios existentes, conforme o caso:
ppTemp := Report.AutoSearchCriteriaByName('EVENTS', 'COMPANY');
if ppTemp = nil then
Report.CreateAutoSearchCriteria('EVENTS', 'COMPANY', soEqual, 'ABC COMPANY', False)else
ppTemp.SearchExpression := 'ABC COMPANY';
O procedimento Report.CreateAutoSearchCriteria aceita cinco parâmetros:
1.nome do pipeline
e 2.nome do campo (omita quaisquer prefixos de tabela, como «GAGES.» ou «EVENTS.», etc.)
3.o tipo de comparação - consulte a lista acima para conhecer os valores possíveis
4.valor padrão para o filtro AutoSearch; é aceitável que os campos de texto fiquem em branco
5.se o filtro AutoSearch é obrigatório - introduza «True» ou «False»
Nota: Se for possível utilizar o código do separador «Calc» para definir os valores de todos os campos da Pesquisa Automática na íntegra e tiver a certeza de que os utilizadores finais não precisarão de os alterar na caixa de diálogo da Pesquisa Automática (ou não devem ter permissão para os alterar), então é possível desativar essa caixa de diálogo da Pesquisa Automática imediatamente antes de ela ser chamada. Basta adicionar a linha de código abaixo em algum ponto do evento ReportBeforeAutoSearchDialogCreate mencionado acima:
Report.ShowAutoSearchDialog := False; |