Thread Denkfehler in while? (29 answers)
Opened by Ichhalt at 2016-11-21 08:18

Ichhalt
 2016-11-28 07:25
#185676 #185676
User since
2016-10-10
30 articles
BenutzerIn
[default_avatar]
Hier der ganze Code:
more (32.6kb):

#!/usr/bin/perl
use lib q(/home/turnier/perl5/lib/perl5);
use warnings;
use CGI;
use CGI::Carp qw ( fatalsToBrowser );
use File::Basename;
use PDF::Reuse;
use Unicode::String qw(utf8 latin1);
use List::Util qw(shuffle);
use DBI;

#--------------------------------------------------------------------------------------------------
# Versionsvariablen
#--------------------------------------------------------------------------------------------------
$version = 0;
$uversion = 1;
$tversion = 1;
$copyright = utf8("Turnierverwaltung © R. Meyer 2016 Version $version.$uversion.$tversion");
#--------------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------------

my $normal = 12; # Fontgröße für PDF normal
my $fett = 20; # Fontgröße für PDF FETT
my $cr = 8; # Fontgröße für PDF copyright
my $arial = '/usr/share/fonts/truetype/msttcorefonts/arial.ttf';
my $arialbold = '/usr/share/fonts/truetype/msttcorefonts/Arial_Bold.ttf';
my $logo = "../bilder/HDVlogo.jpg";
my ($tag, $mo, $tt, $time, $year) = split /\s+/, localtime();
my ($std, $min, $sec) = split /:/, $time;

my $anzspieler = 0;
my $anzpaarungen = 0;
my $boardpaar = 0;
my $bo = 0;
my $zuviel = 0; # Anzahl der Spieler die zusätzlich verteilt werden müssen auf bestehende Gruppen
my $spielzeit = 0; # Voraussichtliche Gesamtspielzeit
my $minuten = 15; # Zeit pro Set bei Best of 5

my @tempspieler = ();
my @spieler = ();
my @gruppen = ();
my @spielergruppe = ();

my $q = new CGI;
my $tname = $q->param('Name'); # Name des Turniers für Datenbank und PDF Dateien
my $runden = $q->param('Runden'); # Anzahl der zu spielenden Runden
my $boards = $q->param('Boards'); # Anzahl der Boards die zur Verfügung stehen
my $bof = $q->param('Bo'); # Modus Best of x Legs
my $sub = $q->param('sub'); # Welche Routine aufgerufen werden muss
my $runde = $q->param('Runde');

$runden = 1 if(!$runden);
$boards = 4 if(!$boards);
$bof = 5 if(!$bof);
$sub = "x" if(!$sub);
$bo = $bof-int($bof/2);

eingabe() if($sub eq "eingabe");
schreiben() if($sub eq "schreiben");
runde() if($sub eq "runde");

my $dbh = DBI->connect('dbi:mysql:', 'turnier', 'turnier') or die $!;
$dbh->do("CREATE DATABASE IF NOT EXISTS $tname");
$dbh->disconnect;

