I' m trying to prepare a query based on information that is stored in an XML-file.
The following code runs without problems:
prepare_query(QueryFile, Q_Name, Statement) :-
load_structure(QueryFile, QueryXML, [dialect(xml), space(remove)]),
getDNS( QueryXML, Q_Name, DNS),
getSelect(QueryXML, Q_Name, Select),
getParameter(QueryXML, Q_Name, Parameters),
% getResultNames(QueryXML, Q_Name, ResultNames),
odbc_prepare(DNS, Select, Parameters, Statement,
[ findall((Apl_id_n, Apl_id_b), row(Apl_id_n, Apl_id_b)) ]).
getDNS(QueryXML, Term, DNS) :-
xpath(QueryXML, //query(@name=Term), Query),
xpath(Query, //dns(@name=DNS_Name), _),
odbc_connect(DNS_Name, DNS, [alias(DNS_Name)]).
getSelect(QueryXML, Term, Select) :-
xpath(QueryXML, //query(@name=Term)/select(text), Select).
getParameter(QueryXML, Term, Parameters) :-
xpath(QueryXML, //query(@name=Term)/parameter_type, P_Type),
findall(Par, xpath(P_Type, //parameter(text), Par), Parameters).
getResultNames(QueryXML, Term, ResultNames) :-
xpath(QueryXML, //query(@name=Term)/result, Res),
findall(Result, xpath(Res, //column/name(text), Result), Results),
maplist(firstCharUp, Results, ResultNamesList),
atomic_list_concat(ResultNamesList, ', ',ResultNames) .
Name and type from the selected fields are stored in the XML-file.
The predicate getResultNames
returns these names (in this case apl_id_n and apl_id_b) as an atom 'Apl_id_n, Apl_id_b
' so I understand why the following code
FindAllOption =.. [findall,(ResultNames),row(ResultNames)], writeln(FindAllOption)
returns:
findall(Apl_id_n, Apl_id_b,row(Apl_id_n, Apl_id_b))
Is it possible to split up ResultNames
in the separated terms and to add the extra parentheses so FindAllOption
is created as:
findall((Apl_id_n, Apl_id_b),row(Apl_id_n, Apl_id_b))
findall-option
more flexible?
Ben