perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 31
Click for quality!




11.02.2012 / 12:47

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragDifficult
Seitenanfang
Das ist der Quelltext
Das Problem ist im unteren Bereich
Die Ausgabe des Unterricht Arrays geht nicht.

Ich habe die Stelle mit einem Kommentar versehen.

ich entschuldige mich wür die schlechte Formatierung

#!/usr/bin/perl -w

require('config.pl'); # Konfigurations-Datei laden
require('init.pl'); # werte an Skript anpassen
require('privateSubs.pl'); # für dateSearch(), actWeek()

$MAX_STUNDE = 16; # max. Stundenanzahl am Tag
$MAX_TAG = 6; # Schultage pro Woche

@date = &dateSearch($DATE_DB); # holen der "Datums"
my($aktWoche) = &actWeek($DATE_DB, @date); # holen der aktuellen Wochennummer

read (STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
#$query_string = "Klasse=1BFF1&schulwoche=2"; # <- Debug-Query

$query_string = &QueryHexToChar($query_string);

my($kategorie, $suchbegriff, $schulwoche) = ($query_string =~ /(.*)=(.*)&schulwoche=(.*)/g);

if(!defined($suchbegriff)) # wenn der Suchbegriff leer ist (kam bei den Daten
{$suchbegriff = ""} # aus dem Schuljahr 2003-2004 vor) wird '$suchbegriff
# ein leerer String zugewiesen. (ansonsten mekert Perl!)

&dataSearch($kategorie, $suchbegriff, $schulwoche); # Daten suchen

#&pdfdruck($kategorie, $suchbegriff, $schulwoche);

&printTimetable($kategorie, $schulwoche, $suchbegriff, $aktWoche);# Stundenplan ausgeben

exit(0); # Programmende

################################################################################
# validWk() - Prüft ob eine bestimmte Woche in einer Wochenkennug vorkommt. #
# #
# Parameter: Wochenkennung, Schulwochennummer #
# Rückgabewert: 0 wenn die Woche nicht vorkommt, #
# 1 wenn sie vorkommt. #
################################################################################
sub validWk {
my($gesWk, $woche) = @_;
my($valid) = 0;

open(INFILE2, "<" . $WK_DB) or
die "Die Unterroutine 'validWk()' im Perl-Skript $0 konnte die Datei".
" $WK_DB nicht oeffnen!\n";

$zeile = <INFILE2>; # Erste Zeile überspringen.

my(@wochen);

while(<INFILE2>) {
# Werte vorbereiten:
$zeile = $_;
chomp($zeile);
$zeile =~ s/("|')//g; # Ansonsten kann der Browser das
# als "Zeicheketten-Ende"-Markierung,..
# interpretieren.
my(@datensatz) = split(/;/, $zeile);

my($aktWk) = $datensatz[$WK_DB_WOCHENKENNUNG_SPALTE];
substr($aktWk,0,1) = ""; # 'K' entfernen

if($aktWk eq $gesWk) {
@wochen = split(/,/, $datensatz[$WK_DB_WOCHEN_SPALTE]);
last;
}
}#while
close(INFILE2);

# gucken ob Woche vorhanden
foreach(@wochen) {
if($_ == $woche) {
$valid = 1;
last;
}
}#foreach

return($valid);
}

################################################################################
# dataSearch() - Durchsucht die Stunden-Datenbank nach allen Fächern, Räumen, #
# Lehrern bzw. Klassen, Gruppen und Wochenkennungen #
# eines bestimmten Lehrers, Raumes oder einer Klasse, und #
# schreibt die Daten in ein 4 Dimensionales Array '@unterricht'.#
# #
# Parameter: Kategorie (Klasse, Raum oder Lehrer) #
# Suchbegriff (z.B. 2BKI2) #
# Schulwoche (1-... oder "alle") #
# Rückgabewert: Keiner #
################################################################################
sub dataSearch {
my($kategorie , $suchbegriff, $schulwoche) = @_;

my($spalte) = 0;

# festlegen in welcher Spalte der Suchbegriff liegt
if($kategorie eq "Lehrer") { $spalte = $ST_DB_LEHRERKUERZEL_SPALTE }
elsif($kategorie eq "Klasse") { $spalte = $ST_DB_KLASSE_SPALTE }
elsif($kategorie eq "Raum") { $spalte = $ST_DB_RAUM_SPALTE }
else {
die "Die Unterroutine 'dataSearch()' im Perl-Skript $0 hat ungueltige".
" Daten erhalten!\n";
}

open(INFILE1, "<" . $ST_DB) or
die "Die Unterroutine 'dataSearch()' im Perl-Skript $0 konnte die Datei".
" $ST_DB nicht oeffnen!\n";

$zeile = <INFILE1>; # Erste Zeile überspringen.

while(<INFILE1>) {
$zeile = $_;
chomp($zeile);
$zeile =~ s/("|')//g; # amsonsten kann der Browser dies
# als "Zeichenketten-Ende"-Markierung
# interpretiern -> macht große Probleme
# wenn sowas innerhalb von Javascript
# (-Aufrufen) vorkommt.
my(@datensatz) = split(/;/, $zeile);
if($datensatz[$spalte] eq $suchbegriff) {
my($wk) = $datensatz[$ST_DB_WOCHENKENNUNG_SPALTE];

if($schulwoche eq "alle" or &validWk($wk, $schulwoche)) {
my($eintrag) = 0;
my($tag) = $datensatz[$ST_DB_TAG_SPALTE]; # Tag & Stunde rausfiltern
my($stunde) = $datensatz[$ST_DB_STUNDE_SPALTE];

# ein bisschen was zu Zeigern und mehrdemensionalen Arrays ;-)
# (Da Perl eine inteligente Speicherverwaltung hat, kann man schon mal
# Elemente leer lassen, also macht das nichts wenn ich sage:
# $unterricht[$stunde][$tag] = ...
# Dadurch würde man bei anderen Programmiersprachen Speicher verschenken.
push(@{$unterricht[$stunde][$tag]}, [$datensatz[$ST_DB_RAUM_SPALTE], # - Raum
$datensatz[$ST_DB_FACH_SPALTE], # - Fach
$datensatz[$ST_DB_LEHRERKUERZEL_SPALTE],# - Lehrer
$datensatz[$ST_DB_KLASSE_SPALTE], # - Klasse
$datensatz[$ST_DB_GRUPPE_SPALTE], # - Gruppe
$wk]); # - Wochenkennung
}#if
}#if
}#while
close(INFILE1); # Datenbank wieder schließen
}
################################################################################
# #
# PDFDRUCK() Erstellen der PDF-Datei #
# . # # #
# #
################################################################################
sub pdfdruck
{
use PDF::Create;
use strict;
use CGI::Carp qw(fatalsToBrowser);

my $ipaddr = $ENV{'REMOTE_ADDR'}; # Speichern der IP-Adresse
my $sta = 71;
my $wta = 134;

# neue PDF-Datei erzeugen, Dateiname = SPLAN(IP-Adresse).pdf (z.B. SPLAN158.122.181.59.pdf)
my $pdf = new PDF::Create('filename' => "SPLAN$ipaddr.pdf",
'Version' => 1.2,
'PageMode' => 'UseOutlines',
'Author' => '_Projekt_Author',
'Title' => '_Projekt_Titel');

#'a4' => [ 0, 0, 595, 842 ]
my $root = $pdf->new_page('MediaBox' => [ 0, 0, 842, 595 ]);

# Fuege eine neue Seite hinzu, die ihre Attribute von $root erhaelt
my $page = $root->new_page;

# Definieren von 2 Schriftarten/Formatierungen
# Schriftart 1 - Helvetica - Typ 1 - WinANSIEcoding
my $f1 = $pdf->font('Subtype' => 'Type1',
'Encoding' => 'WinAnsiEncoding',
'BaseFont' => 'Helvetica');
# Schriftart 2 - Helvetica (fett) - Typ 1 - WinANSIEncoding
my $f2 = $pdf->font('Subtype' => 'Type1',
'Encoding' => 'WinAnsiEncoding',
'BaseFont' => 'Helvetica-Bold');

# Definieren einer Tabelle mit Inhalt
my $toc = $pdf->new_outline('Title' => 'Document',
'Destination' => $page);
$toc->new_outline('Title' => 'Section 1');

my $s2 = $toc->new_outline('Title' => 'Section 2',
'Status' => 'closed');
$s2->new_outline('Title' => 'Subsection 1');

#Ueberschrift
$page->stringc($f2, 16, 400, 570,"SPlan");

#Wochentage
$page->stringc($f2, 12, $wta*0 + 88, 550,"Mo");
$page->stringc($f2, 12, $wta*1 + 88, 550,"Di");
$page->stringc($f2, 12, $wta*2 + 88, 550,"Mi");
$page->stringc($f2, 12, $wta*3 + 88, 550,"Do");
$page->stringc($f2, 12, $wta*4 + 88, 550,"Fr");
$page->stringc($f2, 12, $wta*5 + 88, 550,"Sa");

#Umrandung der Wochentage Endx,Endy,Anfangx,Anfangsy
for(my $k = 0;$k < 6;$k++)
{
$page->line($k * $wta + 25,547,$k * $wta + 25,563);
$page->line($k * $wta + 155,547,$k * $wta + 25,547);
$page->line($k * $wta + 155,563,$k * $wta + 155,547);
$page->line($k * $wta + 25,563,$k * $wta + 155,563);
}

#Studenanzahl
for(my $i = 0;$i < 6;$i++)
{
$page->stringc($f2, 10, 10, 507 - ($i * $sta), "$i"+1);
}

#Umrandung der Stundennummerierung
for(my $m = 0;$m < 6;$m++)
{
$page->line(4,472 - ($m * $sta),4,540 - ($m * $sta)); #linke linie horizontal
$page->line(16,472 - ($m * $sta),4,472 - ($m * $sta));#untere linie vertikal
$page->line(16,540 - ($m * $sta),16,472 - ($m * $sta));#rechte linie horizontal
$page->line(4,540 - ($m * $sta),16,540 - ($m * $sta));#obere linie vertikal
}

# Umrandung des Inhalts
for(my $p = 0;$p < 6;$p++)
{
for(my $o = 0;$o < 6;$o++)
{
$page->line($o * $wta + 25,472 - ($p * $sta),$o * $wta + 25,540 - ($p * $sta));
$page->line($o * $wta + 155,472 - ($p * $sta),$o * $wta + 25,472 - ($p * $sta));
$page->line($o * $wta + 155,540 - ($p * $sta),$o * $wta + 155,472 - ($p * $sta));
$page->line($o * $wta + 25,540 - ($p * $sta),$o * $wta + 155,540 - ($p * $sta));
}
}

#Ausfuellen der Felder
$page->stringc($f1, 10,10,250,"$kategorie, $suchbegriff, $schulwoche");

# Copyright
$page->stringc($f1, 12,500,100,'by Fabien Tassin <fta@sofaraway.org>dddd');

# Hinzufuegen einer neuen Seite
my $page2 = $root->new_page;
$page2->line(0, 0, 842, 595);
$page2->line(0, 595, 842, 0);

$toc->new_outline('Title' => 'Section 3');
$pdf->new_outline('Title' => 'Summary');

# Hinzufuegen der fehlenden PDF-Objekte, Footer und Schliessen der Datei
$pdf->close;
}
################################################################################
# gMeDates() - Gibt ein Array mit den 'Datums' der übergebenen Woche #
# zB.: "Mo 06.02.04 | Di 07.02.04 | ..." zurück. #
# #
# Parameter: Wochennummer #
# Rückgabewert: Array mit 6 Elementen jeweils Strings mit #
# Datum #
################################################################################
sub gMeDates {
my($week) = shift(@_);
my(@day) = ("Mo","Di","Mi","Do","Fr","Sa");

# Da die Schulwochen beginnend bei 1 übergeben werden, muss ich für das
# Skript '$week' um 1 "erniedrigen. Das geht am fixesten so:
if($week-- ne "alle") { # Wenn Schulwoche != "alle" hänge an die Werte des
# Arrays '@day' die zugegörigen "Datums"
# ansonsten belasse das Array, so wie es ist.
my($ctr) = 0; # ctr steht für "counter"
foreach(@day) {
$_ = sprintf("%s %s", $_ , $date[$week][$ctr++]);
substr($_,9,2)=""; # Jahr in Format: jj statt jjjj
}#for
}#if
return(@day);
}

################################################################################
# printTimetable() - Gibt die Unterrichtsdaten in '@unterricht' in einem #
# Stundenplan aus. #
# #
# Parameter: Kategorie, Schulwoche #
# Rückgabewert: Keiner #
################################################################################
sub printTimetable {

use PDF::Create;
use CGI::Carp qw(fatalsToBrowser);

my(@tage) = ("Mo","Di","Mi","Do","Fr","Sa");
my($kategorie, $schulwoche, $suchbegriff, $aktWoche) = @_;

my(@day) = gMeDates($schulwoche); # "Daten" suchen
my($actDay) = -1;

my($zeile1);
my($zeile2);
my($zeile3);

print "Content-type: text/html\n\n",

"<html>\n",
"<head>\n",
"<title>Stundenplan</title>\n",
'<meta http-equiv="cache-control" content="no-cache">',"\n",
'<link rel="stylesheet" type="text/css" href="',$SPLAN_DIR,'Stundenplan.css">',"\n",
'<script type="text/javascript">',"\n",
"<!--\n\n",

" function setStatus() {\n",
" if(top.statusFrameGeladen && top.schulwocheFrameGeladen) {\n",
" var kat;\n",
" var suchbg;\n";

# komische Aufteilung, ich weiß, aber dann muss ich später nicht nochmal vergleichen.
# Und so schlage ich "2 Fliegen mit einer Klatsche":
# Das mit den Zeilen, und die Sache mit den Bezeichnungen für den Status. ;-)
if($kategorie eq "Klasse") {
$zeile1 = 1; # Fach
$zeile2 = 2; # Lehrer
$zeile3 = 0; # Raum
print ' var bez = "der Klasse: ";'."\n";
}
elsif($kategorie eq "Lehrer") {
$zeile1 = 3; # Klasse
$zeile2 = 1; # Fach
$zeile3 = 0; # Raum
print ' var bez = "des Lehrers: ";'."\n";
}
elsif($kategorie eq "Raum") {
$zeile1 = 3; # Klasse
$zeile2 = 2; # Lehrer
$zeile3 = 1; # Fach
print ' var bez = "des Raumes: ";'."\n";
}
else {
die "Die Unterroutine 'printTimetable()' im Perl-Skript $0 hat".
" unzulaessige Daten erhalten!\n";
}

if($schulwoche eq "alle") {
print ' var woche = " gesamtes Schuljahr ', substr($date[0][0], 6, 4),'/', substr($date[$#date][5], 6, 4),'";',"\n",
" parent.schulwocheFrame.document.schulwocheForm.schulwocheSelect.options.selectedIndex = 0;\n";
}

else { # Damit volles Datum in StatusZeile (ich setze die 'selectedIndex's damit die Schulwoche immer synchron mit dem Stundenplan ist) -> aktualisieren / vor / zurück
print ' parent.schulwocheFrame.document.schulwocheForm.schulwocheSelect.options.selectedIndex = "',$schulwoche,'";',"\n",
" parent.search.document.suchbegriffForm.schulwoche.value = parent.schulwocheFrame.document.schulwocheForm.schulwocheSelect.value;\n",
' var woche = " Schulwoche: " + parent.schulwocheFrame.document.schulwocheForm.schulwocheSelect.options[parent.schulwocheFrame.document.schulwocheForm.schulwocheSelect.options.selectedIndex].text;',"\n",
}

print ' parent.statusFrame.document.statusForm.statusZeile.value = "Stundenplan " + bez + "',$suchbegriff,'" + woche;',"\n", # hier nicht &setToHTML!
" }\n",
' else setTimeout("setStatus();", 100);',"\n",
" }\n\n",

" function imitUser(x, y) {\n",
" kat = x\n",
" suchbg = y\n",
" if(top.kategorieFrameGeladen) {\n",
" if(parent.kategorie.document.forms[0].Kategorie.value != kat) {\n",# kann ja einer Die Kategorie
" parent.kategorie.document.forms[0].Kategorie.value = kat;\n", # gewächselt haben.
" parent.kategorie.document.forms[0].submit();\n",
" }\n",
" setSuchbg();\n",
" }\n",
' else setTimeout("imitUser(kat, suchbg);", 100);',"\n",
" }\n\n",

" function setSuchbg() {\n",
# Wenn die Richtige Kategorie geladen wurde:
" if(parent.search.document.suchbegriffForm.elements[0].name == kat) {\n",
" parent.search.document.suchbegriffForm.elements[0].value = suchbg;\n",
" nd();\n", # Wir sagen ja weiter unten im Skript, das das Popup
# (bei mehr als vier Einträgen), wenn es geöffnet
# wird, die Status-Zeile des Browsers auf die Überschrift
# des Popups setzen soll. Wenn jetzt aber der User auf
# ein Objekt in diesem Popup klickt, und weitergeleitet
# wird bleibt der Eintrag in der Status-Zeile des Browsers
# weiterhin, deswegen müssen wir diesen löschen.
# Wieso gerade hier?: Sonst kommt es dem User vor als
# ob er nur das Popup geschlossen hätte.
" parent.search.syncWeekSetStatusNSubmit();\n",
" }\n",
' else setTimeout("setSuchbg();", 100);',"\n",
" }\n\n",

"//-->\n",
"</script>\n",
"</head>\n",
'<body onLoad="setStatus();">',"\n",
'<div id="overDiv" style="position:absolute; visibility:hidden; z-index:1000;"></div>',"\n",
'<script language="JavaScript" src="/splan/overlib.js"><!-- overLIB (c) Erik Bosrup --></script>',"\n",
'<table class="stundenplanTabelle">',"\n",
" <tr>\n",
" <td></td>\n";

# wenn aktuelle Woche, aktuellen Tag herausfinden:
if($aktWoche == $schulwoche-1) {
my(@puffer) = gmtime(time());
# atuelles Datum im Foramt dd.mm.jjjj sichern
my($actDate) = sprintf("%02d.%02d.%02d", $puffer[3], $puffer[4]+1, $puffer[5]%100);
# Woche nach diesem Tag durchsuchen:
for(my($i) = 0; $i < $MAX_TAG; $i++) {
my($dayBuffer) = $day[$i];
substr($dayBuffer,0,3) = '';
# wenn gefunden Tag merken (die Nummer, nicht das Datum):
if($dayBuffer eq $actDate) { $actDay = $i; last }
}
}

for(my($i) = 0; $i < $MAX_TAG; $i++) { # Wochentage ausgeben
if($i == $actDay) { print ' <td class="stundenplanKopfAktuellerTag">',$day[$i],"</td>\n" }
else { print ' <td class="stundenplanKopf">',$day[$i],"</td>\n" }
}
print " </tr>\n";

for($stunde = 1; $stunde <= $MAX_STUNDE; $stunde++) {
print " <tr>\n",
' <td class="stundenZelle">',$stunde,"</td>\n"; # Stunden-Spalte ausgeben

for($tag = 1; $tag <= $MAX_TAG; $tag++) {
if($tag-1 == $actDay) { print ' <td class="unterrichtZelleAktuellerTag">',"\n" }
else { print ' <td class="unterrichtZelle">',"\n" }

if(defined($unterricht[$stunde][$tag])) {
my($str) = gMe4($stunde, $tag, 0, $zeile1, $zeile2, $zeile3, $schulwoche);

my($plusStr) = ' ';
if(defined($unterricht[$stunde][$tag][4])) { # wenn mehr als vier Einträge
my($input) = '';
for(my($eintrag) = 4; defined($unterricht[$stunde][$tag][$eintrag]); $eintrag += 4) {
$input = $input . gMe4($stunde,$tag,$eintrag,$zeile1,$zeile2,$zeile3,$schulwoche). '<hr>';
}
$input =~ s/'/;;;/g;
$input =~ s/"/\\'/g;

substr($input, length($input)-4, 4) = ""; # letztes <hr> entfernen

# hier fehlen überall Zeilensprünge, nicht damit Lesen schwerer fällt,
# sondern weil dieser String an overLIB übergeben wird (dem
# Tooltip-"Ding"). Und dieses "Tooltip"-Ding ist ein Aufruf einer
# Javascript Funktion.
# -> in Paramtern von Javascript-Funktion,.. darf man keine
# Zeielensprünge machen.
MAX_STUNDE
$plusStr = '<a class="plus" href="javascript:void(0);" onclick="return overlib(\''.$input. # Sorry
'\', FGCLASS, \'TooltipHintergrund\', BGCLASS, \'TooltipRahmen\', CAPTIONFONTCLASS, '.
'\'TooltipUeberschrift\', TEXTFONTCLASS, \'TooltipSchrift\', STICKY, CLOSECLICK, CAPTION,'.
' \''.$day[$tag-1].'   '.$stunde.'. Stunde\', RIGHT, CLOSEFONT, \'Arial\', CLOSECOLOR, \'#D4D0C8\','.
' CLOSETITLE, \'schließt diese Box\', CLOSETEXT, \'x \', CLOSESIZE, \'10px\', WIDTH, 150, AUTOSTATUSCAP);"'.
' onmouseout="nd();">+</a>'; # CLOSEFONTCLASS, \'TooltipSchliessenText\', <- wurde als Klasse ignoriert! deswegen direkt drin ###
}
$str =~ s/\+/$plusStr/g;
print $str;
}#if
print ' </td>'."\n";
}#for
print ' </tr>'."\n";
}#for
print '</table>'."\n";
print '</body>'."\n";
print '</html>'."\n";

######################################################################## Hier wird die PDF erzeugt #
############################

my $ipaddr = $ENV{'REMOTE_ADDR'}; # Speichern der IP-Adresse
my $sta = 36;
my $wta = 130;
#my $len = $#unterricht+1;

# neue PDF-Datei erzeugen, Dateiname = SPLAN(IP-Adresse).pdf (z.B. SPLAN158.122.181.59.pdf)
my $pdf = new PDF::Create('filename' => "SPLAN$ipaddr.pdf",
'Version' => 1.2,
'PageMode' => 'UseOutlines',
'Author' => '_Projekt_Author',
'Title' => '_Projekt_Titel',
);

my $root = $pdf->new_page('MediaBox' => [ 0, 0, 842, 595 ]);

# Füge eine neue Seite hinzu, die ihre Attribute von $root erhält
my $page = $root->new_page;
# Definieren von 2 Schriftarten/Formatierungen
my $f1 = $pdf->font('Subtype' => 'Type1',
'Encoding' => 'WinAnsiEncoding',
'BaseFont' => 'Helvetica');
my $f2 = $pdf->font('Subtype' => 'Type1',
'Encoding' => 'WinAnsiEncoding',
'BaseFont' => 'Helvetica-Bold');
my $f3 = $pdf->font('Subtype' => 'Type1',
'Encoding' => 'WinAnsiEncoding',
'BaseFont' => 'Courier');
my $f4 = $pdf->font('Subtype' => 'Type1',
'Encoding' => 'WinAnsiEncoding',
'BaseFont' => 'Courier-Bold');

# Definieren einer Tabelle mit Inhalt
my $toc = $pdf->new_outline('Title' => 'Document',
'Destination' => $page);
$toc->new_outline('Title' => 'Section 1');
my $s2 = $toc->new_outline('Title' => 'Section 2',
'Status' => 'closed');
$s2->new_outline('Title' => 'Subsection 1');

#(vordefinierte Schriftart, Schriftgroesse, Position-X, Position-Y, "Text");

$page->stringc($f2, 12, 400, 568, "SPLAN $kategorie $suchbegriff Schulwoche: $schulwoche");

#Studenanzahl
for(my $i = 0;$i < 14;$i++)
{
if(0!=$i)
{
$page->stringc($f2, 10, 18, 554 - ($i * $sta), "$i");
}
}

# Header-Zeile
$page->line(25, 560, 25, 585);
$page->line(805, 560, 25, 560);
$page->line(805, 585, 805, 560);
$page->line(25, 585, 805, 585);

for(my $w = 0;$w < 6;$w++)
{
$page->line(25 + ($w * $wta), 540, 25 + ($w * $wta), 558);
$page->line(155 + ($w * $wta), 540, 25 + ($w * $wta), 540);
$page->line(155 + ($w * $wta), 558, 155 + ($w * $wta), 540);
$page->line(25 + ($w * $wta), 558, 155 + ($w * $wta), 558);
}

@wochentag = ("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag");
my $wtindex = 0; # Wochentagindex

foreach my $wochentag (@wochentage)
{
$page->stringc($f4, 10, $wta * $wtindex + 88, 545, "$wochentag");
$wtindex++;
}


#Hier sollte irgendwie der @unterricht ausgegeben werden !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

# foreach $irgend(@arrray)
#{
# $bula = \@irgend;
# $page->stringc($f4, 10,20 + 88, 545, "$unterricht[4][4][1]");
#}

# for my $ref1 (0..scalar(@unterricht)-1)
# {
# for my $ref2 (0..scalar(@{$unterricht[$ref1]})-1)
# {
# for my $ref3 (0..scalar(@{$unterricht[$ref1][$ref2]})-1)
# {
# for my $ref4 (0..scalar(@{$unterricht[$ref1][$ref2][$ref3]})-1)
# {
# $irgend=$irgend+20;
# $page->stringc($f3, 12, 40, 500 - ($irgend * 2), "@{$unterricht[$ref1][$ref2][$ref3]#[$ref4]}");
# }
# }
# }
#}
# my $point;
# for my $row(@unterricht)
# {
# for my $number(@{$row})
# {
# for my $elen({@$number})
# {
# my $string = join":",@$elem;
#
# $point = $point+10;
#
# $page->stringc($f2, 12, 400-$point, 568-$point, "$string");
# }
# }
# }

for(my $p = 0;$p < 6;$p++)
{
for(my $o = 1;$o < 14;$o++)
{

$page->stringc($f3, 8, 45 + ($p * $wta), 530 - (($o - 1) * $sta), "$unterricht[1][1][0][3]");
$page->stringc($f3, 8, 35 + ($p * $wta), 521 - (($o - 1) * $sta), "$unterricht[1][1][0][1]");
$page->stringc($f3, 8, 35 + ($p * $wta), 512 - (($o - 1) * $sta), "$unterricht[1][1][0][0]");
$page->stringc($f3, 8, 33 + ($p * $wta), 504 - (($o - 1) * $sta), "$unterricht[1][1][0][5]");

$page->line(25 + ($p * $wta), 538 - ($o * $sta), 25 + ($p * $wta), 574 - ($o * $sta));

$page->line(155 + ($p * $wta), 538 - ($o * $sta), 25 + ($p * $wta), 538 - ($o * $sta));
$page->line(155 + ($p * $wta), 574 - ($o * $sta), 155 + ($p * $wta), 538 - ($o * $sta));
$page->line(25 + ($p * $wta), 574 - ($o * $sta), 155 + ($p * $wta), 574 - ($o * $sta));
}
}

my $abstand=0;
my $counter=0;


# Footer-Zeile
$page->line(25, 15, 25, 60);
$page->line(805, 15, 25, 15);
$page->line(805, 60, 805, 15);
$page->line(25, 60, 805, 60);

# innerhalb von Footer
$page->line(125, 17, 125, 57);
$page->line(255, 17, 125, 17);
$page->line(255, 57, 255, 17);
$page->line(125, 57, 255, 57);

$page->stringc($f3,9,142,50,"Lehrer");
$page->stringc($f3,9,142,42,"Fach ");
$page->stringc($f3,9,142,34,"Raum ");
$page->stringc($f3,9,142,26,"Turnus");

#letzter Eintrag
$page->stringc($f2,9,145,5,"PDF erstellt mit PDF::Create (by Fabien Tassin)");

# Hinzufuegen einer neuen Seite
my $page2 = $root->new_page;
$page2->line(0, 0, 842, 595);
$page2->line(0, 595, 842, 0);

$toc->new_outline('Title' => 'Section 3');
$pdf->new_outline('Title' => 'Summary');

# Hinzufuegen der fehlenden PDF-Objekte, Footer und Schliessen der Datei

$pdf->close;

}

################################################################################
# gMe4() - Gibt die <= 4 Unterrichts-Einträge schön formatiert als #
# HTML-Tabelle zurück. #
# #
# Parameter: Stunde, Tag, Start-Eintrag, #
# was ausgegeben werden soll, #
# Damit meine ich Indizes im Array '@unterricht'! #
# -> nicht z.B. schreiben: "Klasse", "Raum", ...! #
# (in richtiger Reihenfolge) #
# Schulwoche #
# Rückgabewert: HTML-Tabelle in Form einer Zeichekette #
# #
# Vorsicht Schwindelgefahr!!! #
# ============================ #
################################################################################
sub gMe4 {
my($stunde) = shift(@_);
my($tag) = shift(@_);
my($eintrag) = shift(@_);
my(@zeile) = (shift(@_), shift(@_), shift(@_));
my($schulwoche) = shift(@_);
my(@kategorie) = ("Raum","_ERROR_","Lehrer","Klasse"); # "_ERROR_" kann normalerweise
# NIE! auftreten.
my($str) = '<table class="unterrichtsStundeTabelle">';
for(my($zeilenNr) = 0; $zeilenNr < 4; $zeilenNr++) { # für die 4 Zeilen/Daten
$str = sprintf("%s<tr>", $str); # Beginne neue Zeile
# Für die vier Einträge:
for(my($j) = 0; $j < 4 && defined($unterricht[$stunde][$tag][$eintrag+$j]); $j++) {
my($input); # weil '$input' die Gültigkeit in dieser Forschleife braucht.
# Wenn ich sie hier nicht bekannt geben würde, wäre sie nur für die
# kurze "Lebenszeit" der folgenden 'if' & 'else'-Verzweigungen vorhanden.
if($zeilenNr != 3) {
$input = &setToHTML($unterricht[$stunde][$tag][$eintrag+$j][$zeile[$zeilenNr]]);

if($zeile[$zeilenNr] != 1) {
# ich weiß, schlechter Programmierstil!:
$input = sprintf("<a href=\"javascript:imitUser('%s', '%s');\">%s</a>",
&setToHTML($kategorie[$zeile[$zeilenNr]]), $input, $input)
}
}
else {
$input = &setToHTML($unterricht[$stunde][$tag][$eintrag+$j][5]); # Wochenkennung
# wenn ich einen Leeren Wert zuweise mekert Perl, deswegen die Abfrage:
if($unterricht[$stunde][$tag][$eintrag+$j][4] ne "") # Gruppe
{ $input = sprintf("%s/%s", $input, &setToHTML($unterricht[$stunde][$tag][$eintrag+$j][4])) }
if($eintrag == 0 && $j == 3) { $input = $input . ' +' } # bei 4tem Eintrag "plus" anhängen,
$irgend # wirklich nur beim 4ten! Nicht in den
# Tooltip-Boxen dann auch noch.
}
$str = sprintf("%s<td class=\"unterrichtsStundeZelle\">%s</td>", $str, $input);
}#for
$str = sprintf("%s</tr>", $str);
}#for
$str = sprintf("%s</table>", $str);

return($str);
}

Datum: 09.04.2008-11:05

Beitragre: Difficult
Seitenanfang
Das Modul das hier verwendet wird :

(http://search.cpan.org/~ftassin/PDF-Create-0.01/lib/PDF/Create.pm

Datum: 09.04.2008-11:11

Beitragre: Difficult
Seitenanfang

#!/usr/bin/perl

use strict;
use warnings;

my @unterricht = (
[
[
[ qw(aaa1 aaa2 aaa3) ],
[ qw(aab1 aab2 aaa3) ],
],
[
[ qw(aba1 aba2 aba3) ],
[ qw(abb1 abb2 abb3) ],
],
],
[
[
[ qw(baa1 baa2 baa3) ],
[ qw(bab1 bab2 bab3) ],
],
[
[ qw(bba1 bba2 bba3) ],
[ qw(bbb1 bbb2 bbb3) ],
],
],
);

foreach my $row_ref (@unterricht) {
foreach my $number_ref (@{$row_ref}) {
foreach my $element_ref (@{$number_ref}) {
my $string = join ":", @{$element_ref};
print "$string\n";
}
}
}

Renee hat dich letztens auf "Wie Frage ich richtig?" aufmerksam gemacht, ich moechte 2 Passagen noch einmal wiederholen, da es fuer mich die wichtigstens sind um schnell eine Loesung bieten zu koennen:

Am Besten versuchst Du, ein komplett neues (möglichst kleines) Script zu schreiben, welches das problematische Verhalten demonstriert. Dieses kleine Script kannst Du im Forum posten, dazu bitte eine genaue Beschreibung, welches Verhalten Du erwartet hast und welches Verhalten Dein Script zeigt. Beim Erstellen eines solchen Minimalscriptes zusammen mit den genauen Beschreibungen kommt es gelegentlich vor, dass Du selbst den Fehler entdeckst.

Wenn Du ein großes Script herunterkürzt, achte bitte unbedingt darauf, dass das Resultat noch lauffähig ist. Ferner sollten keine nicht verwendeten Variablen oder Subroutinen definiert werden. Das verwirrt nur diejenigen, die versuchen, Dir zu helfen.

und


Bitte poste nur Code, der UseStrict-konform ist und mit "use warnings" keine Warnungen ausgibt. Das hat mehrere Vorteile: Erstens dreht sich Deinen Lesern nicht der Magen um, weswegen sie wesentlich gewillter sind, Dir zu helfen. Zweitens gibt es viele Fehler, die Du ohne unsere Hilfe selbst finden kannst, wenn Du Dich an diesen Programmierstil hältst. Drittens wirst Du mit 100%-iger Wahrscheinlichkeit darauf hingewiesen werden, wenn Du Dich nicht daran hältst, was uns alle nur Zeit kostet.

Außerdem ist "Mein Skript funktioniert nicht" auch lesenswert.


Quelle: http://wiki.perl-community.de/bin/view/Wissensbasis/AllgemeinesWieFrageIchbeiPerlCommunity

[I] Um das nochmal kurzzufassen: Erstelle eine neue Skriptdatei, kopiere die Codezeilen in die neue Skriptdatei von denen du denkst dass sie das Problem verursachen.
[II] Fuege der Skriptdatei die Zeilen


use strict;
use warnings;

hinzu.
[III] Fuehre das Skript aus, tauchen Fehlermeldungen auf, dann passe den Code entsprechend an.
[IV] Werden fuer die korrekte Ausfuehrung des Codestuecks Daten benoetigt (in deinen Fall die Daten die in @unterricht stehen), dann fuege diese Daten direkt in das Script mit ein (wie ich das oben getan habe).
Wenn die Daten aus datenschutzrechtlichen Gruenden nicht veroeffentlich werden koennen, dann verwende fiktive Daten die dem originalen Daten aehnlich sind.
[V] Poste erst dann wenn alle Fehler bereinigt sind.

Wenn du diese Regeln befolgst wirst du zwar in der Vorbereitung deiner Frage mehr Zeit benoetigen, aber Zeit gewinnen weil man dir schneller antwortet.
Ich haette dir schon 13:00 Uhr antworten koennen, musste mir aber erst raussuchen was dein eigentliches Problem ist bis ich deinen letzten Post gesehen habe, nur unter anderem Namen.

Datum: 09.04.2008-16:45

Beitragre: Difficult
Seitenanfang
Du solltest mehr Standardmodule verwenden...


read (STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
#$query_string = "Klasse=1BFF1&schulwoche=2"; # <- Debug-Query

$query_string = &QueryHexToChar($query_string);

my($kategorie, $suchbegriff, $schulwoche) = ($query_string =~ /(.*)=(.*)&schulwoche=(.*)/g);


Du darfst nicht davon ausgehen, dass die Query-Parameter immer in der gleichen Reihenfolge ankommen, es ist dem Browser ueberlassen in welcher Reihenfolge er die Parameter ordnet. Dein Code funktioniert nicht mehr wenn im Query 'schulwoche=15&Lehrer=Musterlehrer' steht.
Es ist verpoehnt den Querystring von Hand auszuwerten, deshalb solltest du das CGI-Modul verwenden, wodurch auch alles leichter lesbar wird.

use CGI;

my $cgi = CGI->new;
my $schulwoche = $cgi->param('schulwoche');


Nur wie kommst du jetzt an die Kategorie, da du sie vorher von der Position abhaengig gemacht hast, kann man jetzt nicht mehr eindeutig sagen welcher Parameter fuer die Kategorie steht.
Ein Workaround waere...

my($kategorie) = grep { defined($cgi->param($_)) } qw(Klasse Lehrer Raum);

grep liefert alle Parameternamen zurueck die auch als Parameter angegeben wurden ('Klasse', 'Lehrer', 'Raum'), nur der erste wird $kategorie zugewiesen (mehrere Angaben sollte es eh nicht geben).

Eine bessere Loesung waere die Einfuehrung neuer Parameter 'searchtype' und 'searchtext', der Querystring koennte dann so aussehen 'schulwoche=15&searchtype=klasse&searchtext=Musterlehrer', der Code wurde dann so aussehen:


my $cgi = CGI->new;
my $schulwoche = $cgi->param('schulwoche');
my $search_type = $cgi->param('searchtype');
my $search_text = $cgi->param('searchtext');

oder kuerzer:

my $cgi = CGI->new;
my %params = $cgi->Vars; # Query Parameter als Hash

# direkte Verwendung des Hashs (Hashslice)
dataSearch(@params{'search_type', 'search_text', 'schulwoche'});

# indirekte Verwendung
my $schulwoche = $params{'schulwoche'};
my $search_type = $params{'searchtype'};
my $search_text = $params{'search_text'};
dataSearch($search_type, $search_text, $schulwoche);


open(INFILE2, "<" . $WK_DB) or

hier kannst du gleich den "3 Argumente"-Aufruf von open() verwenden, der eh und je zu empfehlen ist.

open(INFILE, '<', $WK_DB) or


while(<INFILE2>) {
# Werte vorbereiten:
$zeile = $_;
chomp($zeile);
$zeile =~ s/("|')//g; # Ansonsten kann der Browser das
# als "Zeicheketten-Ende"-Markierung,..
# interpretieren.
my(@datensatz) = split(/;/, $zeile);

besser so

while(defined(my $zeile = <INFILE2>)) {
chomp($zeile);

# ...
}


Wenn es eine CSV-Datei ist (Datei deren Werte durch Komma oder Semikolon getrennt sind) dann verwende auch hier besser ein entsprechendes Modul, zum Beispiel Text::CSV_XS oder Text::CSV_PP.


# gucken ob Woche vorhanden
foreach(@wochen) {
if($_ == $woche) {
$valid = 1;
last;
}
}#foreach

kuerzer und besser so:

my $valid = grep { $woche == $_ } @wochen;

Auch fuer das Schreiben von HTML-Code solltest du das CGI-Modul verwenden:


use CGI;
my $cgi = CGI->new;

print $cgi->header;
print $cgi->start_html('Stundenplan');
# ...
print $cgi->end_html;

Datum: 09.04.2008-17:42

Beitragre: Difficult
Seitenanfang
Was soll

"@{$unterricht[$ref1][$ref2][$ref3]#[$ref4]}"[/tt]

Deiner Meinung nach tun?

Mach mal [code] for my $ref1 ( @unterricht ){
for my $ref2 ( @$ref1 ){
for my $ref3 ( @$ref2 ){
for my $elem ( @$ref3 ){
$irgend=$irgend+20;
$page->stringc($f3, 12, 40, 500 - ($irgend * 2), $elem );
}
}
}
}

Datum: 10.04.2008-11:22

Beitragre: Difficult
Seitenanfang
Das Problem habe ich nun beseitigt aber trotzdem möchte ich mich für die Hilfe bei euch bedanken

ich hab das Problem mit

if(defined($unterricht[t][s][z][a]))
{

....
}

gelöst.

MFG

Klaus

Datum: 23.04.2008-11:17

-






-
-