Re:SALOON & VBA

HTA + javascript 歯科医院予約システム①

HTA + Javascript レストラン予約システム
やっていなかった時間枠での予約管理を試すために
歯医者の予約システムを考えてみました。

中規模の歯科医で、数人の医者と衛生士がいて、
治療チエア単位(担当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  = "&nbsp;時_刻&nbsp;";
 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 + "'"; // 備考

// 以下、歯科予約システム② に続く

コメント一覧

ブログオーナー
画像は少し古い
画像は少し古いです。
取り直してもよかったんですが・・・
まあ、そんなに変わり映えはしないのでそのままです。

画像には無いのは、
①患者の詳細画面に予約履歴を載せました。
②休業テーブルに、項目で適用を追加してます。
名前:
コメント:

※文字化け等の原因になりますので顔文字の投稿はお控えください。

コメント利用規約に同意の上コメント投稿を行ってください。

 

※ブログ作成者から承認されるまでコメントは反映されません。

  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最新の画像もっと見る

最近の「HTA」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事