• ベストアンサー

Accsess2003にて2回目のデータ表示がおかしい

助けてください!! テーブルに会員データ以外に支部テーブル、部会テーブルがあります。 部会テーブルには、支部コード,部会コード,部会名があります。 会員テーブルには、支部コード,部会コードはありますが、それぞれの名称はありません。画面表示には、各名称を表示するようにしています。 1回目の読込は、通常に表示しますが、2回目に別会員を読み込むとき どうしても1回目の支部コードの部会コードを読込んでしまいます。 例えば各テーブルが下記の時、1回目支部テーブル01 部会テーブル01 の場合 「ははは」を表示します。 2回目 支部テーブル02 部会テーブル02 の場合 「ひひひ」を表示します。正解は「みみみ」です。     支部テーブル 01 あああ 02 いいい     部会テーブル 01 01 ははは 01 02 ひひひ            02 01 ままま 02 02 みみみ  簡単なプログラムですが悩んでいます。是非是非、アドバイスお願い致しますm(__)m        Public Function 会員データ読み込み(会員番号 As String) As Integer Dim データベース As Database, レコード As Recordset Dim SQLステートメント 会員データ読み込み = 0 'return値設定。 SQLステートメント = "select * from 会員情報テーブル where 会員番号='" & 会員番号 & "'" Set データベース = CurrentDb Set レコード = データベース.OpenRecordset(SQLステートメント) If レコード.EOF = True Then '指定されたコードがない。 : End If With レコード Me!会員名 = !会員名 Me!フリガナ = !フリガナ Me!事業所名 = !事業所名 Me!業種1 = !業種1 Me!支部 = !支部 Me!部会 = !部会 Me!隠し支部 = Me!支部.Column(1) Me!隠し部会 = Me!部会.Column(2) Me!会員種別 = !会員種別 : 中略 退会FLG = !退会フラグ SQLステートメント = "select 部会テーブル.支部コード, 部会テーブル.部会コード, * FROM 部会テーブル WHERE (((部会テーブル.支部コード)='" & Me!支部 & "') AND ((部会テーブル.部会コード)='" & Me!部会 & "'));" Me!隠し部会 = Me!部会.Column(2) End With レコード.Close データベース.Close Set データベース = Nothing End Function

  • chau
  • お礼率40% (30/75)

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

  • ベストアンサー
noname#60992
noname#60992
回答No.5

>lngBukaiCD = RST!部会コード >lngShibuCD = RST!支部コード RSTではなかったですね。 lngBukaiCD = レコード!部会コード lngShibuCD = レコード!支部コード の誤りです。 (ついついいつもの癖が、、、、) 失礼しました。 

chau
質問者

お礼

16Augustさん。アドバイスありがとうございますm(__)m JOIN を付けてSQL文を作成し、ちゃんと表示することが出来ました。 本当に助かりましたm(__)m 実は、このプログラムは Access95で誰かが作ったものを Access2003にコンバートして、不具合になったものです。 なので、最初から作ったわけではなかったので??だらけでした。 初歩的な質問にも、きちんと答えていただきまして 本当にありがとうございました。

その他の回答 (4)

noname#60992
noname#60992
回答No.4

再度No1です。  No3を行っても正しい抽出はされないかもしれません。 よくよく見てみると、なんだかよくわからないプログラムですね。 データベースのリレーションを使おうとしているのかな? JOINを1回も使っていないのに、2回のSQLで3つのテーブルからデータを取ってくることに無理があるような気がします。 プログラムの流れとしては 1. 1回のSQLで行うなら、 アクセスでクエリを作ることができるなら、必要な情報がすべて表示されるクエリを作成しそのクエリをSQLビューで見てみると、 ご希望のSQL文が得られると思います。 2. 3回に分けて行うなら、 (1)会員IDから必要な情報を収集する。 (2)部会テーブルから(1)で得られた部会コードより部会名を取得する。 (3)支部テーブルから(1)で得られた支部コードより支部名を取得する。 といった順番になります。 (1)のSQL "SELECT * FROM 会員情報テーブル WHERE 会員コード = '" & 会員番号 & "'" この後データを取得する際に部会コード及び支部コードを変数に格納しておけば、(2)(3)のSQLが作りやすくなります。 lngBukaiCD = RST!部会コード lngShibuCD = RST!支部コード もちろん、フォーム上のテキストボックスなどに格納してもよいですが、フォームにリフレッシュなどをかける必要があるかもしれません。 (2)のSQL "SELECT 部会名 FROM 部会テーブル WHERE 部会コード = '" & lngBukaiCD & "'" (3)のSQL "SELECT 支部名 FROM 支部テーブル WHERE 支部コード = '" & lngShibuCD & "'" どれも a.レコードセットを定義する。 (SQLステートメント = "SELECT .........") b.レコードセットを開く。 (Set レコード = データベース.OpenRecordset(SQLステートメント))  c.情報を収集する。 (me.xxx = レコード!xxx)  d.レコードセットを閉じる。 (レコード.close) の順番で行うのが一般的であると思います。 3つレコードセットを作ってもかまいませんが、個人的にはむやみにレコードセットを増やすのはわかりにくくなるので好みません。 私は主にADOを使いますが(ほかのやり方をあまり知りません)、 No2の方がおっしゃっているようにファンクションを作っておくと非常にプログラムがわかりやすくなると思います。 まず、クエリ(SQL)をもう少し研究されることをお勧めします。