my $filenameSP = $q->param("teilnehmer");
my $upload_filehandleSP = $q->upload("teilnehmer");
$CGI::POST_MAX = 1024 * 5000;
my $safe_filename_characters = "a-zA-Z0-9_.-";
my $upload_dir = "../upload";
if ($filenameSP)
{
#--------------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------------
# Dateiupload Teilnehmer
#--------------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------------

my ( $fname, $path, $extension ) = fileparse ( $filenameSP, '..*' );
$filenameSP = $fname . $extension;
$filenameSP =~ tr/ /_/;
$filenameSP =~ s/[^$safe_filename_characters]//g;

if ( !$filenameSP )
{
print $q->header (-charset=>'UTF-8');
print "Es gibt ein Problem beim Hochladen der Datei. (max. Dateigröße: 5MB)";
exit;
}

if ( $filenameSP =~ /^([$safe_filename_characters]+)$/ )
{
$filenameSP = $1;
}
else
{
die "Der Dateiname enthält ungültige Zeichen!";
}

open ( UPLOADFILE, ">$upload_dir/$filenameSP" ) or die "$!";
binmode UPLOADFILE;
while ( <$upload_filehandleSP> )
{
print UPLOADFILE;
}
close UPLOADFILE;


print $q->header (-charset=>'UTF-8', -title=>'Turnierverwaltung &copy; Robert Meyer 2016');
print $q->start_html('Turnierverwaltung Robert Meyer 2016');

print "<p align=center>Turnierverwaltung &copy; Robert Meyer 2016<br>\n";

print "Die Spielerdatei $upload_dir/$filenameSP wurde erfolgreich gespeichert!<br>\n";

open (DATEI, "$upload_dir/$filenameSP") or die $!;
while(<DATEI>)
{
chomp($_);
$string = $_;
push(@tempspieler, $string);
}
close (DATEI);

$dbh = DBI->connect("DBI:mysql:database=$tname", 'turnier', 'turnier', {mysql_enable_utf8 => 1,}) or die $!;
$sql = "CREATE TABLE IF NOT EXISTS teilnehmer(id INT(3) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT, hdv CHAR(6), name VARCHAR(80) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, verein VARCHAR(80) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, PRIMARY KEY(id), UNIQUE KEY id(hdv, name));";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
$exe->finish;

$sql = "CREATE TABLE IF NOT EXISTS abso(id INT(3) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT, spieler VARCHAR(80) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, gegner VARCHAR(80) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, PRIMARY KEY(id));";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
$exe->finish;

$sql = "CREATE TABLE IF NOT EXISTS platz (platz INT(3) UNSIGNED NOT NULL, spieler VARCHAR(80) NOT NULL, wins INT(2) UNSIGNED NOT NULL, losts INT(2) UNSIGNED NOT NULL, winlegs INT(3) UNSIGNED NOT NULL, lostlegs INT(3) UNSIGNED NOT NULL,avg FLOAT(5,2) UNSIGNED NOT NULL, PRIMARY KEY(platz), UNIQUE KEY spieler(spieler));";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
$exe->finish;

foreach (@tempspieler)
{
($hdv,$name,$verein) = split(/,/);
push (@spieler, "$hdv: $name,$verein");
$sql = "INSERT IGNORE INTO teilnehmer (hdv, name, verein) VALUES ('$hdv', '$name', '$verein');";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
}
$exe->finish;

@tempspieler = ();
$sql = "SELECT * FROM teilnehmer;";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
while(@r = $exe->fetchrow_array)
{
push (@tempspieler, "$r[1],$r[2],$r[3]");
}
$exe->finish;

unshift @spieler, utf8("FREILOS") if(@spieler % 2);
$anzspieler = @spieler;
$anzpaarungen = $anzspieler/2;
$boardpaar = $anzpaarungen/$boards;
$spielzeit = $boardpaar*$minuten;

pdfteilnehmer();

@spieler = shuffle(shuffle(@spieler)); # Zweimal kräftig durchmischen
$sql = "CREATE TABLE IF NOT EXISTS runde1 (id INT(3) UNSIGNED AUTO_INCREMENT NOT NULL, spieler1 VARCHAR(80) NOT NULL, spieler2 VARCHAR(80) NOT NULL,sperg1 INT(1) UNSIGNED NOT NULL, sperg2 INT(1) UNSIGNED NOT NULL, sp1avg FLOAT(5,2) UNSIGNED NOT NULL, sp2avg FLOAT(5,2) UNSIGNED NOT NULL, PRIMARY KEY (id), UNIQUE KEY id(id, spieler1, spieler2));";
$exe = $dbh->prepare($sql) or die "SQL Statement weisst Fehler auf! $DBI::errstr";
$exe->execute() or die "$DBI::errstr";
pdftemplate("Paarungen1","Paarungen Runde 1");
for(my $i = 0; $i < $anzpaarungen; $i++)
{
my $sp1 = shift(@spieler);
my $sp2 = pop(@spieler);
$sql = "INSERT IGNORE INTO runde1 (spieler1, spieler2, sperg1, sperg2, sp1avg, sp2avg) VALUES ('$sp1', '$sp2', 0, 0, 0, 0);";
$exe = $dbh->prepare($sql) or die "SQL Statement für Runde 1 weisst Fehler auf! $DBI::errstr";
$exe->execute() or die "$DBI::errstr";
$sql1 = "INSERT INTO abso (spieler, gegner) VALUES ('$sp1', '$sp2');";
$exe = $dbh->prepare($sql1) or die "SQL Statement für abso weisst Fehler auf! $DBI::errstr";
$exe->execute() or die "$DBI::errstr";
}
$exe->finish;
pdfpaarungen(1);
print "<br><br>Kalkulierte Spielzeit bei 15 Minuten/Set ca. $spielzeit Minuten/Board.<br>Die Spielzeit kann variieren und ist nur ein kalkulierter Wert<br><br>\n";
print "<br>Paarungen: $anzpaarungen<br>Boards: $boards<br>Spiele pro Board: $boardpaar<br>Modus Best of $bof<br><br>\n";

print "<form action='./schweiz.pl' method='post' accept-charset='utf-8'><br>\n";
print "<input type='hidden' name='sub' value='eingabe'>\n";
print "<input type='hidden' name='Runde' value=1>\n";
print "<input type='hidden' name='Name' value='$tname'>\n";
print "<p align=center><button type='submit'>Weiter zur Ergebniseingabe</button></p>\n";
print "</form>\n";
print "<p align='center'>\n";
print "<a href='../PDF/Teilnehmerliste$tname$year$mo$tt$std$min$sec.pdf' target='_blank'>PDF Teilnehmerliste</a>\n";
print "<a href='../PDF/Paarungen1.pdf' target='_blank'>PDF Paarungen Runde 1</a>\n";
print "<a href='../PDF' target='_blank'>PDF Druckverzeichnis (Paarungsblätter)</a>\n";
print "</p>\n";

print $q->end_html;
$dbh->disconnect;
exit();
}
#------------------------------------------------------------------------------------------------------------------
#------------------------------------------------------------------------------------------------
#------------------------------------------------------------------------------------------------
# Fertige Routinen
#------------------------------------------------------------------------------------------------
#------------------------------------------------------------------------------------------------

