(Unofficial) Planet FileMaker
... helping to feed the FileMakers ...
July 02, 2009
Newest FileMaker Pro Custom Functions
captialLetters ( numWords ; text)
The Philadelphia FileMaker User Group
Thanks to Tony Celini; Design Critique and Discussion next meeting!

FM Success Tips
047_FM_Success_Tips
by FM Success Tips (SCS@sonic.net) at July 02, 2009 02:30 PM
Soliant Consulting Blog
How to Define Global Constants in Flex
There are several ways to define a set of global constants in your flex app.
You can use a bunch of “include” statements or you can create a singleton object to hold your data.
However, probably the best way to define a set of global constants is to create an object with all static constants as members. You don’t have to refer to any instances of the object, you don’t have to instantiate it, and the object will be available wherever you import it.
Here is an example of a Global object:
Globals.as
package com.caspar.model{
public class Globals {
public static const EXAMPLE_1_TEXT:String = "Some Text";
public static const EXAMPLE_2_TEXT:String = "Some More Text";
public static const APP_WIDTH:Number = 1200;
public static const APP_HEIGHT:Number = 800;
public static const BORDER_SIZE:int = 13;
public static const SIDE_PANEL_WIDTH:int = 330;
public static const SIDE_PANEL_HEIGHT:int = APP_HEIGHT - ( 2* BORDER_SIZE );
public static const MAIN_PANEL_WIDTH:int = APP_WIDTH - (SIDE_PANEL_WIDTH + ( 3 * BORDER_SIZE ) );
public static const MAIN_PANEL_HEIGHT:int = SIDE_PANEL_HEIGHT;
}
}
As you can see here, you can strongly type your constants, and you can perform basic math and concatenations in your constant declarations. This can be very useful when you have a lot of constants defined - if you have defined your globals carefully, you should only have to change a few values.
To use the object, import it as shown below:
Global Object Usage:
<Group xmlns="http://ns.adobe.com/mxml/2009">
<Script>
<![CDATA[
import com.caspar.model.Globals;
]]>
</Script>
<Rect height="{Globals.SIDE_PANEL_HEIGHT}"/>
</Group>
Related posts:
- Flex TitleBox Component For a recent project I was working on, I needed...
- How to Define a RemoteObject in Actionscript For the project I have been recently working on, I...
- Create a Flex app with FlexFM 1. To make a FlexFM application, first be sure...
Related posts brought to you by Yet Another Related Posts Plugin.
Flex TitleBox Component
For a recent project I was working on, I needed a re-usable rounded TitleBox component. Here is what I created.
Important
This example uses Flex 4. You will need to download and install the Flex 4 sdk before this example will work.
Here is a box component with a header and configurable size and corner radius.
Here is the source for this component.
This component is composed of two elements: The first is the TitleBox.mxml object, part of which is shown below:
TitleBox Component Snippet:
<Group xmlns="http://ns.adobe.com/mxml/2009"
xmlns:caspar="com.caspar.*">
<Group top="0" left="0">
<filters>
<DropShadowFilter alpha="0.5" angle="0" blurX="6" blurY="6" distance="0" quality="3" />
</filters>
<caspar:ComplexRect radiusTopLeft="{cr}" radiusTopRight="{cr}"
radiusBottomLeft="{cr}" radiusBottomRight="{cr}"
height="{bh}" width="{bw}">
<caspar:fill>
<SolidColor color="0xffffff"/>
</caspar:fill>
</caspar:ComplexRect>
</Group>
</Group>
For the full code, click “view source” on the example.
In the MXML code above, you can see a reference to a “ComplexRect” Object. This object is much the same as a normal rect obeject definable in MXML, except you can set the corner radius for any of the corners independently of the others. Here is the key part of the complex rect code below:
ComplexRect Object Snippet:
public function ComplexRect()
{
super();
}
/**
* @inheritDoc
*/
override protected function drawElement(g:Graphics):void{
if ( _radiusTopLeft || _radiusTopRight || _radiusBottomLeft || _radiusBottomRight )
{
g.drawRoundRectComplex( super.drawX, super.drawY ,
super.width, super.height,
_radiusTopLeft , _radiusTopRight ,
_radiusBottomLeft , _radiusBottomRight );
//calc as min, which will ensure bounds calcs by the parent work properly
calcEllipseRadiiValues ();
}
else {
super.drawElement(g);
}
}
In the TitleBox.mxml file, you could add getters / setters to change the box border or header color.
Currently to add content to the box, you need to call it’s “addElement” method on creationComplete. This is shown below:
How to Add an Element to the Box:
<Script>
<![CDATA[
private function init() : void {
myHeaderBox.addElement(boxText);
}
]]>
</Script>
<caspar:TitleBox id="myHeaderBox" headerText="My Title Box!!" boxWidth="300" boxHeight="200"/>
<Text x="10" y="30" id="boxText" text="Box Contents"/>
Related posts:
- How to Define Global Constants in Flex There are several ways to define a set of global...
- How to Define a RemoteObject in Actionscript For the project I have been recently working on, I...
Related posts brought to you by Yet Another Related Posts Plugin.
July 01, 2009
FMPro.org
Ten out of 10
by Craig Saunders (craig@digitalfusion.co.nz) at July 01, 2009 10:48 PM
DevCon discounts, exhibitor discounts and FREE reference manuals -- FMPug is where it's at
Free FileMaker Graphics Pack Available for Limited Time Only
by Kevin Mallon (kevin_mallon@filemaker.com) at July 01, 2009 09:06 PM
FileMaker, Inc. News Feed
Free FileMaker Graphics Pack Available for Limited Time Only
FileMaker Thought Bucket
Content Wrap Up For June 2009
WEB: www.dwaynewright.com
EMAIL: info@dwaynewright.com
TWITTER: dwaynewright
Just in case you are interested, I thought I’d put together a wrap up of the content we have published in the last month.

