変数Aと変数(1-10)を順番に比較するには

解決


FUN  2006-01-11 00:28:10  No: 129472

変数Aを変数(1-10)までの変数と比較し、
同じ値が検出されればループを抜け出し、処理Aを行う。
検出されなければ処理Bを行う。

次に同じように変数Bと変数(1-10)までの変数と比較し、
同じ値が検出されればループを抜け出し、処理Aを行う。
検出されなければ処理Bを行う。

同じように変数Cと・・・

という風に順次比較をしていきたいのですが、
うまくループ文が組めません。
ご教授いただけませんでしょうか。


FUN  2006-01-11 00:29:43  No: 129473

ちなみにVBScriptで組んでおります。


魔界の仮面弁士  2006-01-11 00:37:25  No: 129474

規則性があるのなら、その変数を配列にしておくのが良いかと。


Fun  2006-01-11 02:15:46  No: 129475

ご返答ありがとうございます。
せっかくご教示いただいたのですがうまく作成できません。

データベースから抽出したPKの1-10を変数1、変数2、変数3に代入した状態です。
その中から変数Aを見つけ出し、もし存在するならば更新処理、存在しないならば
追加処理を行いたいのですが・・・。

どうか見つけ出す処理をご教示いただけませんでしょうか・・・。


Dental  2006-01-11 02:33:53  No: 129476

> データベースから抽出したPKの1-10を
PKって何ですか? 主キー(Primary Key)の値の事?

> 変数1、変数2、変数3に代入した状態です。
それを、配列変数(0)、配列変数(1)、配列変数(2) に格納しておくようにすれば、Forループで処理できるのでは。

まぁ、配列にせずとも、EVal関数で処理する事はできるでしょうけれど、ループで処理するなら、配列を使う方がスマートかと。

> その中から変数Aを見つけ出し、
変数の中から変数を見つけ出すとは、どういう状態を指しているのですか?


Fun  2006-01-11 03:24:05  No: 129477

> PKって何ですか? 主キー(Primary Key)の値の事?
すみません、その通りです。

> それを、配列変数(0)、配列変数(1)、配列変数(2) に格納しておくようにすれば、Forループで処理できるのでは。
説明が足らずすみません、おそらく現在そのように代入しております。

> 変数の中から変数を見つけ出すとは、どういう状態を指しているのですか?
配列変数(0)から配列変数(9)の中の値から変数Aに入っている値とということです。


Fun  2006-01-11 03:30:11  No: 129478

> それを、配列変数(0)、配列変数(1)、配列変数(2) に格納しておくようにすれば、Forループで処理できるのでは。
説明が足らずすみません、現在そのように代入しております。

> 変数の中から変数を見つけ出すとは、どういう状態を指しているのですか?
配列変数(0)から配列変数(9)の中の値と変数Aの中の値とを比較してということです。


魔界の仮面弁士  2006-01-11 03:50:33  No: 129479

> せっかくご教示いただいたのですがうまく作成できません。

その、うまく作成できなかったというコードを見せてください。
そうしないと、どこに問題があったのかを指摘できませんので…。

ところで、値の比較時に、両辺のデータ型を一致させていますか?
TypeName関数を使って、どのような型のデータを扱っているのか、
一度確認してみてください。

たとえば、数値型の比較の場合…。
Oracle oo4o などでは、NUMBER型フィールドから得た値が、数値型ではなく、
文字列型として戻されますので、比較時には、CLng関数などで、比較式の
両辺の型を一致させておかないと、期待した結果にならない可能性があります。

文字列型の比較の場合…。
Jet データベースなどでは、文字列がバイナリではなくテキストで比較されます。
大文字・小文字や平仮名・片仮名などを同一視したい場合には、StrComp 関数を
試してみてください。

日付型の比較の場合…。
VBScript の日付値は、内部的には倍精度浮動小数点型です。
そのため、時刻情報を含むデータの場合、微妙な誤差を生じる事があります。
そのため、日付型同士を比較する場合は、=演算子ではなく、不等号演算子で
範囲指定するか、もしくは、Year/Month/Day/Hour/Minute/Second関数を
用いて、数値型として比較した方が安全です。


Fun  2006-01-11 19:59:14  No: 129480

すみません、整理してVB組んでみるとうまく動作いたしました。
お騒がせをいたしました。

魔界の仮面弁士 さん>
はい、その点はCstrなど型変換をして比較しておりました。

Dim csv_id(10)
Dim db_id(10)
csv_id(1) = 1000'同一ID
csv_id(2) = 1001'追加ID
csv_id(3) = 1002'追加ID
csv_id(4) = 1003'追加ID
csv_id(5) = 1004'追加ID
csv_id(6) = 1010'同一ID
db_id(1) = 1010'同一ID
db_id(2) = 1011'削除ID
db_id(3) = 1012'削除ID
db_id(4) = 1000'同一ID
Dim ch_flg(10)
Dim a,b,c

for a=1 to 6 step 1
  for b=1 to 4 step 1
    If true = (csv_id(a) = db_id(b)) Then
      MsgBox("同じIDを持つのはcsv_id(" & a & ")とdb_id(" & b & ")の" & csv_id(a) & "です")
      ch_flg(a) = 1
    End If
  Next
    If ch_flg(a) = 0 Then
      MsgBox("追加されたIDを持つのはcsv_id(" & a & ")の" & csv_id(a) & "です")
    End If
Next

for a=1 to 4 step 1

  for b=1 to 6 step 1
    If true = (db_id(a) = csv_id(b)) Then
      ch_flg(a) = 1
    End If
  Next
    If ch_flg(a) = 0 Then
      MsgBox("削除されたIDを持つのはdb_id(" & a & ")の" & db_id(a) & "です")
    End If
Next

不恰好なプログラムですがもっときれいに記述することは可能でしょうか・・・


Fun  2006-01-11 21:30:18  No: 129481

解決押し忘れました


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

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






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