Microsoft Access Club Access超初心者対象Forum Access初級者対象Forum Access初・中級者対象Forum Access VBA Tips Forum DAO、ADO、SQL Forum

     

リストへもどる

投稿記事の一括表示

タイトル演算の結果(””)を用いてさらに演算した結果に基づくフィールド結果表示について、Null or 長さ0時の文字列?
記事No171652
投稿日: 2016/11/23(Wed) 02:07
投稿者Takman
解決済: ON
OS:Win7
Access Version:2007

こんにちは
初めて投稿させていただきます
 
わたくしは医師で、現在癌に関する症例データベースを計画しています
そのうえで、癌の状態(大きさや転移やリンパ節転移など)を入力すると、自動的に病気の進行度を産出するように設計を試みているのですが
その際のNull値と空白値、長さ0の文字列の計算でエラー値が返され、いろいろ過去の投稿を参考に工夫しても改善されないため質問させていただきました。
 
直接データベースに移る前の前置きが長くなるのですが、
肝臓がんに対するデータベースを作成しており
肝臓癌の場合TNM分類といわれるものですが
(下記参照)
http://hanjuku.real-sound.net/halfboiled-med/criteria/tab-b7.html

T因子といわれるものに
@腫瘍の大きさ、A個数、B周囲の血管や胆管といわれる管に浸潤(しみ込んでいるか)
N因子といわれるものに
@リンパ節転移があるかないか
M因子といわれるものに
@ほかの臓器に転移があるか、ないか

で分類して、その該当項目でふるい分けして進行度が決まります
 
それをデータベースで実現するために
下記のフィールドを設定しました。そして、それぞれのクエリビルダで右側に記した演算式を入力しました
色々ネットなどで探した末に、エラーが表示出ないように Nz関数を使用したり工夫したのですが
どうしてもクエリを実行するとエラーが出てしまいます

[T_腫瘍サイズ]・・・・・・・・@  サイズの実際の値(mm)
[T_個数]・・・・・・・・・・・・・・A  実際の個数(コンボボックスで1個、2個、3個、、、、、、9個以上で設定)
[T_脈管浸潤_Vp]・・・・・・B  実際に門脈に浸潤があるかないか(Vp0、Vp1、Vp2、Vp3、、、とコンボボックスで設定)
[T_脈管浸潤_Vv]・・・・・・C  実際に静脈に浸潤があるかないか(Vv0、Vv1、Vv2、Vv3、、、とコンボボックスで設定)
[T_脈管浸潤_B]・・・・・・・D  実際に胆管に浸潤があるかないか(B0、B1、B2、B3、、、とコンボボックスで設定)
[T_サイズ_Calc]・・・・・・・E  : Switch(IsNull([T_サイズ]),"",[T_サイズ]<=20,"0",[T_サイズ]>20,"1")   
             ※[T_サイズ]がNullなら””を、20以下なら0を21以上なら1を表示
[T_個数_Calc]・・・・・・・・・F  : Switch(IsNull([T_個数]),"",Left([T_個数],1)=1,"0",Left([T_個数],1)>1,"1")
             ※[T_個数]が1なら0を、1以上なら1を表示
[T_脈管浸潤_Calc]・・・・・G  : Switch(IsNull([T_脈管浸潤_Vp]) Or IsNull([T_脈管浸潤_Vv]) Or IsNull([T_脈管浸潤_B]),"",[T_脈管浸潤_Vp]="Vp0" And [T_脈管浸潤_Vv]="Vv0" And [T_脈管浸潤_B]="B0","0",True,"1")
             ※[T_脈管浸潤_Vp]か[T_脈管浸潤_Vv]か[T_脈管浸潤_B]のいずれかがNull なら計算せず空欄を返す
              [T_脈管浸潤_Vp]がVp0且つ[T_脈管浸潤_Vv]がVv0且つ [T_脈管浸潤_B]がB0なら「0」を それ以外なら「1」を返す

