In SQL Server Integration Services (SSIS) variables have scope (this was not the case in the forerunner DTS).
A variable can be accessed from any container that is an ancestor of the container to which the variable is scoped. This means that, for example, if you declare a variable and scope it to a Sequence container than it can be used by any of the tasks within that Sequence container (remember the container hierarchy discussion: http://blogs.conchango.com/jamiethomson/archive/2004/12/13/445.aspx)?
We know that packages are themseves containers and also that child packages are just an extension of the container hierarchy so this should mean that any variable declared in a parent package should be accessible by any child package called from that parent package, right? The answer is "Yes, but...". Let me explain.
A child package CAN see variables declared in a parent package at run-time, but at design-time the child package does not know that it is going to be executed as a child package and therefore at that point in time cannot "see" the variable in a parent package. Therefore any attempt to use a variable declared in a parent package in a task will result in a design-time validation error:
You can get around this problem by using a script task to assign the value of the variable in the parent package to a variable scoped to a container in the local package. Like this:
This works because the script task doesn't validate the variable names declared in its ReadOnlyVariables & ReadWriteVariables properties at design-time.
You can read a bit more about accessing variables in different packages here: http://blogs.conchango.com/jamiethomson/archive/2005/03/17/1151.aspx.
UPDATE: Read this: http://blogs.conchango.com/jamiethomson/archive/2007/08/28/Beware-of-variable-usage-in-script-tasks.aspx regarding the use of ReadOnlyVariables/ReadWriteVariables properties.