Registrado: Noviembre 2014
Mensajes: 2565
Edad: 48 Ubicación:
Re: Resumiendo: Mantener BBDD Con Comandos Gambas
En la creación "por código" no encuentro la forma de decir que un campo es único.
Mas abajo se ve un pantallazo de gambas y al lado un gestor de sqlite3 en donde si se puede hacer que un campo sea unico.
¿Alguna idea?
Saludos.
Registrado: Noviembre 2014
Mensajes: 2565
Edad: 48 Ubicación:
Re: Resumiendo: Mantener BBDD Con Comandos Gambas
shordi escribió:
Tienes que crear un índice único para ese campo. Colección indexes, igual que tables.
ok, también funciono, pero tuve que crear el indice después de hacer el update, de lo contrario no lo creaba.
Gracias por la ayuda.
Saludos.
La función para crear una tabla con, por lo menos dos campos. Donde el primero es el PK y el segundo tiene asignado un indice para que los datos en ese campo sean únicos, se pueden agregar mas campos pero (en esta función) serán tipo "texto" y sin restricciones.
PublicFunction TableMake1(cnx AsConnection, stxParam AsString[])AsInteger''<p>Crea una tabla en la conexion que se le pasa como parametro. Donde el orden de los paramentros dentro de la matriz debe ser el siguiente:</p><ul><li>0 Nombre de la tabla</li><li>1 Nombre del campo clave</li><li>2 Nombre del resto de los campos</li><li>N Nombre del ultimo campo</li></ul>
Dim tbl AsTable DimintAsInteger Dim strFKey AsString'Nombre del campo que sera Primary Key Dim strFIdx AsString'Nombre del campo indice para esta funsion sera uno solo, el siguiente al campo PK. Dim strFNme AsString'Nombre cambiante del resto de los campos.
If cnx.Tables.Exist(stxParam[0])=FalseThen
cnx.Tables.Add(stxParam[0])
tbl = cnx.Tables[stxParam[0]] With tbl Forint= 1 To stxParam.Max Selectint Case 1
strFKey = stxParam[0]& stxParam[int]
tbl.Fields.Add(strFKey, db.Serial) Case 2
strFIdx = stxParam[0]& stxParam[int]
tbl.Fields.Add(strFIdx, db.String) CaseElse
strFNme = stxParam[0]& stxParam[int]
tbl.Fields.Add(strFNme, db.String) EndSelect Next
tbl.PrimaryKey=[strFKey]
tbl.Update()
tbl.Indexes.Add(stxParam[0]&"_idx", [strFIdx], True)' Hay que crearlo despues de tbl.Update() para que funcione. EndWith
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
Re: Resumiendo: Mantener BBDD Con Comandos Gambas
Citar:
ok, también funciono, pero tuve que crear el indice después de hacer el update, de lo contrario no lo creaba.
No puede ser de otra manera: cuando creas un índice la BD necesita acceder a todos los registros e indexarlos o rechazarlos o avisar de que no ha podido porque hay inconsistencia de datos. Si no has hecho el update la tabla no está en un estado consistente y no se puede hacer dicho recorrido.
Registrado: Noviembre 2014
Mensajes: 2565
Edad: 48 Ubicación:
Re: Resumiendo: Mantener BBDD Con Comandos Gambas
Ahora me volví a frenar.
Quiero decir que un campo de los que creo por código sea una referencia a una clave foránea, pero no logro dar con la forma de hacerlo.
¿Alguna idea?
En algún punto de With tbl ... end With ¿Es posible crear la clave foránea?
El código que uso para crear los campos y los indices es el siguiente:
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
Re: Resumiendo: Mantener BBDD Con Comandos Gambas
Pues nunca lo he hecho. La creación de bases la suelo hacer con otras herramientas porque no es lo habitual con gambas, solo su uso. Cuando he necesitado crearlas han sido bases sqlite sencillas sin meterme en más honduras.
Así que en esas aguas navegas solo... ¡toma poesía!
Registrado: Noviembre 2014
Mensajes: 2565
Edad: 48 Ubicación:
Re: Resumiendo: Mantener BBDD Con Comandos Gambas
shordi escribió:
Pues nunca lo he hecho. La creación de bases la suelo hacer con otras herramientas porque no es lo habitual con gambas, solo su uso. Cuando he necesitado crearlas han sido bases sqlite sencillas sin meterme en más honduras.
Así que en esas aguas navegas solo... ¡toma poesía!
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
Re: Resumiendo: Mantener BBDD Con Comandos Gambas
Dándole vueltas al tema en la cama, creo que no sería difícil extender la clase table con la propiedad "relations" y ahí especificar las tablas, campos y campos de relación, o algo así en la que indicas con qué campo de qué tabla se relaciona y después añadir la relación con un comando sql según el tipo de la conexión. Algo así (escribo al vuelo):
publicsub Add(campo,tablaRel,campoRel)'añadimos la relación selectcaseme.type case"sqlite"or"sqlite3"then
comando sql adaptado a sqlite para crear la relación case"mysql"
comando sql adaptado a mysql para crear la relación endselect
$relations.Add(campo,[tablaRel,campoRel]) end
publicsub delete(campo,tablaRel,camporel) if $relations.exist(campo)then selectcaseme.type case"sqlite"or"sqlite3"then
comando sql adaptado a sqlite para eliminar la relación case"mysql"
comando sql adaptado a mysql para eliminar la relación endselect
$relations.remove(campo) end
Registrado: Noviembre 2014
Mensajes: 2565
Edad: 48 Ubicación:
Re: Resumiendo: Mantener BBDD Con Comandos Gambas
shordi escribió:
...creo que no sería difícil extender la clase table con la propiedad "relations" y ahí especificar las tablas, campos y campos de relación...
Seria un golazo.!!
Yo ahí en eso de extender las clases ya sabes que de momento no es lo mio.
Estaría muy bien poder poner claves foráneas por código en las tablas.
Fecha y hora actual: Lunes, 13 May 2024, 22:52 • Todas las horas son UTC + 1 Hora
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 0 invitados Usuarios registrados conectados: Ninguno
Lista de permisos
Lista de permisos
No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas No puede adjuntar archivos Puede descargar archivos No puede publicar eventos en el calendario