[T_Score_Calc]・・・・・・・・H  : Switch(Nz([T_サイズ_Calc],"")="" Or Nz([T_個数_Calc],"")="" Or Nz([T_脈管浸潤_Calc]"")="","",True,Val([T_SizeCalc])+Val([T_NumberCalc])+Val([T_脈Calc]))
             ※T因子のE、F、Gの総和を算出。もし、[T_サイズ_Calc]、[T_個数_Calc]、[T_脈管浸潤_Calc]のいずれかが空欄なら空欄を返す
              それ以外なら[T_SizeCalc]+[T_NumberCalc]+[T_脈Calc]の値を返す

[T_因子判定]・・・・・・・・・・・I  TNM_T: Switch(IsNull([T_ScoreCalc]) Or Nz([T_ScoreCalc],"")="","",[T_ScoreCalc]=0,"T1",[T_ScoreCalc]=1,"T2",[T_ScoreCalc]=2,"T3",[T_ScoreCalc]=3,"T4")
              [T_Score_Calc]が0ならT1を[T_Score_Calc]が1ならT2を、[T_Score_Calc]が2ならT3を、[T_Score_Calc]が3ならT4を返す

[N_因子] ・・・・・・・・・・・・・・J 実際にリンパ節転移があるかないか(N0、N1とコンボボックスで設定)
[M_因子]・・・・・・・・・・・・・・K  実際に他臓器に転移があるかないか(M0、M1とコンボボックスで設定)    
[TNM_癌取り扱い規約]・・・・L  Switch(IsNull([TNM_T]) Or IsNull([TNM_LN]) Or IsNull([TNM_M]),"",True,[TNM_T]+[TNM_LN]+[TNM_M])


実際に上記を実行すると、@〜H、J〜Lまでは演算されますが
[T_因子判定]、[TNM癌取り扱い規約]に関しては、エラーが返されます
空白セルは演算せずに、それに関わるフィールド演算結果は空欄で返したいのです。
それがなぜエラーが出るのかが分からず困っています。
実際T因子判定自体は他のフィールドからの演算結果を用いているのですが計算に用いている因子自体が数字でNullが返されているのか、文字列で""が返されているのかはっきりと分かりません。
どちらでも対応しうるように演算をくんでみましたが、それでもうまくいきません。
どうかお力添えをお願いできないでしょうか
 

タイトルRe: 演算の結果(””)を用いてさらに演算した結果に基づくフィールド結果表示について、Null or 長さ0時の文字列?
記事No171653
投稿日: 2016/11/23(Wed) 09:43
投稿者hatena
解決済: ON
> [T_腫瘍サイズ]・・・・・・・・@  サイズの実際の値(mm)
> [T_個数]・・・・・・・・・・・・・・A  実際の個数(コンボボックスで1個、2個、3個、、、、、、9個以上で設定)
> [T_脈管浸潤_Vp]・・・・・・B  実際に門脈に浸潤があるかないか(Vp0、Vp1、Vp2、Vp3、、、とコンボボックスで設定)
> [T_脈管浸潤_Vv]・・・・・・C  実際に静脈に浸潤があるかないか(Vv0、Vv1、Vv2、Vv3、、、とコンボボックスで設定)
> [T_脈管浸潤_B]・・・・・・・D  実際に胆管に浸潤があるかないか(B0、B1、B2、B3、、、とコンボボックスで設定)

ここまでは、テーブルにあるフィールドですよね。
まず、このフィールドのデータ型は提示してください。
あと「値要求」の設定、テキスト型の場合は「空文字列の許可」の設定も提示してください。


> [T_サイズ_Calc]・・・・・・・E  : Switch(IsNull([T_サイズ]),"",[T_サイズ]<=20,"0",[T_サイズ]>20,"1")   
>              ※[T_サイズ]がNullなら””を、20以下なら0を21以上なら1を表示

"" や "0" "1" は文字列になりますが、後で演算するなら、数値にすべきですね。

Switch(IsNull([T_サイズ]),Null,[T_サイズ]<=20,0,[T_サイズ]>20,1)


