documents:proglang:perl:perl-201
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン | |||
| documents:proglang:perl:perl-201 [2026/05/17 15:40] – [CGIソース] k896951 | documents:proglang:perl:perl-201 [2026/05/17 15:45] (現在) – [201.ライブツアーのセットリストを公演毎に横に並べる その2] k896951 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | ====== 202.ライブツアーのセットリストを公演毎に横に並べる その2 ====== | ||
| + | 2015-12-14\\ | ||
| + | 某2『絶望しない程度にコード削減しようか』\\ | ||
| + | 私『…はい』\\ | ||
| + | gensql()のコード削減。 | ||
| + | |||
| + | 2015-12-14\\ | ||
| + | [[documents: | ||
| + | |||
| + | ===== 表示例 ===== | ||
| + | |||
| + | tour_id=227 の「NANA MIZUKI LIVE SENSATION 2003」の例。 | ||
| + | |||
| + | {{: | ||
| + | |||
| + | テーブルの罫線はCSSで指定している。 | ||
| + | |||
| + | ===== CGIソース ===== | ||
| + | |||
| + | [[documents: | ||
| + | |||
| + | 定義しているサブルーチン gensql()は、[[documents: | ||
| + | 絶望的に長いソースになってしまった。もっと処理に依存させたデータ構造ならSQL生成処理も簡素化するかもしれない。 | ||
| + | |||
| + | <code perl b.pl> | ||
| + | use Encode; | ||
| + | use DBI; | ||
| + | use CGI; | ||
| + | |||
| + | my $dbname=" | ||
| + | my $dbhost=" | ||
| + | my $dbuser=" | ||
| + | my $dbpass=" | ||
| + | |||
| + | my $dbh = DBI-> | ||
| + | my $cgi = CGI-> | ||
| + | |||
| + | my $cgi_id = $cgi-> | ||
| + | |||
| + | my $events_count = 0; | ||
| + | |||
| + | $dbh-> | ||
| + | |||
| + | ## 指定ツアーの公演回数を取得 | ||
| + | my $sth0 = $dbh-> | ||
| + | $sth0-> | ||
| + | $sth0-> | ||
| + | $sth0-> | ||
| + | $sth0-> | ||
| + | $sth0-> | ||
| + | $dbh-> | ||
| + | |||
| + | my @cols; | ||
| + | my $sth1 = $dbh-> | ||
| + | $sth1-> | ||
| + | |||
| + | for(my $cnt = 0; $cnt < $events_count+2 ; $cnt++) | ||
| + | { | ||
| + | $cols[$cnt]=" | ||
| + | $sth1-> | ||
| + | } | ||
| + | |||
| + | print $cgi-> | ||
| + | print $cgi-> | ||
| + | charset =>' | ||
| + | style | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | print $cgi-> | ||
| + | print " | ||
| + | |||
| + | my $sel1, | ||
| + | my $cssclass | ||
| + | my $data = ""; | ||
| + | |||
| + | while( $sth1-> | ||
| + | { | ||
| + | print $cgi-> | ||
| + | for(my $i=0; $i< | ||
| + | { | ||
| + | if ($i == 0) { $sel1 = $cols[$i]; next; } | ||
| + | if ($i == 1) { $sel2 = $cols[$i]; next; } | ||
| + | |||
| + | $cssclass = ""; | ||
| + | |||
| + | if (($sel1 == 0)&& | ||
| + | if (($sel1 == 0)&& | ||
| + | if (($sel1 == 0)&& | ||
| + | if ($sel1 == 1) { $cssclass = ""; | ||
| + | |||
| + | $cols[$i] = "" | ||
| + | |||
| + | $data = encode(' | ||
| + | $data = encode(' | ||
| + | |||
| + | print $cgi-> | ||
| + | print $cgi-> | ||
| + | } | ||
| + | | ||
| + | print $cgi-> | ||
| + | print " | ||
| + | } | ||
| + | |||
| + | $sth1-> | ||
| + | $dbh-> | ||
| + | |||
| + | print $cgi-> | ||
| + | print $cgi-> | ||
| + | |||
| + | $dbh-> | ||
| + | exit(0); | ||
| + | |||
| + | sub gensep() | ||
| + | { | ||
| + | my ($count) = @_; | ||
| + | my $sql; | ||
| + | |||
| + | ## 区切りSQL | ||
| + | $sql = " | ||
| + | for(my $cnt=0; $cnt< | ||
| + | { | ||
| + | $sql .=',' | ||
| + | $sql .= "' | ||
| + | } | ||
| + | |||
| + | return $sql; | ||
| + | } | ||
| + | sub gensql() | ||
| + | { | ||
| + | my ($count, $id)=@_; | ||
| + | my $sql = ""; | ||
| + | my $sql2 = ""; | ||
| + | |||
| + | ## 公演日を横につなげる | ||
| + | $sql = ' | ||
| + | for(my $cnt=0; $cnt< | ||
| + | { | ||
| + | $sql .=',' | ||
| + | $sql .= sprintf(" | ||
| + | } | ||
| + | $sql .= sprintf(" | ||
| + | |||
| + | ## 開催場所、会場を横につなげる | ||
| + | my @v1 = ( {tbl=>' | ||
| + | foreach my $item ( @v1 ) | ||
| + | { | ||
| + | $sql .= " UNION ALL\n SELECT 0, 2, "; | ||
| + | for(my $cnt=0; $cnt< | ||
| + | { | ||
| + | $sql .=',' | ||
| + | $sql .= sprintf(" | ||
| + | } | ||
| + | $sql .= sprintf(" | ||
| + | } | ||
| + | |||
| + | $sql .= " UNION ALL\n " . & | ||
| + | |||
| + | ## セットリスト、アンコール演目、Wアンコール演目を横につなげる | ||
| + | foreach my $item (1,2,3) | ||
| + | { | ||
| + | $sql .= " UNION ALL\n SELECT 1 as sel1, s1.order_index as sel2, "; | ||
| + | $sql2 = " | ||
| + | for(my $cnt=0; $cnt< | ||
| + | { | ||
| + | $sql2 .=',' | ||
| + | $sql2 .= sprintf(" | ||
| + | |||
| + | $sql .=',' | ||
| + | $sql .= sprintf(" | ||
| + | } | ||
| + | $sql2 .= sprintf(" | ||
| + | left outer join songs t3 on (t2.song_id = t3.id) | ||
| + | WHERE tour_id=%d | ||
| + | AND t2.list_type=%d | ||
| + | GROUP BY t2.order_index | ||
| + | ORDER BY t2.order_index", | ||
| + | $sql .= " FROM (" . $sql2 . ") s1\n"; | ||
| + | |||
| + | $sql .= " UNION ALL\n " . & | ||
| + | } | ||
| + | |||
| + | return $sql; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | {{tag> | ||
documents/proglang/perl/perl-201.txt · 最終更新: by k896951
