I have a prompt in Enterprise Guide where user adds document numbers.
I use these values in a query.
WHERE %_eg_WhereParam( t1.DSC_CPF_CNPJ_SANCIONADO, CPF, IN, TYPE=S, IS_EXPLICIT=0 )
The table I look up sometimes has the information "masked" so instead of having the information like 11122233344 I have ***222333**.
How can I change prompt values to do masked search?
What is it that you want to happen?
Do you want the user to enter ***222333** instead of 11122233344? Does the "prompt" allow that?
Do you want the user to enter 222333 and allow it to consider that a match for ***222333** or 11122233344 or 99922233388?
Do you want the user to enter 11122233344 and allow that to match either 11122233344 or ***222333**?
Do you have the definition of the macro you calling? From its name it looks like it is probably something that Enterprise Guide has created and submitted the source code to SAS to compile when you started your SAS session.
What is it that you want to happen?
Do you want the user to enter ***222333** instead of 11122233344? Does the "prompt" allow that?
Do you want the user to enter 222333 and allow it to consider that a match for ***222333** or 11122233344 or 99922233388?
Do you want the user to enter 11122233344 and allow that to match either 11122233344 or ***222333**?
Do you have the definition of the macro you calling? From its name it looks like it is probably something that Enterprise Guide has created and submitted the source code to SAS to compile when you started your SAS session.
"Do you want the user to enter ***222333** instead of 11122233344? Does the "prompt" allow that?"
This is the current solution. I wanted to avoid this and lessen the likelihood of errors.
Probably the easiest way would be to make a new variable in your source data which has only the middle 6 digits, and ask users to only enter the middle six digits as the prompt value.
The harder way would be to allow users to enter the full 11 digits, and have your code select select the middle 6 digits and use that for the WHERE subsetting. Selecting the middle 6 digits should be easy, but adapting %_eg_whereParam may be hard just cuz it's a lot of code. And I'm not sure if EG would even let you create your own version of the macro. If you're comfortable programming, you might be better off writing your own (simpler) macro to use on the WHERE statement.
If it helps, here's the definition of %_eg_whereParam that I see (it may evolve over versions):
%macro _eg_WhereParam( COLUMN, PARM, OPERATOR, TYPE=S, MATCHALL=_ALL_VALUES_, MATCHALL_CLAUSE=1, MAX= , IS_EXPLICIT=0, MATCH_CASE=1);
%local q1 q2 sq1 sq2;
%local isEmpty;
%local isEqual isNotEqual;
%local isIn isNotIn;
%local isString;
%local isBetween;
%let isEqual = ("%QUPCASE(&OPERATOR)" = "EQ" OR "&OPERATOR" = "=");
%let isNotEqual = ("%QUPCASE(&OPERATOR)" = "NE" OR "&OPERATOR" = "<>");
%let isIn = ("%QUPCASE(&OPERATOR)" = "IN");
%let isNotIn = ("%QUPCASE(&OPERATOR)" = "NOT IN");
%let isString = (%QUPCASE(&TYPE) eq S or %QUPCASE(&TYPE) eq STRING );
%if &isString %then
%do;
%if "&MATCH_CASE" eq "0" %then %do;
%let COLUMN = %str(UPPER%(&COLUMN%));
%end;
%let q1=%str(%");
%let q2=%str(%");
%let sq1=%str(%');
%let sq2=%str(%');
%end;
%else %if %QUPCASE(&TYPE) eq D or %QUPCASE(&TYPE) eq DATE %then
%do;
%let q1=%str(%");
%let q2=%str(%"d);
%let sq1=%str(%');
%let sq2=%str(%');
%end;
%else %if %QUPCASE(&TYPE) eq T or %QUPCASE(&TYPE) eq TIME %then
%do;
%let q1=%str(%");
%let q2=%str(%"t);
%let sq1=%str(%');
%let sq2=%str(%');
%end;
%else %if %QUPCASE(&TYPE) eq DT or %QUPCASE(&TYPE) eq DATETIME %then
%do;
%let q1=%str(%");
%let q2=%str(%"dt);
%let sq1=%str(%');
%let sq2=%str(%');
%end;
%else
%do;
%let q1=;
%let q2=;
%let sq1=;
%let sq2=;
%end;
%if "&PARM" = "" %then %let PARM=&COLUMN;
%let isBetween = ("%QUPCASE(&OPERATOR)"="BETWEEN" or "%QUPCASE(&OPERATOR)"="NOT BETWEEN");
%if "&MAX" = "" %then %do;
%let MAX = &parm._MAX;
%if &isBetween %then %let PARM = &parm._MIN;
%end;
%if not %symexist(&PARM) or (&isBetween and not %symexist(&MAX)) %then %do;
%if &IS_EXPLICIT=0 %then %do;
not &MATCHALL_CLAUSE
%end;
%else %do;
not 1=1
%end;
%end;
%else %if "%qupcase(&&&PARM)" = "%qupcase(&MATCHALL)" %then %do;
%if &IS_EXPLICIT=0 %then %do;
&MATCHALL_CLAUSE
%end;
%else %do;
1=1
%end;
%end;
%else %if (not %symexist(&PARM._count)) or &isBetween %then %do;
%let isEmpty = ("&&&PARM" = "");
%if (&isEqual AND &isEmpty AND &isString) %then
&COLUMN is null;
%else %if (&isNotEqual AND &isEmpty AND &isString) %then
&COLUMN is not null;
%else %do;
%if &IS_EXPLICIT=0 %then %do;
&COLUMN &OPERATOR
%if "&MATCH_CASE" eq "0" %then %do;
%unquote(&q1)%QUPCASE(&&&PARM)%unquote(&q2)
%end;
%else %do;
%unquote(&q1)&&&PARM%unquote(&q2)
%end;
%end;
%else %do;
&COLUMN &OPERATOR
%if "&MATCH_CASE" eq "0" %then %do;
%unquote(%nrstr(&sq1))%QUPCASE(&&&PARM)%unquote(%nrstr(&sq2))
%end;
%else %do;
%unquote(%nrstr(&sq1))&&&PARM%unquote(%nrstr(&sq2))
%end;
%end;
%if &isBetween %then
AND %unquote(&q1)&&&MAX%unquote(&q2);
%end;
%end;
%else
%do;
%local emptyList;
%let emptyList = %symexist(&PARM._count);
%if &emptyList %then %let emptyList = &&&PARM._count = 0;
%if (&emptyList) %then
%do;
%if (&isNotin) %then
1;
%else
0;
%end;
%else %if (&&&PARM._count = 1) %then
%do;
%let isEmpty = ("&&&PARM" = "");
%if (&isIn AND &isEmpty AND &isString) %then
&COLUMN is null;
%else %if (&isNotin AND &isEmpty AND &isString) %then
&COLUMN is not null;
%else %do;
%if &IS_EXPLICIT=0 %then %do;
%if "&MATCH_CASE" eq "0" %then %do;
&COLUMN &OPERATOR (%unquote(&q1)%QUPCASE(&&&PARM)%unquote(&q2))
%end;
%else %do;
&COLUMN &OPERATOR (%unquote(&q1)&&&PARM%unquote(&q2))
%end;
%end;
%else %do;
&COLUMN &OPERATOR (
%if "&MATCH_CASE" eq "0" %then %do;
%unquote(%nrstr(&sq1))%QUPCASE(&&&PARM)%unquote(%nrstr(&sq2)))
%end;
%else %do;
%unquote(%nrstr(&sq1))&&&PARM%unquote(%nrstr(&sq2)))
%end;
%end;
%end;
%end;
%else
%do;
%local addIsNull addIsNotNull addComma;
%let addIsNull = %eval(0);
%let addIsNotNull = %eval(0);
%let addComma = %eval(0);
(&COLUMN &OPERATOR (
%do i=1 %to &&&PARM._count;
%let isEmpty = ("&&&PARM&i" = "");
%if (&isString AND &isEmpty AND (&isIn OR &isNotIn)) %then
%do;
%if (&isIn) %then %let addIsNull = 1;
%else %let addIsNotNull = 1;
%end;
%else
%do;
%if &addComma %then %do;,%end;
%if &IS_EXPLICIT=0 %then %do;
%if "&MATCH_CASE" eq "0" %then %do;
%unquote(&q1)%QUPCASE(&&&PARM&i)%unquote(&q2)
%end;
%else %do;
%unquote(&q1)&&&PARM&i%unquote(&q2)
%end;
%end;
%else %do;
%if "&MATCH_CASE" eq "0" %then %do;
%unquote(%nrstr(&sq1))%QUPCASE(&&&PARM&i)%unquote(%nrstr(&sq2))
%end;
%else %do;
%unquote(%nrstr(&sq1))&&&PARM&i%unquote(%nrstr(&sq2))
%end;
%end;
%let addComma = %eval(1);
%end;
%end;)
%if &addIsNull %then OR &COLUMN is null;
%else %if &addIsNotNull %then AND &COLUMN is not null;
%do;)
%end;
%end;
%end;
%mend _eg_WhereParam;
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.