Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.0k views
in Technique[技术] by (71.8m points)

ms access - Why is my query not updateable?

I'm trying to build an updatable view in Access for a user. Basically, the underlying tables look like this:

Accounts
--------
accountId
accountName
accountHolder

TransactionStatements
------------
statementId
accountId
received
month
year

The user wants a Query (view) that looks like this:

StatementView
-------------
accountName
accountHolder
year
janReceived
febReceived
marReceived
etc...

The SQL to accomplish this is straightforward using a transpose, but the resulting view is not updatable.

I've also tried doing multiple joins explicitly to accomplish this:

PARAMETERS [Enter Year:] Long;
SELECT accountName, accountHolder, year, 
FROM ((Accounts a
INNER JOIN TransactionStatements ts1 ON a.accountID = ts.accountID) 'AND month = 1 (This isn't allowed for some reason?)
INNER JOIN TransactionStatements ts2 ON a.accountID = ts.accountID) 'AND month = 2 (This isn't allowed for some reason?)
WHERE ts1.month = 1 AND ts2.month = 2 AND ts1.year = ([Enter Year:]) AND ts2.year = ([Enter Year:])

But once again the result becomes non-updatable as soon as I add the second INNER JOIN. I've looked at this MS help page, but it hasn't helped me figure out the right way to do this.

It suggests Forms as an alternative, but building a custom form in Access appears to be an even more arcane and convoluted process than writing views.

Any suggestions?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Take a look at this very thorough list of reasons why recordsets are and aren't updateable:

When Recordsets Are Always Updateable

A recordset is always updateable when:

  1. It is based on a single table.
  2. It is based on a query based on a single table.
  3. It is based on a query based on tables with a one-to-one relationship.

When Recordsets Are Never Updateable

A recordset is never updateable when:

  1. It is based on a Crosstab query.
  2. It is based on a Union Query.
  3. It is an Aggregate Query that calculates a sum, average, count or other type of total on the values in a field.
  4. It is an Update Query that references a field in the Update To row from either a crosstab query, select query, or subquery that contains totals or aggregate functions Note: By using a domain aggregate function in the Update To row of an update query, you can reference fields from either a crosstab query, select query, or subquery that contains totals or aggregate functions.
  5. It is based on a Query that includes a linked ODBC table with no unique index.
  6. The database was opened as read-only or is located on a read-only drive.
  7. It is a SQL pass-through query.
  8. It is a query whose UniqueValues property is set to Yes. (That is, it is a query with a DISTINCT predicate.)
  9. Cartesian Joins (that is, a query that includes more than one table or query, and the tables or queries aren't joined by a join line in Design view.)
  10. Query based on three or more tables in which there is a many-to-one-to-many relationship. Note: Though you can't update the data in the query directly, you can update the data in a form or data access page based on the query if the form's RecordsetType property is set to Dynaset (Inconsistent Updates).
  11. Calculated fields. Even if the query itself is updateable, if a column in a query is based on a formula, the field cannot be updated. However, if the other fields in the formula are updated, the calculated field will automatically update.

Recordsets Are Updateable Under Certain Conditions

Some queries, especially those involved in a Join, will not be updateable under some conditions, but will be under others. In other queries, even if the query itself is updateable, some of the fields will not be. The following are cases of query problems and their corresponding solutions.

  1. Query based on a Join of tables with no Relationship.

    ?Problem: If a query is based on two or more tables that DO NOT have a relationship established (with Referential Integrity enabled), the query will be non-updateable.

    ?Solution: Create a Primary Key or Unique Index on ALL of the fields used in the Join on the "one-side" table. To be clear, this means ONE primary key or unique index based on all of the fields, not separate indexes on each field. In a query based on a Join of tables with a one-to-many relationship (1:M), you might not be able to edit the data in one or more fields.

  2. Join field from the "one" side

    ?Problem: If you have a 1:M relationship created between two tables, you cannot change the primary key field (used in the Join) of the table on the "one" side of the relationship.

    ?Solution: Enable cascading updates between the two tables.

  3. New records, if the "many" side join field doesn't appear in the datasheet

    ?Problem: In a query based on a 1:M relationship, you can create a new record and fill in the fields that come from the "one" side table, but if the join field from the "many" side table is not visible in the query (that is, the foreign key), you cannot add data to the "many" side fields.

    ?Solution: Add the join field from the "many" side table (ie, foreign key) to your query to allow adding new records.

  4. New records on the "one" side that are duplicates of other "one" side records.

    ?Problem: When adding a new record, if you try to type into the "one" side fields, you will be attempting to create a new record. Even if you use the same primary key values, it will give you an error.

    ?Solution: Add a value to the "many" side join field (foreign key) that matches the "one" side join field (primary key) of an already existing record. The "one" side values will simply appear.

  5. Join field from the "many" side, after you've updated data on the "one" side

    ?Problem: If you are currently editing fields from the "one" side of the relationship, you cannot change the "many" side join field (foreign key).

    ?Solution: Save the record; then you'll be able to make changes to the "many" side join field.

  6. New records, if entire unique key of ODBC table isn't output

    ?Problem: This is different than #5 under Never Updateable. In this case, the primary key of the linked ODBC table exists, but is not added to the query.

    ?Solution: Select all primary key fields of ODBC tables to allow inserts into them.

  7. Query does not have Update Data permissions

    ?Problem: Query (or underlying table) for which Update Data permission isn't granted.

    ?Solution: To modify data, permissions must be assigned.

  8. Query does not have Delete Data Permissions

    ?Problem: Query (or underlying table) for which Delete Data permission isn't granted

    ?Solution: To delete data, permissions must be assigned. Conclusion

The causes of non-updateable recordsets are many and varied. Some have solutions and others don't. Hopefully, this list will help you know the difference.

The above is taken, word for word, from the following blog: This Recordset Is Not Updateable. Why? I felt it was best to copy and fully attribute rather than try to paraphrase, so that all of the information was given.

The first things I suggest you look at might be that your tables have proper indexing and their relationships are set up properly. Those are usually the two things I gun for first, and they tend to solve most of my own "non-updateable query" issues.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...