1 2 3 4 5
$tc_artikel{$tc_timestamp}->{$tc_artikel_id}->{$tc_charge_id} = { artikel_nr => $tc_artikel_nr, bestand => $tc_chargenbestand, charge => $tc_charge, }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
'1521033260' => {
'2111' => {
'10' => {
'artikel_nr' => 'AGI15030',
'bestand' => '3120.00',
'charge' => 'RSG'
},
'3' => {
'artikel_nr' => 'AGI15030',
'bestand' => '1450.00',
'charge' => 'Event Management'
}
}
},
'1521033526' => {
'2111' => {
'10' => {
'artikel_nr' => 'AGI15030',
'bestand' => '3150.00',
'charge' => 'RSG'
},
}
},
'1521033630' => {
'2111' => {
'10' => {
'artikel_nr' => 'AGI15030',
'bestand' => '3110.00',
'charge' => 'RSG'
},
'3' => {
'artikel_nr' => 'AGI15030',
'bestand' => '1100.00',
'charge' => 'Event Management'
}
}
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
'2111' => {
'10' => {
'artikel_nr' => 'AGI15030',
'bestand' => '3150.00',
'charge' => 'RSG'
},
'3' => {
'artikel_nr' => 'AGI15030',
'bestand' => '1450.00',
'charge' => 'Event Management'
}
},
},
sort{ byCNr($a) <=> byCNr($b) } sort{ byANr($a) <=> byANr($b) }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
# zunächst erzeugen wir ein sortierbares Array # Achtung es werden Schlüssel hinzugefügt # guck hier daß es keine Konflikte gibt!!! my @slice = (); foreach my $time(keys %$data){ foreach my $anr( keys %{$data->{$time}} ){ my $hunt = $data->{$time}{$anr}; foreach my $cnr(keys %{$hunt}){ my $charge = $data->{$time}{$anr}{$cnr}; $charge->{TIME} = $time; $charge->{ANR} = $anr; $charge->{CNR} = $cnr; push @slice, $charge; } } } # und nun das Array sortieren # nach den gewünschten Kriterien @slice = map{$_->[0]} sort{$a->[2] <=> $b->[2]} # nach Artikel aufsteigend sort{$a->[3] <=> $b->[3]} # nach Charge aufsteigend sort{$b->[4] <=> $a->[4]} # nach Bestand absteigend map{[$_, $_->{TIME}, $_->{ANR}, $_->{CNR}, $_->{bestand}]} @slice; # 0 1 2 3 4 print Dumper \@slice;
1 2 3 4 5 6 7 8
# und nun das Array sortieren @slice = map{$_->[0]} # sort{$a->[2] <=> $b->[2]} # nach Artikel aufsteigend # sort{$a->[3] <=> $b->[3]} # nach Charge aufsteigend sort{$b->[4] <=> $a->[4]} # nach Bestand absteigend map{[$_, $_->{TIME}, $_->{ANR}, $_->{CNR}, $_->{bestand}]} @slice; # 0 1 2 3 4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
$VAR1 = [ { 'ANR' => '2111', 'CNR' => '10', 'TIME' => '1521033526', 'artikel_nr' => 'AGI15030', 'bestand' => '3150.00', 'charge' => 'RSG' }, { 'ANR' => '2111', 'CNR' => '10', 'TIME' => '1521033260', 'artikel_nr' => 'AGI15030', 'bestand' => '3120.00', 'charge' => 'RSG' }, { 'ANR' => '2111', 'CNR' => '10', 'TIME' => '1521033630', 'artikel_nr' => 'AGI15030', 'bestand' => '3110.00', 'charge' => 'RSG' }, { 'ANR' => '2111', 'CNR' => '3', 'TIME' => '1521033260', 'artikel_nr' => 'AGI15030', 'bestand' => '1450.00', 'charge' => 'Event Management' }, { 'ANR' => '2111', 'CNR' => '3', 'TIME' => '1521033630', 'artikel_nr' => 'AGI15030', 'bestand' => '1100.00', 'charge' => 'Event Management' } ]; Prozess erfolgreich beendet.
Quote...wenn du die Daten aus dem Hash erst in ein Array schreibst und dann sortierst, kann ich doch auch gleich ein Array aus der Datenbank erstellen, oder?
hlubenowDas ist eben gerade nicht Dein eigentliches Problem.
Sondern Dein Problem ist eine schlechte und unnötig komplizierte Datenstruktur. Mit der dann auch unnötig schwer umzugehen ist.
1 2 3 4 5
$tc_artikel{$tc_timestamp}->{$tc_artikel_id}->{$tc_charge_id} = { artikel_nr => $tc_artikel_nr, bestand => $tc_chargenbestand, charge => $tc_charge, }
1 2 3 4 5 6 7 8 9
my $separator = "x"; my $artikel_charge = $tc_artikel_id . $separator, $tc_charge_id; push @{ $tc_artikel { $artikel_charge } }, { artikel_nr => $tc_artikel_nr, bestand => $tc_chargenbestand, charge => $tc_charge, };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
'2111x10' => [ { 'artikel_nr' => 'AGI15030', 'bestand' => '3120.00', 'charge' => 'RSG' }, { 'artikel_nr' => 'AGI15030', 'bestand' => '3150.00', 'charge' => 'RSG' }, { 'artikel_nr' => 'AGI15030', 'bestand' => '3110.00', 'charge' => 'RSG' }, ], '2111x3' => [ { 'artikel_nr' => 'AGI15030', 'bestand' => '1450.00', 'charge' => 'Event Management' }, { 'artikel_nr' => 'AGI15030', 'bestand' => '1100.00', 'charge' => 'Event Management' }, ],
QuoteWarum sollte was überschrieben werden ohne Timestamp? Mach doch einfach ein Array aus Hashes.
QuoteUnd warum steht jedesmal wieder die Artikelnummer drin?
QuoteKann so ein "timestamp" aus mehreren Artikel-IDs bestehen?
QuoteIst das nur eine interne Datenstruktur oder wird die irgendwo abgespeichert, weitergegeben, ...?
Quoteaber so steht's in den Quelldaten, auf deren Struktur ich keinen Einfluss habe
2018-03-15T12:28:34 Stefan_SVielleicht habe ich zuviel drumherum geredet.
Mein eigentliches Problem ist: Wie sortiere ich den Hash mehrstufig?