ようやくアクセスにデータを落とし込めるようになり、プログラム起動時に表示されるようになったのですが、日付とオプションボタンの表示だけ保存されたデータとは違う表示の仕方になります。
日付:入力時=20020320 → 表示時=2002/03/20 →保存後の表示時=37334
オプション:赤・青・黄・白・黒・緑の中から1つを選択→入力時=赤を選択→保存後の表示時=白
でも、アクセスを見てみると入力したとおり保存されてます。
どうしてこのような現象が起こるのですか?
また、顧客ID(5桁)を入力するとデータベースから該当する情報をリンクして表示させるにはどのようにしたらよいでしょうか?
日付についてですが。
カラム(日付型)からデータを取得する際に
文字列型変換、フォーマットの変換可能だと思います
public Const psCntFmtDate as string = "YYYY/MM/DD"
Text1.Text = Format(oRs![DATE],psCntFmtDate)
オプションボタンですがどの用に色を管理しているか
解らない為、推測できません。
[リンクして]と言うのは
一覧表示するオブジェクトへリンク?
IDに該当するレコードを取得?
と言う事ですか?
レコードセット(Rdo,ADO,DAO)等を使用しレコードを抽出
するならSQL文でIDの特定
リンク表示するなら
DataGrid・DBGrid等を使用し
レコードセットを関連付けすれば表示できます。
日付については表示されるようになりました。ありがとうございます。
オプションボタンは赤・青・黄・白・黒・緑の中から1つをクリックし、
表示時に前回選択した色に「・」が付いてるはずなんですが、付いてないです。
保存時は”赤”となるんですが、表示時はどのようにオプションボタンに
「・」を付けるのでしょうか?
[リンクして]と言うのは、顧客IDに該当するレコードを取得するということです。
顧客ID”11111”と入力すると該当する顧客IDの各情報が表示されるという意味です。(分かりづらくてすみません)
”DataGrid・DBGrid”ですが、ヘルプで表示されません。
毎度毎度で申し訳ないのですが、サンプルを書いていただけないでしょうか?
付け足しなんですが、”保存ボタン(update)”で保存できるのは当たり前なんですが、
”終了ボタン(end)”でも書き込んでしまうのは、なぜでしょうか?
↑の質問を見て一つ思ったのですが
もしかしてアクセス内のフォームデザイナーですか?
自動的にデータを表示してもらえるみたいに見受けられます
オプションボタンには
optRed.Value = True '選択状態
optRed.Value = False '見選択状態
の様にソースを組むはずです
アクセス使用であるならば
カラーのカラムの型をTrue/False型
にすれば表示されるかもしれません
アクセスのフォームデザイナー等で
カラムとのリンクをした場合(即時コミット)
の為更新とか終了といった概念に関係無く
直接テーブルのカラムに値を入れていると扱えるからです。
まずこの質問に答えてもらえますか?
オプションボタンの件でアクセスのレイアウトを”Boolean”に型を変えたのですが、
画面表示上は「・」が表示されてませんでした。
オプションボタンに値を返せるのでしょうか?
アクセス上は、True が-1,Falseが0になってます。
データベースの概念が分かってないのでご迷惑をおかけしますが、
たぶん、直接テーブルのカラムに値を入れているかと思います。
ですので、Deleteで削除しても1番上のレコードが削除されます。
オプションボタンへの選択表示は
Value メソッドを使用してください。
例えば
if 赤 = True Then
オプションボタン赤.Value = True
Else
オプションボタン赤.Value = False
End if
質問が悪かったのかも知れませんが。
データベースへのアクセス(接続)には
何のオブジェクトを使用しているのですか?
(DAO、RDO、ADO)等の事です
① VisualBasicからMDBファイルにアクセス
DataBaseのオブジェクト = MDBファイル
② ACCESS内で自分のテーブルへ
Database = CurrentDB
上の意味が解りますか?
これが解らないとかなり困ってしまいます。
現在行っているDelete処理のソースを
書き込んでもらえればありがたいです。
オプションボタンの件は上記のようなプログラムになっていて、
ブレークポイントで確認を取っているのですが、画面上に表示されないです。
データベースへのアクセス(接続)には”DAO”です。
①については分かりますが②については分からないです。
Delete処理
Private Sub cmdDel_Click()
Dim db As Database, ws As Workspace, td As TableDef
Dim fd As Field, rs As Recordset
Set ws = DBEngine.Workspaces(0)
Set db = ws.OpenDatabase("C:\work\kokyaku.mdb")
Set rs = db.OpenRecordset("Kokyaku")
rs.AddNew
rs!顧客ID = txtID.Text
rs!顧客名称 = txtKokyakuName.Text
rs!カナ = txtKana.Text
rs!〒1 = txtAdNo1.Text '3桁分
rs!〒2 = txtAdNo2.Text '4桁分
rs!住所1 = txtAd1.Text
rs!住所2 = txtAd2.Text
rs!TEL1 = txtTel1.Text '5桁分 [ ]-
rs!TEL2 = txtTel2.Text '5桁分 [ ]-
rs!TEL3 = txtTel3.Text '5桁分 [ ]という意味です。
rs!FAX1 = txtFax1.Text '5桁分 ↓ 以下同じです
rs!FAX2 = txtFax2.Text '5桁分
rs!FAX3 = txtFax3.Text '5桁分
rs!携帯1 = txtHp1.Text '3桁分
rs!携帯2 = txtHp2.Text '4桁分
rs!携帯3 = txtHp3.Text '4桁分
rs!取引開始日 = CDate(txtStart.Text)
rs!取引終了日 = CDate(txtEnd.Text)
rs!赤 = Option1.Value
rs!青 = Option2.Value
rs!黄 = Option3.Value
rs!白 = Option4.Value
rs!黒 = Option5.Value
rs!緑 = Option6.Value
rs.Delete
end sub
ちなみに”Update”は”rs.Delete”の部分が”rs.Update”に変わっただけです。
全ての謎が解けました。
まず順をおって
レコードセットの扱いですが
Set rs = db.OpenRecordset("Kokyaku") ’顧客テーブルのレコード全部
↑の様な使い方はMDBの場合ほぼ使いません
上記の様な使い方はExcelシート等の場合がほとんどです
レコードセットとはテーブル内の全レコードより
特定のレコード(SQL/条件)のみを抽出すると言うのが一般です
※10件中 1件,2件等 、この場合MoveNext等でレコードを移動させる必要がある
以下の様にすると良いかと思います。
dim oRs as Recordset 'レコードセット
dim sSQL as String 'SQL編集文字列
【データの取得/ID指定時】
sSQL = "SELECT * FROM Kokyaku WHERE 顧客ID = '" & _
txtID.text & "'"
Set oRs = db.OpenRecordset(sSQL)
※txtIDには検索対象IDとする
↑*は顧客テーブルの項目全ての取得です。条件にIDを指定しているので
この場合rsのレコードセットオブジェクトには指定した顧客の
レコードのみが握られています
【削除/更新】
削除/単一レコードの更新処理も上記の様にどのIDのレコードを消すのか?
と言う事を指定してあげなければいけません。
ちなみに削除する場合はカラムに値を入れる必要はないですし
レコードセットを使用しないでも直接
db.Excute ("DELETE Kokyaku WHERE 顧客ID = 00001")
↑の様に発行できます。
※SQLの知識をつければ簡単に理解できるようになるはずです。
解りずらいとは思いますが
Private Sub txtID_LostFocus() '← 顧客IDを入力するところ
Dim db As Database, ws As Workspace, td As TableDef
Dim fd As Field, rs As Recordset
dim oRs as Recordset 'レコードセット
dim sSQL as String 'SQL編集文字列
Set ws = DBEngine.Workspaces(0)
Set db = ws.OpenDatabase("C:\work\kokyaku.mdb")
'【データの取得/ID指定時】
sSQL = "SELECT * FROM Kokyaku WHERE 顧客ID = '" & txtID.text & "'"
Set oRs = db.OpenRecordset(sSQL)
End Sub
としたのですが、下記のようなエラーが出ます。
”抽出条件でデータ型が一致しません。(Error 3464)”
IDはInteger型ですけど、どこかおかしいと個ありますか?
更新/削除も上記のようなプログラムでOKということですか?
数値型でしたか。
' ←シングルコーテーション二つを外してください
更新時は
①レコードを握る(上記同様の単一)
② Edit(編集モード開始)
③ カラムに値を設定
④ Update(カラムに設定した値をレコードに反映)
⑤ レコードのクローズ↓(Help参照)
If Not oRs Is Nothing Then
oRs.Close
Set Ors = Nothing
End if
削除
①レコード握る
②Delete発行
③レコードクローズ
※ちなみにデータベースへの接続は
追加/訂正/削除等で毎回接続するのではなく
FormLoadで接続し終了ボタン等のプログラム
終了時に切断して方がパフォーマンスがいいです。
今気付いたのですが
txtID_LostFocusイベントで上記処理をしてはいけません!
削除ボタン等を用意しましょう。
簡単なオペレーションを以下に記述します
① TxtIDに削除対象のID入力
・TxtIDでイベントを拾う必要無し
② 削除コマンドボタンClick
2.1 TxtIDに削除対象のコードが入力されているかチェック
2.1.1 未入力時は後処理破棄しエラー通知
2.2 上記の削除処理を実行する
簡単ではありますが・
ありがとうございます。
頑張ってみます!
ツイート | ![]() |