Problema con ListView y DataBase

Iniciado por Skeletron, 12 Octubre 2009, 03:46 AM

0 Miembros y 3 Visitantes están viendo este tema.

Skeletron

Hola gente, les comentoq ue tengo
La TABLA de la base de datos se crea con el siguiente codigo:
       
Código (vbnet) [Seleccionar]
Dim SQLconnect As New SQLite.SQLiteConnection()
       Dim SQLcommand As SQLite.SQLiteCommand
       SQLconnect.ConnectionString = "Data Source=" & My.Settings.Database & ";"
       SQLconnect.Open()
       SQLcommand = SQLconnect.CreateCommand
       'SQL query to Create Table
       SQLcommand.CommandText = "CREATE TABLE Movimientos(Fecha CURRENT_DATE, Detalle TEXT, Documento TEXT, Comprobante TEXT, IngEgre BOOLEAN, Monto INTEGER);"
       SQLcommand.ExecuteNonQuery()
       SQLcommand.Dispose()
       SQLconnect.Close()

Como veran, un datos es una FECHA (en cuanto a eso, me gustaria que me recomienden si hay un mejor metodo para guardar FECHAS.. ya que con DATE, me guarda hasta el horario (00:00:00) y no quiero), luego hay un Detalle, Documento y Comprobante que son de TEXT, luego un Boolean que no me esta funcionando.. que dato le tengo que pasar? la palabra: TRUE o FALSE, o 0 o 1??? y un Monto INTEGER...


Envio unas 5 entradas, y los resutaldos estan OK!!!
Miren las fotos:




Ahora Ingreso otra entrada EXACTAMENTE IGUAL a la 1001-10-01 y miren:


Y para empeorar todo:
Ahora agrego una entrada con fecha: 1002-10-10, pero con los detalles de las coolumnas iguales a los del item 1001-10-10 y aparece ésto:



QUieren que le empeore mas las cosas?
Ok...
Para pasar los datos a la tabla esa, tengo el sigueinte codigo:

       
Código (vbnet) [Seleccionar]
Dim SQLconnect As New SQLite.SQLiteConnection()
       Dim SQLcommand As SQLite.SQLiteCommand
       SQLconnect.ConnectionString = "Data Source=" & My.Settings.Database & ";"
       SQLconnect.Open()
       SQLcommand = SQLconnect.CreateCommand
       SQLcommand.CommandText = "SELECT * FROM Movimientos"
       Dim SQLreader As SQLite.SQLiteDataReader = SQLcommand.ExecuteReader()
       Planilla.Items.Clear()
       While SQLreader.Read()
           Planilla.Items.Add(SQLreader(0))
           'HAY PROBLEMAS
           Planilla.Items(0).SubItems.Add(SQLreader(1))
           Planilla.Items(0).SubItems.Add(SQLreader(2))
           Planilla.Items(0).SubItems.Add(SQLreader(3))
           Planilla.Items(0).SubItems.Add(SQLreader(4))
           Planilla.Items(0).SubItems.Add(SQLreader(5))
           MsgBox(SQLreader(0) & SQLreader(1) & SQLreader(2) & SQLreader(3) & SQLreader(4) & SQLreader(5))
       End While
       SQLcommand.Dispose()
       SQLconnect.Close()


Como veran, siempre modifica el item 0, eso es así porque cada item que va agregando se transofrma en el "CERO" (no se porque, pero bueno.. es así.. muy raro.. o tal vez ahí esta el problema, pero no lo creo..)
HAN VISTO qu tengo un MSGBOX???? y se preguntaran para que es...
Puse ese MSGBOX para que con cada ingreso que hace, me muestre en una cadena de texto lo que va a incertar.. y gente: ME MUESTRA TODOS LOS ITEMS PERFECTAMENTE!!.. TODOS!!!!!!.. O sea.. el problema esta al visualizar la tabla!!!, es como que al mostrarse la tabla, se "eliminan" los datos de los items repetidos.. algo así!!!
Alguien me da una mano?

seba123neo

Hola, primero algunas preguntas , ¿ porque creas la bases de datos asi con un comando ?, porque no la creas con el administrador de SQL Lite desde el mismo visual studio ? porque me parece que estan mal los tipos de datos creados ahi. para guardar la fecha usas el tipo de dato DateTime en SQL Server. cuando lo guardas lo debes guardar con la funcion Format() formatado a "yyyymmdd", y para mostrarlo en la grilla despues debes en la consulta SQL fomatear tambien la fecha asi te muestra solo la fecha y no todo con el horario.

para el boolean se usa el tipo de dato bit que es 0 o 1...que yo sepa no existe boolean. y el monto deberia ser un tipo de dato como el Double..en SQL Server debe ser algo como real.

