A Microsoft Office (Excel, Word) forum. OfficeFrustration

If this is your first visit, be sure to check out the FAQ by clicking the link above. You may have to register before you can post: click the register link above to proceed. To start viewing messages, select the forum that you want to visit from the selection below.

Go Back   Home » OfficeFrustration forum » Microsoft Access » Running & Setting Up Queries
Site Map Home Register Authors List Search Today's Posts Mark Forums Read  

Why can't I update this query



 
 
Thread Tools Display Modes
  #11  
Old December 8th, 2006, 02:23 PM posted to microsoft.public.access.queries
BruceM
external usenet poster
 
Posts: 723
Default Why can't I update this query

I have tried:
Creating a new query
Compacting and repairing the database
Creating a new blank database, and importing all of the objects
Creating a new blank database, importing only the tables, and creating a
query
Creating a new database, creating new tables, and adding some test data

In all cases, the query would not allow data to be updated in any way. Here
is the basic structure of the test database. By the way, I tried using
unique names for the FK fields, but the result was the same as if I had used
VendorID in all cases.

tblVendor
VendorID (PK)
VendorName, etc.

tblPO
PO_ID (PK)
VendorID_PO (FK)
PurchaseDate, etc.

tblPhone
PhoneID (PK)
VendorID_phone (FK)
PhoneNumber

The relationships have referential integrity enforced, and appear to be as
they should. Changing the join type in the query makes no difference. The
query cannot be edited. I can only conclude this is designed behavior. I
just wish I knew why.

SELECT tblPO.*, tblVendor.*, tblPhone.Phone
FROM (tblVendor INNER JOIN tblPhone ON tblVendor.VendorID =
tblPhone.VendorID_phone) INNER JOIN tblPO ON tblVendor.VendorID =
tblPO.VendorID_PO;


Anyhow, thanks for taking a look at this. I have provided the information
in this posting just in case something jumps out at you, but this may have
to remain a mystery.

"Marshall Barton" wrote in message
...
I can't explain it. Barring something funny about your
query, it should work. How you created the table and the
relationships should have no effect as long as the query is
properly constructed, which it looks like it is.

Someone else may have an idea, but the only straw I can
think of to grasp at is some kind of corruption. Make a
backup copy of the mdb file, then try compacting the db,
recreating the query from scratch or even creating a fresh
mdb and importing everything.
--
Marsh
MVP [MS Access]


BruceM wrote:
Thanks for the reply. I guess I didn't make it clear that I was just
trying
to display, not edit, the vendor data. I'll have a command button or a
click event for the controls bound to the vendor data if the user needs to
go to the main vendor form, in which the phone numbers are displayed in a
list box. Phone numbers are added/edited by means of a pop-up form.
However, only a few users will be able to edit vendor data at all, so most
of the front ends will include just a message box to inform users they
can't
change the data.
A query that combines tblVendor and tblPhone can be edited, as can a query
that combines tblPO and tblVendor. FWIW, the only indexed fields are the
PK
and FK fields, and VendorName from tblVendor. It makes no difference if I
add fields individually or by using the asterisk to add all fields, nor if
I
remove the parameter. I tried breaking the relationship between tblPO and
tblPO_Details (which is the junction table between tblPO and tblProducts)
so
that a many-to-many relationship is completely out of the mix.
In order to get the phone numbers, which were in Phone1 and Phone2 fields
in
tblVendor, into their own table I based an append query on a union query.
I
wondered if this could have created some anomalies, so I create a new
tblPhone with no data. When I added tblPO, tblVendor, and the new
tblPhone
to a query it returned no records because tblPhone had none, so I changed
the join between tblVendor and tblPhone to a left join, after which I
could
see all of the PO records, but I still couldn't edit any fields. This
tells
me that when I prepare the report that is the actual printed PO I can
include all three tables in its record source, but need to use the left
join
in order to display a record regardless of whether there is a phone
number.
However, this doesn't get me any closer to displaying the phone number in
a
form based on an updatable query, unless I use a subform.
If a query that includes all three tables is supposed to be non-updatable
I
can accept that, but if I should be able to edit the PO fields but cannot
I
would like to discover why, and thereby learn something new.
I may end up using a subform to display the vendor information, including
phone, since it will be simpler to prevent edits or additions in the
subform
than in individual controls, but if you have any thoughts or explanations
about why I can't edit any of the fields when all three tables are in the
query, I would be interested in hearing about it.

