https://foro.gambas-es.org/viewtopic.php?f=3&t=7563
-----------------------------------
gambafeliz
Jueves, 04 Julio 2019, 21:50

No Coinciden Los Tipos: Requerido Float, Obtenido String En Cambio De FMain
-----------------------------------
Hola

Tengo un problema con SQLite3 y Gambas3 y no tengo ni idea por donde cogerlo. Por favor, una ayudita, Gracias.

Describo:

Base de datos SQLite3 con tabla con varios campos, pero el que nos interesa en Conexiones de Gambas lo describe así:
Nombre                   Tipo                  Largo
Realizado                Cadena             ilimitado

Cuando obtengo este campo me devuelve, un ejemplo:
2019/05/02

En Gambas lo pinto en un Gridview con este codigo:
Gridviewdatos[c, 3].Text = Resultado["Realizado"] 'Esto funciona perfectamente bien y devuelve al Gridview esto 2019/05/02

Pero yo lo que quisiera hacer es esto para obtener en el Gridview: 02/05/2019
Gridviewdatos[c, 3].Text = Format$(Resultado["Realizado"], "dd/mm/yyyy")

Y este es el problema que el último código me arroja el siguiente error:
"No coinciden los tipos: requerido Float, obtenido String en cambio de FMain"

Y no lo se resolver. ¿Tiene alguna lógica o explicación? ¿Donde doy solución en SQLite3 o Gambas3?

Gracias.


-----------------------------------
shordi
Jueves, 04 Julio 2019, 22:30