Vendor Pick (multiple techniques)
Script Triggers For Easy Relationship Filtering
Repeating Field Dock (script trigger only)
Repeating Field Button Dock

SECURE: Security Tidbits (part 1)
INDEX: Language Settings

BUSINESS
This is kinda scary ...
Check Out Terry White Blog Post On Free Fax Services
Work Breakdown Structure Continuing Education Class
PORTALS
Portal Creation, Highlighting and Sorting Reminders
Script Triggers For Easier Portal Filtering
PROJECT MANAGEMENT
Starting A Dedicated Project Management Related Blog
Controlling Chaos Episode 32 - Agile Estimating
Class 1 (of 5) Project Planning & Scheduling Techniques
Prototypes For Documentation (Term)
RANDOM THOUGHTS
Button Bar Without Any Buttons - Compliments Of Script Triggers
Would This Work For Non Traditional FileMaker Classroom Training?
EXAMPLE: Vendor Pick Example And Big Honking Movie
A READER ASKS: Batch Invoice Paying
REPORTS
Loads Of Different FileMaker Charting Examples
SCRIPTING
OnRecordCommit Script Trigger and Instant Web Publishing
A READER ASKS: Go To Next Portal Doesn’t Seem To
SECURITY
FileMaker 10 Security, A Quick View (Part 1)
TERMS
Custom Message When Validation Fails
Custom Order
Development Milestones
Data Entry Only Privilege Set
Equijoin
FileMaker Learning Center
Noise Answer
Resize To Command
Remote User Access
Work Breakdown Structure

