Thread Hash mit weiterem Hash ergänzen (5 answers)
Opened by Stefan_S at 2018-03-06 11:26

Linuxer
 2018-03-06 11:46
#188092 #188092
User since
2006-01-27
3870 Artikel
HausmeisterIn

user image
Hi,

naja, Du überschreibst die Einträge in %c_artikel für jeden Artikel.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# nun erstelle ich einen Hash mit allen Chargenbeständen
$c_artikel { 1 } = {
        c_id                    => 'Charge_1',
        c_bestand               => 3,
};

#### hiermit wird der vorige Eintrag für "1" überschrieben.
$c_artikel { 1 } = {
        c_id                    => 'Charge_2',
        c_bestand               => 7,
};

$c_artikel { 2 } = {
        c_id                    => 'Charge_1',
        c_bestand               => 9,
};

#### hiermit wird der vorige Eintrag für "2" überschrieben
$c_artikel { 2 } = {
        c_id                    => 'Charge_2',
        c_bestand               => 11,
};



Ein Ansatz wäre, für jeden Artikel die Chargenbestände in einem Array abzulegen.

Code (perl): (dl )
1
2
3
4
5
6
7
# nun erstelle ich einen Hash mit allen Chargenbeständen

push @{ $c_artikel{ 1 } }, { c_id => 'Charge_1', c_bestand => 3, };
push @{ $c_artikel{ 1 } }, { c_id => 'Charge_2', c_bestand => 7, };

push @{ $c_artikel{ 2 } }, { c_id => 'Charge_1', c_bestand => 9, };
push @{ $c_artikel{ 2 } }, { c_id => 'Charge_2', c_bestand => 11, };



Insgesamt auf Basis Deines Beispielcodes:

Code (perl): (dl )
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
use strict;
use warnings;

use Data::Dumper;


# zunächst erstelle ich ein Hash mit allen Artikelbeständen
my %artikel = (
    1 => {
        artikel_nr => 'Artikel_1',
        bestand    => 10,
    },
    2 => {
        artikel_nr => 'Artikel_2',
        bestand    => 20,
    },

);
# in Wirklichkeit füttere ich den Hash über eine Schleife, die Werte kommen aus einer Datenbank

print "Inhalt von \%artikel:\n";
print Dumper ( \%artikel);
print "\n\n";


# die Artikelbestände sind unterteilt in Unterbestände, sog. Chargenbestände; der Gesamtbestand (bestand) ist die Summe der Chargenbestände (c_bestand). Die Chargenbestände lese ich ebenfalls aus der Datenbank ein. Jede Charge ist durch eine ID gekennzeichnet.

my %c_artikel;

# nun erstelle ich einen Hash mit allen Chargenbeständen

push @{ $c_artikel{ 1 } }, { c_id => 'Charge_1', c_bestand => 3, };
push @{ $c_artikel{ 1 } }, { c_id => 'Charge_2', c_bestand => 7, };

push @{ $c_artikel{ 2 } }, { c_id => 'Charge_1', c_bestand => 9, };
push @{ $c_artikel{ 2 } }, { c_id => 'Charge_2', c_bestand => 11, };

# in Wirklichkeit füttere ich den Hash über eine Schleife, die Werte kommen aus einer Datenbank

print "Inhalt von \%c_artikel:\n";
print Dumper ( \%c_artikel);
print "\n\n";


# alles in %artikel aufnehmen

for my $key ( keys %c_artikel ) {
    $artikel{$key}->{ charge } = $c_artikel{$key};
}


{
    $Data::Dumper::Sortkeys = 1;

    print "Neuer Inhalt von \%artikel:\n";
    print Dumper ( \%artikel);
    print "\n\n";
}



Ergebnis für %artikel:
Code: (dl )
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
Neuer Inhalt von %artikel:
$VAR1 = {
'1' => {
'artikel_nr' => 'Artikel_1',
'bestand' => 10,
'charge' => [
{
'c_bestand' => 3,
'c_id' => 'Charge_1'
},
{
'c_bestand' => 7,
'c_id' => 'Charge_2'
}
]
},
'2' => {
'artikel_nr' => 'Artikel_2',
'bestand' => 20,
'charge' => [
{
'c_bestand' => 9,
'c_id' => 'Charge_1'
},
{
'c_bestand' => 11,
'c_id' => 'Charge_2'
}
]
}
};
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread Hash mit weiterem Hash ergänzen