¿Como seleccionar desde un listado?

Discute sobre las herramientas de la base de datos
Responder
andrei030
Mensajes: 11
Registrado: Dom Dic 28, 2008 6:38 am

¿Como seleccionar desde un listado?

Mensaje por andrei030 »

Llevo casi un día entero intentando solucionar un problema que tengo y no hay manera, estoy seguro que alguien que sepa sabría solucionarlo en un momento, pero es que por mas vueltas que le de no lo consigo. El tema es que estoy haciendo una base de datos con la colección de DVDs de mis películas. A continuación pongo una captura de pantalla para explicarlo mejor:

Imagen

Habrá varias películas en cada DVD. A la izquierda esta la lista con los nombres de todas las películas que habría en todos los DVDs en conjunto, el problema es que al hacer clic para seleccionar una de la lista en vez de mostrar la información en los cuadros de en medio (año, duración, etc.) lo que ocurre es que el titulo que selecciono en la izquierda selecciona como nuevo titulo para la película, lo sustituye, vamos lo normal, eso lo entiendo, pero lo que yo busco es que esa lista sea de selección, y al seleccionar una película de esa lista me muestre la duración, el año, la sinopsis, el titulo, etc. en la sección de en medio.

Lo mismo más o menos ocurre con la lista de la derecha, la que está en gris, la de base de datos 2 (P001, P002, etc. siendo P### el ID/nombre de cada DVD). Con esa lista lo que quiero es que al hacer clic en un ID me lleve a la primera película que hay en dicho DVD.

Espero haberme explicado bien, si no no hay ningún problema en intentar aclararme. Le estaré muy agradecido a quien me ayude y seguramente sirva para más gente.

Saludos.
andrei030
Mensajes: 11
Registrado: Dom Dic 28, 2008 6:38 am

Re: ¿Como seleccionar desde un listado?

Mensaje por andrei030 »

¿Seguro que este es el foro oficial? Porque veo muy poca ayuda para tanto software.
Última edición por andrei030 el Dom Ene 04, 2009 12:45 am, editado 1 vez en total.
andrei030
Mensajes: 11
Registrado: Dom Dic 28, 2008 6:38 am

Re: ¿Como seleccionar desde un listado?

Mensaje por andrei030 »

¿Nadie? Me lo imaginaba, es lo malo del software libre, poco soporte.
Última edición por andrei030 el Dom Ene 04, 2009 12:46 am, editado 1 vez en total.
QuazzieEvil
Mensajes: 99
Registrado: Sab Dic 13, 2008 6:45 pm

Re: ¿Como seleccionar desde un listado?

Mensaje por QuazzieEvil »

si te entiendo bien, creo que esto te puede ayudar.

Lo que tienes que hacer es enlazar el evento que se llama Changed (en ingles, serian Cambio? en espanol?) una majera seria de tomar el ID, y buscar la el primer record que tiene ese ID. TAMBIEN, es muy importante de cancelar el cambio. Siendo que el LISTBOX esta enlazado a la table, cualquier cambio en el listbox cambia la tabla (los datos de ese campo). El comando Form.CancelRowUpdates() cancela los cambios.

El macro enlazado al evento del List Box:

Código: Seleccionar todo

Sub lbFilter_OnChanged(Event As Object)
	Dim SelValue As Integer
	Dim SelIndex As Integer
	Dim ListBox As Object
	Dim Form As Object
	Dim Pos As Integer
	
	ListBox=Event.Source.Model
	Form=ListBox.Parent
	SelIndex=ListBox.SelectedItems(0)
	If SelIndex=0 Then Exit Sub
	SelValue=ListBox.ValueItemList(SelIndex)
	Form.CancelRowUpdates() 'else the value will be changed
	Pos=findFirst(Form,"ID",SelValue)
	If Pos>0 Then Form.absolute(Pos)
End Sub
En este caso, busco el primer record en el cual el campo llamado ID tiene el valor Selvalue. Este es el valor selecionado en el list box.
y el macro findFirst(...) que es llamado/ejecuato por el macro principal:

Código: Seleccionar todo

Function findFirst(Form As Object, ColumnName As String, Target As Variant,Optional StartPos As Integer) As Integer
	REM FIND THE FIRST OCCURRENCE OF TARGET 
	Dim rs as Object
	Dim ColIndex As Integer
	Dim Column As Object
	Dim FirstPos As Integer
	Dim ColumnValue As Variant
	Dim FormImpName As String
	
	FormImpName="com.sun.star.comp.forms.ODatabaseForm"
	REM ONLY WORK WITH FORM FOR THE MOMMENT
	REM COULD HVE IT WORK FOR RESULTSET AND ROWSET AS WELL
	If Form.ImplementationName<>FormImpName Then
		Exit Function
	End If
	If IsMissing(StartPos) Then
		StartPos=1
	End If
	rs=Form.createResultSet()
	ColIndex=rs.findColumn(ColumnName)
	If ColIndex<1 Or ColIndex > rs.Columns.Count Then
		Exit Function
	End If
	rs.absolute(StartPos)
	REM IF NOT BOTTOM GUARDED LOOP, FIRST ITERATION WILL BE SKIPPED
	REM THIS IS NOT GOOD AS THIS COULD BE THE FIRST OCCURRENCE
	Do 
		Column=rs.Columns.getByName(ColumnName)
		ColumnValue=getXXX(Column)
		If ColumnValue=Target Then
			findFirst=rs.Row
			Exit Function
		End If
	Loop While rs.next()
End Function

--espero que esto de ayude.
andrei030
Mensajes: 11
Registrado: Dom Dic 28, 2008 6:38 am

Re: ¿Como seleccionar desde un listado?

Mensaje por andrei030 »

Ya lo daba por perdido después de tantos días.
Pensaba que iba a ser más automatizado sin tener que usar códigos, de todos modos muchas gracias, lo probaré.
andrei030
Mensajes: 11
Registrado: Dom Dic 28, 2008 6:38 am

Re: ¿Como seleccionar desde un listado?

Mensaje por andrei030 »

Vale, ya he probado lo que me has comentado, le he dado mil vueltas y no he encontrado la manera. Igual es un poco complejo para principiantes. Si no es mucha molestia te dejo la base de datos en el siguiente enlace y me lo explicas sobre ella. Te estaré muy agradecido y de paso servirá para la gente que quiera hacer una base de datos de sus colecciones de DVDs, películas, juegos, etc.

http://andrei030.oxyrack.com/peliculas.odb

Un saludo.
QuazzieEvil
Mensajes: 99
Registrado: Sab Dic 13, 2008 6:45 pm

Re: ¿Como seleccionar desde un listado?

Mensaje por QuazzieEvil »

hice los siguientes cambios:

a la tabla, solo hice la columna ID Primary Key. Tambien cambie el ID para que sean unicos, si no, no se puede crear el Primary Key.

a el formulario:

1) cambie el SQL the la lista de contenido para que incluya el titulo y ID.

