I have a case where I need to modify the value of a variable after it is initially set.
The reporting macro is in use to set the variable initially, but there are cases where I would need to further scrub down the value to ensure it is useful.
The following is the current code that initially sets the value of the variable 'app_APPNAME_include'
{set-data:app_APPNAME_include}{report-block}
{local-reporter:variable:app_included}
{collection-filter:@self}{text-filter:data:appname > reference:value|include=APPNAME}{collection-filter}
{local-reporter}
{report-body:trim=true}true{report-body}{report-empty}false{report-empty}
{report-block}{set-data}
Once it has been set, the app_APPNAME_include variable will have a value like one of the following...
* true
* false
* truetrue
It is in the case of 'truetrue' where I would want to scrub the value to make it a single occurance of the string 'true' rather than a repeated string.
Does this value modification need to occur within the report block - or as a post processing of the app_APPNAME_include variable that gets set.
I'm anticipating needing to do some type of regular expression match/replace on the value but am not sure how to go about doing so.
Any help is appreciated.
This seems to have worked out for me.
{set-data:app_APPNAME_include}{report-block:maxResults=1} {local-reporter:variable:app_included} {collection-filter:@self} {text-filter:data:appname > reference:value|include=APPNAME} {collection-filter} {local-reporter} {report-body:trim=true}true{report-body}{report-empty}false{report-empty} {report-block}{set-data}
Hi Jim,
Just FYI, what is actually happening with {set-data} is that it stores the wiki markup, not the actual 'true/false' (or 'truetrue', or whatever) result. As such, it gets executed every time you view the value on the page, and if you want to process it, you have to render it, otherwise you're processing '{report-block....}', rather than 'true/false'. Hope that makes sense...
It would help if I knew two things:
a) What does 'variable:app_included' contains - how is it set?
b) What are you trying to use the 'app_APPNAME_include' value for? Is it for further processing on the same page? Is it for use on other pages doing a report? Does the value need to survive beyond viewing the current page?
That said, I'll take a guess at providing something that might get you on the right track. Something like this:
{report-variable:app_APPNAME_items}
{local-reporter:data:app_included}
{text-filter:data:appname|include=APPNAME}
{local-reporter}
{report-variable}
{report-variable:app_APPNAME_include|value=%variable:app_APPNAME_items > collection:is empty > boolean:negate%}
This should give you a 'true' or 'false' value in 'variable:app_APPNAME_include'. If you need to store this as a 'Scaffolding' data value via {set-data}, you probably need to use {replace-and-render}, since injection causes issues, and you can't just use the {report-info} here, due to what I said earlier about how {set-data} stores its values. That would look like this:
{replace-and-render}
{replace-item:%app_APPNAME_include%}{report-info:variable:app_APPNAME_include%}{replace-item}
{replace-body}{set-data:app_APPNAME_include}%app_APPNAME_include%{set-data}{replace-body}
{replace-and-render}
If you don't actually need it to be stored in Scaffolding, then skip that stage. Your mileage may vary...
Hope that helps!
Regards,
David Peterson
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Thanks for the explanation of the order of ops with {set-data} macro. I was wondering if there was something like that going on under the hood. I previously used twiki for a few years and ran into similar ordering issues there as well).
As for HOW some of the vars are set:
a) variable:app_included is previously set using {report-variable} and
{local-reporter}
b) all variables set are intended for processing on the same page
some are used directly within a {report-table} to display the collected
info and again used to set {replace-item} variables for later use in the
page
As I previously commented, I found a workable solution by setting the maxResults=1 attrib to the report block.
It looks like setting {report-variable:name} to the report results may be more efficient way of setting vars than my current model of a {report-block} inside a {set-data}. I'll look into how I might be able to do things that way instead - as it might save me many lines of wiki syntax down the road.
Can you point me to a good online reference/documentation on the scaffolding macros and injection?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
I think I may have found a workable solution by restricting the report results to only one matching row.
* {set-data:app_APPNAME_include}{report-block:maxResults=1}
{local-reporter:variable:app_included}
{collection-filter:@self}
{text-filter:data:appname > reference:value|include=APPNAME}
{collection-filter}
{local-reporter}
{report-body:trim=true}true{report-body}{report-empty}false{report-empty}
{report-block}{set-data}
Since the report would already be returning only rows that were set to include=true (the report variable:app_included would only contain rows that matched true) I can be fairly certain that any rows of data within have a value of true.
At the moment, this seems to be giving me what I want, a final value of just 'true' or 'false' in the app_APPNAME_include variable.
Will report back after a bit of pressure testing to see if this really does solve this issue.
Of course, if there's another way to do it, I'm open to hear it :-)
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Actually, that's not working out 100% for me.
When I define the myBoolean variable to falsefalsefalse directly, I seem to get valid results from the report block and text filter.
* Before: {set-data:myBoolean}falsefalsefalse{set-data}
* After: {report-block}{local-reporter:data:myBoolean}{text-filter:include=.*true.*}{local-reporter}{report-body:trim=true}true{report-body}{report-empty}false{report-empty}{report-block}
However, when I tried moving this to work with a scaffold variable -- app_APPNAME_include -- which has it's value previously set to the result of a report, it does not work for me.
* Before: {get-data:app_APPNAME_include}
* After: {report-block}{local-reporter:data:app_APPNAME_include}{text-filter:include=.*true.*}{local-reporter}{report-body:trim=true}true{report-body}{report-empty}false{report-empty}{report-block}
The two code sample above render as below...needless to say, it is not desirable to have "false" getting translated to "true"
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
I think I found a way to make this work...if there's a better or more efficient way to do this, please follow up here and let me know...
Wiki code follows:
* Before: {set-data:myBoolean}falsefalsefalse{set-data}
* After: {report-block}
{local-reporter:data:myBoolean}
{text-filter:include=.*true.*}
{local-reporter}
{report-body:trim=true}true{report-body}{report-empty}false{report-empty}
{report-block}
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Online forums and learning are now in one easy-to-use experience.
By continuing, you accept the updated Community Terms of Use and acknowledge the Privacy Policy. Your public name, photo, and achievements may be publicly visible and available in search engines.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.