https://foro.gambas-es.org/viewtopic.php?f=3&t=4807
-----------------------------------
v3ctor
Domingo, 09 Agosto 2015, 22:19

Faa Problemas Con Sql En Versión 3.8!!!
-----------------------------------
buenas,

bueno me estoy comiendo varias sorpresas desagradables en la nueva version 3.8

resulta que agregue una columna "referencias"

con esta sentencia: alter table Lucas add column referencias

y la pruebo y me dice que el campo referencias no existe cuando si lo creo, en esa insertidumbre empiezo a buscar por varios lados y resulta que al mirar la sentencia de la tabla master, la sentencia esta mal  :shock: 


asi aparece:
[code linenumbers=false syntax=sql]CREATE TABLE "Lucas" ( "idlucas" integer NOT NULL primary key autoincrement,
"capitulo" integer not null,
"versiculo" integer not null,
"texto" TEXT, referencias)[/code]

asi deberia aparecer:

[code linenumbers=false syntax=sql]CREATE TABLE "Lucas" ( "idlucas" integer NOT NULL primary key autoincrement,
"capitulo" integer not null,
"versiculo" integer not null,
"texto" TEXT,
"referencias" TEXT)[/code]


alguna idea?  sigo viendo que pasa....  :shock:  :shock:


-----------------------------------
Shell
Lunes, 10 Agosto 2015, 00:18

Re: Faa Problemas Con Sql En Versión 3.8!!!
-----------------------------------
Hola v3ctor.

Prueba a hacerlo sin las comillas y comprueba si no necesitas usar COLUM

[code linenumbers=false syntax=SQL]
ALTER TABLE Lucas ADD referencias
[/code]

Referencia:

http://sqlite-latino.blogspot.com.es/2007/12/alter-table.html

Saludos


-----------------------------------
shordi
Lunes, 10 Agosto 2015, 06:26

Re: Faa Problemas Con Sql En Versión 3.8!!!
-----------------------------------
¿Por qué cuando creas la tabla le dices qué tipo de columna es y qué longitud tiene y cuando añades la columna no le dices nada más que el nombre? 
Lo pregunto porque veo que sólo te ha añadido el nombre, que es lo que le dices que haga...

 :mryellow:  :mryellow:


-----------------------------------
Shell
Lunes, 10 Agosto 2015, 07:50

Re: Faa Problemas Con Sql En Versión 3.8!!!
-----------------------------------
Shordi:

¿ Es distinto a escribirlo desde la consola de Sqlite a hacerlo cuando escribimos en el editor de Gambas ?.
Es que lo que veo que en la página que añadí de referencia no añade comillas al nombre del campo nuevo, ni tampoco columna. 
Se supone que se hace automáticamente.  :???: 

Cuando normalmente debería ser:

[code linenumbers=false syntax=SQL]
ALTER TABLE "table_name" ADD "column_name" "Data Type"
[/code]

Que por defecto es texto, siempre es texto claro.

Otra cuestión, ¿ se puede añadir múltiples columnas en Sqlite o solo lo permite  hacerlo MySQL, Oracle y SQL_Server ?. Supongo que si.
Parece que la sintaxis es igual. Ejemplo: (Esto es en MySQL)

[code linenumbers=false syntax=SQL]
ALTER TABLE Cliente ADD (Email char(30), Telefono char(20) ); 
[/code]


Saludos


-----------------------------------
v3ctor
Lunes, 10 Agosto 2015, 14:53

Re: Faa Problemas Con Sql En Versión 3.8!!!
-----------------------------------
esto: alter table Lucas add "ayuda1" TEXT


me deja esto:

[code linenumbers=false syntax=sql]CREATE TABLE "Lucas" ( "idlucas" INT4 NOT NULL , "capitulo" INT4, "versiculo" INT4, "texto" TEXT, "referencias" TEXT, "ayuda" "TEXT", "ayuda1" TEXT, PRIMARY KEY ("idlucas") )[/code]

