1. hatem moalla
  2. PowerBuilder
  3. Wednesday, 28 February 2024 08:51 AM UTC

in my powerbuilder 19 project, it's all about article management. when i click on "new" button, it displays a dwc_article(freeform) empty and i have to insert all the article details(reference, name ...) and in itemfocuschanged event of dwc_article. i made sure to get a messagebox "valdiation error" when i insert a reference or name empty. the problem is, when i select a row in dwc_report (tabular) and click "update" it display the article details in dwc_aritcle (freeform) but then when i click on "new" button it display the validation error message box 3 times and i don't wanna it to display in this case.

*here is the script for itemfocuschanged event of dwc_article:

integer li_row
string ls_reference
string ls_name

li_row = This.GetRow()
 cb_3.Enabled = false
 cb_7.Enabled = false



	// Check if the focus is on the reference field
	if This.GetColumnName() <> "reference"  then
		 // Get the value of the reference field
		 ls_reference = This.GetItemString(li_row, "reference")
	
		 // Check if the reference field is empty or has more than 50 characters
		 if IsNull(ls_reference) or Trim(ls_reference) = "" or Len(ls_reference) > 50 then
			  MessageBox("Validation Error", "Reference field must not be empty and should have 50 characters or less.")
			  // Set focus back to the reference field
						 cb_3.Enabled = false
						 cb_7.Enabled = false
			  This.SetColumn("reference")
			  return 1 // Prevent focus change
		 
	else
		
	end if
	end if
	
	
	
	
	li_row = This.GetRow()
	
	// Check if the focus is on the name field
	if This.GetColumnName() <> "name" and This.GetColumnName() <> "reference" then
		 // Get the value of the name field
		 ls_name = This.GetItemString(li_row, "name")
		 cb_3.Enabled = false
		 cb_7.Enabled = false
	
		 // Check if the name field is empty or has more than 50 characters
		 if IsNull(ls_name) or Trim(ls_name) = "" or Len(ls_name) > 50 then
			  MessageBox("Validation Error", "Name field must not be empty and should have 50 characters or less.")
			  // Set focus back to the name field
			  This.SetColumn("name")
			  cb_3.Enabled = false
			  cb_7.Enabled = false
			  return 1 // Prevent focus change
		 
	else
		cb_3.Enabled = true
		cb_7.Enabled = true
		end if
	end if

	
	return 0




*here is the script of "new" button :

dwc_article.reset()
dwc_article.insertrow(0)
char reference
dwc_article.scrolltorow(dwc_article.insertrow(0))

// Scroll to the newly inserted row
long ll_new_row
ll_new_row = dwc_article.InsertRow(0)
dwc_article.ScrollToRow(ll_new_row)


// Get the current date
date ld_date_creation
ld_date_creation = today()

string ls_formatted_date
ls_formatted_date = String(ld_date_creation, "yyyy-mm-dd")

// Set the current date to the "date_de_creation" column
dwc_article.SetItem(ll_new_row, "date_de_creation", ls_formatted_date)

bl_btn_new_clicked = true


dwc_article.modify("reference.Protect='0'") // This removes input capability from all columns
	   dwc_article.modify("name.Protect='0'")
	   dwc_article.modify("prix.Protect='0'")
		 dwc_article.modify("date_de_creation.Protect='1'")

and here is the script for "update" button :

long ll_row
ll_row = dwc_report.GetSelectedRow(0) // Get the selected row index in dwc_report


if ll_row >= 0 then // If a row is selected
    // Clear existing data in dwc_article
    dwc_article.Reset()
	 
	 long ll_nextRow
    ll_nextRow = dwc_article.RowCount() + 1

    // Copy data from dwc_report to dwc_article
    dwc_report.RowsCopy(ll_row, ll_row, Primary!, dwc_article, ll_nextRow, Primary!)

    // Disable all inputs in dwc_article
    dwc_article.modify("reference.Protect='1'") 
    dwc_article.modify("name.Protect='0'")
    dwc_article.modify("prix.Protect='0'")
    dwc_article.modify("date_de_creation.Protect='1'")

    // Retrieve data in dwc_article to reflect changes
    //dwc_report.retrieve()
	//dwc_article.retrieve()
else
    MessageBox("No row selected", "Please select a row in the report")
end if

 

Miguel Leeuwe Accepted Answer Pending Moderation
  1. Wednesday, 28 February 2024 21:59 PM UTC
  2. PowerBuilder
  3. # 1

Hi,

There's no need to check on the length > 50. just set the edit.limit attribute of the columns to 50. It'll avoid a user being able to insert more than 50 characters.

Also, I don't think that the ItemFocusChanged() event is the best place to do you validation. You can use the "required" attribute and then check in the itemError event. Another place to validate would be in the ItemChanged.

From within the ItemFocusChanged event, you're doing a setcolumn to another column, which will again trigger the itemfocuschanged from within the one that hasn't completed yet. At least use POST Setcolumn.

Be aware that if you pop-up a messagebox, the focus leaves the datawindow and when you close the messagebox, your event might be fired again when receiving focus.

Use POST for you messagebox.

Put an "AcceptText()" in your LoseFocus event of the dw, because if the user introduces a value and then simply clicks somewhere out of the dw, the events won't be triggered.

This line of code in the update is also not correct: "

if ll_row >= 0 then // If a row is selected

"

What you are saying is that if the ll_row = 0, a row is selected ???

regards.

Comment
There are no comments made yet.
  • Page :
  • 1


There are no replies made for this question yet.
However, you are not allowed to reply to this question.