Page 1 of 1
visualizar mal en listbox
Posted: Tue Jul 01, 2008 10:21 am
by antonio1095
al visualizar el listbox me sale siempre el mismo registro repetido
salen 4 filas pero todas exactamente iguales con el mismo registro
adjunto el codigo de la funcion de visualizacion
antes abro la base de datos con
aDbf := Array( DBF_LON )
USE ( CurDir() + "\UBICACIO" ) NEW
INDEX ON UBICACIO->UBICACION TO ( CurDir() + "\UBICACI1" )
no se si me falta algo de los indices en el listbox
*---------------------------
STATIC FUNCTION Sel_ubica()
*---------------------------
LOCAL oDlg, oFont, oLbx
LOCAL nRecno := 0
LOCAL cAlias := aDbf[ DBF_UBICACIO]
HideKeyboard()
DEFINE FONT oFont NAME "Arial" SIZE 0, -12
DEFINE DIALOG oDlg RESOURCE "ubicaciones"
REDEFINE LISTBOX oLbx ;
FIELDS str(( cAlias )->ubicanume) , ( cAlias )->ubicacion ,str(( cAlias )->cantidad),;
str(( cAlias )->articulo), ( cAlias )->descripci ,( cAlias )->referenc , ( cAlias )->almacen ;
HEADERS "Nume ", "Ubicacion" ,"Existen.", "Articulo","Descripcion", " Referencia","Almacen" ;
ID 500 OF oDlg
oLbx:aColSizes := { 40, 50,50,50, 50,70,50,40 }
oLbx:blDblClick := {|| ( nRecno := (cAlias)->( Recno() ),;
oDlg:End() ) }
REDEFINE BUTTON ID 110 OF oDlg ;
ACTION ( dbclosearea(), oDlg:End() )
ACTIVATE DIALOG oDlg CENTERED
RETU nRecno
[/img]
Posted: Tue Jul 01, 2008 10:54 am
by antonio1095
Me respondo a mi mismo
me faltaba el poner el alias detras del olbx
queda asi y ya funciona
REDEFINE LISTBOX oLbx ;
FIELDS str(( cAlias )->ubicanume) , ( cAlias )->ubicacion ,str(( cAlias )->cantidad),;
str(( cAlias )->articulo), ( cAlias )->descripci ,( cAlias )->referenc , ( cAlias )->almacen ;
HEADERS "Nume ", "Ubicacion" ,"Existen.", "Articulo","Descripcion", " Referencia","Almacen" ;
ALIAS cAlias ;
ID 500 OF oDlg
he encontrado la solución en este foro
saludos
Posted: Sun Jul 13, 2008 11:06 am
by antonio1095
sigo a vueltas con el listbox
he tenido que poner el filtro en el listbox, por que era la unica forma en que me lo visualizase bien
REDEFINE LISTBOX oLbx ;
FIELDS str(( cAlias )->articulo) , ( cAlias )->nombarti ;
HEADERS "Articulo", "Nombr. Arti" ;
ALIAS ( cAlias )->( DBSETFILTER( {|| factura = v[ O_FACTURA ] }, "lineas de la cabecera" ) ) ;
ID 500 OF o[ O_DLG ]
y como ahora me vuelve el problema primitivo
se visualiza la primera linea del list box un monton de veces repetida
¿ como podria poner en el listbox una sentencia dbgotop que pueda convivir con la de DBSETFILTER ?
He probado de varias maneras con (cAlias)->dbgotop() pero no me lo admite
gracias por la ayuda
Posted: Sun Jul 13, 2008 8:54 pm
by Antonio Linares
Puedes usar la claúsula [ SELECT <cField> FOR <uValue1> [ TO <uValue2> ] ] que es mucho más rápida que un filtro pues se basa en un índice. Ejemplo:
Code: Select all
INDEX ON Clientes->Nombre TO CliName
SET INDEX TO CliName
GO TOP
REDEFINE LISTBOX oLbx ;
FIELDS Clientes->Nombre, Clientes->Direccion,;
Clientes->Telefono, ;
Str( Clientes->Edad, 3 ) ;
HEADERS "Name", "Address", "Phone", "Age" ;
FIELDSIZES 240, 310, 114, 24 ;
SELECT Nombre FOR "Laureano" TO "Paco" ;
SIZE 284, 137 ID ... OF oDlg
Posted: Mon Jul 14, 2008 12:41 pm
by antonio1095
Antonio
muchas gracias por tu ayuda, se que tengo un error por lo que no me sale pero sigo dandole vueltas, y llevo ya casi una semana y no doy con ello
he creado un indice primero
USE ( CurDir() + "\LINSALID" ) NEW
INDEX ON str(LINSALID->FACTURA,6) TO ( CurDir() + "\LINSALI1" )
aDbf[ DBF_LINSALID ] := Alias()
go top
REDEFINE GET o[ O_FECHA ] VAR v[ O_FECHA ] ID 114 OF o[ O_DLG ]
REDEFINE GET o[ O_CLIENTES ] VAR v[ O_CLIENTES ] ID 115 OF o[ O_DLG ] PICTURE '999999'
REDEFINE GET o[ O_NOMBCLIENT] VAR v[ O_NOMBCLIENT ] ID 112 OF o[ O_DLG ]
REDEFINE GET o[ O_FACTURA ] VAR v[ O_FACTURA ] ID 200 OF o[ O_DLG ]
después hago el listbox
si lo hago así me funciona perfectamente
REDEFINE LISTBOX oLbx ;
FIELDS str(( cAlias )->articulo) , ( cAlias )->nombarti ;
HEADERS "Articulo", "Nombr. Arti" ;
SELECT str(linsalid->factura,6) FOR " 27" TO " 27"
Alias cAlias ;
ID 500 OF o[ O_DLG ]
pero si lo hago como debe ser
REDEFINE LISTBOX oLbx ;
FIELDS str(( cAlias )->articulo) , ( cAlias )->nombarti ;
HEADERS "Articulo", "Nombr. Arti" ;
SELECT str(linsalid->factura,6) FOR str(v[ O_FACTURA ],6) TO str(v[ O_FACTURA ],6) ;
Alias cAlias ;
ID 500 OF o[ O_DLG ]
no me da ningun error pero no me visualiza nada, ninguna linea del listbox
he repasado 80 veces la base de datos y el campo factura es identico en el fichero hijo linsalid que en el fichero padre
ambos son numerico 6
si le pongo algun msginfo para ver el valor que toma v[ O_FACTURA ] no me lo muestra, ya estoy perdido, ¿por donde puedo ver donde tengo el fallo?
saludos y muchas gracias por la ayuda
Posted: Mon Jul 14, 2008 2:38 pm
by FiveWiDi
antonio1095 wrote:Antonio
muchas gracias por tu ayuda, se que tengo un error por lo que no me sale pero sigo dandole vueltas, y llevo ya casi una semana y no doy con ello
he creado un indice primero
USE ( CurDir() + "\LINSALID" ) NEW
INDEX ON str(LINSALID->FACTURA,6) TO ( CurDir() + "\LINSALI1" )
aDbf[ DBF_LINSALID ] := Alias()
go top
REDEFINE GET o[ O_FECHA ] VAR v[ O_FECHA ] ID 114 OF o[ O_DLG ]
REDEFINE GET o[ O_CLIENTES ] VAR v[ O_CLIENTES ] ID 115 OF o[ O_DLG ] PICTURE '999999'
REDEFINE GET o[ O_NOMBCLIENT] VAR v[ O_NOMBCLIENT ] ID 112 OF o[ O_DLG ]
REDEFINE GET o[ O_FACTURA ] VAR v[ O_FACTURA ] ID 200 OF o[ O_DLG ]
después hago el listbox
si lo hago así me funciona perfectamente
REDEFINE LISTBOX oLbx ;
FIELDS str(( cAlias )->articulo) , ( cAlias )->nombarti ;
HEADERS "Articulo", "Nombr. Arti" ;
SELECT str(linsalid->factura,6) FOR " 27" TO " 27"
Alias cAlias ;
ID 500 OF o[ O_DLG ]
pero si lo hago como debe ser
REDEFINE LISTBOX oLbx ;
FIELDS str(( cAlias )->articulo) , ( cAlias )->nombarti ;
HEADERS "Articulo", "Nombr. Arti" ;
SELECT str(linsalid->factura,6) FOR str(v[ O_FACTURA ],6) TO str(v[ O_FACTURA ],6) ;
Alias cAlias ;
ID 500 OF o[ O_DLG ]
no me da ningun error pero no me visualiza nada, ninguna linea del listbox
he repasado 80 veces la base de datos y el campo factura es identico en el fichero hijo linsalid que en el fichero padre
ambos son numerico 6
si le pongo algun msginfo para ver el valor que toma v[ O_FACTURA ] no me lo muestra, ya estoy perdido, ¿por donde puedo ver donde tengo el fallo?
saludos y muchas gracias por la ayuda
Has probado:
...
SELECT linsalid->factura FOR 27 TO 27 ;
...
Saludos
Carlos G.
Posted: Mon Jul 14, 2008 5:08 pm
by Antonio Linares
Prueba esto:
MsgInfo( " 27" == Str( linsalid->factura, 6 ) )
Debería mostrarte .T.
Posted: Mon Jul 14, 2008 5:12 pm
by Antonio Linares
v es una variable local ?
No puede ser local ni static pues se va a generar un codeblock con la expresión usada, por lo que ha de ser pública ó privada.
Posted: Mon Jul 14, 2008 9:33 pm
by antonio1095
gracias por la ayuda
he cambiado la variable por una variable publica
despues de muchas pruebas con lo que mejor me sale es con esto
Public m2filtro:=" "
*------------------------------
STATIC FUNCTION sali_Find(o,v)
*------------------------------
LOCAL cAlias := aDbf[ DBF_SALIDAS ]
LOCAL nRecno := Sel_sali()
IF nRecno > 0
( cAlias )->( DbGoto( nRecno ) )
v[ O_CLIENTES ] := ( cAlias)->clientes
v[ O_FECHA ] := ( cAlias )->fecha
v[ O_NOMBCLIENT]:= ( cAlias )->nombclient
v[ O_FACTURA ]:= ( cAlias )->factura
v[ O_RECNO ] := nRecno
sali_RefreshVar( o, v )
m2filtro := str(( cAlias )->factura,6)
ENDIF
RETU NIL
*------------------------------
STATIC FUNCTION SALIDAS()
*------------------------------
LOCAL oFont, oLbx
LOCAL o := Array( O_LON )
local v := Array( O_LON )
LOCAL cAlias := aDbf[ DBF_LINSALID]
sali_IniVar( o, v )
DEFINE FONT oFont NAME "Arial" SIZE 0, -12
DEFINE DIALOG o[ O_DLG ] RESOURCE "NUEVASALIDA"
REDEFINE GET o[ O_FECHA ] VAR v[ O_FECHA ] ID 114 OF o[ O_DLG ]
REDEFINE GET o[ O_CLIENTES ] VAR v[ O_CLIENTES ] ID 115 OF o[ O_DLG ] PICTURE '999999'
REDEFINE GET o[ O_NOMBCLIENT] VAR v[ O_NOMBCLIENT ] ID 112 OF o[ O_DLG ]
REDEFINE GET o[ O_FACTURA ] VAR v[ O_FACTURA ] ID 200 OF o[ O_DLG ] PICTURE '999999'
msginfo("m2filtro = " + m2filtro )
REDEFINE LISTBOX oLbx ;
FIELDS str(( cAlias )->articulo) , ( cAlias )->nombarti ;
HEADERS "Articulo", "Nombr. Arti" ;
ALIAS ( cAlias )->( DBSETFILTER( {|| str(factura,6) = m2filtro }, "lineas de la cabecera" ) ) ;
ID 500 OF o[ O_DLG ]
oLbx:Gotop()
oLbx:Refresh()
REDEFINE BUTTON ID 111 OF o[ O_DLG ] ACTION ( linsalid(o,v) )
REDEFINE BUTTON ID 207 OF o[ O_DLG ] ACTION ( cli_busca(o,v) )
ACTIVATE DIALOG o[ O_DLG ] CENTERED ;
ON INIT ( sali_Bar( o, v ), .f. )
RETU NIL
el problema es que el listbox si que localiza los registros que cumplen pero lo pinta mal, pinta el primer registro muchas veces seguidas
si entro luego en los registros que ha seleccionado lo ha hecho bien
pero le falta un go top que sea efectivo
he puesto
oLbx:Gotop()
pero no hace nada
otras veces lo he resuelto poniendo despues
Alias cAlias
pero esta vez no me responde
[/img]
Posted: Mon Jul 14, 2008 9:57 pm
by Antonio Linares
Antonio,
La llamada a DbSetFilter() no debes hacerla aqui:
REDEFINE LISTBOX ... ;
ALIAS ( cAlias )->( DBSETFILTER( {|| str(factura,6) = m2filtro }, "lineas de la cabecera" ) ) ;
...
Ahí solo debes especificar ALIAS cAlias
La llamada a ( cAlias )->( DbSetFilter( ... ) ) debes hacerla con anterioridad
Posted: Tue Jul 15, 2008 9:50 am
by antonio1095
Antonio
lo he hecho asi , que era como lo tenia al principio
pero así no me selecciona ninguna linea en el lista box
si hago
( cAlias )->( DbSetFilter( {|| str(factura,6) = " 27" }, "lineas de salida" ) )
se visualiza perfectamente
pero si hago
( cAlias )->( DbSetFilter( {|| str(factura,6) = m2filtro }, "lineas de salida" ) )
no me visualiza ninguna linea
la variable m2filtro es publica y viene de otra function
STATIC FUNCTION sali_Find(o,v)
donde se hace entre otras lineas
m2filtro := str(( cAlias )->factura,6)
en esta function cuando pongo un mensaje la variable m2filtro me la muesta bien
despues en la funcion que hago el filtro ya no la muestra
¿es posible que la variable publica cuando vuelve a la funcion principal no conserve su valor por algún motivo?
esta es la función principal, donde deberia conservarse la variable publica
*------------------------------
STATIC FUNCTION SALIDAS()
*------------------------------
LOCAL oFont, oLbx
LOCAL o := Array( O_LON )
local v := Array( O_LON )
LOCAL cAlias := aDbf[ DBF_LINSALID]
sali_IniVar( o, v )
DEFINE FONT oFont NAME "Arial" SIZE 0, -12
DEFINE DIALOG o[ O_DLG ] RESOURCE "NUEVASALIDA"
REDEFINE GET o[ O_FECHA ] VAR v[ O_FECHA ] ID 114 OF o[ O_DLG ]
REDEFINE GET o[ O_CLIENTES ] VAR v[ O_CLIENTES ] ID 115 OF o[ O_DLG ] PICTURE '999999'
REDEFINE GET o[ O_NOMBCLIENT] VAR v[ O_NOMBCLIENT ] ID 112 OF o[ O_DLG ]
REDEFINE GET o[ O_FACTURA ] VAR v[ O_FACTURA ] ID 200 OF o[ O_DLG ] PICTURE '999999'
msginfo("m2filtro = " + m2filtro ) esto lo muestra la primera vez que carga el programa , pero no las siguientes
( cAlias )->( DbSetFilter( {|| str(factura,6) = m2filtro }, "lineas de salida" ) )
( cAlias )->( dbgotop() )
REDEFINE LISTBOX oLbx ;
FIELDS str(( cAlias )->articulo) , ( cAlias )->nombarti ;
HEADERS "Articulo", "Nombr. Arti" ;
Alias cAlias ;
ID 500 OF o[ O_DLG ]
REDEFINE BUTTON ID 111 OF o[ O_DLG ] ACTION ( linsalid(o,v) )
REDEFINE BUTTON ID 207 OF o[ O_DLG ] ACTION ( cli_busca(o,v) )
ACTIVATE DIALOG o[ O_DLG ] CENTERED ;
ON INIT ( sali_Bar( o, v ), .f. )
RETU NIL
Posted: Tue Jul 15, 2008 12:19 pm
by Antonio Linares
Antonio,
Inténtalo de esta forma:
SELECT cAlias
SET FILTER TO str(factura,6) = m2filtro
...
en vez de llamar a DbSetFilter()
Posted: Tue Jul 15, 2008 12:58 pm
by antonio1095
Antonio
con esto ultimo si funciona, muchas gracias por tu ayuda
pero como la felicidad nunca es completa , algunas lineas quedan ocultas en el listbox por la parte supeerior
he probado con dbgotop y con gotop , pero entonces no aparece nada
SELECT ( cAlias )
SET FILTER TO str(factura,6) = m2filtro
* ( cAlias )->( dbgotop() )
* go top
REDEFINE LISTBOX oLbx ;
FIELDS str(( cAlias )->articulo) , ( cAlias )->nombarti ;
HEADERS "Articulo", "Nombr. Arti" ;
Alias cAlias ;
ID 500 OF o[ O_DLG ]