[if-mm !tables]
[seti ui_error]Not authorized for table [cgi mv_data_table][/seti]
[bounce page="__UI_BASE__/error"]
[/if-mm]
[if-mm !advanced report]
[seti ui_error]Not authorized for reporting functions.[/seti]
[bounce page="__UI_BASE__/error"]
[/if-mm]
[seti page_title][cgi report_title][/seti]
[set ui_class]Reports[/set]
[set icon_name]icon_stats.gif[/set]
[set help_name]report[/set]
[calc]
$Scratch->{head_put} = '@' . '_UI_STD_HEAD_@';
$Scratch->{foot_put} = '@' . '_UI_STD_FOOTER_@';
$Scratch->{page_put} = '@' . '@MV_PAGE@@';
$Config->{NoSearch} = '';
[/calc]
[perl]
$Scratch->{relocate} = '';
return unless $CGI->{row_change};
$CGI->{row_change} =~ /^(insert|append|delete)(\d+)$/
or return;
$function = $1;
$row = $2;
%saved = %$CGI;
for(keys %saved) {
push @del, $_ unless length($saved{$_});
}
for(@del) {
delete $saved{$_};
}
@del = ();
my @change;
my %ignore = qw/
break
sort_order
sort_option
/;
my $key;
my $max = 0;
foreach $key (keys %saved) {
next unless $key =~ /^(\w+\D)(\d+)$/;
my $nm = $1;
my $idx = $2;
next if $ignore{$nm};
$max = $idx if $idx > $max and $key eq "table$idx";
if($function eq 'append') {
next if $idx <= $row;
}
else {
next if $idx < $row;
}
push @change, [$key, $saved{$key}];
push @del, $key;
}
for(@del) {
delete $saved{$_};
}
if($function eq 'insert' or $function eq 'append') {
$max++;
for(@change) {
my ($k, $v) = @{$_};
$k =~ s/(\d+)$/$1 + 1/e;
$saved{$k} = $v;
}
$Scratch->{relocate} = '__UI_BASE__/report';
}
elsif($function eq 'delete') {
$max--;
for(@change) {
my ($k, $v) = @{$_};
$k =~ /(\d+)/;
my $idx = $1;
next if $idx == $row;
$k =~ s/(\d+)$/$1 - 1/e;
$saved{$k} = $v;
}
$Scratch->{relocate} = '__UI_BASE__/report';
}
else {
$Scratch->{relocate} = 'special/failed';
}
$saved{num_columns} = $max > 1 ? $max + 1 : 3;
$Values->{saved_report} = \%saved;
return;
[/perl]
[if scratch relocate]
[bounce href="[area href=`$Scratch->{relocate}`]"]
[/if]
@_UI_STD_HEAD_@
[seti name=tables][list-databases][/seti]
[perl table="[scratch tables]"]
$vals = {};
my $current_table = $Values->{mv_data_table} = $CGI->{report_table};
%saved = %$CGI;
for(keys %saved) {
push @del, $_ unless length($saved{$_});
}
for(@del) {
delete $saved{$_};
}
unless ($current_table) {
$Scratch->{search_string} = "";
$Scratch->{search_page} = "
NO CURRENT TABLE |
";
return;
}
my $large = $Db{$current_table}->config('LARGE');
for( keys %{$CGI} ) {
next unless /^([A-Za-z_]+)(\d+)$/;
my $item = $1;
my $idx = $2;
$vals->{$item} = []
unless defined $vals->{$item};
$vals->{$item}[$idx] = $CGI->{"$item$idx"};
}
return "No tables/columns selected" unless defined $vals->{table};
$summary_only = $CGI->{summary_only};
for(0 .. 2) {
if($CGI->{"search_field$_"} and $CGI->{"search_spec$_"}) {
my $spec = $CGI->{"search_spec$_"};
my $field = $CGI->{"search_field$_"};
my $op = $CGI->{"search_op$_"};
push @string, "se=$spec";
push @string, "sf=$field";
push @string, "op=$op";
push @string, "nu=1" if $op =~ /\W/;
}
}
if(! scalar @string) {
push @string, "ra=yes";
}
else {
push @string, "co=1";
}
push @string, "st=db"
unless $large;
push @string, "fi=$current_table";
if ($CGI->{matchlimit}) {
push @string, "ml=$CGI->{matchlimit}";
my $page = $CGI->{report_title};
$page =~ s/%/%37/g;
push @string, "sp=__UI_BASE__/reports/$page";
}
else {
push @string, "ml=999999";
}
if($vals->{sort_order}) {
for(my $i = 0; $i < scalar @{$vals->{sort_order}}; $i++) {
my $f = $vals->{sort_order}[$i];
last unless $f;
push @string, "tf=$f";
push @string, "to=" . $vals->{sort_option}[$i];
if($vals->{break}[$i]) {
unshift(@breaks, $f);
$hfoot_change{$f} = qq{\n[item-change $i][condition]};
$hfoot_change{$f} .= qq{[item-data $current_table $f]};
$hfoot_change{$f} .= qq{[/condition]\n};
$foot_change{$f} = qq{\n};
$last_foot_change{$f} = qq{
\n};
$efoot_change{$f} = "[/item-change $i]\n";
}
}
}
my $header = "
\n";
my $page = '';
my $summary_found;
$page .= "
\n" unless $summary_only;
my $end_line = '';
my $total_line = "
\n";
my $last_total_line = "
\n";
my $count = 0;
for (my $i = 0; $i < 10; $i++) {
last if ! $vals->{table}[$i];
$count++;
}
$saved{num_columns} = $count;
$Values->{saved_report} = \%saved;
for (my $i = 0; $i < $count; $i++) {
my $t = $vals->{table}[$i] or last;
my $c = $vals->{column}[$i];
my $k = $vals->{key}[$i];
my $h = $vals->{heading}[$i] || $c;
my $s = $vals->{summary}[$i];
my $r = $vals->{filter}[$i];
my $e = $vals->{edit}[$i];
my $ek = $vals->{editkey}[$i] || '';
if($r) {
$r =~ s/'/\\'/g;
$r =~ s/[\0 ]+/' '/g if $r;
$r = "'$r'";
}
my $l = "ALIGN=$vals->{align}[$i]";
$header .= "\t$h | \n";
my $data;
if($k) {
$data = "[data table=$t column=$c key='[item-data $current_table $k]']";
}
else {
$data = "[item-data $current_table $c]";
}
if($e) {
$ek = $ek ? "[item-data $t $ek]" : $data;
}
unless($summary_only) {
$page .= "\t";
$page .= qq{[page href="__UI_BASE__/flex_editor"
form="
ui_return_to=$Scratch->{page_put};
mv_data_table=$e
item_id=$ek
"]} if $e;
if ($r) {
$page .= $k
? qq{[filter op=$r interpolate=1]}
: qq{[item-filter $r]};
}
$page .= $data;
if ($r) {
$page .= $k
? qq{[/filter]}
: qq{[/item-filter]};
}
$page .= qq{} if $e;
}
$total_line .= "\t | ";
$total_line .= "TOTAL" unless $i;
$last_total_line .= "\t | ";
$last_total_line .= "TOTAL" unless $i;
for (@breaks) {
$foot_change{$_} .= "\t | ";
$last_foot_change{$_} .= "\t | ";
if($_ eq $c) {
$foot_change{$_} .= qq{[if scratch first_done_$c]};
$foot_change{$_} .= qq{ } if ! $summary_only;
$foot_change{$_} .= qq{[value prev_data_$c]};
$foot_change{$_} .= qq{ } if ! $summary_only;
$foot_change{$_} .= qq{[/if]};
$last_foot_change{$_} .= " [value prev_data_$c] ";
}
elsif($s) {
$foot_change{$_} .= qq{[if scratch first_done_$_]};
$foot_change{$_} .= qq{ } if ! $summary_only;
$foot_change{$_} .= qq{[item-filter $r]} if $r;
$foot_change{$_} .= "[item-exec summary]$t.$c.$_ SUBTOTAL[/item-exec]\n";
$foot_change{$_} .= qq{[/item-filter]} if $r;
$foot_change{$_} .= qq{ } if ! $summary_only;
$foot_change{$_} .= qq{[/if]\n};
$last_foot_change{$_} .= qq{ };
$last_foot_change{$_} .= qq{[filter op="$r" interpolate=1]} if $r;
$last_foot_change{$_} .= '[calc]$subtotal' . "{'$t.$c.$_'}" . "[/calc]\n";
$last_foot_change{$_} .= qq{[/filter]} if $r;
$last_foot_change{$_} .= qq{ };
}
$foot_change{$_} .= " | \n";
$last_foot_change{$_} .= "\n";
}
if($s) {
$summary_found = 1;
$page .= qq{[item-exec summary]$t.$c ADD $data} . '[/item-exec]';
for(@breaks) {
$page .= qq{[item-exec summary]$t.$c.$_ ADD $data} . '[/item-exec]';
}
$total_line .= qq{};
$total_line .= qq{[item-filter $r]} if $r;
$total_line .= "[item-exec summary]$t.$c TOTAL[/item-exec]\n";
$total_line .= qq{[/item-filter]} if $r;
$total_line .= qq{};
$last_total_line .= qq{};
$last_total_line .= qq{[filter op="$r" interpolate=1]} if $r;
$last_total_line .= '[calc]$total' . "{'$t.$c'}" . "[/calc]\n";
$last_total_line .= qq{[/filter]} if $r;
$last_total_line .= qq{};
}
$total_line .= "\n";
$last_total_line .= "\n";
$page .= "\n" unless $summary_only;
}
if($summary_found) {
$page .= <<'EOF';
[item-sub summary]
my $string = shift;
$string =~ s/^\s+//;
my ($name, $function, $value) = split /\s+/, $string;
if ($function eq 'ADD') {
$subtotal{$name} += $value;
$total{$name} += $value;
return;
}
my $result;
if ($function eq 'SUBTOTAL') {
$result = $subtotal{$name};
$subtotal{$name} = 0
unless $value eq 'SHOW';
}
elsif ($function eq 'TOTAL') {
$result = $total{$name};
$total{$name} = $subtotal{$name} = 0
unless $value eq 'SHOW';
}
return $result;
[/item-sub]
EOF
}
$page .= "
\n" unless $summary_only;
$header .= "\n";
$total_line .= "\n";
$Scratch->{search_string} = join "\n\t\t", '', @string, '';
if( scalar(@breaks) and ! $summary_only ) {
$Scratch->{search_page} = '';
}
else {
$Scratch->{search_page} = $header;
}
$header = '' if $summary_only;
$Scratch->{search_page} = scalar(@breaks) ? '' : $header;
for (reverse @breaks) {
$Scratch->{search_page} .= "[set first_done_$_][/set]\n";
$foot_change{$_} .= "";
$efoot_change{$_} = "\n$header\n$efoot_change{$_}\n";
$header = '';
}
$Scratch->{search_page} .= "[search-list]\n";
for (@breaks) {
$Scratch->{search_page} .= $hfoot_change{$_};
$Scratch->{search_page} .= $foot_change{$_};
$Scratch->{search_page} .= $efoot_change{$_};
$Scratch->{search_page} .= "\n[set first_done_$_]1[/set]\n";
}
$Scratch->{search_page} .= $page;
for (@breaks) {
$Scratch->{search_page} .= qq{[value name=prev_data_$_ hide=1 set=|};
$Scratch->{search_page} .= qq{[item-data $current_table $_]};
$Scratch->{search_page} .= qq{|]};
}
$Scratch->{search_page} .= "\n[/search-list]\n";
for (@breaks) {
$Scratch->{search_page} .= $last_foot_change{$_};
}
$Scratch->{search_page} .= $last_total_line if $summary_found;
if($CGI->{matchlimit}) {
$Scratch->{search_page} .= "
|
";
$count--;
$Scratch->{search_page} .= <
More |
[more] |
[/more-list]
EOF
}
return;
[/perl]
[comment]
string: [scratch search_string]
page: [scratch search_page]
[/comment]
[if cgi generate_page]
[set write_report]
[seti name=tables][list-databases][/seti]
success=[perl table="[scratch tables]"]
my $data = $CGI->{page};
$data =~ s/[/[/g;
$data =~ s/\r//g;
my $page = $CGI->{report_name};
return 0 unless ($page and $data);
$CGI->{definition} =~ s/\r//g;
$def = '[';
$def .= <{saved_report} = $CGI->{definition};
return;
EOF
$def .= '[';
$def .= '/perl]';
$def .= "[bounce href='[area __UI_BASE__/report]']\n";
$page =~ s/([^-\w.])/sprintf '%%%02x', ord($1)/ge;
if($Tag->if_mm('super')) {
$save_dir = '';
}
else {
$save_dir = "/user/$Session->{username}";
}
$status = $Tag->write_relative_file("pages/__UI_BASE__$save_dir/report_def/$page.html", $def);
$status &&= $Tag->write_relative_file("pages/__UI_BASE__$save_dir/reports/$page.html", $data);
delete $CGI->{page};
delete $CGI->{def};
return $status;
[/perl]
[/set]
[else]
[search-region search="[scratch search_string]" interpolate=1]
[scratch search_page]
[/search-region]
[/else]
[/if]
[set search_page][/set]
[set search_string][/set]
@_UI_STD_FOOTER_@