KENT-WEB サポートコーナー 過去ログ [ 0355 ]


記事No: 3688
投稿日: 2008/05/20(Tue) 11:52:55
タイトルスケジュール管理
ID情報: eritama
投稿者: tanny
URLhttp://isysi.co.jp/test/cal.cgi

いつも利用させていただいています。
今回会社の勤務管理のプログラムを作ることになり、自宅のネットショップでお世話になっている、KENT様のCGIを使用することとしました。使用したのは「KENTとつくるワンランク上のPeal/cgiプログラミング」内の「第5章スケジュール管理」のcgiです。

今回実現したいのは、カレンダーの表示方法です。
データの持ち方から考えると、難しいのかもしれないのですが、会社の締め日の関係で、当月21日から翌月20日のスパンで一区切りで考えます。そこで、カレンダーの表示を21日から始まって、翌月の20日までで1ページ表示にしたいというのが、実現したいことです。

今アップしている上記のデータは、少し改造を施したものですが、ほとんど原型のままにしたものを、アップしています。
データはサンプルを入れていますので、ご自由にさわっていただいても構いません。他にも実現したい機能があるのですが、この部分が一番お手上げになっていて、どこをいじればいいのかまったくわからない部分です。
どうか皆様のお知恵をいただきたく、よろしくお願いいたします。


記事No: 3720
投稿日: 2008/05/24(Sat) 13:59:26
タイトルRe: スケジュール管理
ID情報: teketen
投稿者: てけてん

スクリプトを見れば、多分改造方法を提案できると思いますが、如何せん、私は件のスクリプトを持っていません。
書籍添付のスクリプトなので、テキストファイルにしてアップロードして戴くことも出来ませんし。
回りくどい形になりますが、WebCalenのカレンダー部分の改造を参考にして、ご自分で改造出来るなら、WebCalenの改造方法を提示するということは出来ますけれど…。

書籍添付のスクリプトは、持っている人で改造方法を提示できる人が限られますので、中々回答が付かないのが現状です。


記事No: 3751
投稿日: 2008/05/29(Thu) 22:13:56
タイトルRe^2: スケジュール管理
ID情報: eritama
投稿者: tanny
URLhttp://isysi.co.jp/test/cal.cgi

出張のため、お返事が遅くなりました。すみません。
・・・そうですか。WebCalen、カレンダー日記ですよね。
実はあの表示方法もしてみたいと思ってるのですが、なにぶん
知識が追いつかなくて。サポートの過去ログを検索してみたのですが、参考になる改造方法が見つけられませんでした。
てけてんさんのおっしゃるように、WebCalenの改造方法が
あれば、是非参考にしてみたいです。


記事No: 3760
投稿日: 2008/05/30(Fri) 20:16:36
タイトルRe^3: スケジュール管理
ID情報: teketen
投稿者: てけてん

WebCalen v2.12で改造しました。
改造する必要があるのは、カレンダー表示部分のtableサブルーチンのみです。
ログファイルの形式はそのままで、月ごとに生成しています。
(ログまで21〜末日、次月の1〜20日までにすると、色々面倒なので、これが一番簡単です)

calen.cgiは、月ごとにログを生成しているので、21〜末日までの月のファイルと、
1〜20日までの月のファイルをそれぞれ開いて、別々の配列に一旦格納しています。

スケジュール管理のスクリプトとは、変数などが違うかも知れませんが、何か参考になるでしょうか?
少し説明を加えてみましたので、この改造方法を参考にして、ご自分で試行錯誤してみて下さい。
(何となく、どのようにすれば良いのか、判るのではないでしょうか?)
頑張って下さいね。
以上です。

calen.cgi

