• 締切済み

ODBC--リンクテーブル'XXXX'での更新に失敗しました

同じ現象がなさそうでしたので質問させていただきます。 インポートしたテーブルであれば問題なくレコードの更新が出来るのですが 実際のODBCで繋いだDBでは「ODBC--リンクテーブル'XXXX'での更新に失敗しました」となってしまいます。 DAOとADO両方試してみました。以下のものになります こちらは教えていただいたものです。 Private Sub Sample3() Dim rs As New ADODB.Recordset Dim i As Integer Const フィールド名 As String = "連番" ' ☆1 Const テーブル名 As String = "元テーブル" ' ☆1 Const 抽出 As String = "登録番号" ' ☆1 Const 並び替え As String = "登録番号" ' ☆1 i = 1 rs.Source = "SELECT " & フィールド名 & " FROM " & テーブル名 & _ " WHERE " & 抽出 & " LIKE 'ZZZZ%' ORDER BY " & 並び替え & ";" rs.Open , CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic While (Not rs.EOF) rs(フィールド名) = "ZZZZ" & Format(i, "0000") rs.Update rs.MoveNext i = i + 1 Wend rs.Close End Sub ADOだからダメなのかと思い こちらは教えて頂いたものをDAOにしてみました。 Private Sub Sample3() Dim Db As DAO.Database Dim rs As DAO.Recordset Dim i As Integer Const フィールド名 As String = "連番" ' ☆1 Const テーブル名 As String = "元テーブル" ' ☆1 Const 抽出 As String = "登録番号" ' ☆1 Const 並び替え As String = "登録番号" ' ☆1 i = 1 Set Db = CurrentDb() Set rs = Db.OpenRecordset("SELECT " & フィールド名 & " FROM " & テーブル名 & " WHERE " & 抽出 & " LIKE 'ZZZZ*' ORDER BY " & 並び替え & ";") While (Not rs.EOF) rs.Edit rs(フィールド名) = "ZZZZ" & Format(i, "0000") rs.Update rs.MoveNext i = i + 1 Wend rs.Close End Sub 両方とも「ODBC--リンクテーブル'XXXX'での更新に失敗しました」 となってしまいます。 どうすれば更新に失敗せずにできるのでしょうか?

noname#135452
noname#135452

みんなの回答

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.3

#1です > やはりアクセス権限が怪しいですが、そのフィールドのみ書き込みで > きなくするとか出来るのでしょうか? > あるPCからなら書き込みできるとか・・・ PostgreSQL自体、1度触ったくらいなので、なんとも・・・ 1つのフィールドだけと言うのも、変ですね 例えば、プライマリキーに設定されていて、他のテーブルとの関係で、操作出来なくなっているとか?考えられませんか? 「PostgreSQL」側で、操作可能な方法が、あるか?どうか? そっちで、聞いてみるのも手かもしれませんね^^;

noname#135452
質問者

お礼

フィールドに書き込み条件がありました。 それをみたしてやることで書き込み可能になりました! 回答ありがとうございました!

noname#135452
質問者

補足

ご回答ありがとうございます。 他のテーブルと関連付けされているのは「登録番号」のみになります。 で他のテーブルデータ(フィールド)を呼び出しています。 連番のフィールドは空欄の状態なのでそこに入れたかったのですが・・・ SQL側からやるしかないかもしれないですね・・・

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.2

う~ん、テーブルビューで、だめなら、ADO、DAOで、悩んでもだめでしょうね PostgreSQLのODBCドライバは、何種類もあって、物によっては、更新処理が出来ないドライバ、更新処理が、可能なドライバが、あったと、思いましたが・・・ODBCドライバを確認するのと、後は、テーブルのアクセス権限の確認をするのが、必要になってきますね^^; アカウントを作って、Access用に、ユーザ追加するか、かな?・・・

noname#135452
質問者

補足

ご回答ありがとうございます。 同テーブルの他のフィールドには問題なく書き込むことが出来るので この連番フィールドだけが書き込みできないようになっているようです。 ドライバ自体にも問題はないと思います・・・ やはりアクセス権限が怪しいですが、そのフィールドのみ書き込みできなくするとか出来るのでしょうか? あるPCからなら書き込みできるとか・・・

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.1

ODBCで、接続したリンクテーブルは、Accessからのテーブルビューで更新可能なのでしょうか? 後、ODBCで、接続したDBは、何なのでしょうか?(Access?Excel?他?) そのあたりの補足お願いしますね

noname#135452
質問者

補足

