Revision 46990042
Von Moritz Bunkus vor mehr als 9 Jahren hinzugefügt
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
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.