> [T_個数_Calc]・・・・・・・・・F  : Switch(IsNull([T_個数]),"",Left([T_個数],1)=1,"0",Left([T_個数],1)>1,"1")
>              ※[T_個数]が1なら0を、1以上なら1を表示
> [T_脈管浸潤_Calc]・・・・・G  : Switch(IsNull([T_脈管浸潤_Vp]) Or IsNull([T_脈管浸潤_Vv]) Or IsNull([T_脈管浸潤_B]),"",[T_脈管浸潤_Vp]="Vp0" And [T_脈管浸潤_Vv]="Vv0" And [T_脈管浸潤_B]="B0","0",True,"1")
>              ※[T_脈管浸潤_Vp]か[T_脈管浸潤_Vv]か[T_脈管浸潤_B]のいずれかがNull なら計算せず空欄を返す
>               [T_脈管浸潤_Vp]がVp0且つ[T_脈管浸潤_Vv]がVv0且つ [T_脈管浸潤_B]がB0なら「0」を それ以外なら「1」を返す

ここまでも、上と同様に、"" や "0" "1" は Null, 0, 1 に変更。


> [T_Score_Calc]・・・・・・・・H  : Switch(Nz([T_サイズ_Calc],"")="" Or Nz([T_個数_Calc],"")="" Or Nz([T_脈管浸潤_Calc]"")="","",True,Val([T_SizeCalc])+Val([T_NumberCalc])+Val([T_脈Calc]))
>              ※T因子のE、F、Gの総和を算出。もし、[T_サイズ_Calc]、[T_個数_Calc]、[T_脈管浸潤_Calc]のいずれかが空欄なら空欄を返す
>               それ以外なら[T_SizeCalc]+[T_NumberCalc]+[T_脈Calc]の値を返す

数値にしておけば、Valで数値に変換する必用もないし、Switchで場合分けする必用もなく、単純に、下記の式でOK。

[T_SizeCalc]+[T_NumberCalc]+[T_脈Calc]

数値の演算の場合、Nullがあると結果もNullになる。

> [T_因子判定]・・・・・・・・・・・I  TNM_T: Switch(IsNull([T_ScoreCalc]) Or Nz([T_ScoreCalc],"")="","",[T_ScoreCalc]=0,"T1",[T_ScoreCalc]=1,"T2",[T_ScoreCalc]=2,"T3",[T_ScoreCalc]=3,"T4")
>               [T_Score_Calc]が0ならT1を[T_Score_Calc]が1ならT2を、[T_Score_Calc]が2ならT3を、[T_Score_Calc]が3ならT4を返す

[T_Score_Calc]が[T_ScoreCalc] となっているのは転記ミスとして、[T_Score_Calc] は Null か数値と決まっているので、下記の式でOK。

TNM_T: Switch([T_Score_Calc]=0,"T1",[T_ScoreCalc]=1,"T2",[T_ScoreCalc]=2,"T3",[T_ScoreCalc]=3,"T4")

あるいは、

TNM_T: Choose(Nz([T_Score_Calc],-1)+1,"T1","T2","T3","T4")



> [N_因子] ・・・・・・・・・・・・・・J 実際にリンパ節転移があるかないか(N0、N1とコンボボックスで設定)
> [M_因子]・・・・・・・・・・・・・・K  実際に他臓器に転移があるかないか(M0、M1とコンボボックスで設定)    

このフィールドのデータ型、
コンボボックスの設定(値集合ソース、列数、列幅)、
を提示してくだい。

> [TNM_癌取り扱い規約]・・・・L  Switch(IsNull([TNM_T]) Or IsNull([TNM_LN]) Or IsNull([TNM_M]),"",True,[TNM_T]+[TNM_LN]+[TNM_M])


数値型とテキスト型の取扱の差異を意識してください。Null と "" の違いも同様に意識しましょう。

タイトルRe^2: 演算の結果(””)を用いてさらに演算した結果に基づくフィールド結果表示について、Null or 長さ0時の文字列?
記事No171654
投稿日: 2016/11/23(Wed) 18:55
投稿者Takman
解決済: ON
hatenaさま、早速の返信ありがとうございます
呈示が足らずに申し訳ありませんでした


各フィールドの定義は

