So, there are many solutions to this problem. Here's one.
In an event fired when the user initiates a search (note ii_TestID is an instance variable, other variable declaration local and left to you):
ii_TestID = Integer (sle_SearchTest.Text)
ll_RowCount = dw_Test.Retrieve (ii_TestID)
IF ll_RowCount = 0 THEN dw_Test.InsertRow(0)
I'm going to assume there's no button in the UI to add a new test result, so we'll be dealing with just one at a time. In the event to save:
li_ID = dw_Test.GetItemNumber (1, "test_id")
IF IsNull (li_ID) OR li_ID = 0 THEN dw_Test.SetItem (1, "test_id", ii_TestID)
dw_Test.Update()
Why am I leaving setting the test_id until the last minute? So I can code something like this in the CloseQuery event of the window:
IF dw_Test.ModifiedCount() > 0 or dw_Test.DeletedCount() > 0 THEN
CHOOSE CASE MessageBox ("Huh?", "Would you like to save your changes before exiting?", Question!, YesNoCancel!)
CASE 1
EVENT ue_Save()
CASE 2
// do nothing
CASE 3
RETURN 1
END CHOOSE
END IF
If I had changed the test_id right after InsertRow(), then ModifiedCount() would have registered the row as changed right away, even though the user hadn't done anything yet. Nothing more annoying than having a computer prompt me to save my changes when I haven't made any.
Good luck,
Terry.