lo mejor para trabajar con bases de datos es crear clases y no poner el select asi en los botones o demas controles, deberia ser programación en 3 capas, es lo mejor. de ultima si eso es mucho...deberias hacerte uans clases con metodos para insertar, update, delete , chequeos etc...pero en una clase..sino se desaprovecha la POO de vb net..

eso cuando carga el listview esta mal...por eso estas teniendo problemas...estas poniendo siempre el 0...yo no lo cargo asi y creo que no se carga asi estoy seguro..mirate ejemplos e internet como lo hacen..crean un objeto del tipo ListViewItem y lo cargan desde ahi, van llenando los subitems con los datos y despues a lo ultimo le ahcen el .ADD y añaden toda la fila.

saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Skeletron

Lo solucione.. Saben cual era el problema? esa parte que dije que no creía que estaba el error, era ahí.. Porque? porque en las propiedades del ListView, decia que los items se tenían que ordenar... Aparentemente, vb.net los va ordenando mientras los va ingresando.. no hace un Ordenamiento al finalizar... entonces, entre los ordenados, quedaban mal los datos..
Ahora ya le puse que no ordene, y le modifique el codigo así: (vean que irá modificando los SUBDATOS, ya que se irá incrementando "X")

Pero ahora tengo que ordenar los items haciendo click en los "TITULOS" de las columnas... pero.. no funciona ¬¬ y tengo seleccionada la opcion que los elementos se pueden ordenar... todo mal..

Código (vbnet) [Seleccionar]
        Dim X As Integer = 0
        Dim SQLconnect As New SQLite.SQLiteConnection()
        Dim SQLcommand As SQLite.SQLiteCommand
        SQLconnect.ConnectionString = "Data Source=" & My.Settings.Database & ";"
        SQLconnect.Open()
        SQLcommand = SQLconnect.CreateCommand
        SQLcommand.CommandText = "SELECT * FROM Movimientos"
        Dim SQLreader As SQLite.SQLiteDataReader = SQLcommand.ExecuteReader()
        Planilla.Items.Clear()
        While SQLreader.Read()
            Planilla.Items.Add(SQLreader(0))
            'HAY PROBLEMAS
            Planilla.Items(X).SubItems.Add(SQLreader(1))
            Planilla.Items(X).SubItems.Add(SQLreader(2))
            Planilla.Items(X).SubItems.Add(SQLreader(3))
            Planilla.Items(X).SubItems.Add(SQLreader(4))
            Planilla.Items(X).SubItems.Add(SQLreader(5))
            X += 1
        End While
        SQLcommand.Dispose()
        SQLconnect.Close()

Skeletron

Cita de: seba123neo en 12 Octubre 2009, 04:12 AM
Hola, primero algunas preguntas , ¿ porque creas la bases de datos asi con un comando ?, porque no la creas con el administrador de SQL Lite desde el mismo visual studio ? porque me parece que estan mal los tipos de datos creados ahi. para guardar la fecha usas el tipo de dato DateTime en SQL Server. cuando lo guardas lo debes guardar con la funcion Format() formatado a "yyyymmdd", y para mostrarlo en la grilla despues debes en la consulta SQL fomatear tambien la fecha asi te muestra solo la fecha y no todo con el horario.

para el boolean se usa el tipo de dato bit que es 0 o 1...que yo sepa no existe boolean. y el monto deberia ser un tipo de dato como el Double..en SQL Server debe ser algo como real.

lo mejor para trabajar con bases de datos es crear clases y no poner el select asi en los botones o demas controles, deberia ser programación en 3 capas, es lo mejor. de ultima si eso es mucho...deberias hacerte uans clases con metodos para insertar, update, delete , chequeos etc...pero en una clase..sino se desaprovecha la POO de vb net..

eso cuando carga el listview esta mal...por eso estas teniendo problemas...estas poniendo siempre el 0...yo no lo cargo asi y creo que no se carga asi estoy seguro..mirate ejemplos e internet como lo hacen..crean un objeto del tipo ListViewItem y lo cargan desde ahi, van llenando los subitems con los datos y despues a lo ultimo le ahcen el .ADD y añaden toda la fila.

saludos.

AMigo, Te comento que uso SQLite.. Lo de las funciones FECHA, me gustaria que me lo expliques mejor... Sin administradores me manejo bien.. (por ahora)... Pero esta MUY MAL como lo estoy haciendo???

En cuanto a lo del BOOLEAN, yo leí por ahí que SQLite si tiene el tipo BOOLEAN.. Corrigeme si me equivoco..
En cuanto al DOUBLE, si, es verdad, necesito numeros con COMA, de putno flotante, pero todavia no he mriado bien eso... Me gustaria que em digas cual es el tipo de dato de punto flotante para SQLITE