[T_腫瘍サイズ]・・・・・・・・@  サイズの実際の値(mm)   【数値型】
[T_個数]・・・・・・・・・・・・・・A  実際の個数(コンボボックスで1個、2個、3個、、、、、、9個以上で設定)  【テキスト型】
[T_脈管浸潤_Vp]・・・・・・B  実際に門脈に浸潤があるかないか(Vp0、Vp1、Vp2、Vp3、、、とコンボボックスで設定) 【テキスト型】
[T_脈管浸潤_Vv]・・・・・・C  実際に静脈に浸潤があるかないか(Vv0、Vv1、Vv2、Vv3、、、とコンボボックスで設定) 【テキスト型】
[T_脈管浸潤_B]・・・・・・・D  実際に胆管に浸潤があるかないか(B0、B1、B2、B3、、、とコンボボックスで設定)   【テキスト型】

[N_因子] ・・・・・・・・・・・・・・J 実際にリンパ節転移があるかないか(N0、N1とコンボボックスで設定)      【テキスト型】
[M_因子]・・・・・・・・・・・・・・K  実際に他臓器に転移があるかないか(M0、M1とコンボボックスで設定)      【テキスト型】
[TNM_癌取り扱い規約]・・・・L  Switch(IsNull([TNM_T]) Or IsNull([TNM_LN]) Or IsNull([TNM_M]),"",True,[TNM_T]+[TNM_LN]+[TNM_M])



※以下の項目はテーブル上のフィールドではなく、クエリのみのフィールドとなります。
[T_サイズ_Calc]・・・・・・・E  : Switch(IsNull([T_サイズ]),"",[T_サイズ]<=20,"0",[T_サイズ]>20,"1")   
[T_個数_Calc]・・・・・・・・・F  : Switch(IsNull([T_個数]),"",Left([T_個数],1)=1,"0",Left([T_個数],1)>1,"1")
[T_脈管浸潤_Calc]・・・・・G  : Switch(IsNull([T_脈管浸潤_Vp]) Or IsNull([T_脈管浸潤_Vv]) Or IsNull([T_脈管浸潤_B]),"",[T_脈管浸潤_Vp]="Vp0" And [T_脈管浸潤_Vv]="Vv0" And [T_脈管浸潤_B]="B0","0",True,"1")
[T_Score_Calc]・・・・・・・・H  : Switch(Nz([T_サイズ_Calc],"")="" Or Nz([T_個数_Calc],"")="" Or Nz([T_脈管浸潤_Calc]"")="","",True,Val([T_SizeCalc])+Val([T_NumberCalc])+Val([T_脈Calc]))
[T_因子判定]・・・・・・・・・・・I  TNM_T: Switch(IsNull([T_ScoreCalc]) Or Nz([T_ScoreCalc],"")="","",[T_ScoreCalc]=0,"T1",[T_ScoreCalc]=1,"T2",[T_ScoreCalc]=2,"T3",[T_ScoreCalc]=3,"T4")
[N_因子] ・・・・・・・・・・・・・・J 実際にリンパ節転移があるかないか(N0、N1とコンボボックスで設定)
[M_因子]・・・・・・・・・・・・・・K  実際に他臓器に転移があるかないか(M0、M1とコンボボックスで設定)    
[TNM_癌取り扱い規約]・・・・L  Switch(IsNull([TNM_T]) Or IsNull([TNM_LN]) Or IsNull([TNM_M]),"",True,[TNM_T]+[TNM_LN]+[TNM_M])


>「値要求」の設定、テキスト型の場合は「空文字列の許可」の設定
に関しては、意識したことがなく、設定を触ったことがないのですが
どういったとこで影響してくるのでしょうか?
テーブルデザインから確認したところ、デフォルトから触っておらず
先に挙げた、[T_腫瘍サイズ]、[T_個数]、[T_脈管浸潤_Vp]、[T_脈管浸潤_Vv]、[T_脈管浸潤_B]、[N_因子]、[M_因子]ともに、
「値要求」の設定は「いいえ」、「空文字列の許可」は「はい」となっています

数値型の[T_腫瘍サイズ]に関しても「値要求」の設定は「いいえ」となっています




> [T_サイズ_Calc]
に関しても"" や "0" "1" は文字列として扱われるのですね。
関数の構文の書き方を熟知しておらず、どんな数値や文字列も""がいるのかと勘違いしてました