"Marshall Barton" wrote.
BruceM wrote:
"Marshall Barton" wrote
BruceM wrote:

This is the SQL for a query that cannot be updated:

SELECT tblPO.*, tblVendor.*, tblPhone.Phone, tblPhone.MainPhone
FROM (tblVendor INNER JOIN tblPO ON tblVendor.VendorID =
tblPO.VendorID)
INNER JOIN tblPhone ON tblVendor.VendorID = tblPhone.VendorID
WHERE (((tblPhone.MainPhone)=True));

The situation, in general terms, is that I have a pretty standard PO
system.
There is a Vendor table, with a related Purchase Order (PO) table. If
it
matters for purposes of this question, there is a PO_Details table for
line
items on the PO, which serves as the junction table between the Vendor
table
and a Products table.
The Vendor table also has a related table for phone numbers. Therein
lies
my problem. The PO form needs to contain Vendor information including
the
phone number, and PO information such as PO_Date and PO_Number. As
long
as
I leave out the Phone table, everything is fine.
If I make a query consisting of tblVendor and either tblPhone or
tblPO,
everything is fine; however, adding both tblPhone and tblPO locks down
the
query for reasons I have not been able to discover. I do know that
changing
the join type has accomplished nothing. An article in Microsoft's
MSDN2
library contains the following as a reason for a non-updatable query:
"Query based on three or more tables in which there is a many-to-many
relationship"
This is the closest I can find to something that applies to my
situation,
as
tblPO is related to tblPO_Details, which as I mentioned is a junction
table.
The article is ambiguous in that it doesn't specify whether the
problem
lies
with a query that includes the three table involved in the
many-to-many,
or
just any query with three or more tables, one of which is part of a
many-to-many relationship. If it applies to my difficulties I do not
see
the solution.


Well, the first thing is that you should not be treating a
multi-table dataset as a data editing mechanism. I think(?)
many other db systems just plain disallow it. Access/Jet
will sometimes permit it in an effort (unjustified in my
opinion) to make things easier for people that don't know
any better.

I never intended to edit the phone number from the PO form, only to
display
it. The display-only fields were to be in locked controls. Do I
understand
you to mean a forms's record source should be either a table or a
single-table query? Would it be better to have a subform for the vendor
information such as address (and phone) that is displayed only? The
editable fields could be on the main (PO) form, and the displayed-only
fields on the subform, which could be locked to prevent edits. I have
to
say I always thought multi-table Record Source queries were a strength
of
Access/Jet, not a liability.

The only hope you have of making this
arrangement work is to include each table's primary key in
the dataset.

Tried that. It didn't work.

The "proper" way to deal with updating related information
in multiple tables is to use a form for the table of primary
interest and a separate subform for each related table's
data.

I just wish there was a convenient way of handling one-field subforms so
that they look like text boxes. There's lots of trial and error, and in
the
end a control that doesn't quite look like the rest of the controls.

Anyhow, the subform solves the immediate problem, of course, even if it
is
a
fiddly nuisance to work with. I will admit, though, to being moderately
confused about datasets. Thanks for taking the time to look at my
questions, as you have to very good effect on a number of past
occasions.


I thought you were trying to modify the phone field. Other
than that issue, I think I just added to your confusion.
I have more form record source queries than I can count that
use multiple tables and as long as only the primary table's
fields are being updated, there should be no problem. The
problem I was trying to address is in editing a many side
table's fields.

Just guessing now, but maybe something else going on. Can
you find anything unusual about the phones table? Try
joining that table just to the vendor table and see if the
vendor data can be modified.




  #12  
Old December 8th, 2006, 02:44 PM posted to microsoft.public.access.queries
Rick Brandt
external usenet poster
 
