Introduction |
|
1 | (1) |
|
A Developer Muses in Garden Supplies |
|
|
2 | (2) |
|
The Gist of the Relational Approach |
|
|
4 | (1) |
|
The Benefits of Going Relational |
|
|
5 | (2) |
|
|
7 | (3) |
|
The Most Common Relationship: One to Many |
|
|
10 | (4) |
|
How We Keep Track of All the Children |
|
|
14 | (3) |
|
|
17 | (4) |
I Planning |
|
|
|
21 | (12) |
|
Some Good Reasons to Plan Ahead |
|
|
22 | (1) |
|
|
23 | (1) |
|
Explore the Culture Like an Anthropologist |
|
|
24 | (6) |
|
Encourage Griping, Day-Dreaming, and Brainstorming |
|
|
25 | (1) |
|
|
26 | (2) |
|
Listen to the Staff for a Different Perspective |
|
|
28 | (1) |
|
Ask the Staff What You Can Do to Make Their Life Easier |
|
|
29 | (1) |
|
Report on the Plan in a Preliminary Proposal |
|
|
30 | (3) |
|
Articulating Your Plans as They Evolve |
|
|
33 | (22) |
|
Adopt the Client's Point of View |
|
|
34 | (1) |
|
What Goes into the Proposal |
|
|
34 | (5) |
|
Articulate the Business Problem |
|
|
35 | (1) |
|
|
36 | (1) |
|
|
36 | (1) |
|
Estimate the Time and Money Needed for Developing the Database |
|
|
37 | (1) |
|
Act as a Consultant to a Client |
|
|
38 | (1) |
|
Create an Entity Relationship Diagram |
|
|
39 | (13) |
|
Deciding What an Entity Is |
|
|
39 | (1) |
|
Turning Our Attention to Attributes |
|
|
40 | (2) |
|
Make Up a List of Candidates |
|
|
42 | (1) |
|
Start the Diagram at the Heart of the Database |
|
|
43 | (1) |
|
Defining the Relationships Between Entities |
|
|
44 | (4) |
|
Confirming That the Emerging Diagram Fulfills the System Requirements |
|
|
48 | (1) |
|
|
49 | (2) |
|
Refining Your ER Diagram by Questioning Your Tables |
|
|
51 | (1) |
|
Working Document: The Absolutely Positively Final ER Diagram |
|
|
51 | (1) |
|
Create a File Structure Diagram |
|
|
52 | (3) |
|
|
55 | (28) |
|
Creating a Field Specification List |
|
|
56 | (3) |
|
|
59 | (3) |
|
|
62 | (8) |
|
Consider How You Want to Sort the Values in the Field |
|
|
63 | (1) |
|
The Way You Want to Search Affects Your Choice of Field Type |
|
|
64 | (1) |
|
Automatic Formatting Depends on Field Type |
|
|
65 | (4) |
|
The Way You Can Calculate Depends on the Field Type |
|
|
69 | (1) |
|
Considering What Actually Will Be Entered in the Field |
|
|
70 | (6) |
|
What to Put in a Text Field |
|
|
70 | (1) |
|
What to Put in a Number Field |
|
|
71 | (1) |
|
What to Put in a Date Field |
|
|
71 | (1) |
|
What to Put in a Time Field |
|
|
72 | (1) |
|
What to Put in a Container Field |
|
|
73 | (1) |
|
What to Put in a Calculation Field |
|
|
74 | (1) |
|
What to Put in a Summary Field |
|
|
75 | (1) |
|
What to Put in a Global Field |
|
|
75 | (1) |
|
Changing the Order in Which FileMaker Lists Fields |
|
|
76 | (1) |
|
|
77 | (1) |
|
|
78 | (1) |
|
|
79 | (1) |
|
Anticipating the Layout for Each Field |
|
|
80 | (3) |
|
|
83 | (24) |
|
|
84 | (1) |
|
A Case Study of Old Willy's Country Club |
|
|
84 | (9) |
|
|
85 | (1) |
|
Developing the Entities and Their Relationships |
|
|
85 | (2) |
|
Considering Some Business Rules |
|
|
87 | (1) |
|
|
87 | (1) |
|
|
88 | (1) |
|
|
88 | (1) |
|
Fields in the Scores by Hole File |
|
|
89 | (4) |
|
A Case Study of Klodner's Kar Dealership |
|
|
93 | (14) |
|
|
94 | (4) |
|
Developing the Field Definitions for the Kar Dealership |
|
|
98 | (9) |
II Building |
|
|
|
107 | (26) |
|
|
108 | (2) |
|
|
108 | (1) |
|
|
109 | (1) |
|
|
110 | (2) |
|
Create Relationships Between Files |
|
|
112 | (21) |
|
Name Those Relationships! |
|
|
112 | (1) |
|
|
113 | (2) |
|
Deciding What Kind of Relationship You Need |
|
|
115 | (2) |
|
How to Display Data from the Parent Side |
|
|
117 | (3) |
|
Implications for Searching and Sorting |
|
|
120 | (1) |
|
Creating a Relationship from a Parent to Children |
|
|
120 | (2) |
|
Choosing the Options for your Relationship |
|
|
122 | (2) |
|
Displaying Data from the Child Side |
|
|
124 | (2) |
|
Implications for Finding and Sorting |
|
|
126 | (1) |
|
|
127 | (1) |
|
Using Data from the Related Child Fields |
|
|
127 | (1) |
|
Using Data That Is More Than One File Away |
|
|
128 | (2) |
|
Special Focus: Using a File of Constants, or a Template File |
|
|
130 | (3) |
|
Maintaining Referential Integrity |
|
|
133 | (40) |
|
Why You Need Referential Integrity |
|
|
134 | (1) |
|
Problems with Referential Integrity |
|
|
134 | (2) |
|
|
136 | (16) |
|
Implementing Rule #1: Primary Keys Must Be Unique |
|
|
136 | (1) |
|
Implementing Rule #2: Foreign Keys Must Be Valid |
|
|
137 | (7) |
|
Creating a Child from a Parent via a Portal |
|
|
144 | (2) |
|
Another Way to Insert a Value into the Foreign Key Field |
|
|
146 | (3) |
|
|
149 | (3) |
|
Filling the Foreign Key Field at the Click of a Button |
|
|
152 | (1) |
|
Dealing with Threats to Referential Integrity |
|
|
152 | (17) |
|
Threat #1: User-Assigned or Editable Primary Keys |
|
|
152 | (1) |
|
Threat #2: Deletion of a Parent |
|
|
153 | (3) |
|
Collecting, Rather than Deleting, Contacts When Their Company Dies |
|
|
156 | (5) |
|
|
161 | (3) |
|
Threat #3: Users Messing with Menus |
|
|
164 | (1) |
|
Threat #4: Users Messing with Layouts They Shouldn't See or Use |
|
|
165 | (1) |
|
Threat #5: Users Creating Incomplete Parent Records from Within the Child |
|
|
166 | (1) |
|
Threat #6: Importing a Parent or Child Record |
|
|
167 | (2) |
|
Maintaining a Unique Compound Primary Key |
|
|
169 | (3) |
|
|
170 | (1) |
|
How You Create the Interface Can Help Validate |
|
|
171 | (1) |
|
Alternate Approach to Validation |
|
|
171 | (1) |
|
Testing for Valid Referential Integrity |
|
|
172 | (1) |
|
Keeping Your Data in Good Shape |
|
|
173 | (40) |
|
Keeping Your Data Healthy |
|
|
174 | (1) |
|
|
174 | (1) |
|
|
174 | (2) |
|
The Dream: Complete Accuracy |
|
|
176 | (5) |
|
Offering Lists of Choices |
|
|
176 | (1) |
|
|
176 | (1) |
|
|
177 | (1) |
|
|
178 | (1) |
|
|
179 | (2) |
|
Perfecting the Interface of Radio Buttons and Check Boxes |
|
|
181 | (1) |
|
|
181 | (4) |
|
Having FileMaker Automatically Enter Information |
|
|
185 | (4) |
|
|
189 | (3) |
|
Allowing or Preventing Entry in Fields |
|
|
192 | (5) |
|
Having FileMaker Check for Accuracy |
|
|
197 | (11) |
|
|
198 | (1) |
|
|
198 | (1) |
|
|
198 | (1) |
|
|
199 | (1) |
|
|
199 | (1) |
|
|
199 | (1) |
|
|
199 | (3) |
|
Validating Social Security Numbers |
|
|
202 | (2) |
|
Not Allowing Users to Override the Validation |
|
|
204 | (1) |
|
Displaying a Message if Validation Fails |
|
|
205 | (1) |
|
|
205 | (1) |
|
|
206 | (2) |
|
Preventing Users from Editing a Record After It Has Been Created |
|
|
208 | (1) |
|
Adjusting the Tab Order to Suit the User's Habits |
|
|
209 | (1) |
|
Extra Carefulness: Keeping Carriage Returns Out of the Data |
|
|
210 | (3) |
|
Crafting the User Interface |
|
|
213 | (36) |
|
The Interface Is All There Is--for Users |
|
|
214 | (1) |
|
Let Users' Tasks Shape Your Design |
|
|
214 | (1) |
|
Decide Which Layouts to Focus On |
|
|
215 | (2) |
|
Use Tabs for Convenience and Clarity |
|
|
217 | (1) |
|
|
218 | (2) |
|
Combine the Best of Both Approaches |
|
|
220 | (1) |
|
Decide on Your Default Views |
|
|
220 | (2) |
|
Fit Information into a Single Record View |
|
|
222 | (2) |
|
Unfold Minor Information Gradually |
|
|
224 | (1) |
|
Distinguish Groups of Information by Their Functions |
|
|
224 | (6) |
|
|
224 | (1) |
|
|
225 | (1) |
|
Add Text to Clarify the Purpose of Layouts and Areas |
|
|
226 | (2) |
|
Yes, You Should Include Lists |
|
|
228 | (1) |
|
Make Your Own Sort Buttons |
|
|
228 | (1) |
|
Use Color and Graphics to Indicate Functionality |
|
|
229 | (1) |
|
|
230 | (7) |
|
Make Your Layouts Look Stable |
|
|
230 | (1) |
|
Set the Default Formatting for Text and Graphics |
|
|
230 | (2) |
|
Let FileMaker Help You Keep Formats Consistent |
|
|
232 | (1) |
|
Make Objects Line Up Consistently |
|
|
233 | (4) |
|
|
237 | (1) |
|
Never Have the Users Do What the Computer Can Do for Them |
|
|
237 | (1) |
|
|
238 | (1) |
|
Signal Exactly Where to Enter Information |
|
|
238 | (1) |
|
Design Meaningful Buttons |
|
|
238 | (3) |
|
Arrange Buttons in Functional Areas |
|
|
240 | (1) |
|
Print the Reports the Users Expect |
|
|
241 | (2) |
|
Describe Printing the Way Users Do |
|
|
242 | (1) |
|
Test Prototypes and Get User Feedback |
|
|
243 | (2) |
|
Use the Interface Prototyper |
|
|
245 | (4) |
|
|
246 | (1) |
|
|
247 | (1) |
|
|
247 | (2) |
|
``Webifying'' Your Database |
|
|
249 | (24) |
|
Letting People Interact with Your Data |
|
|
250 | (1) |
|
How FileMaker Came to the Web |
|
|
251 | (3) |
|
Choosing Between Instant and Custom Web Publishing |
|
|
254 | (1) |
|
|
255 | (5) |
|
|
260 | (4) |
|
|
260 | (1) |
|
How Links Differ from Forms |
|
|
261 | (1) |
|
|
261 | (2) |
|
|
263 | (1) |
|
|
264 | (1) |
|
How to Plan for Web Delivery |
|
|
264 | (2) |
|
Putting Your Database Directly on the Internet |
|
|
266 | (1) |
|
Exporting Data as HTML Pages with the Results of Calculations |
|
|
267 | (2) |
|
|
269 | (2) |
|
Using Lasso to Go Beyond the Web Companion |
|
|
271 | (2) |
|
|
273 | (68) |
|
Why Calculations Can Get Hot |
|
|
274 | (1) |
|
|
274 | (1) |
|
Mathematical and Financial Calculations |
|
|
275 | (4) |
|
Using Rounding to Avoid Errors in Summaries |
|
|
275 | (2) |
|
Using the Int and Mod Functions to Get Whole Numbers |
|
|
277 | (1) |
|
|
278 | (1) |
|
|
279 | (15) |
|
Taking Apart a Text String to Reformat It |
|
|
281 | (2) |
|
Putting Together a Full Address |
|
|
283 | (1) |
|
Using Overlapping Fields to Simulate Typing in a Calculation Field |
|
|
284 | (3) |
|
Overlapping Fields to Mimic Conditional Text |
|
|
287 | (2) |
|
Using the PatternCount Function to Spot Values |
|
|
289 | (1) |
|
Extracting the Prefix to the Name, First, Middle Initial, Last Name, and Suffix to the Last Name |
|
|
290 | (4) |
|
|
294 | (11) |
|
Calculating How Long It's Been Since the Last Contact |
|
|
294 | (1) |
|
Calculating the Next Appointment Date |
|
|
295 | (6) |
|
Breaking Apart a Date for Subtotals |
|
|
301 | (4) |
|
|
305 | (2) |
|
Calculating the Total Amount of Time |
|
|
305 | (2) |
|
|
307 | (5) |
|
Comparing IF, Case, and Choose Statements |
|
|
307 | (2) |
|
Using IF Statements for a Multi-Column Report |
|
|
309 | (1) |
|
Using IF Statements to Extract the Choices of Radio Buttons |
|
|
310 | (2) |
|
Calculations with Container Results |
|
|
312 | (1) |
|
Flagging Key Items for Management with Graphics |
|
|
312 | (1) |
|
Creating a Fully Formatted Document for Database Publishing |
|
|
313 | (3) |
|
Calculating with Check Boxes |
|
|
316 | (10) |
|
Sorting Check Box Items and Converting Values to a Comma-Separated List |
|
|
317 | (3) |
|
Allowing the User to Modify Standard Text |
|
|
320 | (1) |
|
Doing a Mail Merge on a Text Field |
|
|
321 | (2) |
|
Doing a Search-and-Replace Within a Field |
|
|
323 | (3) |
|
Generating Random Numbers |
|
|
326 | (3) |
|
|
329 | (2) |
|
Exporting or Importing Fixed-Length Records |
|
|
331 | (7) |
|
Exporting to Fixed-Length Records |
|
|
331 | (2) |
|
Importing Fixed-Length Records |
|
|
333 | (2) |
|
|
335 | (3) |
|
Handling Aggregate Functions |
|
|
338 | (3) |
|
|
341 | (54) |
|
|
342 | (1) |
|
|
342 | (1) |
|
|
343 | (3) |
|
|
344 | (1) |
|
|
344 | (1) |
|
|
344 | (1) |
|
|
345 | (1) |
|
|
345 | (1) |
|
|
345 | (1) |
|
|
345 | (1) |
|
|
345 | (1) |
|
How FileMaker Figures Out What to Put Where |
|
|
346 | (2) |
|
|
348 | (7) |
|
Generating Reports with Subtotals by Month or Quarter |
|
|
354 | (1) |
|
Putting Sub-summaries on Every Page |
|
|
355 | (2) |
|
Using Sub-Summaries Without Summary Fields |
|
|
357 | (1) |
|
Using the GetSummary Function in a Calculation Field |
|
|
358 | (3) |
|
Where Should You Report From? |
|
|
361 | (5) |
|
|
361 | (2) |
|
|
363 | (2) |
|
|
365 | (1) |
|
Interesting Reporting Techniques |
|
|
366 | (12) |
|
Providing the User with Editable Report Headers and Footers |
|
|
366 | (1) |
|
Creating a Script to Allow the User to Perform a Search as the Basis for a Report |
|
|
367 | (6) |
|
Taking Advantage of Fixed Page Margins for Multiple Printers |
|
|
373 | (1) |
|
Finding the Median in Subtotals and Grand Totals |
|
|
374 | (4) |
|
|
378 | (17) |
|
|
379 | (2) |
|
|
381 | (1) |
|
|
381 | (14) |
|
|
395 | (26) |
|
What Shows Up in a Portal--and How |
|
|
396 | (1) |
|
Dumb Portal Trick #1: Lets You See in a Portal All Records from Another File |
|
|
396 | (2) |
|
Dumb Portal Trick #2: Lets You Use Conditional Value Lists with Portals |
|
|
398 | (3) |
|
Dumb Portal Trick #3: Highlights Selected Items in Portals |
|
|
401 | (2) |
|
Dumb Portal Trick #4: Moves Records from One Portal to Another |
|
|
403 | (2) |
|
Dumb Portal Trick #5: Uses Calculated Multivalued Keys to Filter Which Child Records Show Up in the Parent Record |
|
|
405 | (1) |
|
Dumb Portal Trick #6: Moves Portal Rows and Inserts a Portal Row |
|
|
406 | (6) |
|
Dumb Portal Trick #7: Allows the User to Choose the Sort Order in a Portal |
|
|
412 | (2) |
|
Dumb Portal Trick #8: Makes the Portal Disappear! |
|
|
414 | (3) |
|
Dumb Portal Trick #9: Uses a Portal to Control Access to Records in Another File |
|
|
417 | (4) |
|
|
418 | (1) |
|
|
419 | (2) |
|
The Joys of Self-Joins and Other Interesting Relationships |
|
|
421 | (22) |
|
The Miracle of a Self-Join |
|
|
422 | (4) |
|
Assembly-Subassembly, a.k.a. the Hamburger Example |
|
|
426 | (5) |
|
|
431 | (4) |
|
|
435 | (8) |
|
|
436 | (1) |
|
|
437 | (6) |
III Scripting |
|
|
|
443 | (38) |
|
The Benefits of Scripting |
|
|
444 | (1) |
|
Creating and Editing Scripts |
|
|
444 | (4) |
|
|
448 | (5) |
|
|
448 | (2) |
|
|
450 | (1) |
|
|
450 | (3) |
|
Write Once, Run Many Ways |
|
|
453 | (1) |
|
|
453 | (5) |
|
Startup Part 1: Open All the Files and Maximize the Windows |
|
|
454 | (1) |
|
Startup Part 2: Decide What to Do with the Status Area |
|
|
455 | (1) |
|
Startup Part 3: Go to the Right Layout |
|
|
455 | (1) |
|
Startup Part #4: Show All and Unsort |
|
|
456 | (1) |
|
Startup Part #5: Initialize Those Variables |
|
|
456 | (1) |
|
Startup Part #6: Show a Welcome Screen, if You Have One |
|
|
457 | (1) |
|
Startup Part #7: Set Page Setup/Print Setup, if Users Can Select Print from the Menu |
|
|
457 | (1) |
|
Startup Part #8: Create a Log of Who Enters This System and When |
|
|
458 | (1) |
|
|
458 | (1) |
|
|
458 | (1) |
|
Close All Files in the System |
|
|
459 | (1) |
|
|
459 | (1) |
|
Scripts to Help Users Navigate Among Layouts |
|
|
459 | (2) |
|
Make Sure You Know What Mode You Are In |
|
|
459 | (1) |
|
|
460 | (1) |
|
Initialize Any Variables You Need |
|
|
460 | (1) |
|
The show_data_entry_notes Script |
|
|
460 | (1) |
|
Scripts for Navigating Among Parents and Children |
|
|
461 | (4) |
|
Child-to-Parent Navigation |
|
|
461 | (2) |
|
Parent-to-Child Navigation |
|
|
463 | (1) |
|
Parent-to-Parent Navigation in a Many-to-Many Relationship |
|
|
464 | (1) |
|
|
465 | (3) |
|
|
465 | (1) |
|
|
466 | (2) |
|
Scripts for Creating New Records |
|
|
468 | (1) |
|
Easy Example of Creating New Records |
|
|
468 | (1) |
|
The new_invoice script in Invoices |
|
|
468 | (1) |
|
|
468 | (2) |
|
|
469 | (1) |
|
Returning the User to the Original Record |
|
|
469 | (1) |
|
The sort_by_date_of_invoice Script |
|
|
470 | (1) |
|
|
470 | (3) |
|
The capture_id_of_found_set_of_customers Script |
|
|
471 | (1) |
|
Capturing the IDs of the Current Invoices |
|
|
472 | (1) |
|
|
472 | (1) |
|
The print_ar_aging_by_customer Subscript in Invoices |
|
|
472 | (1) |
|
The print_ar_aging_by_customer Script in Customers |
|
|
473 | (1) |
|
Scripts Asking Users What They Want to Print |
|
|
473 | (1) |
|
The print_invoice_button Script Behind the Print Button |
|
|
474 | (1) |
|
Scripts for Preparing Canned Finds |
|
|
474 | (2) |
|
Scripts That Duplicate Records |
|
|
476 | (1) |
|
Handling Button Actions in Your Scripts |
|
|
476 | (5) |
|
|
481 | (16) |
|
|
482 | (2) |
|
|
482 | (1) |
|
Interrupting and Showing Messages |
|
|
482 | (1) |
|
Halting the Script at Different Places to See Whether It Worked so Far |
|
|
482 | (1) |
|
Writing Script Results to a Log Field or File |
|
|
483 | (1) |
|
|
483 | (1) |
|
Using Analyzer--A Two Thumbs Up Product |
|
|
483 | (1) |
|
|
484 | (1) |
|
|
484 | (13) |
IV Reaching Out |
|
|
Integrating FileMaker, Expanding Its Reach |
|
|
497 | (22) |
|
|
498 | (1) |
|
Examples of the New Connectivity |
|
|
499 | (1) |
|
|
499 | (1) |
|
Furniture Inventories on the Hoof |
|
|
499 | (1) |
|
|
500 | (1) |
|
|
500 | (1) |
|
|
500 | (5) |
|
Different Ways of Connecting with FileMaker |
|
|
501 | (1) |
|
|
501 | (1) |
|
Wireless PDAs, PDAs, Pagers, and Cell Phones |
|
|
502 | (3) |
|
Taking Advantage of Industry Standards for Data Exchange |
|
|
505 | (1) |
|
Using ODBC, JDBC, and Java |
|
|
506 | (11) |
|
Making FileMaker Pro a Data Source for ODBC Applications |
|
|
506 | (3) |
|
Getting ODBC Data Out of FileMaker |
|
|
509 | (2) |
|
|
511 | (5) |
|
|
516 | (1) |
|
Going from HTML to XML and WML |
|
|
517 | (1) |
|
|
518 | (1) |
|
FileMaker Pro Multiuser Design and Deployment Considerations |
|
|
519 | (14) |
|
The Idea of Multiple Users |
|
|
520 | (1) |
|
Designing Multiuser Files |
|
|
521 | (2) |
|
Deploying Multiuser Files |
|
|
523 | (1) |
|
|
524 | (4) |
|
Defining Fields as Sole Guest |
|
|
527 | (1) |
|
|
527 | (1) |
|
Multiuser Deployment, Design, and Networking Tips and Pitfalls Checklist |
|
|
528 | (5) |
Index |
|
533 | |