過去の桐井戸端BBS (桐ver.8)
5071 表の項目計算式について KAZE 2000/03/10-12:54
この掲示板ではいつも勉強させて戴いており有り難うございます。
表の項目計算式への記述の方法について教えて下さい。

今、一つの表中に、
[A][B][C][コード1][コード2]・・・・[コード9]があります。

入力するコードは、最少3桁、最大7桁です。
[A]には、[コード1][コード2]・・・・[コード9]のいずれかに
一致で070、570、517が存在すれば"2"が、存在しなければ"1"のフラグが
立つようにしたいと考えています。ただし、コードが入力されていない場合は、
欠損値(#u)を入れます。

同様に
[B]には、前方一致で580、581、583、584、585、590、591が存在すれば"2"が、
存在しなければ"1"のフラグを立たせます。

[C]に関しては、上記[A][B]に含まれない全てのコードが有った場合に"2"が、
無かった場合に"1"を立たせたいと考えています。

そこで、私としては、項目計算式に次のような式を記述したのですが、
”計算式に誤りがあります”といわれて困っています。
どの様に記述すればよいのかご指導下さい。

[A](文字列)の項目計算式
#COND([コード1]="070"* .OR [コード1]="570"* .OR [コード1]
="517"* .OR \
    [コード2]="070"* .OR [コード2]="570"* .OR [コード2]
="517"* .OR \
            ・・・・・・
    [コード9]="070"* .OR [コード9]="570"* .OR [コード9]
="517"* ,"2",\
    1,"1")

それで、試しにきちんとフラグが立つかどうかを確認しようとし、保存したところ
桐からこのようなおしかりを受けたという始末です。

それで、このような記述ではだめかな?と思い、やってみたんですがやっぱりだめ
でした。

#PROGN(\
#COND([コード1]="070"* ,"2",1,"1"),#COND([コード1]
="570"*,"2"),#COND([コード1]="571"*, "2"),\
#COND([コード2]="070"* ,"2"),#COND([コード2]="570"*,"2"),#COND([コ
ード2]="571"*, "2"),\
        ・・・・・・
#COND([コード9]="070"* ,"2"),#COND([コード9]="570"*,"2"),#COND([コ
ード9]="571"*, "2") \
)

長ったらしくてお粗末な計算式なんですが、どこが悪いのか自分では判りません。
どうか助けて下さい。

なお、桐V8SP4を使用しています。

KAZE
5073 Re:表の項目計算式について 幅田 2000/03/10-13:15
記事番号5071へのコメント
>[A](文字列)の項目計算式
>#COND([コード1]="070"* .OR [コード1]="570"* .OR [コード1]
>="517"* .OR \
>    [コード2]="070"* .OR [コード2]="570"* .OR [コード2]
>="517"* .OR \
>            ・・・・・・
>    [コード9]="070"* .OR [コード9]="570"* .OR [コード9]
>="517"* ,"2",\
>    1,"1")


条件式の中では、[コード1]="070"* というような書き方はできません。

上記の式を書くなら、#部分列を使って下記のようにします。

#COND(#部分列([コード1],1,3)="070" .OR #部分列([コード1],1,3)="570" .OR #部分列([コード1],1,3)="517"
.OR #部分列([コード2],1,3)="070" .OR #部分列([コード2],1,3)="570” .OR #部分列([コード2],1,3)="517" .OR
 #部分列([コード9],1,3)="070" .OR #部分列([コード9],1,3)="570" .OR #部分列([コード9],1,3)="517" ,"2",1,"1")

でも、もうちょっとスマートなやり方があるような気もしますね。


5076 Re:表の項目計算式について 宮城 2000/03/10-14:07
記事番号5073へのコメント
とりあえず、2点。

まず「入力するコードは最小3桁、最大7桁とのことですが、先頭一致と言われている以上
大丈夫とは思いますが、左詰で右側に枝番的なものが着いていくということでいいんですね?
で、必ず上3桁で判定するのなら、各コードの上3桁を別項目にとってしまうべきです。

それから、条件選択の条件式で="070"*という記述が許されないのは幅田さんがお書きのとおりですが、
.and .or を使う場合、#条件選択((比較式1 .or 比較式2),"2",1,"1")
のようにこれら自身をかっこでくくってやる必要があります。


