Article ID:qGEN012
Date Revised:June 05, 1998
Keywords:View, DBC, Field Properties
See Also:Download dbcViewProp.prg (3KB)   

Question: How can I easily copy the properties of database table fields to the view fields?

Answer: You can run GENDBC to generate the database code and edit it to alter the views.

I wrote this little program to handle the task:

* dbcViewProp.prg 08-May-98

* load all view field properties from the underlying table field properties

* Copyright 1998 DF Software Development, Inc.
* http://www.geocities.com/ResearchTriangle/9834/
* Unrestricted public use

* Standard disclaimer: Backup your DBC files before running this program
* I'm not liable for any damages. While this utility works great on my
* views it may fail on the views you have created.

local lcDBC, laFields[1], laViews[1], laProperties[6], i, j

lcDBC = set( "database" )
if ( empty( lcDBC ) )
   * no database open so prompt for one
   open database ?
   lcDBC = set( "database" )
   if ( empty( lcDBC ) )
      return .f.
   endif
endif

lcDBC = lcDBC + ".dbc"

* list of field properties to copy over to the view
* the list of properties is in the help for DBGetProp

laProperties[1] = "Caption"
laProperties[2] = "Comment"
laProperties[3] = "DisplayClass"
laProperties[4] = "DisplayClassLibrary"
laProperties[5] = "Format"
laProperties[6] = "InputMask"
*laProperties[] = ""

* find all the views in the database

select ObjectName, "" ;
   from (lcDBC) ;
   into array laViews ;
   where objecttype = "View"

* self join to find all of the view fields

select DBC.ObjectName, Tables.ObjectName ;
   from (lcDBC) as DBC;
   inner join (lcDBC) as Tables ;
      on dbc.ParentID = tables.ObjectID ;
   into array laFields ;
   where DBC.objecttype = "Field" and tables.ObjectType = "View"

wait window "Updating view fields" nowait

for i = 1 to _tally
   laFields[i,1] = lower( alltrim( laFields[i,1] ) )
   laFields[i,2] = alltrim( laFields[i,2] ) + "." + laFields[i,1]
   lcField = dbgetprop( laFields[i,2], "Field", "UpdateName" )
   j = at( ".", lcField )
   if ( j = 0 )
      * not a field from a table, likely to be calculated
      loop
   endif

 j = at( "!", lcField )
   if ( j > 0 )
      * pull the database name off
      lcField = substr( lcField, j + 1 )
   endif

   lcField = chrtran( lcField, "*", "" )

   * set the properties

   for j = 1 to alen( laProperties )
      dbsetprop( laFields[i,2], "Field", laProperties[j], ;
            dbgetprop( lcField, "Field", laProperties[j] ) )
   endfor
endfor

wait clear
use in (lcDBC)
return .t.


1