Issue in using Insert Named Query on a Populated Table

Frankly, don't bother. Use the approach I suggested, with messages.

Here's my own confirm popup view:

view's json
{
  "custom": {},
  "params": {
    "handler": "handler",
    "message": "message",
    "payload": null,
    "popup_id": "popid",
    "send_cancel": true,
    "source_id": null
  },
  "propConfig": {
    "params.handler": {
      "paramDirection": "input",
      "persistent": true
    },
    "params.message": {
      "paramDirection": "input",
      "persistent": true
    },
    "params.payload": {
      "paramDirection": "input",
      "persistent": true
    },
    "params.popup_id": {
      "paramDirection": "input",
      "persistent": true
    },
    "params.send_cancel": {
      "paramDirection": "input",
      "persistent": true
    },
    "params.source_id": {
      "paramDirection": "input",
      "persistent": true
    }
  },
  "props": {
    "defaultSize": {
      "height": 240,
      "width": 380
    }
  },
  "root": {
    "children": [
      {
        "meta": {
          "name": "Label"
        },
        "position": {
          "grow": 1
        },
        "propConfig": {
          "props.text": {
            "binding": {
              "config": {
                "path": "view.params.message"
              },
              "type": "property"
            }
          }
        },
        "props": {
          "style": {
            "overflow": "auto",
            "overflowWrap": "break-word",
            "textAlign": "center"
          }
        },
        "type": "ia.display.label"
      },
      {
        "children": [
          {
            "events": {
              "component": {
                "onActionPerformed": {
                  "config": {
                    "script": "\t\n\tpayload \u003d {\n\t\t\u0027confirm\u0027: True,\n\t\t\u0027source_id\u0027: self.view.params.source_id\n\t}\n\tif self.view.params.payload:\n\t\tpayload.update(self.view.params.payload)\n\tsystem.perspective.sendMessage(\n\t\tmessageType\t\u003d self.view.params.handler,\n\t\tpayload\t\t\u003d payload,\n\t)\n\tsystem.perspective.closePopup(self.view.params.popup_id)"
                  },
                  "scope": "G",
                  "type": "script"
                }
              }
            },
            "meta": {
              "name": "Button_confirm"
            },
            "position": {
              "basis": "50%"
            },
            "props": {
              "image": {
                "icon": {
                  "path": "material/check"
                }
              },
              "text": "Confirmer"
            },
            "type": "ia.input.button"
          },
          {
            "events": {
              "component": {
                "onActionPerformed": {
                  "config": {
                    "script": "\tif self.view.params.send_cancel:\n\t\tpayload \u003d {\n\t\t\t\u0027confirm\u0027: False,\n\t\t\t\u0027source_id\u0027: self.view.params.source_id\n\t\t}\n\t\tif self.view.params.payload:\n\t\t\tpayload.update(self.view.params.payload)\n\t\tsystem.perspective.sendMessage(\n\t\t\tmessageType\t\u003d self.view.params.handler,\n\t\t\tpayload\t\t\u003d payload,\n\t\t)\n\tsystem.perspective.closePopup(self.view.params.popup_id)"
                  },
                  "scope": "G",
                  "type": "script"
                }
              }
            },
            "meta": {
              "name": "Button_cancel"
            },
            "position": {
              "basis": "50%"
            },
            "props": {
              "image": {
                "icon": {
                  "path": "material/close"
                }
              },
              "primary": false,
              "text": "Annuler"
            },
            "type": "ia.input.button"
          }
        ],
        "meta": {
          "name": "buttons"
        },
        "position": {
          "basis": "32px",
          "shrink": 0
        },
        "props": {
          "style": {
            "gap": "10px"
          }
        },
        "type": "ia.container.flex"
      }
    ],
    "meta": {
      "name": "root"
    },
    "props": {
      "direction": "column",
      "style": {
        "gap": "5px",
        "padding": "5px"
      }
    },
    "type": "ia.container.flex"
  }
}

Copy the json, create a new flex based view, shift + right click on it and select paste json.
Check the buttons scripts, see how it works, and make your own.

Then, on your AddBrassTag popup's root, add a script. In there, you can add a message handler. The name you give it is the value you'll pass to the handler parameter of the popup, so that it can send this message when the "confirm" button is clicked.
In the handler, check payload['confirm'], and handle the inserts there.

As a bonus, here's the function I use for bulk inserts:

def build_insert_string(table, data, columns=None):
	"""
	Build the query string and the values list for a multi-insert query.
	Use with `system.db.runPrepUpdate`
	params:
		table (string):						The table to insert into
		data (list of dicts):				A list containing a dict for each row to insert, where the keys are the columns names
		columns_names (list of strings):	The columns to be inserted. If None, they're deduced from the first row's keys.
	return:
		a tuple where:
			- the first element is the query string formatted for a `prepUdate` (with question marks as place holders)
			- the second element is the list of values
	"""
	if not data:
		return None, None
	if columns is None:
		columns = data[0].keys()
	marks = "({})".format(','.join("?" for _ in columns))
	marks = ",".join(marks for _ in data)
	col_names = ','.join(columns)
	q = "insert into {} ({}) values {}".format(table, col_names, marks)
	values = [row[c] for row in data for c in columns]
	return q, values

edit: The names of the parameters may be confusing. handler is the message handler, message is the message that will be displayed in the popup.

1 Like