noname#60992
noname#60992
回答No.3

No1です。 Me!隠し部会 = Me!部会.Column(2) は Set レコード = データベース.OpenRecordset(SQLステートメント) の後ですね。 すみません。

noname#140971
noname#140971
回答No.2

既に、正答がなされているので・・・。 全体の構想に関する老婆心ながらのアドバイスです。 フォーム毎にプログラムしていたのでは、幾ら、時間があっても足りませんよ。 そんなのは、専用の関数に任すのが一番です。 isOK=DisplayRecord(Me, SQL文) このような僅か1行で、質問者のやろうとしていることは実現できる筈です。 なぜなら、DisplayRecord関数は、フォームとSQL文を引数としているからです。 しかも、自分で表示するフォームコントロールを探しています。 ファームのフィールド名が、<"field_" + 列名>で命名すれば、こういう事も不可能ではありません。 まあ、OKWave の規則違反ギリギリの回答かと思いますが、余りにもシコシコとコードを書いているようなので。 ' ----------------------------------------------------------------------------------------- ' フォームに読み込んだ列情報を表示します。 ' ' 【要件】 ファームのフィールド名が、<"field_" + 列名>であること。 ' ----------------------------------------------------------------------------------------- Public Function DisplayRecord(ByVal frm As Form, _                ByVal strQuerySQL As String) As Boolean On Error GoTo Err_DisplayRecord   Dim isOK As Boolean   Dim I  As Integer   Dim N  As Integer   Dim rst As ADODB.Recordset   Dim fld As ADODB.Field   isOK = True   Set rst = New ADODB.Recordset   rst.Open strQuerySQL, _        CurrentProject.Connection, _        adOpenStatic, _        adLockReadOnly   If Not rst.BOF Then     ' =================     ' Begin With: frm     ' -----------------     With frm       N = .Controls.Count - 1       For Each fld In rst.Fields         For I = 0 To N           If Mid$(.Controls(I).Name, 7) = fld.Name Then             .Controls(I).Value = fld.Value             Exit For           End If         Next I       Next fld     End With     ' ---------------     ' End With: frm     ' ===============   Else     MsgBox " フォームに表示する情報はありません。(DisplayRecord)", vbInformation, " お知らせ"   End If Exit_DisplayRecord: On Error Resume Next   rst.Close   Set rst = Nothing   DisplayRecord = isOK   Exit Function Err_DisplayRecord:   isOK = False   MsgBox "実行時エラーが発生しました。(DisplayRecord)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DisplayRecord End Function

noname#60992
noname#60992
回答No.1

ざっと見たところ、 SQLステートメント = "select 部会テーブル.支部コード, 部会テーブル.部会コード, * FROM 部会テーブル WHERE (((部会テーブル.支部コード)='" & Me!支部 & "') AND ((部会テーブル.部会コード)='" & Me!部会 & "'));" Me!隠し部会 = Me!部会.Column(2) sqlは作ったようですが、レコードセットは更新していないようです。 レコード.Close SQLステートメント = "select 部会テーブル.支部コード, 部会テーブル.部会コード, * FROM 部会テーブル WHERE (((部会テーブル.支部コード)='" & Me!支部 & "') AND ((部会テーブル.部会コード)='" & Me!部会 & "'));" Me!隠し部会 = Me!部会.Column(2) Set レコード = データベース.OpenRecordset(SQLステートメント) のようにすればよいのでは、 今後のためアドバイスを、 ・パフォーマンスなどの理由でわざと2回にしているのでなければ、JOINを使って一度のSQLにて抽出することをお勧めします。 ・フィールド名、テーブル名、変数名などはできる限りアルファベットに統一しておいたほうがよいと思われます。