sub runde
{
my @spieler = ();
my @tempspieler = ();
my @asql;
my $i = 0;
$dbh = DBI->connect("DBI:mysql:database=$tname", 'turnier', 'turnier', {mysql_enable_utf8 => 1,}) or die "Verbindungsaufbau zur Datenbank $tname schlug fehl! $DBI::errstr";
$sql = "CREATE TABLE IF NOT EXISTS runde".$runde." (id INT(3) UNSIGNED AUTO_INCREMENT NOT NULL, spieler1 VARCHAR(80) NOT NULL, spieler2 VARCHAR(80) NOT NULL,sperg1 INT(1) UNSIGNED NOT NULL, sperg2 INT(1) UNSIGNED NOT NULL, sp1avg FLOAT(5,2) UNSIGNED NOT NULL, sp2avg FLOAT(5,2) UNSIGNED NOT NULL, PRIMARY KEY (id), UNIQUE KEY id(id, spieler1, spieler2));";
$exe = $dbh->prepare($sql) or die "SQL Statement weisst Fehler auf! $DBI::errstr";
$exe->execute() or die "$DBI::errstr";
$sql = "SELECT spieler FROM tabelle WHERE spieler != 'FREILOS' ORDER BY wins DESC, losts, winlegs DESC, lostlegs, avg DESC;";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
while(@r = $exe->fetchrow_array)
{
push (@spieler, $r[0]);
}
$exe->finish;
splice (@spieler,$runde,0,"FREILOS") if(@spieler % 2);
$z = @spieler / 2;
while($i < $z)
{
$sp1 = shift(@spieler);
$sql = "SELECT * FROM abso WHERE spieler = '$sp1' or gegner = '$sp1'";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
while(@r = $exe->fetchrow_array)
{
if($sp1 eq $r[1])
{
@spieler = grep {$_ ne $r[2]} @spieler if(grep {$_ eq $r[2]} @spieler);
}
if($sp1 eq $r[2])
{
@spieler = grep {$_ ne $r[1]} @spieler if(grep {$_ eq $r[1]} @spieler);
}
}
$exe->finish;
$sp2 = shift(@spieler);
if($sp1 ne $sp2)
{
push(@asql, "INSERT IGNORE INTO runde$runde (spieler1, spieler2, sperg1, sperg2, sp1avg, sp2avg) VALUES ('$sp1', '$sp2', 0, 0, 0, 0);");
push (@asql1, "INSERT INTO abso (spieler, gegner) VALUES ('$sp1', '$sp2');");
push(@tempspieler, $sp1);
push(@tempspieler, $sp2);
$i++;
}
$sql = "SELECT spieler FROM tabelle WHERE spieler != 'FREILOS' ORDER BY wins DESC, losts, winlegs DESC, lostlegs, avg DESC;";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
while(@r = $exe->fetchrow_array)
{
push (@spieler, $r[0]);
}
$exe->finish;
foreach $weg (@tempspieler)
{
@spieler = grep {$_ ne $weg} @spieler if(grep {$_ eq $weg} @spieler);
}
}
foreach $sql (@asql)
{
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
}
$exe->finish;
foreach $sql (@asql1)
{
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
}
$exe->finish;
pdfpaarungen($runde);
eingabe(1,$runde);
}

