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

version 1.123, 2002/10/22 18:54:53 version 1.124, 2002/10/22 19:47:13
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 776  parametername should be a string such as Line 777  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 827  sub expandnamed { Line 829  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 915  sub sett { Line 918  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 1004  sub outrow { Line 1033  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 1066  sub setrowlabels { Line 1068  sub setrowlabels {
 # ------------------------------------------------------- Calculate spreadsheet  # ------------------------------------------------------- Calculate spreadsheet
 sub calcsheet {  sub calcsheet {
     my $sheet=shift;      my $sheet=shift;
     &setvalues($sheet,undef);      my $result =  $sheet->{'safe'}->reval('&calc();');
     $sheet->{'safe'}->reval('&sett();');      %{$sheet->{'values'}} = %{$sheet->{'safe'}->varglob('sheet_values')};
     my %t = %{$sheet->{'safe'}->varglob('t')};      return $result;
     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 1381  sub readsheet { Line 1354  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);
         &setformulas($sheet,\%tmp);          $sheet->{'f'} = \%tmp;
           &setformulas($sheet);
     } else {      } else {
         # Not cached, need to read          # Not cached, need to read
         my %f=();          my %f=();
Line 1416  sub readsheet { Line 1390  sub readsheet {
         }          }
         # Cache and set          # Cache and set
         $spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f);            $spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f);  
         &setformulas($sheet,\%f);          $sheet->{'f'}=\%f;
           &setformulas($sheet);
     }      }
 }  }
   
Line 1562  sub tmpread { Line 1537  sub tmpread {
     } else {      } else {
        if ($nfield) { $fo{$nfield}=$nform; }         if ($nfield) { $fo{$nfield}=$nform; }
     }      }
     &setformulas($sheet,\%fo);      $sheet->{'f'}=\%fo;
       &setformulas($sheet);
 }  }
   
 ##################################################  ##################################################
Line 1708  sub updateclasssheet { Line 1684  sub updateclasssheet {
         }          }
     }      }
     if ($changed) {       if ($changed) { 
         &setformulas($sheet,\%f);           $sheet->{'f'} = \%f;
           &setformulas($sheet,%f); 
     }      }
     #      #
     $sheet->{'rowlabel'} = \%currentlist;      $sheet->{'rowlabel'} = \%currentlist;
Line 1849  sub updatestudentassesssheet { Line 1826  sub updatestudentassesssheet {
         }          }
     }      }
     if ($changed) {       if ($changed) { 
         &setformulas($sheet,\%f);           $sheet->{'f'} = \%f;
           &setformulas($sheet); 
     }      }
     &setrowlabels($sheet);      &setrowlabels($sheet);
     #      #
Line 1901  sub loadstudent { Line 1879  sub loadstudent {
     }      }
     $cachedassess='';      $cachedassess='';
     undef %cachedstores;      undef %cachedstores;
     &setformulas($sheet,\%f);      $sheet->{'f'} = \%f;
       &setformulas($sheet);
     &setconstants($sheet,\%c);      &setconstants($sheet,\%c);
 }  }
   
Line 1961  ENDPOP Line 1940  ENDPOP
             }              }
         }          }
     }      }
     &setformulas($sheet,\%f);      $sheet->{'f'}=\%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.123  
changed lines
  Added in v.1.124


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