GSAK a MFILTER Where=Name IN...

Chtěl bych si v makru GSAKu definovat MFILTER pomocí výčtu hodnot.
Funguje mě toto:


MFILTER Where=Name IN ('0110-1.0','0110-2.0' ) 

Chtěl bych si ale ten seznam pro IN generovat z více hodnot. Zkoušel jsem něco jako:


$s = "'0110-1.0','0110-2.0'"
MFILTER Where=Name IN ($s)

ale to mě nefunguje :frowning:
Neporadil by mě někdo, jak ten výčet hodnot do $s naplnit? Díky.

Treba…
$s = 10
$f = "+1"
MFILTER Where=Name IN ($s,$f )

OK, díky.
Ale já mám ten výčet hodnot dynamický a mívám v něm desítky hodnot.
Řešení ‘co hodnota, to jedna proměnná’ se moc nehodí :frowning:

Jak se dostaneš k tomu seznamu, podle kterého chceš filtrovat? Filtrovat s případně dá i podle části názvu nebo kódu

Jsem rád, že se rsc_cz chytil :wink: … za můj dotaz stejně může jen on…
Seznam načítám ze souboru lovim.ggt (GeoKuk). Ten jsem dosud přetavil do reg. výrazu (RE) a pak jsem použil něco jako:


  Where=g_regex( $all_lines, Name ) OR g_regex( $all_lines, Code )

Když jsem ale GSAK nakrmil trochu nestandardními WPT (např. typu Czech Geodetic Point), tak mě RE díky hladovosti, začal vybírat body navíc, které jsem v lovim.ggt neměl.

Napadlo mě tedy, že bych upravil WHERE tak, aby hledal opravdu podle přesných jmen/kodů WPT, tj. chtěl jsem použít to Where=Name IN.
Můj problém je ten, že nevím jak sestavit syntakticky správný řetězec, který by obsahoval více hodnot, a který by šel použit proto Where=Name IN ($s).
Možná jsem se na to IN příliš upnul, ale používám to na jiných platformách. Kdyby měl někdo jiný nápad, tak se zlobit nebudu :slight_smile:

Problem je, ze prikaz IN ( xx, yy) se vnitrne interpretuje jako seznam parametru oddelenych carkou. Kdyz to predavas v jedne promenne, tak je to stale jeden parametr, bez ohledu na jeho obsah.

Mozna bys to obesel cyklem, v kterem budes volat jen jednu promennou a pro dany vyber si nastavis $d_MacroFlag=TRUE a potom na konci vseho si nastavis Mfilter If=$d_MacroFlag

Cili chces vyfiltrovat jen body z ktere jsou v seznamu lovim.ggt ?

Ano, přesně tak.

tak si trochu uprav tohle…
$numGCcode=0
$numGCcodeDNF=0

#Nacti setting
$InputFile = $_Install + "\geoget\seznam.ggt"
IF FileExists($InputFile)
ELSE
pause Msg msg="Nenalezen soubor \geoget\seznam.ggt"
cancel
ENDIF

USERFLAG Type=Clear Range=All

IF $_Count = 0
MSGOK msg="Prazdny filtr databaze $_newline Exiting macro"
RETURN
ENDIF

FileRead File=$InputFile
If IsEmpty($line)
$blank = $blank + 1
EndIf
$GCcode=trim($line)
$numGCcode= $numGCcode + 1

mam nacteny GC kod, ted ho najit v SQL a nastavit priznak

MFILTER Expression=($d_CODE =$GCcode)
IF $_FilterCount>0
USERFLAG Type=SET Range=FILTER
ELSE
# pokud se nenalezl v databazi, vypsat
$numGCcodeDNF= $numGCcodeDNF + 1
Pause Msg="tento kod ze seznamu neni v databazi: $GCcode"
ENDIF
EndRead
CANCELFILTER
MFILTER Expression=(USERFLAG =true)

Hmmm, myslím, že bych tomu mohl porozumět :slight_smile:
Díky moc.

Funguje toto (je to i v online helpu GSAK pod heslem MFILTER):


$_sql = "code in ('GC251P0','GCX105')"
MFILTER where=$_sql

Jirka

Máš pravdu, v tom helpu jsem teď našel něco podobného:


$_sql = "name like '%hill%'"
Mfilter where=$_sql

Díky za radu