Business-Intelligence-MicroStrategy-CommandManager

 view release on metacpan or  search on metacpan

lib/Business/Intelligence/MicroStrategy/CommandManager.pm  view on Meta::CPAN

	/ACCESSRIGHTS$/ && do { $result .= "ACCESSRIGHTS " . $self->{ACCESSRIGHTS} . " " };
	/ACCESSRIGHTS_CUSTOM$/ && do { $result .= custom_access_rights($self->{ACCESSRIGHTS_CUSTOM}) };
}
$result =~ s/\s+$//;
$result .= ";";
return $result;
}

=head2 add_custom_group_element

ADD ELEMENT "<element_name>" [(SHOWELEMENTNAME  | SHOWITEMSINELEMENT | SHOWITEMSINELEMENTANDEXPAND | SHOWALLANDEXPAND)] EXPRESSION "<expression>" [BREAKAMBIGUITY FOLDER "<local_symbol_folder>" ] [BANDNAMES "<name1>", "<name2>", "<nameN>"] [OUTPUTLEVE...

$foo->add_custom_group_element(	
	ELEMENT                     => "element_name", 
	SHOWELEMENTNAME             => "TRUE" | "FALSE", 
	SHOWITEMSINELEMENT          => "TRUE" | "FALSE", 
	SHOWITEMSINELEMENTANDEXPAND => "TRUE" | "FALSE", 
	SHOWALLANDEXPAND            => "TRUE" | "FALSE", 
	EXPRESSION                  => "expression", 
	BREAKAMBIGUITY_FOLDER       => "local_symbol_folder", 
	BANDNAMES                   => ["name1", "nameN"], 
	OUTPUTLEVEL                 => ["attribute_name1", "attributenameN"], 
	LOCATIONS                   => [ "outputlevel_location_path1", "outputlevel_location_pathN"], 
	CUSTOMGROUP                 => "customgroup_name", 
	LOCATION                    => "location_path", 
	PROJECT                     => "project_name"
);

Optional parameters: SHOWELEMENTNAME => TRUE | FALSE, SHOWITEMSINELEMENT => TRUE | FALSE, SHOWITEMSINELEMENTANDEXPAND => TRUE | FALSE, SHOWALLANDEXPAND  => TRUE | FALSE, BREAKAMBIGUITY_FOLDER => "local_symbol_folder", BANDNAMES => ["name1", "nameN"],...

ADD ELEMENT "25-35" EXPRESSION "([Customer Age]@ID Between 25.0 And 35.0)" TO CUSTOMGROUP "Copy of Age Groups" IN FOLDER "\Public Objects\Custom Groups" FOR PROJECT "MicroStrategy Tutorial";

$foo->add_custom_group_element(	
	ELEMENT     => "25-35", 
	EXPRESSION  => '([Customer Age]@ID Between 25.0 And 35.0)', 
	CUSTOMGROUP => "Copy of Age Groups", 
	LOCATION    => "\\Public Objects\\Custom Groups", 
	PROJECT     => "MicroStrategy Tutorial"
);

ADD ELEMENT "36-45" SHOWELEMENTNAME EXPRESSION "([Customer Age]@ID Between 36.0 And 45.0)" BANDNAMES "Group1", "Group2" TO CUSTOMGROUP "Copy of Age Groups" IN FOLDER "\Public Objects\Custom Groups" FOR PROJECT "MicroStrategy Tutorial";

$foo->add_custom_group_element(	
	ELEMENT         => "36-45", 
	SHOWELEMENTNAME => "TRUE" , 
	EXPRESSION      => '([Customer Age]@ID Between 36.0 And 45.0)', 
	BANDNAMES       => ["Group1", "Group2"], 
	CUSTOMGROUP     => "Copy of Age Groups", 
	LOCATION        => "\\Public Objects\\Custom Groups", 
	PROJECT         => "MicroStrategy Tutorial"
);

Following is how to create different types of custom groups using expression text.
Notes:
[] are used to define a name of an object; the name can include the full path to the object.
^ is used as the escape character to specify a string constant inside an expression.
{} are used to indicate a pair of join element list qualification.
When it comes to ambiguous objects within an expression, there are two ways to solve it:
	a. To specify the object with its full path
	b. Place all of the ambiguous objects in a single folder and specify this folder in the command using the BREAKAMBIGUITY reserved word.
When specifying the percentage value using Rank<ByValue=False>, please specify a fraction value between 0 and 1 that corresponds to the percentage value. For example, forty percent (40%) should be specified as 0.4.
Examples of different qualitications:
1. Attribute qualification:
	[\Schema Objects\Attributes\Time\Year]@ID IN ("2003, 2004")
	[\Schema Objects\Attributes\Time\Year]@ID =2003
	[\Schema Objects\Attributes\Products\Category]@DESC IN ("Books", "Movies", "Music", "Electronics")
2. Set Qualification
	For Metric Qualifications, you need to specify the output level at which this metric is calculated.
	Three types of functions: 
		Metric Values: [\Public Objects\Metrics\Sales Metrics\Profit] >= 10
		Bottom Rank: Rank([\Public Objects\Metrics\Sales Metrics\Profit]) <=  3
		Top Rank: Rank<ASC=False>([Revenue Contribution to All Products Abs.]) <= 5
		Percent: Rank<ByValue=False>([\Public Objects\Metrics\Sales Metrics\Profit]) <= 0.1
	*Note for Rank function: There are two parameters that control its behavior. ASC and ByValue.
			         When ASC is set to true, the ranking results are sorted in ascending order; when its value is set to false, the ranking results are sorted in descending order.
			         When ByValue is set to true, the ranking results represent their value order; whereas, when ByValue is set to false, the ranking results represent their percentage order.
3. Shortcut to a Report Qualification
	Just specify the report name:
	[Revenue vs. Forecast] or
	[\Public Objects\Reports\Revenue vs. Forecast]
4. Shortcut to a Filter
	Just specify the filter name:
	[Top 5 Customers by Revenue]
	([\Public Objects\Filters\Top 5 Customers by Revenue])
5. Banding Qualification
	You need to specify the output level. In addition, you may want to specify the band names. 
	Three types of bandings:
		Band Size: Banding(Cost, 1.0, 1000.0, 100.0) 
		Band Point: BandingP(Discount, 1.0, 10.0, 15.0, 20.0)
		Banding Counts: BandingC(Profit, 1.0, 1000.0, 100.0) 
	BandingP(Rank<ByValue=False>([\Public Objects\Metrics\Sales Metrics\Revenue]),0,0.1,0.5,1)
	Banding([Running Revenue Contribution to All Customers Abs.],0.0,1.0,0.2)
6. Advance Qualification
	Join Element List Qualification
	{Year@ID, Category@DESC} IN ({2004, "Books"}, {2005, "Movies"})

=cut

sub add_custom_group_element {
my $self = shift;
my %parms = @_;
@$self{keys %parms} = values %parms;
my $result;
my @order = qw(ELEMENT SHOWELEMENTNAME SHOWITEMSINELEMENT SHOWITEMSINELEMENTANDEXPAND SHOWALLANDEXPAND EXPRESSION BREAKAMBIGUITY_FOLDER BANDNAMES OUTPUTLEVEL OUTPUTLEVEL_LOCATIONS CUSTOMGROUP LOCATION PROJECT);
my @required = qw(ELEMENT EXPRESSION CUSTOMGROUP LOCATION PROJECT);
for(@required){
	if(!defined($self->{$_})) { croak("\nRequired parameter not defined: " , $_, "\n"); }
}
my @selected;
for(@order) { 
	exists $parms{$_} ? ( push(@selected, $_) ) : ($self->{$_} = undef);
}
for(@selected) {
	/^ELEMENT$/ && do { $result .= "ADD ELEMENT " . $q . $self->{ELEMENT} . $q . " "};
	/^SHOWELEMENTNAME$/ && do {
		if($self->{SHOWELEMENTNAME} =~ /(F|0)/i) { 
			next; 
		} 
		$result .= "SHOWELEMENTNAME ";  
	};
	/^SHOWITEMSINELEMENT$/ && do { 
		if($self->{SHOWITEMSINELEMENT} =~ /(F|0)/i) { 
			next; 
		} 
		$result .= "SHOWITEMSINELEMENT ";  
	};
	/^SHOWITEMSINELEMENTANDEXPAND$/ && do { 
		if($self->{SHOWITEMSINELEMENTANDEXPAND} =~ /(F|0)/i) { 
			next; 
		} 
		$result .= "SHOWITEMSINELEMENTANDEXPAND ";  
	};
	/SHOWALLANDEXPAND/ && do { 
		if($self->{SHOWALLANDEXPAND} =~ /(F|0)/i) {
			next; 
		} 

lib/Business/Intelligence/MicroStrategy/CommandManager.pm  view on Meta::CPAN

=cut

sub alter_security_filter {
	my $self = shift;
	$self->{ACTION} = "ALTER ";
	$self->security_filter(@_);
}



=head2 alter_security_role

    $foo->alter_security_role(
        SECURITY_ROLE => "sec_role_name",
        NAME          => "new_sec_role_name",
        DESCRIPTION   => "sec_role_description"
    );

Optional parameters: 
        NAME          => "new_sec_role_name",
        DESCRIPTION   => "sec_role_description"


ALTER SECURITY ROLE "<sec_role_name>" [NAME "<new_sec_role_name>"] [DESCRIPTION "<sec_role_description>"];

=cut

sub alter_security_role {
	my $self = shift;
	$self->{ACTION} = "ALTER ";
	$self->security_role(@_);
}

=head2 alter_server_config

This command can be used only in 3-tier Project Source Names.

    $foo->alter_server_config(
        DESCRIPTION              => "description",
        MAXCONNECTIONTHREADS     => "number_of_threads",
        BACKUPFREQ               => "number_of_minutes",
        USEPERFORMANCEMON        => "TRUE" | "FALSE",
        USEMSTRSCHEDULER         => "TRUE" | "FALSE",
        SCHEDULERTIMEOUT         => "seconds",
        BALSERVERTHREADS         => "TRUE" | "FALSE",
        CACHECLEANUPFREQ         => "seconds",
        LICENSECHECKTIME         => "time_of_day",
        HISTORYDIR               => "folder_path",
        MAXNOMESSAGES            => "number_of_messages",
        MESSAGELIFETIME          => "days",
        MAXNOJOBS                => "number_of_jobs",
        MAXNOCLIENTCONNS         => "number_of_client_conns",
        IDLETIME                 => "number_of_seconds",
        WEBIDLETIME              => "number_of_seconds",
        MAXNOXMLCELLS            => "number_of_xml_cells",
        MAXNOXMLDRILLPATHS       => "number_of_xml_drill_paths",
        MAXMEMXML                => "number_MBytes",
        MAXMEMPDF                => "number_MBytes",
        MAXMEMEXCEL              => "number_MBytes",
        ENABLEWEBTHROTTLING      => "TRUE" | "FALSE",
        MAXMEMUSAGE              => "percentage",
        MINFREEMEM               => "percentage",
        ENABLEMEMALLOC           => "TRUE" | "FALSE",
        MAXALLOCSIZE             => "number_MBytes",
        ENABLEMEMCONTRACT        => "TRUE" | "FALSE",
        MINRESERVEDMEM           => "NUMBER_MBYTES",
        MINRESERVEDMEMPERCENTAGE => "PERCENTAGE",
        MAXVIRTUALADDRSPACE      => "percentage",
        MEMIDLETIME              => "seconds",
        WORKSETDIR               => "folder_path",
        MAXRAMWORKSET            => "number_KBytes"
    );

Optional parameters: ALL PARAMETERS ARE OPTIONAL.

ALTER SERVER CONFIGURATION 
	[DESCRIPTION "<description>"] 
	[MAXCONNECTIONTHREADS <number_of_threads>] 
	[BACKUPFREQ <number_of_minutes>] 
	[USEPERFORMANCEMON (FALSE | TRUE)] 
	[USEMSTRSCHEDULER (FALSE | TRUE)] 
	[SCHEDULERTIMEOUT <seconds>] 
	[BALSERVERTHREADS (FALSE | TRUE)] 
	[CACHECLEANUPFREQ <seconds>] 
	[LICENSECHECKTIME <time_of_day>] 
	[HISTORYDIR "<folder_path>"] 
	[MAXNOMESSAGES <number_of_messages>] 
	[MESSAGELIFETIME <days>] 
	[MAXNOJOBS <number_of_jobs>] 
	[MAXNOCLIENTCONNS <number_of_client_conns>] 
	[IDLETIME <number_of_seconds>] 
	[WEBIDLETIME <number_of_seconds>] 
	[MAXNOXMLCELLS <number_of_xml_cells>] 
	[MAXNOXMLDRILLPATHS <number_of_xml_drill_paths>] 
	[MAXMEMXML number_MBytes] 
	[MAXMEMPDF number_MBytes] 
	[MAXMEMEXCEL number_MBytes] 
	[ENABLEWEBTHROTTLING (TRUE | FALSE)] 
	[MAXMEMUSAGE <percentage>] 
	[MINFREEMEM <percentage>] 
	[ENABLEMEMALLOC (TRUE | FALSE)] 
	[MAXALLOCSIZE <number_MBytes>] 
	[ENABLEMEMCONTRACT (TRUE | FALSE)] 
	[(MINRESERVEDMEM <number_MBytes> | MINRESERVEDMEMPERCENTAGE <percentage>)] 
	[MAXVIRTUALADDRSPACE <percentage>] 
	[MEMIDLETIME <seconds>] 
	[WORKSETDIR "<folder_path>"] 
	[MAXRAMWORKSET <number_KBytes>];

ALTER SERVER CONFIGURATION MAXCONNECTIONTHREADS 5 BACKUPFREQ 0 USEPERFORMANCEMON TRUE USEMSTRSCHEDULER TRUE BALSERVERTHREADS FALSE HISTORYDIR ".\INBOX\dsmith" MAXNOMESSAGES 10 MAXNOJOBS 10000 MAXNOCLIENTCONNS 500 WEBIDLETIME 0 MAXNOXMLCELLS 500000 MA...

=cut

sub alter_server_config {
my $self = shift;
my %parms = @_;
@$self{keys %parms} = values %parms;
my $result;
my @order = qw(DESCRIPTION MAXCONNECTIONTHREADS BACKUPFREQ USEPERFORMANCEMON USEMSTRSCHEDULER SCHEDULERTIMEOUT BALSERVERTHREADS CACHECLEANUPFREQ LICENSECHECKTIME HISTORYDIR MAXNOMESSAGES MESSAGELIFETIME MAXNOJOBS MAXNOCLIENTCONNS IDLETIME WEBIDLETIME...
my @required = qw();
for(@required){
	if(!defined($self->{$_})) { croak("\nRequired parameter not defined: " , $_, "\n"); }
}
my @selected;
for(@order) { 
	exists $parms{$_} ? ( push(@selected, $_) ) : ($self->{$_} = undef);
}
for(@selected) {
	/DESCRIPTION/ && do { $result .= "ALTER SERVER CONFIGURATION DESCRIPTION " . $q . $self->{DESCRIPTION} . $q . " "};
	/MAXCONNECTIONTHREADS/ && do { $result .= "MAXCONNECTIONTHREADS " . $self->{MAXCONNECTIONTHREADS} . " "};
	/BACKUPFREQ/ && do { $result .= "BACKUPFREQ " . $self->{BACKUPFREQ} . " "};
	/USEPERFORMANCEMON/ && do { $result .= "USEPERFORMANCEMON " . $self->{USEPERFORMANCEMON} . " "};
	/USEMSTRSCHEDULER/ && do { $result .= "USEMSTRSCHEDULER " . $self->{USEMSTRSCHEDULER} . " "};
	/SCHEDULERTIMEOUT/ && do { $result .= "SCHEDULERTIMEOUT " . $self->{SCHEDULERTIMEOUT} . " "};
	/BALSERVERTHREADS/ && do { $result .= "BALSERVERTHREADS " . $self->{BALSERVERTHREADS} . " "};
	/CACHECLEANUPFREQ/ && do { $result .= "CACHECLEANUPFREQ " . $self->{CACHECLEANUPFREQ} . " "};
	/LICENSECHECKTIME/ && do { $result .= "LICENSECHECKTIME " . $self->{LICENSECHECKTIME} . " "};
	/HISTORYDIR/ && do { $result .= "HISTORYDIR " . $q . $self->{HISTORYDIR} . $q . " "};
	/MAXNOMESSAGES/ && do { $result .= "MAXNOMESSAGES " . $self->{MAXNOMESSAGES} . " "};
	/MESSAGELIFETIME/ && do { $result .= "MESSAGELIFETIME " . $self->{MESSAGELIFETIME} . " "};
	/MAXNOJOBS/ && do { $result .= "MAXNOJOBS " . $self->{MAXNOJOBS} . " "};
	/MAXNOCLIENTCONNS/ && do { $result .= "MAXNOCLIENTCONNS " . $self->{MAXNOCLIENTCONNS} . " "};
	/^IDLETIME$/ && do { $result .= "IDLETIME " . $self->{IDLETIME} . " "};
	/^WEBIDLETIME$/ && do { $result .= "WEBIDLETIME " . $self->{WEBIDLETIME} . " "};
	/MAXNOXMLCELLS/ && do { $result .= "MAXNOXMLCELLS " . $self->{MAXNOXMLCELLS} . " "};
	/MAXNOXMLDRILLPATHS/ && do { $result .= "MAXNOXMLDRILLPATHS " . $self->{MAXNOXMLDRILLPATHS} . " "};
	/MAXMEMXML/ && do { $result .= "MAXMEMXML " . $self->{MAXMEMXML} . " "};
	/MAXMEMPDF/&& do { $result .= "MAXMEMPDF " . $self->{MAXMEMPDF} . " "};
	/MAXMEMEXCEL/&& do { $result .= "MAXMEMEXCEL " . $self->{MAXMEMEXCEL} . " "};	
	/ENABLEWEBTHROTTLING/ && do { $result .= "ENABLEWEBTHROTTLING " . $self->{ENABLEWEBTHROTTLING} . " "};
	/MAXMEMUSAGE/ && do { $result .= "MAXMEMUSAGE " . $self->{MAXMEMUSAGE} . " "};
	/MINFREEMEM/ && do { $result .= "MINFREEMEM " . $self->{MINFREEMEM} . " "};
	/ENABLEMEMALLOC/ && do { $result .= "ENABLEMEMALLOC " . $self->{ENABLEMEMALLOC} . " "};
	/MAXALLOCSIZE/ && do { $result .= "MAXALLOCSIZE " . $self->{MAXALLOCSIZE} . " "};
	/ENABLEMEMCONTRACT/ && do { $result .= "ENABLEMEMCONTRACT " . $self->{ENABLEMEMCONTRACT} . " "};
	/^MINRESERVEDMEM$/ && do { $result .= "MINRESERVEDMEM " . $self->{MINRESERVEDMEM} . " "};
	/^MINRESERVEDMEMPERCENTAGE$/ && do { $result .= "MINRESERVEDMEMPERCENTAGE " . $self->{MINRESERVEDMEMPERCENTAGE} . " "};
	/MAXVIRTUALADDRSPACE/ && do { $result .= "MAXVIRTUALADDRSPACE " . $self->{MAXVIRTUALADDRSPACE} . " "};
	/MEMIDLETIME/ && do { $result .= "MEMIDLETIME " . $self->{MEMIDLETIME} . " "};
	/WORKSETDIR/ && do { $result .= "WORKSETDIR " . $q . $self->{WORKSETDIR} . $q . " "};
	/MAXRAMWORKSET/ && do { $result .= "MAXRAMWORKSET " . $self->{MAXRAMWORKSET} . " "};
}
$result =~ s/\s+$//;
$result .= ";";
return $result;

lib/Business/Intelligence/MicroStrategy/CommandManager.pm  view on Meta::CPAN

        ENABLESUBTOTALDISPLAY       => "TRUE" | "FALSE",
        ELEMENTHEADERPOSITION       => "ABOVE" | "BELOW",
        HIDDEN                      => "TRUE" | "FALSE",
        ELEMENT                     => "element_name",
        SHOWELEMENTNAME             => "TRUE" | "FALSE",
        SHOWITEMSINELEMENT          => "TRUE" | "FALSE",
        SHOWITEMSINELEMENTANDEXPAND => "TRUE" | "FALSE",
        SHOWALLANDEXPAND            => "TRUE" | "FALSE",
        EXPRESSION                  => "expression",
        BREAKAMBIGUITY_FOLDER       => "local_symbol_folder",
        BANDNAMES                   => [ "name1", "nameN" ],
        OUTPUTLEVEL                 => [ "attribute_name1", "attributenameN" ],
        OUTPUTLEVEL_LOCATIONS       =>
          [ "outputlevel_location_path1", "outputlevel_location_pathN" ],
        LOCATION => "location_path",
        PROJECT  => "project_name"
    );


Optional parameters: 
       DESCRIPTION                 => "description",
        ENABLEHIERARCHICALDISPLAY   => "TRUE" | "FALSE",
        ENABLESUBTOTALDISPLAY       => "TRUE" | "FALSE",
        ELEMENTHEADERPOSITION       => "ABOVE" | "BELOW",
        HIDDEN                      => "TRUE" | "FALSE",
        ELEMENT                     => "element_name",
        SHOWELEMENTNAME             => "TRUE" | "FALSE",
        SHOWITEMSINELEMENT          => "TRUE" | "FALSE",
        SHOWITEMSINELEMENTANDEXPAND => "TRUE" | "FALSE",
        SHOWALLANDEXPAND            => "TRUE" | "FALSE",
        EXPRESSION                  => "expression",
        BREAKAMBIGUITY_FOLDER       => "local_symbol_folder",
        BANDNAMES                   => [ "name1", "nameN" ],
        OUTPUTLEVEL                 => [ "attribute_name1", "attributenameN" ],
        OUTPUTLEVEL_LOCATIONS       =>
          [ "outputlevel_location_path1", "outputlevel_location_pathN" ]

CREATE CUSTOMGROUP "<customgroup_name>" 
	[DESCRIPTION "<description>"] 
	[ENABLEHIERARCHICALDISPLAY (TRUE | FALSE)] 
	[ENABLESUBTOTALDISPLAY (TRUE | FALSE)]  
	[ELEMENTHEADERPOSITION (ABOVE | BELOW)] 
	[HIDDEN (TRUE | FALSE)] ELEMENT "<element_name>" 
	[(SHOWELEMENTNAME  | SHOWITEMSINELEMENT | SHOWITEMSINELEMENTANDEXPAND  | SHOWALLANDEXPAND)] 
	EXPRESSION "<expression>" 
	[BREAKAMBIGUITY FOLDER "<local_symbol_folder>"] 
	[BANDNAMES "<name1>", "<name2>", "<nameN>"] 
	[OUTPUTLEVEL  "<attribute_name1>", "<attribute_name2>", "<attributenameN>" IN FOLDERS "<outputlevel_location_path1>", "<outputlevel_location_path2>", "<outputlevel_location_pathN>"] 
	IN FOLDER  "<location_path>" 
	FOR PROJECT "<project_name>";


Following is how to create different types of custom groups using expression text.
Notes:
[] are used to define a name of an object; the name can include the full path to the object.
^ is used as the escape character to specify a string constant inside an expression.
{} are used to indicate a pair of join element list qualification.
When it comes to ambiguous objects within an expression, there are two ways to solve it:
	a. To specify the object with its full path
	b. Place all of the ambiguous objects in a single folder and specify this folder in the command using the BREAKAMBIGUITY reserved word.
When specifying the percentage value using Rank<ByValue=False>, please specify a fraction value between 0 and 1 that corresponds to the percentage value. For example, forty percent (40%) should be specified as 0.4.
Examples of different qualitications:
1. Attribute qualification:
	[\Schema Objects\Attributes\Time\Year]@ID IN ("2003, 2004")
	[\Schema Objects\Attributes\Time\Year]@ID =2003
	[\Schema Objects\Attributes\Products\Category]@DESC IN ("Books", "Movies", "Music", "Electronics")
2. Set Qualification
	For Metric Qualifications, you need to specify the output level at which this metric is calculated.
	Three types of functions: 
		Metric Values: [\Public Objects\Metrics\Sales Metrics\Profit] >= 10
		Bottom Rank: Rank([\Public Objects\Metrics\Sales Metrics\Profit]) <=  3
		Top Rank: Rank<ASC=False>([Revenue Contribution to All Products Abs.]) <= 5
		Percent: Rank<ByValue=False>([\Public Objects\Metrics\Sales Metrics\Profit]) <= 0.1
	*Note for Rank function: There are two parameters that control its behavior. ASC and ByValue.
			         When ASC is set to true, the ranking results are sorted in ascending order; when its value is set to false, the ranking results are sorted in descending order.
			         When ByValue is set to true, the ranking results represent their value order; whereas, when ByValue is set to false, the ranking results represent their percentage order.
3. Shortcut to a Report Qualification
	Just specify the report name:
	[Revenue vs. Forecast] or
	[\Public Objects\Reports\Revenue vs. Forecast]
4. Shortcut to a Filter
	Just specify the filter name:
	[Top 5 Customers by Revenue]
	([\Public Objects\Filters\Top 5 Customers by Revenue])
5. Banding Qualification
	You need to specify the output level. In addition, you may want to specify the band names. 
	Three types of bandings:
		Band Size: Banding(Cost, 1.0, 1000.0, 100.0) 
		Band Point: BandingP(Discount, 1.0, 10.0, 15.0, 20.0)
		Banding Counts: BandingC(Profit, 1.0, 1000.0, 100.0) 
	BandingP(Rank<ByValue=False>([\Public Objects\Metrics\Sales Metrics\Revenue]),0,0.1,0.5,1)
	Banding([Running Revenue Contribution to All Customers Abs.],0.0,1.0,0.2)
6. Advance Qualification
	Join Element List Qualification
	{Year@ID, Category@DESC} IN ({2004, "Books"}, {2005, "Movies"})

=cut

sub create_custom_group {
my $self = shift;
my %parms = @_;
@$self{keys %parms} = values %parms;
my $result;
my @order = qw(CUSTOMGROUP DESCRIPTION ENABLEHIERARCHICALDISPLAY ENABLESUBTOTALDISPLAY ELEMENTHEADERPOSITION HIDDEN ELEMENT SHOWELEMENTNAME SHOWITEMSINELEMENT SHOWITEMSINELEMENTANDEXPAND SHOWALLANDEXPAND EXPRESSION BREAKAMBIGUITY_FOLDER BANDNAMES OUT...
my @required = qw(CUSTOMGROUP EXPRESSION LOCATION PROJECT);
for(@required){
	if(!defined($self->{$_})) { croak("\nRequired parameter not defined: " , $_, "\n"); }
}
my @selected;
for(@order) { 
	exists $parms{$_} ? ( push(@selected, $_) ) : ($self->{$_} = undef);
}
for(@selected) {
	
	/CUSTOMGROUP/ && do { $result .= "CREATE CUSTOMGROUP " . $q . $self->{CUSTOMGROUP} . $q . " "};
	/DESCRIPTION/ && do { $result .= "DESCRIPTION " . $q . $self->{DESCRIPTION} . $q . " "};
	/ENABLEHIERARCHICALDISPLAY/i && do { $result .= "ENABLEHIERARCHICALDISPLAY " . $self->{ENABLEHIERARCHICALDISPLAY} . " "};
	/ENABLESUBTOTALDISPLAY/ && do { $result .= "ENABLESUBTOTALDISPLAY " . $self->{ENABLESUBTOTALDISPLAY} . " "};
	/ELEMENTHEADERPOSITION/ && do { $result .= "ELEMENTHEADERPOSITION " . $self->{ELEMENTHEADERPOSITION} . " "};
	/HIDDEN/ && do { $result .= "HIDDEN " . $self->{HIDDEN} . " "};
	/^ELEMENT$/ && do { $result .= "ELEMENT " . $q . $self->{ELEMENT} . $q . " "};
	/^SHOWELEMENTNAME$/ && do {
		if($self->{SHOWELEMENTNAME} =~ /(F|0)/i) { next; } 
		$result .= "SHOWELEMENTNAME ";  
	};
	/^SHOWITEMSINELEMENT$/ && do { 
		if($self->{SHOWITEMSINELEMENT} =~ /(F|0)/i) { next; } 
		$result .= "SHOWITEMSINELEMENT ";  
	};
	/^SHOWITEMSINELEMENTANDEXPAND$/ && do { 
		if($self->{SHOWITEMSINELEMENTANDEXPAND} =~ /(F|0)/i) { 	next; } 
		$result .= "SHOWITEMSINELEMENTANDEXPAND ";  
	};
	/SHOWALLANDEXPAND/ && do { 
		if($self->{SHOWALLANDEXPAND} =~ /(F|0)/i) { next; } 
		$result .= "SHOWALLANDEXPAND ";  



( run in 1.362 second using v1.01-cache-2.11-cpan-39bf76dae61 )