def query(self, n, parent=None): """ Para obtener una consulta de la base de datos, a partir de un fichero XML. El nombre de la consulta corresponde con el nombre del fichero mas la extensión ".qry" que contiene en XML la descripción de la consulta. Este método escanea el fichero y construye/devuelve el objeto FLSqlQuery. NO SE HACEN CHEQUEOS DE ERRORES SINTÁCTICOS EN EL XML. @param n Nombre de la consulta de la base de datos que se quiere obtener @return Un objeto FLSqlQuery que representa a la consulta que se quiere obtener """ qryName = "%s.qry" % n qry_ = self.db_.managerModules().contentCached(qryName) if not qry_: return None # parser_ = etree.XMLParser( # ns_clean=True, # encoding="UTF-8", # remove_blank_text=True, #) q = FLSqlQuery(parent, self.db_.connectionName()) root_ = etree.ElementTree.fromstring(qry_) q.setSelect( root_.find("select").text.replace(" ", "").replace("\n", "").replace( "\t", "").replace("\r", "")) q.setFrom(root_.find("from").text.strip(' \t\n\r')) q.setWhere(root_.find("where").text.strip(' \t\n\r')) q.setTablesList(root_.find("tables").text.strip(' \t\n\r')) orderBy_ = None try: orderBy_ = root_.find("order").text.strip(' \t\n\r') q.setOrderBy(orderBy_) except Exception: pass groupXml_ = root_.findall("group") if not groupXml_: groupXml_ = [] # group_ = [] i = 0 while i < len(groupXml_): gr = groupXml_[i] if float(gr.find("level").text.strip(' \t\n\r')) == i: # print("LEVEL %s -> %s" % (i,gr.xpath("field/text()")[0].strip(' \t\n\r'))) q.addGroup( FLGroupByQuery(i, gr.find("field").text.strip(' \t\n\r'))) i = i + 1 return q
def installACL(self, idacl): """ Crea un nuevo fichero "acl.xml" y lo almacena sustituyendo el anterior, en el caso de que exista. @param idacl Identificador del registro de la tabla "flacls" a utilizar para crear "acl.xml". """ util = FLUtil() doc = QDomDocument("ACL") root = doc.createElement("ACL") doc.appendChild(root) name = doc.createElement("name") root.appendChild(name) n = doc.createTextNode(idacl) name.appendChild(n) q = FLSqlQuery() q.setTablesList("flacs") q.setSelect("idac,tipo,nombre,iduser,idgroup,degroup,permiso") q.setFrom("flacs") q.setWhere("idacl='%s'" % idacl) q.setOrderBy("prioridad DESC, tipo") q.setForwarOnly(True) if q.exec_(): step = 0 progress = util.ProgressDialog( util.tr("Instalando control de acceso..."), None, q.size(), None, None, True) progress.setCaption(util.tr("Instalando ACL")) progress.setMinimumDuration(0) progress.setProgress(++step) while q.next(): self.makeRule(q, doc) progress.setProgress(++step) self.database().managerModules().setContent( "acl.xml", "sys", doc.toString())
def installACL(self, idacl): """ Crea un nuevo fichero "acl.xml" y lo almacena sustituyendo el anterior, en el caso de que exista. @param idacl Identificador del registro de la tabla "flacls" a utilizar para crear "acl.xml". """ util = FLUtil() doc = QDomDocument("ACL") root = doc.createElement("ACL") doc.appendChild(root) name = doc.createElement("name") root.appendChild(name) n = doc.createTextNode(idacl) name.appendChild(n) q = FLSqlQuery() q.setTablesList("flacs") q.setSelect("idac,tipo,nombre,iduser,idgroup,degroup,permiso") q.setFrom("flacs") q.setWhere("idacl='%s'" % idacl) q.setOrderBy("prioridad DESC, tipo") q.setForwarOnly(True) if q.exec_(): step = 0 progress = util.ProgressDialog( util.tr("Instalando control de acceso..."), None, q.size(), None, None, True) progress.setCaption(util.tr("Instalando ACL")) progress.setMinimumDuration(0) progress.setProgress(++step) while q.next(): self.makeRule(q, doc) progress.setProgress(++step) self.database().managerModules().setContent("acl.xml", "sys", doc.toString())
def nextCounter(self, *args, **kwargs): if len(args) == 2: name = args[0] cursor_ = args[1] if not cursor_: return None tMD = cursor_.metadata() if not tMD: return None field = tMD.field(name) if not field: return None type_ = field.type() if not type_ == "string" and not not type_ == "double": return None _len = field.length() cadena = None q = FLSqlQuery(None, cursor_.db().connectionName()) q.setForwardOnly(True) q.setTablesList(tMD.name()) q.setSelect(name) q.setFrom(tMD.name()) q.setWhere("LENGTH(%s)=%d" % (name, _len)) q.setOrderBy(name + " DESC") if not q.exec(): return None maxRange = 10**_len numero = maxRange while numero >= maxRange: if not q.next(): numero = 1 break numero = float(q.value(0)) numero = numero + 1 if type_ == "string": cadena = str(numero) if len(cadena) < _len: relleno = None relleno = cadena.rjust(_len - len(cadena), '0') cadena = str + cadena return cadena if type_ == "double": return numero return None else: serie = args[0] name = args[1] cursor_ = args[2] if not cursor_: return None tMD = cursor_.metadata() if not tMD: return None field = tMD.field(name) if not field: return None type_ = field.type() if not type_ == "string" and not type_ == "double": return None _len = field.length() - len(serie) cadena = None where = "length(%s)=%d AND substring(%s FROM 1 for %d) = '%s'" % ( name, field.length(), name, len(serie), serie) select = "substring(%s FROM %d) as %s" % (name, len(serie) + 1, name) q = FLSqlQuery(None, cursor_.db().connectionName()) q.setForwardOnly(True) q.setTablesList(tMD.name()) q.setSelect(select) q.setFrom(tMD.name()) q.setWhere(where) q.setOrderBy(name + " DESC") if not q.exec(): return None maxRange = 10**_len numero = maxRange while numero >= maxRange: if not q.next(): numero = 1 break numero = float(q.value(0)) numero = numero + 1 if type_ == "string" or type_ == "double": cadena = numero if len(cadena) < _len: relleno = cadena.rjust(_len - len(cadena), '0') cadena = relleno + cadena #res = serie + cadena return cadena return None
def nextCounter(self, *args, **kwargs): """ Este metodo devuelve el siguiente valor de un campo tipo contador de una tabla. Este metodo es muy util cuando se insertan registros en los que la referencia es secuencial y no nos acordamos de cual fue el ultimo numero usado. El valor devuelto es un QVariant del tipo de campo es el que se busca la ultima referencia. Lo más aconsejable es que el tipo del campo sea 'String' porque así se le puede dar formato y ser usado para generar un código de barras. De todas formas la función soporta tanto que el campo sea de tipo 'String' como de tipo 'double'. @param name Nombre del campo @param cursor_ Cursor a la tabla donde se encuentra el campo. @return Qvariant con el numero siguiente. @author Andrés Otón Urbano. """ """ dpinelo: Este método es una extensión de nextCounter pero permitiendo la introducción de una primera secuencia de caracteres. Es útil cuando queremos mantener diversos contadores dentro de una misma tabla. Ejemplo, Tabla Grupo de clientes: Agregamos un campo prefijo, que será una letra: A, B, C, D. Queremos que la numeración de los clientes sea del tipo A00001, o B000023. Con esta función, podremos seguir usando los métodos counter cuando agregamos esa letra. Este metodo devuelve el siguiente valor de un campo tipo contador de una tabla para una serie determinada. Este metodo es muy util cuando se insertan registros en los que la referencia es secuencial según una secuencia y no nos acordamos de cual fue el último numero usado. El valor devuelto es un QVariant del tipo de campo es el que se busca la ultima referencia. Lo más aconsejable es que el tipo del campo sea 'String' porque así se le puede dar formato y ser usado para generar un código de barras. De todas formas la función soporta tanto que el campo sea de tipo 'String' como de tipo 'double'. @param serie serie que diferencia los contadores @param name Nombre del campo @param cursor_ Cursor a la tabla donde se encuentra el campo. @return Qvariant con el numero siguiente. @author Andrés Otón Urbano. """ if len(args) == 2: name = args[0] cursor_ = args[1] if not cursor_: return None tMD = cursor_.metadata() if not tMD: return None field = tMD.field(name) if not field: return None type_ = field.type() if not type_ == "string" and not not type_ == "double": return None _len = int(field.length()) cadena = None q = FLSqlQuery(None, cursor_.db().connectionName()) q.setForwardOnly(True) q.setTablesList(tMD.name()) q.setSelect(name) q.setFrom(tMD.name()) q.setWhere("LENGTH(%s)=%s" % (name, _len)) q.setOrderBy(name + " DESC") if not q.exec_(): return None maxRange = 10 ** _len numero = maxRange while numero >= maxRange: if not q.next(): numero = 1 break numero = int(q.value(0)) numero = numero + 1 if type_ == "string": cadena = str(numero) if len(cadena) < _len: relleno = None relleno = cadena.rjust(_len, '0') cadena = relleno return cadena if type_ == "double": return numero return None else: serie = args[0] name = args[1] cursor_ = args[2] if not cursor_: return None tMD = cursor_.metadata() if not tMD: return None field = tMD.field(name) if not field: return None type_ = field.type() if not type_ == "string" and not type_ == "double": return None _len = field.length() - len(serie) cadena = None where = "length(%s)=%d AND substring(%s FROM 1 for %d) = '%s'" % ( name, field.length(), name, len(serie), serie) select = "substring(%s FROM %d) as %s" % ( name, len(serie) + 1, name) q = FLSqlQuery(None, cursor_.db().connectionName()) q.setForwardOnly(True) q.setTablesList(tMD.name()) q.setSelect(select) q.setFrom(tMD.name()) q.setWhere(where) q.setOrderBy(name + " DESC") if not q.exec_(): return None maxRange = 10 ** _len numero = maxRange while numero >= maxRange: if not q.next(): numero = 1 break numero = float(q.value(0)) numero = numero + 1 if type_ == "string" or type_ == "double": cadena = numero if len(cadena) < _len: relleno = cadena.rjust(_len - len(cadena), '0') cadena = relleno + cadena # res = serie + cadena return cadena return None
def nextCounter(self, *args, **kwargs): """ Este metodo devuelve el siguiente valor de un campo tipo contador de una tabla. Este metodo es muy util cuando se insertan registros en los que la referencia es secuencial y no nos acordamos de cual fue el ultimo numero usado. El valor devuelto es un QVariant del tipo de campo es el que se busca la ultima referencia. Lo más aconsejable es que el tipo del campo sea 'String' porque así se le puede dar formato y ser usado para generar un código de barras. De todas formas la función soporta tanto que el campo sea de tipo 'String' como de tipo 'double'. @param name Nombre del campo @param cursor_ Cursor a la tabla donde se encuentra el campo. @return Qvariant con el numero siguiente. @author Andrés Otón Urbano. """ """ dpinelo: Este método es una extensión de nextCounter pero permitiendo la introducción de una primera secuencia de caracteres. Es útil cuando queremos mantener diversos contadores dentro de una misma tabla. Ejemplo, Tabla Grupo de clientes: Agregamos un campo prefijo, que será una letra: A, B, C, D. Queremos que la numeración de los clientes sea del tipo A00001, o B000023. Con esta función, podremos seguir usando los métodos counter cuando agregamos esa letra. Este metodo devuelve el siguiente valor de un campo tipo contador de una tabla para una serie determinada. Este metodo es muy util cuando se insertan registros en los que la referencia es secuencial según una secuencia y no nos acordamos de cual fue el último numero usado. El valor devuelto es un QVariant del tipo de campo es el que se busca la ultima referencia. Lo más aconsejable es que el tipo del campo sea 'String' porque así se le puede dar formato y ser usado para generar un código de barras. De todas formas la función soporta tanto que el campo sea de tipo 'String' como de tipo 'double'. @param serie serie que diferencia los contadores @param name Nombre del campo @param cursor_ Cursor a la tabla donde se encuentra el campo. @return Qvariant con el numero siguiente. @author Andrés Otón Urbano. """ if len(args) == 2: name = args[0] cursor_ = args[1] if not cursor_: return None tMD = cursor_.metadata() if not tMD: return None field = tMD.field(name) if not field: return None type_ = field.type() if not type_ == "string" and not not type_ == "double": return None _len = int(field.length()) cadena = None q = FLSqlQuery(None, cursor_.db().connectionName()) q.setForwardOnly(True) q.setTablesList(tMD.name()) q.setSelect(name) q.setFrom(tMD.name()) q.setWhere("LENGTH(%s)=%s" % (name, _len)) q.setOrderBy(name + " DESC") if not q.exec_(): return None maxRange = 10**_len numero = maxRange while numero >= maxRange: if not q.next(): numero = 1 break numero = int(q.value(0)) numero = numero + 1 if type_ == "string": cadena = str(numero) if len(cadena) < _len: relleno = None relleno = cadena.rjust(_len, '0') cadena = relleno return cadena if type_ == "double": return numero return None else: serie = args[0] name = args[1] cursor_ = args[2] if not cursor_: return None tMD = cursor_.metadata() if not tMD: return None field = tMD.field(name) if not field: return None type_ = field.type() if not type_ == "string" and not type_ == "double": return None _len = field.length() - len(serie) cadena = None where = "length(%s)=%d AND substring(%s FROM 1 for %d) = '%s'" % ( name, field.length(), name, len(serie), serie) select = "substring(%s FROM %d) as %s" % (name, len(serie) + 1, name) q = FLSqlQuery(None, cursor_.db().connectionName()) q.setForwardOnly(True) q.setTablesList(tMD.name()) q.setSelect(select) q.setFrom(tMD.name()) q.setWhere(where) q.setOrderBy(name + " DESC") if not q.exec_(): return None maxRange = 10**_len numero = maxRange while numero >= maxRange: if not q.next(): numero = 1 break numero = float(q.value(0)) numero = numero + 1 if type_ == "string" or type_ == "double": cadena = numero if len(cadena) < _len: relleno = cadena.rjust(_len - len(cadena), '0') cadena = relleno + cadena # res = serie + cadena return cadena return None
def nextCounter(self, *args, **kwargs): if len(args) == 2: name = args[0] cursor_ = args[1] if not cursor_: return None tMD = cursor_.metadata() if not tMD: return None field = tMD.field(name) if not field: return None type_ = field.type() if not type_ == "string" and not not type_ == "double": return None _len = field.length() cadena = None q = FLSqlQuery(None, cursor_.db().connectionName()) q.setForwardOnly(True) q.setTablesList(tMD.name()) q.setSelect(name) q.setFrom(tMD.name()) q.setWhere("LENGTH(%s)=%d" % (name, _len)) q.setOrderBy(name + " DESC") if not q.exec(): return None maxRange = 10 ** _len numero = maxRange while numero >= maxRange: if not q.next(): numero = 1 break numero = float(q.value(0)) numero = numero + 1 if type_ == "string": cadena = str(numero) if len(cadena) < _len: relleno = None relleno = cadena.rjust(_len - len(cadena), '0') cadena = str + cadena return cadena if type_ == "double": return numero return None else: serie = args[0] name = args[1] cursor_ = args[2] if not cursor_: return None tMD = cursor_.metadata() if not tMD: return None field = tMD.field(name) if not field: return None type_ = field.type() if not type_ == "string" and not type_ == "double": return None _len = field.length() - len(serie) cadena = None where = "length(%s)=%d AND substring(%s FROM 1 for %d) = '%s'" % (name, field.length(), name, len(serie), serie) select = "substring(%s FROM %d) as %s" % (name, len(serie) + 1, name) q = FLSqlQuery(None, cursor_.db().connectionName()) q.setForwardOnly(True) q.setTablesList(tMD.name()) q.setSelect(select) q.setFrom(tMD.name()) q.setWhere(where) q.setOrderBy(name + " DESC") if not q.exec(): return None maxRange = 10 ** _len numero = maxRange while numero >= maxRange: if not q.next(): numero = 1 break numero = float(q.value(0)) numero = numero + 1 if type_ == "string" or type_ == "double": cadena = numero if len(cadena) < _len: relleno = cadena.rjust(_len - len(cadena), '0') cadena = relleno + cadena #res = serie + cadena return cadena return None