投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/8/17 05:20:34
>>このような場面で
>>〇 [U+3007]:漢数字のゼロ(IDEOGRAPHIC NUMBER ZERO)
>>を使うことに違和感があります。
> では、どのような記号を頭に付けるのがこういう場合のルールなのでしょうか?

ルールという程の物ではないでしょうけれど、たとえば
数字として、〇、一、二、三…などと使う場合は、丸○ではなくゼロ〇 を使い、
今回のような記号としての扱いなら、ゼロ〇ではなく、丸○を使うのが良いと思います。

(細かくて済みません。こういうのが気になってしまう性質でして)

漢字の「力」と片仮名の「カ」が混同されていた場合とか、
"C#" の事を  C#  や "C♯と書いている場合とか、
全角マイナス「-」、長音記号「ー」、漢数字「一」、ダッシュ記号「―」などが
入れ替わっている場合なども、ついつい気になって指摘してしまう…。


> 業種を明らかにしてしまうようなものですが、これは、
実際の業務仕様を明かしすぎるとマズいでしょうし、
細かい点は単純化するなどして、適宜暈しておいてください。
(背景が分かった方が、状況を理解しやすいという側面はありますが…)

前回投稿いただいた時のように、元となるテーブルの各列の型や、
求めている最終的な変換後の構造が分かっていると答えやすいです。


> 「消費税課税」フィールドには、-1、0、1の数値を入れることとし、それぞれ、
> -1 : 免税
> 0 : 原則課税
> 1 : 簡易課税
> という意味を持たせています。

数値データを、対応する文字列として表示したいという点については、
その変換テーブルを Access 側に持たせているなら、JOIN して持ってくるのが
手っ取り早いでしょう。(あるいは、IIF 等で変換しておくとか)

でも今回求めているのは、Access 側で変換しておく方法ではなく、
データベースからは -1 とか 1 といった値のまま受け取るようにして、
それを VB 側で "原則課税" や "(原)" といった値に変換しようとしているものと認識しています。


> 親フィールドと子フィールドの型を一致させる、とのことですが、
これが必要なのは、DataSet 上で、複数テーブル間のリレーションを貼る場合に限ります。
(先の Relations.Add メソッドの所です)


そのため、データベースから得られる -1 や 1  という値を持つ [消費税課税] 列の情報が、
DataTable に格納された時に、Integer なのか String なのか Decimal なのか、
どの型になっているのか、クエリ1 を格納した DataTable の内容を
デバッガ等で調べてください、とお願いしている次第です。
(それを調べられるのは、実際に環境をお持ちの、さすがさん御自身だけです!)


連結する列の型が判明したら、リレーション先となる変換用テーブル
(Access 側には存在せず、VB 側にだけ持たせる DataTable) 内の
「主キー列」の型を、それに合わせるようにします。

VB 側で DataTable を用意する場合、それの列の型を指定する方法は、
何度も登場しているので問題ないですよね。

shu さんのコードから引用すれば、
> With SrcTbl.Columns
>         .Add("Column1", GetType(Integer))   'Integer 型の列を定義
>         .Add("Column2", GetType(String))    'String 型の列を定義
> End With

私のコードから引用すれば、
> dt.Columns.Add("契約ID", GetType(Long))   'Long 型の列を定義
> dt.Columns.Add("決算日", GetType(Date))   'Date 型の列を定義
> dt.Columns.Add("消費税課税", GetType(消費税課税)) 'Enum 消費税課税 As Integer な列
> dt1.Columns.Add("消費税課税", GetType(Decimal))    'Decimal 型の列を定義

などのように、Columns.Add の第二引数で「目的の型」を指定します。


> 子フィールド("消費税課税")が、データベースから取り出した、
> -1
> 0
> 1
> というInteger型である、

Integer 型であると判明したのですね?
であれば、変換テーブルの主キーを GetType(Integer) にするだけです。


変換テーブルの主キー列の型が Integer に決まったので、
親となるその変換テーブルに対して、shu さんが提示してくださったように、
.Rows.Add を必要な回数呼び出して、Integer を主キーとしたデータを登録しておきます。
  dt.Rows.Add(-1, "(免)")
  dt.Rows.Add(0, "(原)")
  dt.Rows.Add(1, "(簡)")

あるいは固定値を Rows.Add する他、列挙型や Dictionary から生成したり、
CSV などから読み取って変換テーブルを作ることもできるわけですが…何はともあれ、
とにかく、変換用の DataTable を適切な列定義で準備することが肝となります。
PrimaryKey の設定も忘れずに!


変換テーブル側の主キーの型を、クエリ1 の型に合致させておけば、先の
 ds.Relations.Add("Rel消費税課税", 変換テーブルの主キー列, クエリ1の消費税課税列, True)
がエラーになる事は無くなるでしょう。



あるいは、「そもそも Relations を使わない」という選択肢もあります。

クエリ1 で取得したテーブルというのは、要するにただの DataTable に過ぎないわけですから、
SQL から取得した後で、さらにそこに、空の String 列を追加で .Columns.Add することも
できるわけです。

空列を追加したら、クエリ1 用の DataTable の各行をループ処理で回し、
If 文で「消費税課税」列の値を調べ、それが "原則課税" を表す 0 であったなら、
追加した列に、"(原)" という値をセットしていくということができます。

これならば、リレーション用の第二の DataTable を用意する必要はなくなります。


あるいは クエリ1 のテーブルを追加加工するのではなく、クエリ1 の DataTable は残したまま、
最終結果を入れるための DataTable を用意して、そこに値を詰めていくのでも良いでしょう。
(此方の実装パターンも、形を変えて既にサンプルを投稿してありますね)