Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 46990042

Von Moritz Bunkus vor mehr als 9 Jahren hinzugefügt

  • ID 46990042df471ed188c89cbb20f966b74e29602d
  • Vorgänger e852b156
  • Nachfolger 0aef653a

SL::DB::Helper::TransNumberGenerator: Belegnummern einmal direkt auslesen

Es werden alle vorhandenen Belegnummern benötigt. Diese wurden bisher so
ausgelesen, dass die Belege vom Rose-Manager via ->get_all komplett
geladen wurden und dann jeweils die Belegnummernspalte davon genommen
wurde. Das ist sehr langsam, vor allem da es potenziell sogar gleich ein
zweites Mal gemacht wurde.

Die Umstellung hier nutzt dafür ein direktes SQL-Query und umgeht Rose
dafür. Außerdem werden die nur einmal ausgelesen.

Unterschiede anzeigen:

SL/DB/Helper/TransNumberGenerator.pm
8 8
use Carp;
9 9
use List::Util qw(max);
10 10

  
11
use SL::DBUtils ();
11 12
use SL::PrefixedNumber;
12 13

  
13 14
sub oe_scoping {
......
81 82
  # therefore we're re-loading the row.
82 83
  $self->db->dbh->do("LOCK " . $self->meta->table) || die $self->db->dbh->errstr;
83 84

  
84
  my %numbers_in_use = map { ( $_->$number_column => 1 ) } @{ $self->_get_manager_class->get_all(%conditions_for_in_use) };
85
  my ($query_in_use, $bind_vals_in_use) = Rose::DB::Object::QueryBuilder::build_select(
86
    dbh                  => $self->db->dbh,
87
    select               => $number_column,
88
    tables               => [ $self->meta->table ],
89
    columns              => { $self->meta->table => [ $number_column ] },
90
    query_is_sql         => 1,
91
    %conditions_for_in_use,
92
  );
93

  
94
  my @numbers        = do { no warnings 'once'; SL::DBUtils::selectall_array_query($::form, $self->db->dbh, $query_in_use, @{ $bind_vals_in_use || [] }) };
95
  my %numbers_in_use = map { ( $_ => 1 ) } @numbers;
85 96

  
86 97
  my $range_table    = ($business ? $business : SL::DB::Default->get)->load(for_update => 1);
87 98

  
......
90 101
  my $sequence       = SL::PrefixedNumber->new(number => $start_number // 0);
91 102

  
92 103
  if (!$fill_holes_in_range) {
93
    my @numbers = map { $_->$number_column } @{ $self->_get_manager_class->get_all(%conditions) };
94 104
    $sequence->set_to_max(@numbers) ;
95 105
  }
96 106

  

Auch abrufbar als: Unified diff