Código: Seleccionar todo

SELECT "Título", "ID" FROM "Películas" AS "Películas"
luego, enlaze el evento CHANGED de el List Box lbJumpTo (la que quieres usar para buscar) al macro lbJumpTo_OnChanged. lye hice unos cambios ha este macro para que funcione con los datos de ty tabla. el ejemplo que te habia mandado usaba un INTERGER, pero la columna ID es un STRING/VARCHAR.

los macros que use son estos:

Código: Seleccionar todo

Sub lbJumpTo_OnChanged(Event As Object)
       Dim SelValue As String
       Dim SelIndex As Integer
       Dim ListBox As Object
       Dim Form As Object
       Dim Pos As Integer
       
       ListBox=Event.Source.Model
       Form=ListBox.Parent
       SelIndex=ListBox.SelectedItems(0)
       If SelIndex=0 Then Exit Sub
       SelValue=ListBox.ValueItemList(SelIndex)
       
       'MsgBox SelIndex
		'MsgBox Join(ListBox.ValueItemList,",") & chr(10) & SelIndex & ": " & SelValue
		
       Form.CancelRowUpdates() 'else the value will be changed
       Pos=findFirst(Form,"ID",SelValue)

       If Pos>0 Then Form.absolute(Pos)
End Sub
Function findFirst(Form As Object, ColumnName As String, Target As Variant,Optional StartPos As Integer) As Integer
       REM FIND THE FIRST OCCURRENCE OF TARGET
       Dim rs as Object
       Dim ColIndex As Integer
       Dim Column As Object
       Dim FirstPos As Integer
       Dim ColumnValue As Variant
       Dim FormImpName As String
       
       FormImpName="com.sun.star.comp.forms.ODatabaseForm"
       REM ONLY WORK WITH FORM FOR THE MOMMENT
       REM COULD HVE IT WORK FOR RESULTSET AND ROWSET AS WELL
       If Form.ImplementationName<>FormImpName Then
          Exit Function
       End If
       If IsMissing(StartPos) Then
          StartPos=1
       End If
       rs=Form.createResultSet()
       ColIndex=rs.findColumn(ColumnName)
       If ColIndex<1 Or ColIndex > rs.Columns.Count Then
          Exit Function
       End If
       rs.absolute(StartPos)
       REM IF NOT BOTTOM GUARDED LOOP, FIRST ITERATION WILL BE SKIPPED
       REM THIS IS NOT GOOD AS THIS COULD BE THE FIRST OCCURRENCE
       Do
          Column=rs.Columns.getByName(ColumnName)
          ColumnValue=getXXX(Column)
          If ColumnValue=Target Then
             findFirst=rs.Row
             Exit Function
          End If
       Loop While rs.next()
