Date型の変数に値を代入するには

解決


そらりん  2009-01-28 00:39:08  No: 141377

Access2000とOracle10gと言う環境です
datTimeと言うDate型の変数に、OracleのHIDUKEと言うDate型の値を代入したいと思っています。
代入するタイミングは、フォームが立ち上がると同時にストアドプロシージャを走らせて、関連のデータを取得・表示する時にやっています。
Accessは大本のMDBをコピーして、適当にフォルダを作成して、そこにコピーした物を動かしています。
動かし始めて初回のみdatTimeに初期値のままで代入されず、エラーが出てしまっています。一度エラーが出るとそれ以降はきちんと代入され、エラーが出ません。
データは、「2009/01/27」と言うのもあれば「2009/01/27 15:29:10」と言うのもあるので、「0:00:00」と出てしまうのかと思いFormatでyyyy/mm/dd hh:nn:ssとしてあげたのですが、初回に限りそうではない事が分かりました。
エラーは分かったのですが、エラーの原因を知りたいです。
何故、初回のみ代入されず初期値なのか、知っている方がいらっしゃったら教えて頂けませんか。
何か足りない説明があれば都度提示します
よろしくお願いします


魔界の仮面弁士  2009-01-28 01:07:47  No: 141378

# 回答に非ず

> エラーが出てしまっています。
であれば、そのエラー内容を正確に転記してみてください。

現状は、エラー内容もソースコードも提供されていないのですから、
有効な回答は得られないと思いますが、問題の起きる可能性としては:

(1) Access のプログラムに不具合がある。
(2) Oracle のストアドに不具合がある。
(3) コードに問題は無いが実行環境に問題がある。

といったところが思いつきます。

> 何か足りない説明があれば都度提示します
Oracle/Access 双方のソースコードを簡略化していき、問題を起こす箇所を特定してください。
(この作業は第三者にはできないので、そらりんさん自身がデバッグせねばなりません)

たとえば、特定のデータが含まれている場合にのみ問題が発生する、とか、
変数の初期化忘れとか、トランザクション管理漏れなど。

その上で
  「このソースのこの箇所を実行した時に、エラーになってしまいます」
  「この箇所に問題があるのは分かりましたが、どう直せば良いのか分かりません」
といった具体的な質問に切り替えれば、何らかのアドバイスが得られるかも知れませんが。


そらりん  2009-01-28 01:35:33  No: 141379

魔界の仮面弁士さんありがとございます
各種値は
Dim WRK_Master      As New ADODB.Recordsetと宣言してデータはここに格納しています
ストアドプロシージャを走らせて
Select True
  Case WRK_Master.EOF
  Case Else
      With WRK_Master
        …
        datTime = .Fields("HIDUKE")
      End With
End Select
として、取得しています。
エラーはこれをデータとして書き込み時にストアドプロシージャ側で
他の人が同データを先に書き込んでないか見る為に使っています
ですが、ここで初期値になってしまう為にエラーとして返してしまうので
きちんと代入出来ていなければならないのです。
データ取得側では特に何もしていません
Select …, HIDUKE From テーブル Where … としています
で、問題の変数はPrivate datTime As Date  とフォーム全体にかかる様に宣言しています
書き込みが成功してもしなくても、再度同じデータを読みに行きます
成功していれば新しいHIDUKEを、成功していなければ同じHIDUKEを取得する事になります。


魔界の仮面弁士  2009-01-28 02:33:32  No: 141380

うぅむ……。

Dim 宣言 の仕方といい、Select Case の使い方といい、
推奨されない VB コードのオンパレードに見えますが、
今回は、細かいことには目を瞑るとして:

> ストアドプロシージャを走らせて
で、ストアドの方は問題なかったのでしょうか。
# たとえば、そのストアドを呼ぶ前に、どこかの作業テーブルに
# 特定のデータを入れておかねばならない仕様になっていた、とか。

> datTime = .Fields("HIDUKE")
値を得る場合には、
  datTime = .Collect("HIDUKE")
もしくは
  datTime = .Fields("HIDUKE").Value
のように記述する必要があります。対 Oracle の場合は特に。

また、HIDUKE が NULL を返す可能性がある場合には、VB 側の変数は
As Date ではなく、As Variant にせねばならない事に注意してください。
その上で、IsNull 関数を使って値チェックをする必要があります。

> ここで初期値になってしまう為に
「初期値」とは、CDate(Empty) と同じ値という事でしょうか?

であれば、
  datTime = .Fields("HIDUKE").Value
という部分を、
  datTime = #12/23/1234 12:34:56 PM#
  datTime = .Fields("HIDUKE").Value
のように、事前にダミーの値を入れておいて見てください。

ダミー値代入後に HIDUKE を受け取っても、変数がダミー値のままであるならば、
代入操作そのものが失敗していることになります。この場合には
「On Error」でエラーを握りつぶしていないかをチェックしてみてください。

あるいは、HIDUKE を受け取ると CDate(Empty) になってしまうのであれば、
HIDUKE そのものがそういう値を返してきているのだと思います。

> エラーとして返してしまうので
そのエラーとは VB が返すエラーですか? Oracle が返すエラーですか?
それとも、アプリ自身が表示させているエラーですか?

VB/OS/Oracle が返すエラーなら、その内容を転記してください。
自身で発生させているエラーなら、その判定条件自体に誤りが無いかを
確認してみてください。


そらりん  2009-01-28 19:49:09  No: 141381

魔界の仮面弁士さん、ありがとうございます
ストアドの方では問題は無かったです。何回か試したのですがそこでエラーが出たり、空のデータを取得する事はありませんでした

初期値は0:00:00です。
他のサイトなど確認してみたのですが、初期値は0:00:00でした

値をテキストボックスに吐き出した所
変数では初期値なのに、テキストボックスには日付が表示されました
再度読み込んだ時には、その時はちゃんと変数は日付を取っていました
何度やっても初期値ならば代入の仕方が悪いと分かるのですが

フォームロード時に一度datTime = Nowと仮に代入してみました
そうしたら初回でもきちんと代入されました

>値を得る場合には、
>  datTime = .Collect("HIDUKE")
>もしくは
>  datTime = .Fields("HIDUKE").Value
>のように記述する必要があります。対 Oracle の場合は特に。
通常はSQLServerを使っているので、同じ様にしたのですがそれも拙かったんですね

エラーを返すのは、Oracleでなのですが
そのエラーは意図的に出しているので、特に問題はないです
変数が初期値でストアドに渡してしまうのが、そもそものエラーなので


そらりん  2009-01-28 20:49:22  No: 141382

魔界の仮面弁士さん、ありがとうございます
>値を得る場合には、
>  datTime = .Collect("HIDUKE")
>もしくは
>  datTime = .Fields("HIDUKE").Value
>のように記述する必要があります。対 Oracle の場合は特に。
教えて頂いた2つのやり方を試してみた所、どちらも取得する事が出来ました
今までは、SQLServerだったので、そのままのやり方でやっていたのが代入出来ないと言う問題を発生させていたのですね
ありがとうございました


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加