DB-Upgrade: Queries nicht in der Schleife preparen
[kivitendo-erp.git] / sql / Pg-upgrade2 / invoice_positions.pl
1 # @tag: invoice_positions
2 # @description: Spalte für Positionen der Einträge in Rechnungen
3 # @depends: release_3_1_0
4 # @encoding: utf-8
5 package SL::DBUpgrade2::invoice_positions;
6
7 use strict;
8 use utf8;
9
10 use parent qw(SL::DBUpgrade2::Base);
11
12 sub run {
13   my ($self) = @_;
14
15   my $query = qq|ALTER TABLE invoice ADD position INTEGER|;
16   $self->db_query($query);
17
18
19   $query = qq|SELECT * FROM invoice ORDER BY trans_id, id|;
20   my $query2 = qq|UPDATE invoice SET position = ? WHERE id = ?|;
21
22   my $sth = $self->dbh->prepare($query);
23   my $sth2 = $self->dbh->prepare($query2);
24   $sth->execute || $::form->dberror($query);
25
26   # set new position field in order of ids, starting by one for each invoice
27   my $last_invoice_id;
28   my $position;
29   while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
30     if ($ref->{trans_id} != $last_invoice_id) {
31       $position = 1;
32     } else {
33       $position++;
34     }
35     $last_invoice_id = $ref->{trans_id};
36
37     $sth2->execute($position, $ref->{id});
38   }
39   $sth->finish;
40   $sth2->finish;
41
42   $query = qq|ALTER TABLE invoice ALTER COLUMN position SET NOT NULL|;
43   $self->db_query($query);
44
45   return 1;
46 }
47
48 1;