[T_Score_Calc]に関して
> TNM_T: Choose(Nz([T_Score_Calc],-1)+1,"T1","T2","T3","T4")
なるほど、こういった考え方もあるのですね、勉強になります




> [N_因子] 、 [M_因子]
> このフィールドのデータ型、
> コンボボックスの設定(値集合ソース、列数、列幅)、 を提示してくだい。

データ型は【テキスト型】
コンボボックスの設定は
[N_因子]に関しては、値集合ソースは"N0";"N1"、値集合タイプは値リストで、ほか、列数や列幅はプロパティには記載がありません
[M_因子]に関しても、値集合ソースは"M0";"M1"、値集合タイプは値リストで、ほか、列数や列幅はプロパティには記載がありません

です


> 数値型とテキスト型の取扱の差異を意識してください。Null と "" の違いも同様に意識しましょう。


hatena様にご指摘の個所を直したところ、無事、エラー表示が消えました!
ありがとうございます。

結局今回のエラーは、それぞれのセルの結果が""、Null、数値、文字列などといった返答された値の種類が異なったために起きたエラーだったという解釈でよろしいのでしょうか

また、先の文章中にあった「値要求」の設定、テキスト型の場合は「空文字列の許可」の設定に関しては、どういったとこで影響してくるのでしょうか?
不勉強で申し訳ありませんが、今後の参考のためにご教示いただけたら幸いです。

タイトルRe^3: 演算の結果(””)を用いてさらに演算した結果に基づくフィールド結果表示について、Null or 長さ0時の文字列?
記事No171656
投稿日: 2016/11/24(Thu) 00:54
投稿者hatena
解決済: ON
> hatena様にご指摘の個所を直したところ、無事、エラー表示が消えました!

Lの方もエラー表示は消えましたか。

> 結局今回のエラーは、それぞれのセルの結果が""、Null、数値、文字列などといった返答された値の種類が異なったために起きたエラーだったという解釈でよろしいのでしょうか

Iの式内に [T_ScoreCalc]=0 というのがありますが、[T_ScoreCalc]は "0" というような文字列になりますが、文字列と数値を比較しているので、データ型が違うというエラーになります。


> また、先の文章中にあった「値要求」の設定、テキスト型の場合は「空文字列の許可」の設定に関しては、どういったとこで影響してくるのでしょうか?

デフォルトでは、「値要求」は「いいえ」、「空文字列の許可」も「はい」になってますが、これだと、Null と 空文字列("")の両方を許すことになります。
Null と 空文字列は見た目では区別つかなし、共存するといろいろ扱いがいろいろ面倒ですので、
「値要求」「いいえ」、「空文字列の許可」「いいえ」にして 空文字列("")の入力を禁止するか、
「値要求」「はい」、「空文字列の許可」「はい」にして Nullの入力を禁止するか、
というように片方だけ許可するようにしたほうが扱いがシンプルになります。

タイトルRe^4: 演算の結果(””)を用いてさらに演算した結果に基づくフィールド結果表示について、Null or 長さ0時の文字列?
記事No171657
投稿日: 2016/11/24(Thu) 06:34
投稿者Takman
解決済: ON
> Lの方もエラー表示は消えましたか。

Lも無事エラー表示はなくなりました!

> Iの式内に [T_ScoreCalc]=0 というのがありますが、[T_ScoreCalc]は "0" というような文字列になりますが、文字列と数値を比較しているので、データ型が違うというエラーになります。

> デフォルトでは、「値要求」は「いいえ」、「空文字列の許可」も「はい」になってますが、これだと、Null と 空文字列("")の両方を許すことになります。
> Null と 空文字列は見た目では区別つかなし、共存するといろいろ扱いがいろいろ面倒ですので、
> 「値要求」「いいえ」、「空文字列の許可」「いいえ」にして 空文字列("")の入力を禁止するか、
> 「値要求」「はい」、「空文字列の許可」「はい」にして Nullの入力を禁止するか、
> というように片方だけ許可するようにしたほうが扱いがシンプルになります。


なるほど、納得しました。
今後の参考にさせていただきます。

ありがとうございました。

- 以下のフォームから自分の投稿記事を修正・削除することができます -
処理 記事No パスワード

ページの先頭へ 前ページへ戻る