ご回答ありがとうございます。 連番のフィールドだけがテーブルビューから更新もダメな状態でした。 これは完全にこちらの環境の問題ですよね・・・ 接続したDBはpostgreSQLです。 サーバ側でテーブル設定かえるかテーブルを作成するしかないのでしょうか。

関連するQ&A

  • 登録番号を詰めたい

    いつもお世話になっています。また詰まってしまったので質問させていただきます。 以前、こちらの質問でお世話になりました。 http://okwave.jp/qa4848965.html そしてそのとき教えていただいたのが Private Sub Sample3()   Dim rs As New ADODB.Recordset   Dim i As Integer   Const フィールド名 As String = "☆連番☆"    ' ☆1   Const テーブル名 As String = "☆元テーブル☆"  ' ☆1   Const 抽出 As String = "☆登録番号☆"      ' ☆1   Const 並び替え As String = "☆登録番号☆"    ' ☆1   i = 1   rs.Source = "SELECT " & フィールド名 & " FROM " & テーブル名 & _         " WHERE " & 抽出 & " LIKE 'ZZZZ%' ORDER BY " & 並び替え & ";"   rs.Open , CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic   While (Not rs.EOF)     rs(フィールド名) = "ZZZZ" & Format(i, "0000")     rs.Update     rs.MoveNext     i = i + 1   Wend   rs.Close End Sub でした。こちらは登録番号を昇順に並べて別のフィールドに連番を振る といったものでした。 ですが今回は少し条件が加わりまして この登録番号は1種類の番号でも複数存在するのです これをつめたいのですが、現状ですと (現状)   ZZZZ0001    ZZZZ0001 ZZZZ0002    ZZZZ0002 ZZZZ0002    ZZZZ0003 ZZZZ0004    ZZZZ0004 となってしまいます。 これを (改良後)  ZZZZ0001    ZZZZ0001 ZZZZ0002    ZZZZ0002 ZZZZ0002    ZZZZ0002 ZZZZ0004    ZZZZ0003 とするにはどうしたらいいでしょうか 何かいい案はありますでしょうか?よろしくお願いします

  • 登録番号を詰めたい2

    重要な部分が欠けていたので質問させていただきます。またご教授おねがいします。 以前このような質問をしたものですが、 http://okwave.jp/qa4859369.html 連番がずれてしまっていたので、以前説明できてなかった部分を説明したいと思います。 電話番号や会社名などの個人情報が入っている個人情報テーブル(以下個人T)と 値段や出荷した荷物などの詳細が書かれている注文テーブル(以下注文T)があるとします。 2つのテーブルは"登録番号"とフィールドで関連付けをしてあります。 その登録番号を虫食い無しの綺麗な連番にしたいと思います 以下の様な状態です。 "連番"というのは後の作業で"登録番号"と入れ替えをするために作成されたものです。 注文T    注文T  |  個人T     個人T 登録番号   連番   | 登録番号     連番 ZZZZ0001   null   | ZZZZ0001    ZZZZ0001 ZZZZ0002   null   | ZZZZ0002    ZZZZ0002 ZZZZ0002   null   | ZZZZ0003    ZZZZ0003 ZZZZ0004   null   | ZZZZ0004    ZZZZ0004 ZZZZ0006   null   | ZZZZ0006    ZZZZ0005 (テーブル2には同じ会社から何度も注文がある場合"登録番号"フィールドには同じ"登録番号"が存在する場合がある) ところが、個人Tには個人情報があるにもかかわらず注文Tには注文された内容が無い場合があります。 以前質問した時に教えていただいたものですと Private Sub Sample4()   Dim rs As New ADODB.Recordset   Dim i As Integer   Const フィールド名 As String = "☆連番☆"    ' ☆1   Const テーブル名 As String = "☆元テーブル☆"  ' ☆1   Const 抽出 As String = "☆登録番号☆"      ' ☆1   Const 並び替え As String = "☆登録番号☆"    ' ☆1   Dim sTmp As String   i = 0   sTmp = ""   rs.Source = "SELECT * FROM " & テーブル名 & _         " WHERE " & 抽出 & " LIKE 'ZZZZ%' ORDER BY " & 並び替え & ";"   rs.Open , CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic   While (Not rs.EOF)     If (rs(並び替え) <> sTmp) Then       i = i + 1       sTmp = rs(並び替え)     End If     rs(フィールド名) = "ZZZZ" & Format(i, "0000")     rs.Update     rs.MoveNext   Wend   rs.Close End Sub になりますが、反映させた結果は、 注文T    注文T    | 個人T     個人T 登録番号   連番     | 登録番号    連番 ZZZZ0001   ZZZZ0001   | ZZZZ0001    ZZZZ0001 ZZZZ0002   ZZZZ0002   | ZZZZ0002    ZZZZ0002 ZZZZ0002   ZZZZ0002   | ZZZZ0003☆   ZZZZ0003 ZZZZ0004   ZZZZ0003☆  | ZZZZ0004    ZZZZ0004 ZZZZ0006   ZZZZ0004   | ZZZZ0006    ZZZZ0005 と、いうものになります。 本来個人情報だけがある登録番号(ZZZZ0003)に、登録番号(ZZZZ0004)の情報が加わってしまうのです。 したがってまったく関連がない会社同士の情報が混ざってしまうのです (個人情報しかない"登録番号"でずれてしまう) 教えていただいたものは完璧だったのですが、私が情報の足りない質問をしてしまったのが失敗でした・・・申し訳ありません。 注文T    注文T    | 個人T     個人T 登録番号   連番     | 登録番号    連番 ZZZZ0001   ZZZZ0001   | ZZZZ0001    ZZZZ0001 ZZZZ0002   ZZZZ0002   | ZZZZ0002    ZZZZ0002 ZZZZ0002   ZZZZ0002   | ZZZZ0003    ZZZZ0003 ZZZZ0004   ZZZZ0004   | ZZZZ0004    ZZZZ0004 ZZZZ0006   ZZZZ0005   | ZZZZ0006    ZZZZ0005 注文Tがこのような形になるのが理想なのですが、どのように連番を振る途中で飛ばすのか分かりません。 だいぶVBAが変わってしまいそうな気もしますが、どうかよろしくお願い致します。

  • クエリで求めた空き番を登録したい

    詰まってしまったので質問させていただきます。 登録番号の空き番号を求めることが出来るクエリを使い空いている番号を埋めたいと思います。 個人T…テーブル。空き番号をもつ"登録番号"フィールドと空き番号がない綺麗な"連番"フィールドを持つ ZZZZ空き番号抽出クエリ…"登録番号"の空き番号を昇順で並べた"仮想ID"がある Private Sub Sample6() Dim Db As DAO.Database Dim rs As DAO.Recordset Dim i As Variant Dim J As Variant Set Db = CurrentDb Set rs = Db.OpenRecordset("個人T") J = Right(DMax("連番", "個人T"), 4) i = 0 While i < J rs.AddNew i = DMin("仮想ID", "ZZZZ空き番号抽出クエリ") →→ rs(登録番号) = "ZZZZ" & i rs.Update rs.MoveNext Wend End Sub これで実行すると「このコレクションには項目がありません。」 と「rs(登録番号) = "ZZZZ" & i」がエラーになってしまいます。 書き方自体が悪いのはものすごく分かるのですが・・・ どこを直したら正常に空き番号を埋めることができるでしょうか?

  • 空き番検索でオーバーフロー

    同じような現象がなかったので、初心者ではありますが 質問させていただきます http://okwave.jp/qa447885.html こちらの質問にあった ryuu001さん回答の  ◎テーブル名 = テーブル1  ◎連番のフィールド名 = ID とし  ◎連番は後から入力した数値が   先に入力した数値より   小さくなることは無い。   (dmaxを使用しているので大丈夫かと思いますが) Sub test() Dim Db As Database Dim Rs As DAO.Recordset Dim Temp As String Dim I As Integer Set Db = CurrentDb() Set Rs = Db.OpenRecordset("テーブル1") Rs.MoveFirst I = 1 Temp = "" Do Until Rs.EOF = True Do While I < Rs!ID Temp = Temp & " " & I I = I + 1   *1 Loop Rs.MoveNext I = I + 1 Loop Rs.Close Set Rs = Nothing Db.Close Set Db = Nothing MsgBox "次の数字が抜けています。" & vblf & Temp End Sub VBAを利用させていただきました。 ですが「オーバーフローしました」とエラーが出てしまい デバッグすると*1の場所で止まっているようでした これはやはりLoopしているのが原因なんでしょうか ずっと+1を繰り返している・・・?

  • アクセスVBA 変数での抽出条件の書きかた

    顧客データテーブルからの抽出です。 変数を使った書き方がわかりません。 よろしくお願いします。 テーブルのレコードには [氏名]:鈴木 [telnum]:0123456789 が存在します。 Private Sub テキスト0_BeforeUpdate(Cancel As Integer) Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("顧客マスタ", dbOpenDynaset) Dim str As String str = "0123456789" rs.Filter = "[telnum] = ' " & str & " ' " Set rs = rs.OpenRecordset MsgBox (rs!氏名) ’←エラーメッセージ”カレントレコードがありません。”が出ます End Sub

  • Accessで、DAOでAddnew

    参照はDAOで、Addnewでデータの追加をしたいのですが、記述が悪いのか、上手くできません。 どなたか、教えて下さい! テーブル:スケジュールソース フィールド:日付 Private Cur_Db As DAO.Connection Private rs As DAO.Recordset Private sql As String Dim str_date As String str_date = Me!日付 Set Cur_Db = CurrentDb rs.Open "スケジュールソース", Cur_Db, dOpenKeyset, adLockOptimistic rs.AddNew rs("日付").Value = str_date rs.Update

  • ループで呼び出しながら、追加クエリでテーブルに追加

    IDをループで呼び出しながら、追加クエリでテーブルに追加したいのですが、 値が入りません。 エラーなく動くのですが、テーブルに値が入っていないのです。 何がたりないのでしょうか? ――――――――――――― Public Sub CYUSYUTU_SEIKYUID2() Dim CYUSYUTU_SEIKYUID As String Dim recCount As Long recCount = DCount("*", "作業用請求先ID") Dim ID As String Dim DB As DAO.Database Dim RS As DAO.Recordset Dim i As Integer Dim strSQL As String Set DB = CurrentDb Set RS = DB.OpenRecordset("作業用請求先ID") RS.MoveFirst Do Until RS.EOF RS.Edit For i = 1 To recCount CYUSYUTU_SEIKYUID = RS.Fields("請求先ID(13)").Value DoCmd.RunSQL _ "INSERT INTO [作業用_▲入金DB] SELECT * FROM ▲入金 WHERE ▲入金.請求先ID='& CYUSYUTU_SEIKYUID &';" Next i RS.Update RS.MoveNext Loop RS.Close: Set RS = Nothing DB.Close: Set DB = Nothing End Sub

  • 空欄を含む項目のレコードセット

    Access 2003 DAO.Recordsetにてデータを取得しようと思うのですが テーブル項目に空欄がある場合はどのように書けばよろしいのでしょうか? Dim DB As DAO.Database Dim RS As DAO.Recordset Set DB = CurrentDb Set RS = daoDB.OpenRecordset("Aテーブル", dbOpenDynaset) RS.AddNew daoRS!ああ ああ = xx RS!Update ・・・ とするとエラーになります。 項目名"ああ ああ"はどのように書けばいいのでしょうか? よろしくおねがいします。

  • 初歩的なSQLですが・・・

    私の環境はOS:Xp      ACCESS2000です。 宜しくお願いします 今AccessVBAで作業をしているのですが、 Dim ws As DAO.Workspace Dim DB As DAO.Database Dim rs As DAO.Recordset Dim sql As String Set ws = DBEngine.Workspaces(0) Set DB = ws.Databases(0) sql = "select MAX(銀行コード) from 銀行テーブル ;" Set rs = DB.OpenRecordset(sql) Me.合計 = rs このSQL文で銀行テーブルに入っている銀行コードの最大値を取得したいのですが、取得した後どのように記述したら「rs」から値を引っ張り出せるのでしょうか? 宜しくお願いします。

  • クエリで抽出したデータに書き込みたい

    どうしても分からなくなってしまったので、質問させていただきます。 以前、連番フィールドだけのテーブルを作りたいと質問して以下のような回答を頂きました。もちろん回答内容で連番フィールドの作成はできました。 Private Sub Sample1()   Dim rs As New ADODB.Recordset   Dim i As Integer   rs.Open "ZZZZ連番テーブル", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic   For i = 1 To 9999     rs.AddNew     rs("仮想ID") = "ZZZZ" & Format(i, "0000")     rs.Update   Next   rs.Close End Sub そして今回は、また連番を振りたいのですが 今回は条件が加わっていまして、元テーブルからまずクエリで既存データの登録番号を昇順(空き番号ではないが番号が所々飛んでいるもの)で抽出します。 この虫食いのように飛んでいる番号を綺麗に連番にしようと思い、まずは別フィールドに変更したい連番のフィールドを作成したいのですが。 これがうまくいきません。 上に記述したVBAでは既にレコードがあるデータにAddNewが有効でないのは分かるのですが、 どのようにすれば元テーブルから抽出クエリ(昇順で抽出したデータ)を使って 別フィールドに連番を振ることができるのでしょうか? フィールドを書き換えるのではなく別フィールドに連番を振るだけなのですが・・・

専門家に質問してみよう