データグリッドでDeleteキーを使ってデータを削除するには?

解決


土偶  2003-08-27 17:28:57  No: 108294  IP: [192.*.*.*]

こんにちは。私はVB6、WIN2000を使っています。
データグリッドの中にあるデータをDeleteキーを使って削除したいのですが。
Allow DeleteプロパティをTRUEにしても、Deleteキーを押すと
「更新に必要なキー列の情報がありません。」というエラーが出てしまいます。
どのように対処したらいいでしょうか?よろしくお願いします。

編集 削除
魔界の仮面弁士  2003-08-28 00:46:44  No: 108295  IP: [192.*.*.*]

抽出されたデータに、主キー列は含まれていますか?

編集 削除
土偶  2003-08-28 10:29:03  No: 108296  IP: [192.*.*.*]

魔界の仮面弁士様、返信ありがとうございます。

>抽出されたデータに、主キー列は含まれていますか?
はい、一応テーブルの主キーは含まれています。Visibleプロパティで隠してはいるのですが。。データグリッドのプロパティに主キーを指定するような項目でもあるのでしょうか?

編集 削除
土偶  2003-08-28 10:47:07  No: 108297  IP: [192.*.*.*]

それと、データグリッドの商品番号という列に商品コードを入力するとデータグリッドの商品名列と商品単価列を表示するようにしてあげたく、参考書を見て、自分なりに作ってみたのですが。入力しても表示されません。一度閉じてもう一度開くと表示されているのですが・・・。(これと削除されないのも関係するのでしょうか?)下記がそのコードです。  
    Dim RS As New ADODB.Recordset
    Dim strSQL As String

    strSQL = "SELECT M2_ID, M2_DENPYO_NO AS 伝票番号, " _
            & "M2_SYOHIN_CD AS 商品番号 , " _
            & "M1_SYOHIN_NM AS 商品名 , " _
            & "M1_TAN AS 商品単位 ,M2_SU AS 数量 " _
            & "FROM M2_SUB_TBL INNER JOIN M1_SYOHIN_TBL " _
            & "ON M2_SYOHIN_CD = M1_SYOHIN_CD " _
            & "WHERE M2_SYOHIN_CD = '" & Me.Syohin_No.Text & "'"
            
    RS.CursorLocation = adUseClient
    RS.Open strSQL, CN, adOpenStatic, adLockOptimistic
    
    Set Me.DataGrid.DataSource = RS

編集 削除
土偶  2003-09-02 09:53:52  No: 108298  IP: [192.*.*.*]

おはようございます。
一つお聞きしたいことがあるのですが。
返事をもらえないと言うのは質問の仕方が悪いのでしょうか?
それとも説明が足りないのでしょうか?
よろしくお願いします。

編集 削除
日野  2006-02-03 12:06:09  No: 108299  IP: [192.*.*.*]

環境は  WINXP    ACCESS 2003SP2  VB6.0

こんにちは、随分前の質問ですが自分もこの質問と同じ状態です。
主キーも設定してありますしプロパティもAllowAddNew=False
AllowDelete=True,AllowUpdate=Trueです。

ちなみに自分はadodcでもやってみましたし、ADODBでもやってみました
どちらも同じエラー(更新に必要なキー列の情報がありません)と
出てしまい削除できません。

直接ACCESSからテーブルを開いて削除することは出来ます。

説明不足もあるかもしれませんが、その時はご指摘下さい。

なんとかご教授いただけないでしょうか?
よろしくお願いします。

編集 削除
もげ  2006-02-03 12:50:01  No: 108300  IP: [192.*.*.*]

協力するのは吝かでないので、
読み手側で、現象を再現できるような情報があれば、解決できるかもしれません。
とりあえず、
どんな環境(開発環境のOS、VB6のサービスパックの適用状況)で、
どんなテーブルで
どんなSQLで
どんなコードを書いてて(特にCursorLocation、CursorType、LockTypeなど)、
等がわからないと
「うちじゃぁ問題なく消せるよ」としかいえないですけど。

主キー項目は表示しているのですよね?

編集 削除
日野  2006-02-03 13:15:07  No: 108301  IP: [192.*.*.*]

