Acknowledgments |
|
xxx | |
Introduction |
|
xxxi | |
|
|
1 | (108) |
|
Databases: The What, Why, and How |
|
|
3 | (18) |
|
The Many Faces of Databases: Lists, Tables and Forms |
|
|
4 | (2) |
|
The limitations of paper-based databases |
|
|
4 | (1) |
|
|
5 | (1) |
|
Preparing to get organized |
|
|
6 | (1) |
|
The Concept of a Relational Database |
|
|
6 | (2) |
|
Flat-file databases and data redundancy |
|
|
7 | (1) |
|
Opportunities for making connections |
|
|
7 | (1) |
|
The Anatomy of a Database Solution |
|
|
8 | (5) |
|
The data: Foundation and substance |
|
|
8 | (1) |
|
The interface: Screens, letters, forms, and reports |
|
|
9 | (3) |
|
The hidden helper: Process management |
|
|
12 | (1) |
|
|
13 | (8) |
|
What FileMaker Pro calls things |
|
|
13 | (4) |
|
Familiar ideas from the real world |
|
|
17 | (1) |
|
Integrating processes and information |
|
|
18 | (1) |
|
Knowledge is power---personal and professional |
|
|
18 | (3) |
|
Putting FileMaker Pro in Perspective |
|
|
21 | (14) |
|
What Makes FileMaker Pro Different from Other Database Development Tools? |
|
|
22 | (4) |
|
Some common misperceptions |
|
|
22 | (3) |
|
A unique approach to design |
|
|
25 | (1) |
|
The FileMaker Product Family |
|
|
26 | (2) |
|
|
26 | (1) |
|
Scalability and flexibility |
|
|
27 | (1) |
|
FileMaker's Hidden Talents |
|
|
28 | (4) |
|
The cross-platform chameleon |
|
|
28 | (1) |
|
Multiple technologies and formats |
|
|
29 | (1) |
|
Plug-ins and extensibility |
|
|
30 | (1) |
|
The FileMaker calculation engine: Simplicity and power |
|
|
31 | (1) |
|
|
32 | (3) |
|
Examples and brainteasers |
|
|
32 | (1) |
|
Other resources and opportunities |
|
|
33 | (2) |
|
Getting Acquainted with FileMaker |
|
|
35 | (28) |
|
Getting FileMaker Working for you |
|
|
35 | (6) |
|
Starting and exiting from FileMaker |
|
|
36 | (1) |
|
Creating, saving, and closing files |
|
|
37 | (1) |
|
Handling files and data safely |
|
|
38 | (2) |
|
Earlier file formats and conversion issues |
|
|
40 | (1) |
|
|
41 | (7) |
|
|
43 | (1) |
|
Navigating and viewing data |
|
|
43 | (2) |
|
Searching and the FileMaker Find/Omit puzzle |
|
|
45 | (2) |
|
Screen elements and what they're for |
|
|
47 | (1) |
|
Entering and Editing Data |
|
|
48 | (2) |
|
Creating and duplicating records |
|
|
48 | (1) |
|
Field definitions: Validation and dependencies |
|
|
49 | (1) |
|
The significance of commitment |
|
|
49 | (1) |
|
|
50 | (4) |
|
Importing and exporting data |
|
|
51 | (1) |
|
Previewing and printing options |
|
|
52 | (1) |
|
Send/Save as PDF and Excel |
|
|
53 | (1) |
|
Getting to Know the Relatives |
|
|
54 | (1) |
|
Ways to view and edit related data |
|
|
54 | (1) |
|
The importance of context |
|
|
55 | (1) |
|
Making complexity simple in practice |
|
|
55 | (1) |
|
Optimizing the Application |
|
|
55 | (8) |
|
Preference settings for your workstation |
|
|
56 | (3) |
|
File options for the current database |
|
|
59 | (4) |
|
What's New in FileMaker 10 |
|
|
63 | (46) |
|
|
63 | (1) |
|
|
64 | (4) |
|
Live Reports/Sub-summaries |
|
|
68 | (2) |
|
Maintain Record Sort Order |
|
|
70 | (2) |
|
|
72 | (4) |
|
|
76 | (1) |
|
|
77 | (11) |
|
|
78 | (3) |
|
|
81 | (3) |
|
Timed interval script triggers |
|
|
84 | (1) |
|
File-based script triggers |
|
|
85 | (1) |
|
|
85 | (3) |
|
New Calculation Functions |
|
|
88 | (4) |
|
|
88 | (1) |
|
|
89 | (1) |
|
|
89 | (1) |
|
|
90 | (1) |
|
|
90 | (1) |
|
Get(DocumentsPathListing) |
|
|
91 | (1) |
|
External SQL Data Sources (ESS) Enhancements |
|
|
92 | (2) |
|
Additional SQL database support |
|
|
92 | (1) |
|
Value lists based on external SQL data |
|
|
92 | (1) |
|
Single Sign-On for remote Windows clients |
|
|
92 | (2) |
|
Handling of DATETIME values---MS SQL Server |
|
|
94 | (1) |
|
|
94 | (2) |
|
File Recovery Improvements |
|
|
96 | (2) |
|
|
98 | (1) |
|
Inserting an object into the tab order |
|
|
98 | (1) |
|
|
99 | (1) |
|
Additional font sizes in the format menu |
|
|
99 | (1) |
|
|
99 | (1) |
|
Quick Start Screen Enhancements |
|
|
100 | (2) |
|
Import/Export Enhancements |
|
|
102 | (2) |
|
|
104 | (1) |
|
The Manage Scripts Interface |
|
|
105 | (1) |
|
Other Useful Enhancements |
|
|
106 | (3) |
|
|
106 | (1) |
|
Format changes for automatically generated log files |
|
|
106 | (1) |
|
Updated templates and themes |
|
|
107 | (1) |
|
FileMaker Pro Advanced Script Debugger enhancements |
|
|
107 | (1) |
|
Relookup Replace and Field Contents no longer commit |
|
|
107 | (1) |
|
Only a single sharing error for multiple files |
|
|
107 | (1) |
|
Script error codes and control commands |
|
|
108 | (1) |
|
Part II: Introduction to Database Design |
|
|
109 | (194) |
|
|
111 | (44) |
|
|
111 | (1) |
|
Creating a New Database File |
|
|
112 | (23) |
|
|
114 | (3) |
|
|
117 | (1) |
|
|
117 | (1) |
|
|
117 | (1) |
|
|
117 | (1) |
|
Working with the Field Options dialog: Validation and Auto-Entry |
|
|
118 | (6) |
|
Setting up simple calculations |
|
|
124 | (3) |
|
Capturing simple metadata |
|
|
127 | (2) |
|
Creating relationships between tables |
|
|
129 | (3) |
|
|
132 | (3) |
|
Viewing and Interacting with Data |
|
|
135 | (8) |
|
Looking at the multiple uses of layouts |
|
|
136 | (1) |
|
Creating records and entering data |
|
|
136 | (5) |
|
|
141 | (1) |
|
Finding and sorting data you've already entered |
|
|
141 | (1) |
|
Using special find symbols |
|
|
142 | (1) |
|
Searching with the range and wild card operators |
|
|
143 | (1) |
|
Avoiding the Need for Data Duplication |
|
|
143 | (5) |
|
Recognizing the visual cues to data relationships |
|
|
144 | (1) |
|
Information has a logical flow |
|
|
144 | (2) |
|
|
146 | (2) |
|
Making complex things simple |
|
|
148 | (1) |
|
Getting Started with File Security |
|
|
148 | (4) |
|
Working with accounts and privilege sets |
|
|
148 | (3) |
|
Setting a default account and password |
|
|
151 | (1) |
|
|
152 | (3) |
|
|
153 | (1) |
|
|
153 | (1) |
|
|
154 | (1) |
|
|
154 | (1) |
|
Using buttons for static and dynamic actions |
|
|
154 | (1) |
|
The Interface: Layout Mode |
|
|
155 | (50) |
|
|
155 | (16) |
|
|
158 | (1) |
|
Selection and then Action tools |
|
|
158 | (1) |
|
|
158 | (2) |
|
Palette and Menu controls |
|
|
160 | (1) |
|
Organizing the presentation of information |
|
|
160 | (2) |
|
Applying formats to field and text objects |
|
|
162 | (4) |
|
Setting up layouts for printing |
|
|
166 | (2) |
|
Understanding lists and forms |
|
|
168 | (2) |
|
Layout parts and their purposes |
|
|
170 | (1) |
|
The Importance of Visual Structure |
|
|
171 | (4) |
|
Adding visual pointers and aids |
|
|
172 | (2) |
|
|
174 | (1) |
|
Ergonomics and avoiding visual fatigue |
|
|
174 | (1) |
|
Giving information meaning |
|
|
175 | (1) |
|
|
175 | (2) |
|
Using conditional tooltips |
|
|
176 | (1) |
|
Keeping track of tooltips |
|
|
177 | (1) |
|
Different Kinds of Layout Objects |
|
|
177 | (4) |
|
Static and dynamic objects |
|
|
178 | (1) |
|
Inherent object properties |
|
|
179 | (1) |
|
Conditional format attributes |
|
|
179 | (2) |
|
FileMaker as a Graphical Environment |
|
|
181 | (4) |
|
Building graphic objects in FileMaker |
|
|
181 | (2) |
|
Default object formats and attributes |
|
|
183 | (1) |
|
Controlling stacking and alignment |
|
|
183 | (1) |
|
Bringing in graphics from other applications |
|
|
184 | (1) |
|
Interacting with Layout Objects |
|
|
185 | (3) |
|
Keyboard control of a layout |
|
|
185 | (1) |
|
|
186 | (1) |
|
Assigning names to layout objects |
|
|
186 | (1) |
|
Controlling visual spell-checking |
|
|
187 | (1) |
|
The Tab Control and Its Uses |
|
|
188 | (3) |
|
Defining and creating a tab panel |
|
|
188 | (1) |
|
Navigating between tab panels |
|
|
189 | (1) |
|
|
190 | (1) |
|
|
191 | (4) |
|
Working within layout context |
|
|
191 | (1) |
|
|
191 | (4) |
|
|
195 | (5) |
|
|
196 | (2) |
|
Button scope and button commands |
|
|
198 | (1) |
|
|
199 | (1) |
|
The Web Viewer: Inviting in the World |
|
|
200 | (2) |
|
|
200 | (1) |
|
|
201 | (1) |
|
Complementary data concepts |
|
|
202 | (1) |
|
|
202 | (3) |
|
Considerations for printed output |
|
|
202 | (1) |
|
|
202 | (1) |
|
Page sizes and page setup |
|
|
203 | (1) |
|
Paper output versus PDF or Excel output |
|
|
204 | (1) |
|
Composite PDFs from multiple layouts |
|
|
204 | (1) |
|
The Structure: The Manage Database Dialog |
|
|
205 | (56) |
|
|
206 | (6) |
|
Table concepts: A room with a view |
|
|
206 | (1) |
|
Adding, deleting, and renaming tables |
|
|
206 | (2) |
|
Moving tables between files |
|
|
208 | (1) |
|
|
209 | (3) |
|
|
212 | (16) |
|
Adding, deleting, and renaming fields |
|
|
213 | (1) |
|
Understanding field/data types and their significance |
|
|
214 | (2) |
|
|
216 | (2) |
|
|
218 | (3) |
|
Storage and indexing options |
|
|
221 | (1) |
|
Summary and Calculation fields |
|
|
222 | (5) |
|
Working with global fields |
|
|
227 | (1) |
|
|
228 | (13) |
|
Creating a Calculation field |
|
|
229 | (4) |
|
Defining a calculation formula |
|
|
233 | (1) |
|
|
234 | (1) |
|
|
235 | (1) |
|
Understanding calculation functions and their syntax |
|
|
236 | (1) |
|
|
236 | (1) |
|
|
237 | (1) |
|
|
237 | (1) |
|
|
237 | (1) |
|
|
237 | (1) |
|
Doing some simple calculations |
|
|
238 | (1) |
|
Commission on earnings above a threshold |
|
|
238 | (1) |
|
Calculating initials from a person's name |
|
|
239 | (1) |
|
Compound interest at a known rate over a given period |
|
|
239 | (1) |
|
Current quarter of the calendar year |
|
|
240 | (1) |
|
Changing ampersands to ``and'' in a block of text |
|
|
240 | (1) |
|
Record navigation text (record n of nn) |
|
|
240 | (1) |
|
|
241 | (6) |
|
Common misconceptions about the Relationships Graph |
|
|
241 | (2) |
|
Tables versus Table Occurrences |
|
|
243 | (1) |
|
Avoiding circular references |
|
|
244 | (1) |
|
Named and unnamed data sources |
|
|
245 | (1) |
|
Creating references to other FileMaker files |
|
|
246 | (1) |
|
Working with External SQL Data Sources |
|
|
247 | (10) |
|
Configuring ODBC drivers: Setting up a DSN |
|
|
247 | (5) |
|
Integrating SQL tables with FileMaker data |
|
|
252 | (4) |
|
Adding supplemental fields |
|
|
256 | (1) |
|
The Concept of Data Relationships |
|
|
257 | (4) |
|
Why bother with relationships anyway? |
|
|
257 | (1) |
|
|
258 | (1) |
|
Solving problems by using relationships |
|
|
258 | (1) |
|
|
259 | (1) |
|
The FileMaker relational model |
|
|
259 | (2) |
|
The Processes: FileMaker Scripting |
|
|
261 | (42) |
|
Scripting: What It Is and What It Offers You |
|
|
261 | (7) |
|
Building blocks of automation |
|
|
264 | (2) |
|
|
266 | (1) |
|
|
267 | (1) |
|
Addressing objects by name |
|
|
267 | (1) |
|
Defining and Editing Scripts |
|
|
268 | (10) |
|
|
268 | (3) |
|
Setting up a basic script |
|
|
271 | (2) |
|
How script commands function |
|
|
273 | (1) |
|
Changing the order of commands |
|
|
274 | (2) |
|
Assigning attributes to a command |
|
|
276 | (2) |
|
|
278 | (2) |
|
Managing the Scripts menu |
|
|
278 | (1) |
|
Other ways to trigger a script |
|
|
279 | (1) |
|
Using the single-threaded script engine |
|
|
279 | (1) |
|
Working with the script stack and paused scripts |
|
|
280 | (1) |
|
Controlling Script Execution |
|
|
280 | (4) |
|
Using conditional statements |
|
|
281 | (1) |
|
|
282 | (1) |
|
|
283 | (1) |
|
|
284 | (3) |
|
Navigation and view controls |
|
|
285 | (1) |
|
Editing information via scripts |
|
|
286 | (1) |
|
Printing and managing files |
|
|
286 | (1) |
|
Ease of Editing in FileMaker Scripting |
|
|
287 | (2) |
|
Selecting and duplicating multiple commands |
|
|
288 | (1) |
|
Copying and pasting scripts |
|
|
288 | (1) |
|
Copying and pasting script steps |
|
|
289 | (1) |
|
|
289 | (6) |
|
|
289 | (1) |
|
|
290 | (1) |
|
|
291 | (2) |
|
Reordering and grouping scripts |
|
|
293 | (1) |
|
Filtering scripts by folder |
|
|
293 | (1) |
|
Searching for scripts by name |
|
|
294 | (1) |
|
Some Examples to Start With |
|
|
295 | (2) |
|
|
295 | (1) |
|
|
295 | (1) |
|
|
296 | (1) |
|
|
297 | (6) |
|
|
297 | (1) |
|
|
297 | (1) |
|
Scripts assigned to custom menu commands |
|
|
298 | (1) |
|
|
298 | (1) |
|
Calling scripts from other scripts |
|
|
298 | (1) |
|
|
299 | (1) |
|
File Open and File Close scripts |
|
|
299 | (1) |
|
Layout event Script Triggers |
|
|
299 | (1) |
|
Object event Script Triggers |
|
|
300 | (1) |
|
|
301 | (2) |
|
Part III: Beyond the Basic |
|
|
303 | (250) |
|
|
305 | (46) |
|
Making Browse Mode Work for You |
|
|
306 | (11) |
|
Using multiple windows and views |
|
|
306 | (1) |
|
Filtering portals and creating pick lists |
|
|
306 | (7) |
|
Jump buttons: Shortcut navigation |
|
|
313 | (4) |
|
Controlling one window from another |
|
|
317 | (1) |
|
Performing Complex Search Operations |
|
|
317 | (6) |
|
Compound Find criteria: The And Find |
|
|
318 | (1) |
|
Stacking Find requests: The Or Find |
|
|
318 | (1) |
|
Constraining and extending the found set |
|
|
319 | (1) |
|
Saving Finds and found sets |
|
|
319 | (4) |
|
|
323 | (10) |
|
|
324 | (1) |
|
|
324 | (3) |
|
Creating click-sort columns |
|
|
327 | (5) |
|
|
332 | (1) |
|
|
333 | (5) |
|
The management of formatting: A three-tiered approach |
|
|
334 | (1) |
|
Character-level formatting |
|
|
334 | (1) |
|
Paragraph-level formatting |
|
|
335 | (1) |
|
|
335 | (1) |
|
Precedence of number, date, and time formats |
|
|
336 | (1) |
|
Controlling formatting programmatically |
|
|
336 | (1) |
|
|
337 | (1) |
|
|
338 | (3) |
|
The three kinds of variables |
|
|
339 | (1) |
|
Variables and memory usage |
|
|
339 | (1) |
|
Instantiating and destroying variables |
|
|
340 | (1) |
|
Keeping track of variables |
|
|
340 | (1) |
|
|
341 | (5) |
|
|
341 | (1) |
|
|
341 | (1) |
|
|
342 | (1) |
|
|
342 | (1) |
|
Differences between numeric and text indexing |
|
|
343 | (1) |
|
Unicode and alternate language indexes |
|
|
344 | (1) |
|
Optimizing field index configurations |
|
|
345 | (1) |
|
The Table of Dependencies |
|
|
346 | (1) |
|
Cascading calculation operations |
|
|
346 | (1) |
|
|
346 | (1) |
|
|
347 | (1) |
|
|
347 | (2) |
|
What caching does for you |
|
|
347 | (1) |
|
|
348 | (1) |
|
Gaining control of the cache |
|
|
349 | (1) |
|
Understanding Global Fields |
|
|
349 | (2) |
|
The behavior of global fields |
|
|
349 | (1) |
|
|
350 | (1) |
|
When to avoid global fields |
|
|
350 | (1) |
|
Using global calculation fields |
|
|
350 | (1) |
|
Building Advanced Interfaces |
|
|
351 | (54) |
|
Developing for Mac and Windows Users |
|
|
352 | (4) |
|
|
352 | (1) |
|
Paying attention to differences in screen rendering |
|
|
353 | (1) |
|
Considering platform-specific window behavior |
|
|
354 | (2) |
|
Using Dynamic Screen Elements |
|
|
356 | (6) |
|
Disappearing/reappearing objects |
|
|
356 | (1) |
|
The portal invisibility trick |
|
|
356 | (2) |
|
Concealed and remotely operated Tab Control |
|
|
358 | (2) |
|
Using conditional formatting as a visibility control |
|
|
360 | (1) |
|
The hidden power of conditional formatting |
|
|
360 | (1) |
|
Multi-state buttons and objects |
|
|
361 | (1) |
|
Working with Sub-Summary Parts and Part Controls |
|
|
362 | (6) |
|
Building adaptable screens |
|
|
362 | (1) |
|
Stacking up multiple Sub-summary parts |
|
|
363 | (3) |
|
Using multiple break fields |
|
|
366 | (1) |
|
Controlling pagination and page breaks |
|
|
366 | (2) |
|
|
368 | (5) |
|
|
368 | (1) |
|
Sliding objects and reducing parts |
|
|
369 | (2) |
|
|
371 | (1) |
|
Creating a letter generator |
|
|
372 | (1) |
|
Using Multiple Windows and Views |
|
|
373 | (2) |
|
Managing window placement and size |
|
|
373 | (1) |
|
Windows as pop-ups and drill-downs |
|
|
374 | (1) |
|
Simulating modal window behavior |
|
|
375 | (1) |
|
Employing Custom Dialogs as an Interface Tool |
|
|
375 | (2) |
|
Dialogs as a data-entry device |
|
|
376 | (1) |
|
Dynamic dialog attributes |
|
|
377 | (1) |
|
Looking at Anchors and Resizable Layout Objects |
|
|
377 | (5) |
|
Objects that move according to window size |
|
|
378 | (1) |
|
Objects that grow and shrink |
|
|
379 | (1) |
|
Managing complex layout resizing |
|
|
379 | (3) |
|
Resizing behavior of enclosing objects |
|
|
382 | (1) |
|
Centering objects within the viewable area |
|
|
382 | (1) |
|
Implementing Shortcut Navigation |
|
|
382 | (3) |
|
The power of the Go to Related Record command |
|
|
383 | (1) |
|
One interface, many paths |
|
|
383 | (1) |
|
Building Back button functionality |
|
|
384 | (1) |
|
Building Depth and Dimensionality |
|
|
385 | (2) |
|
Using embossing and engraving effects |
|
|
385 | (1) |
|
Spatial cues for added meaning |
|
|
385 | (1) |
|
Delineation of element groups |
|
|
386 | (1) |
|
|
386 | (1) |
|
Transparency and translucency |
|
|
386 | (1) |
|
Working with Tab Controls |
|
|
387 | (2) |
|
Organizers and space savers |
|
|
387 | (1) |
|
Tab navigation via keyboard |
|
|
388 | (1) |
|
|
389 | (1) |
|
Recognizing the Flexibility of Portals |
|
|
389 | (2) |
|
|
389 | (1) |
|
Portals as a navigation device |
|
|
389 | (1) |
|
Dynamically sorted portals |
|
|
390 | (1) |
|
Innovative portal implementations |
|
|
391 | (1) |
|
Using Advanced Web Viewer Techniques |
|
|
391 | (3) |
|
Access to advanced functionality |
|
|
391 | (1) |
|
Rendering internally calculated content |
|
|
392 | (1) |
|
Scraping data from Web pages |
|
|
393 | (1) |
|
Progress Bars and Native Charting Techniques |
|
|
394 | (3) |
|
Creating script progress monitors |
|
|
395 | (1) |
|
Native indicators and graphical displays |
|
|
396 | (1) |
|
|
397 | (2) |
|
|
397 | (1) |
|
|
398 | (1) |
|
|
398 | (1) |
|
Online Help for your users |
|
|
398 | (1) |
|
Handling User Preferences |
|
|
399 | (6) |
|
A user-centric development philosophy |
|
|
399 | (1) |
|
|
399 | (1) |
|
Example---a multi-lingual solution interface |
|
|
400 | (5) |
|
Data Modeling in FileMaker |
|
|
405 | (42) |
|
Background in Relational Theory |
|
|
405 | (5) |
|
Set Theory in the management of data |
|
|
406 | (1) |
|
|
406 | (1) |
|
Think about clarity of organization |
|
|
407 | (1) |
|
Keep the big picture in view |
|
|
407 | (1) |
|
Remembering some guiding principles |
|
|
408 | (1) |
|
Separate entities by type |
|
|
409 | (1) |
|
|
409 | (1) |
|
Place multiples in a separate table |
|
|
409 | (1) |
|
Store everything once only |
|
|
410 | (1) |
|
Identify the major players |
|
|
410 | (1) |
|
|
410 | (1) |
|
FileMaker Relationships Graph Symbols |
|
|
410 | (3) |
|
|
410 | (2) |
|
|
412 | (1) |
|
Understanding the graph metaphor |
|
|
412 | (1) |
|
|
413 | (3) |
|
Equi-joins and non-equal joins |
|
|
414 | (1) |
|
Comparative operators (theta joins) |
|
|
415 | (1) |
|
|
415 | (1) |
|
Multi-predicate relationships |
|
|
415 | (1) |
|
Alternative Relationship Techniques |
|
|
416 | (4) |
|
|
417 | (1) |
|
|
418 | (1) |
|
|
418 | (1) |
|
|
419 | (1) |
|
Naturally occurring joins |
|
|
419 | (1) |
|
|
420 | (3) |
|
Repeating fields as an array handler |
|
|
420 | (1) |
|
Collapsing and expanding arrays |
|
|
421 | (1) |
|
Relationship-based techniques for managing data |
|
|
421 | (1) |
|
Allowing creation via relationship |
|
|
421 | (1) |
|
|
422 | (1) |
|
The isolating relationship |
|
|
423 | (1) |
|
Graph Techniques---Spiders, Squids, and Anchor-Buoy |
|
|
423 | (4) |
|
Constellations and modular centers |
|
|
424 | (1) |
|
A satellite-based graph solution |
|
|
424 | (2) |
|
Segmentation on functional lines |
|
|
426 | (1) |
|
Documenting the Database Structure |
|
|
427 | (4) |
|
|
427 | (1) |
|
|
428 | (1) |
|
|
429 | (1) |
|
Ancillary notes and documentation |
|
|
430 | (1) |
|
|
431 | (3) |
|
``Back end'' and ``front end'' |
|
|
432 | (1) |
|
The business or procedural layer |
|
|
432 | (1) |
|
FileMaker as an integrated environment |
|
|
433 | (1) |
|
|
433 | (1) |
|
File Architecture versus Data Structure |
|
|
434 | (5) |
|
|
434 | (1) |
|
|
435 | (1) |
|
|
436 | (2) |
|
Approaches to separation of data |
|
|
438 | (1) |
|
Costs and benefits of separation |
|
|
439 | (1) |
|
Separation and External SQL Sources |
|
|
439 | (3) |
|
|
440 | (1) |
|
Working within constraints |
|
|
440 | (1) |
|
|
441 | (1) |
|
Implementing Separation in an Existing Solution |
|
|
442 | (3) |
|
Establishing data source(s) |
|
|
442 | (1) |
|
Re-pointing Table Occurrences |
|
|
442 | (2) |
|
|
444 | (1) |
|
Deployment Considerations |
|
|
445 | (2) |
|
|
445 | (1) |
|
The model of adaptability |
|
|
445 | (2) |
|
|
447 | (52) |
|
Compound Calculation Expressions |
|
|
448 | (6) |
|
|
449 | (1) |
|
Functions and schema references |
|
|
450 | (1) |
|
|
451 | (1) |
|
Avoiding circular references |
|
|
451 | (1) |
|
Structured syntax and nesting |
|
|
452 | (1) |
|
|
453 | (1) |
|
|
454 | (2) |
|
|
456 | (2) |
|
Zero, empty, and everything else |
|
|
456 | (1) |
|
|
457 | (1) |
|
|
457 | (1) |
|
Variables---Calculation, Script, and Global |
|
|
458 | (2) |
|
Declaring calculation variables---the Let() function |
|
|
458 | (1) |
|
Understanding variables' scope |
|
|
459 | (1) |
|
Benefiting from variables in a calculation |
|
|
460 | (1) |
|
Text Processing and Parsing Functions |
|
|
460 | (7) |
|
Substitute, Replace, and Trim |
|
|
461 | (1) |
|
|
462 | (1) |
|
Position and PatternCount |
|
|
463 | (2) |
|
|
465 | (1) |
|
|
466 | (1) |
|
Text Formatting Operations |
|
|
467 | (3) |
|
|
467 | (1) |
|
|
468 | (1) |
|
Applying selective formatting |
|
|
468 | (1) |
|
|
469 | (1) |
|
Dates, Times, and Timestamps |
|
|
470 | (3) |
|
How FileMaker manages dates |
|
|
470 | (1) |
|
|
470 | (1) |
|
The number of seconds in 2009 years |
|
|
471 | (1) |
|
Juggling days, months, and years |
|
|
472 | (1) |
|
|
473 | (3) |
|
Using aggregate functions |
|
|
473 | (1) |
|
The ballad of Max and Min |
|
|
474 | (1) |
|
Referencing summary fields |
|
|
475 | (1) |
|
|
476 | (4) |
|
Retrieving values as a list |
|
|
476 | (1) |
|
Managing lists---the xValues functions |
|
|
477 | (1) |
|
Extracting one value from a list |
|
|
478 | (1) |
|
Adding or inserting a list value |
|
|
478 | (1) |
|
Removing a value from a list |
|
|
479 | (1) |
|
|
480 | (3) |
|
Building blocks with GetField() |
|
|
480 | (1) |
|
Completing the circuit with GetFieldName() |
|
|
481 | (1) |
|
|
482 | (1) |
|
|
483 | (3) |
|
Why and when calculations are unstored |
|
|
483 | (1) |
|
Understanding the benefits and trade-offs of unstored calculations |
|
|
484 | (1) |
|
Discovering the hidden secrets of unstored calcs |
|
|
485 | (1) |
|
Calculation Fields versus Auto-Enter Calculations |
|
|
486 | (3) |
|
The user over-ride capability |
|
|
486 | (2) |
|
Auto-enter calculations and storage |
|
|
488 | (1) |
|
The Do Not Replace option |
|
|
488 | (1) |
|
|
489 | (3) |
|
The moon follows you everywhere |
|
|
490 | (1) |
|
Managing global dependencies |
|
|
490 | (1) |
|
The freedom and efficiency of global calculations |
|
|
491 | (1) |
|
|
492 | (2) |
|
|
492 | (1) |
|
|
493 | (1) |
|
Calculations Using Custom Functions |
|
|
494 | (2) |
|
|
496 | (3) |
|
|
497 | (1) |
|
|
497 | (2) |
|
|
499 | (54) |
|
Scripting the Control of Objects and Interface |
|
|
499 | (5) |
|
Addressing objects by name |
|
|
500 | (1) |
|
Locking down the interface |
|
|
501 | (1) |
|
Managing user interaction |
|
|
502 | (2) |
|
|
504 | (6) |
|
Retrieving error codes appropriately |
|
|
505 | (1) |
|
What the error codes mean |
|
|
505 | (1) |
|
Why bother with error handling? |
|
|
506 | (1) |
|
|
507 | (3) |
|
Scripts and Access Privileges |
|
|
510 | (2) |
|
|
511 | (1) |
|
Run script with full access privileges |
|
|
511 | (1) |
|
Determining the substantive privileges |
|
|
512 | (1) |
|
Automating the Automation |
|
|
512 | (5) |
|
Defining a script to run on file open |
|
|
513 | (1) |
|
Housekeeping practices for start-up scripts |
|
|
514 | (1) |
|
Scripts that run on file close |
|
|
515 | (1) |
|
|
516 | (1) |
|
Harnessing the Power of Parameters, Results, and Variables |
|
|
517 | (9) |
|
Getting data into a script |
|
|
517 | (1) |
|
Branching according to state |
|
|
518 | (1) |
|
|
519 | (2) |
|
Passing and retrieving multiple parameters |
|
|
521 | (2) |
|
Specifying and retrieving a script result |
|
|
523 | (2) |
|
Storing and accumulating data as you go |
|
|
525 | (1) |
|
Dynamic and Indirect Controls in Scripts |
|
|
526 | (5) |
|
Example---Go to Layout by name or number |
|
|
526 | (1) |
|
Dynamic file paths using variables |
|
|
527 | (2) |
|
Dynamically building Find criteria |
|
|
529 | (1) |
|
Editing field data on the fly (indirection) |
|
|
530 | (1) |
|
|
531 | (4) |
|
Nested and sequential If/Else conditions |
|
|
531 | (1) |
|
|
532 | (1) |
|
Specifying exit conditions |
|
|
533 | (2) |
|
|
535 | (1) |
|
|
535 | (1) |
|
|
536 | (1) |
|
Scripted Window Management |
|
|
536 | (6) |
|
Addressing windows by name (title) |
|
|
537 | (1) |
|
Moving and resizing windows |
|
|
538 | (1) |
|
Determining window dimensions |
|
|
539 | (1) |
|
Creating windows off-screen |
|
|
540 | (1) |
|
Freezing and refreshing the screen |
|
|
541 | (1) |
|
Scripting Data Import and Export |
|
|
542 | (7) |
|
|
542 | (1) |
|
|
543 | (1) |
|
Selecting fields for export |
|
|
543 | (2) |
|
|
545 | (1) |
|
|
546 | (1) |
|
Synchronizing and updating data |
|
|
546 | (1) |
|
|
547 | (1) |
|
Loading and unloading container objects |
|
|
548 | (1) |
|
Pivoting Data between Tables |
|
|
549 | (1) |
|
Using utility relationships |
|
|
549 | (1) |
|
Managing related data (walking through related records) |
|
|
549 | (1) |
|
Going over Some Practical Examples |
|
|
550 | (3) |
|
|
550 | (1) |
|
Building a multi-part PDF report |
|
|
551 | (2) |
|
Part IV: Integrity and Security |
|
|
553 | (102) |
|
In Control with FileMaker Security |
|
|
555 | (26) |
|
|
555 | (3) |
|
|
556 | (1) |
|
|
556 | (1) |
|
|
556 | (1) |
|
Protecting your investment |
|
|
556 | (1) |
|
Interface vulnerabilities |
|
|
557 | (1) |
|
Taking things at interface value |
|
|
557 | (1) |
|
More than a semblance of security |
|
|
558 | (1) |
|
|
558 | (1) |
|
|
558 | (4) |
|
Concepts of role-based security |
|
|
560 | (1) |
|
Defining and constraining access |
|
|
560 | (1) |
|
Schema privilege controls |
|
|
561 | (1) |
|
|
562 | (5) |
|
Access to value lists and scripts |
|
|
563 | (1) |
|
The two dimensions of layout access |
|
|
563 | (1) |
|
Privileges for table, record, and field access |
|
|
564 | (2) |
|
Using and managing extended privileges |
|
|
566 | (1) |
|
|
567 | (3) |
|
|
568 | (1) |
|
Internal and external authentication |
|
|
568 | (2) |
|
Scripted Account Management |
|
|
570 | (3) |
|
Provision for automation of database security |
|
|
570 | (1) |
|
Working with multi-file solutions |
|
|
571 | (1) |
|
Safe scripting implementations |
|
|
572 | (1) |
|
Creating a Custom Logout Option |
|
|
573 | (3) |
|
|
573 | (1) |
|
Structuring a solution for logging out |
|
|
573 | (2) |
|
|
575 | (1) |
|
How Much Security Is Enough? |
|
|
576 | (1) |
|
|
576 | (1) |
|
A balanced view of threats |
|
|
577 | (1) |
|
A strategic model for response |
|
|
577 | (1) |
|
The Importance of Physical File Security |
|
|
577 | (2) |
|
|
578 | (1) |
|
Alternative forms of protection |
|
|
578 | (1) |
|
|
579 | (1) |
|
Security in Deployment: FileMaker Server |
|
|
579 | (2) |
|
Filtered display of files |
|
|
580 | (1) |
|
Secure Socket Layer encryption |
|
|
580 | (1) |
|
|
580 | (1) |
|
Maintaining Referential Integrity |
|
|
581 | (18) |
|
Pinpointing Common Causes of Referential Integrity Problems |
|
|
581 | (1) |
|
The potential impact on your solution |
|
|
582 | (1) |
|
|
582 | (1) |
|
|
582 | (2) |
|
|
583 | (1) |
|
Keys and meaning (existence, persistence, uniqueness) |
|
|
584 | (1) |
|
|
584 | (4) |
|
|
585 | (1) |
|
|
586 | (1) |
|
Unique identification (UID) values |
|
|
587 | (1) |
|
Exploring Keys and Data Type |
|
|
588 | (2) |
|
|
590 | (1) |
|
Deleting Redundant Records |
|
|
591 | (4) |
|
The use of cascading deletion |
|
|
592 | (1) |
|
Configuring relationships for referential integrity |
|
|
592 | (1) |
|
Privilege requirements for cascade delete |
|
|
593 | (1) |
|
Controlled cascading deletes at runtime |
|
|
594 | (1) |
|
Considering Other Integrity Issues |
|
|
595 | (2) |
|
Lookups and when to use them |
|
|
595 | (1) |
|
Auto-entry lookups and references |
|
|
595 | (1) |
|
|
596 | (1) |
|
|
597 | (2) |
|
|
597 | (1) |
|
Indirect object/element references |
|
|
597 | (1) |
|
|
598 | (1) |
|
|
598 | (1) |
|
Making FileMaker Systems Fail-Safe |
|
|
599 | (34) |
|
|
599 | (4) |
|
Successful backup strategies |
|
|
599 | (1) |
|
|
600 | (1) |
|
An appropriate backup cycle |
|
|
600 | (1) |
|
|
601 | (1) |
|
|
601 | (1) |
|
Back up the code, not just the data |
|
|
601 | (1) |
|
The hazards of copying open files |
|
|
601 | (1) |
|
|
602 | (1) |
|
|
603 | (1) |
|
A Comprehensive Approach to Error Trapping |
|
|
603 | (4) |
|
Dealing with record locking |
|
|
604 | (2) |
|
Techniques to avoid in multi-user or multi-window environments |
|
|
606 | (1) |
|
|
606 | (1) |
|
Record marking and flagging techniques |
|
|
607 | (1) |
|
|
607 | (1) |
|
|
607 | (6) |
|
|
608 | (2) |
|
|
610 | (1) |
|
|
610 | (1) |
|
|
611 | (1) |
|
|
612 | (1) |
|
Temporary Edit Interface Techniques |
|
|
613 | (3) |
|
|
613 | (2) |
|
The legitimate purpose of record locking |
|
|
615 | (1) |
|
Creating double-blind entry systems |
|
|
615 | (1) |
|
Field Masking, Filtering, and Error Rejection |
|
|
616 | (3) |
|
Applying standard data formations |
|
|
617 | (1) |
|
Dealing with trailing spaces and carriage returns |
|
|
618 | (1) |
|
Rejecting out-of-scope characters |
|
|
618 | (1) |
|
Handling styled source text |
|
|
619 | (1) |
|
Built-In Logging Capabilities |
|
|
619 | (2) |
|
Making use of auto-enter options |
|
|
619 | (1) |
|
Capturing and extending standard metadata |
|
|
620 | (1) |
|
|
621 | (2) |
|
Infrastructure for script logging |
|
|
621 | (1) |
|
Tracking script execution |
|
|
622 | (1) |
|
Script-specific context variables |
|
|
622 | (1) |
|
|
623 | (1) |
|
Capturing User Edits in Detail |
|
|
623 | (3) |
|
Trapping edits, field-by-field |
|
|
623 | (1) |
|
Incorporating ancillary data |
|
|
624 | (2) |
|
|
626 | (1) |
|
Managing the Accumulation of Log Data |
|
|
626 | (1) |
|
|
627 | (1) |
|
Generating secondary output |
|
|
627 | (1) |
|
Implementing Roll-Back Capabilities |
|
|
627 | (3) |
|
|
628 | (1) |
|
Alternative undo and roll-back capabilities |
|
|
629 | (1) |
|
Using logs to roll forward |
|
|
629 | (1) |
|
Alternative Logging Approaches |
|
|
630 | (3) |
|
|
630 | (1) |
|
Scripted and triggered logging |
|
|
630 | (3) |
|
Maintaining and Restoring Data |
|
|
633 | (22) |
|
Some Notes on File Recovery |
|
|
633 | (6) |
|
Debunking common myths and misconceptions |
|
|
634 | (1) |
|
|
635 | (2) |
|
|
637 | (1) |
|
Understanding file corruption |
|
|
638 | (1) |
|
Exporting and Importing Data |
|
|
639 | (4) |
|
File format considerations |
|
|
639 | (2) |
|
Exporting to and importing from a folder |
|
|
641 | (1) |
|
Delimiters and EOL markers |
|
|
642 | (1) |
|
Data Cleansing Operations |
|
|
643 | (4) |
|
Extract, transform, and load |
|
|
643 | (1) |
|
Data format considerations |
|
|
643 | (1) |
|
|
644 | (1) |
|
|
644 | (1) |
|
|
645 | (1) |
|
Filtering capabilities in FileMaker |
|
|
646 | (1) |
|
|
647 | (4) |
|
|
648 | (2) |
|
|
650 | (1) |
|
Handling Embedded Images and Stored Files |
|
|
651 | (2) |
|
Assigning and retrieving paths |
|
|
652 | (1) |
|
|
652 | (1) |
|
Text-Handling Considerations |
|
|
653 | (2) |
|
|
653 | (1) |
|
Designing a custom export process |
|
|
654 | (1) |
|
|
655 | (78) |
|
FileMaker Pro Advanced Features |
|
|
657 | (30) |
|
|
657 | (4) |
|
|
658 | (1) |
|
Debugging restricted privilege scripts |
|
|
658 | (1) |
|
Getting used to the Debugger controls |
|
|
659 | (2) |
|
|
661 | (6) |
|
|
661 | (1) |
|
|
662 | (2) |
|
|
664 | (1) |
|
Using the Viewer with the Debugger |
|
|
665 | (1) |
|
|
665 | (1) |
|
The Data Viewer and variables |
|
|
666 | (1) |
|
|
667 | (2) |
|
|
668 | (1) |
|
Mining the DDR for information |
|
|
668 | (1) |
|
Tools and techniques for interpreting DDR data |
|
|
669 | (1) |
|
|
669 | (6) |
|
|
669 | (2) |
|
|
671 | (1) |
|
Benefits of the Script Step action |
|
|
672 | (1) |
|
Benefits of window widgets |
|
|
672 | (1) |
|
|
673 | (1) |
|
Assigning menu sets throughout your file |
|
|
673 | (1) |
|
Setting the default menu set for a file |
|
|
673 | (1) |
|
Determining a menu set for each layout |
|
|
674 | (1) |
|
Controlling menu sets via script |
|
|
675 | (1) |
|
|
675 | (5) |
|
Defining custom functions |
|
|
676 | (2) |
|
Custom functions as an aid to syntax readability |
|
|
678 | (1) |
|
Maximizing efficiency and ease of use |
|
|
678 | (2) |
|
Custom Functions and Recursion |
|
|
680 | (4) |
|
Things that only custom functions can do |
|
|
680 | (1) |
|
The stack and the limits of recursion |
|
|
681 | (1) |
|
Tail recursion in practice |
|
|
681 | (1) |
|
|
682 | (1) |
|
Creating an acronym from a supplied phrase |
|
|
682 | (1) |
|
Extracting a character set from a supplied block of text |
|
|
683 | (1) |
|
Removing an unspecified number of leading carriage returns |
|
|
683 | (1) |
|
Creating Runtime Applications |
|
|
684 | (3) |
|
Generating a stand-alone solution |
|
|
684 | (1) |
|
Binding for each platform |
|
|
685 | (1) |
|
|
686 | (1) |
|
Efficient Code, Efficient Solutions |
|
|
687 | (22) |
|
Designing for Scale: Size Considerations |
|
|
687 | (2) |
|
The elephant in the cherry tree |
|
|
688 | (1) |
|
Predicting what will scale well |
|
|
688 | (1) |
|
|
689 | (2) |
|
Avoiding duplication of elements |
|
|
689 | (1) |
|
Using portable and reusable code |
|
|
690 | (1) |
|
Appropriate use of sub-scripts |
|
|
690 | (1) |
|
Appropriate use of custom functions |
|
|
691 | (1) |
|
Designing for Flexibility and Adaptability |
|
|
691 | (2) |
|
Layouts and adaptable design |
|
|
692 | (1) |
|
Concepts of reusability applied to the Relationships Graph |
|
|
692 | (1) |
|
Traveling the Shortest Distance Between Two Points |
|
|
693 | (9) |
|
Optimal calculation syntax |
|
|
693 | (2) |
|
Alternative syntax examples |
|
|
695 | (1) |
|
Working with modifier keys |
|
|
696 | (1) |
|
Working with Boolean values |
|
|
697 | (1) |
|
Avoiding dependency ``spaghetti'' |
|
|
698 | (3) |
|
Applying simplicity principles |
|
|
701 | (1) |
|
|
702 | (4) |
|
|
702 | (1) |
|
Posting edits and propagating edits to related records |
|
|
703 | (1) |
|
Offline updates and processing |
|
|
704 | (1) |
|
Robots and batch automation |
|
|
704 | (1) |
|
Host/server script execution |
|
|
704 | (2) |
|
|
706 | (2) |
|
Dealing with data in chunks |
|
|
706 | (1) |
|
Modularization strategies |
|
|
707 | (1) |
|
|
707 | (1) |
|
|
707 | (1) |
|
Images and Media in Databases |
|
|
708 | (1) |
|
Extending FileMaker's Capabilities |
|
|
709 | (24) |
|
|
709 | (7) |
|
Using Send Event and VBScript |
|
|
710 | (1) |
|
Using VBScript with FileMaker Pro |
|
|
710 | (2) |
|
Calling Windows Command-Line scripts |
|
|
712 | (1) |
|
|
713 | (2) |
|
Cross-platform solutions and external script calls |
|
|
715 | (1) |
|
Third-party helpers and macros |
|
|
716 | (1) |
|
Rendering HTML and JavaScript |
|
|
716 | (3) |
|
|
717 | (1) |
|
Bringing services to your solution |
|
|
717 | (1) |
|
|
718 | (1) |
|
|
719 | (1) |
|
|
719 | (1) |
|
|
719 | (1) |
|
|
720 | (8) |
|
Installing and enabling plug-ins |
|
|
720 | (2) |
|
|
722 | (1) |
|
|
723 | (1) |
|
Robust triggering implementations |
|
|
723 | (2) |
|
Available script triggering plug-ins |
|
|
725 | (1) |
|
|
725 | (1) |
|
|
726 | (1) |
|
|
727 | (1) |
|
Charting and other functionality |
|
|
727 | (1) |
|
|
728 | (3) |
|
|
728 | (1) |
|
|
729 | (1) |
|
Working with XML and XSLT |
|
|
729 | (1) |
|
|
730 | (1) |
|
FileMaker's PHP Site Assistant |
|
|
730 | (1) |
|
Finding Third-Party Tools |
|
|
731 | (2) |
|
|
731 | (1) |
|
Analysis and documentation |
|
|
732 | (1) |
|
|
732 | (1) |
|
|
733 | (10) |
|
Appendix A: Expanding Your Knowledge with Additional Resources |
|
|
735 | (6) |
|
Appendix B: About the Web Site |
|
|
741 | (2) |
Index |
|
743 | |