How to access selection of a row of a table in a icon script

def runAction(self, event):
	if (self.parent.parent.parent.parent.parent.getChild("Table").onSelectionchange(event.selectedRow)==1):
		params = {'id':self.parent.parent.parent.parent.parent.getChild("Table").props.selection.data[0].ID}
		system.db.runNamedQuery("Delete_Rows", params)
		system.db.runNamedQuery("Edit_data")
		self.parent.parent.parent.parent.parent.getChild("Table").refreshBinding("props.data")
	else:
		system.perspective.openPopup("AlertId",view,params={'display':"Select the row to be Deleted"} )
	

i want to know whether the row has been selected or not
additionally is the popup id correct if not how to get it

Relative paths vs custom properties
As I'm sure you have found, self.parent.parent.parent.parent.parent.getChild syntax is awkward to set up, difficult to read and very hard to maintain when components are moved in a view. Try this:

  • On the view, create a custom property to hold a copy of the table data you are examining.
  • Create a Property Binding on that table property, point it at the custom property and set the binding to bidirectional.
  • Now you can replace the awkward syntax with self.view.custom.myCustomProp or whatever you called it.

Row selected or not

i want to know whether the row has been selected or not.

Create a view.custom.selectedRow property. Bind table props.selection.selectedRow to the custom property with a bidirectional property binding.
Now you can use
if self.view.custom.selectedRow:
A non-null value indicates that a row is selected.

Popup

additionally is the popup id correct if not how to get it

You don't need the popup. Disable or hide the delete button if no row has been selected. Don't waste the user's time by presenting options that won't work.

Thanks a lot i will try it

I send you an onActionPerformed Script I did with the help of Transistor in case it helps:

def runAction(self, event):
		
	# Reference the table component directly
	table = self.getSibling("tblWorkRequest")
	
	# Retrieve the selected rows
	selected_rows = table.props.selection.data
	
	# Check if any row is selected
	if not selected_rows:
	    system.perspective.messageBox("Please select a row to process", title="Notice")
	else:
	    # Process the first selected row (if only one row is expected)
	    selected_row = selected_rows[0]
	
	    # Extract specific columns' data using the column names
	    sede = selected_row.get("SEDE")  # Replace with the actual column name
	    solicitud = selected_row.get("SOLICITUD")  # Replace with the actual 
              column name
	
	
	    popup_params = {
	        "sede": sede,
	        "solicitud": solicitud
	    }
	
	    # Open the popup view, passing the parameters
	    system.perspective.openPopup(
	        id="aprobar-popup",  # A unique identifier for this popup instance
	        view="Page/Aprobar",
	        params=popup_params,
	        title="Aprobar Solicitud",
	        modal=False,
	        width=400,
	        height=300

	)

i can't comprehend it correctly
let me explain it if i am wrong correct me , i want to create a custom property in view or page and write the view.custom.selectedRow in it and bind it to table proprety data or something like that please explain with a example

I think I would have told you the same thing. Disable the button if no row is selected. Don't have unnecessary popups to annoy the user.

1 Like

but the highers want that function so i have to do it

Sorry, it is just wrong and bad GUI design.

What is their specification?

Yes, you right, I just fixed it up, so the user get a message in case they didn´t select any row to remind them to do so.


	selected_rows = table.props.selection.data


	if not selected_rows:
		
	         system.perspective.openPopup(
            id="noneSelected-popup",  # A unique identifier for this popup instance
            view="Page/NoneSelected",
            title="No hay fila seleccionada",
            modal=True,
            width=300,
            height=200
        )

image

But there is no need!
Disable the button until the user selects a row!

Is row selected

Expression binding on button's enabled property.

No script code.
No popup.
No time wasted by the designer (once) or the user (every day).

1 Like

but if i bind table to that property what about query update

1 Like

if i change it to a relative path i can't access the selection function

Caused by: org.python.core.PyException: AttributeError: 'com.inductiveautomation.ignition.gateway.datasourc' object has no attribute 'selection'


it shows error like this help me transistor

Your script becomes something like this:

def runAction(self, event):
	# If button was enabled then a row has been selected.
	params = {'id': self.view.custom.selectedRow[0].ID}
	system.db.runNamedQuery("Delete_Rows", params)

	system.db.runNamedQuery("Edit_data")

	# Refresh the table binding to show the updated records.
	system.perspective.sendMessage("tableRefresh", payload = {}, scope = "view")

Then on the table you right-click, Configure Scripts, ...

1 Like