Diff for /loncom/interface/Attic/lonspreadsheet.pm between versions 1.122 and 1.123

version 1.122, 2002/10/22 13:29:57 version 1.123, 2002/10/22 18:54:53
Line 754  parametername should be a string such as Line 754  parametername should be a string such as
 sub MINPARM {  sub MINPARM {
     my ($expression) = @_;      my ($expression) = @_;
     my $min = undef;      my $min = undef;
     study($expression);  
     foreach $parameter (keys(%c)) {      foreach $parameter (keys(%c)) {
         next if ($parameter !~ /$expression/);          next if ($parameter !~ /$expression/);
         if ((! defined($min)) || ($min > $c{$parameter})) {          if ((! defined($min)) || ($min > $c{$parameter})) {
Line 777  parametername should be a string such as Line 776  parametername should be a string such as
 sub MAXPARM {  sub MAXPARM {
     my ($expression) = @_;      my ($expression) = @_;
     my $max = undef;      my $max = undef;
     study($expression);  
     foreach $parameter (keys(%c)) {      foreach $parameter (keys(%c)) {
         next if ($parameter !~ /$expression/);          next if ($parameter !~ /$expression/);
         if ((! defined($min)) || ($max < $c{$parameter})) {          if ((! defined($min)) || ($max < $c{$parameter})) {
Line 829  sub expandnamed { Line 827  sub expandnamed {
         my $returnvalue = '';          my $returnvalue = '';
         my @matches = ();          my @matches = ();
         $#matches = -1;          $#matches = -1;
         study $expression;  
         foreach $parameter (keys(%c)) {          foreach $parameter (keys(%c)) {
             push @matches,$parameter if ($parameter =~ /$expression/);              push @matches,$parameter if ($parameter =~ /$expression/);
         }          }
Line 918  sub sett { Line 915  sub sett {
     $t{'A0'}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge;      $t{'A0'}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge;
 }  }
   
 sub calc {  
     undef %sheet_values;  
     &sett();  
     my $notfinished=1;  
     my $lastcalc='';  
     my $depth=0;  
     while ($notfinished) {  
  $notfinished=0;  
         foreach (keys(%t)) {  
             my $old=$sheet_values{$_};  
             $sheet_values{$_}=eval $t{$_};  
     if ($@) {  
  undef %sheet_values;  
                 return $_.': '.$@;  
             }  
     if ($sheet_values{$_} ne $old) { $notfinished=1; $lastcalc=$_; }  
         }  
         $depth++;  
         if ($depth>100) {  
     undef %sheet_values;  
             return $lastcalc.': Maximum calculation depth exceeded';  
         }  
     }  
     return '';  
 }  
   
 # ------------------------------------------- End of "Inside of the safe space"  # ------------------------------------------- End of "Inside of the safe space"
 ENDDEFS  ENDDEFS
     $safeeval->reval($code);      $safeeval->reval($code);
Line 1033  sub outrow { Line 1004  sub outrow {
 }  }
   
 # ------------------------------------------------ Add or change formula values  # ------------------------------------------------ Add or change formula values
   sub update_values {
       my $sheet = shift;
       %{$sheet->{'safe'}->varglob('sheet_values')}=%{$sheet->{'values'}};
       return undef;
   }
   
   sub setvalues {
       my $sheet=shift;
       my ($values) = @_;
       $values = {} if (! defined($values));
       if (! ref($values)) {
           my %tmp   = @_;
           $values = \%tmp;
       }
       $sheet->{'values'} = $values;
       %{$sheet->{'safe'}->varglob('sheet_values')}=%{$sheet->{'values'}};
       return undef;
   }
   
 sub setformulas {  sub setformulas {
     my ($sheet)=shift;      my $sheet=shift;
       my ($formulas) = @_;
       $formulas = {} if (! defined($formulas));
       if (! ref($formulas)) {
           my %tmp   = @_;
           $formulas = \%tmp;
       }
       $sheet->{'f'} = $formulas;
     %{$sheet->{'safe'}->varglob('f')}=%{$sheet->{'f'}};      %{$sheet->{'safe'}->varglob('f')}=%{$sheet->{'f'}};
       return undef;
 }  }
   
 # ------------------------------------------------ Add or change formula values  # ------------------------------------------------ Add or change formula values
Line 1068  sub setrowlabels { Line 1066  sub setrowlabels {
 # ------------------------------------------------------- Calculate spreadsheet  # ------------------------------------------------------- Calculate spreadsheet
 sub calcsheet {  sub calcsheet {
     my $sheet=shift;      my $sheet=shift;
     my $result =  $sheet->{'safe'}->reval('&calc();');      &setvalues($sheet,undef);
     %{$sheet->{'values'}} = %{$sheet->{'safe'}->varglob('sheet_values')};      $sheet->{'safe'}->reval('&sett();');
     return $result;      my %t = %{$sheet->{'safe'}->varglob('t')};
       my $notfinished=1;
       my $lastcalc='';
       my $depth=0;
       while ($notfinished) {
    $notfinished=0;
           foreach (keys(%t)) {
               my $old=$sheet->{'values'}->{$_};
               $sheet->{'values'}->{$_}=$sheet->{'safe'}->reval($t{$_}.';');
       if ($@) {
    &setvalues($sheet,undef);
                   return $_.': '.$@;
               }
       if ($sheet->{'values'}->{$_} ne $old) { 
                   $notfinished=1; 
                   $lastcalc=$_;
               }
           }
           if ($notfinished) {
               %{$sheet->{'safe'}->varglob('sheet_values')} = 
                   %{$sheet->{'values'}};
           }
   
           $depth++;
           if ($depth>100) {
       &setvalues($sheet,undef);
               return $lastcalc.': Maximum calculation depth exceeded';
           }
       }
       return ;
 }  }
   
 # ---------------------------------------------------------------- Get formulas  # ---------------------------------------------------------------- Get formulas
Line 1354  sub readsheet { Line 1381  sub readsheet {
     my $fstring='';      my $fstring='';
     if ($fstring=$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}) {      if ($fstring=$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}) {
         my %tmp = split(/___;___/,$fstring);          my %tmp = split(/___;___/,$fstring);
         $sheet->{'f'} = \%tmp;          &setformulas($sheet,\%tmp);
         &setformulas($sheet);  
     } else {      } else {
         # Not cached, need to read          # Not cached, need to read
         my %f=();          my %f=();
Line 1390  sub readsheet { Line 1416  sub readsheet {
         }          }
         # Cache and set          # Cache and set
         $spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f);            $spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f);  
         $sheet->{'f'}=\%f;          &setformulas($sheet,\%f);
         &setformulas($sheet);  
     }      }
 }  }
   
Line 1537  sub tmpread { Line 1562  sub tmpread {
     } else {      } else {
        if ($nfield) { $fo{$nfield}=$nform; }         if ($nfield) { $fo{$nfield}=$nform; }
     }      }
     $sheet->{'f'}=\%fo;      &setformulas($sheet,\%fo);
     &setformulas($sheet);  
 }  }
   
 ##################################################  ##################################################
Line 1684  sub updateclasssheet { Line 1708  sub updateclasssheet {
         }          }
     }      }
     if ($changed) {       if ($changed) { 
         $sheet->{'f'} = \%f;          &setformulas($sheet,\%f); 
         &setformulas($sheet,%f);   
     }      }
     #      #
     $sheet->{'rowlabel'} = \%currentlist;      $sheet->{'rowlabel'} = \%currentlist;
Line 1826  sub updatestudentassesssheet { Line 1849  sub updatestudentassesssheet {
         }          }
     }      }
     if ($changed) {       if ($changed) { 
         $sheet->{'f'} = \%f;          &setformulas($sheet,\%f); 
         &setformulas($sheet);   
     }      }
     &setrowlabels($sheet);      &setrowlabels($sheet);
     #      #
Line 1879  sub loadstudent { Line 1901  sub loadstudent {
     }      }
     $cachedassess='';      $cachedassess='';
     undef %cachedstores;      undef %cachedstores;
     $sheet->{'f'} = \%f;      &setformulas($sheet,\%f);
     &setformulas($sheet);  
     &setconstants($sheet,\%c);      &setconstants($sheet,\%c);
 }  }
   
Line 1940  ENDPOP Line 1961  ENDPOP
             }              }
         }          }
     }      }
     $sheet->{'f'}=\%f;      &setformulas($sheet,\%f);
     &setformulas($sheet);  
     &setconstants($sheet,\%c);      &setconstants($sheet,\%c);
     $r->print('<script>popwin.close()</script>');      $r->print('<script>popwin.close()</script>');
     $r->rflush();       $r->rflush(); 

Removed from v.1.122  
changed lines
  Added in v.1.123


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>