Re: No Coinciden Los Tipos: Requerido Float, Obtenido String En Cambio De FMain
-----------------------------------
[quote]
Nombre                   Tipo                  Largo
Realizado                Cadena             ilimitado
[/quote]
¿Por qué usas un campo Tipo Cadena para almacenar fechas?
Una Fecha no es una cadena. Es un número. Mucha más información en gambaswiki. Te pongo un enlace del traductor de google al artículo (inconcluso) sobre el manejo de fechas.
[url=https://translate.google.es/translate?sl=en&tl=es&u=http%3A%2F%2Fgambaswiki.org%2Fwiki%2Fdoc%2Fdate]https://translate.google.es/translate?sl=en&tl=es&u=http%3A%2F%2Fgambaswiki.org%2Fwiki%2Fdoc%2Fdate

y esta es la página original en inglés: [url=http://gambaswiki.org/wiki/doc/date]http://gambaswiki.org/wiki/doc/date

Por otra parte está el tema de sqlite. 
Sqlite no tiene ningún formato específico para almacenar Fechas y puede almacenarlas de la manera que quieras usando las [url=https://translate.google.es/translate?sl=en&tl=es&u=https%3A%2F%2Fwww.sqlite.org%2Fdraft%2Flang_datefunc.html]Funciones de fecha (traductor google) (aquí la página original: [url=https://www.sqlite.org/draft/lang_datefunc.html]https://www.sqlite.org/draft/lang_datefunc.html
Pero lo importante es que al crear la tabla puedes definir el campo como de fecha
[code linenumbers=false syntax=gambas] 
CREATE TABLE `mitabla` ( 
`id` integer PRIMARY KEY autoincrement, 
`fecha` date NOT NULL, 
....
....
[/code]
Que Sqlite lo admite sin problemas y luego dejar a gambas que lo grabe y recupere con sus clases nativas sin problemas.

Saludos


-----------------------------------
gambafeliz
Viernes, 05 Julio 2019, 06:55

Re: No Coinciden Los Tipos: Requerido Float, Obtenido String En Cambio De FMain
-----------------------------------
Muchas gracias por ayudarme, ah :) y enhorabuena por tus 33 años de programador. Mi historia es algo parecida a la tuya pero con algunos altibajos de la vida.

Por favor te voy a contar más o menos el conjunto y espero no abusar de tu confianza. 

Yo tengo un programa que no he realizado yo y esta en Android. El desarrollador me lo ha puesto muy difícil y no me comparte nada bien la exportación de los datos de su programa. Para mi injusto e incluso se lo he dicho. Pero bueno eso es otra historia.

Tengo una tabla de Gastos y solo la puedo exportar en CSV, las fechas me las devuelve así:
,8/2/19 10:00,8/12/19,
Como verás son dos campos, el primero con la hora y el segundo solo fecha.

Al principio importé a la base de datos SQLite en formato fecha y no funcionaba, bien, me truncaba, etc. Era inviable directamente y cambiar a mano pues no.

Después la importé en un campo con formato cadena. Y lo que hice es actualizar ese campo [strike]para estandarizar las fecha según el estándar de fecha que exige SQLite[/strike] (no veo que no es verdad, lo que hice es poner el año/mes/dia por que para ordenarlo en forma de cadena, directamente como solo pido el mes que me interesa, pues elimino el año y el mes y solo tengo que ordenar los números del día según una cadena y esto lo hace bien, además lo hace bien pero es algo casi de suerte  :wink: )pero en el mismo campo cadena.

Como soy nuevo en SQLite y sinceramente no lo conozco nada bien. Intenté ordenar de mas antiguo a mas nuevo las fechas y funcionaba. Pues listo, no quise tocar más.

Me parece que tuve otros problemas con las fechas pero ya no me acuerdo, en los foros de SQLite hay tela sobre las fechas, se puede escribir un libro.

Yo pienso exactamente como tu (si me lo permites tutear) las fechas son fechas y las cadenas son cadenas, pero con lo que pase sobre la ordenación y los foros de SQLite quede confundido y todo lo dejé en cadena para mi comodidad de la importación del CSV.

-Esto es mi realidad-

Ahora pregunto, siendo una cadena, ¿es posible convertir a fecha la cadena y formatearla en este caso en concreto? ¿o quizás no me estoy enterando lo que me quieres decir?

Supongo que me estas diciendo oye chico pon el campo cadena a fecha y ya verás como Gambas lo traba bien e incluso no tendrás que formatear la fecha. Bueno ya sabes por que esta todo como esta. Quizás me debes aconsejar como resolverías mi historieta para que no tenga tal lío. :)

Muchas gracias.


-----------------------------------
gambafeliz
Viernes, 05 Julio 2019, 07:49

Re: No Coinciden Los Tipos: Requerido Float, Obtenido String En Cambio De FMain
-----------------------------------
Lo he resuelto pero dejo constancia que algo va mal en Gambas. También puede ser que yo como sabes soy novato en este IDE no lo este utilizando apropiadamente, que es casi lo más seguro. Dudo que esto sea un fallo, pero quiero dejarlo por lo menos expuesto. También podría ser algo de compilación. En fin, no lo tengo claro. Eso que funcione mal y después por arte de magia bien, en fin me deja algo perplejo.

Pruebas para llegar a esta deducción:

Lo primero que hice es comprobar que funciona bien en Gambas:
Y la fecha correcta es: 05/02/2019 
También: Gridviewdatos[c, 3].Text = CDate("2019/05/02") 'No funciona 'yyyy/mm/dd' o 'yyyy/dd/mm' ambos formatos no funcionan en las conversiones
También: Gridviewdatos[c, 3].Text = CDate("05/02/2019") 'funciona 'mm/dd/yyyy' o 'dd/mm/yyyy' esta estructura funciona bien en las conversiones.

He realizado esto:
Mi fecha: 2019/05/02 'yyyy/mm/dd'
Gridviewdatos[c, 3].Text = "2019/05/02" 'funciona lo trata como una cadena hacia Gridview
Gridviewdatos[c, 3].Text = Resultado["Realizado"] 'funciona lo trata como una cadena hacia Gridview ya que el origen del campo es una cadena
Gridviewdatos[c, 3].Text = CDate(Resultado["Realizado"]) 'No funciona, en este caso no funciona por que infringe el estándar de fecha yyyy/mm/dd

cadena = Resultado["Realizado"]
arrayCadena = Split(cadena, "/")
cadena = arrayCadena[2] & "/" & arrayCadena[1] & "/" arrayCadena[0]
Gridviewdatos[c, 3].Text = cadena 'No funciona la primera vez y quizás mas veces por lo que me ha pasado

Y escribo:
Gridviewdatos[c, 3].Text = "02/05/2019" 'funciona
 
Y vuelvo a poner:
Gridviewdatos[c, 3].Text = cadena 'Y ahora si funciona misteriosamente

 :shock:

No preguntes como ni por que pero lo he experimentado en vivo.


-----------------------------------
shordi
Viernes, 05 Julio 2019, 10:17

Re: No Coinciden Los Tipos: Requerido Float, Obtenido String En Cambio De FMain
-----------------------------------
Si has leído las referencias que te puse verás que en gambas el tipo fecha en realidad son dos números juntos. El primero para la fecha y el segundo para la hora. Es decir: todas las fechas son datetime cosa que también se cumple en sqlite. Para las funciones de fecha debes pasar un formato de fecha válido para convertirse en datetime, es decir añade 00:00:00 a las fechas que manejas cuando las pases a las funciones pertinentes.
Lo que te mandan con el csv no es un formato de fecha válido. Debes ajustarlo tú primero.
Gambas intenta convertir las fechas cuando le es posible, pero no siempre es así. (El ejemplo más sencillo es cuando se tratan fechas con número de mes y día intercambiados y el número de día es también un mes válido 2019/06/01 puede ser el primero de junio o el día de los reyes magos). Esas conversiones automáticas ("desesperadas" las llamo yo) están muy bien para dar flexibilidad al programa, pero son fuente de posibles errores y malos entendidos.

Mi consejo: no trates (es decir no aceptes el csv como fuente de datos directa para la tabla). Usa una tabla temporal en sqlite, importa el csv en ella y luego pasa los datos adaptados a otra tabla que maneje los formatos correctos. Eso no te requiere más que un pequeño incremento de tamaño en la bbdd (la tabla temporal la puedes eliminar luego) y un par de sentencias sql.


-----------------------------------
gambafeliz
Viernes, 05 Julio 2019, 11:06

Re: No Coinciden Los Tipos: Requerido Float, Obtenido String En Cambio De FMain
-----------------------------------
[quote user="shordi" post="44994"]Si has leído las referencias que te puse verás que en gambas el tipo fecha en realidad son dos números juntos. El primero para la fecha y el segundo para la hora. Es decir: todas las fechas son datetime cosa que también se cumple en sqlite. Para las funciones de fecha debes pasar un formato de fecha válido para convertirse en datetime, es decir añade 00:00:00 a las fechas que manejas cuando las pases a las funciones pertinentes.
Lo que te mandan con el csv no es un formato de fecha válido. Debes ajustarlo tú primero.
Gambas intenta convertir las fechas cuando le es posible, pero no siempre es así. (El ejemplo más sencillo es cuando se tratan fechas con número de mes y día intercambiados y el número de día es también un mes válido 2019/06/01 puede ser el primero de junio o el día de los reyes magos). Esas conversiones automáticas ("desesperadas" las llamo yo) están muy bien para dar flexibilidad al programa, pero son fuente de posibles errores y malos entendidos.

Mi consejo: no trates (es decir no aceptes el csv como fuente de datos directa para la tabla). Usa una tabla temporal en sqlite, importa el csv en ella y luego pasa los datos adaptados a otra tabla que maneje los formatos correctos. Eso no te requiere más que un pequeño incremento de tamaño en la bbdd (la tabla temporal la puedes eliminar luego) y un par de sentencias sql.[/quote]

Gracias, joven. 

Es exactamente lo que hago, paso el csv a un temporal y después mediante código en php creo la tabla correcta pero para no cambiar el campo lo deje siempre en tipo Cadena. Esto último es el gran error. No tratar como hemos hablado las fechas como fechas y tratarla por vagancia las fechas como cadena.

Gracias lo voy a depurar en origen todo y reconstruir todo el problema y no dejarme llevar por la vagancia. :)

Por cierto yo también empeze con un programa de tenis  :mrorange:


