: 上記データベースに追加/修正/削除を行なうプログラム: input.pl
: LAPP/LAMP の基本 (SQL +
: perl による cgi-bin の作成
目次
#! /usr/bin/perl -w
use CGI;
use Pg;
use CGI::Carp qw(fatalsToBrowser);
use CGI qw/:standard/;
use strict;
my $db = 'balance';
# get key table
my ($tbl_i, $tbl_f, %titles, $qstr, $res, $n);
my $conn = Pg::connectdb("user=www dbname = $db");
if ($conn->status ne PGRES_CONNECTION_OK) {
print "Cannot connect to database $db: $conn->errorMessage";
exit;
}
$tbl_i = 'titles';
$qstr = "select * from $tbl_i;";
if (&submit_sql()) {
for (my $i = 0; $i < $n; $i++) {
my $key = $res->getvalue($i, 0);
$titles{$key} = $res->getvalue($i, 1);
}
}
print header;
print start_html(-title=>"Settlement",
-meta=>{'Content-Type'=>'text/html; charset=x-euc-jp'}
),"\n";
print h2('財務諸表'),"\n";
# select year and output-sheet
my @years = ('1997','1998','1999','2000','2001','2002','2003');
my $year;
my @sheets = ('仕訳帳','期首貸借対照表・フロー計算書','貸借対照表・損益計算書');
my $sheet;
print
start_form(),
'年と表を選んでください ',
popup_menu(-name=>'year',-values=>\@years,-defaults=>$years[$#years]),
popup_menu(-name=>'sheet',-values=>\@sheets,-defaults=>$sheets[$#sheets]),
submit('実行'),br(),
end_form(),"\n";
if (!($year = param('year'))) {$year = $years[$#years];}
$tbl_i = 'i'.$year;
$tbl_f = 'f'.$year;
if (!($sheet = param('sheet'))) {$sheet = $sheets[$#sheets];}
my ($i, $amount, $debit, $credit, $profit);
# print journal
if ($sheet eq '仕訳帳') {
print h3('仕訳帳'),"\n";
print "<table border>\n";
print "<tr><td colspan=3> </td>
<td colspan=4 align=center>仕訳帳</td><td> </td></tr>\n";
printf("<tr><td>%s</td><td>%s</td><td>%s</td>
<td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n",
'No.','年月日','摘要',
'左借方','金額','右貸方','金額','cash');
$qstr = "select oid,* from $tbl_f;";
if (&submit_sql()) {
$debit = 0;
for ($i = 0; $i < $n; $i++) {
$amount = $res->getvalue($i,2);
$debit += $amount;
printf("<tr><td>%s</td><td>%s</td><td>%s</td>
<td>%s</td><td align=right>%s</td>
<td>%s</td><td align=right>%s</td>
<td>%s</td></tr>\n",
$res->getvalue($i,0),
$res->getvalue($i,5),&chksp($res->getvalue($i,6)),
&chksp($titles{$res->getvalue($i,1)}),$amount,
&chksp($titles{$res->getvalue($i,3)}),$amount,
$res->getvalue($i,4));
}
printf("<tr><td>%s</td><td>%s</td><td>%s</td>
<td>%s</td><td align=right>%s</td>
<td>%s</td><td align=right>%s</td><td>%s</td></tr>\n",
' ',' ',' ',
'【To】',$debit,'【From】',$debit,' ');
}
print "</table>\n";
}
#print flow statement (F/S)
if ($sheet eq '期首貸借対照表・フロー計算書') {
print h3('期首貸借対照表・フロー計算書'),"\n";
print "<table border>\n";
print "<tr><td></td>
<td colspan=4 align=center>期首貸借対照表</td><td></td></tr>\n";
printf("<tr><td>%s</td><td>%s</td><td align=right>%s</td>
<td>%s</td><td align=right>%s</td><td>%s</td></tr>\n",
'No.','左借方','金額','右貸方','金額','摘要');
$qstr =
"select oid,* from $tbl_i;";
if (&submit_sql()) {
my ($d_key, $c_key);
$debit = 0;
for (my $i = 0; $i < $n; $i++) {
$amount = $res->getvalue($i,2);
$d_key = $res->getvalue($i,1);
$c_key = $res->getvalue($i,3);
if ($d_key !~ /^0/ && $amount) {
printf("<tr><td>%s</td><td>%s</td><td align=right>%s</td>
<td>%s</td><td align=right>%s</td><td>%s</td>\n",
$res->getvalue($i,0),$titles{$d_key},$amount,
' ',' ',&chksp($res->getvalue($i,4)));
$debit += $amount;
}
if ($c_key !~ /^0/ && $amount) {
printf("<tr><td>%s</td><td>%s</td><td align=right>%s</td>
<td>%s</td><td align=right>%s</td><td>%s</td>\n",
$res->getvalue($i,0),' ',' ',
$titles{$c_key},$amount,&chksp($res->getvalue($i,4)));
$credit += $amount;
}
}
if ($debit != $credit) {print "<p>Unbalanced!</p>\n";}
$profit = $debit - $credit;
if ($profit) {
$credit += $profit;
printf("<tr><td>%s</td><td align=right>%s</td>
<td>%s</td><td align=right>%s</td></tr>\n",
' ',' ','*当期利益',&chksp($profit));
}
if ($debit != $credit) {print "<p>Unbalanced!</p>\n";}
printf("<tr><td>%s</td>
<td>%s</td><td align=right>%s</td>
<td>%s</td><td align=right>%s</td><td>%s</td></tr>\n",
' ','【資産】',$debit,'【負債資本】',$debit,' ');
}
print "<tr><td></td></tr>\n";
print "<tr><td></td>
<td colspan=4 align=center>キャッシュフロー (cash)</td></tr>\n";
printf("<tr><td>%s</td><td>%s</td><td align=right>%s</td>
<td>%s</td><td align=right>%s</td></tr>\n",
'','左借方','金額','右貸方','金額');
$qstr =
"select * from (
select * from (
select debit as key, sum(amount) as dsum from (
select * from $tbl_f where cash != 'n'
)dc group by debit
)d full outer join (
select credit as key, sum(amount) as csum from (
select * from $tbl_f where cash != 'n'
)cc group by credit
)c using(key)
)t join titles using(key);";
if (&submit_sql()) {
$debit = $credit = 0;
for ($i = 0; $i < $n; $i++) {
if ($res->getvalue($i,4) eq 'rd') {
$amount = $res->getvalue($i,1)-$res->getvalue($i,2);
if ($amount) {
$debit += $amount;
printf("<tr><td>%s</td><td>%s</td><td align=right>%s</td>
<td>%s</td><td>%s</td></tr>\n",
'',$res->getvalue($i,3),&chksp($amount),
' ',' ');
}
} elsif ($res->getvalue($i,4) eq 'rc') {
$amount = $res->getvalue($i,2)-$res->getvalue($i,1);
if ($amount) {
$credit += $amount;
printf("<tr><td>%s</td><td>%s</td><td>%s</td>
<td>%s</td><td align=right>%s</td></tr>\n",
'',' ',' ',
$res->getvalue($i,3),&chksp($amount));
}
} elsif ($res->getvalue($i,4) eq 'ic') {
$amount = $res->getvalue($i,2)-$res->getvalue($i,1);
if ($amount) {
$credit += $amount;
printf("<tr><td>%s</td><td>%s</td><td>%s</td>
<td>%s</td><td align=right>%s</td></tr>\n",
'',' ',' ',
$res->getvalue($i,3),&chksp($amount));
}
} elsif ($res->getvalue($i,4) eq 'id') {
$amount = $res->getvalue($i,1)-$res->getvalue($i,2);
if ($amount) {
$debit += $amount;
printf("<tr><td>%s</td><td>%s</td><td align=right>%s</td>
<td>%s</td><td>%s</td></tr>\n",
'',$res->getvalue($i,3),&chksp($amount),
' ',' ');
}
}
}
if ($debit != $credit) {print "<p>Unbalanced!</p>\n";}
printf("<tr><td>%s</td><td>%s</td><td align=right>%s</td>
<td>%s</td><td align=right>%s</td></tr>\n",
'','【To】',&chksp($debit),'【From】',&chksp($credit));
}
print "<tr></tr>\n";
print "<tr><td></td>
<td colspan=4 align=center>非キャッシュフロー (non-cash)</td></tr>\n";
printf("<tr><td>%s</td><td>%s</td><td align=right>%s</td>
<td>%s</td><td align=right>%s</td></tr>\n",
'','左借方','金額','右貸方','金額');
$qstr =
"select * from (
select * from (
select debit as key, sum(amount) as dsum from (
select * from $tbl_f where cash = 'n'
)dc group by debit
)d full outer join (
select credit as key, sum(amount) as csum from (
select * from $tbl_f where cash = 'n'
)cc group by credit
)c using(key)
)t join titles using(key);";
if (&submit_sql()) {
$debit = $credit = 0;
for ($i = 0; $i < $n; $i++) {
if ($res->getvalue($i,4) eq 'rd') {
$amount = $res->getvalue($i,1)-$res->getvalue($i,2);
if ($amount) {
$debit += $amount;
printf("<tr><td>%s</td><td>%s</td><td align=right>%s</td>
<td>%s</td><td>%s</td></tr>\n",
'',$res->getvalue($i,3),&chksp($amount),
' ',' ');
}
} elsif ($res->getvalue($i,4) eq 'rc') {
$amount = $res->getvalue($i,2)-$res->getvalue($i,1);
if ($amount) {
$credit += $amount;
printf("<tr><td>%s</td><td>%s</td><td>%s</td>
<td>%s</td><td align=right>%s</td></tr>\n",
'',' ',' ',
$res->getvalue($i,3),&chksp($amount));
}
} elsif ($res->getvalue($i,4) eq 'ic') {
$amount = $res->getvalue($i,2)-$res->getvalue($i,1);
if ($amount) {
$credit += $amount;
printf("<tr><td>%s</td><td>%s</td><td>%s</td>
<td>%s</td><td align=right>%s</td></tr>\n",
'',' ',' ',
$res->getvalue($i,3),&chksp($amount));
}
} elsif ($res->getvalue($i,4) eq 'id') {
$amount = $res->getvalue($i,1)-$res->getvalue($i,2);
if ($amount) {
$debit += $amount;
printf("<tr><td>%s</td><td>%s</td><td align=right>%s</td>
<td>%s</td><td>%s</td></tr>\n",
'',$res->getvalue($i,3),&chksp($amount),
' ',' ');
}
}
}
printf("<tr><td>%s</td><td>%s</td><td align=right>%s</td>
<td>%s</td><td align=right>%s</td></tr>\n",
'','【To】',&chksp($debit),'【From】',&chksp($credit));
if ($debit != $credit) {print "<p>Unbalanced!</p>\n";}
}
print "</table>\n";
}
# print B/S and P/L
if ($sheet eq '貸借対照表・損益計算書') {
print h3('貸借対照表・損益計算書'),"\n";
print "<table border>\n";
$qstr =
"select * from (
select * from (
select debit as key,sum(amount) as d_sum from (
select debit,amount from $tbl_i union all
select debit,amount from $tbl_f
) d group by debit
) ds full outer join (
select credit as key,sum(amount) as c_sum from (
select credit,amount from $tbl_i union all
select credit,amount from $tbl_f
) c group by credit
) cs using(key)
)t join titles using(key);";
if (&submit_sql()) {
print "<tr><td colspan=4 align=center>貸借対照表</td></tr>\n";
printf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n",
'左借方','金額','右貸方','金額');
$debit = $credit = 0;
for ($i = 0; $i < $n; $i++) {
if ($res->getvalue($i,4) eq 'rd') {
$amount = $res->getvalue($i,1)-$res->getvalue($i,2);
if ($amount) {
$debit += $amount;
printf("<tr><td>%s</td><td align=right>%s</td>
<td>%s</td><td align=right>%s</td></tr>\n",
$res->getvalue($i,3),&chksp($amount),
' ',' ');
}
} elsif ($res->getvalue($i,4) eq 'rc') {
$amount = $res->getvalue($i,2)-$res->getvalue($i,1);
if ($amount) {
$credit += $amount;
printf("<tr><td>%s</td><td align=right>%s</td>
<td>%s</td><td align=right>%s</td></tr>\n",
' ',' ',
$res->getvalue($i,3),&chksp($amount));
}
}
}
$profit = $debit - $credit;
if ($profit) {
$credit += $profit;
printf("<tr><td>%s</td><td align=right>%s</td>
<td>%s</td><td align=right>%s</td></tr>\n",
' ',' ','*当期利益',&chksp($profit));
}
printf("<tr><td>%s</td><td align=right>%s</td>
<td>%s</td><td align=right>%s</td></tr>\n",
'【資産】',$debit,'【負債資本】',$credit);
if ($debit != $credit) {print "<p>Unbalanced!</p>\n";}
print "<tr></tr>";
print "<tr><td colspan=4 align=center>損益計算書</td></tr>\n";
printf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n",
'左借方','金額','右貸方','金額');
$debit = $credit = 0;
for ($i = 0; $i < $n; $i++) {
if ($res->getvalue($i,4) eq 'ic') {
$amount = $res->getvalue($i,2)-$res->getvalue($i,1);
if ($amount) {
$credit += $amount;
printf("<tr><td>%s</td><td align=right>%s</td>
<td>%s</td><td align=right>%s</td></tr>\n",
' ',' ',
$res->getvalue($i,3),&chksp($amount));
}
} elsif ($res->getvalue($i,4) eq 'id') {
$amount = $res->getvalue($i,1)-$res->getvalue($i,2);
if ($amount) {
$debit += $amount;
printf("<tr><td>%s</td><td align=right>%s</td>
<td>%s</td><td align=right>%s</td></tr>\n",
$res->getvalue($i,3),&chksp($amount),
' ',' ');
}
}
}
$profit = $credit - $debit;
if ($profit) {
$debit += $profit;
printf("<tr><td>%s</td><td align=right>%s</td>
<td>%s</td><td align=right>%s</td></tr>\n",
'*!当期利益',$profit,' ',' ');
}
printf("<tr><td>%s</td><td align=right>%s</td>
<td>%s</td><td align=right>%s</td></tr>\n",
'【費用】',&chksp($debit),'【収益】',&chksp($credit));
if ($debit != $credit) {print "<p>Unbalanced!</p>\n";}
}
print "</table>\n";
}
print end_html;
sub submit_sql {
$res = $conn->exec($qstr);
if ($res->resultStatus ne PGRES_TUPLES_OK) {
print "Query failed: $conn->errorMessage\n";
return 0;
}
$n = $res->ntuples;
if ($n == 0) {
print '<p>No record in DB</p>',"\n";
return 0;
}
return 1;
}
sub chksp {
if ($_[0] eq '') {return ' ';}
return $_[0];
}
: 上記データベースに追加/修正/削除を行なうプログラム: input.pl
: LAPP/LAMP の基本 (SQL +
: perl による cgi-bin の作成
目次
Yoichi OKABE
平成19年1月21日