>>>I've used views of views before without issue, but apparently they were all non-updateable and I didn't realize it. I'm trying to do an updateable view of an updateable view, and the View Designer isn't having it. The view was using v_otherview as an apparent free table, but the DBSETPROP statements use Database!lv_otherview. Manual changes to "v_otherview" were undone when saved.
>>>
>>>Can this be done, or do I need to change lv_otherview to do what I created lv_viewofview for?
>>
>>I've done this before and managed to get it to work just fine (although I always hear people tell me I'm nuts for doing it) - but I've never had a problem using this logic....so....
>>What version of VFP are you using? Are both views local views? Or is this first one a remote view? And are both views in the same DBC?
>
>Version: Look up 12 lines ;) VFP 8 SP 1. Both are local and in the same DBC. The Mere Mortals framework business objects take the lv_ prefix and strip off the first letter to use v_viewname aliases.
>
>SELECT v_viewname.id, v_viewname.date, v_viewname.fullname, v_viewname.amount FROM v_viewname V_viewname ;
>WHERE ?vp_id = 0 or v_viewname.id = ?vp_id ORDER BY v_viewname.fullname, v_viewname.date
>
>DBSetProp(ThisView+".id","Field","DataType","I")
>DBSetProp(ThisView+".id","Field","UpdateName","dbc!lv_viewname.id")
>DBSetProp(ThisView+".id","Field","KeyField",.F.)
>DBSetProp(ThisView+".id","Field","Updatable",.T.)
>
>As shown, I never use DBC.lv_viewname, but View Designer insists that's the updatable table. What do your DBSetProps look like?
Here is an example.
This is the first view (which is a view of the table), and it's updatable....
SELECT Test1.test1_pk, Test1.field1, Test1.field2;
FROM ;
data1!test1
DBSetProp(ThisView,"View","SendUpdates",.T.)
DBSetProp(ThisView,"View","BatchUpdateCount",1)
DBSetProp(ThisView,"View","CompareMemo",.T.)
DBSetProp(ThisView,"View","FetchAsNeeded",.F.)
DBSetProp(ThisView,"View","FetchMemo",.T.)
DBSetProp(ThisView,"View","FetchSize",100)
DBSetProp(ThisView,"View","MaxRecords",-1)
DBSetProp(ThisView,"View","Prepared",.F.)
DBSetProp(ThisView,"View","UpdateType",1)
DBSetProp(ThisView,"View","UseMemoSize",255)
DBSetProp(ThisView,"View","Tables","data1!test1")
DBSetProp(ThisView,"View","WhereType",3)
DBSetProp(ThisView+".test1_pk","Field","DataType","I")
DBSetProp(ThisView+".test1_pk","Field","UpdateName","data1!test1.test1_pk")
DBSetProp(ThisView+".test1_pk","Field","KeyField",.T.)
DBSetProp(ThisView+".test1_pk","Field","Updatable",.F.)
DBSetProp(ThisView+".field1","Field","DataType","C(10)")
DBSetProp(ThisView+".field1","Field","UpdateName","data1!test1.field1")
DBSetProp(ThisView+".field1","Field","KeyField",.F.)
DBSetProp(ThisView+".field1","Field","Updatable",.T.)
DBSetProp(ThisView+".field2","Field","DataType","C(10)")
DBSetProp(ThisView+".field2","Field","UpdateName","data1!test1.field2")
DBSetProp(ThisView+".field2","Field","KeyField",.F.)
DBSetProp(ThisView+".field2","Field","Updatable",.T.)
..........................................then here is the second view, which is a view of the above view, and it's also updateable...
SELECT Lv_test1_toplevel_rvwru.test1_pk,;
Lv_test1_toplevel_rvwru.field1, Lv_test1_toplevel_rvwru.field2;
FROM ;
data1!lv_test1_toplevel_rvwru;
WHERE Lv_test1_toplevel_rvwru.test1_pk = ( ?lnTest1_pk )
DBSetProp(ThisView,"View","SendUpdates",.T.)
DBSetProp(ThisView,"View","BatchUpdateCount",1)
DBSetProp(ThisView,"View","CompareMemo",.T.)
DBSetProp(ThisView,"View","FetchAsNeeded",.F.)
DBSetProp(ThisView,"View","FetchMemo",.T.)
DBSetProp(ThisView,"View","FetchSize",100)
DBSetProp(ThisView,"View","MaxRecords",-1)
DBSetProp(ThisView,"View","Prepared",.F.)
DBSetProp(ThisView,"View","UpdateType",1)
DBSetProp(ThisView,"View","UseMemoSize",255)
DBSetProp(ThisView,"View","Tables","data1!lv_test1_toplevel_rvwru")
DBSetProp(ThisView,"View","WhereType",3)
DBSetProp(ThisView+".test1_pk","Field","DataType","I")
DBSetProp(ThisView+".test1_pk","Field","UpdateName","data1!lv_test1_toplevel_rvwru.test1_pk")
DBSetProp(ThisView+".test1_pk","Field","KeyField",.T.)
DBSetProp(ThisView+".test1_pk","Field","Updatable",.F.)
DBSetProp(ThisView+".field1","Field","DataType","C(10)")
DBSetProp(ThisView+".field1","Field","UpdateName","data1!lv_test1_toplevel_rvwru.field1")
DBSetProp(ThisView+".field1","Field","KeyField",.F.)
DBSetProp(ThisView+".field1","Field","Updatable",.T.)
DBSetProp(ThisView+".field2","Field","DataType","C(10)")
DBSetProp(ThisView+".field2","Field","UpdateName","data1!lv_test1_toplevel_rvwru.field2")
DBSetProp(ThisView+".field2","Field","KeyField",.F.)
DBSetProp(ThisView+".field2","Field","Updatable",.T.)
,,,,,with all that being said, generally I only do something like this if I have a really good reason too. Usually it's when I have several very complex remote views that I want to join together and I'll make a local view for that. This is often quite handy if you're trying to join data from two different systems (like an Oracle backend and a SQL server backend). Doing this with one local view of one local view seems a bit odd to me though since you're not joining two views together - I guess I just don't see why you wouldn't put it all in one view to begin with???
ICQ 10556 (ya), 254117