Schrift
[thread]60[/thread]

Auswahlisten aus DB erzeugen

Leser: 1


<< >> 8 Einträge, 1 Seite
Ronnie
 2003-10-16 11:20
#5606 #5606
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Moin, ich suche eine Idee/Snippet für folgende Problemstellung. Ich möchte in einer Auswahlliste alle Felder (ca. 20) einer Tabelle darstellen, aber nur bestimmte auswählen.

Meine DB sieht so aus:
Mitarbeiter -> nutzt_Software -> Software

Es handelt sich also um eine aufgelöste m:n-Beziehung (1:n, n:1). Ich will alle Produkte aus Software darstellen, aber nur die highlighten die in nutzt_Software für einen bestimmten Mitarbeiter vorkommt.

Hat jemand unter euch schon mal sowas gemacht, und könnte ein Snippet posten?

Gruss,
Ronnie
Ronnie
 2003-10-16 12:30
#5607 #5607
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
hier steppt ja wieder der Bär ;). Okay, was haltet ihr von meinem Entwurf:

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
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/usr/bin/perl -w

use strict;
use warnings;
use DBI;

my ($dbh, $sth);
my %software;
my @installed;
my $iid = '1'; # Inventar-ID

# main

$dbh = &connect();

&fetch_software();
&fetch_installed($iid);
&html_selection();

$dbh->disconnect();
exit(0);

# subs

sub is_in {

# is_in gibt die Anzahl an Übereinstimmungen eines Elementes
# zu einer Menge in einem Array zurück.

my $test = shift @_;
my @in = @_;
my $answer = 0;
for (@in) {
$answer++ if ($test eq $_);
}
return $answer;
}

sub connect {
return DBI->connect ("DBI:mysql:host=192.168.0.1;database=meine",
"ich", "geheim", {PrintError => 0, RaiseError => 1});
}

sub fetch_installed {

my $iid = shift @_;
$sth = $dbh->prepare (" SELECT SOID
FROM nutzt_software
WHERE IID = $iid
");

$sth->execute();
while (my ($soid) = $sth->fetchrow_array()) { push @installed, $soid; }
$sth->finish();
}

sub fetch_software {

$sth = $dbh->prepare (" SELECT SOID, Produkt
FROM Software ");
$sth->execute();

while (my ($soid, $produkt) = $sth->fetchrow_array()) {
$software{$soid}=$produkt;
}
$sth->finish();
}

sub html_selection {
print "<select name='Installationen'>\n";
for (sort(keys(%software))) {
if (&is_in($_, @installed)) {
print "<option selected>$software{$_}</option>\n";
} else {
print "<option>$software{$_}</option>\n";
}
}
print "</select>\n";
}


Gruss,
Ronnie
format_c
 2003-10-16 13:04
#5608 #5608
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Quote
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
sub html_selection {
print "<select name='Installationen'>\n";
for (sort(keys(%software))) {
if (&is_in($_, @installed)) {
print "<option selected>$software{$_}</option>\n";
} else {
print "<option>$software{$_}</option>\n";
}
}
print "</select>\n";
}

Das kann man ganz elegant mit CGI machen:
Bsp.:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use CGI qw/:all/;
my %software = qw/ldms LanDeskManagement sap SAP_GUI_6.2 notes LotusNotes/;
my @installed = qw/ldms notes/;
my $select = scrolling_list(-name=>'Installationen',
-multiple=>1,
-values=>[sort keys %software],
-default=>[@installed],
-labels=>\%software
);

print $select;
_ _ END _ _
<select name="Installationen" size="3" multiple="multiple">
<option selected="selected" value="ldms">LanDeskManagement</option>
<option selected="selected" value="notes">LotusNotes</option>
<option value="sap">SAP_GUI_6.2</option>
</select>


Gibts noch viel mehr geile Sache in perldoc CGI.
Man muss es nur nutzen ;)

Gruß Alex
Ronnie
 2003-10-16 13:19
#5609 #5609
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Danke, das ist schon mal eine Verbesserung. Ich sollte wirklich mal die CGI.pm Doku lesen.

Gruss,
Ronnie
Ronnie
 2003-10-16 14:18
#5610 #5610
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
@format_c: Ich habe noch ein Sortierproblem mit meinem Hash. Die Keys sind ja die IDs. Ich möchte aber die Sortierung nach den Werten/Bezeichnern der Produkte?\n\n

<!--EDIT|Ronnie|1066299522-->
Ronnie
 2003-10-16 15:02
#5611 #5611
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Eine Möglichkeit sieht so aus:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl -w

use strict;
use warnings;

my %hash = ( 1=>'Acrobat', 2=>'Notes', 3=>'CorelDraw' );
my @array;

for (keys(%hash)) { push @array, "$hash{$_}#$_"; }
for (sort(@array)) {
m/(\w+)\#(\d+)/;
print "<option value='$2'>$1</option>\n";
}


Das macht mich aber nicht wirklich glücklich.

Gruss,
Ronnie
format_c
 2003-10-16 16:41
#5612 #5612
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Du möchtest also die Keys nach den Values sortiert haben?
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use strict;
use CGI qw/:all/;
my %software = qw/2 LanDeskManagement 3 SAP_GUI_6.2 1 LotusNotes/;
my @installed = qw/3 2/;
my $select = scrolling_list(-name=>'Installationen',
                           -multiple=>1,
                           -values=>[sort {$software{$a} cmp $software{$b}} keys %software],
                           -default=>[@installed],
                           -labels=>\%software
                           );

print $select;
_ _ END _ _
<select name="Installationen" size="3" multiple="multiple">
<option selected="selected" value="2">LanDeskManagement</option>
<option value="1">LotusNotes</option>
<option selected="selected" value="3">SAP_GUI_6.2</option>
</select>

Meinst du so?

Gruß Alex\n\n

<!--EDIT|format_c|1066308217-->
Ronnie
 2003-10-16 17:04
#5613 #5613
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Auf den ersten Blick: Genial!
Das sieht passend aus. Danke!
<< >> 8 Einträge, 1 Seite



View all threads created 2003-10-16 11:20.