Posts: 4,354
Default Why can't I update this query

BruceM wrote:
I have tried:
Creating a new query
Compacting and repairing the database
Creating a new blank database, and importing all of the objects
Creating a new blank database, importing only the tables, and
creating a query
Creating a new database, creating new tables, and adding some test
data
In all cases, the query would not allow data to be updated in any
way. Here is the basic structure of the test database. By the way,
I tried using unique names for the FK fields, but the result was the
same as if I had used VendorID in all cases.

tblVendor
VendorID (PK)
VendorName, etc.

tblPO
PO_ID (PK)
VendorID_PO (FK)
PurchaseDate, etc.

tblPhone
PhoneID (PK)
VendorID_phone (FK)
PhoneNumber

The relationships have referential integrity enforced, and appear to
be as they should. Changing the join type in the query makes no
difference. The query cannot be edited. I can only conclude this is
designed behavior. I just wish I knew why.

SELECT tblPO.*, tblVendor.*, tblPhone.Phone
FROM (tblVendor INNER JOIN tblPhone ON tblVendor.VendorID =
tblPhone.VendorID_phone) INNER JOIN tblPO ON tblVendor.VendorID =
tblPO.VendorID_PO;


Anyhow, thanks for taking a look at this. I have provided the
information in this posting just in case something jumps out at you,
but this may have to remain a mystery.


I don't know that the "rules" for when query is updateable are really that
well-defined for the case of queries that include multiple tables. It might
very well be influenced by the query plan that is compiled and saved for the
query which can varies based on indexes available and by the actual data in
the tables.

It should be pointed out that editable record sets from ANY query having
multiple table inputs is not allowed in most databases. Access is one of
the most flexible in this regard, but (as observed) there are limits to how
complex a query's joins can be before *safely* allowing edits can be
executed and as a safeguard the result set becomes read only when any
ambiguity creeps in.

In all my years of using Access I have only a small handful of cases where I
have attempted to edit data from a multi-input query. It is just not that
necessary of a thing to do.

--
Rick Brandt, Microsoft Access MVP
Email (as appropriate) to...
RBrandt at Hunter dot com




  #13  
Old December 8th, 2006, 04:13 PM posted to microsoft.public.access.queries
BruceM
external usenet poster
 
Posts: 723
Default Why can't I update this query

Thanks for the reply. I am not attempting to add or edit data other than
Purchase Order information. Further, I have no wish to do so. VendorID is
the FK field in tblPO, so the combo box on frmPO has been made to display
the vendor name, but the rest of the vendor information is for display only.
Since there were only to be three such fields (a concatenated address field,
fax, and phone) I thought it would be simple enough to just lock those three
text boxes and not bother with a subform, but it is not possible. I believe
the limitation in my case is that two tables were linked to the same field
in the third table. Both tblPhone and tblPO have FK fields related to the
same PK field (VendorID) from tblVendor. The query I described is not
updatable. However, a query combining tblVendor, tblPO, and tblPO_Details
is editable. Each vendor may have many POs, and each PO may have many line
items. This is a different situation than I have described, in which each
vendor may have many POs, and each vendor may have many phone numbers.
Once again, I do not intend, in this project or any other, to edit fields
from more than one table that is included in a query, unless some
exceptional circumstances present themselves in the future. There are times
when it would be convenient if I did not have to use a subform, particularly
when I only need to display a single field, but now that I have a better
handle on the limitations of multi-table queries as form record sources I
can move on to other things. In the present case I constructed a locked
subform that combines tblVendor and tblPhone.

"Rick Brandt" wrote in message
t...
BruceM wrote:
I have tried:
Creating a new query
Compacting and repairing the database
Creating a new blank database, and importing all of the objects
Creating a new blank database, importing only the tables, and
creating a query
Creating a new database, creating new tables, and adding some test
data
In all cases, the query would not allow data to be updated in any
way. Here is the basic structure of the test database. By the way,
I tried using unique names for the FK fields, but the result was the
same as if I had used VendorID in all cases.

tblVendor
VendorID (PK)
VendorName, etc.

