wordpressに移行しました
錠散水剤相互換算ツール
(※現在blog移転中→薬剤師のプログラミング備忘録 | 素人エンジニアの日記)
今回も、センノシド換算に次いでjavascriptで作ってみました。
Titer calculation ー 錠散水剤相互換算ツール
どうにも自信を持って暗算で計算できない人間なので、確証がほしいときにこういうものがあったら便利だなーと思って作ってみました。
内容は手計算で行っている時と同じ式を代用しているだけです。
ページのソースを見ればわかるのですが(汚いですが)、単純にformに入力された値(value)を読み取って計算しているだけです。
formに入力されると、onchangeで関数が動き出します。
一部のレセコンや散剤秤量システムは自動計算してくれますが、粉砕での換算や水剤への変更を医師に伝える際には使えるかなーと思います。
こういうささっと計算できるアプリは、スマホなんかだと既にあるのでしょうかねー。
---HTML---
<tr>
<td><input type="text" id="per" size="6" onchange="calculation()" style="text-align: right; " autocomplete="off"> %</td>
<td><input type="text" id="mg" size="6" onchange="calculation()" style="text-align: right; " autocomplete="off"> mg</td>
<td><input type="text" name="g" size="6" value="0" style="text-align: right; " readonly="readonly"> g</td>
<td><input type="text" name="day" size="6" onchange="calculation()" style="text-align: right; " autocomplete="off"> 日分</td>
</tr>
<tr>
<td align="right" colspan="3">合計量</td>
<td><input type="text" name="total" size="6" value="0" style="text-align: right; " readonly="readonly"> g</td>
</tr>
---javascript---
function calculation(){
// gからmgへ
var calc = document.form.per.value * document.form.g.value * 10;
document.form.mg.value = calc;
// 合計を計算
var total = calc * document.form.day.value;
document.form.total.value = total;
}
次回処方日の計算
これが非常に苦手です。何度やっても理解できないのです。
なので、自動計算のシステムを作ってみようと思います。
一応、到達点としては用法も加味したシステムですので、用法不要であればjavascriptで動的に作ることもできますが、今回はPHPで作ります。コーディングの練習用に2種類作ってもいいかもしれませんね。
変わらず、今回もPHPは同一ページでの入力と表示を目指す予定です。
まずは、日にちの自動計算です。
日にちというのは文字(str)や数字(int)と異なる属性です。
コンピュータでは文字は足し算の足し算は結合されてしまいます。
通常のプログラミング言語では文字は以下のようになります。
は + る = はる
しかし、数字の場合も以下のようになります。
1 + 1 = 11
これは数字の「1」ではなく、文字としての「1」を認識してしまっているためです。
これを文字(string)ではなく、数字(integer)として認識させる必要があります。
(pythonなんかの言語では自動判断してくれますが)
同様に、日付も特殊な属性を持ち、計算結果が自動繰り上げされるようになります。
数字としての"20180516"は加算すると以下のようになります。
20180516 + 365 = 20180696
しかし、これに日にちとしての属性を持たせると、以下のようになります。
20180516 + 180 = 20181112
このように、その文字列の持つ属性がプログラミングでは非常に重要になります。関数や引数、変数なんかも同様です。
今回はPHPでの計算ですので、まずは入力された文字列を日にちとして組み込まなければいけません。
その際に使用する関数がdate_createですが、今回はDateTimeクラスを使用します。また、いつもの手続き型ではなく、オブジェクト指向にチャレンジしてみます。
//ここからプログラムの内容
まず、入力の西暦部分は変更することがほとんどないと思われるので、最初から入力されていて問題はないので、(念の為、日本標準時(東京)に時刻を設定して)西暦を引っ張ってきます。
ーーーーー
西暦<input type="text" name="指定する西暦" autocomplete="off"
value="<?php
//日本標準時の時間で設定
date_default_timezone_set(' Asia/Tokyo ');
//$nowyearを指定し、DateTimeとして内容を設定。
$nowyear = new DateTime();
//$nowyearの内容は日にちとしての属性を持っているので、そのY(西暦)の部分を取り出して表示
echo $nowyear->format('Y');
?>" />年
ーーーーー
これで、inputのテキストエリアに自動で現在の西暦が入力されます。
月日についても同様に入力しておきます。
これらをformからaction=""で同一ページに飛び、内容をPOSTします。
ーーーーー
<form action="" method="post">
<input ~上記のコード~ />
//処方日数の指定はPOSTした後に削除されないようにvalueの値を指定
<input name="処方日数" type="text" autocomplete="off" value="<?php echo $_POST['処方日数']; ?>" style="text-align: right;"/>
<input type="submit" value="計算" />
<form />
ーーーーー
この辺りはHTMLの知識かもしれませんね。少しCSSも加えてますが。
POSTされた数字は、念の為全角を半角に強制的に修正しておきます。
これはmb_convert_kana関数を使用すると楽です。全角→半角や半角→全角など、入力された文字を強制的に変換させます。Drug Searchでも使用しています。薬の検索は半角カタカナ・数字になるとパターンマッチできない(正規表現的に異なってしまう)、なんて互換性無くなってしまうとマズいので強制的に全角に変換してしまうわけです。
ーーーーー
$_POST['指定された年'] = mb_convert_kana($_POST['指定された年'],"a");
//同様に月日も設定(内容は略)
//再度DateTimeクラスを使用して、指定された日にちの計算を行います。
$date = new DateTime();
//POSTされた数字をDateTimeの日にちに入力
$date->setDate($_POST['指定された年'],$_POST['指定された月'],$_POST['指定された日']);
//入力された数字を加算(指定日は服用を「開始」する日なので、更に1日引く)
$date->add(new DateInterval('P'.$_POST['加算する日数'].'D'));
$date->sub(new DateInterval('P1D'));
//DateTimeクラスの曜日は数字に割り当てられているので、配列を利用して番号=その番目の文字に変換
$week = array("日","月","火","水","木","金","土");
//計算された日にちを表示
echo $date->format('Y年m月d日');
//曜日を数字から文字に変換して表示
$weeknum = $date->format('w');
echo "(",$week[$weeknum],")";
ーーーーー
と、他にも内部でいろいろやってますが、大まかにこんな感じです。PHPだとサーバー側で処理しているので、コードが見れないのが難ですが、そんな感じのことしてるんだなー程度に理解していただければいいのかなと。
なかなか帰宅後の時間で作るのも難しいですが、今後もちまちまとやっていきたいと思います。
小児薬用量の自動換算
引越し作業でしばらくパソコンに触れなかったのですが、今もネット環境がありません。しかし時代の流れは凄いもので、PCとiPhoneを接続するだけでネット環境ができるんですよね。いい時代になったものです。ネットが開通するまでは、iPhone様に頼って作業しようと思います。
さて、前回はセンノシドの自動換算表(laxative converter)をjavascriptで書いてみたのですが、それの応用で小児薬用量もできないかと思いたち、1時間ほどで作ってみました。
(今回からディレクトリをtest→appにしています。そのうち他のページも変更するかもしれません)
思いつきで書いたのでコーディングは雑です。
それぞれの医薬品について、手入力で最小用量と最大用量、規格を入力しています。
今回もjavascriptなのでページのソースを見ればわかるのですが、以下のようになっています。
// アスベリンドライシロップ2%
・アスベリンの最小用量をaugsbergerの式より、成人量の最小用量で求めます。(但し、適宜増減については加味していません)
var asbmin = 60*(document.forms.age.value*4+20)/100;
document.forms.asbcalcmin.value = asbmin;
・同じように最大容量を計算
var asbmax = 120*(document.forms.age.value*4+20)/100;
document.forms.asbcalcmax.value = asbmax;
・g換算で製剤量を求めます
document.forms.asbmin_g.value = asbmin/0.02*0.001;
document.forms.asbmax_g.value = asbmax/0.02*0.001;
一つの薬剤でこれだけ長いコードになってしますので、小児に使用する薬剤一覧を作るとかなり長くなってしまいますね…。なんとか簡略化したいものです。
最大量や最小量、規格をdatabaseに登録しておいて連携させればもっと楽なんでしょうけども。
ただ、アスベリンのように年齢で用量が決まっている薬や、ニポラジンのように適応症で用量が決まっている薬、ムコダインのように適宜増減を加味すると750mg~3000mgと幅が広くなってしまう薬など、一筋縄ではいかないです。なんとか形にしてみたいですね。
センノシド換算表っぽいもの
javascriptで動的に計算できるセンノシド換算表とか作ってみようかな。需要はある…のだろうか?
— NOCHIKA (@pharmacist753) 2018年5月5日
と、呟いてからしばらく飲みながらぼーっとしていましたが、動的フォームの練習も兼ねて作ってみたところ、案外普通にできました。
javascriptはまだまだ勉強中ですが、PHPと違って動的に動かせるのがいいですね。AjaxやjQueryなんかも使えるといいのですが、まだまだ勉強中です。
今回は全てjavascriptで作っていますので、構造自体は簡単です。
htmlのinput type="text"に入力された値を関数としてリアルタイムに登録し、けいしゅけ先生の記事による換算式に当てはめて出力しています。PHPだと、一旦データをサーバーに提出する必要があるので、formを送信しなければいけないのがデメリットでした。
ページのソースから丸見えではあるのですが、簡略化するとこんな感じです。
入力・表示:<input type="text" id="alozenn_in" onchange="calculation"> 錠
計算:var price_al = document.form.alozenn.value * 24;
document.form.alozenn.value = price_al;
出力・表示:<input type="text" name="alozenn_out" size="4" value="0" > mg
ーーー以下同様に数種類...
出力:document.forms.field_total.value = total;
センノシド換算:<input type="text" name="field_total" > mg
今回の発見は、セチロ9錠=センノシド12mgなのですが、これを計算式に当てはめて結果だけ表記しておくと、
data_sechiro = document.form.sechilo.value * 1.333;
にした場合、9錠入力しても「11.997」と表示されるんですね。
しかし、計算結果ではなく計算式を入力しておけば、つまり以下のようにすると
data_sechiro = document.form.sechilo.value * 12/9;
9錠と入力した場合には「12」と、3錠の場合は「4」と表示されるようです。
勉強になりますね。
※コードは例として提示していますので、実際に使われているコードは当該ページより参照してください
計算式自体は、けいしゅけ先生の記事
を参考にさせていただきました。この場をお借り致しまして、お礼申し上げます。
新薬価と旧薬価を比較するためのページ
便利ツールを開発していることで有名なジム子さんのblogを拝見させていただき、excelでもできることはwebでもできるのでは?と思い立ちまして
参照:調剤薬局事務の仕事 H30年4月に薬価改定につかえる新旧の薬価比較表
久しぶりにdatabaseをいじっていますが、社会保険診療報酬支払基金のマスタがあるので、新薬価と旧薬価の差額とか一覧で表示することもできなくもないのか…。
— NOCHIKA (@pharmacist753) 2018年3月29日
思い立ったが吉日で作ってみました。
厚労省と社会保険診療報酬支払基金のマスタから引っ張ってきただけのものではありますが。
メーカーや一部のデータが入ってないのはご了承ください。そのうち直します。そのうち…。多分。