como ven gambas cambia la sentencia, una sentencia hecha de cero queda así:

[code linenumbers=false syntax=sql]CREATE TABLE "Hageo" ( "idhageo" integer NOT NULL primary key autoincrement,
"capitulo" integer not null,
"versiculo" integer not null,
"texto" TEXT,
"ayuda1" TEXT)[/code]


menos mal que este problema surgió con una tabla que solo le había agregado 4 capítulos sino me muero algunas tablas tienen 24 capítulos
yo en realidad me "equivoque" pues las referencias era algo que tendría que haber previsto pero bueno en programación no todo puede ser planificado, algunas cosas o la mayoría se van haciendo en el camino, mientras bailas ajjajajajaj


no he podido borrar las columnas creadas, con : [code linenumbers=false syntax=sql]alter table Lucas drop referencias[/code]   ni con     [code linenumbers=false syntax=sql]alter table Lucas drop column referencias[/code]


alguien sabe como borrar una columna desde la consola sql de gambas?


-----------------------------------
v3ctor
Lunes, 10 Agosto 2015, 15:21

Re: Faa Problemas Con Sql En Versión 3.8!!!
-----------------------------------
consulta MAESTRO SHORDI  :razz: 


dado este problema que se dio estoy manejando la idea de crear una tabla nueva con la columna referencia incluida y copiar los datos de la tabla que quedo mal, después renombrar la tabla nueva a su titulo original

como seria el comando para pasar los datos de las columnas de una tabla a otra?
creo que se puede copiar 

espero su respuesta SENSEI  :razz:  JAJAJAJAJJ

tabla mal:  Lucas

tabla nueva: LucasX

campos a pasar:  capitulo,versiculo,texto


-----------------------------------
v3ctor
Lunes, 10 Agosto 2015, 16:45

Re: Faa Problemas Con Sql En Versión 3.8!!!
-----------------------------------
encontre esto voy a probarlo:

2º) Copiar los datos de la tabla original a la nueva tabla:
sqlite> INSERT INTO hashes_files_nueva (file, id, crime)
SELECT *
FROM hashes_files;


siiiiiiiiiiiiiiiiiiiiiiiii funcionaaaaaaaaaaaaaaa iupiiiiiiii

 [img]http://foro.gambas-es.org/files/images/2261/sqlcopiado.png[/img]


tres sentencias para solucionar el tema:

tenemos la tabla vieja con el problema, llamada Lucas
creamos una nueva tabla con las especificaciones que necesitamos llamada LucasX

copiamos los datos de la tabla vieja(Lucas) a la tabla nueva(LucasX)
[code linenumbers=false syntax=sql]insert into LucasX (capitulo,versiculo,texto) select capitulo,versiculo,texto from Lucas[/code]


eliminamos tabla vieja:
[code linenumbers=false syntax=sql]drop table Lucas[/code]

renombramos tabla nueva
[code linenumbers=false syntax=sql]alter table LucasX rename to Lucas[/code]


-----------------------------------
v3ctor
Lunes, 10 Agosto 2015, 17:20

Re: Faa Problemas Con Sql En Versión 3.8!!!
-----------------------------------
misterio ResultadoX!referencias no muesta datos es como nulo cuando hay datos  :shock:  :shock: 

 :roll:  :roll:  :roll: 