tblPO
PO_ID (PK)
VendorID_PO (FK)
PurchaseDate, etc.

tblPhone
PhoneID (PK)
VendorID_phone (FK)
PhoneNumber

The relationships have referential integrity enforced, and appear to
be as they should. Changing the join type in the query makes no
difference. The query cannot be edited. I can only conclude this is
designed behavior. I just wish I knew why.

SELECT tblPO.*, tblVendor.*, tblPhone.Phone
FROM (tblVendor INNER JOIN tblPhone ON tblVendor.VendorID =
tblPhone.VendorID_phone) INNER JOIN tblPO ON tblVendor.VendorID =
tblPO.VendorID_PO;


Anyhow, thanks for taking a look at this. I have provided the
information in this posting just in case something jumps out at you,
but this may have to remain a mystery.


I don't know that the "rules" for when query is updateable are really
that well-defined for the case of queries that include multiple tables.
It might very well be influenced by the query plan that is compiled and
saved for the query which can varies based on indexes available and by the
actual data in the tables.

It should be pointed out that editable record sets from ANY query having
multiple table inputs is not allowed in most databases. Access is one of
the most flexible in this regard, but (as observed) there are limits to
how complex a query's joins can be before *safely* allowing edits can be
executed and as a safeguard the result set becomes read only when any
ambiguity creeps in.

In all my years of using Access I have only a small handful of cases where
I have attempted to edit data from a multi-input query. It is just not
that necessary of a thing to do.

--
Rick Brandt, Microsoft Access MVP
Email (as appropriate) to...
RBrandt at Hunter dot com






  #14  
Old December 8th, 2006, 05:20 PM posted to microsoft.public.access.queries
Rick Brandt
external usenet poster
 
Posts: 4,354
Default Why can't I update this query

BruceM wrote:
Thanks for the reply. I am not attempting to add or edit data other
than Purchase Order information. Further, I have no wish to do so.
VendorID is the FK field in tblPO, so the combo box on frmPO has been
made to display the vendor name, but the rest of the vendor
information is for display only. [snip]


I have had queries where linking to one additional table so that one field
could be added for viewing only made that query non-editable. Which fields
you intend to edit or not edit doesn't enter into the equation.

--
Rick Brandt, Microsoft Access MVP
Email (as appropriate) to...
RBrandt at Hunter dot com


  #15  
Old December 8th, 2006, 05:49 PM posted to microsoft.public.access.queries
Marshall Barton
external usenet poster
 
Posts: 5,361
Default Why can't I update this query

BruceM wrote:

I have tried:
Creating a new query
Compacting and repairing the database
Creating a new blank database, and importing all of the objects
Creating a new blank database, importing only the tables, and creating a
query
Creating a new database, creating new tables, and adding some test data

In all cases, the query would not allow data to be updated in any way. Here
is the basic structure of the test database. By the way, I tried using
unique names for the FK fields, but the result was the same as if I had used
VendorID in all cases.

tblVendor
VendorID (PK)
VendorName, etc.

tblPO
PO_ID (PK)
VendorID_PO (FK)
PurchaseDate, etc.

tblPhone
PhoneID (PK)
VendorID_phone (FK)
PhoneNumber

The relationships have referential integrity enforced, and appear to be as
they should. Changing the join type in the query makes no difference. The
query cannot be edited. I can only conclude this is designed behavior. I
just wish I knew why.

SELECT tblPO.*, tblVendor.*, tblPhone.Phone
FROM (tblVendor INNER JOIN tblPhone ON tblVendor.VendorID =
tblPhone.VendorID_phone) INNER JOIN tblPO ON tblVendor.VendorID =
tblPO.VendorID_PO;


Anyhow, thanks for taking a look at this. I have provided the information
in this posting just in case something jumps out at you, but this may have
to remain a mystery.



Ok, I just spent the last hour duplicating your arrangement
and experiments and I am seeing the same things you are.
All the playing around with it that I've done did not help
any more than what you've been saying all along.