chau
質問者

補足

回答ありがとうございます。 早速、16Augustさんのコマンドを付加して実行しましたが ダメでした(T_T) 素人の考えで申しわけございませんが、どの部分に追加すれば良いのでしょうか? 実際に追加した部分は、End With の前です。

関連するQ&A

  • Access での抽出条件方法

    助けてください。 Accessを使用して、会員管理の印刷を行っています。 会員情報テーブルに支部と部会の項目がありますが、支部にはデータ(2桁)が入ってますが、部会にはデータが無い(NULL)状態のとき、下記のSQLでは、NULLデータも抽出してこない状態です。どうしても、NULLデータまでヒットさせたい場合は、どうすれば良いでしょうか? INSERT INTO 印刷用作業テーブル SELECT * FROM 会員情報テーブル WHERE リスト表示=FALSE AND (IIF(支部=NULL,' ',支部)+IIF(部会=NULL,' ',部会) ORDER BY 会員番号

  • クエリでの入力が表示されません

    アクセスを使って会員情報の整理をしたいのですが、上手くいきません。 テーブル1 ・ID ・会員名 ・住所 テーブル2 ・ID ・所属委員会 ・所属部会 上記2つのテーブルにリレーションを組んで、クエリを作成しました。 クエリ ・ID ・会員名 ・会員住所 ・所属委員会 ・所属部会 クエリの画面で入力をし画面をいったん閉じてしまうと、 今まで入力しているものは表示されずに新しいレコードのみが表示されています。 でも、画面を閉じる前のレコードはきちんとデーターに反映されているのですが・・・ どうしたらクエリに今までの入力が表示されるのでしょうか? 宜しくお願いします。

  • オラクルのデータをAccessに追加 無限ループ

    前回、オラクルからデータを取り出し、Accessのテーブルに書き込みを教えて頂き、データ追加は出来たのですが、データ追加時に無限ループが発生しました。 【環境】 Oracle:10g Access:2010 Dim CON As New ADODB.Connection 'Oracle側コネクション Dim RS As ADODB.Recordset 'Oracle側レコードセット Dim SQL As String 'Oracle側SQL文 Dim i As Integer '処理用インクリメント Dim DT As Date '抽出日付変数(日付型) Dim sDT As String '抽出日付変数(テキスト型) Dim RS2 As ADODB.Recordset 'Access側レコードセット ◎現在の状況 Dim CON As New ADODB.Connection Dim RS As ADODB.Recordset Dim SQL As String Dim i As Integer 'DB接続定義 CON.Open "DSN=DNS名;UID=ユーザー名;PWD=パスワード;" 'SQL文 SQL = "SELECT " SQL = SQL & "カラム1," SQL = SQL & "カラム2," SQL = SQL & "カラム3" SQL = SQL & "FROM オラクルテーブル名 " SQL = SQL & "WHERE 抽出条件 " SQL = SQL & "AND 抽出条件" SQL = SQL & "GROUP BY カラム" SET RS = CON.EXCUTE(SQL) ’取得したレコード数表示 MsgBox "オラクル側のレコード数は: " & RS.RecordCount (1)↑↑↑オラクルから、抽出したレコード数表示 rs2.Open "新しいテーブル名", CurrentProject.Connection, adOpenKeyset, adLockOptimistic rs.MoveFirst Do Until rs.EOF rs2.AddNew rs2!カラム1 = rs!カラム1 rs2!カラム2 = rs!カラム2 rs2!カラム3 = rs!カラム3 rs2.Update rs2.Close: Set rs2 = Nothing rs.close: SET RS = Nothing con.close:SET CON=Nothing end sub 上記を実行したところ、いくら待っても処理がおわらず、強制終了をかけた所、新テーブルには、約150万件追加されてました。 (1)でオラクルから抽出した、レコード数を表示させてみた所、-1でした。 ◎疑問点、 -1ってありえない数値だと思うのですが。 ちなみに、オラクル側で同様のSQLを実行させた所、取得件数は48件でした。 上記について、ご存じの方がいらっしゃいましたら、アドバイスお願いいたします。

  • オラクルからAccessにデータ追加

    オラクルから、必要なデータを抜出し加工の為のDBをAccessで作成していますが、オラクルから抜き出したデータ(レコードセット)を、どうやってAccessのテーブルに書き込めばよいかがわかりません。 ◎環境 Oracle:10g Access:2010 ◎現在の状況 Dim CON As New ADODB.Connection Dim RS As ADODB.Recordset Dim SQL As String Dim i As Integer 'DB接続定義 CON.Open "DSN=DNS名;UID=ユーザー名;PWD=パスワード;" 'SQL文 SQL = "SELECT " SQL = SQL & "カラム1," SQL = SQL & "カラム2," SQL = SQL & "カラム3" SQL = SQL & "FROM オラクルテーブル名 " SQL = SQL & "WHERE 抽出条件 " SQL = SQL & "AND 抽出条件" SQL = SQL & "GROUP BY カラム" SET RS = CON.EXCUTE(SQL) For i = 1 To 10 Debug.Print rs(カラム1) & rs(カラム2) next i ここまでは、オラクルのテーブルから、レコードセットにデータが取り込まれてます。 rs.close: SET RS = Nothing con.close:SET CON=Nothing end sub 案1 レコードセットのデータを、Access側のテーブルにループで回して、1行ずつデータ追加 案2 INTO句で直接、テーブル作成 調べていて、2通りのやり方があると思うのですが、どちらにしても、テーブルへの書き込み方がわかりません。 案1の場合、Access側のテーブルを開いてデータ追加する方法 ※同時に2つのテーブルを開くことになるのでは? 案2の場合、SQL文はオラクルで処理する為の物なので、AccessテーブルのINTO句が使えるのか? オラクルのテーブルをリンクする事も考えたのですが、実際動かすPCにはAccessRuntimeしかインストールしてませんので、オラクルのテーブルをリンクしてくれませんでした。 よい方法があれば、アドバイスを頂けたら幸いです。

  • ACCSESSのSQLで教えてください。

    すみません! SQL初心者なのですが教えてください。 下記のようなtableというテーブルなのですが こちらのテーブルをデータが増加しても(1)から(2)のように select表示させるにはどうすればよいか教えて頂けないでしょうか・・・。 何卒よろしくお願い致します。 テーブル名:table カラム名:NO,kigou (1) table |NO|kigou| |1 |a | |2 |b | |3 |c | |4 |d | |5 |e | ↓ (2) |NO1|kigou1|NO2|kigou2|NO3|kigou3| |1 |a |2 |b |3 |c | |4 |d |5 |e | ・・・

  • 複数のレコードの値を取り出すには

    初心者です。あるカラムから複数のレコードの値を取り出すにはどのように書けばよいかどなたか教えていただけますでしょうか。 下記のコードではcalendartblというテーブルから1レコードのみ取り出せます。 テーブル:calendartbl holiday(カラム名) 2016/9/12(レコード1行目) 2016/9/14(レコード2行目) 2016/9/20(レコード3行目) 2016/9/26(レコード4行目) 2016/9/28(レコード5行目) コード: $sql = "SELECT calendartbl.holiday FROM calendartbl"; $ret = f_db_select($sql); foreach ($ret as $h){ $holiday = $h['holiday']; } 結果=2016/9/12 では複数のレコード、つまり「2016/9/12、2016/9/14、2016/9/20、2016/9/26、2016/9/28」を取り出して、上記の$holidayに代入させるにはどのように書けばよいでしょうか。 どなたか教えて頂けたら幸いです。 よろしくお願い致します。

    • 締切済み
    • PHP
  • Access95→Access2003にしたら不具合が・・・

    Access95→Access2003にバージョンアップしました。 所々修正はしましたが、わからない点があります。 約5000件のデータがあります。検索条件に一致するデータだけを印刷しますが、例えば「五十音順」にすると 途中までが五十音順で その後はランダム(あ・い・う・え・お・か・き・お・く等)になります。 3回位繰り返しますと、正確に「五十音順」になりました。 1回で、ソートしたいのですが どうしたら良いかアドバイスをお願いします。 WkSql=INSERT INTO 印刷作業用テーブル SELECT * FROM 会員情報テーブル WHERE リスト表示=FASE AND (IIF(会員種別=NULL,'',会員種別) BETWEEN '01' AND '01')AND (退会フラグ=false) ORDER BY フリガナ '作業用テーブル作成 =============================================>> Set データベース = CurrentDb Set SQLステートメント = データベース.CreateQueryDef("") 'まず、作業テーブルをDELETEする。 SQLステートメント.SQL = "DELETE FROM 印刷作業用テーブル;" SQLステートメント.Execute dbFailOnError 'ERROR時、Rollbackする指定。 '続けて、データ抽出&作業テーブル作成。 SQLステートメント.SQL = WkSql & ";" '末尾にセミコロンを付ける。 SQLステートメント.Execute dbFailOnError 'ERROR時、Rollbackする指定。 Set データベース = Nothing 作業用テーブル作成 = 0

  • VB2008・DataGridの表示について

    フォーム上にDataGridを設置してsqlcompactで作られたテーブルのデータを表示しようとして 以下のソースを実行すると、エラーになり表示できませんでした。 もし、原因がわかるかたがいらっしゃいましたら教えてくださると助かります。 表示するにあたり、テーブルの特定のカラムだけ表示して、ヘッダーを編集したい。 テーブルの全レコードではなくて対象レコードのみを表示 Dim cn As New System.Data.SqlServerCe.SqlCeConnection Dim SQL As System.Data.SqlServerCe.SqlCeCommand Dim db_sql As String ' テーブルスタイルを生成する Dim dgStyle As DataGridTableStyle = New DataGridTableStyle() dgStyle.MappingName = "表示用テーブル" ' 列スタイルを生成し、プロパティを設定する Dim col(4) As DataGridTextBoxColumn col(0) = New DataGridTextBoxColumn() col(0).HeaderText = "商品コード" col(0).MappingName = "商品コード" col(0).Width = 50 col(1) = New DataGridTextBoxColumn() col(1).HeaderText = "商品名" col(1).MappingName = "商品名" col(1).Width = 100 ' 列スタイルをテーブルスタイルに追加する dgStyle.GridColumnStyles.Add(col(0)) dgStyle.GridColumnStyles.Add(col(1)) ' テーブルスタイルをグリッドに追加する Me.DataGrid_Display.TableStyles.Clear() Me.DataGrid_Display.TableStyles.Add(dgStyle) 'DBのパスをセットしてオブジェクト化 cn.ConnectionString = "Data Source=" & DB_PATH & ";Password=" & DB_PASSWORD & ";Persist Security Info=True;" SQL = cn.CreateCommand 'データグリッドを表示する Dim dbadp As System.Data.SqlServerCe.SqlCeDataAdapter Dim dbtabl As DataTable Dim aa As DataSet db_sql = "SELECT syohinno, syohinryaku, suryo1, suryo2, suryo3 FROM porsj05_tempo ORDER BY date DESC" dbadp = New SqlCeDataAdapter(db_sql, cn) dbtabl = New DataTable dbtabl.Locale = System.Globalization.CultureInfo.InvariantCulture dbadp.Fill(dbtabl) Me.DataGrid_Display.DataSource = dbadp Me.DataGrid_Display.Refresh() エラー箇所 Me.DataGrid_Display.DataSource = dbadp エラー内容 Complex DataBinding は IList または IListSource のどちらかをデータソースとして受け入れます。 'System.ArgumentException' の初回例外が System.Windows.Forms.dll で発生しました。

  • Accessのデータベースのコンボボックスの記載

    AccessのVBAのコンボボックスのデータベースのレコードの非表示の仕方と表示する値と取得する値を変える方法が知りたいです。 例えばSQL分でテーブルの中の商品コードカラムと商品名カラムを抽出し、値をコンボボックスに入れるとします。この時商品コードの方は値だけ持たせて非表示にし、商品名だけが表示されるようにしたいです。 そして表面上で商品名が選ばれた時、非表示の商品コードの値の方が選択されるようにしたいのですがどうコーディングしたらいいのかわからないです。 ネットでも調べてみましたがフォームで設定する方法しか見つけられませんでした。VBAで記載するようにとの指定があるのでVBAで記載するようにしたいです。 VBAではどのように書いたらいいのでしょうか

  • フォームのレコードソース(Access2000)

    質問させていただきます。 フォームの「レコードソース」でテーブルとクエリーのほかに、「SELECT テーブル名、フィールド名・・・」というのがあります。これもクエリーなのでしょうか? ちなみに、レコードソースの右にある「---」をクリックすると「SQLステートメント:クエリビルダ」というものが開きます(クエリー画面と同じ?)。 また、フォームのレコードソースはテーブル、クエリー、SOLステートメントのどれにすれば良いのでしょうか?

専門家に質問してみよう