sub pdfteilnehmer
{
pdftemplate("Teilnehmerliste$tname$year$mo$tt$std$min$sec","Teilnehmerliste $tt. $mo $year $std:$min:$sec");

prAdd("q 31 35 m 31 750 l S Q");
prAdd("q 95 35 m 95 750 l S Q");
prAdd("q 270 35 m 270 750 l S Q");
prAdd("q 550 35 m 550 750 l S Q");
prAdd("q 31 35 m 550 35 l S Q");
prAdd("q 31 750 m 550 750 l S Q");

my $i = 1;
my $hdv;
my $name;
my $verein;
my $z = 0;

my $y = 735;

#------------------------------------------------------------------------------------------------------
# Liste Teilnehmer
#------------------------------------------------------------------------------------------------------
for my $row (@tempspieler)
{
($hdv,$name,$verein) = split(/,/, $row);
$z = $y - 3;
if($y > 30)
{
prText(35, $y, $hdv);
prText(105, $y, $name);
prText(280, $y, $verein);
prAdd("q 31 $z m 550 $z l S Q");
}
else
{
$y = 735;
$z = 732;
pdftemplate("Teilnehmerliste$tname$year$mo$tt$std$min$sec","Teilnehmerliste $tt. $mo $year $std:$min:$sec");
prAdd("q 31 $z m 550 $z l S Q");
prAdd("q 31 35 m 31 750 l S Q");
prAdd("q 95 35 m 95 750 l S Q");
prAdd("q 270 35 m 270 750 l S Q");
prAdd("q 550 35 m 550 750 l S Q");
prAdd("q 31 35 m 550 35 l S Q");
prAdd("q 31 750 m 550 750 l S Q");
prText(35, $y, $hdv);
prText(105, $y, $name);
prText(280, $y, $verein);
}
$y = $y - 15;
$i++;
}

prEnd();
}

