やっていなかった時間枠での予約管理を試すために
歯医者の予約システムを考えてみました。
中規模の歯科医で、数人の医者と衛生士がいて、
治療チエア単位(担当CDという枠にしています)の予約を想定しています。
10年来通っている歯科医が、4台の治療台で廻していて、
ノートで予約管理されているので、あれをパソコンでするなら・・・
という発想です。
単位を、主治医・衛生士単位にすることも想定して、敢えて椅子固定にしないで
担当CDという若干曖昧な、コードにしています。
実務は分からないので、こんな感じでどうかなという・・・ところです。
まあ・・・
実際に使われることはない、空しいシステムではありますが、
javascriptの勉強には、なります。(か?)
画面の後の、例によってソースを載せてますが、投稿限度を越えるので、
超えた分は、後続の投稿に続きます。
予約一覧
予約詳細
患者一覧
患者詳細
休業一覧
休業更新
DB作成
***<< DENTANOSUKE.hta >>********************************
<html>
<head>
<hta:application navigable="yes" scroll="auto">
</hta:application>
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<title>歯科予約システム</title>
<script src="https://ajaxzip3.github.io/ajaxzip3.js" charset="UTF-8"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.3/jquery-ui.min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.3/i18n/jquery-ui-i18n.min.js"></script>
<link type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.11.3/themes/redmond/jquery-ui.css" rel="stylesheet" />
<!-- jQueryテーマの一覧:変更の場合は、項目幅の再調整が必要です。
・black-tie ・blitzer ・cupertino ・dark-hive ・dot-luv ・eggplant ・excite-bike ・flick ・hot-sneaks ・humanity ・le-frog ・mint-choc ・overcast
・pepper-grinder ・redmond ・smoothness ・south-street ・start ・sunny ・swanky-purse ・trontastic ・ui-darkness ・ui-lightness ・vader -->
<script language="JavaScript" type="text/javascript">
var mdb = "DENTANOSUKE.mdb";
var wak = 5; // 担当コード数 (修正する場合は、window.resizeの幅値も変更すること)
var hab = 930; // window.resizeの幅値 5:930
var yyb = ""; // 予約日
var yyt = ""; // 予約月
var tcd = ""; // 担当CD
var kai = ""; // 開始時刻
var owa = ""; // 終了時刻
var tan = ""; // 受付担当者
var kid = ""; // 休業ID
/* ==================================================
__初期処理
===================================================== */
function func_init() {
window.resizeTo(hab,540);
var cn = new ActiveXObject("ADODB.Connection");
try {
cn.Open("Driver={Microsoft Access Driver (*.mdb)};DBQ=DENTANOSUKE.mdb");
cn.Close(); cn = null;
document.getElementById("li-4").style.display="none";
$("#tab_area").tabs({ disabled: [3] });
} catch (e) {
document.getElementById("li-1").style.display="none";
document.getElementById("li-2").style.display="none";
document.getElementById("li-3").style.display="none";
$("#tab_area").tabs({ active: [3] });
alert("MDBがありません、DB作成処理を実行して下さい!");
document.write("<BR><b>MDBがありません、DB作成処理を実行して下さい!</a>");
return;
}
document.getElementById("frm2").style.display="none";
set_selOdr1();
List_disp1();
document.getElementById("frm4").style.display="none";
Tbl_disp2();
document.getElementById("frm6").style.display="none";
List_disp3();
if (wak != 5) {
document.getElementById( "tbl1td" ).colSpan = wak -1;
}
}
/* ==================================================
__予約日一覧の設定
===================================================== */
function List_disp1() {
var cn = new ActiveXObject("ADODB.Connection");
var mySql = "SELECT format([予約日],'YYYY/MM/DD') FROM [受診予約] GROUP BY [予約日] ORDER BY [予約日] DESC";
cn.Open("Driver={Microsoft Access Driver (*.mdb)};DBQ=" + mdb);
var rs = cn.Execute(mySql);
var select = document.getElementById("selYYB");
for (var i = select.childNodes.length - 1; 0 <= i; --i) {
select.removeChild(select.childNodes[i]);
}
while (!rs.EOF){
var option = document.createElement("option");
option.value = rs(0).value;
var text = document.createTextNode(rs(0).value);
option.appendChild(text);
select.appendChild(option);
if (yyb == "") { yyb = rs(0).value; }
if (yyb == rs(0).value) { option.selected = true; }
rs.MoveNext();
}
rs.Close(); rs = null;
cn.Close(); cn = null;
Tbl_disp1();
}
/* ==================================================
__一覧表の設定
===================================================== */
function Tbl_disp1() {
if (yyb == "") { return; }
var cn = new ActiveXObject("ADODB.Connection");
cn.Open("Driver={Microsoft Access Driver (*.mdb)};DBQ=" + mdb);
var tb = document.getElementById("tbdy1");
while( tb.rows[ 0 ] ) tb.deleteRow( 0 );
// 見出し行
tb.insertRow(0);
tb.rows[0].insertCell(0);
tb.rows[0].cells[0].innerHTML = " 時_刻 ";
tb.rows[0].cells[0].style.backgroundColor = "#E0FFFF";
var mySql = "";
var kyuu = [];
for( var j = 1 ; j < wak + 1 ; j++ ) {
tb.rows[0].insertCell(j);
mySql = "SELECT * FROM [休業テーブル] WHERE [休業日] = #" + yyb + "# AND [担当CD] = " + j;
var rs = cn.Execute(mySql);
if (rs.EOF) {
kyuu[j] = 0;
tb.rows[0].cells[j].innerHTML = "担当CD:" + j;
tb.rows[0].cells[j].style.backgroundColor = "#E0FFFF";
} else {
kyuu[j] = 1;
tb.rows[0].cells[j].innerHTML = "担当CD:休";
tb.rows[0].cells[j].style.backgroundColor = "#FFE0FF";
}
tb.rows[0].cells[j].style.width="125";
}
mySql = "SELECT [予約ID],format([開始],'HH:MM'),[担当CD],[受診予約].[患者番号],[患者氏名],format([終了],'HH:MM')";
mySql += " FROM [受診予約],[患者マスタ] WHERE [受診予約].[患者番号] = [患者マスタ].[患者番号]";
if (yyb != "") { mySql += " AND [予約日] = #" + yyb + "#"; }
mySql += " ORDER BY [開始],[担当CD]";
var rs = cn.Execute(mySql);
var i = 1;
var tmp = "";
if (!rs.EOF){
var yyk = rs(0).value;
var kai = rs(1).value;
var tcd = rs(2).value;
var nam = rs(4).value;
}
var bef = [];
while (!rs.EOF){
tb.insertRow(i);
tb.rows[i].insertCell(0);
tb.rows[i].cells[0].innerHTML = kai;
for( var j = 1 ; j < wak + 1 ; j++ ) {
tb.rows[i].insertCell(j);
// 継続
if (bef[j] != "" && bef[j] > kai) {
tb.rows[i].cells[j].innerHTML = "↓";
tb.rows[i].cells[j].style.backgroundColor = "#FFE0FF";
// 予約済み
} else if (tb.rows[i].cells[0].innerHTML == kai && tcd == j) {
tmp = "'" + yyk + "'";
tb.rows[i].cells[j].innerHTML = '<a href="#" onClick="go_RecPage1(' + tmp + ')">' + nam.replace("_","") + '</a>';
tb.rows[i].cells[j].style.backgroundColor = "#FFE0FF";
tb.rows[i].cells[j].style.whiteSpace = "nowrap";
bef[j] = rs(5).value;
// 次へ
rs.MoveNext();
// 終わり
if (rs.EOF) {
for( var k = j + 1 ; k < wak + 1 ; k++ ) {
tb.rows[i].insertCell(k);
tmp = "'" + kai + "'";
tb.rows[i].cells[k].innerHTML = '<a href="#" onClick="go_NewRec1(' + tmp + ',' + k + ')">予約</a>';
bef[k] = "";
}
break;
// 同時刻になし
} else if (yyk != rs(0).value && kai != rs(1).value) {
for( var k = j + 1 ; k < wak + 1 ; k++ ) {
tb.rows[i].insertCell(k);
tmp = "'" + kai + "'";
tb.rows[i].cells[k].innerHTML = '<a href="#" onClick="go_NewRec1(' + tmp + ',' + k + ')">予約</a>';
bef[k] = "";
}
yyk = rs(0).value;
kai = rs(1).value;
tcd = rs(2).value;
nam = rs(4).value;
break;
}
// 同時刻にあり次の担当CDへ
yyk = rs(0).value;
tcd = rs(2).value;
nam = rs(4).value;
// 未合致_次の担当CDへ
} else {
tmp = "'" + kai + "'";
tb.rows[i].cells[j].innerHTML = '<a href="#" onClick="go_NewRec1(' + tmp + ',' + j + ')">予約</a>';
bef[j] = "";
}
}
for( var j = 1 ; j < wak + 1 ; j++ ) {
if (kyuu[j] == "1") {
tb.rows[i].cells[j].innerHTML = "-";
}
}
if (i == 1 && tb.rows[1].cells[0].innerHTML == "00:00") { tb.rows[1].cells[0].innerHTML = "保 留"; }
i++;
if (i > 24) { return; }
}
rs.Close();rs = null;
cn.Close();cn = null;
}
/* ==================================================
__患者選択肢の設定
===================================================== */
function set_selOdr1() {
return;
var cn = new ActiveXObject("ADODB.Connection");
cn.Open("Driver={Microsoft Access Driver (*.mdb)};DBQ=" + mdb);
var mySql = "SELECT [患者氏名] FROM [患者マスタ] WHERE ORDER BY [患者番号]";
var rs = cn.Execute(mySql);
var data = [];
var i = 0;
while (!rs.EOF){
data[i] = rs(0).value
rs.MoveNext();
i++;
}
rs.Close(); rs = null;
cn.Close(); cn = null;
for (var j=1; j < wak + 1; j++) {
var select = document.getElementById("selOd" + j);
for (var i=0; i<data.length; i++) {
var option = document.createElement("option");
option.value = data[i];
var text = document.createTextNode(data[i]);
option.appendChild(text);
select.appendChild(option);
}
}
}
/* ==================================================
__登録画面の表示
===================================================== */
function go_NewRec1(pkai,ptcd) {
$("#frm1").hide();
$("#frm2").fadeIn("slow");
if (pkai == null) {
kai = "14:00";
} else {
kai = pkai;
}
tcd = ptcd;
if (tcd == null) { tcd = ""; }
var now = new Date();
document.getElementById("yyk").value = set_NewOdr1(now); // 予約ID
if (yyb == "") { yyb = toLocaleString(now); }
document.getElementById("yyb").value = yyb; // 予約日
document.getElementById("tcd").value = tcd; // 担当CD
var options = document.getElementById('selKai').options; // 開始
var tmp = kai;
for (var i = 0; i < options.length; i++) {
if (options[i].text == tmp){ options[i].selected = true; break; }
}
var options = document.getElementById('selOwa').options; // 終了
var tmp = kai;
for (var i = 0; i < options.length; i++) {
if (options[i].text == tmp){ options[i+1].selected = true; break; }
}
document.getElementById("kno1").value = ""; // 患者番号
document.getElementById("knm1").innerHTML = ""; // 患者氏名
document.getElementById("syu").value = ""; // 治療種類
document.getElementById("bko1").value = ""; // 備考
document.getElementById("tan").value = tan; // 受付担当
document.getElementById("ukj").value = toLocaleString(now) + " "
+ now.getHours() + ":" + now.getMinutes(); // 受付時刻
document.getElementById("登録1").disabled = false;
document.getElementById("更新1").disabled = true;
document.getElementById("削除1").disabled = true;
window.resizeTo(hab,540);
}
/* ==================================================
__新予約番号の算定
===================================================== */
function set_NewOdr1(now) {
var cn = new ActiveXObject("ADODB.Connection");
cn.Open("Driver={Microsoft Access Driver (*.mdb)};DBQ=" + mdb);
var mySql = "SELECT MAX([予約ID]) FROM [受診予約]";
var rs = cn.Execute(mySql);
var mmdd = ("0" + (now.getMonth() + 1)).slice(-2) + ("0" + now.getDate()).slice(-2);
var yyk = "";
if (rs.EOF || rs(0).value == null){
yyk = "AA-" + mmdd + "-001"; // 接頭語固定でセット(初期値:仮AA)
} else {
var tmp = rs(0).value;
if (tmp.slice(3,7) == mmdd) {
yyk = tmp.slice(0,8) + ("00" + (parseInt(tmp.slice(-3)) + 1)).slice(-3);
} else {
yyk = tmp.slice(0,3) + mmdd + "-001";
}
}
rs.Close(); rs = null;
cn.Close(); cn = null;
return yyk;
}
/* ==================================================
__一覧表への復帰
===================================================== */
function go_ListPage1() {
$("#frm2").hide();
$("#frm1").fadeIn("slow");
List_disp1();
}
/* ==================================================
__一覧表の再表示(予約日切替)
===================================================== */
function go_ReLoad1() {
yyb = document.getElementById('selYYB').options.value;
Tbl_disp1();
}
/* ==================================================
__更新画面の表示
===================================================== */
function go_RecPage1(yyk) {
$("#tab_area").tabs({ active: [0] });
$("#frm1").hide();
$("#frm2").fadeIn("slow");
var mySql = "SELECT [予約ID]"
+ ",format([予約日],'YYYY/MM/DD')"
+ ",[担当CD]"
+ ",format([開始],'HH:MM')"
+ ",format([終了],'HH:MM')"
+ ",[患者番号]"
+ ",IIf(IsNull([治療種類]),'',[治療種類])"
+ ",IIf(IsNull([備考]),'',[備考])"
+ ",format([受付時刻],'YYYY/MM/DD HH:MM')"
+ ",IIf(IsNull([受付担当]),'',[受付担当])"
+ " FROM [受診予約]"
+ " WHERE [予約ID] = '" + yyk + "'";
var cn = new ActiveXObject("ADODB.Connection");
cn.Open("Driver={Microsoft Access Driver (*.mdb)};DBQ=" + mdb);
var rs = cn.Execute(mySql);
document.getElementById("yyk").value = yyk; // 予約ID
yyb = rs(1).value;
document.getElementById("yyb").value = yyb; // 予約日
document.getElementById("tcd").value = rs(2).value; // 担当CD
var options = document.getElementById('selKai').options; // 開始
var tmp = rs(3).value;
for (var i = 0; i < options.length; i++) {
if (options[i].text == tmp){ options[i].selected = true; break; }
}
var options = document.getElementById('selOwa').options; // 終了
var tmp = rs(4).value;
for (var i = 0; i < options.length; i++) {
if (options[i].text == tmp){ options[i].selected = true; break; }
}
var kno = rs(5).value;
document.getElementById("kno1").value = kno; // 患者番号
document.getElementById("syu").value = rs(6).value; // 治療種類
document.getElementById("bko1").value = rs(7).value; // 備考
document.getElementById("ukj").value = rs(8).value; // 受付時刻
tan = rs(9).value;
document.getElementById("tan").value = tan; // 受付担当
rs.Close();rs = null;
cn.Close();cn = null;
getKanjyaName(kno);
document.getElementById("登録1").disabled = true;
document.getElementById("更新1").disabled = false;
document.getElementById("削除1").disabled = false;
window.resizeTo(hab,540);
}
/* ==================================================
__患者番号の反映
===================================================== */
function func_setKno1() {
$("#tab_area").tabs({ active: [0] });
$("#frm1").hide();
$("#frm2").fadeIn("slow");
var kno = document.getElementById("kno2").value; // 患者番号
document.getElementById("kno1").value = kno;
getKanjyaName(kno);
window.resizeTo(hab,540);
}
/* ==================================================
__受診予約登録処理
===================================================== */
function func_insRec1() {
yyk = document.getElementById('yyk').value;
yyb = document.getElementById('yyb').value;
if (yyb == "") { $("#yyb").focus();alert("予約日を入力して下さい!"); return; }
tcd = document.getElementById('tcd').value;
if (tcd == "") { $("#tcd").focus();alert("担当CDを入力して下さい!"); return; }
if (tcd > wak) { $("#tcd").focus();alert("担当CDが枠を越えています!"); return; }
kai = document.getElementById('selKai').options.value;
owa = document.getElementById('selOwa').options.value;
if (kai > owa) { $("#kai").focus();alert("開始・終了の時刻が前後不整合です!"); return; }
var cn = new ActiveXObject("ADODB.Connection");
cn.Open("Driver={Microsoft Access Driver (*.mdb)};DBQ=" + mdb);
// 存在チェック
var mySql = "SELECT * FROM [受診予約] WHERE [予約日] = #" + yyb + "# ";
mySql += " AND [担当CD] = " + tcd;
mySql += " AND ((FORMAT([開始],'HH:MM') <= '" + kai + "' AND FORMAT([終了],'HH:MM') > '" + kai + "')";
mySql += " OR (FORMAT([開始],'HH:MM') < '" + owa + "' AND FORMAT([終了],'HH:MM') >= '" + owa + "'))";
var rs = cn.Execute(mySql);
if (!rs.EOF) {
cn.Close;
alert("この担当CD,時間帯には既に予約があります!");
$("#tcd").focus()
return;
}
// 休業チェック
var mySql = "SELECT * FROM [休業テーブル] WHERE [休業日] = #" + yyb + "# ";
mySql += " AND [担当CD] = " + tcd;
var rs = cn.Execute(mySql);
if (!rs.EOF) {
cn.Close;
alert("この予約日、担当CDは休業になっています!");
$("#tcd").focus()
return;
}
// 追加登録
mySql = "INSERT INTO [受診予約] VALUES('" + yyk + "'"; // 予約ID
mySql += ",'" + yyb + "'"; // 予約日
mySql += ",'" + tcd + "'"; // 担当CD
mySql += ",'" + kai + "'"; // 開始
mySql += ",'" + owa + "'"; // 終了
var tmp = "";
tmp = document.getElementById('kno1').value; mySql += ",'" + tmp + "'"; // 患者番号
if (tmp == "") { $("#kno1").focus();alert("患者番号を入力して下さい!"); return; }
tmp = document.getElementById('syu').value; mySql += ",'" + tmp + "'"; // 治療種別
tmp = document.getElementById('bko1').value; mySql += ",'" + tmp + "'"; // 備考
// 以下、歯科予約システム② に続く
コメント一覧
ブログオーナー
最新の画像もっと見る
最近の「HTA」カテゴリーもっと見る
最近の記事
カテゴリー
- VBScript(2)
- Weblog(314)
- お仕事ツール(0)
- Saloon(1121)
- Node.js他(Python)(16)
- HTA(32)
- 決め・分け論(71)
- 映画・ドラマ(37)
- EXCEL VBA(35)
- PL/SQL(10)
- Java(11)
- 詩(自作)(5)
- 詩(塚原将)(298)
- 短歌(200)
- 題詠100首鑑賞(96)
- 題詠100首(109)
- ALIAS SMITH and JONES エピソード(1)
- 題詠100首2010(11)
- 読書(74)
- プロスポーツ(プロ野球、格闘技)(27)
- 日常・育児とか(88)
- 仕事(IT関係)(61)
- とほほ(33)
- 夢(32)
- 勝手にバトン(7)
- 写真(36)
- スタートレック視聴日誌草稿(24)
- 旅行(25)
- 嫌いな言葉(6)
- 好きな言葉(4)
バックナンバー
人気記事