Acknowledgments |
|
xxvii | |
Preface |
|
xxix | |
About This Book |
|
xxix | |
About This Book's Target Audience |
|
xxx | |
How This Book Is Organized |
|
xxxi | |
Part I: The Fundamentals |
|
xxxi | |
Part II: Introduction to Database Design |
|
xxxi | |
Part III: Beyond the Basics |
|
xxxi | |
Part IV: Integrity and Security |
|
xxxi | |
Part V: Raising the Bar |
|
xxxi | |
Part VI: Appendixes |
|
xxxi | |
Icons Used in This Book |
|
xxii | |
Where to Go from Here |
|
xxxii | |
|
|
1 | (88) |
|
Databases: The What, Why, and How |
|
|
3 | (16) |
|
The Many Faces of Databases: Lists, Tables, and Forms |
|
|
4 | (2) |
|
Understanding the limitations of paper-based databases |
|
|
4 | (1) |
|
|
5 | (1) |
|
Preparing to get organized |
|
|
5 | (1) |
|
The Concept of a Relational Database |
|
|
6 | (1) |
|
Flat-file databases and data redundancy |
|
|
6 | (1) |
|
Opportunities for making connections |
|
|
7 | (1) |
|
The Anatomy of a Database Solution |
|
|
7 | (5) |
|
The data: Foundation and substance |
|
|
7 | (1) |
|
The interface: Screens, letters, forms, and reports |
|
|
8 | (3) |
|
The hidden helper: Process management |
|
|
11 | (1) |
|
|
12 | (7) |
|
Knowing what FileMaker Pro calls things |
|
|
12 | (5) |
|
Using familiar ideas from the real world |
|
|
17 | (1) |
|
Integrating processes and information |
|
|
17 | (1) |
|
Recognizing that knowledge is power --- personal and professional |
|
|
18 | (1) |
|
Putting FileMaker Pro in Perspective |
|
|
19 | (12) |
|
What Makes FileMaker Pro Different from Other Database Development Tools? |
|
|
20 | (3) |
|
Some common misperceptions |
|
|
20 | (2) |
|
A unique approach to design |
|
|
22 | (1) |
|
The FileMaker Product Family |
|
|
23 | (2) |
|
|
24 | (1) |
|
Scalability and flexibility |
|
|
24 | (1) |
|
FileMaker's Hidden Talents |
|
|
25 | (4) |
|
The cross-platform chameleon |
|
|
26 | (1) |
|
Multiple technologies and formats |
|
|
26 | (2) |
|
Plug-ins and extensibility |
|
|
28 | (1) |
|
The FileMaker calculation engine: Simplicity and power |
|
|
28 | (1) |
|
|
29 | (2) |
|
Examples and brainteasers |
|
|
30 | (1) |
|
Other resources and opportunities |
|
|
30 | (1) |
|
Getting Acquainted with FileMaker |
|
|
31 | (28) |
|
Getting FileMaker Working for You |
|
|
31 | (6) |
|
Starting and exiting from FileMaker |
|
|
32 | (1) |
|
Creating, saving, and closing files |
|
|
33 | (2) |
|
Handling files and data safely |
|
|
35 | (1) |
|
Earlier file formats and conversion issues |
|
|
36 | (1) |
|
|
37 | (6) |
|
|
38 | (1) |
|
Navigating and viewing data |
|
|
39 | (1) |
|
Searching and the FileMaker Find/Omit puzzle |
|
|
40 | (2) |
|
Screen elements and what they're for |
|
|
42 | (1) |
|
Entering and Editing Data |
|
|
43 | (3) |
|
Creating and duplicating records |
|
|
44 | (1) |
|
Field definitions: Validation and dependencies |
|
|
44 | (1) |
|
The significance of commitment |
|
|
45 | (1) |
|
|
46 | (3) |
|
Importing and exporting data |
|
|
46 | (2) |
|
Previewing and printing options |
|
|
48 | (1) |
|
Send/Save as PDF and Excel |
|
|
49 | (1) |
|
Getting to Know the Relatives |
|
|
49 | (2) |
|
Ways to view and edit related data |
|
|
49 | (1) |
|
The importance of context |
|
|
50 | (1) |
|
Making complexity simple in practice |
|
|
50 | (1) |
|
Optimizing the Application |
|
|
51 | (8) |
|
Preference settings for your workstation |
|
|
51 | (3) |
|
File options for the current database |
|
|
54 | (5) |
|
What's New in FileMaker 9 |
|
|
59 | (30) |
|
The FileMaker Quick Start Screen |
|
|
59 | (1) |
|
|
60 | (1) |
|
Learn More Links on Critical Dialogs |
|
|
61 | (1) |
|
Scheduled Software Update Notification |
|
|
62 | (1) |
|
New Calculation Functions |
|
|
63 | (2) |
|
|
63 | (1) |
|
|
64 | (1) |
|
Get (HostApplication Version) |
|
|
64 | (1) |
|
|
64 | (1) |
|
|
64 | (1) |
|
|
65 | (1) |
|
|
66 | (1) |
|
The Send E-Mail Link for Database Sharing |
|
|
67 | (2) |
|
Script Grouping and Editing Tools |
|
|
69 | (1) |
|
Automatic Resizing of Layout Objects |
|
|
70 | (1) |
|
|
71 | (1) |
|
|
72 | (1) |
|
|
72 | (1) |
|
Web Viewer Feature Enhancements |
|
|
72 | (2) |
|
Progress indicator, location, lock icon |
|
|
72 | (2) |
|
|
74 | (1) |
|
Field-Specific Enabling of Visual Spell-Checking |
|
|
74 | (1) |
|
Multiple Levels of Text Undo and Redo in Fields and ScriptMaker |
|
|
75 | (1) |
|
Additional Toolbar Controls |
|
|
76 | (1) |
|
Save/Send as PDF or Excel, Undo and Redo |
|
|
76 | (1) |
|
|
76 | (1) |
|
Additional Avery Label Formats |
|
|
77 | (1) |
|
Enhanced External SQL Data Source Support |
|
|
77 | (3) |
|
Supplemental Fields for ESS Tables |
|
|
80 | (2) |
|
Creating supplemental fields |
|
|
80 | (1) |
|
Using supplemental fields |
|
|
80 | (1) |
|
|
81 | (1) |
|
|
82 | (7) |
|
Script Debugger enhancements |
|
|
82 | (1) |
|
Launching scripts from within the Script Debugger |
|
|
82 | (1) |
|
Working with restricted-access scripts |
|
|
83 | (1) |
|
Making multiple selections in the Script Debugger window |
|
|
84 | (1) |
|
Understanding the Pause on Error and Last Error code |
|
|
84 | (1) |
|
Using step buttons when a script is paused |
|
|
84 | (1) |
|
|
85 | (1) |
|
The Current and Watch tabs |
|
|
85 | (1) |
|
Authenticating to view-restricted data |
|
|
86 | (1) |
|
Identifying other usability improvements |
|
|
86 | (1) |
|
|
87 | (1) |
|
Database Design Report enhancements |
|
|
88 | (1) |
|
Part II: Introduction to Database Design |
|
|
89 | (172) |
|
|
91 | (40) |
|
Creating a New Database File |
|
|
92 | (21) |
|
|
94 | (3) |
|
|
97 | (1) |
|
|
97 | (1) |
|
|
97 | (1) |
|
|
97 | (1) |
|
Working with the Field Options dialog: Validation and auto-entry |
|
|
97 | (6) |
|
Setting up simple calculations |
|
|
103 | (3) |
|
Capturing simple metadata |
|
|
106 | (2) |
|
Creating relationships between tables |
|
|
108 | (3) |
|
|
111 | (2) |
|
Viewing and Interacting with Data |
|
|
113 | (8) |
|
Looking at the multiple uses of layouts |
|
|
114 | (1) |
|
Creating records and entering data |
|
|
114 | (4) |
|
|
118 | (1) |
|
Finding and sorting data you've already entered |
|
|
119 | (1) |
|
Using special find symbols |
|
|
120 | (1) |
|
Searching with the range and wildcard operators |
|
|
120 | (1) |
|
Avoiding the Need for Data Duplication |
|
|
121 | (4) |
|
Recognizing the visual cues to data relationships |
|
|
121 | (1) |
|
Information has a logical flow |
|
|
122 | (1) |
|
|
123 | (2) |
|
Making complex things simple |
|
|
125 | (1) |
|
Getting Started with File Security |
|
|
125 | (4) |
|
Working with accounts and privilege sets |
|
|
125 | (3) |
|
Setting a default account and password |
|
|
128 | (1) |
|
|
129 | (2) |
|
|
129 | (1) |
|
|
130 | (1) |
|
|
130 | (1) |
|
|
130 | (1) |
|
Using buttons for static and dynamic actions |
|
|
130 | (1) |
|
The Interface: Layout Mode |
|
|
131 | (46) |
|
|
131 | (15) |
|
|
134 | (1) |
|
Selection then Action tools |
|
|
135 | (1) |
|
|
136 | (1) |
|
Palette and Menu controls |
|
|
136 | (1) |
|
Organizing the presentation of information |
|
|
136 | (1) |
|
Applying formats to field and text objects |
|
|
137 | (4) |
|
Setting up layouts for printing |
|
|
141 | (3) |
|
Understanding lists and forms |
|
|
144 | (1) |
|
Layout parts and their purposes |
|
|
145 | (1) |
|
The Importance of Visual Structure |
|
|
146 | (4) |
|
Adding visual pointers and aids |
|
|
147 | (2) |
|
|
149 | (1) |
|
Ergonomics and avoiding visual fatigue |
|
|
149 | (1) |
|
Giving information meaning |
|
|
150 | (1) |
|
Different Kinds of Layout Objects |
|
|
150 | (4) |
|
Static and dynamic objects |
|
|
151 | (1) |
|
Inherent object properties |
|
|
152 | (1) |
|
Conditional format attributes |
|
|
152 | (2) |
|
FileMaker as a Graphical Environment |
|
|
154 | (4) |
|
Building graphic objects in FileMaker |
|
|
154 | (1) |
|
Default object formats and attributes |
|
|
155 | (1) |
|
Controlling stacking and alignment |
|
|
156 | (1) |
|
Bringing in graphics from other applications |
|
|
157 | (1) |
|
Interacting with Layout Objects |
|
|
158 | (2) |
|
Keyboard control of a layout |
|
|
158 | (1) |
|
|
159 | (1) |
|
Assigning names to layout objects |
|
|
160 | (1) |
|
Controlling visual spell-checking |
|
|
160 | (1) |
|
The Tab Control and Its Uses |
|
|
160 | (3) |
|
Defining and creating a tab panel |
|
|
161 | (1) |
|
Navigating between tab panels |
|
|
162 | (1) |
|
|
163 | (1) |
|
|
163 | (4) |
|
Working within layout context |
|
|
163 | (1) |
|
|
164 | (3) |
|
|
167 | (5) |
|
|
168 | (2) |
|
Button scope and button commands |
|
|
170 | (1) |
|
|
171 | (1) |
|
The Web Viewer: Inviting in the World |
|
|
172 | (2) |
|
|
172 | (1) |
|
|
173 | (1) |
|
Complementary data concepts |
|
|
174 | (1) |
|
|
174 | (3) |
|
Considerations for printed outpul |
|
|
174 | (1) |
|
|
174 | (1) |
|
Page sizes and page setup |
|
|
175 | (1) |
|
Paper output versus PDF or Excel output |
|
|
176 | (1) |
|
Composite PDFs from multiple layouts |
|
|
176 | (1) |
|
The Structure: The Manage Database Dialog |
|
|
177 | (50) |
|
|
178 | (5) |
|
Table concepts: A room with a view |
|
|
178 | (1) |
|
Adding, deleting, and renaming tables |
|
|
178 | (2) |
|
Moving tables between files |
|
|
180 | (1) |
|
|
180 | (3) |
|
|
183 | (14) |
|
Adding, deleting, and renaming fields |
|
|
184 | (1) |
|
Understanding field/data types and their significance |
|
|
185 | (2) |
|
|
187 | (1) |
|
|
188 | (3) |
|
Storage and indexing options |
|
|
191 | (1) |
|
Summary and Calculation fields |
|
|
192 | (4) |
|
Working with global fields |
|
|
196 | (1) |
|
|
197 | (11) |
|
Creating a Calculation field |
|
|
198 | (3) |
|
Defining a calculation formula |
|
|
201 | (1) |
|
|
202 | (1) |
|
|
203 | (1) |
|
Understanding calculation functions and their syntax |
|
|
204 | (1) |
|
|
204 | (1) |
|
|
204 | (1) |
|
|
204 | (1) |
|
|
205 | (1) |
|
|
205 | (1) |
|
Doing some simple calculations |
|
|
206 | (1) |
|
Number of days an item is overdue |
|
|
206 | (1) |
|
Calculating initials from a person's name |
|
|
206 | (1) |
|
Compound interest at a known rate over a given period |
|
|
207 | (1) |
|
Current quarter of the calendar year |
|
|
207 | (1) |
|
Changing ampersands to ``and'' in a block of text |
|
|
207 | (1) |
|
Record navigation text (record n of nn) |
|
|
208 | (1) |
|
|
208 | (6) |
|
Common misconceptions about the Relationships Graph |
|
|
209 | (1) |
|
Tables versus table occurrences |
|
|
210 | (1) |
|
Avoiding circular references |
|
|
210 | (2) |
|
Named and unnamed data sources |
|
|
212 | (1) |
|
Creating references to other FileMaker files |
|
|
213 | (1) |
|
Working with External SQL Data Sources |
|
|
214 | (9) |
|
Configuring ODBC drivers: Setting up a DSN |
|
|
214 | (5) |
|
Integrating SQL tables with FileMaker data |
|
|
219 | (3) |
|
Adding supplemental fields |
|
|
222 | (1) |
|
The Concept of Data Relationships |
|
|
223 | (4) |
|
Why bother with relationships anyway? |
|
|
223 | (1) |
|
|
224 | (1) |
|
Solving problems using relationships |
|
|
224 | (1) |
|
|
225 | (1) |
|
The FileMaker relational model |
|
|
225 | (2) |
|
The Processes: ScriptMaker |
|
|
227 | (34) |
|
ScriptMaker: What It Is and What It Offers You |
|
|
227 | (7) |
|
Building blocks of automation |
|
|
230 | (2) |
|
|
232 | (1) |
|
|
232 | (1) |
|
Addressing objects by name |
|
|
233 | (1) |
|
Defining and Editing Scripts |
|
|
234 | (9) |
|
|
234 | (3) |
|
Setting up a basic script |
|
|
237 | (2) |
|
How script commands function |
|
|
239 | (1) |
|
Changing the order of commands |
|
|
239 | (2) |
|
Assigning attributes to a command |
|
|
241 | (2) |
|
|
243 | (2) |
|
Managing the Scripts menu |
|
|
244 | (1) |
|
Other ways to trigger a script |
|
|
244 | (1) |
|
Using the single-threaded script engine |
|
|
244 | (1) |
|
Working with the script stack and paused scripts |
|
|
245 | (1) |
|
Controlling Script Execution |
|
|
245 | (4) |
|
Using conditional statements |
|
|
246 | (1) |
|
|
247 | (1) |
|
|
248 | (1) |
|
|
249 | (2) |
|
Navigation and view controls |
|
|
249 | (1) |
|
Editing information via scripts |
|
|
250 | (1) |
|
Printing and managing files |
|
|
251 | (1) |
|
Ease of Editing in ScriptMaker |
|
|
251 | (2) |
|
Selecting and duplicating multiple commands |
|
|
252 | (1) |
|
Copying and pasting scripts |
|
|
252 | (1) |
|
Copying and pasting script steps |
|
|
253 | (1) |
|
|
253 | (6) |
|
|
254 | (1) |
|
|
254 | (1) |
|
|
255 | (2) |
|
Reordering and grouping scripts |
|
|
257 | (1) |
|
Filtering scripts by group |
|
|
257 | (1) |
|
Searching for scripts by name |
|
|
258 | (1) |
|
Some Examples to Start With |
|
|
259 | (2) |
|
|
259 | (1) |
|
|
259 | (1) |
|
|
260 | (1) |
|
Part III: Beyond the Basics |
|
|
261 | (240) |
|
|
263 | (46) |
|
Making Browse Mode Work for You |
|
|
264 | (11) |
|
Using multiple windows and views |
|
|
264 | (1) |
|
Filtering portals and creating pick lists |
|
|
264 | (6) |
|
Jump buttons: Shortcut navigation |
|
|
270 | (4) |
|
Controlling one window from another |
|
|
274 | (1) |
|
Performing Complex Search Operations |
|
|
275 | (5) |
|
Compound Find criteria: The AND Find |
|
|
275 | (1) |
|
Stacking Find requests: The OR Find |
|
|
276 | (1) |
|
Constraining and extending the found set |
|
|
276 | (1) |
|
Saving Finds and found sets |
|
|
277 | (3) |
|
|
280 | (10) |
|
|
281 | (1) |
|
|
281 | (3) |
|
Creating click-sort columns |
|
|
284 | (4) |
|
|
288 | (2) |
|
|
290 | (5) |
|
The management of formatting: A three-tiered approach |
|
|
291 | (1) |
|
Character-level formatting |
|
|
291 | (1) |
|
Paragraph-level formatting |
|
|
292 | (1) |
|
|
292 | (1) |
|
Precedence of number, date, and time formats |
|
|
293 | (1) |
|
Controlling formatting programmatically |
|
|
293 | (1) |
|
|
294 | (1) |
|
|
295 | (3) |
|
The three kinds of variables |
|
|
296 | (1) |
|
Variables and memory usage |
|
|
296 | (1) |
|
Instantiating and destroying variables |
|
|
296 | (1) |
|
Keeping track of variables |
|
|
297 | (1) |
|
|
298 | (5) |
|
|
298 | (1) |
|
|
298 | (1) |
|
|
299 | (1) |
|
|
299 | (2) |
|
Differences between numeric and text indexing |
|
|
301 | (1) |
|
Unicode and alternate language indexes |
|
|
301 | (1) |
|
Optimizing field index configurations |
|
|
302 | (1) |
|
The Table of Dependencies |
|
|
303 | (1) |
|
Cascading calculation operations |
|
|
303 | (1) |
|
|
303 | (1) |
|
|
304 | (1) |
|
|
304 | (2) |
|
What caching does for you |
|
|
304 | (1) |
|
|
304 | (2) |
|
Gaining control of the cache |
|
|
306 | (1) |
|
Understanding Global Fields |
|
|
306 | (3) |
|
The behavior of global fields |
|
|
306 | (1) |
|
|
307 | (1) |
|
When to avoid global fields |
|
|
307 | (1) |
|
Using global calculation fields |
|
|
307 | (2) |
|
Building Advanced Interfaces |
|
|
309 | (50) |
|
Developing for Mac and Windows Users |
|
|
310 | (4) |
|
|
310 | (1) |
|
Paying attention to differences in screen rendering |
|
|
311 | (1) |
|
Considering platform-specific window behavior |
|
|
312 | (2) |
|
Using Dynamic Screen Elements |
|
|
314 | (6) |
|
Disappearing/reappearing objects |
|
|
314 | (1) |
|
The portal invisibility trick |
|
|
314 | (2) |
|
Concealed and remotely operated tab control |
|
|
316 | (1) |
|
Using conditional formatting as a visibility control |
|
|
317 | (1) |
|
The hidden power of conditional formatting |
|
|
318 | (1) |
|
Multi-state buttons and objects |
|
|
319 | (1) |
|
Working with Sub-Summary Parts and Part Controls |
|
|
320 | (5) |
|
Building adaptable screens |
|
|
320 | (1) |
|
Stacking up multiple Sub-summary parts |
|
|
320 | (2) |
|
Using multiple break fields |
|
|
322 | (2) |
|
Controlling pagination and page breaks |
|
|
324 | (1) |
|
|
325 | (5) |
|
|
325 | (1) |
|
Sliding objects and reducing parts |
|
|
326 | (2) |
|
|
328 | (1) |
|
Creating a letter generator |
|
|
329 | (1) |
|
Using Multiple Windows and Views |
|
|
330 | (2) |
|
Managing window placement and size |
|
|
330 | (1) |
|
Windows as pop-ups and drill-downs |
|
|
331 | (1) |
|
Simulating modal window behavior |
|
|
332 | (1) |
|
Employing Custom Dialogs as an Interface Tool |
|
|
332 | (2) |
|
Dialogs as a data-entry device |
|
|
332 | (2) |
|
Dynamic dialog attributes |
|
|
334 | (1) |
|
Looking at Anchors and Resizable Layout Objects |
|
|
334 | (5) |
|
Objects that move according to window size |
|
|
334 | (2) |
|
Objects that grow and shrink |
|
|
336 | (1) |
|
Managing complex layout resizing |
|
|
336 | (2) |
|
Resizing behavior of enclosing objects |
|
|
338 | (1) |
|
Centering objects within the viewable area |
|
|
339 | (1) |
|
Implementing Shortcut Navigation |
|
|
339 | (2) |
|
The power of the Go to Related Record command |
|
|
339 | (1) |
|
One interface, many paths |
|
|
340 | (1) |
|
Building Back button functionality |
|
|
340 | (1) |
|
Building Depth and Dimensionality |
|
|
341 | (2) |
|
Using embossing and engraving effects |
|
|
342 | (1) |
|
Spatial cues for added meaning |
|
|
342 | (1) |
|
Delineation of element groups |
|
|
342 | (1) |
|
|
343 | (1) |
|
Transparency and translucency |
|
|
343 | (1) |
|
Working with Tab Controls |
|
|
343 | (2) |
|
Organizers and space savers |
|
|
344 | (1) |
|
Tab navigation via keyboard |
|
|
344 | (1) |
|
|
344 | (1) |
|
Recognizing the Flexibility of Portals |
|
|
345 | (2) |
|
|
345 | (1) |
|
Portals as a navigation device |
|
|
346 | (1) |
|
Dynamically sorted portals |
|
|
346 | (1) |
|
Innovative portal implementations |
|
|
347 | (1) |
|
Using Advanced Web Viewer Techniques |
|
|
347 | (3) |
|
Access to advanced functionality |
|
|
347 | (1) |
|
Rendering internally calculated content |
|
|
348 | (1) |
|
Scraping data from Web pages |
|
|
349 | (1) |
|
Progress Bars and Native Charting Techniques |
|
|
350 | (3) |
|
Creating script progress monitors |
|
|
351 | (1) |
|
Native indicators and graphical displays |
|
|
352 | (1) |
|
|
353 | (2) |
|
|
353 | (1) |
|
|
354 | (1) |
|
|
354 | (1) |
|
Online Help for your users |
|
|
354 | (1) |
|
Handling User Preferences |
|
|
355 | (4) |
|
A user-centric development philosophy |
|
|
355 | (1) |
|
|
355 | (1) |
|
Example --- a multi-lingual solution interface |
|
|
356 | (3) |
|
Data Modeling in FileMaker |
|
|
359 | (40) |
|
Background in Relational Theory |
|
|
359 | (5) |
|
Set Theory in the management of data |
|
|
360 | (1) |
|
|
360 | (1) |
|
Think about clarity of organization |
|
|
361 | (1) |
|
Keep the big picture in view |
|
|
361 | (1) |
|
Remembering some guiding principles |
|
|
362 | (1) |
|
Separate entities by type |
|
|
362 | (1) |
|
|
363 | (1) |
|
Place multiples in a separate table |
|
|
363 | (1) |
|
Store everything once only |
|
|
363 | (1) |
|
Identify the major players |
|
|
364 | (1) |
|
|
364 | (1) |
|
FileMaker Relationships Graph Symbols |
|
|
364 | (2) |
|
|
364 | (1) |
|
|
365 | (1) |
|
Understanding the graph metaphor |
|
|
366 | (1) |
|
|
366 | (4) |
|
Equi-joins and non-equal joins |
|
|
367 | (1) |
|
Comparative operators (theta joins) |
|
|
368 | (1) |
|
|
369 | (1) |
|
Multi-predicate relationships |
|
|
369 | (1) |
|
Alternative Relationship Techniques |
|
|
370 | (4) |
|
|
370 | (2) |
|
|
372 | (1) |
|
|
372 | (1) |
|
|
373 | (1) |
|
Naturally occurring joins |
|
|
373 | (1) |
|
|
374 | (3) |
|
Repeating fields as an array handler |
|
|
374 | (1) |
|
Collapsing and expanding arrays |
|
|
374 | (1) |
|
Relationship-based techniques for managing data |
|
|
375 | (1) |
|
Allowing creation via relationship |
|
|
375 | (1) |
|
|
376 | (1) |
|
The isolating relationship |
|
|
376 | (1) |
|
Graph Techniques --- Spiders, Squids, and Anchor-Buoy |
|
|
377 | (3) |
|
Constellations and modular centers |
|
|
377 | (2) |
|
A satellite-based graph solution |
|
|
379 | (1) |
|
Segmentation on functional lines |
|
|
379 | (1) |
|
Documenting the Database Structure |
|
|
380 | (5) |
|
|
381 | (1) |
|
|
382 | (1) |
|
|
382 | (2) |
|
Ancillary notes and documentation |
|
|
384 | (1) |
|
|
385 | (3) |
|
``Back end'' and ``front end'' |
|
|
385 | (1) |
|
The business or procedural layer |
|
|
386 | (1) |
|
FileMaker as an integrated environment |
|
|
387 | (1) |
|
|
387 | (1) |
|
File Architecture versus Data Structure |
|
|
388 | (5) |
|
|
388 | (1) |
|
|
389 | (1) |
|
|
389 | (2) |
|
Approaches to separation of data |
|
|
391 | (1) |
|
Costs and benefits of separation |
|
|
392 | (1) |
|
Separation and External SQL Sources |
|
|
393 | (2) |
|
|
393 | (1) |
|
Working within constraints |
|
|
393 | (1) |
|
|
394 | (1) |
|
Implementing Separation in an Existing Solution |
|
|
395 | (3) |
|
Establishing data source(s) |
|
|
395 | (1) |
|
Re-pointing table occurrences |
|
|
396 | (1) |
|
|
397 | (1) |
|
Deployment Considerations |
|
|
398 | (1) |
|
|
398 | (1) |
|
The model of adaptability |
|
|
398 | (1) |
|
|
399 | (50) |
|
Compound Calculation Expressions |
|
|
400 | (6) |
|
|
401 | (1) |
|
Functions and schema references |
|
|
402 | (2) |
|
Structured syntax and nesting |
|
|
404 | (1) |
|
|
405 | (1) |
|
|
406 | (2) |
|
|
408 | (2) |
|
Zero, empty, and everything else |
|
|
408 | (1) |
|
|
409 | (1) |
|
|
409 | (1) |
|
Variables --- Calculation, Script, and Global |
|
|
410 | (2) |
|
Declaring calculation variables --- the Let() function |
|
|
410 | (1) |
|
Understanding variables' scope |
|
|
411 | (1) |
|
Benefiting from variables in a calculation |
|
|
412 | (1) |
|
Text Processing and Parsing Functions |
|
|
412 | (7) |
|
Substitute, Replace, and Trim |
|
|
413 | (1) |
|
|
414 | (1) |
|
Position and PatternCount |
|
|
415 | (2) |
|
|
417 | (1) |
|
|
418 | (1) |
|
Text Formatting Operations |
|
|
419 | (2) |
|
|
419 | (1) |
|
|
419 | (1) |
|
Applying selective formatting |
|
|
420 | (1) |
|
|
420 | (1) |
|
Dates, Times, and Timestamps |
|
|
421 | (3) |
|
How FileMaker manages dates |
|
|
421 | (1) |
|
|
422 | (1) |
|
The number of seconds in 2007 years |
|
|
423 | (1) |
|
Juggling days, months, and years |
|
|
423 | (1) |
|
|
424 | (3) |
|
Using aggregate functions |
|
|
425 | (1) |
|
The ballad of Max and Min |
|
|
426 | (1) |
|
Referencing summary fields |
|
|
426 | (1) |
|
|
427 | (4) |
|
Retrieving values as a list |
|
|
427 | (1) |
|
Managing lists --- the xValues functions |
|
|
428 | (1) |
|
Extracting one value from a list |
|
|
429 | (1) |
|
Adding or inserting a list value |
|
|
430 | (1) |
|
Removing a value from a list |
|
|
430 | (1) |
|
|
431 | (3) |
|
Building blocks with GetField() |
|
|
432 | (1) |
|
|
432 | (2) |
|
|
434 | (2) |
|
Why and when calculations are unstored |
|
|
434 | (1) |
|
Understanding the benefits and trade-offs of unstored calculations |
|
|
435 | (1) |
|
Discovering the hidden secrets of unstored calcs |
|
|
435 | (1) |
|
Calculation Fields versus Auto-Enter Calculations |
|
|
436 | (3) |
|
The user over-ride capability |
|
|
436 | (2) |
|
Auto-enter calculations and storage |
|
|
438 | (1) |
|
The Do Not Replace option |
|
|
439 | (1) |
|
|
439 | (3) |
|
The moon follows you everywhere |
|
|
440 | (1) |
|
Managing global dependencies |
|
|
440 | (2) |
|
The freedom and efficiency of global calculations |
|
|
442 | (1) |
|
|
442 | (2) |
|
|
442 | (1) |
|
|
443 | (1) |
|
Calculations Using Custom Functions |
|
|
444 | (3) |
|
Your Code's Documentation |
|
|
447 | (2) |
|
|
447 | (1) |
|
|
448 | (1) |
|
|
449 | (52) |
|
Scripting the Control of Objects and Interface |
|
|
450 | (4) |
|
Addressing objects by name |
|
|
450 | (2) |
|
Locking down the interface |
|
|
452 | (1) |
|
Managing user interaction |
|
|
452 | (2) |
|
|
454 | (6) |
|
Retrieving error codes appropriately |
|
|
455 | (1) |
|
What the error codes mean |
|
|
456 | (1) |
|
Why bother with error handling? |
|
|
456 | (1) |
|
|
457 | (3) |
|
Scripts and Access Privileges |
|
|
460 | (2) |
|
|
461 | (1) |
|
Run script with full access privileges |
|
|
461 | (1) |
|
Determining the substantive privileges |
|
|
462 | (1) |
|
Automating the Automation |
|
|
462 | (4) |
|
Defining a script to run on file open |
|
|
463 | (1) |
|
Housekeeping practices for start-up scripts |
|
|
464 | (1) |
|
Scripts that run on file close |
|
|
465 | (1) |
|
Harnessing the Power of Parameters, Results, and Variables |
|
|
466 | (9) |
|
Getting data into a script |
|
|
466 | (1) |
|
Branching according to state |
|
|
467 | (1) |
|
|
468 | (2) |
|
Passing and retrieving multiple parameters |
|
|
470 | (3) |
|
Specifying and retrieving a script result |
|
|
473 | (1) |
|
Storing and accumulating data as you go |
|
|
474 | (1) |
|
Dynamic and Indirect Controls in ScriptMaker |
|
|
475 | (5) |
|
Example-Go to Layout by name or number |
|
|
476 | (1) |
|
Dynamic file paths using variables |
|
|
477 | (1) |
|
Dynamically building Find criteria |
|
|
478 | (1) |
|
Editing field data on the fly (indirection) |
|
|
479 | (1) |
|
|
480 | (4) |
|
Nested and sequential If/Else conditions |
|
|
481 | (1) |
|
|
481 | (1) |
|
Specifying exit conditions |
|
|
482 | (2) |
|
|
484 | (1) |
|
|
484 | (1) |
|
|
485 | (1) |
|
Scripted Window Management |
|
|
485 | (5) |
|
Addressing windows by name (title) |
|
|
486 | (2) |
|
Moving and resizing windows |
|
|
488 | (1) |
|
Determining window dimensions |
|
|
488 | (1) |
|
Creating windows off-screen |
|
|
489 | (1) |
|
Freezing and refreshing the screen |
|
|
489 | (1) |
|
Scripting Data Import and Export |
|
|
490 | (7) |
|
|
490 | (1) |
|
|
491 | (1) |
|
Selecting fields for export |
|
|
492 | (1) |
|
|
493 | (1) |
|
|
494 | (1) |
|
Synchronizing and updating data |
|
|
494 | (1) |
|
|
495 | (1) |
|
Loading and unloading container objects |
|
|
496 | (1) |
|
Pivoting Data between Tables |
|
|
497 | (2) |
|
Using utility relationships |
|
|
497 | (1) |
|
Managing related data (walking through related records) |
|
|
498 | (1) |
|
Going over Some Practical Examples |
|
|
499 | (2) |
|
|
499 | (1) |
|
Building a multi-part PDF report |
|
|
499 | (2) |
|
Part IV: Integrity and Security |
|
|
501 | (102) |
|
In Control with FileMaker Security |
|
|
503 | (26) |
|
|
503 | (3) |
|
|
504 | (1) |
|
|
504 | (1) |
|
|
504 | (1) |
|
Protecting your investment |
|
|
504 | (1) |
|
Interface vulnerabilities |
|
|
505 | (1) |
|
Taking things at interface value |
|
|
505 | (1) |
|
More than a semblance of security |
|
|
505 | (1) |
|
|
506 | (1) |
|
|
506 | (4) |
|
Concepts of role-based security |
|
|
507 | (1) |
|
Defining and constraining access |
|
|
508 | (1) |
|
Schema privilege controls |
|
|
509 | (1) |
|
|
510 | (4) |
|
Access to value lists and scripts |
|
|
510 | (1) |
|
The two dimensions of layout access |
|
|
511 | (1) |
|
Privileges for table, record, and field access |
|
|
511 | (2) |
|
Using and managing extended privileges |
|
|
513 | (1) |
|
|
514 | (3) |
|
|
515 | (1) |
|
Internal and external authentication |
|
|
516 | (1) |
|
Scripted Account Management |
|
|
517 | (3) |
|
Provision for automation of database security |
|
|
517 | (1) |
|
Working with multi-file solutions |
|
|
518 | (1) |
|
Safe scripting implementations |
|
|
519 | (1) |
|
Creating a Custom Logout Option |
|
|
520 | (3) |
|
|
520 | (1) |
|
Structuring a solution for logging out |
|
|
521 | (1) |
|
|
522 | (1) |
|
How Much Security Is Enough? |
|
|
523 | (1) |
|
|
523 | (1) |
|
A balanced view of threats 523 |
|
|
523 | (1) |
|
A strategic model for response |
|
|
524 | (1) |
|
The Importance of Physical File Security |
|
|
524 | (2) |
|
|
524 | (1) |
|
Alternative forms of protection |
|
|
525 | (1) |
|
|
525 | (1) |
|
Security in Deployment: FileMaker Server |
|
|
526 | (3) |
|
Filtered display of files |
|
|
526 | (1) |
|
Secure Socket Layer encryption |
|
|
527 | (1) |
|
|
527 | (2) |
|
Maintaining Referential Integrity |
|
|
529 | (18) |
|
Pinpointing Common Causes of Referential Integrity Problems |
|
|
529 | (1) |
|
The potential impact on your solution |
|
|
530 | (1) |
|
|
530 | (1) |
|
|
530 | (2) |
|
|
531 | (1) |
|
Keys and meaning (existence, persistence, uniqueness) |
|
|
532 | (1) |
|
|
532 | (4) |
|
|
532 | (2) |
|
|
534 | (1) |
|
Unique identification (UID) values |
|
|
535 | (1) |
|
Exploring Keys and Data Type |
|
|
536 | (1) |
|
|
537 | (2) |
|
Deleting Redundant Records |
|
|
539 | (4) |
|
The use of cascading deletion |
|
|
539 | (1) |
|
Configuring relationships for referential integrity |
|
|
540 | (1) |
|
Privilege requirements for cascade delete |
|
|
541 | (1) |
|
Controlled cascading deletes at runtime |
|
|
542 | (1) |
|
Considering Other Integrity Issues |
|
|
543 | (1) |
|
Lookups and when to use them |
|
|
543 | (1) |
|
Auto-entry lookups and references |
|
|
544 | (1) |
|
|
544 | (1) |
|
|
544 | (3) |
|
|
545 | (1) |
|
Indirect object/element references |
|
|
545 | (1) |
|
|
545 | (1) |
|
|
546 | (1) |
|
Making FileMaker Systems Fail-Safe |
|
|
547 | (34) |
|
|
547 | (4) |
|
Successful backup strategies |
|
|
548 | (1) |
|
|
548 | (1) |
|
An appropriate backup cycle |
|
|
548 | (1) |
|
|
549 | (1) |
|
|
549 | (1) |
|
Back up the code, not just the data |
|
|
549 | (1) |
|
The hazards of copying open files |
|
|
549 | (1) |
|
|
550 | (1) |
|
|
551 | (1) |
|
A Comprehensive Approach to Error Trapping |
|
|
551 | (4) |
|
Dealing with record locking |
|
|
552 | (2) |
|
Techniques to avoid in multi-user or multi-window environments |
|
|
554 | (1) |
|
|
554 | (1) |
|
Record marking and flagging techniques |
|
|
555 | (1) |
|
|
555 | (1) |
|
|
555 | (6) |
|
|
556 | (2) |
|
|
558 | (1) |
|
|
558 | (1) |
|
|
559 | (1) |
|
|
560 | (1) |
|
Temporary Edit Interface Techniques |
|
|
561 | (3) |
|
|
562 | (1) |
|
The legitimate purpose of record locking |
|
|
563 | (1) |
|
Creating double-blind entry systems |
|
|
563 | (1) |
|
Field Masking, Filtering, and Error Rejection |
|
|
564 | (3) |
|
Applying standard data formations |
|
|
565 | (1) |
|
Dealing with trailing spaces and carriage returns |
|
|
566 | (1) |
|
Rejecting out-of-scope characters |
|
|
567 | (1) |
|
Handling styled source text |
|
|
567 | (1) |
|
Built-in Logging Capabilities |
|
|
567 | (2) |
|
Making use of auto-enter options |
|
|
567 | (1) |
|
Capturing and extending standard metadata |
|
|
568 | (1) |
|
|
569 | (2) |
|
Infrastructure for script logging |
|
|
569 | (1) |
|
Tracking script execution |
|
|
570 | (1) |
|
Script-specific context variables |
|
|
571 | (1) |
|
|
571 | (1) |
|
Capturing User Edits in Detail |
|
|
571 | (4) |
|
Trapping edits, field-by-field |
|
|
572 | (1) |
|
Incorporating ancillary data |
|
|
573 | (1) |
|
|
574 | (1) |
|
Managing the Accumulation of Log Data |
|
|
575 | (1) |
|
|
575 | (1) |
|
Generating secondary output |
|
|
575 | (1) |
|
Implementing Roll-Back Capabilities |
|
|
576 | (2) |
|
|
576 | (1) |
|
Alternative undo and roll-back capabilities |
|
|
577 | (1) |
|
Using logs to roll forward |
|
|
578 | (1) |
|
Alternative Logging Approaches |
|
|
578 | (3) |
|
|
579 | (1) |
|
Scripted and triggered logging |
|
|
579 | (2) |
|
Maintaining and Restoring Data |
|
|
581 | (22) |
|
Some Notes on File Recovery |
|
|
581 | (4) |
|
Debunking common myths and misconceptions |
|
|
582 | (1) |
|
|
582 | (1) |
|
|
583 | (1) |
|
Understanding file corruption |
|
|
584 | (1) |
|
Exporting and Importing Data |
|
|
585 | (4) |
|
File format considerations |
|
|
586 | (1) |
|
Exporting to and importing from a folder |
|
|
587 | (2) |
|
Delimiters and EOL markers |
|
|
589 | (1) |
|
Data Cleansing Operations |
|
|
589 | (5) |
|
Extract, transform, and load |
|
|
589 | (1) |
|
Data format considerations |
|
|
590 | (1) |
|
|
590 | (1) |
|
|
591 | (1) |
|
|
592 | (1) |
|
Filtering capabilities in FileMaker |
|
|
592 | (2) |
|
|
594 | (3) |
|
|
595 | (1) |
|
|
596 | (1) |
|
Handling Embedded Images and Stored Files |
|
|
597 | (3) |
|
Assigning and retrieving paths |
|
|
599 | (1) |
|
|
599 | (1) |
|
Text-Handling Considerations |
|
|
600 | (3) |
|
|
600 | (1) |
|
Designing a custom export process |
|
|
601 | (2) |
|
|
603 | (82) |
|
FileMaker Pro Advanced Features |
|
|
605 | (34) |
|
|
605 | (4) |
|
|
606 | (1) |
|
Debugging restricted privilege scripts |
|
|
607 | (1) |
|
Getting used to the Debugger controls |
|
|
607 | (2) |
|
|
609 | (6) |
|
|
610 | (1) |
|
|
610 | (2) |
|
|
612 | (1) |
|
Using the Viewer with the Debugger |
|
|
613 | (1) |
|
|
613 | (1) |
|
The Data Viewer and variables |
|
|
614 | (1) |
|
|
615 | (2) |
|
|
616 | (1) |
|
Mining the DDR for information |
|
|
616 | (1) |
|
Tools and techniques for interpreting DDR data |
|
|
617 | (1) |
|
|
617 | (2) |
|
|
618 | (1) |
|
|
618 | (1) |
|
The Save a Copy As/Compacted alternative |
|
|
618 | (1) |
|
|
619 | (2) |
|
Using conditional tooltips |
|
|
620 | (1) |
|
Keeping track of tooltips |
|
|
620 | (1) |
|
|
621 | (6) |
|
|
621 | (1) |
|
|
622 | (1) |
|
Benefits of the Script Step action |
|
|
623 | (1) |
|
Benefits of window widgets |
|
|
624 | (1) |
|
|
624 | (1) |
|
Assigning menu sets throughout your file |
|
|
624 | (1) |
|
Setting the default menu set for a file |
|
|
624 | (1) |
|
Determining a menu set for each layout |
|
|
625 | (1) |
|
Controlling menu sets via script |
|
|
626 | (1) |
|
|
627 | (4) |
|
Defining custom functions |
|
|
627 | (2) |
|
Custom functions as an aid to syntax readability |
|
|
629 | (1) |
|
Maximizing efficiency and ease of use |
|
|
630 | (1) |
|
Custom Functions and Recursion |
|
|
631 | (4) |
|
Things that only custom functions can do |
|
|
632 | (1) |
|
The stack and the limits of recursion |
|
|
633 | (1) |
|
Tail recursion in practice |
|
|
633 | (1) |
|
|
634 | (1) |
|
Creating an acronym from a supplied phrase |
|
|
634 | (1) |
|
Extracting a character set from a supplied block of text |
|
|
634 | (1) |
|
Removing an unspecified number of leading carriage returns |
|
|
635 | (1) |
|
Creating Runtime Applications |
|
|
635 | (4) |
|
Generating a stand-alone solution |
|
|
636 | (1) |
|
Binding for each platform |
|
|
637 | (1) |
|
|
637 | (2) |
|
Efficient Code, Efficient Solutions |
|
|
639 | (22) |
|
Designing for Scale: Size Considerations |
|
|
639 | (2) |
|
The elephant in the cherry tree |
|
|
640 | (1) |
|
Predicting what will scale well |
|
|
640 | (1) |
|
|
641 | (2) |
|
Avoiding duplication of elements |
|
|
641 | (1) |
|
Using portable and reusable code |
|
|
642 | (1) |
|
Appropriate use of sub-scripts |
|
|
642 | (1) |
|
Appropriate use of custom functions |
|
|
643 | (1) |
|
Designing for Flexibility and Adaptability |
|
|
643 | (2) |
|
Layouts and adaptable design |
|
|
644 | (1) |
|
Concepts of reusability applied to the Relationships Graph |
|
|
644 | (1) |
|
Traveling the Shortest Distance Between Two Points |
|
|
645 | (9) |
|
Optimal calculation syntax |
|
|
645 | (2) |
|
Alternative syntax examples |
|
|
647 | (1) |
|
Working with modifier keys |
|
|
648 | (1) |
|
Working with Boolean values |
|
|
649 | (1) |
|
Avoiding dependency ``spaghetti'' |
|
|
650 | (3) |
|
Applying simplicity principles |
|
|
653 | (1) |
|
|
654 | (4) |
|
|
654 | (1) |
|
Posting edits and propagating edits to related records |
|
|
655 | (1) |
|
Offline updates and processing |
|
|
655 | (1) |
|
Robots and batch automation |
|
|
656 | (1) |
|
Host/server script execution |
|
|
656 | (2) |
|
|
658 | (2) |
|
Dealing with data in chunks |
|
|
658 | (1) |
|
Modularization strategies |
|
|
658 | (1) |
|
|
659 | (1) |
|
|
659 | (1) |
|
Images and Media in Databases |
|
|
660 | (1) |
|
Extending FileMaker's Capabilities |
|
|
661 | (24) |
|
|
661 | (8) |
|
Using Send Event and VBScript |
|
|
662 | (1) |
|
Using VBScript with FileMaker Pro |
|
|
662 | (3) |
|
|
665 | (2) |
|
Cross-platform solutions and external script calls |
|
|
667 | (1) |
|
Third-party helpers and macros |
|
|
668 | (1) |
|
Rendering HTML and JavaScript |
|
|
669 | (2) |
|
|
669 | (1) |
|
Bringing services to your solution |
|
|
669 | (1) |
|
|
670 | (1) |
|
|
671 | (1) |
|
|
671 | (1) |
|
|
671 | (1) |
|
|
672 | (8) |
|
Installing and enabling plug-ins |
|
|
672 | (2) |
|
|
674 | (1) |
|
|
675 | (1) |
|
Robust triggering implementations |
|
|
675 | (2) |
|
Available script triggering plug-ins |
|
|
677 | (1) |
|
|
677 | (1) |
|
|
678 | (1) |
|
|
679 | (1) |
|
Charting and other functionality |
|
|
679 | (1) |
|
|
680 | (3) |
|
|
680 | (1) |
|
|
681 | (1) |
|
Working with XML and XSLT |
|
|
681 | (1) |
|
|
682 | (1) |
|
FileMaker's PHP Site Assistant |
|
|
682 | (1) |
|
Finding Third-Party Tools |
|
|
683 | (2) |
|
|
683 | (1) |
|
Analysis and documentation |
|
|
683 | (1) |
|
|
684 | (1) |
|
|
685 | (2) |
|
|
687 | (16) |
|
Appendix B: Expanding Your Knowledge with Additional Resources |
|
|
703 | (6) |
|
|
703 | (1) |
|
Professional Consulting and Development Services |
|
|
704 | (1) |
|
Online Design and Development Tips and Tricks |
|
|
705 | (1) |
|
Online Forums and Mailing Lists |
|
|
706 | (1) |
|
|
707 | (2) |
|
Appendix C: About the Web Site |
|
|
709 | (2) |
|
|
709 | (1) |
|
|
710 | (1) |
Index |
|
711 | |