- ベストアンサー
昨日の続きなんですが、
VB6でCADソフトで作られたデータを読み込み、その中から製品名を読み込み、アクセスに保存されている製品名と比較し、一致したものがあれば、採寸必要なし、なければ採寸して下さい、というようなフォーマットに入れて印刷し、採寸が必要なもの、つまり新規の製品名はアクセスに追加したいのですが、現時点では、 Open "C:\users\partname" For Input As #1 Do While Not EOF Input #1, mytext If Mid(mytext, 74, 1) <> "" Then パーツ名 = Mid(mytext, 17, 25) パーツ名 = Trim(パーツ名) End If Loop という感じでやっとパーツ名だけ読み込めるようになりました。ここで質問なのですが、このプログラムの前に、データべ-スとテーブルを開いておくのでしょうか?それともパーツ名 = Trim(パーツ名)の後でデータベースをオープンし、テーブルもオープンなんでしょうか?順序、関数など全くわかりません(>_<)心臓が痛いです(-_-;)よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>Close #1がいるのですかぁ もっと言えば、ファイルナンバーを1番固定にしているのはまずいですね。 dim lngFreeFile as Long lngFreeFile = FreeFile() Open "C:\users\partname" For Input As #lngFreeFile '... '... Close #lngFreeFile のようにすべきですね。 # この場合は不具合はありませんが、そういうものだと覚えておけばいいでしょう。 >どういった方法がベストなんでしょうか? 私なら、パーツ名の読み込みとDBアクセスは分けますね。 パーツ名の読み込み結果を別領域に保存しておいて、後からDBを操作しに行きます。 そのほうがエラーが起こったとき分かりやすいからです。 パーツ名はユニーク(一意)ですよね? もし、パーツ名が主キーなら、実はSQLでInsert文を発行してもエラーは発生しますがInsertはされません(主キーが重複することができないため)。 ですので読み込んだパーツ名をInsertしていって、「主キーが重複している」というエラーのときは無視すればいい、というロジックも考えられます。 あまりスマートではありませんが、主キーが被らないようにDBの整合性を保ち、かつシンプル(読み込んだパーツ名を順にInsertすればいいだけ)なのでオススメではあるんですが、パーツ名だけを主キーにすることはあまり無いですから、この場合は使えるとは限りませんね(^^; 件数にも拠りますが、ACCESSですし私なら 1.パーツ名をファイルから読み込み、保存する。 2.ACCESSから既存のパーツ名を全件読み込み、保存する。 3.1.と2.を比較する。 このとき、2.を配列でなくCollectionオブジェクトを使用するようにしておき、追加する時にパーツ名をキーとして使用する(セットする値は別に何でも良い。あるかないか判断できればOK)。 そうすれば Collection("ファイルから読み込んだパーツ名") としたとき、2.に無ければエラーとなるのでそれを利用する。 いちいち2.の全件を舐めてもいいけど、こっちのほうが件数が多くなれば多くなるほど速いはず(メモリは食いますが)。 4.2.にあるものは1.から除去する。 5.1.に残ったデータを全てInsertする。 ・・・としますね。 確かに「1件づつSelect countして、あれば無視、なければInsertを発行」もいいんですが、あまりスマートじゃないですしね。(^^;
その他の回答 (2)
- takasebou
- ベストアンサー率42% (61/144)
えーっと、このままの方法でいくと、たぶんデータベースを先に開く事になると思いますが、方法次第なので順序はどちらでも構いません。 例えばSQLを作る為の条件式だけ先に作っておいて、後でDBを開く方法もあります。 DBをオープンする方法はアクセスならDAOかADOが簡単でしょう。VB6からなら、DAOオブジェクトとかを使うのが簡単だとは思います。 まぁ、でも先に開いておいて DAOのADDメソッドあたりを使って、パーツ名を得た時点で追加するのが簡単じゃないかと思います。 ### ここでアクセスを開く Open "C:\users\partname" For Input As #1 Do While Not EOF Input #1, mytext If Mid(mytext, 74, 1) <> "" Then パーツ名 = Mid(mytext, 17, 25) パーツ名 = Trim(パーツ名) ### ここにアクセスのレコードを追加するコードをかく End If Loop ### ここでDBを閉じる といった感じでしょうか? ちなみにテキストファイルは必ずクローズしてくださいね。 この場合であれば、読み終わった時点で Close #1 をいれればいいです。
お礼
Close #1がいるのですかぁ、知らなかったです(>_<)上記の方法で試したところ書き込みは成功しました。が、どういう風に参照させるのかがよくわかりません(>_<)どういった方法がベストなんでしょうか?変数に入れた"パーツ名"をデータベースに保存し蓄えてあるパーツ名と同じなら書き込まない、なかったら書き込むという感じだと思うのですが、取得したパーツ名を一旦、新しいデータベースに入れておいて、それをまた一つずつ比較させるのか、一気に参照させて、なかったら追加と全部やってしまうのがベストなんでしょうか?となると、まず、保存されているデータも読み込んでおく必要があるのでしょうか?それとも直接データベースと比較する方法などもあるのでしょうか?あぁ、プログラマーの方はすごいなぁ(>_<)こんがらまってます(>_<)
- anmochi
- ベストアンサー率65% (1332/2045)
うーんそうだねぇ。このループの中でパーツ名がぐるぐる変わっていっているので、この前にデータベースを開いておく方が良いだろうね。 VB6だからADOを使うのが一番楽だろうか。それともDAOを使うのかな? テーブルはループ内で毎回開く事になると思う。
補足
非常にわかりやすいのですが、なんせプログラム初なので何て書けばよいのかわかりません(>_<)心から申し訳ないです<(_ _)>確認させて下さい。>1.パーツ名をファイルから読み込み、保存する。ですが、これは例えば、part-nameというテーブルに既存のパーツ名を保存しておき、また別にpart-name2というようなテーブルも作っておき、結果ファイルから読み込んだものを一旦、保存ということでしょうか?特にデータベースにじゃなくてもよいのでしょうか?>2.ACCESSから既存のパーツ名を全件読み込み、保存する。これはpart-name3みたいなテーブルに保存でしょうか?これもデータベースにじゃなくてもよいのでしょうか?>3ですが、超難しいです(>_<)泣いてしまいました(>_<)ちなみに、データベースはパーツ名だけしか入っておらず、主キーも設定してないのですが、主キーを設定しておくと、自動ではじかれて問題はないのでしょうか?もうしわけありません、ほんっとに全くの初心者で<(_ _)>本からパクレば簡単だと思うからという風に言われて、やり始めたものですから。。。ちなみにどのような勉強から入っていけばよいものでしょうか?本は読んでいるのですが、いまいち理解しにくいものがあります(>_<)