I also went into several of my apps looking for examples
where I've done similar things and, regardless of my
(apparently failing) memory, I can't find any examples where
I actually try to use a three table query for updating
anything. I guess I was off base before when I said I had
done this before.

I did find lots of places where I used a dependent combo
box, a subform or, ocassionally a text box with a DLookup to
display data from a third table.

--
Marsh
MVP [MS Access]
  #16  
Old December 8th, 2006, 05:57 PM posted to microsoft.public.access.queries
BruceM
external usenet poster
 
Posts: 723
Default Why can't I update this query

Yup, I see that it's all or nothing with updatable-ness.

"Rick Brandt" wrote in message
et...
BruceM wrote:
Thanks for the reply. I am not attempting to add or edit data other
than Purchase Order information. Further, I have no wish to do so.
VendorID is the FK field in tblPO, so the combo box on frmPO has been
made to display the vendor name, but the rest of the vendor
information is for display only. [snip]


I have had queries where linking to one additional table so that one field
could be added for viewing only made that query non-editable. Which
fields you intend to edit or not edit doesn't enter into the equation.

--
Rick Brandt, Microsoft Access MVP
Email (as appropriate) to...
RBrandt at Hunter dot com




  #17  
Old December 8th, 2006, 06:13 PM posted to microsoft.public.access.queries
BruceM
external usenet poster
 
Posts: 723
Default Why can't I update this query

Ah! A text box or something with a DLookup, as I did with the list box for
displaying phone numbers (from the related table) in my Vendors form. I
didn't make the connection that I could probably have done the same sort of
thing. I use lots of subforms, but they can be awkward to work with in that
I can't see how they line up until I switch to Form view. If it's not right
I switch back, tweak, and repeat. As I understand this has been improved in
Access 2007, but I won't be seeing that anytime soon, at least not at work.
Anyhow, as I think I mentioned I ended up using a subform for vendor
information, which did have the advantage of allowing me to disallow changes
in one shot at the form level.
As I mentioned to Rick, I realized that in the situation where each vendor
may have many Purchase Orders, and each PO may have many line items, the
query is updatable. However, in my case each vendor could have many POs,
and each vendor could have many phone numbers. Both tblPO and tblPhone were
trying to "share" the same PK from tblVendor. I don't quite understand the
rule that applies, but I see how it works.
Marshall, thanks for taking the time to look into this. Even after I
decided the subform as described was a good way to go about things, I
stubbornly continued in my efforts to discover what was going on. Perhaps
it wasn't the best use of my time in the short term, but I expect the
hard-earned information I gleaned will stay with me pretty well. Thanks for
sticking with me through the investigation.

"Marshall Barton" wrote in message
...
BruceM wrote:

I have tried:
Creating a new query
Compacting and repairing the database
Creating a new blank database, and importing all of the objects
Creating a new blank database, importing only the tables, and creating a
query
Creating a new database, creating new tables, and adding some test data

In all cases, the query would not allow data to be updated in any way.
Here
is the basic structure of the test database. By the way, I tried using
unique names for the FK fields, but the result was the same as if I had
used
VendorID in all cases.

tblVendor
VendorID (PK)
VendorName, etc.

tblPO
PO_ID (PK)
VendorID_PO (FK)
PurchaseDate, etc.

tblPhone
PhoneID (PK)
VendorID_phone (FK)
PhoneNumber

The relationships have referential integrity enforced, and appear to be as
they should. Changing the join type in the query makes no difference.
The
query cannot be edited. I can only conclude this is designed behavior. I
just wish I knew why.

SELECT tblPO.*, tblVendor.*, tblPhone.Phone
FROM (tblVendor INNER JOIN tblPhone ON tblVendor.VendorID =
tblPhone.VendorID_phone) INNER JOIN tblPO ON tblVendor.VendorID =
tblPO.VendorID_PO;


Anyhow, thanks for taking a look at this. I have provided the information
in this posting just in case something jumps out at you, but this may have
to remain a mystery.



Ok, I just spent the last hour duplicating your arrangement
and experiments and I am seeing the same things you are.
All the playing around with it that I've done did not help
any more than what you've been saying all along.