sub eingabe
{
my $t = shift;
$runde = 1 if(!$t);
print $q->header (-charset=>'UTF-8', -title=>'Turnierverwaltung &copy; Robert Meyer 2016');
print $q->start_html('Turnierverwaltung Robert Meyer 2016');
print "<p align=center>Turnierverwaltung &copy; Robert Meyer 2016<br>\n";
print "<font size=5><p align=center>Runde $runde</p></font>\n";
print "<form action='./schweiz.pl' method='post' accept-charset='utf-8'><br>\n";
print "<table align=center cellpadding='20' cellspacing='0' border='1'>\n";
print "<tr><td>Spieler 1</td><td>Spieler 2</td><td>Legs 1</td><td> : </td><td>Legs 2</td><td>AVG Spieler 1</td><td>AVG Spieler 2</td></tr>\n";

$dbh = DBI->connect("DBI:mysql:database=$tname", 'turnier', 'turnier', {mysql_enable_utf8 => 1,}) or die "Verbindungsaufbau zur Datenbank $tname schlug fehl! $DBI::errstr";
$sql = "SELECT * FROM runde$runde;";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
while(@r = $exe->fetchrow_array)
{
(my $sp1, my $tmp) = split(/,/ ,$r[1]);
(my $sp2, $tmp) = split(/,/ ,$r[2]);
$z = $r[0];
print "<tr>\n";
print "<td><input type='hidden' name='$r[0]sp1' value='$r[1]'>".utf8($sp1)."</td><td><input type='hidden' name='$r[0]sp2' value='$r[2]'>".utf8($sp2)."</td><td><input maxlenght=1 size=2 name='$r[0]sperg1' required></td>
<td> : </td><td><input maxlenght=1 size=2 name='$r[0]sperg2' required></td><td><input maxlenght=1 size=2 name='$r[0]sp1avg' required></td><td><input maxlenght=1 size=2 name='$r[0]sp2avg' required></td>\n";
print "</tr>\n";
}
$exe->finish;
$dbh->disconnect;

print "</table>\n";
print "<input type='hidden' name='sub' value='schreiben'>\n";
print "<input type='hidden' name='Name' value='$tname'>\n";
print "<input type='hidden' name='Runde' value='$runde'>\n";
print "<input type='hidden' name='Anzahl' value='$z'>\n";
print "<p align=center><button type='submit'>Ergebnisse Runde $runde eintragen</button></p>\n";
print "</form>\n";

print $q->end_html;
exit();
}

sub pdftemplate
{
$pdfname = shift;
$pdftitel = shift;
$pdf = "../PDF/".$pdfname.".pdf";
prFile($pdf);
prTTFont($arial);
prFontSize($cr);
prText(40, 800, latin1($copyright));
prText(40, 25, latin1($copyright));
prFontSize($normal);
my $jpeg = prJpeg($logo, 700, 284);
my $bild = "q\n175 0 0 71 400 750 cm\n/$jpeg Do\nQ\n";
prAdd($bild);
prText(40, 785, $pdftitel);
}

