array-Fehler in lx-office

13/09/2008 - 18:44 von Kai-Martin Knaak | Report spam
Hallo.
Seit einem perl Update von v5.8 auf 5.10 treten bei der Buchhaltung
lx-office Fehlfunktionen im perl-Script auf. Es hakt bei der manchen
Zuweisungen von Werten in Arrays. Die Folge ist, dass die Ausgabe von
Rechnungen scheitert. Aus Anwendersicht ist das natürlich katastrophal.
Eine Anfrage in dem Forum von lx-office blieb bisher erfolglos:
http://forum.lx-office.org/board_entry.php?idb32

Da ich einer von den gebissenen Anwendern bin, bin ich motiviert, den Bug
zu finden und zu zerquetschen. Bisher konnte ich in Erfahrung bringen,
dass beim verwandten Programm "SQL-Ledger" àhnliche Symptome mit
Änderungeen in der flogenden art behoben werden konnten:

Zeilen von der Form

push(@{ $form->{lineitems} }, { amount => $linetotal, tax => $form->round_amount($tax, $form->{precision}) });

wurden zu

$tax = $form->round_amount($tax, $form->{precision});
push(@{ $form->{lineitems} }, { amount => $linetotal, tax => $tax });

Leider habe ich keinerlei Erfahrung mit perl und kann nur ahnen,
was hier eigentlich geschieht und warum die alte Zeile zu Fehlern
führt. Anscheinend wird in der zweiten Form die Variable tax getrennt
initialisiert.

Könnt Ihr mich aufklàren, woran ich in der Source Zeilen mit dem
gleichen Problem erkennen kann?

Wenn ich auf Verdacht in der perl source von lx office nach gemeinsamen
Auftreten der push-Funktion mit "=>" suche, dann erhalte ich:

$ grep push *|grep \=\>
AM.pm: push(@{$select}, { "name" => "", "base_unit" => "", "factor" => "", "selected" => "" });
AM.pm: push(@{$select}, { "name" => $unit,
DN.pm: push @{ $form->{DUNNING_PDFS_EMAIL} }, { 'filename' => "${main::spool}/$filename",
DN.pm: push @{ $form->{DUNNING_PDFS_EMAIL} }, { 'filename' => "${main::spool}/$filename",
Form.pm: map({ push(@vars, { "name" => $_, "value" => $self->{$_} })
Form.pm: map { push @ndx, { num => $new->[$_ - 1]->{runningnumber}, ndx => $_ } }
ReportGenerator.pm: push @{ $self->{data} }, { 'type' => 'separator' };
ReportGenerator.pm: push @export_variables, { 'key' => $key, 'value' => $self->{form}->{$key} };

Sind da schon die Problemzeilen dabei?

Welche Änderung von perl 5.8 nach 5.10 ist die Ursache für das Problem?
Gibt es dazu eine Doku?
Ist das womöglich eine FAQ?

Für jede Hilfe dankbar,

<(kaimartin)>
Kai-Martin Knaak
http://lilalaser.de/blog
 

Lesen sie die antworten

#1 Peter J. Holzer
14/09/2008 - 20:12 | Warnen spam
On 2008-09-13 16:44, Kai-Martin Knaak wrote:
Seit einem perl Update von v5.8 auf 5.10 treten bei der Buchhaltung
lx-office Fehlfunktionen im perl-Script auf. Es hakt bei der manchen
Zuweisungen von Werten in Arrays. Die Folge ist, dass die Ausgabe von
Rechnungen scheitert. Aus Anwendersicht ist das natürlich katastrophal.
Eine Anfrage in dem Forum von lx-office blieb bisher erfolglos:
http://forum.lx-office.org/board_entry.php?idb32



Hmm, Debian Sid auf einem Produktivsystem? "Remember: SID Is Dangerous!"

Hier wàre jetzt natürlich die Zeile 145 (samt Umgebung von
SL/Template.pm interessant.

In Zusammenhang mit der Fehlermeldung "Bizarre copy of ARRAY" habe ich
kürzlich etwas gelesen. Offenbar kann man in Perl 5.10 nicht mehr
@{ @a } als Synonym für @{ \@a } schreiben. Aber wozu das gut sein
sollte, ist mir unklar.

Da ich einer von den gebissenen Anwendern bin, bin ich motiviert, den Bug
zu finden und zu zerquetschen. Bisher konnte ich in Erfahrung bringen,
dass beim verwandten Programm "SQL-Ledger" àhnliche Symptome mit
Änderungeen in der flogenden art behoben werden konnten:

Zeilen von der Form

push(@{ $form->{lineitems} }, { amount => $linetotal, tax => $form->round_amount($tax, $form->{precision}) });

wurden zu

$tax = $form->round_amount($tax, $form->{precision});
push(@{ $form->{lineitems} }, { amount => $linetotal, tax => $tax });

Leider habe ich keinerlei Erfahrung mit perl und kann nur ahnen,
was hier eigentlich geschieht und warum die alte Zeile zu Fehlern
führt.



Auch mit Erfahrung mit Perl kann man das nur ahnen, solange man den Code
der Klasse, zu der das Objekt $form gehört, nicht kennt. Wenn
$form->round_amount das macht, was man auf Grund des Namens erwarten
würde, sollten beide Varianten identisch sein.


Anscheinend wird in der zweiten Form die Variable tax getrennt
initialisiert.



Nicht initialisiert, denn das ist $tax offensichtlich schon (einen
uninitialisierten Wert runden zu wollen, wàre wenig sinnvoll). Es wird
sichergestellt, dass $form->round_amount aufgerufen wird, bevor
@{ $form->{lineitems} } evaluiert wird. Wenn das hilft, dann modifiziert
offenbar der Aufruf von $form->round_amount $form->{lineitems}.


Könnt Ihr mich aufklàren, woran ich in der Source Zeilen mit dem
gleichen Problem erkennen kann?



Dazu müsste man erst mal wissen, was das Problem ist. Zielführender ist
es vermutlich, wenn Du Dir die Zeilen, wo das Problem auftritt (also
offenbar Zeile 145 in SL/Template.pm anschaust und gegebenenfalls fixt).


Wenn ich auf Verdacht in der perl source von lx office nach gemeinsamen
Auftreten der push-Funktion mit "=>" suche, dann erhalte ich:



"=>" ist nur eine alternative Schreibweise für ",". Es ist
unwahrscheinlich, dass Du so das Problem findest.


Welche Änderung von perl 5.8 nach 5.10 ist die Ursache für das Problem?



Dazu müsste man erst wissen, was das Problem ist.

Gibt es dazu eine Doku?
Ist das womöglich eine FAQ?



% perldoc -q bizarre
No documentation for perl FAQ keyword `bizarre' found

Schaut nicht so aus.

hp

Ähnliche fragen