I also went into several of my apps looking for examples
where I've done similar things and, regardless of my
(apparently failing) memory, I can't find any examples where
I actually try to use a three table query for updating
anything. I guess I was off base before when I said I had
done this before.

I did find lots of places where I used a dependent combo
box, a subform or, ocassionally a text box with a DLookup to
display data from a third table.

--
Marsh
MVP [MS Access]



  #18  
Old December 8th, 2006, 08:37 PM posted to microsoft.public.access.queries
Marshall Barton
external usenet poster
 
Posts: 5,361
Default Why can't I update this query

BruceM wrote:

Ah! A text box or something with a DLookup, as I did with the list box for
displaying phone numbers (from the related table) in my Vendors form. I
didn't make the connection that I could probably have done the same sort of
thing. I use lots of subforms, but they can be awkward to work with in that
I can't see how they line up until I switch to Form view. If it's not right
I switch back, tweak, and repeat. As I understand this has been improved in
Access 2007, but I won't be seeing that anytime soon, at least not at work.
Anyhow, as I think I mentioned I ended up using a subform for vendor
information, which did have the advantage of allowing me to disallow changes
in one shot at the form level.
As I mentioned to Rick, I realized that in the situation where each vendor
may have many Purchase Orders, and each PO may have many line items, the
query is updatable. However, in my case each vendor could have many POs,
and each vendor could have many phone numbers. Both tblPO and tblPhone were
trying to "share" the same PK from tblVendor. I don't quite understand the
rule that applies, but I see how it works.
Marshall, thanks for taking the time to look into this. Even after I
decided the subform as described was a good way to go about things, I
stubbornly continued in my efforts to discover what was going on. Perhaps
it wasn't the best use of my time in the short term, but I expect the
hard-earned information I gleaned will stay with me pretty well. Thanks for
sticking with me through the investigation.



You're welcome, even though I was at least part of the
inefficient use of your time.

--
Marsh
MVP [MS Access]
  #19  
Old December 11th, 2006, 12:35 PM posted to microsoft.public.access.queries
BruceM
external usenet poster
 
Posts: 723
Default Why can't I update this query

I learned something from all of this. It more than makes up for the brief
time I spent heading down the wrong road. Also, you confirmed that the
problem was not some undiscovered fault in my technique. The problem was
that my query could not work, not that I was constructing it incorrectly.
You could have just shrugged and walked away, but you took the time to
investigate, which I appreciate.

"Marshall Barton" wrote in message
...
BruceM wrote:

Ah! A text box or something with a DLookup, as I did with the list box
for
displaying phone numbers (from the related table) in my Vendors form. I
didn't make the connection that I could probably have done the same sort
of
thing. I use lots of subforms, but they can be awkward to work with in
that
I can't see how they line up until I switch to Form view. If it's not
right
I switch back, tweak, and repeat. As I understand this has been improved
in
Access 2007, but I won't be seeing that anytime soon, at least not at
work.
Anyhow, as I think I mentioned I ended up using a subform for vendor
information, which did have the advantage of allowing me to disallow
changes
in one shot at the form level.
As I mentioned to Rick, I realized that in the situation where each vendor
may have many Purchase Orders, and each PO may have many line items, the
query is updatable. However, in my case each vendor could have many POs,
and each vendor could have many phone numbers. Both tblPO and tblPhone
were
trying to "share" the same PK from tblVendor. I don't quite understand
the
rule that applies, but I see how it works.
Marshall, thanks for taking the time to look into this. Even after I
decided the subform as described was a good way to go about things, I
stubbornly continued in my efforts to discover what was going on. Perhaps
it wasn't the best use of my time in the short term, but I expect the
hard-earned information I gleaned will stay with me pretty well. Thanks
for
sticking with me through the investigation.



You're welcome, even though I was at least part of the
inefficient use of your time.

--
Marsh
MVP [MS Access]



 




Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Forum Jump


All times are GMT +1. The time now is 01:35 PM.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright ©2004-2024 OfficeFrustration.
The comments are property of their posters.