こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

【access】型の異なるTBLへの登録方法

access2010を使用しツールを作成しております。

以下の処理順でTBLに値を登録したいです。
(1) テキストファイル(.txt)を一時格納TBLに登録
(2) 一時格納TBLの値を正規TBLに登録

一時格納TBLの型は仕様上、全てテキスト型を指定。
正規TBLの型は正しいものを指定したいのですが、insertやupdateでは上手くいきません。
※この点は理解して上記仕様にしております

処理の流れとして以下を考えていますが、
他に良い手段がある場合はご教示頂けないでしょうか。

(1) テキストファイル(.txt)を一時格納TBLに登録 [一時格納TBLは全てテキスト型]
(2) 一時格納TBLの値を正規TBLに登録 [正規TBLは全てテキスト型]
(3) ALTER TABLEで必要に応じ正規TBLの型を修正する
  ex)テキスト型→日付型、テキスト型→長整数型


このやり方だと、正規TBLの型を書き直してしまうため都度型指定をやり直さなければならず現実的な処理ではない。
またALTER TABLEの本来の使い方ではないと思っている。

詳しい方、良い手段をご教示ください。

投稿日時 - 2017-07-28 10:53:01

QNo.9356774

困ってます

質問者が選んだベストアンサー

>一時格納TBLの型は仕様上、全てテキスト型を指定。

テキストファイルをインポートする、一時格納TBLは、すべてのフィールドがテキスト型「でなければ」ならない、と言う仕様で、変更が出来ないのであれば「テキストフィールドを、正規の型に変換するクエリ」を用いることになります。

例えば、

変換前
T1フィールド:文字列型
T2フィールド:文字列型
T3フィールド:文字列型
T4フィールド:文字列型

変換後
T1フィールド:文字列型
T2Vフィールド:数値型
T3Vフィールド:日付/時刻型
T4フィールド:文字列型

となっている場合、以下のクエリ

SELECT TABLE1.T1, Val([T2]) AS T2V, DateValue([T3]) AS T3V, TABLE1.T4
FROM TABLE1;

で型変換されたフィールドが出力されます(循環参照を防ぐ為、型変換するフィールドは「T2→T2V」のように、フィールド名を変更する必要があります)

この変換クエリを元に、正規テーブルに対し、以下のようにinsertやupdateを行なえば良いです(上記の変換クエリを「QUERY1」とし、正規テーブルを「TABLE2」とした場合)

SELECT QUERY1.*, * INTO TABLE2
FROM QUERY1;

なお「Val関数により数値に変換できないフィールドは0に、DateValue関数により日付/時刻型に変換できないフィールドはブランクになる」ので、注意して下さい。

蛇足ですが、本来なら、ANo1の回答のように「テキストファイルをインポートする時に、保存してあるインポート定義を利用してインポートするべき」なのですが「仕様上、そうする事ができない」なら、上記のように「型変換クエリ」を用いるしかありません。

投稿日時 - 2017-07-28 12:11:34

お礼

ご丁寧にありがとうございました。
やはりTBL設計の段階で本来の形から逸脱しているのでそれが悪いですよね。
ご教示頂いた方法で進めてみます。

投稿日時 - 2017-07-31 09:36:16

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

因みに、日付/時刻型に変換するフィールドの内容により

日付のみを現す文字列の場合:DateValue(T3)
時刻のみを現す文字列の場合:TimeValue(T3)
日付と時刻を表す文字列の場合:DateValue(T3)+TimeValue(T3)

のように、式を使い分けして下さい。

また「おおもとの日付データ」が「20170728」のように、区切り記号が無い場合は変換出来ませんから、RIGHT、MID、LEFT関数を用いて「2017/07/28」のような、区切り文字を含んだ文字列を作ってから、DateValue、TimeValue関数を用いて下さい。

投稿日時 - 2017-07-28 12:30:14

ANo.1

一時格納テーブルがすべてテキスト型になってしまうというのが違います。
外部データでテキストインポートを選択して固定長やタブ区切りでフィールド分けをした際に、それぞれのフィールドのデータ型を設定できます。この設定を行ってからあと一手でインポートできるところでインポート定義を保存します。
実運用では、マクロボタンに削除とインポートを設定してその際の定義に保存したインポート定義を設定すればOKです。

投稿日時 - 2017-07-28 11:13:03

補足

ありがとうございます。
全てテキスト型なのは意図的です。ツールの仕様上まずは全てテキスト型で登録し、確定する際に型・桁指定のTBLに登録するというのが流れになります。
上記が仕様上良いものでないことは理解していますが、やむを得ずです。PL/SQLであれば実現できているのですが、accessの場合は難しいのかなとも思っています。

投稿日時 - 2017-07-28 11:45:52

あなたにオススメの質問