End Function
Function getXXX(col) As Variant
	REM col is a column object.
	REM SELECT CASE gets property that corresponds to datatype passed
	Dim ret	
	Select Case col.TypeName
		Case "ARRAY": ret=col.Array
		Case "BLOB": ret=col.Blob
		Case "BOOLEAN": ret=col.Boolean
		Case "BYTE": ret=col.Byte
		Case "BYTES": ret=col.Bytes
		Case "BLOB": ret=col.Clob
		Case "DATE": ret=col.Date
		Case "DOUBLE": ret=col.Double
		Case "INTEGER": ret=col.Int
		Case "LONG": ret=col.Long
		Case "DECIMAL": ret=col.Double
		Case "NULL": ret=col.Null
		Case "OBJECT": ret=col.Object
		Case "REF": ret=col.Ref
		Case "SHORT": ret=col.Short
		Case "VARCHAR": ret=col.String
		Case "TIME": ret=col.Time
		Case "TIMESTAMP": ret=col.TimeStamp
		Case Else: ret=col.String 'GIVE STRING A TRY
	End Select
	getXXX=ret
End Function
creo que se me abia olvidado incluir el ultimo (getXXX)

estos macros los salve en la Biblioteca STANDARD de el formulario, en el Modulo [Peliculas]

-->no se si lo has visto, pero en este hilo [http://user.services.openoffice.org/es/ ... f=50&t=229] hay un tutorial que demuestra como programar con OOo y Basic--este esta en espanol. yo tengo unos documentos en http://www.geocities.com/rbenitez22 pero estan en ingles.
Adjuntos
peliculas.zip
archivo ODB con los cambios
(20.3 KiB) Descargado 369 veces
andrei030
Mensajes: 11
Registrado: Dom Dic 28, 2008 6:38 am

Re: ¿Como seleccionar desde un listado?

Mensaje por andrei030 »

Estuvo caído el foro durante los últimos días o por algún motivo no podía acceder a él.
Bueno, lo que has hecho se acerca casi del todo a lo que estaba buscando, lo que pasa es que quería varias películas con el mismo ID porque van en el mismo DVD, he visto que has cambiado los IDs y ahora cada película tiene su propio ID. De todos modos a partir de ahora me las sé arreglar, agregare un nuevo campo a la tabla de películas donde indicare el ID/nombre del DVD en el que están en vez de utilizar directamente el ID principal como nombre del DVD. Ahora cuando tenga algo de tiempo le echare un buen vistazo a todo para aprender.

Muchísimas gracias.
andrei030
Mensajes: 11
Registrado: Dom Dic 28, 2008 6:38 am

Re: ¿Como seleccionar desde un listado?

Mensaje por andrei030 »

Hola de nuevo, he estado probando la base de datos y no consigo hacer que el ID sea con valor automático para que no tenga yo que escribir uno por uno los números, no hay manera, da error, haga lo que haga.
QuazzieEvil
Mensajes: 99
Registrado: Sab Dic 13, 2008 6:45 pm

Re: ¿Como seleccionar desde un listado?

Mensaje por QuazzieEvil »

trata de hacerlo con SQL.

abre el menu Herramientas | SQL..


in estrebe el comando:

Código: Seleccionar todo

ALTER TABLE <nombre de tabla> ALTER COLUMN <nombre de columna> INDENTITY
Responder