En cuanto a la programacion de 3 capas, y POO, es verdad, lo pondré en practica... seguramente modifique todo eso mañana..

Y en cuanto a lo del lsitview, era eso, efectivamente, auqnue te comento que lo solucione antes que me lo digas :P
Pero se me presento un problea: Ahora no se ordena automaticamente, proque eso era el problema.. pero, tendria que ordenarlo manualmente entonces, así que puse que el usuario pueda ordenarlo manualmente pero no me funciona.. algo raro pasó.. no quiero preugntarte cual puede ser el problema, porque es algo totalmente ilogico.. per bueno.. seguire probando

seba123neo

esta, pero igualmente fijate lo de como cargar el listview en internet, por mas que ande a veces no quiere decir que sea la forma correta y puedas esperimentar problemas mas delante, en lo que yo te digo no tenes que poner indices ni nada por el estilo, fijate que es la mejor forma y la correcta de cargar un listview.

para ordenar el lsitview no es asi nomas con activarle la propiedad , debes escribir una funcion que compare y te devuelva el ordenamiento. basicamente lo basico es hacer algo asi:

Código (vbnet) [Seleccionar]
If ListView1.Sorting = SortOrder.Ascending Then
ListView1.Sorting = SortOrder.Descending
Else
ListView1.Sorting = SortOrder.Ascending
End If
ListView1.Sort()


pero eso solo sirve si el campo es string, para numeros y fechas no te sirve y vas a tener que escribir codigo...busca en internet que hay miles de como hacerlo y no es mucho codigo.

saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

seba123neo

acabo de abrir el administrador de sql server lite y no existe el tipo de dato boolean, es bit como dije, los tipos de datos se mantienen en las versiones SQL Server.

deberias poner tambien como "guardas" los datos...

saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Skeletron

#6
Cita de: seba123neo en 12 Octubre 2009, 04:33 AM
esta, pero igualmente fijate lo de como cargar el listview en internet, por mas que ande a veces no quiere decir que sea la forma correta y puedas esperimentar problemas mas delante, en lo que yo te digo no tenes que poner indices ni nada por el estilo, fijate que es la mejor forma y la correcta de cargar un listview.

para ordenar el lsitview no es asi nomas con activarle la propiedad , debes escribir una funcion que compare y te devuelva el ordenamiento. basicamente lo basico es hacer algo asi:

Código (vbnet) [Seleccionar]
If ListView1.Sorting = SortOrder.Ascending Then
ListView1.Sorting = SortOrder.Descending
Else
ListView1.Sorting = SortOrder.Ascending
End If
ListView1.Sort()


pero eso solo sirve si el campo es string, para numeros y fechas no te sirve y vas a tener que escribir codigo...busca en internet que hay miles de como hacerlo y no es mucho codigo.

saludos.
Sería algo así como un "IMPLEMENT COMPARABLE" en Java...
Pero.. has visto que en el explorador de Windows, cuando le ahces click en TIPO DE ARCHIVO, o TAMAÑO.. solo se ordenan... Entiendo que detras de eso hay codigo, pero, tengo que programar ese codigo??? no se hace de manera automatica??

Agrego:
Y vos me decis lo de SQL SERVER LITE, ese es el SQL SERVER de Microsoft, pero LITE... o me equivoco?? Yo te hablo de SQLite http://www.sqlite.org/

Mira:
http://www.sqlite.org/datatypes.html
y
http://www.sqlite.org/datatype3.html


Agrego2:
Y no he visto en ninguna web, que mejor manera hay para agregar items con sus "sub-datos". y es mas, si miras aqui: http://msdn.microsoft.com/es-es/library/wh9a3t2x%28VS.80%29.aspx lo hacen como yo te digo..

seba123neo

si en el explorador de windows se ordenan, pero fijate que se ordenan mal...te lo ordena como string. como el codigo que te puse que es lo basico que tenes que escribir para  que te ordene algo.

yo te hable siempre que tengo el SQL LITE...pero no me baje nada de esa pagina...yo me baje esto:

ADO.NET 2.0/3.5 Provider for SQLite

sirve para el 2005 y 2008 y te pone el administrador para crear tablas,bases etc...hacer consultas ..como si fuera el SQL Server verdadero y ahi en los tipos de datos no hay nada parecido a lo que me pasate en la pagina.

si el ejemplo ese de microsoft esta bien, pero lo que pasa es que hay varias formas de ahcer las cosas y simepre hay una que es mejor que la otra..esa que pasate esta bien pero no creo que es la mejor...sino espera que busco uno y te lo paso.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

seba123neo