5077 Re:表の項目計算式について KAZE 2000/03/10-14:27
記事番号5076へのコメント
幅田さん、宮城さん早速のご教授有り難うございました。
投稿してから1時間程で、2件もレスを戴いてびっくりしています。

結論から先に述べれば、[A]および[B]については、#部分列(str,n1,n2)で解決することが出来ました。

宮城さんから、指摘を受けました
>で、必ず上3桁で判定するのなら、各コードの上3桁を別項目にとってしまうべきです。
については、必ず3桁になるわけではありませんので、この方法は使えないと思います。

あとの課題は、幡田さんからのご指摘の
>でも、もうちょっとスマートなやり方があるような気もしますね。
と、[C]の計算式の書き方です。

宮城さんの
>#条件選択((比較式1 .or 比較式2),"2",1,"1")
を使えば少しは見易くなるのでしょうね。

がんばって、無い知恵を絞ってみたいと思います。

もし、こういう方法がよいのではとのご指導を戴ければ幸いです。

5078 Re:ちょっと気付いてしまった bonito 2000/03/10-14:47
記事番号5077へのコメント
KAZEさん、こんちには。
諸先輩にわりこみ、失礼いたします。

>>で、必ず上3桁で判定するのなら、各コードの上3桁を別項目にとってしまうべきです。
>については、必ず3桁になるわけではありませんので、この方法は使えないと思います。

なら、#部分列([コード1],1,3)="070" ではあとあと見た目の整合性に欠けるかもしれませんね。
#文字位置([コード1],"070")=1 なら"070"が"07051"になってもOK(かなぁ?)
5079 Re:ちょっと気付いてしまった 宮城 2000/03/10-15:13
記事番号5078へのコメント
KAZEさんが「#部分列(str,n1,n2)」でn2を判定式により使い分けるよという意味でなかったり、
bonitoさんの

>なら、#部分列([コード1],1,3)="070" ではあとあと見た目の整合性に欠けるかも
>しれませんね。 #文字位置([コード1],"070")=1 なら"070"が"07051"になっても
>OK(かなぁ?)

だと、上3桁をとるということだと思いますが・・・。それとも、コードの頭にスペースがついてるとか?

>>#条件選択((比較式1 .or 比較式2),"2",1,"1")
>を使えば少しは見易くなるのでしょうね。

これは「見易さ」でなく必須です。

Cの判定ですけど、厳密にどういう意味かは確認が要りますが、私の解釈があたっていれば、

#条件選択(([A]="1" .and [B]="1"),"2",1,"1")

でいいはずです。

ついでに、#含む(str0,str1,str2,・・・,strn)て関数がない代用ですが
str1からstrnまで,つなぎでつないだ項目を作り、それに対し、

#文字位置([判定用項目],str0)>0を適用する手があります。

5081 Re:ちょっと気付いてしまった bonito 2000/03/10-16:23
記事番号5079へのコメント
宮城さん、みなさん、言葉が足りなかったようで、
申し訳ありません。

#部分列([コード1],1,3)="070"・・・#部分列([コード9],1,5)="54321"
コードの桁数が不定なら n2(取り出す文字数)も変えなくてはならず、なら
#文字位置([コード1],"070")=1・・・#文字位置([コード9],"54321")=1
の方がコードにだけ注目すればいいから、コピーする時ラクかなと思っただけです。
でもそうすると"070"と"07000"を別コードとして持ちたい場合マズイ(注)・・・?

