Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 5f55d797

Von Moritz Bunkus vor fast 7 Jahren hinzugefügt

  • ID 5f55d797e05b1f29d4d7fbeed0d7b8f67895634c
  • Vorgänger b8a5c591
  • Nachfolger ce89fe5c

CSV-Import: Fix für reflexive Spaltennamen im Mapping

Wenn eine CSV-Datei für den Bank-Import z.B. die Spalten `currency`,
`amount`, `local_bank_number` enthalten, so schlug der Import aus
gleich zwei Gründen fehl, wenn in der CSV-Spaten-Zuordnung die Namen
alle auf sich selber abgebildet wurden, also `current` → `currency`,
`amount` → `amount` und `local_bank_number` → `local_bank_number`.

Untersuchung ergab die folgenden zwei Probleme:

1. Fehlermeldung `cannot bind reference`
2. Fehlermeldung `can't locate object method "local_bank_number" via
package "SL::DB::BankTransaction"`

Es stellte sich heraus, dass beim Speichern der CSV-Spalten in der
Datenbank hier kivitendo gedacht hat, dass diese drei genannten
Spalten auch als Methoden auf den DB-Objekt aufrufbar wären.

Sind sie aber nicht.

Schuld war der Mechanismus, der anhand der vorhandenen
Spaltennamen-Zuordnungen (`$mapping`) und dem vorhandenen
Spaltenprofil (`$profile`) entschieden hat, welche Namen als Methoden
anzuerkennen.

Im konkreten Fall ist es so, dass es sowohl ein solches Mapping als
auch ein solches Profil gibt. In dem Fall darf aber ein Name, der zwar
als Mapping existiert, dessen gemappter Name aber im Profil nicht
existiert, auch nicht als Methodenname aufgefasst und in die `$specs`
aufgenommen werden. Statt dessen muss er als »unbekannte Spalte«
behandelt werden.

Unterschiede anzeigen:

t/helper/csv.t
1
use Test::More tests => 84;
1
use Test::More tests => 86;
2 2

  
3 3
use lib 't';
4 4
use utf8;
......
809 809
is $csv->get_objects->[0]->sellprice, 4.99, 'case insensitive mapping with profile works';
810 810

  
811 811

  
812
# self-mapping with profile
813
$csv = SL::Helper::Csv->new(
814
  file   => \"sellprice\n4,99",        # " # make emacs happy
815
  case_insensitive_header => 1,
816
  profile => [{
817
    profile => { sellprice => 'sellprice_as_number' },
818
    mapping => { sellprice => 'sellprice' },
819
    class  => 'SL::DB::Part',
820
  }],
821
);
822
$csv->parse;
823
is $csv->get_objects->[0]->sellprice, 4.99, 'self-mapping with profile works';
824

  
825
# self-mapping without profile
826
$csv = SL::Helper::Csv->new(
827
  file   => \"sellprice\n4.99",        # " # make emacs happy
828
  case_insensitive_header => 1,
829
  profile => [{
830
    mapping => { sellprice => 'sellprice' },
831
    class  => 'SL::DB::Part',
832
  }],
833
);
834
$csv->parse;
835
is $csv->get_objects->[0]->sellprice, 4.99, 'self-mapping without profile works';
836

  
812 837
# vim: ft=perl
813 838
# set emacs to perl mode
814 839
# Local Variables:
815 840
# mode: perl
816 841
# End:
817

  

Auch abrufbar als: Unified diff