#8
aca esta el ejemplo lo acabo de probar recien:

Código (vbnet) [Seleccionar]
       Dim vItem As ListViewItem
       While dr.Read
           vItem = New ListViewItem(dr("idestado").ToString)
           vItem.SubItems.Add(dr("nombre"))
           ListView1.Items.Add(vItem)
       End While
       vItem = Nothing


donde "dr" es el datareader...tenes que poner los nobmres de los campos...hay otro metodo llamado .AddRange que mete todo un array de una...pero bueno con eso basta.

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Skeletron

Si podes encontrarme algun mejor metodo, mejor.. Yo tambien pensé que hacer 5 lineas para agregar 1 item completo era mucho.. pero bue.. no vi nada diferente..

En cuanto a lo que me preguntaste de como hago con los codigos, aca te paso los datos:

Así creo un DATABASE donde el usuario quiera:
       'Save Dialog Box
       Dim f As New SaveFileDialog
       f.Filter = "SQLite 3 (*.db3)|*.db3|All Files|"
       f.ShowDialog()
       'Create Database
       Dim SQLconnect As New SQLite.SQLiteConnection()
       'Database Doesn't Exist so Created at Path
       SQLconnect.ConnectionString = "Data Source=" & f.FileName & ";"
       SQLconnect.Open()
       SQLconnect.Close()

así creo una tabla a un archivo database que hay que seleccionar:
   Dim f As New OpenFileDialog
   f.Filter = "SQLite 3 (*.db3)|*.db3|All Files|*.*"
   If f.ShowDialog() = DialogResult.OK Then
       Dim SQLconnect As New SQLite.SQLiteConnection()
       Dim SQLcommand As SQLiteCommand
       SQLconnect.ConnectionString = "Data Source=" & f.FileName & ";"
       SQLconnect.Open()
       SQLcommand = SQLconnect.CreateCommand
       'SQL query to Create Table
       SQLcommand.CommandText = "CREATE TABLE foo(id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, description TEXT, image BLOB);"
       SQLcommand.ExecuteNonQuery()
       SQLcommand.Dispose()
       SQLconnect.Close()
   End If


Aca estan las 3 opciones: Insert Update y Delete:
   Dim f As New OpenFileDialog
   f.Filter = "SQLite 3 (*.db3)|*.db3|All Files|*.*"
   If f.ShowDialog() = DialogResult.OK Then
       Dim SQLconnect As New SQLite.SQLiteConnection()
       Dim SQLcommand As SQLiteCommand
       SQLconnect.ConnectionString = "Data Source=" & f.FileName & ";"
       SQLconnect.Open()
       SQLcommand = SQLconnect.CreateCommand
       'Insert Record into Foo
       SQLcommand.CommandText = "INSERT INTO foo (title, description) VALUES ('This is a title', 'This is a Description')"
       'Update Last Created Record in Foo
       SQLcommand.CommandText = "UPDATE foo SET title = 'New Title', description = 'New Description' WHERE id = last_insert_rowid()"
       'Delete Last Created Record from Foo
       SQLcommand.CommandText = "DELETE FROM foo WHERE id = last_insert_rowid()"
       SQLcommand.ExecuteNonQuery()
       SQLcommand.Dispose()
       SQLconnect.Close()
   End If

Y aca la sentencia Select:
   Dim f As New OpenFileDialog
   f.Filter = "SQLite 3 (*.db3)|*.db3|All Files|*.*"
   If f.ShowDialog() = DialogResult.OK Then
       Dim SQLconnect As New SQLite.SQLiteConnection()
       Dim SQLcommand As SQLiteCommand
       SQLconnect.ConnectionString = "Data Source=" & f.FileName & ";"
       SQLconnect.Open()
       SQLcommand = SQLconnect.CreateCommand
       SQLcommand.CommandText = "SELECT * FROM foo"
       Dim SQLreader As SQLiteDataReader = SQLcommand.ExecuteReader()
       lst_records.Items.Clear()
       While SQLreader.Read()
           lst_records.Items.Add(String.Format("ID = {0}, Title = {1}, Description = {1}", SQLreader(0), SQLreader(1), SQLreader(2)))
           'Optionally use the variable names to identify columns
           'De lst_records.Items.Add(String.Format("ID = {0}, Title = {1}, Description = {1}", SQLreader("id"), SQLreader("title"), SQLreader("description")))
       End While
       SQLcommand.Dispose()
       SQLconnect.Close()
   End If


Como verás, a todo eso lo LAMERÉE hace un tiempo :D
Modifico todo lo de tomar un archivo desde un lugar de MI PC, y hago todo con unas variables globales que tengo en la aplicacion... (donde se guadan los datos del string donde esta el archivo database)