sub schreiben
{
@paranames = $q->param();
$anz = $q->param('Anzahl');

print $q->header (-charset=>'UTF-8', -title=>'Turnierverwaltung &copy; Robert Meyer 2016');
print $q->start_html('Turnierverwaltung Robert Meyer 2016');
print "<p align=center>Turnierverwaltung &copy; Robert Meyer 2016<br>\n";

$dbh = DBI->connect("DBI:mysql:database=$tname", 'turnier', 'turnier', {mysql_enable_utf8 => 1,}) or die $!;

$sql = "CREATE TABLE IF NOT EXISTS tabelle (id INT(3) UNSIGNED NOT NULL AUTO_INCREMENT, spieler VARCHAR(80) NOT NULL, wins INT(2) UNSIGNED NOT NULL, losts INT(2) UNSIGNED NOT NULL, winlegs INT(3) UNSIGNED NOT NULL, lostlegs INT(3) UNSIGNED NOT NULL,avg FLOAT(5,2) UNSIGNED NOT NULL, PRIMARY KEY(id), UNIQUE KEY spieler(spieler));";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
$exe->finish;

$sql = "CREATE TABLE IF NOT EXISTS platz (platz INT(3) UNSIGNED NOT NULL, spieler VARCHAR(80) NOT NULL, wins INT(2) UNSIGNED NOT NULL, losts INT(2) UNSIGNED NOT NULL, winlegs INT(3) UNSIGNED NOT NULL, lostlegs INT(3) UNSIGNED NOT NULL,avg FLOAT(5,2) UNSIGNED NOT NULL, PRIMARY KEY(platz), UNIQUE KEY spieler(spieler));";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
$exe->finish;

if($runde > 1)
{
$sql = "CREATE TABLE IF NOT EXISTS runde$runde (id INT(3) UNSIGNED AUTO_INCREMENT NOT NULL, spieler1 VARCHAR(80) NOT NULL, spieler2 VARCHAR(80) NOT NULL,sperg1 INT(1) UNSIGNED NOT NULL, sperg2 INT(1) UNSIGNED NOT NULL, sp1avg FLOAT(5,2) UNSIGNED NOT NULL, sp2avg FLOAT(5,2) UNSIGNED NOT NULL, PRIMARY KEY (id), UNIQUE KEY id(id, spieler1, spieler2));";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
$exe->finish;
}
my $i = 0;
my $wins1;
my $wins2;
my $losts1;
my $losts2;
my $winlegs1;
my $lostlegs1;
my $winlegs2;
my $lostlegs2;

for(my $ii = 1; $ii <= $anz; $ii++) # Plausibilitätsprüfung
{
$wins1 = 0;
$wins2 = 0;
$losts1 = 0;
$losts2 = 0;
my $spieler1 = $q->param($paranames[$i]);
my $spieler2 = $q->param($paranames[$i+1]);
my $legs1 = $q->param($paranames[$i+2]);
my $legs2 = $q->param($paranames[$i+3]);
my $avg1 = $q->param($paranames[$i+4]);
my $avg2 = $q->param($paranames[$i+5]);


if($spieler1 eq "FREILOS")
{
$legs1 = 0;
$avg1 = 0;
$legs2 = $bo;
}

if($spieler2 eq "FREILOS")
{
$legs2 = 0;
$avg2 = 0;
$legs1 = $bo;
}


if($legs1 > $legs2)
{
$wins1 = 1;
$losts2 = 1;
}
if($legs1 < $legs2)
{
$wins2 = 1;
$losts1 = 1;
}

$sql = "UPDATE IGNORE runde".$runde." SET sperg1 = $legs1, sperg2 = $legs2, sp1avg = '$avg1', sp2avg = '$avg2' WHERE id = $ii;";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
$exe->finish;

my $testdb = $dbh->prepare("SELECT COUNT(*) FROM tabelle WHERE spieler = '$spieler1';");
$testdb->execute();
my $testsp1 = $testdb->fetchrow_arrayref()->[0];
$exe->finish;
$testdb = $dbh->prepare("SELECT COUNT(*) FROM tabelle WHERE spieler = '$spieler2';");
$testdb->execute();
my $testsp2 = $testdb->fetchrow_arrayref()->[0];
$exe->finish;

my $id = 0;
my $rnd = $runde - 1 if($runde > 1);

if($testsp1 == 1 && $testsp2 == 1)
{
$sql = "SELECT * FROM tabelle WHERE spieler = '$spieler1';";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
while(@r = $exe->fetchrow_array)
{
$id = $r[0];
$wins1 = $wins1 + $r[2];
$losts1 = $losts1 + $r[3];
$winlegs1 = $legs1 + $r[4];
$lostlegs1 = $legs2 + $r[5];
if($spieler1 eq "FREILOS")
{
$avg1 = 0;
}
elsif($spieler2 eq "FREILOS")
{
$avg1 = (($r[6] * $rnd) + $r[6])/$runde;
}
else
{
$avg1 = (($r[6] * $rnd) + $avg1)/$runde;
}
}
$exe->finish;
$sql = "UPDATE IGNORE tabelle SET wins = $wins1, losts = $losts1, winlegs = $winlegs1, lostlegs = $lostlegs1, avg = $avg1 WHERE id = $id;";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
$exe->finish;

$sql = "SELECT * FROM tabelle WHERE spieler = '$spieler2';";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
while(@r = $exe->fetchrow_array)
{
$id = $r[0];
$wins2 = $wins2 + $r[2];
$losts2 = $losts2 + $r[3];
$winlegs2 = $legs2 + $r[4];
$lostlegs2 = $legs1 + $r[5];
if($spieler2 eq "FREILOS")
{
$avg2 = 0;
}
elsif($spieler1 eq "FREILOS")
{
$avg2 = (($r[6] * $rnd) + $r[6])/$runde;
}
else
{
$avg2 = (($r[6] * $rnd) + $avg1)/$runde;
}
}
$exe->finish;
$sql = "UPDATE IGNORE tabelle SET wins = $wins2, losts = $losts2, winlegs = $winlegs2, lostlegs = $lostlegs2, avg = $avg2 WHERE id = $id;";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
$exe->finish;
}

if($testsp1 == 0 && $testsp2 == 0)
{
$sql = "INSERT IGNORE INTO tabelle (spieler, wins, losts, winlegs, lostlegs, avg) VALUES ('$spieler1', '$wins1', '$losts1', '$legs1', '$legs2', '$avg1');";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
$exe->finish;
$sql = "INSERT IGNORE INTO tabelle (spieler, wins, losts, winlegs, lostlegs, avg) VALUES ('$spieler2', '$wins2', '$losts2', '$legs2', '$legs1', '$avg2');";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
$exe->finish;
}
$i = $i + 6;
}
$exe->finish;

pdftemplate("Tabelle_Runde_$runde $std:$min","Tabelle Runde $runde Schweizer System");
$sql = "SELECT * FROM tabelle WHERE spieler != 'FREILOS' ORDER BY wins DESC, losts, winlegs DESC, lostlegs, avg DESC;";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
print "<p align='center'> Tabelle Runde $runde </p>\n";
print "<table align=center cellpadding='20' cellspacing='0' border='1'>\n";
print "<tr><td>Name</td><td>Gewonnen</td><td>Verloren</td><td>Legs</td><td>Average</td><td>Platzierung</td></tr>\n";
my $platz = 1;
prAdd("q 31 726 m 577 726 l S Q"); # oben quer
prAdd("q 31 708 m 577 708 l S Q"); # oben quer
prAdd("q 31 711 m 577 711 l S Q"); # oben quer
prAdd("q 31 35 m 577 35 l S Q"); # unten quer
prAdd("q 31 35 m 31 726 l S Q"); # vorne senkrecht
prAdd("q 577 35 m 577 726 l S Q"); # hinten senkrecht
$y = 715;
$z = $y - 8;
prText(35, $y, "Spieler");
prText(400, $y, "Win");
prText(430, $y, "Lost");
prText(465, $y, "Legs");
prText(500, $y, "Average");
prText(549, $y, "Platz");
$y = $y - 20;
while(@r = $exe->fetchrow_array)
{
$z = $z - 15;
print "<tr><td>".utf8($r[1])."</td><td>$r[2]</td><td>$r[3]</td><td>$r[4] : $r[5]</td><td>$r[6]</td><td>$platz</td></tr>\n";
($spieler,$tmp) = split(/,/ ,$r[1]);
$tmp = "";
prText(35, $y, $spieler);
prText(410, $y, $r[2]);
prText(440, $y, $r[3]);
prText(470, $y, "$r[4]:$r[5]");
prText(510, $y, $r[6]);
prText(560, $y, $platz);
prAdd("q 31 $z m 577 $z l S Q");
push(@asql, "INSERT IGNORE INTO platz (platz, spieler, wins, losts, winlegs, lostlegs, avg) VALUES ('$platz', '$r[1]', '$r[2]', '$r[3]', '$r[4]', '$r[5]', '$r[6]');");
$platz++;
$y = $y -15;
}
$exe->finish;

$sql = "TRUNCATE TABLE platz;";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;

foreach $sql (@asql)
{
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
}
$exe->finish;

prEnd();
pdfergebnisse($runde);
my $r = $runde;
$runde++;
print "</table>\n";
print "<form action='./schweiz.pl' method='post' accept-charset='utf-8'><br>\n";
print "<input type='hidden' name='sub' value='runde'>\n";
print "<input type='hidden' name='Name' value='$tname'>\n";
print "<input type='hidden' name='Runde' value='$runde'>\n";
print "<p align=center><button align='center' type='submit'>Nächste Runde</button></p>\n";
print "</form>\n";
print "<p align='center'>\n";
print "<a href='../PDF' target='_blank'>PDF Druckverzeichnis</a>\n";
print "<a href='../PDF/Tabelle_Runde_$r $std:$min.pdf'>Tabelle Runde $r</a>\n";
print "<a href='../PDF/Ergebnisse_Runde_$r.pdf'>Ergebnisse Runde $r</a>\n";
print "</p>\n";
print $q->end_html;

}