#-------------------------------------------------
# カレンダ表示
#-------------------------------------------------
sub table {
local($month) = $_[1];

if ($_[0] eq "FWD") {
$month--;
if ($month < 1) { $month += 12; $year--; }
}
if ($month == $mon && $thisyear == $year) { $thiskey = 1; }

# 追加 ■■
# $thiskeyには、アクセスした日と同じ年月のカレンダーを表示していた場合に1が代入されています。
# ↑上のif ($month == $mon && $thisyear == $year) { $thiskey = 1; }で判断されています。
$month = $month - 1 if($thiskey and $mday < 21); # カレンダーにアクセスした日が1〜20日だった場合、月の値を前月にセット(前月の21日から表示する為)
my $mos = sprintf("$month月 - %s%s",$month == 12 ? $year + 1 . '年' : '',$month == 12 ? 1 : $month + 1); # 次月の月と年を取得。カレンダーの月表示に使用
# ここまで ■■

my $lmon = sprintf("%02d", $month);

# 追加 ■■ …> 1〜20日までの年と月を取得
# 例えば、1月21日〜2月20日までのカレンダーなら、2月1日〜20日までの年を$nexyearに、月を$nextlmonに代入しています。
# $monthが21日〜末日までの月の値なので、$nexyearには、$monthが12月ならば、1〜20日は来年の1月である必要があるため、次の月は来年の西暦を代入します。
# $nextlmonには、$monthが12月ならば、1月を、そうでなければ次の月の値を代入しています。
# $month == 12 ? $year + 1 : $yearという式は、「三項演算」(条件演算子)です。
my $nexyear = $month == 12 ? $year + 1 : $year;
my $nextlmon = sprintf("%02d", $month == 12 ? 1 : $month + 1);
# ここまで ■■

open(IN,"$logdir$year$lmon.txt");
# 修正 ■■ …> my @lines = <IN>;ではなく、whileで回して、21〜末日までのデータを@linesに格納
my @lines = ();
while(<IN>) {
# ↓WebCalenでは、ログファイルが<>で区切られています。行の一番最初の数字が日付になっていますので、それを$daに代入しています。
my $da = (split(/<>/))[0];
next if($da < 21); # $daが21日よりも少ない場合は、ループの先頭に戻る(push(@lines,$_);は処理しない)
push(@lines,$_);
}
# ここまで ■■
close(IN);

# 追加 ■■ …> 1〜20日までのデータを@nextlinesに格納
open(IN,"$logdir$nexyear$nextlmon.txt");
my @nextlines = ();
while(<IN>) {
my $da = (split(/<>/))[0];
last if($da > 20);
push(@nextlines,$_);
}
close(IN);
# ここまで ■■

print <<EOM; # 修正 ■■ …> ↓$month月を$mos月に変更
<Table cellspacing="0" cellpadding="0" border="0">
<Tr><Th bgcolor="$tbl_line">
<table cellpadding="1" cellspacing="1" border="0" width="100%">
<tr bgcolor="$tbl_line">
<th colspan="7" bgcolor="$tbl_color" height="30">$year年 $mos月</th></tr>
<tr>
EOM

# 色
my %col = (
0 => $sun_color,
1 => $nor_color,
2 => $nor_color,
3 => $nor_color,
4 => $nor_color,
5 => $nor_color,
6 => $sat_color,
);

# 曜日項目
foreach (0 .. 6) {
print qq|<td align="center" height="$height" width="$width" bgcolor="$tbl_color">|;
print qq|<font color="$col{$_}">$week[$_]</font></td>|;
}
print "</tr>\n";

# 複雑怪奇なる「ツェラーの公式」を実行し当月1日の曜日を取得
my $wkey = &getweek(21, $year, $month); # 修正 ■■ …> 1を21に変更。21日の曜日の値を取得する為

# 当月の末日を計算
my $lastday = (31,28,31,30,31,30,31,31,30,31,30,31) [$month-1]
+ ($month == 2 && (($year % 4 == 0 && $year % 100 != 0) ||
$year % 400 == 0));

# 第1週の空き枠
print "<tr>\n";
for ( my $i = $wkey; $i > 0; --$i ) {
print qq|<td align="center" bgcolor="$tbl_color" height="$height" width="$width" valign="top"> - </td>|;
}

my $w = $wkey; # 曜日 (ex. 0:日曜, 1:月曜, ... )
my $flg;
my $j = 0; # 追加 ■■ …> 配列の要素を得る為
foreach my $i (21 .. $lastday,1 .. 20) { # 修正 ■■ …> 1 .. $lastdayを21 .. $lastday,1 .. 20に変更。これで、21〜末日、1〜20日の順番でカレンダーを表示します。

# 追加 ■■ …> 1日以降は、@nextlinesのデータを表示し、その年と月に差し替える
# $iには、日付が代入されているので、$iが1ならば、次の月になるので、年と月を差し替える
if($i == 1) {
$year = $lmon == 12 ? $year + 1 : $year;
$lmon = sprintf("%02d", $lmon == 12 ? 1 : $lmon + 1);
@lines = @nextlines;
$j = 0; # @nextlinesの最初の要素を取り出すため、$jに0を代入
}
$j++;
# ここまで ■■


my $day = sprintf("%02d", $i);

# 祝日の色
my $color;
if (&holiday::holiday($year, $lmon, $i)) {
$color = $spe_color;

# 祝日以外の色
} else {
$color = $col{$w};
}

# 週開始
if ($flg && $w == 0) { print "<tr>\n"; }

# 本日
if ($thiskey && $mday == $i) {
print qq|<td align="center" valign="top" bgcolor="$today_color" height="$height" width="$width">|;

# 本日以外
} else {
print qq|<td align="center" valign="top" bgcolor="$tbl_color" height="$height" width="$width">|;
}

print qq|<a href="$registcgi?mode=write&YMD=$year$lmon$day&w=$w" target="main">|;
print qq|<font color="$color">$i</font></a><br>\n|;

my ($sub,$wri) = (split(/<>/, $lines[$j-1]))[1,4]; # 修正 ■■ …> [$i-1]を[$j-1]に変更。$iには日付が入っている為
if ($sub ne "") {
print qq|<a href="$calencgi?mode=main&action=view&YMD=$year$lmon$day&w=$w" target="main">|;
print qq|<img src="$imgurl$wri[$wri]" border="0" alt="$sub"></a>|;
}
print "</td>";

# 週終わり
$w++;
if ($w == 7) {
print "</tr>\n";
$flg++;
$w = 0;
}
}

# 最終週の空き枠
while ( $w % 7 ) {
print qq|<td align="center" bgcolor="$tbl_color" height="$height" width="$width" valign="top"> - </td>|;
$w++;
}

print <<EOM;
</tr></table>
</Th></Tr></Table>
<br>
EOM
}


記事No: 3763
投稿日: 2008/05/31(Sat) 19:36:48
タイトルRe^4: スケジュール管理
ID情報: eritama
投稿者: tanny
URLhttp://isysi.co.jp/test/cal.cgi

ありがとうございました。
現在、WebCalen v2.12をテスト環境に落として、
検証中です。
今のスケジュール管理にどこまで、適応できるか
がんばってみます。

ご指導ありがとうございました。


[検索ページ]