[code linenumbers=false syntax=gambas]Public Sub BuscarTextoVersiculo()
  Dim ResultadoX As Result
  Dim ReferenciaEntrando As String
  Dim ReferenciaSaliendo As String[]
  
  LBoxReferencias.Clear
  
  Print "Select * from '" & LibroSelecionado & "' where versiculo='" & versiculo & "' and capitulo='" & capitulo & "'"
  ResultadoX = Conexion.Exec("Select * from '" & LibroSelecionado & "' where versiculo='" & versiculo & "' and capitulo='" & capitulo & "'")
  
  If ResultadoX.Available = True Then
       txtEvers.Text = ResultadoX!texto
       ReferenciaEntrando = ResultadoX!referencias
       Print ResultadoX!referencias
       
  Endif
  
  If InStr(ReferenciaEntrando, ";") <> 0 Then
     ReferenciaSaliendo = Split(ReferenciaEntrando, ";")
     LBoxReferencias.List = ReferenciaSaliendo   
  Else
    LBoxReferencias.Add("ninguna referencia") 
  Endif
  
    Labruta.Text = ListBLibros.Current.Text & " " & capitulo & ":" & versiculo
  
End[/code]

bueno solucione este es el aspecto de las referencias:
 [img]http://foro.gambas-es.org/files/images/2261/referencias3_1439226071_494781.png[/img] 


rutina final:

[code linenumbers=false syntax=gambas]Public Sub BuscarTextoVersiculo()
  Dim ResultadoX As Result
  Dim ReferenciaEntrando As String
  Dim ReferenciaSaliendo As String[]
  Dim UnaReferencia As String
  
  LBoxReferencias.Clear
  
  ResultadoX = Conexion.Exec("Select * from '" & LibroSelecionado & "' where versiculo='" & versiculo & "' and capitulo='" & capitulo & "'")
  
  If ResultadoX.Available = True Then
     txtEvers.Text = ResultadoX!texto
     ReferenciaEntrando = ResultadoX!referencias       
  Endif
  
  If InStr(ReferenciaEntrando, ";") <> 0 Then
     ReferenciaSaliendo = Split(ReferenciaEntrando, ";")
     For Each UnaReferencia In ReferenciaSaliendo
       LBoxReferencias.Add(Trim$(UnaReferencia))
     Next
  Else
     LBoxReferencias.Add(ReferenciaEntrando) 
  Endif
  
  Labruta.Text = ListBLibros.Current.Text & " " & capitulo & ":" & versiculo
  
End[/code]


-----------------------------------
shordi
Lunes, 10 Agosto 2015, 18:04

Re: Faa Problemas Con Sql En Versión 3.8!!!
-----------------------------------
[quote user="v3ctor" post="27622"]encontre esto voy a probarlo:

2º) Copiar los datos de la tabla original a la nueva tabla:
sqlite> INSERT INTO hashes_files_nueva (file, id, crime)
SELECT *
FROM hashes_files;


siiiiiiiiiiiiiiiiiiiiiiiii funcionaaaaaaaaaaaaaaa iupiiiiiiii

 [img]http://foro.gambas-es.org/files/images/2261/sqlcopiado.png[/img]


tres sentencias para solucionar el tema:

tenemos la tabla vieja con el problema, llamada Lucas
creamos una nueva tabla con las especificaciones que necesitamos llamada LucasX

copiamos los datos de la tabla vieja(Lucas) a la tabla nueva(LucasX)
[code linenumbers=false syntax=sql]insert into LucasX (capitulo,versiculo,texto) select capitulo,versiculo,texto from Lucas[/code]


eliminamos tabla vieja:
[code linenumbers=false syntax=sql]drop table Lucas[/code]

renombramos tabla nueva
[code linenumbers=false syntax=sql]alter table LucasX rename to Lucas[/code][/quote]