sub pdfpaarungen
{
my $runde = shift;
pdftemplate("Paarungen$runde","Paarungen Runde $runde");
$dbh = DBI->connect("DBI:mysql:database=$tname", 'turnier', 'turnier', {mysql_enable_utf8 => 1,}) or die $!;
$sql = "SELECT * FROM runde$runde;";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
$y = 713;
while(@r = $exe->fetchrow_array)
{
($spieler1,$tmp) = split(/,/ ,$r[1]);
($spieler2,$tmp) = split(/,/ ,$r[2]);
prAdd("q 31 726 m 577 726 l S Q"); # oben quer
prAdd("q 31 35 m 577 35 l S Q"); # unten quer
prAdd("q 31 35 m 31 726 l S Q"); # vorne senkrecht
prAdd("q 577 35 m 577 726 l S Q"); # hinten senkrecht
$tmp = "";
$z = $y - 5;
prText(35, $y, $spieler1);
prText(250, $y, "vs");
prText(300, $y, $spieler2);
prAdd("q 31 $z m 577 $z l S Q");
$y = $y - 17;
}
prEnd();

$dbh = DBI->connect("DBI:mysql:database=$tname", 'turnier', 'turnier', {mysql_enable_utf8 => 1,}) or die $!;
$sql = "SELECT * FROM runde$runde;";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
while(@r = $exe->fetchrow_array)
{
($spieler1,$tmp) = split(/,/ ,$r[1]);
($spieler2,$tmp) = split(/,/ ,$r[2]);
pdftemplate("Paarung$r[0]Runde$runde","Paarung $r[0] Runde $runde");
prTTFont($arialbold);
prFontSize($fett);
prText(35, 700, $spieler1);
prAdd("q 31 680 m 577 680 l S Q"); # oben quer
prText(35, 600, $spieler2);
prAdd("q 31 580 m 577 580 l S Q"); # oben quer
prEnd();
}

}

