Thanks for your thoughtful exercise. As is obvious from your example, it is
not easy. I used to work in another database system where one could create
and break relationships on the fly and all tables were available at all
times just by using the table name concatenated with the field. It was all
very slick.
----- Original Message -----
From: "Geoff Graham" <[EMAIL PROTECTED]>
To: <[email protected]>
Sent: Sunday, January 20, 2008 6:10 PM
Subject: Re: Adding records to a related file
On Jan 20, 2008, at 4:42 PM, Nicholas Geti wrote:
I am running FM 5.5.
I had problems with all three of your suggestions.
1. A script in the child table will create a new record but it needs the
key value which can only be passed into a Global variable from the
parent script. Then issuing another SetField() from the parent script
will write over the current record in the child. If there is more than
one record with the same key, the parent will then always replace the
first record. I could not find anyway to step through the child records
to the one I want.
Yeah, you have to run all the SetField()s in the child file.
You need a global relationship from the parent to the child:
gChild, which is gParentConstant::gChildConstant
gParentConstant is a global number in the parent with a value of 1;
gChildConstant is a global number in the child with a value of 1. When
you make that relationship, Filemaker will warn you that it will not
work. Make it anyway, because it's only used to set a global in child,
we'll call gKey.
Parent Script:
SetField(gChild::gKey, Key)
Perform Script(External, New Child Record)
Child Script:
Enter Browse Mode
New Record/REquest
SetField(Key, gKey)
Exit Record/REquest
I assume you already have a relationship from the Child back to the
Parent, just use that now to populate the Child:
(still in the child script)
SetField(Name, Parent::Name)
SetField(Address, Parent::Address)
...
2. Cannot import from the parent. Remember that there is a relation
between the parent and the child. If I am in the child, I would need a
relation back to the parent in order to see any fields in the parent.
This gave me lots of trouble actually trying to make it work so I gave
up.
Say you wanted one new child record:
Parent Script:
Show All records
Omit Record
Show Omitted
Perform Script(External, Child Import)
Child Script:
Import Records(Parent.fp5, Add New Records, Auto Enter)
If you don't know how to store an Import in a script step, just ask back.
3. The portal technique was a mess. I couldn't get it to show more than
one child record in the parent window.
The portal has to have "Allow Creation of Related Records" checked. You
have to be on the layout with the portal and in browse mode. Say the
relationship the portal uses is called "Child":
Enter Browse Mode
Go to Layout("Layout with Portal")
Go to Field (Child::Name)
Go to Portal Row(Last)
Set Field(Child::Name, Name)
Set Field(Child::Address, Address)
Set Field(Child::Phone, Phone)
...
Note that this way, the Key (or whatever field the relationship is based
on) will be automatically set by the portal relationship when the first
SetField() is done.
Set Field(Child::Name)
After a lot of hassle I finally got something working. From the parent I
used SetField() for each field in the child record to create a new
record. Then I used the External option to run a child script that saved
the key field, put a 9999999 in the key field, then issued New to create
a new record and put the original key in it. Then going back to the
parent, I issued SetField() which wrote over the new record. This
sequence was repeated for each child record of the same parent key.
After each set of child records for the current parent, I issued another
child script that replaced all the 9999999 values with the saved key.
This is a real mess. It just wouldn't be practical for an application
that is writing lots of child records on a random basis.
Yeah, that seems complicated. I guess you're using a temporary
relationship, kind of like I did in the first example, but I'm just using
the real key in a global, instead of some made-up key. That way I already
have it in the Child file and can kill two birds with one stone, so to
speak. The first way is my favorite way, by the way.
geoff
----- Original Message ----- From: "Geoff Graham" <[EMAIL PROTECTED]>
To: <[email protected]>
Sent: Saturday, January 19, 2008 5:19 PM
Subject: Re: Adding records to a related file
On Jan 19, 2008, at 4:07 PM, Nicholas Geti wrote:
How do I add additional records to a child (related) table from a
master table. These tables are related on the Invoice Number field in
each table and I can add one record just by doing SetField() on the
child's invoice field but if I issue the command again it simply
writes over the previous one as expected. How do I force creating a
second record having the same invoice number?
Use a script in the child table to make new records;
Use a script in the child table to import from the parent;
or, have a portal in the parent table to the child table that allows
creating records, go to the last portal row, then create your child
record by doing the SetField().
Those are 3 ways off the top of my head.
geoff