June 1st Puzzle
=
More info about the author and FileMaker in general, contact me at info@dwaynewright.com.
© 2009 - Dwayne Wright - dwaynewright.com
The material on this document is offered AS IS. There is NO REPRESENTATION OR WARRANTY, expressed or implied, nor does any other contributor to this document. WARRANTIES OF MERCHANT ABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY DISCLAIMED. Consequential and incidental damages are expressly excluded. FileMaker Pro is the registered trademark of FileMaker Inc.
ADVERTISEMENT ==================
Help support this blog by considering a donating to its ongoing growth. For more details, please visit http://www.dwaynewright.com/donate.html
by Dwayne Wright (noreply@blogger.com) at July 01, 2009 02:40 PM
YouTube :: FileMaker
Bento for iPhone and iPod touch in Two Minutes
Bento for iPhone and iPod touch in Two Minutes
Publishing FileMaker Pro data to the iPhone
Author: filemakerinc
Keywords: filemaker excel database microsoft office business software mac spreadsheet asset management technology
Added: June 30, 2009
FileMaker Pro 10 In 2 Minutes
Author: filemakerinc
Keywords: database spreadsheets Microsoft Access Alpha Five Servoy information managment easy software
Added: June 30, 2009
June 30, 2009
FMPro.org
24U Phone Companion Released
by Honza Koudelka (honza@24uSoftware.com) at June 30, 2009 07:57 AM
uLearnIT - Making FileMaker Easy
FileMaker Training in Singapore and Hong Kong
June 29, 2009
FMPro.org
FTPit Pro 2.0.4 Released -- Enhancements / Bug Fixes
by FTPit Pro Support (ftpit@cnsplug-ins.com) at June 29, 2009 07:46 PM
FileMaker, Inc. News Feed
‘Bento For iPhone Review: Database Management Never Looked This Good’
FileMaker Thought Bucket
Controlling Chaos Episode 32 - Agile Estimating
WEB: www.dwaynewright.com
EMAIL: info@dwaynewright.com
TWITTER: dwaynewright
Just finished listening to episode 32 of the Controlling Chaos podcast (http://www.controllingchaos.com/) about Agile Estimating and thought it was quite noteworthy! I’m uncertain about the whole Agile methodology but it does seem to be gaining popularity in the software development arena. The content here seemed to be more about estimating than agile.

The guest of the show was Mike Cohn from Mountain Goat Software and author of Agile Estimating and Planning. The episode is just under a hour long and well worth a listening. Lots of information about the various team estimating ideas Mike had explored and includes one called Planning Poker (http://www.planningpoker.com/).
I couldn’t help but think of the FileMaker developer team I belonged to for about three years. About 95% of the time, we had a one developer equals one project ratio, we almost never had a two developer project. I was wondering what it would have been like if it was the other way around. If every project more than 10 hours in duration had a minimum of two developers and one project manager. The obvious negative would be the non-billable time for planning but I think that would decrease over time. The possible advantages would be better coding overall, tighter team integration, better control over project status and that is an interesting set of benefits right there?
=
More info about the author and FileMaker in general, contact me at info@dwaynewright.com.
© 2009 - Dwayne Wright - dwaynewright.com
The material on this document is offered AS IS. There is NO REPRESENTATION OR WARRANTY, expressed or implied, nor does any other contributor to this document. WARRANTIES OF MERCHANT ABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY DISCLAIMED. Consequential and incidental damages are expressly excluded. FileMaker Pro is the registered trademark of FileMaker Inc.
ADVERTISEMENT ==================
Help support this blog by considering a donating to its ongoing growth. For more details, please visit http://www.dwaynewright.com/donate.html
by Dwayne Wright (noreply@blogger.com) at June 29, 2009 05:41 PM
Soliant Consulting Blog
“Lightbox” scripts for web pages
By now you’ve probably seen a “lightbox” effect somewhere on the Web – even if, like me, you didn’t know the name for it. “Lightbox” is the term widely used for that neat effect where a web page displays an image by popping it up into an overlaid box and dimming out the background. You can generally click or hit a key to dismiss the lightbox overlay. The fancier ones offer a variety of display options, and things like the ability to display a group of images in the lightbox as a slideshow.
I started looking for information on how to produce this effect because I want to use the technique within our installation of Confluence. I found there are quite a number of these libraries, each with different features, strengths and weaknesses. I thought I’d take this blog post to go over what I found.
All of these tools, by the way, are created with a mixture of Javascript and CSS. In general, you deploy them by linking to both the Javascript and the CSS file from your web page, then putting one or two special attributes (like a “rel” attribute or a CSS class) into the tagging for the content you want to display in the lightbox. Some of these libraries are intended for use only with images, while others allow you to display other things, like inline content, or even content from another page altogether, which is what I was after.
The original Lightbox
The original Lightbox script, by Lokhesh Dhakar, is now updated and called Lightbox 2. The web page has good examples of its use. This script is only for images and image sets, so I did not investigate it further. The display seems very clean and elegant. Like many, though not all, of these toolkits, it uses some third-party JS libraries (the Prototype framework and the Scriptaculous library). It doubtless makes a lot of sense to leverage these toolkits, but it also means sending more code to the browser and can get complex if you’re integrating into a framework like Confluence.
Thickbox
As I said, a number of these scripts are images-only. I wanted to pop up an entirely separate web page in the box. So I moved on, to Cody Lindley’s Thickbox. This script can display ANY sort of content in the popup. There’s lots to like here in terms of functionality. I ultimately decided not to use it for two reasons: firstly, the CSS appeared to have a bad effect on my Confluence site CSS (though later investigation suggests I may just have needed to restart Confluence), and the typography, styling and display were not quite as slick as some of the others. In fairness, the author makes it plain that he created the script as a proof of concept, and it is readily amenable to tweaking, polishing, etc. The basic functionality seems very sound. Thickbox also uses an additional JS library, in this case the also-very-popular jquery.
Slimbox
Slimbox, by Christophe Beyls, bills itself as a more efficient (hey, when it did become the style to write that as “more-efficient”? That drives me nuts) Lightbox clone. Like Lightbox, it is images-only. It uses jQuery instead of Prototype and Scriptaculous. It claims to be heavily optimized and a good bit faster. Clicking through the examples lends some credence to this, but many factors could play into that. Like other scripts, this one is well documented and free.
Lytebox
The script I finally settled on (and believe me there were many more I did not get to looking at) is called Lytebox, by Markus Hay. Lytebox ultimately filled the bill for me for the following reasons:
- not limited to images
- entirely self-contained JS and CSS, does not require inclusion of entire libraries, which could further bloat the already sizable JS/CSS payload coming down from Confluence.
- nice-looking design
I dropped Lytebox into my Confluence install (ok, to be more accurate, I dropped it in via the all-important Theme Builder plugin I use to customize Confluence CSS and JS) and it Just Worked.
Hopefully this brief overview of Javascript “lightbox” technologies has been helpful. And if you do a Google search you’ll find dozens more links on this topic.
No related posts.
FileMaker Advisor Magazine
Compute Tiered Sales Commission in FileMaker Pro
FileMaker Pro Portals: Glimpse Another World
June 28, 2009
Newest FileMaker Pro Custom Functions
Base64ToAscII ( string )
AscIIToBase64 (string)
June 27, 2009
FileMaker Thought Bucket
Would This Work For Non Traditional FileMaker Classroom Training?
WEB: www.dwaynewright.com
EMAIL: info@dwaynewright.com
TWITTER: dwaynewright
I started the second (Project Planning & Scheduling) of five required courses for the Bellevue Washington project management certification courses.
I had to groan inwardly because we are going to do another in class exercise session and I dread these. I rarely get much out of them and it seems to be a “blind leading the blind” exercise in futility. This class has an interesting twist, most of the “try this on your own exercise” work is done outside of class. Our team case study is actually homework and is done via email communicating with each other. Kind of makes a more social aspect to homework that is different ... to say the least!I couldn’t help but have a stray thought that something like this for a FileMaker database class could allow for "hands on" training but not sacrifice valuable class time. Say each students FileMaker homework is a file dedicated to them on a FileMaker Server. They get their homework after a class and during the week, they can work on it. Then start of class the following week would start off by reviewing everyone’s homework!

Now this wouldn’t work well with traditional FileMaker training because it is sequential daily rapid fire output. However, a series of FileMaker classes being a few hours in duration and a week apart would be an excellent FileMaker training experience (in my opinion). This would help minimize the “my cup runneth over” experience that I see in most traditional FileMaker training sessions and conferences.
=
More info about the author and FileMaker in general, contact me at info@dwaynewright.com.
© 2009 - Dwayne Wright - dwaynewright.com
The material on this document is offered AS IS. There is NO REPRESENTATION OR WARRANTY, expressed or implied, nor does any other contributor to this document. WARRANTIES OF MERCHANT ABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY DISCLAIMED. Consequential and incidental damages are expressly excluded. FileMaker Pro is the registered trademark of FileMaker Inc.
==================
ADVERTISEMENT (Virtual One On One Training Services)
If you are interested in a one on one virtual session, please click here or send me an email at info@dwaynewright.com and we will schedule an appointment.
by Dwayne Wright (noreply@blogger.com) at June 27, 2009 04:23 PM
June 26, 2009
Newest FileMaker Pro Custom Functions
ToggleFlag_cf ( myfield ; myVL ; pos ; neg )
YouTube :: FileMaker
Container Fields & Multiple Files
Author: FmTutorials
Keywords: filemaker pro databases saving files file storage zip archiving
Added: June 26, 2009
June 25, 2009
Soliant Consulting Blog
The disempowered project manager
Soliant is in the business of building software for external clients. This means we work with a wide variety of organizations, and people within them. One of the things we’ve noticed over the years as a significant contributor to project success is simply this:
The more directly you work with the decision-makers, the more smoothly the project is likely to go.
By decision-makers, I mean the people empowered to decide three things:
1. What the software should do
2. How much they are willing to spend on it
3. In what timeframe they are willing to accept it
When managing a software project, it’s essential to get clear information on all of these points. It also helps immensely if the client has leeway in how they allocate value across these variables. Project management, as we all know, involves trading these three value points against each other. A project manager can SUGGEST tradeoffs, but it is only an informed and empowered client that can ACCEPT them. So an informed and empowered client is a key ingredient of project success.
Unfortunately, one doesn’t always find this client so easily. Here’s a typical scenario with the ingredients of some trouble.
Hesperox Worldwide’s Creative Services business unit needs a new way to communicate with customers. They have in mind some web-based software, and they’d like it pretty soon. CS is led by Hazel Kearney, who likes to work at a high level, get things done quickly, and leave implementation details to her subordinates. CS is also full of a lot of bright, but contentious people. They often compete with one another for Hazel’s approval, and Hazel doesn’t do as much as she could to discourage this.
After one staff meeting in which dissatisfaction with the current client site was widespread, Hazel makes a decision. CS is going to build a new client site. She settles on a budget of $80,000, and a timeline of six months, because it just seems like it shouldn’t take longer or cost more for a relatively straightforward tool.
Now, how to organize the project? It will need a project manager, ideally someone with some web experience. Hazel doesn’t want to devote an extremely senior PM to what’s sort of a “utility” project, so eventually she settles on Sami Shorwa. He’s relatively junior, and somewhat new to the group. He has worked on web sites in the past, and this would be a great project on which he could prove himself and get his sea legs in the department. Hazel likes to get things done, so she picks up the phone, calls Sami, informs him of his new commission, and his timeline and budget. She urges him to contact the key people in the department to get more details about requirements, and suggests he get busy finding a vendor.
Well, Sami does his best. He has some background as a business analyst, so he gathers some requirements. Quite a number, actually: it seems everyone has ideas about what the site should do. Some of them openly conflict with each other. Marshall thinks the site needs to have very strict security, with users unable to view resources unless an admnistrator specifically permits them. Shari thinks the site needs to emphasize openness, with users having broad privileges by default. Marshall and Shari are both senior to Sami, so he’s not sure what to do. A number of such examples crop up.
Sami also works diligently at vendor selection. Unsure how to resolve the requirements conflicts, he simply includes all the requirements in the RFP, in the hopes that the vendor can help sort it out. The responses aren’t terribly encouraging. Three vendors give estimates in excess of $200,000. Two more point out various intractable conflicts in the requirements and suggest Hesperox work them out. A sixth vendor gives an estimate of $75,000 but after seeing the other responses Sami isn’t sure he believes this.
Sami goes to Hazel and explains the problem. The team has come up with too many requirements, and they conflict. Firstly, a process is needed whereby the conflicts can be resolved. Secondly, a decision is needed about whether it makes sense to increase the budget or timeline. The fact that these issues tumble out in the passive voice is a sign of Sami’s dilemma.
“Sami,” says Hazel, in a clear, patient voice that says clearly that she doesn’t like the direction this is headed, “I’ve set a timeline and budget for you. Working all these other issues out is what I pay project managers for.”
Sami feels he doesn’t have much choice but to accept the $75,000 estimate, given Hazel’s rebuff. Those of you who’ve worked on software projects can predict how things will go from there. We will politely avert our eyes.
Sami’s problem should be clear: he is not, by virtue of his position, empowered to make ESSENTIAL decisions about how the project’s priorities should be managed. but his boss, who is so empowered, views these issues as “project management problems,” which Sami ought to be able to solve.
Lesson: if you’re developing software, make sure everyone on the project (everyone) knows who is empowered to make the fundamental tradeoffs between features, time and money. Be on special lookout for the really unfortunate soul known as the disempowered project manager: a middle-tier person who’s been charged to deliver the project, but has not been vested with the authority to make the fundamental business tradeoffs. And if you are that person, be prepared to stand up and point out the gap. You might approach it like this:
“Hazel, you brought me on as a boat captain. And as a captain I have wide leeway in how I plot a course, how I steer the ship, and what actions I take to protect the crew. I’ve signed up for all of that. But what I can’t do is decide what the boat should carry. I can’t decide what the profit margin on the voyage should be. And I can’t decide for you whether it’s better to arrive late with the whole cargo intact, or jettison some cargo in order to make speed and arrive on time. I can tell you what the choices are — in fact I’m obligated to. But in the end it’s you who has to actually make the decisions.”
Disempowerment is a serious threat to project health, but with these reflections you may be better prepared to spot it and address it before too much damage is done.
Related posts:
- User Experience Matters How many times has your company rolled out a new...
- The case for custom software Custom software can be expensive to build, and the process...
- Sales force dot what, now? So, rapid application development. In our space at least, it’s...
Related posts brought to you by Yet Another Related Posts Plugin.
FM Success Tips
046_FM_Success_Tips
by FM Success Tips (SCS@sonic.net) at June 25, 2009 02:30 PM
June 23, 2009
FileMaker Thought Bucket
Vendor Pick Example And Big Honking Movie
WEB: www.dwaynewright.com
EMAIL: info@dwaynewright.com
TWITTER: dwaynewright
The inspiration for this example file came from a request for a virtual one on one training session. My client wanted an experience where a database user picks a product for an order line and a new page opens, which lists all suppliers that carry that product. I was up early the day before the session and decided to try and map out some of the ideas we might discuss in our session.
That was about two months ago and the session went great. I started to write up the documentation for the example and then decided to do a quick movie. Unhappy with the movie I created, I decided to split it into two movies. After it was all said and done, I have seven different movies that I tried to string together into one mondo movie.

So the final movie product is over 36 minutes long and can be found at http://www.dwaynewright.com/videos09/VendorPick.mov. If you click the link, it will play the movie within your browser, you can also right click the link and download the movie to your machine.

An example file can be downloaded at ...
http://www.dwaynewright.com/blogfiles09/PickVendor.zip
=
More info about the author and FileMaker in general, contact me at info@dwaynewright.com.
© 2009 - Dwayne Wright - dwaynewright.com
The material on this document is offered AS IS. There is NO REPRESENTATION OR WARRANTY, expressed or implied, nor does any other contributor to this document. WARRANTIES OF MERCHANT ABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY DISCLAIMED. Consequential and incidental damages are expressly excluded. FileMaker Pro is the registered trademark of FileMaker Inc.
ADVERTISEMENT ==================
Help support this blog by considering a donating to its ongoing growth. For more details, please visit http://www.dwaynewright.com/donate.html
by Dwayne Wright (noreply@blogger.com) at June 23, 2009 02:47 AM
June 22, 2009
FileMaker Weetbix
Building a Tidy Database – An Overview
In this new series of articles, I am going to explain all the methods I use to help maintain a tidy and manageable database. As the size of a database grows, it can be very easy to fall into complacency, and become slack in areas such as naming conventions. I will give some tips on how to avoid this and keep your database spick and span
Why a Tidy Database?
Keeping your database tidy has huge benefits over the entire life cycle of the system. If you are building a database for the first time, or for a personal project, then you might think this is not important. Indeed, while you are in the development phase, you are “in the moment” – you know where everything goes, how everything works, and why everything is the way it is. Only later on down the track will it become apparent to you why you should have started keeping things tidy from the beginning. You might think you’ll never forget how your database works, but I guarantee that if you leave it for 6 months, it will feel like someone else built it when you return to do more development! The problem is people are continually learning, continually coming up with new ways to do things in FileMaker. The way you build a database 6 months from now may be completely different from the way you build a database now.
For this reason, it is important that you devise some simple conventions you can follow in the development of your database. If you maintain this consistency through your databases, then it becomes much easier to return to a database after a period of time, and be able to understand how it works.
For a developer, this is even more important. If you have multiple developers working on a project, then ensuring everyone is on the same wavelength when it comes to conventions is one of the most important things you should make sure of. Failing to do so usually results in everybody bringing their own ideas to the database, and the whole thing ends up in a mixture of conventions.
Most importantly, maintaining a tidy database is a great habit to get into. If you start early, and force yourself to stick to conventions, then you are well on your way to becoming a great developer!
What is a “Tidy” Database?
One of the biggest things that a tidy database contains is consistency. The term consistency encompasses a broad range of areas of the database, some examples are:
Now, being consistent does not necessarily mean being tidy. You can still have a database with consistently bad naming conventions! The goal is to find good naming conventions, and standards that you can understand and feel are easy to understand, and then stick with them! It’s no good switching your conventions halfway through development of a database unless you are prepared to change the conventions everywhere within the database.
What’s to come?
Within the coming weeks and months I will be writing articles (in order) on the following topics for this series:
You may be asking yourself what Anchor-Buoy is. Well in a nutshell it is a design methodology for how to structure your relationship graph efficiently. Most beginners to FileMaker start with a few tables, and some table occurrences on their graph to match the tables. They will create some basic relationships between the table occurrences, but generally won’t go beyond a certain level. If the database ever begins to grow in size and complexity, they might become overwhelmed with the number of relationships and table occurrences on the graph, and more often than not, the graph evolves into a classic “spiderweb” structure, with everything related to everything else, one big mess!
Anchor-Buoy breaks the cycle of the spiderweb graph. Hopefully I can do it justice and explain it sufficiently, because I believe it to be the single most significant thing you can use to help keep your database tidy and manageable going forward.
With Anchor-Buoy explained, I will move onto discuss the naming conventions I use for table and field names, and also the naming of table occurrences on the graph. How my table occurrences get their names is specific to having an anchor-buoy structure, which is why I must explain that first.
Next, I will go over some of the ways in which I keep scripts well organized. You might not think it necessary, but alot of larger FileMaker solutions contain over 500 scripts, so it pays to know how to locate them. I will also talk about some things you can do within your scripts to keep them tidy and more readable.
Then I will talk about some other conventions that apply to more specific areas, such as value lists and custom functions. While perhaps not quite as important as other naming conventions, that is no excuse not to slack off when naming them!
Finally, I’ll explain and demonstrate the importance of consistency when it comes to designing and building your layouts.
Stay tuned for more soon!

June 20, 2009
FileMaker Weetbix
Join my Table? – Part Three
In Part Two, I demonstrated how to implement the basics of the join table solution in FileMaker. While the solution works fine as an illustration for join tables, it lacked many of the basic interface features that would make it a usable solution. In part three, I will show how to implement some of these features, namely the following…
Better Selection of a Student…
In Part two, selection of a student for a new enrollment consisted of knowing the students ID number and entering it into the field. There was no feedback of whom the student was at any point – not very useful for anybody.
A much better way would be to build a value list of students, and allow the user to pick from a pre-defined list. This will give them a visual on the student names. For starters, we will just create a basic value list for students.

We have used the existing Students table occurrence to build the value list, which has also been setup to show all students. This value list uses the option to display a second value. Rather than deal with the students ID number, we have chosen to display the students full name as the displayed field. Underneath, the students ID is still being chosen and inserted into our Enrollments::Student ID field.
Now, attach the value list to the Enrollments::Student ID field in the Enrollments portal. You will see that the students full name is instantly displayed if you are using the pop-up menu option.

Now students can be selected for an enrollment via the pop-up menu. Now, this implementation is still not perfect. For example, there is no restriction on enrolling the same student twice. Also, if you have a large number of students, a pop-up menu is not the best option. A better option would be to use a drop-down menu, which brings with it some advantages and disadvantages. For now, we will stick with the popup-menu to demonstrate the technique, but may come back to these issues in a future article.
Deletion of an Enrollment…
This is a simple one, but a necessary one. We need some way to delete an enrollment. By far the easiest way is to insert a button into the enrollments portal, and attach to it the single script action Delete Portal Row. If you disable the dialog within this script step, the enrollment will be deleted instantly.
Sometimes however, this might be a dangerous action. Hitting the delete button by accident will cause the enrollment to be deleted right away, so you might want to ask the user for confirmation before deleting. Whether a confirmation is ever required is a topic that could be debated endlessly, but the technique would be as follows. First, it is going to require a new script, called “Delete Enrollment”. The script itself would look something like:

A custom dialog is presented to the user, asking them if they really wish to delete the enrollment. The users action is then captured via the Get ( LastMessageChoice ) function. 1 corresponds to the default button action, typically “OK” (though you can specify any action for the default button). If the user has clicked OK, we delete the portal row, otherwise we don’t.

Prevention of Over Enrolling a Course…
For this feature, we are going to need to record exactly how many enrollments are permitted for a given course. This is going to be done by introducing a new field into the Courses table called Max Enrollments, type number.
We create enrollments currently by using the relationship option Allow creation of records in this table via this relationship. This has been fine up until this point. But now that we wish to control how many enrollments are created, it is going to make more sense to disable this feature, and script our enrollment creation instead. By scripting the creation process, we can check whether the maximum number of enrollments has been reached, and prevent the user from adding more gracefully. (also, not to mention that having a blank portal row in the enrollments portal as a means to create enrollments is not exactly intuitive for users).
For this, we will need to do three things:
The script is going to need to do the following things:
Here is the script might look like:

The first thing this script does is two error checks:

Here you can see the new layout design. The blank portal row for creation of enrollments is gone. In its place is an “Add Enrollment” button. The new field “Max Enrollments” is also present, and has been set to 3. This means that we should only be allowed to create three enrollments.

It may be a little difficult from this picture to tell what has happened, but I have reached my limit of three enrollments. Now, clicking the “Add Enrollment” button does nothing.
Can this be made any more intuitive to the user? Well, we could easily place a custom dialog into our “Add Enrollment” script when the user tries to click the button when the maximum number of enrollments is reached. OR, we can use conditional formatting to convey to the user visually that this is the case, saving them the attempt at clicking the button.
First, we can conditionally format the button to appear inactive when the maximum number of enrollments is reached:



The same type of conditional formatting can be applied to the “Max Enrollments” field also if you wish.
Every solution presents its own problems. As you may have realised, there is nothing stopping a user from increasing the max enrollments number, creating enrollments, and then reducing the max enrollments number. This is a way for a user to bypass the restriction imposed on the “Add Enrollment” button. I won’t go into detail as to how this can be resolved, but some options would be:
Field Validation on the “Max Enrollments” field, so it can never be less than the number of enrollments that exist
Script the setting/changing of the Max Enrollments Field
Script Triggers to prevent a user from modifying it to a number less than the number of enrollments that exist.
All would be viable solutions, and perhaps might be discussed in a future article.
This concludes the series on Join Tables for now. Hopefully you have learned something out of these articles, and perhaps picked up a few tips and techniques along the way which will help you turn your basic join table, into something more powerful and user friendly.
You can download the example file used in this article here.

June 19, 2009
Soliant Consulting Blog
ScriptMaster a new paradigm
360works has outdone themselves yet again. ScriptMaster is a free plugin in the tradition of Scodigo’s SmartPill PHP plugin. Instead of PHP, ScriptMaster, embeds Java, and provides a means of registering any Java (Groovy) function as a FileMaker function call. The awesomeness of this is almost impossible for me to describe.
It’s hard to believe that it’s FREE! This plugin, removes the need for dozens of other plugins. Go to the web page and watch the 10 minute video to get your mind blown. As Jesse says at the end of the video, the revenue model is custom Groovy programming services he expects to sell to customize ScriptMaster, but the base free version comes with something like 50 powerful functions that will probably have other plugin vendors spitting nails. FileMaker developers, on the other hand, can dance for joy.
http://www.360works.com/scriptmaster/
Related posts:
- SuperContainer and mounted volumes On a Mac, if you configure SuperContainer to store images...
Related posts brought to you by Yet Another Related Posts Plugin.
FileMaker Thought Bucket
Button Bar Without Any Buttons - Compliments Of Script Triggers
WEB: www.dwaynewright.com
EMAIL: info@dwaynewright.com
TWITTER: dwaynewright
I’m not sure if this technique has been explored out on the inter-webs but I thought I’d share this with the FileMaker community at large. Creating a button bar by using repeating container fields is nothing new. Normally, you would put an invisible button on top of each repetition and it would perform the script. The repeating field allows you to cycle different graphic to show different buttons or different button states.
This is different, more powerful and ruthlessly simple. In this case, I’m using a repeating text field, there are no buttons, one OnObjectEnter script trigger and one very simple script. Here is a 11 minute long video that explores the process, please feel free to tell me what you think!Repeating Field Dock (script trigger only)
=
More info about the author and FileMaker in general, contact me at info@dwaynewright.com.
© 2009 - Dwayne Wright - dwaynewright.com
The material on this document is offered AS IS. There is NO REPRESENTATION OR WARRANTY, expressed or implied, nor does any other contributor to this document. WARRANTIES OF MERCHANT ABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY DISCLAIMED. Consequential and incidental damages are expressly excluded. FileMaker Pro is the registered trademark of FileMaker Inc.
ADVERTISEMENT ==================
Help support this blog by considering a donating to its ongoing growth. For more details, please visit http://www.dwaynewright.com/donate.html
by Dwayne Wright (noreply@blogger.com) at June 19, 2009 03:45 AM
June 18, 2009
Newest FileMaker Pro Custom Functions
IsDaylightSavings ( TS )
FM Success Tips
045_FM_Success_Tips
by FM Success Tips (SCS@sonic.net) at June 18, 2009 02:30 PM
FileMaker Weetbix
Sub-Summaries, and Displaying % of Total
Recently on the Cafe Forum over at FileMaker Today, someone asked if it was possible on a sub-summary report, to display the percentage of records contained within that sub summary. Having never needed this functionality before, I decided to investigate how this might be done. What I came up with is a fairly simple and straightforward way to implement this.
First, a little background on sub-summary reports. In FileMaker, reports are run on a given set of records, called the found set. They come from a single table, however if the records contain information in other tables via a relationship, then that information can be displayed if needed. Within the found set of records, there may be certain records that can be grouped together. A classic example would be a Customers table that contained among other things, a field to record the country a customer is from. Now, lets say the user wishes to produce a report of their customers. The easiest way would be to just create a layout, based on a customers table occurrence, and place some common customer fields on the layout, such as the customers name, country, and contact details.
Now, let’s say the user wishes to group customers by their countries on the report. This would make sense from a sales perspective. It would be nice to see all customers for a given country grouped together. It would also be nice to see how many customers there are for each country, and finally it would be handy to see what percentage of the overall customer base each country produces.
All of this can be accomplished very easily by using a special layout “part” called a “sub summary”. Think of a sub summary part is a header, but for a sub set of records (in our case, country will be the header for our sub-sets of customer records).
There are two important things to know when using a sub-summary part for a report, these are:
• In the sub-summary part setup box, you must specify a “break field”. This is the field that “breaks” up the records into various groups (in our case, the Country field)
• In order to correctly display the sub summary report, your records must be sorted by this break field.
In versions of FileMaker prior to 10, there is an added requirement in that you must be in Preview mode. FileMaker 10 has a new feature in that sub-summary parts will display correctly whilst in browse mode, though you must still ensure your records are sorted by the break field.
Back to the issue at hand. Normally in answering a question for a user, the best way to convey the solution is to build a small example file to demonstrate the technique, and this is exactly what I have done.
You can download the file Here.
(sorry for the bad file hosting link, I am trying to get some better hosting sorted)
Enjoy!

June 16, 2009
FileMaker, Inc. News Feed
New for Bento 2: Real-world uses and downloadable templates
June 14, 2009
FileMaker Weetbix
Join my Table? – Part Two
This implementation assumes you have a basic concept of relational database theory, in particular the use of primary and foreign keys in tables.
As a brief catchup, a primary key is a field in a table which has a unique value for each record. A perfect example would be a serial number field, which has a different number for each record. As good database practice, every table in your solution should have a primary key field, regardless of whether it is used or not.
A foreign key on the other hand, is a field in a table, which contains the primary key value of a record from another table. This is how two records in different tables are linked/related to one another, and indeed is how we are going to link an ENROLLMENT to both a STUDENT and a COURSE.
Table Setup
This solution is going to require the three tables mentioned above. It is very straightforward to create the tables. Each table will require a primary key, plus whatever fields you wish to capture information for, as a very basic example:
STUDENTS:

Students
COURSES

Courses
ENROLLMENTS

Enrollments
You can see that ENROLLMENTS has two foreign key fields, because we wish to relate an enrollment record to both a STUDENT record and a COURSE record.
Relationship Setup
How you setup your relationship graph is dependent upon personal preference. In fact, you can successfully implement this solution without having any relationships between the tables at all. However if you want to be able to see enrollments for either a student or course perspective on your layouts, you will need relationships.
In this example I will setup the most simplest of relationships. I have related ENROLLMENTS to both STUDENTS and COURSES via the key field associations as mentioned in the above section.

TO Setup
Building a Course Layout
This solution is going to require layouts for data entry. It will most likely have a Students layout, a Courses layout, and an Enrollments layout.
For this section I will focus on the Course layout only. Adding course-specific fields to this layout is easy. The layout is based on the Courses table occurrence, and so you can place course fields straight onto it.
A useful thing to have on this layout would be a list of all the enrollments for the current course. This can be achieved by placing a portal on the layout. The portal will be based on the Enrollments table occurrence. Be sure to select the related Enrollments table occurrence – the one that has the relationship between itself and the Courses table occurrence.
The fields you will want to put in the portal are basically all the fields from the Enrollments with the exception of a couple. First, it makes little sense to put Enrollment ID in the portal unless you are using this to identify your enrollments. Second, putting Course ID into the portal is redundant, since we are guaranteed that every record that displays in the portal will have the same Course ID as the parent course record, the relationship defines this condition.
So a basic layout might look like this:

Basic Layout
I have pre-populated all tables with a few records to illustrate how this will look. You can see here that the course has three enrollments.
This layout is fine for viewing course enrollments, but more often than not users wish to directly add enrollments from this layout. The easiest way to allow this is to turn on the Allow creation of records in this table via this relationship option on the relationship dialog. You will want to turn it on for the Enrollments side of the relationship, since it is these records you want to create.

Enabling Creation
Now, enrollment records can be created directly from the Courses layout by entering information into the last portal row.
While this is a fully workable solution so far, it lacks many nice features which make it usable for the average user. Current limitations include:
User must know a Students ID to add an enrollment
No visible way to delete enrollments
No restriction on number of enrollments created
This solution can be taken much further with a few simple techniques, some of which will be discussed in part three to this article coming soon!

June 12, 2009
FileMaker Weetbix
Join my Table? – Part One
Perhaps one of the most asked questions that I see on the Cafe Forum over at FileMaker Today, is “How do I do join tables?”. While some users have an understanding of what they are, they may lack the FileMaker skills to implement them. Others are unfamiliar with the concept altogether, but will explain their real word example. Usually it is a prime candidate for a join table. This article provides a real world example that will give you an understanding of why join tables are important, and in what circumstances they should be used. The example will then be implemented in a simple FileMaker solution.
Let’s get started.
Ponder this real world scenario…
“Joe want’s to build a database to manage the computer courses he offers to senior citizens. Being a one-man business, he only offers five courses. He wishes to capture information on his students, his courses, and who has enrolled in which courses.”
This scenario is very easy to understand when reading in plain english. Now lets deconstruct this scenario further.
When building a database from a users specification, one of the first things you should do is identify the potential tables:
With the main tables identified, can you begin to spot what might be the join table? Perhaps one last step will make it more apparent. Lets define in more specific terms which each table will capture within a single record:
How about now? Can you spot the join table? I think it is time to let the cat out of the bag. A join table is a tool by which you link two other tables together, or to put it in more defined terms:
A join table is used to establish a “many to many” relationship between two tables.
What does “many to many” mean? Well, in terms of the scenario it means this:
By using a join table, you are giving yourself much more freedom to capture as much information as you want, without compromising the integrity of your other tables. The STUDENTS table should only capture information about the student, such as their contact details. Likewise, the COURSES table should only capture information specific to a course, such as it’s name, location, and start time.
An ENROLLMENT is a thing, it’s a tangible, legitimate thing that you will want to capture information about, so it should have its own table.. It will capture who the student is, and which course they are enrolling in. In addition to that, it could capture information such as:
This information only makes sense if it is pertaining to a person for a specific course – a grade is meaningless to a course if you don’t know whose grade it is. Alternatively a grade is meaningless to a student if you don’t know for which course it was obtained.
Please Do Not Try This At Home…
So why not capture this enrollment information on the students table, and save us the extra table?
Doing this is bad. It is so bad in fact, that words cannot describe that badness it brings, on a badosity meter it would be off the charts…. If someone were to try it, let’s see how it would go.
Right, so we want to capture enrollment information on the Students table. Well, let’s start by capturing information about the first enrollment a student takes in a course. We will probably need some fields to capture this information:
So far so good. Oh look, Peter Jones just enrolled “Join Tables for Dummies” which has a Course ID of 5. So I will now go to Peter Jones’ record, and fill in my information:
Great. I have successfully captured all the enrollment information I need for Peter Jones enrolling in this course. When the course ends, I can fill in his Grade and all will be good… But wait.. Peter also wants to enroll in “Bad Database Design”. Where am I going to record THAT enrollment information? Well lets see, I could just create more fields to capture it, so I’ll do that.
Phew, glad that is over. I’ve still managed to capture information on his two enrollments……
* 6 Months Later…… *
WHAT?? Peter wants to enroll AGAIN in MORE COURSES??? What am I going to do?? I know… MORE AND MORE FIELDS !!!!!
Wrong.
Already this method has gone down the toilet. I am making the problem much worse by adding a new set of fields to the table for every enrollment. Every time a student enrolls in a course, the database schema must be modified. In short, avoid this like the plague. You don’t want to know what kind of problems you will get into when you want to start running reports! Some people who have tried this method have also gone the way of repeating fields. Rather than 1 field per enrollment, they create 1 field, with many repetitions – one repetition per enrollment. This is just as bad.
Stay tuned for Part Two coming very soon…

June 11, 2009
FileMaker, Inc. News Feed
Fox News demos Bento for iPhone: ‘powerful and versatile with a sleek interface’
FileMaker Custom Functions
ValueExists ( value; valuelist )
FM Success Tips
044_FM_Success_Tips
by FM Success Tips (SCS@sonic.net) at June 11, 2009 02:30 PM
June 09, 2009
The Philadelphia FileMaker User Group
Join us June 30 – “Case Study: FileMaker’s ROI for Oncology Services International”

FileMaker Custom Functions
WeekOfMonth ( _date; startingDay )
June 08, 2009
FileMaker, Inc. News Feed
Don't miss FileMaker DevCon 2009. Register by June 26 to save $200!
FileMaker Advisor Magazine
Change Your FileMaker Data Model in Mid-Stream
June 04, 2009
FM Success Tips
043_FM_Success_Tips
by FM Success Tips (SCS@sonic.net) at June 04, 2009 02:30 PM
June 03, 2009
The Philadelphia FileMaker User Group
FM Solutions – The IT Solutions FileMaker Newsletter

myFMbutler Blog
ClipManager 3.1.2 maintenance release
Last week we released Clip Manager 3.1.2 for Mac, now the Wndows version has also been updated.

This is a bug fix release:
June 02, 2009
uLearnIT - Making FileMaker Easy
FileMaker 10 Certified Developer
June 01, 2009
The Philadelphia FileMaker User Group
FileMaker 10 Certification Tests now available through Prometric

FileMaker Advisor Magazine
Highlight the Current FileMaker Pro Record
Automate Regression Testing in FileMaker Pro 10
May 29, 2009
May 28, 2009
The Philadelphia FileMaker User Group
Thanks to Jason Mundok; June meeting plans

May 27, 2009
May 25, 2009
FileMaker Custom Functions
unique_combinations_counter_rec ( number_values )
May 24, 2009
FileMaker Custom Functions
unique_combinations_counter ( number_values )
May 23, 2009
The FileMaker Collective
fmSpark/NinjaCal Road Show - May 28th, Santa Clara, CA
Thursday 28th May
6:30 PM to 9:30pm
FileMaker, Inc (The Wedge)
5201 Patrick Henry Dr.
Santa Clara, CA 95054