Templates: Access Objects parts
Last week I talked about how the template core data is laid out. Now, I’ll focus on the actual Access objects.
For every Access object part (each file in template\database\objects), there is a corresponding” XML file in the \template\database\objects\properties folder containing it’s properties: type and name. For example:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
- <AccessObject xmlns="https://schemas.microsoft.com/office/access/2005/04/template/object-metadata">
<Type>Form</Type>
<Name>Add Related Issues</Name>
</AccessObject>
Now, as for the object itself, there are two types of objects: tables and everything else (form, reports, macros and queries). The table objects are XSD files, with the customary .xsd extension.
Since XSD files only define schema, the actual data within these tables are saved in the template/database/objects/sampleData folder, in XML format. There is one XML sample data file for each XSD file in the folder above: both constitute one table.
As for the form, queries, reports and macros, these are simple text files in template\database\objects. These are not XML, XSD or such – they are actually the SaveAsText/LoadFromText persistence format already used elsewhere in Access. For example, here’s what a query looks like:
Operation =1
Option =0
Where ="(((Issues.Status)<>\"Closed\" Or (Issues.Status) Is Null))"
Begin InputTables
Name ="Issues"
End
Begin OutputColumns
Expression ="Issues.*"
End
Begin OrderBy
Expression ="Issues.Status"
Flag =0
Expression ="Issues.Priority"
Flag =0
Expression ="Issues.[Due Date]"
Flag =0
End
dbBoolean "ReturnsRecords" ="-1"
dbInteger "ODBCTimeout" ="60"
dbByte "RecordsetType" ="0"
dbBoolean "OrderByOn" ="0"
dbByte "Orientation" ="0"
dbByte "DefaultView" ="2"
dbBoolean "FilterOnLoad" ="0"
dbBoolean "OrderByOnLoad" ="-1"
dbBinary "GUID" = Begin
0xa26c0cbd84d1be499edb2029597a5e25
End
dbBoolean "TotalsRow" ="0"
dbLongBinary "DOL" = Begin
0x0acc0e5500000000cce68fc558b3bd4a9ab9ec7673e9b5cd00000000ea387df8 ,
0xef00e3400b000000c05f11004900730073007500650073000000000000007c14 ,
0xd0158996884e8e1461b254a168da07000000cce68fc558b3bd4a9ab9ec7673e9 ,
0xb5cd53007400610074007500730000000000000046b553afdd076a40a5be3384 ,
0x98df0bda07000000cce68fc558b3bd4a9ab9ec7673e9b5cd5000720069006f00 ,
0x72006900740079000000000000004a6c0fd2c964584eb9cea65e577d52090700 ,
0x0000cce68fc558b3bd4a9ab9ec7673e9b5cd4400750065002000440061007400 ,
0x6500000000000000000000000000000000000000000000000c00000004000000 ,
0x0000000000000000000000000000
End
Begin
End
Begin
State =0
Left =0
Top =0
Right =776
Bottom =710
Left =-1
Top =-1
Right =760
Bottom =213
Left =0
Top =0
ColumnsShown =539
Begin
Left =48
Top =12
Right =192
Bottom =156
Top =0
Name ="Issues"
Name =""
End
End
As per our previous discussion about the LoadFromText and SaveAsText formats and functions, it is not surprising that tables use a different mechanism, right?
The other folders (“AddFuriganaVariation”, etc) are internal mechanisms we use to be able to generate localizable templates. We need to be able to deal with requirements such as right-to-left content flipping, font replacement depending on locale and others. That’s why we have copies of specific objects in these folders – so we can do specific treatment when necessary.