PowerBuilder: Insert data using a datawindow

MD Sayem Ahmed picture MD Sayem Ahmed · Jun 16, 2010 · Viewed 8.9k times · Source

Suppose I have a table called 'test', into which there are three columns named test_id, test_name and test_age. I have used a retrieval argument called :al_test_id to prompt the user to insert an id and search the database for the corresponding id entries, and if found, display it to the user. Now if no entry is found, then I want the user to be able to insert a new row using the id that he/she entered as the retrieval argument.

How can I do that?

Answer

Terry picture Terry · Jun 16, 2010

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.