もげ様、早速のレスありがとうございます。  

>読み手側で、現象を再現できるような情報があれば、解決できるかもしれません。
はい、確かにそうですよね。再現できないとどうしようもないですね。

>どんな環境(開発環境のOS、VB6のサービスパックの適用状況)で、
OSはWINXP SP2 VB6.0SP2 です。

>どんなテーブルで
テーブル名はTBL配信予約リスト
テーブルは主キーに設定してあるのが配信日時で
件名、本文、添付ファイル、配信先  
この5つで構成されています。
全てメモ型です。

>どんなSQLで
SQL = "SELECT * FROM TBL配信予約リスト"

>どんなコードを書いてて(特にCursorLocation、CursorType、LockTypeなど)、
こういったコードを書いています。
Private Sub Form_Load()
frm配信予約リスト.Refresh

    Dim Con As ADODB.Connection
    Dim path As String

    path = App.path
        If Right(path, 1) <> "\" Then path = path & "\"
            path = path & "db1.mdb"

    Set Con = New ADODB.Connection
            Con.Provider = "MSDataShape"
            Con.Properties("Data Provider").Value = "Microsoft.Jet.OLEDB.4.0"
            Con.Open path

    Dim SQL As String

            SQL = "SELECT * FROM TBL配信予約リスト"



    Set rs = New ADODB.Recordset

            rs.Open SQL, Con, adOpenDynamic, adLockPessimistic
            rs.StayInSync = True



    Set DataGrid1.DataSource = rs

        Set rs = Nothing

        Set Con = Nothing



End Sub

フォームのDataGrid1にはちゃんと5つの項目が表示されるのですが、
Deleteを押して一旦は消えるのですが、ACCESSのDB自体も更新されていません。
またフォームをloadしても削除したはずのデータが表示されている状況です。

メインのフォームの方でもdatagridを使っているのですが、そちらは
普通にDeleteを押すと削除されています・・・
プロパティは同じにしてあるのですがサブフォームのDataGrid1だけ
DBに反映されないといった次第です。

なんとかよろしくお願いします。

編集 削除
もげ  2006-02-03 16:42:56  No: 108302  IP: [192.*.*.*]

とりあえず試してみた結果、

    Set rs = New ADODB.Recordset
    rs.CursorLocation = adUseClient

のようにクライアントカーソルを使用すると削除できます。


>Con.Provider = "MSDataShape"
なぜ、ここでMSDataShapeプロバイダが要るのかよくわかりません。
ネイティブなMicrosoft.Jet.OLEDB.4.0プロバイダで
    cn.Provider = "Microsoft.Jet.OLEDB.4.0"
    cn.Open Path
でもいいかも。

あと、
CursorLocation
CursorType
LockType
の組み合わせに関して調べて試してみてください。

編集 削除
日野  2006-02-03 18:00:02  No: 108303  IP: [192.*.*.*]

もげ様ご指導ありがとうございます。
CursorLocation
CursorType
LockType
調べて、色々勉強になりました。

しかし、その組み合わせを色々やってみましたが、同じ結果で
Deleteボタンで削除する事が出来ませんでした。
もう打つ手が無いと諦めかけて、ACCESSの方に原因があるのでは?
と同僚に指摘され
ACCESSのテーブルのデザインを見直してみました。

原因はなんと、ACCESSのテーブルのデザインにあったのです・・・

全てメモ型のままではダメで一つだけテキスト型にしたら
あっさりと削除できました。

しかし今回の事で色々と勉強できました。
もげ様、他の読んでくださったみなさまありがとうございました。

編集 削除
日野  2006-02-03 18:06:09  No: 108304  IP: [192.*.*.*]

もう一つ言わせていただくと。
送信日時を主キーにしてしてしまうと、同じ日時の値が入れられない
ので、全てメモ型にしてオートナンバー型のデータを追加しただけでも
うまくいきました。

他の同じ経験をなさった方にちょっとでも参考になれば幸いです。

編集 削除
林孝幸  2006-05-10 15:24:25  No: 108305  IP: [192.*.*.*]

萌え

編集 削除