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

Ichhalt
 2016-11-22 11:04
#185627 #185627
User since
2016-10-10
30 Artikel
BenutzerIn
[default_avatar]
Danke Raubtier,

das ist mir schon klar und nun nochmal von Anfang an.

Via HTML werden die Parameter des Turniers eingegeben inkl. eines Dateiupload (UTF8, Text, Muster: "HE1234, Name Vorname, Verein").

Daraus wird dann per

shuffel(shuffel(@spieler));

eine zufällige liste erzeugt, aus der wiederum die Paarungen erzeugt werden per

$sp1 = shift(@spieler);
$sp2 = shift(@spieler);

das ist ja auch kein Hexenwerk!

Dann erfolgt eine Ergebniseingabe via HTML welche dann in die DB geschrieben wird und mit einem passenden SELECT eine Tabelle erzeugt wird.

Anhand dieser Tabelle wird @spieler wieder gefüllt - in der Reihenfolge wie die Spieler in der Tabelle stehen.

Per Definition des Schweizer Systems kann ich nun eben FAST einfach wieder mit shift meine Liste abarbeiten.
Leider eben nicht 100%ig - also baute ich einen Test ein, ob in einer der vorherigen Runden die gefundene Paarung schon gespielt hat.
Wenn ja, dann schieb ich den 2ten Spieler wieder in die Liste (unshift) und hole den darauf folgenden Spieler und teste wieder ... solange bis es eben nach unten passt, aber dabei kann es dann eben zu schon angesprochenem Problem kommen, dass eben zum Schluss nur noch 2 Spieler in der Liste sind, die schon gegeneinander spielten und damit funktioniert das Ganze natürlich nicht mehr ...

Ich bräuchte also so gesehen eine Möglichkeit die Paarungen zu erstellen, anhand der Tabelle und dann, weiterhin anhand der Tabellenplatzierung, so zu verschieben, dass das Schweizer System gewahrt bleibt aber es trotzdem aufgeht...

Da im Schweizer System ja im Normalfall mindestens die selbe Rundenanzahl gespielt werden sollte, wie die nötigen Runden anhand der Teilnehmer eines KO Systems, eigentlich ja 2 mehr, müsste sichergestellt werden, dass eben diese Rundenanzahl auch funktioniert ...

Und im Moment hab ich eben keine Idee, da das eben auch für nicht nur 4, 8 oder 16 Spieler sondern auch für 128 oder mehr laufen soll, wie ich das sicherstellen kann...

Die Modalitäten des Schweizer Systems kenn ich und muss ich dahingehend einhalten, dass eben MINDESTENS die gleiche Anzahl Runden wie im KO System gespielt werden.
Es sollte aber möglich sein, sicher mindestens 2 Runden mehr hinzubekommen.

more (30.7kb):

#!/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;
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 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 @asql;

$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);

my @spieler1 = ();
my @spieler2 = ();

while(@spieler)
{
my $sp1 = shift(@spieler);
my $sp2 = shift(@spieler);
$testpaar = testpaarung($sp1,$sp2,$runde);
if($testpaar == 0)
{
push (@asql, "INSERT IGNORE INTO runde$runde (spieler1, spieler2, sperg1, sperg2, sp1avg, sp2avg) VALUES ('$sp1', '$spieler[$ii]', 0, 0, 0, 0);");
#push (@spieler1, $sp1);
#push (@spieler2, $sp2);
}
if($testpaar == 1)
{
unshift(@spieler,$sp2);

for(my $ii = 1;$ii < @spieler;$ii++)
{
$testpaar = testpaarung($sp1,$spieler[$ii],$runde);
if($testpaar == 0)
{
push (@asql, "INSERT IGNORE INTO runde$runde (spieler1, spieler2, sperg1, sperg2, sp1avg, sp2avg) VALUES ('$sp1', '$spieler[$ii]', 0, 0, 0, 0);");
#push (@spieler2, $spieler[$ii]);
splice(@spieler,$ii,1);
last;
}
}
}
}

# INSERT IGNORE INTO runde$runde (spieler1, spieler2, sperg1, sperg2, sp1avg, sp2avg) VALUES ('$sp1', '$sp2', 0, 0, 0, 0);
foreach $sql (@asql)
{
$exe = $dbh->prepare($sql);
$exe->execute() or die $!;
}
$exe->finish;
pdfpaarungen($runde);
eingabe(1,$runde);
}

sub testpaarung
{
my $sp1 = shift;
my $sp2 = shift;
my $runde = shift;
my $testsp = 0;

for(my $i = 1; $i < $runde; $i++)
{
my $testdb = $dbh->prepare("SELECT COUNT(*) FROM runde$i WHERE (spieler1 = '$sp1' AND spieler2 = '$sp2') OR (spieler1 = '$sp2' AND spieler2 = '$sp1');");
$testdb->execute();
$testsp = $testdb->fetchrow_arrayref()->[0];
$exe->finish;
last if($testsp > 0);
}

return($testsp);
}

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;

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");
$platz++;
$y = $y -15;
}
$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();
}

Last edited: 2016-11-22 11:09:32 +0100 (CET)

View full thread Denkfehler in while?