sub pdfergebnisse
{
my $runde = shift;
pdftemplate("Ergebnisse_Runde_$runde","Ergebnisse Runde $runde");
$dbh = DBI->connect("DBI:mysql:database=$tname", 'turnier', 'turnier', {mysql_enable_utf8 => 1,}) or die $!;
$sql = "SELECT * FROM runde$runde;";
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
$y = 713;
prText(35, $y, "Spieler 1");
prText(240, $y, "vs");
prText(260, $y, "Spieler 2");
prText(440, $y, "Ergebnis");
prText(500, $y, "Average");
prAdd("q 31 708 m 577 708 l S Q");
prAdd("q 31 707 m 577 707 l S Q");
$y = $y - 20;
while(@r = $exe->fetchrow_array)
{
($spieler1,$tmp) = split(/,/ ,$r[1]);
($spieler2,$tmp) = split(/,/ ,$r[2]);
prAdd("q 31 726 m 577 726 l S Q"); # oben quer
prAdd("q 31 35 m 577 35 l S Q"); # unten quer
prAdd("q 31 35 m 31 726 l S Q"); # vorne senkrecht
prAdd("q 577 35 m 577 726 l S Q"); # hinten senkrecht
$tmp = "";
$z = $y - 5;
prText(35, $y, $spieler1);
prText(240, $y, "vs");
prText(260, $y, $spieler2);
prText(440, $y, "$r[3] : $r[4]");
prText(500, $y, "$r[5] : $r[6]");
prAdd("q 31 $z m 577 $z l S Q");
$y = $y - 17;
}
prEnd();
}


Das Nachher ist an der Stelle nicht wichtig bedingt durch das Schweizer System.
Im Endeffekt kann ich jetzt mit diesem Code ein Round Robin veranstalten durch die Anzahl der Runden - was aber ja nicht gewünscht ist durch eben das System.
Es geht ja darum mit wenigen Runden eine gute Übersicht der Leistungsstärke zu bekommen ... je mehr Runden gespielt werden, um so detailierter wird der mittlere Bereich der Tabelle aber oben und unten verändert sich kaum noch was ...

Wenn Du da noch genauere Fragen hast, schick mir doch ne PN...

LG
Ichhalt

View full thread Denkfehler in while?