Hay una manera mucho más simple:
[code linenumbers=false syntax=SQL]CRETATE TABLE TABLA2 AS SELECT * FROM TABLA1[/code]
De todas formas no puedo aconsejarte mucho con el gestor de bases de datos de Gambas: yo no lo uso. En su lugar utilizo el program sqliteman, que viene en los repositorios, mucho más fiable y depurado. Ten en cuenta que, salvo tablas temporales y cosas así, nunca es necesario crear y alterar tablas vía código.
Por otra parte, el imbuir SQL en tu código ya sabes que te limita a un tipo concreto de motor de datos.
Por ejemplo, la sintaxis que has utilizado de INSERT INTO... SELECT , no vale para MySQL, que tiene su equivalente SELECT INTO SELECT (hablo de memoria). Si usases los objetos de bases de datos de gambas en tu código, estarías creando código de superior calidad, por cuanto sería universal a las bases de datos conocidas.
Por ejemplo: Me parece natural que tu programa bíblico devenga en una herramienta de comentario sobre el tema en internet. Varios usuarios añadiendo sus comentarios y sus interpretaciones y discutiendo sobre ello... ahora bien: Sqlite no es la base de datos apropiada para ello. Colocando SQL en tu código estás matando ya, de entrada, esa posibilidad.
Saludos.


-----------------------------------
v3ctor
Lunes, 10 Agosto 2015, 18:41

Re: Faa Problemas Con Sql En Versión 3.8!!!
-----------------------------------
[img]http://foro.gambas-es.org/files/images/2261/sabado.png[/img]


-----------------------------------
v3ctor
Lunes, 10 Agosto 2015, 23:01

Re: Faa Problemas Con Sql En Versión 3.8!!!
-----------------------------------
[quote user="shordi" post="27624"]
De todas formas no puedo aconsejarte mucho con el gestor de bases de datos de Gambas: yo no lo uso. En su lugar utilizo el program sqliteman, que viene en los repositorios, mucho más fiable y depurado. Ten en cuenta que, salvo tablas temporales y cosas así, nunca es necesario crear y alterar tablas vía código.
Por otra parte, el imbuir SQL en tu código ya sabes que te limita a un tipo concreto de motor de datos.
Por ejemplo, la sintaxis que has utilizado de INSERT INTO... SELECT , no vale para MySQL, que tiene su equivalente SELECT INTO SELECT (hablo de memoria). Si usases los objetos de bases de datos de gambas en tu código, estarías creando código de superior calidad, por cuanto sería universal a las bases de datos conocidas.
Por ejemplo: Me parece natural que tu programa bíblico devenga en una herramienta de comentario sobre el tema en internet. Varios usuarios añadiendo sus comentarios y sus interpretaciones y discutiendo sobre ello... ahora bien: Sqlite no es la base de datos apropiada para ello. Colocando SQL en tu código estás matando ya, de entrada, esa posibilidad.
Saludos.[/quote]

Sensei shordi :lol:  con todo respeto  :razz: 

mi primer objetivo es usar la base de datos offline.
ya que de todos esos servidores decenas que ofrecen las consultas online [b]NINGUNO[/b]  publica su base de datos en ningún lado para que los programadores las podamos usar .

soy un principiante en programación tene eso en cuenta, eleji sql porque es lo mas fácil para empezar

además la base que estoy haciendo la estoy compartiendo con todos subiéndola a la granja, sourceforge etc dejando el código disponible (base de datos en su interior)
en todo caso si algún genio en programación toma esa base de datos sqlite3 no tengo dudas que podrá pasarla por medio de programación y crear una base de datos MYsql u otro sistema de base de datos obteniendo el beneficio de no tener que llenar la base de datos con las escrituras pues ese trabajo lo estoy pasando yo ahora.

así que en definitiva no estoy matando nada, al contrario estoy dando mucha vida con este material a través del código abierto y la base de datos sqlite tanto para aprendices de programación como para profesionales o genios en programación que podrán hacer con ella otros programas, copiarla y ponerla en otra base de datos para usarla en internet como vos decís etc.....


-----------------------------------
shordi
Lunes, 10 Agosto 2015, 23:47

Re: Faa Problemas Con Sql En Versión 3.8!!!
-----------------------------------
No hablaba de tu base, hablaba de tu código.


-----------------------------------
v3ctor
Martes, 11 Agosto 2015, 14:14

Re: Faa Problemas Con Sql En Versión 3.8!!!
-----------------------------------
da un par de ejemplos para saber de que trata el tema.


