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


Image[/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 ]