- ベストアンサー
VB6でデータの読み込みと追加、印刷がしたいのですが、
おはようございます。 会社で使用しているキャドソフトが作成する、結果ファイルからパーツ名(複数有り)を読み込み、そのパーツ名が以前に生産したものなら印刷しない(これはアクセスで作ります)、新規のパーツ名なら印刷、新規のパーツ名は既存のデータベースに保存というのを作りたいのですが、以前質問したところ、下記のようなお助けを頂きました、ありがとうございました。非常にわかりやすく頭では理解できているのですが、ソースが書けません(>_<)なら、VBやるなよと怒られそうですが、なんせ始めて10日なんで、経験積ませてください<(_ _)>下記のものをソースにするとどうなるでしょうか?端的なヒントでもいいんでよろしくお願いします。 1.パーツ名をファイルから読み込み、保存する。 2.ACCESSから既存のパーツ名を全件読み込み、保存する。 3.1.と2.を比較する。 このとき、2.を配列でなくCollectionオブジェクトを使用するようにしておき、追加する時にパーツ名をキーとして使用する(セットする値は別に何でも良い。あるかないか判断できればOK)。 そうすれば Collection("ファイルから読み込んだパーツ名") としたとき、2.に無ければエラーとなるのでそれを利用する。 いちいち2.の全件を舐めてもいいけど、こっちのほうが件数が多くなれば多く なるほど速いはず(メモリは食いますが)。 4.2.にあるものは1.から除去する。 5.1.に残ったデータを全てInsertする。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>err.number = 0& =「エラーが発生していない」 >err.number <> 0& =「エラーが発生している」 エラー番号による分岐をしているだけです。 さらに、この番号には意味があります。 エラー内容は「err.description」で見ることが可能です。 エラーオブジェクトをMSDNで調べましょう。 >ますテーブルオープンして全て削除 もし落ちてしまったら、データがなくなっちゃいますよね? なので、あえて初期化しないでInsertを行った方がいいかも知れませんね。 削除ロジックは ・VBから発行 ・レポートの閉じるときイベントにマクロや関数を埋め込む どちらでもよいと思います。 ・VBでの削除での欠点 ロジックが発生する ・レポートでの削除での欠点 操作ミスにより意図としないタイミングで、削除される恐れがある
その他の回答 (5)
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
さらに欲を言えばなのですが、 'エラー状態識別 if err.number = 0& then msgbox "渡すデータ" else msgbox "渡さないデータ" end if このコードは実際には適切ではありません。 重複データ登録時以外のエラーも「渡さないデータ」扱いになってしまいます。 まず、重複データ登録時エラー番号を得ましょう。 if err.number = 0& then msgbox "渡すデータ" else msgbox "エラー番号:" & err.number end if エラー番号がわかったら、エラー分岐を詳細にしましょう select case err.number case 0& msgbox "渡すデータ" case 重複データのエラー番号 msgbox "渡さないデータ" case else '予期せぬエラー処理 Dim varWk As Variant Dim strWk As String Dim i As Integer varWk = Array(&H8179, &H8150, &H20, &H4C, &H20, &H8150, &H817A, &H79, &H2D, &H7E, &H7E, &H7E _ , &H20, &HD4, &HCD, &HDE, &HB0, &H20, &HCA, &HDE, &HB8, &HDE, &HAF, &HC0) For i = LBound(varWk) To UBound(varWk) strWk = strWk & Chr(varWk(i)) Next i msgbox strWk end select
補足
すごい!ヤベェバグッタって出ましたよ(^◇^)すいません、詳しく教えてほしいのですが、if err.number = 0& thenの意味がよくわかりません。0&とはどういう意味なのでしょうか?つまりエラーがなかったらってことでしょうか?
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
>位置は適切でしょうか? はい >データレポート データレポートってVB6付随のですか? もしそうであれば、すいませんが、わかりません。 っていうかVB6環境が手元にないので、アドバイスチックなこともできません。 VB6はここしばらくやっておりません^^; ここにVB6で答えるときは、ExcelなどのVBAを利用して発言しております。 私に答えられるのは、アクセスのレポートを利用するっていう手もアリかな?と思うことぐらいです。 せっかくMDBを利用しているのであれば、新規パーツをメモリに堆肥しないでも、テーブル参照のアクセスレポートを作成するだけで、ロジックが減らせると思います。 手段1 1.今回マスタに追加するときに、今回分であることをわかるようにする(印刷"未"フラグを立てる) 2.レポートでフラグを参照し、対象物だけ印刷を行う 3.印刷"済"フラグに更新する 手段2 1.今回マスタに追加するときに、もう一つ新規テーブル「未印刷パーツテーブル」にも登録を行う 2.レポートで未印刷パーツテーブルの一覧を出力する 3.未印刷パーツテーブルからデータを消す 印刷の微調整なども、Accessレポートの修正だけで済み、再コンパイルの必要もありません。 もし「客先に触らせたくない」などの場合も、MDE形式のAccessファイルにしてあげれば、レポートも修正不可にできます。 なにより、コーディングがほとんどいらないのが最大の利点だと思います。
お礼
あ、これは勘違いでした<(_ _)>
補足
すいません(>_<)おかしなことがあります。既にデータがあるものも"新規"というメッセージになります。つまり、エラーのカウントされていないということでしょうか?何ででしょうか?If Err.Number = 0& Thenが何か必要なのでしょうか?あとレポートの方なんですが、手段2 1.今回マスタに追加するときに、もう一つ新規テーブル「未印刷パーツテーブル」にも登録を行う 2.レポートで未印刷パーツテーブルの一覧を出力する 3.未印刷パーツテーブルからデータを消す を使用したいと思います。これは、ますテーブルオープンして全て削除して、このテーブルにも追加という形ですよね?エラーが起きてなかったら追加という形でよろしいでしょうか?まずエラーの部分をしっかりしないと意味ないですね(>_<)原因としては何が考えられるでしょうか? よろしくお願いします<(_ _)><(_ _)><(_ _)>
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
>主キーではじかれてないものだけが追加されていくようにはなったのですが、ADD NEWを使いました。 追加できれば、Insert文でも何でもいいと思います。 (「なんせ始めて10日なんで」と言われていたので、細かいことは言いませんが、参考URLを張っておきますね) >つまり新規のパーツ名は追加と同時にデータレポートにも印刷用に渡さなければなりません。 エラーが発生しなかったら追加できたということですよね? だったらデータレポートに「渡すデータ」/「渡さないデータ」も識別できたことにはなりませんか? ↓このような感じで、エラーを無視して処理を続行させ、エラー値を取得してあげるとできると思いますが、いかがでしょう? 'エラー無視 on error resume next 'エラー初期化 err.clear '一連の追加処理 Add.New rs("") = "新パーツ" Add.Update 'エラー状態識別 if err.number = 0& then msgbox "渡すデータ" else msgbox "渡さないデータ" end if on error goto 0
補足
すごい!!!うまくいってます!!! 見てもらいたのですが、 lngFreeFile = FreeFile() Open "C:\default\NSTINP" For Input As #lngFreeFile 'とりあえず読み込む Do While Not EOF(1) Input #1, NSTINPデータ'NSTINPに全て読み込む If Mid(NSTINPデータ, 74, 1) <> ""Then '74番目が空白じゃないなら パーツ名 = Mid(NSTINPデータ,17,25)'17番目から25個を取る パーツ名 = Trim(パーツ名)'余計な空白などあれば削除 ******************* On Error Resume Next Err.Clear With 既存レコードオープン 既存レコードオープン.AddNew ![part-name] = パーツ名 既存レコードオープン.Update End With If Err.Number = 0& Then MsgBox "もうあるよ~" Else MsgBox "お、新規だ!" End If On Error GoTo 0 End If Loop End If End If End If Close lngFreeFile '読み終わったのでクローズしておく End Sub としました。教えていただいたソースの位置は適切でしょうか? もう一つ質問なのですが、新規のものをデータレポートに渡して印刷したいのですが、この処理の中に書くのでしょうか?で、最後に印刷っていう風になるのでしょうか? よろしくお願いします。
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
Accessのバージョンが無くても出来そうですが、一応Accessのバージョンを書いておきましょう 1.パーツ名をファイルから読み込み、保存する。 保存形式はどのような? 例1.CSVでのカンマ区切り 例2.固定長テキスト など ここの掲示板で「FreeFile」で検索をかけたら、テキストの読み込み関係は履歴がいっぱいあります。 2.ACCESSから既存のパーツ名を全件読み込み、保存する。 3.1.と2.を比較する。 4.2.にあるものは1.から除去する。 5.1.に残ったデータを全てInsertする。 練習ならこれでいいと思います。 普通であれば「マスタにはマスタに登録するテーブルのキーが存在」すると思います。 この場合、製品名称にキーを張るしかないのかな? ※製品名称にキーが張ってある場合 エラーハンドリングをしながら、エラー無視でぶっこんでみてはいかがでしょうか? キーさえ張ってあれば、データの重複が起きません。 「結果オーライ」っていうやり方ですが、教科書と違って実務では「処理が早くてメンテしやすい」というのが最優先。 ※製品名称にキーが張ってない場合 やり方はいろいろあると思いますが、私の場合ならワークテーブルに読み込んだデータを全て突っ込みます。 あとは重複しないデータだけインポートするSQL文を流すだけ
補足
すいません。 結果ファイルのパーツ名を読み込んで追加していくと 主キーではじかれてないものだけが追加されていくようにはなったのですが、ADD NEWを使いました。OldBoy63しかし、OldBoy63さんの教えのように、追加できるもの、つまり新規のパーツ名は追加と同時にデータレポートにも印刷用に渡さなければなりません。 そうすると、OldBoy63さんの言う順序がいいんですよね?アクセスは2000を使っています。2003にも対応ってしてるんですか?最終的には2003の入っているPCに持っていきます。プログラムのことをあまり知らないので、チンプンカンプンなことを言っていると思いますが、よろしくお願いします<(_ _)>
手順がちょっと違いますが 下記のほうが わかりやすくありませんか '読み込むファイルは テキストファイルでしょうから 読込ながらの処理です Dim RS As Recordset, X As String Do Until EOF(1) 'ファイルを読み込む Input #1, X RS.FindFirst "パーツ名='" + X + "'" If RS.NoMatch Then '新規の処理 追加( RS.AddNew) したり 印刷の準備をしたり Else '既存の処理 End If Loop 'ACCESS DB の 項目を工夫すれば どんな処理にも応用できます
補足
具体的に書きますね。 Dim 既存レコードオープンAs Recordset '加工済みパーツ名保存用 Dim NSTINPデータ As String 'テキストファイルから読み込んだデータ用 Do Until EOF(1) Input #1,NSTINPデータ 既存レコードオープン.FindFirst "パーツ名='" + X + "'" ***"パーツ名='" + X + "'"がちょっと解りません(>_<) ちなみにデータベースのフィールドはpart-nameの一つだけです。 OldBoy63さんの方法が初心者の私には優しそうなので、この方法でいきたいのです。よろしくお願いします<(_ _)><(_ _)><(_ _)>
お礼
これはちょっと難しくてよくわかんないです(>_<)しかし、かなり、思ってるものに近い動きになってきました。連休なんでゆっくりと勉強したいと思います。またわからなくなったら質問したいと思います。ほんとにながながとありがとうございました<(_ _)><(_ _)><(_ _)><(_ _)><(_ _)>