-----------------------------------
shordi
Martes, 11 Agosto 2015, 19:16

Re: Faa Problemas Con Sql En Versión 3.8!!!
-----------------------------------
Se trata de NO imbuir código SQL en el lenguaje dentro de lo posible. El Código SQL no es estándar (aunque debiera serlo, en mi opinión) para todas las bases de datos. Si lo incluímos en nuestro código, sólo funcionará para el motor concreto de datos. Gambas interpone sus clases para aislar nuestros programas de ese problema.
Aquí te pongo el código para crear una base de datos con una tabla con tres campos desde 0. 

Crea un proyecto nuevo activando "Con acceso a base de datos"
Añade un botón y copia y pega éste código:
[code linenumbers=false syntax=gambas]
Private hcon As Connection

Public Sub Button1_Click()

    Dim aCampos As New Variant[]

    hcon = New Connection
    'Añadimos la definición de los campos al array: nombre, tipo, ancho y si es o no parte de la clave primaria
    aCampos.Add(["tablaid", db.Serial, 10, True])
    aCampos.Add(["nombre", db.String, 50, False])
    aCampos.Add(["telefono", db.String, 15, False])
    'Por defecto el ejemplo usa sqlite, pero si se añade la ip del servidor, el usuario, la password y el puerto de conexión, funciona igual para MySQL o Postgre
    Creabase("sqlite", User.Home &/ "Escritorio", "agenda", "telefonos", aCampos)

End

Public Sub Creabase(sTipo As String, sHost As String, sBase As String, sTabla As String, aCampos As Variant[], Optional sUsuario As String, Optional sPassword As String, Optional sPuerto As String)

    Dim n As Integer
    Dim tabla As Table
    Dim aClaves As New String[]
    ' Para ver en consola los comandos enviados a la base de datos, descomentar la línea de abajo
    'DB.Debug = True
    ' Se rellenan las propiedades de la base de datos sin poner el nombre, sólo para abrir la conexión
    hCon.Type = Lower(sTipo)
    hCon.Host = sHost
    hCon.Name = ""
    hCon.Login = sUsuario
    hCon.Password = sPassword
    hCon.Port = sPuerto
    ' Se abre. Notar que aún no se ha abierto la base de datos, sólo la conexión
    Try hCon.Open()
    If Error Then
        message("No se pudo abrir " & sHost) 'No existe el servidor o el directorio si es sqlite
        Return
    End If
    ' Se comprueba si existe la base de datos
    If Not hCon.Databases.Exist(sBase) Then
        ' Se crea la nueva base
        hCon.Databases.Add(sBase)
        ' Con sqlite es necesaria una pausa para que el archivo de base de datos sea registrado por el SO
        Wait 0.5
    End If
    ' Se cierra la conexión una vez creada la base ...
    hCon.Close()
    ' ... y se abre la base recién creada
    hCon.Host = sHost
    hCon.Name = sBase
    Try hCon.Open()
    If Error Then
        message("No se pudo abrir la base de datos " & sBase & " en " & sHost)
        Return
    End If
    ' Se comprueba si existe la tabla que queremos crear
    If hCon.Tables.Exist(sTabla) Then
        message("La tabla ya existe, no se puede crear otra vez")
        Return
    Else
        ' Se añade la tabla
        Tabla = hCon.Tables.Add(sTabla)
        ' Se crean los campos
        For n = 0 To aCampos.Count - 1
            tabla.Fields.Add(aCampos[n][0], aCampos[n][1], aCampos[n][2])
            If aCampos[n][3] Then
                aClaves.Add(aCampos[n][0])
            Endif
        Next
        tabla.PrimaryKey = aClaves
        tabla.Update()
    End If
    Message("Base de datos creada con éxito")
Catch
    message(Error.Text)

End
[/code]
Como verás, puedes crear bases de datos y tablas tanto en un motor como en otro sin problemas. Eso te da muchas más posibilidades de futuro.
Saludos.