普通 #条件選択 に(このような場合) OR条件を書くでしょうか?
〜でなければXX、〜でなければ△△、なんですからORの連続のような気が
するんですが・・・、(注)の場合も考えれば、要するにヒットする順番が問題
なんで、昔なつかしい(?)、ERRORLEVELのノリですよね。
(注)の場合は当然桁数の多いほうを前に置く・・・当たり前か  (^^;


5084 Re:ちょっと気付いてしまった 宮城 2000/03/10-16:46
記事番号5081へのコメント
実はC云々で書きましたが、本当にやりたいことはなになのかが、きちん
と整理されているのかがきになります。
であるとしても、条件式を目的にそうかたちで設定できたにしても、いかにも、「変更」が多そうな・・・。

ちょっと項目計算式で処理するには無理を感じてしまいますね。


5086 Re:ちょっと気付いてしまった KAZE 2000/03/10-17:15
記事番号5084へのコメント
いろいろとご指導有り難うございます。

やはり、やりたいことを具体的に書いた方がよいですね。
すみません。

私は、医薬品の臨床データ管理を行っています。
例えば下記の様なデータを管理するとします。

氏名   病名1    病名2   病名3   ・・・・・・・・・病名9
 X   高血圧症   糖尿病  肝硬変
 Y   B型肝炎   高血圧
 Z   慢性腎炎

ここで、前述の[コード1]から[コード9]は上記の[病名1]から[病名9]
までを病名コードで入力したものに一致します。

やりたいことは、
[A]とは肝疾患を持つ患者は”2”、持っていない患者は”1”
[B]とは腎疾患を持つ患者は”2”、持っていない患者は”1”
[C]とは肝疾患、腎疾患以外の病気を持つ患者は”2”、持っていない患者は”
1”

というふうにそれぞれにフラグを立てたいのです。

病名コードは、例えば肝障害ですと
 070  ウイルス肝炎
    0700  A型肝炎
    ・・・
    070904 急性ウイルス肝炎
 570  急性肝炎
    570001  亜急性肝炎
    ・・・
    570015  黄色肝萎縮
 571  慢性肝疾患
    5710  アルコール性脂肪肝
    ・・・
    571903  肝硬化症
 572  肝膿瘍
 ・・・
 ・・・

などとコーディングされており、一見、上3桁でカテゴリー抽出
出来そうですが、中にはダイレクトに4〜7桁を指定しなければならない
ケースもあります。

例示した病名コードは、
高血圧症(401910)、糖尿病(250)、肝硬変(571502)、
B型肝炎(070304)、慢性腎炎(582902)
となります。

私の期待する結果は、

氏名 [A] [B] [C]  病名1    病名2   病名3 ・・・・ 病
名9
 X  2  1   2  高血圧症   糖尿病  肝硬変
 Y  2  1   2  B型肝炎   高血圧
 Z  1  2   1  慢性腎炎

とする事です。

それで、bonitoさんから教わった方法で実際やってみましたところ、
確かにうまくいきました。
でも、素朴な疑問なんですが、

#文字位置([コード1],"070")で 070070を持つコードがあった場合、
桐はどういう処理をするのでしょうか?
現実には1を返してきた様ですので外見上は問題が無かったのですが。

>ちょっと項目計算式で処理するには無理を感じてしまいますね。

やはり無理でしょうか。一括処理を通して該当項目にフラグを立てた方が
良いのでしょうか。
一括処理もちょっと考えたのですが、途中チンプンカンプンになってしまって・・・

実は、肝疾患の場合は、選択するコードは5つだから
5×9=45通りの条件式の記述で済んだんですが、
腎疾患の場合は14個もありその組み合わせは・・・
で、それでも頑張って条件文を記述したら、文字数が多すぎるとおしかりを受けて
しまいました。それで、条件文を書く項目を2つに分けて、
どちらかに”2”が立てば”2”にするとしたのでした。

あぁ、知恵がないとよけいな仕事が増えて困ります。・・・・

5087 Re:ちょっと気付いてしまった 宮城 2000/03/10-18:07
記事番号5086へのコメント
かなりイメージできました。

>やはり、やりたいことを具体的に書いた方がよいですね。

それが一番です。

>#文字位置([コード1],"070")で 070070を持つコードがあった場合、
>桐はどういう処理をするのでしょうか?

最初に発見した位置を返し抜けるはず(だったかな?)。

さて、私は横にMax.9件病名を持っていることが、話をややこしくしているように感じました。
おそらく既存ファイルがそうなっているからという単純な理由だと思うのですが。

取りあえず氏名で患者さんを特定できるものとして以下述べます。

氏名と病名コードだけの表を作ってしまいます。
これを開いたまま、既存表を開き、病名コード1がヌルでないものを絞り込み(たぶん全件ヒットでしょうね)。
左記の表を編集表にし、氏名に氏名、病名コードに病名コード1で読み込み。

既存表に戻り絞り込みを解除し、病名コード2がヌルでないものを絞り込み。
今度は氏名に氏名、病名コードに病名コード2で読み込み。

以下、病名コード9まで繰り返し。

これを、氏名・病名コード順に並べ替えしておいて、病名コードで今度は堂々と部分一致絞り込みできますから、
それをさらに氏名で単一化しておけば、肝疾患を持つ患者さんの氏名が得られることになりますね。

既存表に戻して、併合→絞り込んだ表→絞り込み→氏名で照合とすれば、
Aに2をセットしたい患者さんのリストが絞り込まれます。置換で一気。

この繰り返しで処理すれば、一括処理によらずとも、さほど負荷なく目的は達成されるはずです。

5088 Re:ちょっと気付いてしまった bonito 2000/03/10-19:02
記事番号5086へのコメント
KAZEさん、こんにちは。

説明を読まさせていただきました、でもまだ少し疑問。
病名をコードで入力している(らしい?)、のでしたら
例えば「病名マスタ.tbl」とかがあるのかしら・・・、
あれば簡単ですし、なければ運用上からも作るべきだと思います。

あれば簡単(?):例
1.病名マスタ.tblに[肝フラグ][腎フラグ]等々の項目
 をつくって値をいれる。
2.臨床.tblの[病名コード1]を入力したら[病名]及び
 フラグ項目[肝1][腎1][他1]に病名マスタ.tblから#表引き
 で値を得られるようにする×必要数(例では9病?)
 (コード項目には入力後再計算にチェックを入れてね)
3.フラグ項目の並びは[肝1]〜[肝9][腎1]〜[腎9]と後ろに
 順序よく(表示する必要はないですね)
4.問題の本当のフラグ[A]は項目計算、#横最大([肝1],[肝9])
 あるいはフラグが0と1以上でいいなら(こっちの方が普通?)
 1.のマスタのフラグの値を0か1にして[肝1]から[肝9]までを
 加算する。(私ならこっち、気をつかわずに済むから)

ダメ? うーんもっといい方法があるかも・・・。
病気や薬の関係は悲しげさんのご担当かも・・・(^^;
いや別に気にしないで下さい>悲しげ大明神さま
                  <(_ _)>

5089 Re:ちょっと気付いてしまった 悲しげ 2000/03/10-21:51
記事番号5088へのコメント
どもっ、変なタイトルで続いていますが(^^;)、

>病気や薬の関係は悲しげさんのご担当かも・・・(^^;

と云う訳で、「悲しげ呼出し」コマンド(^^;)が発行されてしまいましたので出て来ました。(^^;)

結論を先に云いますと、この問題は「病名マスター」の出来いかんによると思います。
これがタコだと、いくら一括処理をゴリゴリ書いても、経験的に泥沼におちいる可能性が高いです。
遠からず、国際疾病分類たる"ICD10"に代わって、病名に縦横の階層構造を持たせた"MedDRA"
(の日本版)が公開されるはずですから、いずれはそちらを利用するようにした方がいいと思います。
私が前に取り組んだのは、患者の病名と薬剤の禁忌・慎重とのチェックシステム(ゴリゴリの一括処理)ですが、
この時は、そのような階層的な病名データを使わせてもらいました。
縦の関係は次のような感じです。

   ↑ K2111 心疾患
   ↑ K211114 虚血性心疾患
   ↑ K21111411 狭心症

肝疾患・腎疾患も同様になっておりまして、2桁づつ上に上がっていくことで、例えば肝疾患を取得することができる、
とかですね。
ただし、残念ながら病名マスター自体が未完でして(私の相棒が完成させてくんないので)、
未だに公開できる段階ではないと云う……。(^^;)

と云う訳で、お役に立てるコメントでなくてすいません。
懸案の処理は後でゆっくり考えてみます、取り急ぎコメント。

5091 疾患群のフラグの計算(1) 佐田 守弘 2000/03/10-23:57
記事番号5077へのコメント
KAZEさん
皆さんのコメントを拝見し、2つの案を考えてみました。まずはその1つ目です。
■疾患群に該当するかを判定する項目を設ける方法
KAZEさんが書かれている「肝疾患」「腎疾患」などをここでは疾患群と呼ぶ事にします。
計算式は既に幅田さん、宮城さんが書かれている通りの考え方です。
しかしながら、この計算式をまともに書こうとすると、とてつもなく長い計算式になってしまいますし、
かつ万一習性が出た時に大変です。

そこで、ワーク用の判定項目を設けてみる方法を考えてみました。
まず表に[A1]〜[A9]、[B1]〜[B9]のワーク用の項目を設けて下さい。
この中の例えば[A1]は、[コード1]に[A]のフラグに該当するコードがあるかを判定する補助フラグです。
つまり、計算式は
 #部分列([コード1],1,3)="070" .OR #部分列([コード1],1,3)="570" .OR ・・・
の様になります。判定の式をコード毎に分けるので、式が短くてすみます。
この計算式は、内容的には条件式なので、値は0または1のどちらかになります。

そして、フラグ[A]の 計算式は、
 [A1] .OR [A2] .OR ・・・ [A9]+1
です。なぜ条件式に1を加えているかですが、[A1]〜[A9]のいずれかが成り立てば「真(1)」ですから1を加えれば2になります。

後、欠損値の処理が必要です。コード1〜9は、1から順に入力するものとして、コード1に入力されていないものだけを欠損値と判断するので良いでしょうか。
そうであれば、
 #条件選択([コード1]=#未定義,#未定義,1,[A1] .OR [A2] .OR ・・・ [A9]+1)
です。

佐田守弘(KS-00119)

5092 比較式と条件式の違い 佐田 守弘 2000/03/11-00:16
記事番号5071へのコメント
KAZEさん
エラーになった原因は、比較式と条件式の取り違えです。
「"070"*」は比較式の書き方であって、条件式の書き方ではありません。
そして、#条件選択関数の奇数番目は、比較式でなくて条件式を記述します。

計算式、比較式、条件式は間違いやすい概念です。
詳しい説明を私のHPに掲載してありますので、参考にして下さい。

佐田守弘(KS-00119)


5093 疾患群のフラグの計算(2) 佐田 守弘 2000/03/11-00:16
記事番号5077へのコメント
KAZEさん
もう1つの方法です。
■該当する疾患コードを表に持っておく方法
いろいろと考えてみまいしたが、KAZEさんが行われている判定手段では、計算式は簡単になりませんね。
しかも、ツリー構造になっているらしい疾患名のどのレベルで判断するかなどが統一されていない様で、
計算式はますます複雑化しそうですね。しかも1ヵ所間違えていたら、訂正も大変です。
そこで、全く別の判定方法を考えてみました。

●部分一致で比較せず、完全一致で比較する
070で070ウイルス肝炎,0700A型肝炎、070904急性ウイルス肝などを判定させている様ですが、判定対象となる全疾患を評価させた方が簡単にできる様に思えました。
ただし、計算式で行うのではなく該当する疾患名の表からの表引きで判定します。

●判定用の表を作る
まず次の様な表を作って下さい。
疾患A.tbl
  [コード]
  070
  0700
  070904
   ・ ・ ・
つまり、Aのフラグに該当する疾患名のコードを並べただけの表です。病名マスタがあるなら、このマスタから該当するコードを抜き出すだけででき上がります。

●判定の方法
 #表引き([コード1],=,疾患A,[コード],[コード]) .OR #表引き([コード2],=,疾患A,[コード],[コード]) .OR ・・・
で該当する値があれば1、どのコードも該当しなければ0が得られます。
これに1を加えれば、いずれかに該当する病名コードがあれあ2が、なければ1が得られます。

多分、一番スッキリした方法になると思います。そして、該当する病名が変わった場合には、判定用の表を直すだけですむのもメリットの1つです。

佐田守弘(KS-00119)

5094 Re:表の項目計算式について いかすぱげてぃ 2000/03/11-00:36
記事番号5071へのコメント
KAZEさんこんにちわ。
皆さん、正統派のご返答ですので、ちょっと亜流に…(^^;

あくまで、ご質問だけをざっと見ての感じで申し訳ありませんが…

>入力するコードは、最少3桁、最大7桁です。
>[A]には、[コード1][コード2]・・・・[コード9]のいずれかに
>一致で070、570、517が存在すれば"2"が、存在しなければ"1"のフラグが
>立つようにしたいと考えています。ただし、コードが入力されていない場合は、
>欠損値(#u)を入れます。

いくつか考えられますが、例えば、こんなの…

#progn(#setq(&STR,"-"+[コード1]+"-"+[コード2]+"-"+[コード3]+"-"+\
[コード4]+"-"+[コード5]+"-"+[コード6]+"-"+\
[コード7]+"-"+[コード8]+"-"+[コード9]), \
#cond(.not#is数字(&STR,0),#u,\
#文字位置(&STR,"-"+"070") +\
#文字位置(&STR,"-"+"570") +\
#文字位置(&STR,"-"+"517"),2,1,1))

※一致が「前方一致」なのか「含む」なのか…それとも完全一致なのか…
 他のMSGから前方一致と勝手に解釈してみました。

>同様に
>[B]には、前方一致で580、581、583、584、585、590、591が存在すれば"2"が、
>存在しなければ"1"のフラグを立たせます。

カット&ペーストがしやすいので(^^;

#cond(#文字位置(&STR,"-"+"580")+\
#文字位置(&STR,"-"+"581")+\
#文字位置(&STR,"-"+"583")+\
#文字位置(&STR,"-"+"584")+\
#文字位置(&STR,"-"+"585")+\
#文字位置(&STR,"-"+"590")+\
#文字位置(&STR,"-"+"591"),2,1,1))

 ※[A]で&STRには代入しているので、ここでの代入は不要…だと思う。(^^;
  たぶん…とほほほ…

>[C]に関しては、上記[A][B]に含まれない全てのコードが有った場合に"2"が、
>無かった場合に"1"を立たせたいと考えています。

#cond(([A]=2)+([B]=2)>0,1,1,2)

ってな感じで…

一応、今回の計算式の味付けは(^^;、比較式が成立する場合、真すなわち1を返すので
それを条件式のフラグとして使っちゃうということとしてみました。
[C]あたりで考えていただければ、分かりやすいかも…

ちなみに(カット&ペーストなもので:言い訳)、動かなければごめんなさい。

確信犯の悲しげさん、後はよろしく!(しつこい!>いかすぱ)

5098 Re:表の項目計算式について 悲しげ 2000/03/11-12:37
記事番号5094へのコメント
どもっ、KAZEさん、いかすぱ−様からもしつこく振られましたから考えてみました。
で、色々と複雑なみたいなので、項目計算式は諦めて、一括処理にしてしまいましょう。(^^;)
--------------------------------------------------------------------------
氏名 [A] [B] [C]  病名1   病名2   病名3 ・・・ 病名9
 X  2  1   2  高血圧症  糖尿病  肝硬変
 Y  2  1   2  B型肝炎  高血圧
 Z  1  2   1  慢性腎炎
--------------------------------------------------------------------------
私の場合は、患者の持病の数が不定であるため、個々の病名を項目として
分けずに、1項目において
  高血圧症,糖尿病,肝硬変,……
のように半角カンマ区切りで病名(正確にはcode)を入れるようにしています。
で、前回は縦の関係(主系列)しか例示しませんでしたが、本当は横の関係もありまして、
 縦  K2711   腎疾患
 ↑  K27111511 腎癌   −  K4111 悪性腫瘍
               → 横(従系列)
と云うことで、患者に病名を入力する際に、従系列病名も同時に半角カンマ区切りで付加するようにしておりまして、
いずれにせよ、繰り返しループ内で#対応文字列関数を使って個々の病名を取り出すようにしています。
こうすっと、原則として項目数による縛りも不要となりますし、病名の前後入れ替え
(重篤なものほど左側に置く等)も簡単になります。
が、今回は個々の病名を項目に入れたとして考えてみます。
で、病名マスター例示が次のようなので、肝疾患を中心に考えてみます。
----------------------------------------
 070  ウイルス肝炎
    0700  A型肝炎
    ・・・
    070904 急性ウイルス肝炎
 570  急性肝炎
    570001  亜急性肝炎
    ・・・
    570015  黄色肝萎縮
 571  慢性肝疾患
    5710  アルコール性脂肪肝
    ・・・
    571903  肝硬化症
 572  肝膿瘍
 ・・・
----------------------------------------
----------------------------------------
[A]とは肝疾患を持つ患者は"2"、持っていない患者は"1"
[B]とは腎疾患を持つ患者は"2"、持っていない患者は"1"
[C]とは肝・腎疾患以外の病気を持つ患者は"2"、持っていない患者は"1"
----------------------------------------
↑ここんとこですが、該当なしの場合には"1"を入れないで未定義の
ままと、勝手に(^^;)変えさせていただきます。

※長過ぎるので分割します。

5099 No5098の続き 悲しげ 2000/03/11-12:39
記事番号5098へのコメント
え〜、続きです。

項目番号は[病名1]が4、[病名2]が5……、[病名9]が6とします。
かつ、[病名*]には病名自体ではなくcodeで入っているとします。
----------------------------------------
変数宣言 長整数{&i,&j},文字列{&上位病c,&下位病c}
ジャンプ 行番号=1
繰り返し(.not #EOF)
 繰り返し &i=4,9
  &下位病c=#項目属性(&i,0),&j=#文字数(&下位病c)
  if(&j>=3)
   繰り返し &j,3   /*上位3桁が判断値となるため?*/
    /*571903の場合だと、57190→5719→571と遡って行くはず*/
    &上位病c=#部分列(&下位病c,1,j)
    if(&上位病c="070")
     行訂正 [A]=[A]+"2"
     *繰り返し中止
    else if(&上位病c="570")
     行訂正 [A]=[A]+"2"
     *繰り返し中止
    else if(&上位病c="571")
     行訂正 [A]=[A]+"2"
     *繰り返し中止
    else if(&上位病c="572")
     行訂正 [A]=[A]+"2"
     *繰り返し中止
    ・・・・・・ (肝疾患の上位codeそのnが続く)
    else if(&上位病c=???)←腎疾患の上位codeその1
     行訂正 [B]=[B]+"2"
     *繰り返し中止
    else if(&上位病c=???)←腎疾患のcodeその2
    ・・・・・・ (腎疾患の上位codeそのnが続く)
    end
   繰り返し終了
  end
 繰り返し終了
 条件([A]+[B]="") 行訂正 [C]="2"
 ジャンプ 行番号=+1
繰り返し終了
*↓もし「該当なし」の場合にどうしても"1"を入れたければ
置換 終了状態=&実行リターン,[A]=#条件選択([A]="","1",1,[A])\
 ,[B]=#条件選択([B]="","1",1,[B]),[C]=#条件選択([C]="","1",1,[C])
--------------------------------------------
以上。但しエディタ上でのなぐり書きゆえ、挙動未確認。(^^;)

5100 一部書き換え汎用化 悲しげ 2000/03/11-13:11
記事番号5099へのコメント
もう少し汎用的にできそうです。
次のようにすると、code構成が変わった場合でも「&○疾患群」の
値の書き換えだけで対応できると思います。
----------------------------------------
変数宣言 長整数{&i,&j},文字列{&上位病c,&下位病c,&肝疾患群,&腎疾患群,&○疾患群}
&肝疾患群="070,570,571,572,……"\
,&腎疾患群="123,4567,890,24680,……"  /*←テキトー(^^;)*/
   /*#対応番号関数を使うために半角カンマ区切りで用意しておくのが味噌*/
表 "なんとか"
ジャンプ 行番号=1
繰り返し(.not #EOF)
 繰り返し &i=4,9
  &下位病c=#項目属性(&i,0),&j=#文字数(&下位病c)
  if(&j>=3)
   繰り返し &j,3   /*上位3桁が判断値となるため?*/
    &上位病c=#部分列(&下位病c,1,j)
    if(#対応番号(&肝疾患群,&上位病c)>0)
     行訂正 [A]=[A]+"2"
     *繰り返し中止
    else if(#対応番号(&腎疾患群,&上位病c)>0)
     行訂正 [B]=[B]+"2"
     *繰り返し中止
    end
   繰り返し終了
  end
 繰り返し終了
 条件([A]+[B]="") 行訂正 [C]="2"
 ジャンプ 行番号=+1
繰り返し終了
※以下略
-----------------------------------------

5101 Re:一部訂正 悲しげ 2000/03/11-13:44
記事番号5100へのコメント
すいません、明らかなミスがありました。

> 条件([A]+[B]="") 行訂正 [C]="2"

条件(#横件数([病名1],[病名9])>0 .and [A]+[B]="") 行訂正 [C]="2"

ですね。(^^;)

5104 たくさんのご指導有り難うございます KAZE 2000/03/12-02:15
記事番号5071へのコメント
みなさまこんにちは!

アッという間に20ほどのコメントを頂きましてホントにびっくりしています。

今自宅からで、手元に桐がないため(自宅はMacなんです)ご指導いただいた方法を確かめられないのが残念ですが、
月曜日から早速検証してみたいと思います。

個人的には、佐田先生が書かれた方法の(2)に、なるほどこんな方法もあるのかと、目からウロコ状態で、
試してみたい方法です。
これなら、色々と応用がききそうですね。

悲しげさんは、この業界にお詳しいようですので、もしかしたら今後ともお世話になるかも(迷惑がらないでね)m(_ _)m

今日は、皆さんから頂いたARTICLEの解析で知恵熱が出そうですので
お礼のみとさせていただきます。

結果が出ましたら、また投稿させていただこうと思います。

KAZE

戻る