ポイントは、iPhone内のデータベースのInsertやSelect,Updateなどは、非同期で実行される点。
functionの最後にSelectした結果をreturnしてもreturnされないこともあります。
var initflag=0;//初期化完了フラグ
//var jQT;
var db=null;
var datalist="";//SELECTの結果
var flag=0;//0 UPDATE 1 DELETE
var sdat;//集計期間 開始日
var edat;//集計期間 終了日
var tdat;//今日
var kid;//仕分けデータID
var cnt=0,cnt2=0,cardkin=0;//cnt 今日の入力件数 cnt2 期間中の件数
var inkin="収入計:"+0+"円";
var outkin="支出計:"+0+"円";
var syushi="収 支:"+0+"円";//収支計
var usecard=0;//クレジットカード 初期値 使わない
var usebank=0;//銀行口座 初期値 使わない
var soutkamokumei = new Array("未使用","食費","外食","日用雑貨","衣料費","嗜好品","医療費","交通費・ガソリン代","教育・教養","娯楽・レジャー","慶弔・交際費","雑費","電気","ガス","水道","電話・携帯・インターネット","住居費","保険料","定期預金","ローン引落し","クレジット引落し","新聞・受信料","税金");
var sinkamokumei = new Array("未使用","現金払い","カード払い","口座引落");
var hdat,hkingaku,hbikou,haraiid,hkamokuid;
function nullDataHandler(tx, rs) {
}
function TransactionErrorCallback(error){
alert('Oops. Error was '+error.message+' (Code '+error.code+')');
}
function errorHandler(transaction, error){//エラーハンドラ
alert('エラー Error was '+error.message+' (Code '+error.code+')');
var we_think_this_error_is_fatal = true;
if (we_think_this_error_is_fatal) return true;
return false;
}
function createDB(){//データベースの構築
try {
if (!window.openDatabase) {
alert('このサイトはSafariでご利用ください。\niPhoneおよびWindows阪Mac阪Safariでご利用いただけます。');
} else {
var shortName = 'minkdb';
var version = '1.0';
var displayName = '家計簿Minkデータベース';
var maxSize = 5000000; // in bytes
db = openDatabase(shortName, version, displayName, maxSize);
}
} catch(e) {
// Error handling code goes here.
if (e == 2) {
// Version number mismatch.
alert("データベースバージョン不一致エラー");
} else {
alert("不明なエラー"+e+".");
}
return;
}
var dat= new Date();
var m=(dat.getMonth()+1);
var d=dat.getDate();
if((dat.getMonth()+1)<10){
m="0"+(dat.getMonth()+1);
}
if(dat.getDate()<10){
d="0"+dat.getDate();
}
tdat = dat.getFullYear()+"/"+m+"/"+d;
//droptable();//データの削除
db.transaction(function(tx) {// テーブルを作る
tx.executeSql('CREATE TABLE IF NOT EXISTS user (sdate TEXT,edate TEXT,card INTEGER,bank INTEGER);', [], nullDataHandler, errorHandler);
tx.executeSql('SELECT * FROM user;', [], function (tx, resultSet) {
if(resultSet.rows.length==0){//userが存在しない場合
var dat= new Date();
var m=(dat.getMonth()+1);
var d=dat.getDate();
if((dat.getMonth()+1)<10){
m="0"+(dat.getMonth()+1);
}
if(dat.getDate()<10){
d="0"+dat.getDate();
}
var today = dat.getFullYear()+"/"+m+"/"+d;
var dat2=computeDate(dat.getFullYear(),dat.getMonth()+1,dat.getDate(),30);
m=(dat2.getMonth()+1);
d=dat2.getDate();
if((dat2.getMonth()+1)<10){
m="0"+(dat2.getMonth()+1);
}
if(dat2.getDate()<10){
d="0"+dat2.getDate();
}
var nextmonth=dat2.getFullYear()+"/"+m+"/"+d;
tx.executeSql('insert into user values(?,?,?,?);', [today,nextmonth,1,0], [], nullDataHandler, errorHandler);
sdat = today;
edat = nextmonth;
usecard = 1;
usebank = 0;
}else{
tx.executeSql('SELECT * FROM user;', [], function (tx, rs){
var row = rs.rows.item(0);
sdat = row['sdate'];
edat = row['edate'];
usecard = row['card'];
usebank = row['bank'];
}, errorHandler);
}
homeUpdate();
}, errorHandler);
tx.executeSql('CREATE TABLE IF NOT EXISTS shiwake(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, type TEXT,date TEXT,hid INTEGER,kid INTEGER,kingaku INTEGER,bikou TEXT)');
}, TransactionErrorCallback,function(){});
}
function homeUpdate(){
var ink=0;
var outk=0;
var syushik=0;
db.transaction(function(tx) {//
tx.executeSql('SELECT count(*) as cnt FROM shiwake where date=?;', [tdat], function (tx, resultSet) {
var row =resultSet.rows.item(0);
cnt = row.cnt;//今日の入力件数
tx.executeSql('SELECT count(*) as cnt FROM shiwake where date between "'+sdat+'" and "'+ edat+'";', [], function (tx, resultSet) {
var row =resultSet.rows.item(0);
cnt2=row["cnt"];//指定機関の入力件数
tx.executeSql('SELECT sum(kingaku) as kin FROM shiwake where type ="in" and hid = 1 and date between "'+sdat+'" and "'+ edat+'";', [], function (tx, resultSet) {
var row =resultSet.rows.item(0);
ink=row["kin"];
if(ink==null){
inkin="収入計:0円";//収入を集計
}else{
inkin="収入計:"+addFigure(ink)+"円";//収入を集計
}
tx.executeSql('SELECT sum(kingaku) as kin FROM shiwake where type = "out" and hid = 1 and date between "'+sdat+'" and "'+ edat+'";', [], function (tx, resultSet) {
var row =resultSet.rows.item(0);
outk=row["kin"];
if(outk==null){
outkin="支出計:0円";//収入を集計
}else{
outkin="支出計:"+addFigure(outk)+"円";//収入を集計
}
tx.executeSql('SELECT sum(kingaku) as kin FROM shiwake where type = "out" and hid = 2 and date between "'+sdat+'" and "'+ edat+'";', [], function (tx, resultSet) {
var row =resultSet.rows.item(0);
var cardw=row["kin"];
if(cardw==null){
cardkin= "";//カーリ利用額を計算
}else{
cardkin= "カード利用計:"+addFigure(cardw)+"円";//カーリ利用額を計算
}
syushik=ink-outk;
syushi="収 支:"+addFigure(syushik) +"円";//収支;
if(initflag==0){
$(function(){
$('#sin')
.bind('pageAnimationStart', function(e, info){
if(tdat<sdat){
$(this).find('#sindate').html(getCal(sdat));
}else{
$(this).find('#sindate').html(getCal(tdat));
}
document.forms["sin"].reset();
})
.bind("submit",function(){
sin();
});
$('#sinh')
.bind('pageAnimationStart', function(e, info){
//hensyu();
document.forms["sinh"].reset();
})
.bind('pageAnimationEnd', function(e, info){
$(this).find('#sinhdate').html(getCal(hdat));
$("#sinhkingaku").val(hkingaku);
$("#sinhbikou").val(hbikou);
});
$('#south')
.bind('pageAnimationStart', function(e, info){
//hensyu();
document.forms["south"].reset();
})
.bind('pageAnimationEnd', function(e, info){
$(this).find('#southdate').html(getCal(hdat));
$(this).find('#southkamoku').html(getsoutKamoku());
$(this).find('#southshiharai').html(getHarai());
$("#southkingaku").val(hkingaku);
$("#southbikou").val(hbikou);
});
$('#sout')
.bind('pageAnimationStart', function(e, info){
if(tdat<sdat){
$(this).find('#soutdate').html(getCal(sdat));
}else{
$(this).find('#soutdate').html(getCal(tdat));
}
$(this).find('#soutkamoku').html(getsoutKamoku());
$(this).find('#soutshiharai').html(getHarai());
document.forms["sout"].reset();
})
.bind("submit",function(){
sout();
});
$('#kikanset')
.bind('pageAnimationStart', function(e, info){
$(this).find('#date1').html(getCal(sdat));
$(this).find('#date2').html(getCal(edat));
})
.bind("submit",function(){
setKikan();
});
$('#todaydata')
.bind('pageAnimationEnd', function(e, info){
$(this).find('#tdlist').html(datalist);
})
.bind('pageAnimationStart', function(e, info){
showdatalist("today");
$(this).find('#tdate').html(convjpDate(tdat));
});
$('#kikandata')
.bind('pageAnimationEnd', function(e, info){
$(this).find('#kdlist').html(datalist);
})
.bind('pageAnimationStart', function(e, info){
showdatalist("kikan");
$(this).find('#ksdate').html(convjpDate(sdat));
$(this).find('#kedate').html(convjpDate(edat));
});
$('#kamokudata')
.bind('pageAnimationEnd', function(e, info){
$(this).find('#kamokulist').html(datalist);
})
.bind('pageAnimationStart', function(e, info){
kamokudatalist();
$(this).find('#ksdate').html(convjpDate(sdat));
$(this).find('#kedate').html(convjpDate(edat));
});
$('#home')
.ready(function(e, info){
$(this).find('#copyright').html(getCopyright());
$(this).find('#sdate').text(convjpDate(sdat));
$(this).find('#edate').text(convjpDate(edat));
$(this).find('#todaycnt').text(cnt);
$(this).find('#kikancnt').text(cnt2);
$(this).find('#insum').text(inkin);
$(this).find('#outsum').text(outkin);
$(this).find('#syushi').text(syushi);
$(this).find('#cardkei').text(cardkin);
})
.bind('pageAnimationStart', function(e, info){
homeUpdate();
})
.bind('pageAnimationEnd', function(e, info){
$(this).find('#sdate').text(convjpDate(sdat));
$(this).find('#edate').text(convjpDate(edat));
$(this).find('#todaycnt').text(cnt);
$(this).find('#kikancnt').text(cnt2);
$(this).find('#insum').text(inkin);
$(this).find('#outsum').text(outkin);
$(this).find('#syushi').text(syushi);
$(this).find('#cardkei').text(cardkin);
});
});
initflag=1;//初期化完了
}else{
//jQT.goTo($('#home'), 'cube');
}
});
}, errorHandler);
}, errorHandler);
}, errorHandler);
}, errorHandler);
}, TransactionErrorCallback);
}
function getCal(setdate){//前後1年間の日付を表示
var now = new Date();
var hi;
if(setdate==null){
hi=now;
}else{
hi = new Date(setdate);
}
var selectdata="";
var m,d;
for(var i=-365;i<0;i++){
var dat=computeDate(now.getFullYear(),now.getMonth()+1,now.getDate(),i);
m=(dat.getMonth()+1);
d=dat.getDate();
if((dat.getMonth()+1)<10){
m="0"+(dat.getMonth()+1);
}
if(dat.getDate()<10){
d="0"+dat.getDate();
}
if((dat.getFullYear()+"/"+dat.getMonth()+"/"+dat.getDate())==(hi.getFullYear()+"/"+hi.getMonth()+"/"+hi.getDate())){
selectdata+='<option value="'+dat.getFullYear()+"/"+m+"/"+d+'" selected>'+dat.getFullYear()+"年"+(dat.getMonth()+1)+"月"+dat.getDate()+'日'+getYoubi(dat.getDay())+'</option>';
}else{
selectdata+='<option value="'+dat.getFullYear()+"/"+m+"/"+d+'">'+dat.getFullYear()+"年"+(dat.getMonth()+1)+"月"+dat.getDate()+'日'+getYoubi(dat.getDay())+'</option>';
}
}
var dat=computeDate(now.getFullYear(),now.getMonth()+1,now.getDate(),0);
m=(dat.getMonth()+1);
d=dat.getDate();
if((dat.getMonth()+1)<10){
m="0"+(dat.getMonth()+1);
}
if(dat.getDate()<10){
d="0"+dat.getDate();
}
if((dat.getFullYear()+"/"+dat.getMonth()+"/"+dat.getDate())==(hi.getFullYear()+"/"+hi.getMonth()+"/"+hi.getDate())){
selectdata+='<option value="'+dat.getFullYear()+"/"+m+"/"+d+'" selected>'+dat.getFullYear()+"年"+(dat.getMonth()+1)+"月"+dat.getDate()+'日'+getYoubi(dat.getDay())+'</option>';
}else{
selectdata+='<option value="'+dat.getFullYear()+"/"+m+"/"+d+'">'+dat.getFullYear()+"年"+(dat.getMonth()+1)+"月"+dat.getDate()+'日'+getYoubi(dat.getDay())+'</option>';
}
for(var i=1;i<365;i++){
var dat=computeDate(now.getFullYear(),now.getMonth()+1,now.getDate(),i);
m=(dat.getMonth()+1);
d=dat.getDate();
if((dat.getMonth()+1)<10){
m="0"+(dat.getMonth()+1);
}
if(dat.getDate()<10){
d="0"+dat.getDate();
}
if((dat.getFullYear()+"/"+dat.getMonth()+"/"+dat.getDate())==(hi.getFullYear()+"/"+hi.getMonth()+"/"+hi.getDate())){
selectdata+='<option value="'+dat.getFullYear()+"/"+m+"/"+d+'" selected>'+dat.getFullYear()+"年"+(dat.getMonth()+1)+"月"+dat.getDate()+'日'+getYoubi(dat.getDay())+'</option>';
}else{
selectdata+='<option value="'+dat.getFullYear()+"/"+m+"/"+d+'">'+dat.getFullYear()+"年"+(dat.getMonth()+1)+"月"+dat.getDate()+'日'+getYoubi(dat.getDay())+'</option>';
}
}
return selectdata;
}
//n日後、n日前の日付を求める
/* 年月日と加算日からn日後、n日前を求める関数 year 年 month 月* day 日 addDays 加算日。マイナス指定でn日前も設定可能
*/
function computeDate(year, month, day, addDays) {//日付の計算
var dt = new Date(year, month - 1, day);
var baseSec = dt.getTime();
var addSec = addDays * 86400000;//日数 * 1日のミリ秒数
var targetSec = baseSec + addSec;
dt.setTime(targetSec);
return dt;
}
function getYoubi(day){//曜日の取得
var youbi="";
switch(day){
case 0:
youbi="(日)";break;
case 1:
youbi="(月)";break;
case 2:
youbi="(火)";break;
case 3:
youbi="(水)";break;
case 4:
youbi="(木)";break;
case 5:
youbi="(金)";break;
case 6:
youbi="(土)";break;
}
return youbi;
}
function convjpDate(date){//yyyy年mm月dd日(Y)形式に変換
var ret="";
var dat= new Date(date);
ret +=dat.getFullYear()+"年"+(dat.getMonth()+1)+"月"+dat.getDate()+'日'+getYoubi(dat.getDay());
return ret;
}
function getsoutKamoku(){//支出科目を表示
var selectsoutkamoku="";
//alert(hkamokuid);
for(var i=1;i<soutkamokumei.length;i++){
if(hkamokuid==i){
selectsoutkamoku+='<option value="'+i+'"selected>'+soutkamokumei[i]+'</option>';
}else{
selectsoutkamoku+='<option value="'+i+'">'+soutkamokumei[i]+'</option>';
}
}
return selectsoutkamoku;
}
function getHarai(){//支払い方法を表示
var southarai="";
if(haraiid==1){
southarai+='<option value="1" selected>現金払い</option>';
}else{
southarai+='<option value="1">現金払い</option>';
}
if(usecard=="1"){
if(haraiid==2){
southarai+='<option value="2" selected >クレジットカード払い</option>';
}else{
southarai+='<option value="2">クレジットカード払い</option>';
}
}
if(usebank=="1"){
if(haraiid==3){
southarai+='<option value="3" selected >口座引き落とし</option>';
}else{
southarai+='<option value="3">口座引き落とし</option>';
}
}
return southarai;
}
function getCopyright(){
var txt=
'<p>Copyright 2010-2011 <a href="http://www.tklab.info/">Tklab.info</a></P>';
return txt;
}
function setKikan(){//期間設定
sdat = document.forms["setKikan"].elements["date1"].value;
edat = document.forms["setKikan"].elements["date2"].value;
if(sdat>edat){
var work=sdat;
sdat=edat;
edat=work;
}
db.transaction(function(tx) {
tx.executeSql('update user set sdate=?,edate=?;', [sdat,edat], nullDataHandler, errorHandler);
},errorHandler,function(){
alert("集計期間を設定しました。");
jQT.goBack("#home","cube");
});
}
function sin(){//収入入力
var sdat = document.forms["sin"].elements["sindate"].value;
var kingaku = document.forms["sin"].elements["kingaku"].value;
var bikou =document.forms["sin"].elements["bikou"].value;
if(isNaN(kingaku) || kingaku==""){
alert("金額が入力されていません。");
return;
}
db.transaction(function(tx) {
tx.executeSql('insert into shiwake (type,date,hid,kid,kingaku,bikou) values (?,?,?,?,?,?);', ["in",sdat,1,1,kingaku,bikou],
function(){
jQT.goBack("home","cube");
}, errorHandler);
});
}
function sout(){//支出入力
var sdat = document.forms["sout"].elements["soutdate"].value;
var kingaku = document.forms["sout"].elements["kingaku"].value;
var bikou =document.forms["sout"].elements["bikou"].value;
var harai = document.forms["sout"].elements["soutshiharai"].value;
var kamoku =document.forms["sout"].elements["soutkamoku"].value;
if(isNaN(kingaku) || kingaku==""){
alert("金額が入力されていません。");
return;
}
db.transaction(function(tx) {
tx.executeSql('insert into shiwake (type,date,hid,kid,kingaku,bikou) values (?,?,?,?,?,?);', ["out",sdat,harai,kamoku,kingaku,bikou],
function(){
jQT.goBack("home","cube");
}, errorHandler);
});
}
function addFigure(str) {//3桁区切りカンマを追加
var num = new String(str).replace(/,/g, "");
while(num != (num = num.replace(/^(-?\d+)(\d{3})/, "$1,$2")));
return num;
}
function showdatalist(flag){//期間中のリストを表示
var sql="";
if(flag=="kikan"){
sql='SELECT * FROM shiwake where date between "'+sdat+'" and "'+ edat+'"order by date desc;';
}else if(flag=="today"){
sql='SELECT * FROM shiwake where date ="'+tdat+'"order by id desc;';
}
datalist="";
db.transaction(function(tx) {// テーブルを取得
tx.executeSql(sql, [], function (tx, resultSet) {
for(var i=0;i<resultSet.rows.length;i++){
var row =resultSet.rows.item(i);
datalist+='<LI><form method="POST"name="hensyu'+row.id+'">';
if(row.type=="in"){
datalist+='<a href="#sinh" onTouchend="formCheck(this);"onclick="formCheck(this);">';
}else if(row.type=="out"){
datalist+='<a href="#south"onTouchend="formCheck(this);" onclick="formCheck(this);">';
}
if(flag=="kikan"){
datalist+=convjpDate(row.date)+"<BR>";
}
if(row.type=="in"){
datalist+="収入";
}else if(row.type=="out"){
datalist+=soutkamokumei[row["kid"]];
}
datalist+=" "+addFigure(row["kingaku"])+"円";
if(row.type=="out"){
datalist+=" "+sinkamokumei[row["hid"]];
}
datalist+="<BR>"+row["bikou"];
datalist+='<input type="hidden" id="kid"name="kid" value="'+row.id+'">';
datalist+="</a></form></LI>";
}
if(flag=="kikan"){
if(cnt2==0){
datalist="<li>期間中のデータはありません。</li>";
}
//jQT.goTo("#kikandata","cube");
}else if(flag=="today"){
if(cnt==0){
datalist="<li>今日のデータはありません。</li>";
}
//jQT.goTo("#todaydata","cube");
}
}, function(){
});
},errorHandler,function(){});
}
function kamokudatalist(){//科目別リストを表示
var sql='SELECT kid,sum(kingaku) as kin FROM shiwake where type = "out" and date between "'+sdat+'" and "'+ edat+'" and hid=1 group by kid order by kid ;';
datalist="";
db.transaction(function(tx) {// テーブルを取得
tx.executeSql(sql, [], function (tx, resultSet) {
var cntx=0;
for(var i=0;i<resultSet.rows.length;i++){
var row =resultSet.rows.item(i);
if(row["kin"]!=0){
datalist+='<LI>'+soutkamokumei[row["kid"]]+" "+addFigure(row["kin"])+"円</LI>";
cntx++;
}
}
if(cntx==0){
datalist="<li>期間中のデータはありません。</li>";
}
}, function(){});
},errorHandler,function(){});
}
function formCheck(obj){ //クリックされたidを格納
var nam = obj.parentElement.name;
kid = document.forms(nam).kid.value;
hensyu();
}
function hensyu(){//編集画面へデータ代入
db.transaction(function(tx) {// テーブルを作る
tx.executeSql('SELECT * FROM shiwake where id =?;', [kid], function (tx, resultSet) {
for(var i=0;i<resultSet.rows.length;i++){
var row =resultSet.rows.item(i);
hdat=row.date;
hkingaku=row.kingaku;
hbikou=row.bikou;
haraiid=row.hid;
hkamokuid=row.kid;
hmode=row.type;
}
}, errorHandler);
},errorHandler,function(){});
}
function sdelete(){//テーブルの削除
if(window.confirm('このデータを削除します。')){
db.transaction(function(tx) {
tx.executeSql('delete from shiwake where id=?;', [kid], nullDataHandler, errorHandler);
},errorHandler,function(){
alert("削除しました。");
jQT.goBack("#home","cube");
});
}
}
function supdate(){//テーブルの削除
if(window.confirm('このデータを変更します。')){
if(hmode=="out"){
hdat=document.forms["south"].elements["southdate"].value;
hkingaku=document.forms["south"].elements["kingaku"].value;
hbikou=document.forms["south"].elements["bikou"].value;
haraiid=document.forms["south"].elements["southshiharai"].value;
hkamokuid=document.forms["south"].elements["southkamoku"].value;
}else if(hmode=="in"){
hdat=document.forms["sinh"].elements["sinhdate"].value;
hkingaku=document.forms["sinh"].elements["kingaku"].value;
hbikou=document.forms["sinh"].elements["bikou"].value;
//haraiid=document.forms["sinh"].elements["sinhshiharai"].value;
//hkamokuid=document.forms["sinh"].elements["sinhkamoku"].value;
}
db.transaction(function(tx) {
tx.executeSql('update shiwake set date =?,kingaku=?,bikou=?,hid=?,kid=?,type=? where id=?;', [hdat,hkingaku,hbikou,haraiid,hkamokuid,hmode,kid], nullDataHandler, errorHandler);
},errorHandler,function(){
alert("更新しました。");
jQT.goBack("#home","cube");
});
}
}
0 件のコメント:
コメントを投稿