Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 46990042

Von Moritz Bunkus vor fast 10 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
use Carp;
use List::Util qw(max);
use SL::DBUtils ();
use SL::PrefixedNumber;
sub oe_scoping {
......
# therefore we're re-loading the row.
$self->db->dbh->do("LOCK " . $self->meta->table) || die $self->db->dbh->errstr;
my %numbers_in_use = map { ( $_->$number_column => 1 ) } @{ $self->_get_manager_class->get_all(%conditions_for_in_use) };
my ($query_in_use, $bind_vals_in_use) = Rose::DB::Object::QueryBuilder::build_select(
dbh => $self->db->dbh,
select => $number_column,
tables => [ $self->meta->table ],
columns => { $self->meta->table => [ $number_column ] },
query_is_sql => 1,
%conditions_for_in_use,
);
my @numbers = do { no warnings 'once'; SL::DBUtils::selectall_array_query($::form, $self->db->dbh, $query_in_use, @{ $bind_vals_in_use || [] }) };
my %numbers_in_use = map { ( $_ => 1 ) } @numbers;
my $range_table = ($business ? $business : SL::DB::Default->get)->load(for_update => 1);
......
my $sequence = SL::PrefixedNumber->new(number => $start_number // 0);
if (!$fill_holes_in_range) {
my @numbers = map { $_->$number_column } @{ $self->_get_manager_class->get_all(%conditions) };
$sequence->set_to_max(@numbers) ;
}

Auch abrufbar als: Unified diff