visualizar mal en listbox

visualizar mal en listbox

Postby antonio1095 » Tue Jul 01, 2008 10:21 am

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]
Antonio
Madrid
España
antonio1095
 
Posts: 20
Joined: Sat Jul 22, 2006 12:34 pm
Location: Madrid - España

Postby antonio1095 » Tue Jul 01, 2008 10:54 am

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
Antonio
Madrid
España
antonio1095
 
Posts: 20
Joined: Sat Jul 22, 2006 12:34 pm
Location: Madrid - España

Postby antonio1095 » Sun Jul 13, 2008 11:06 am

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
Antonio
Madrid
España
antonio1095
 
Posts: 20
Joined: Sat Jul 22, 2006 12:34 pm
Location: Madrid - España

Postby Antonio Linares » Sun Jul 13, 2008 8:54 pm

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  Expand view  RUN
   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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42117
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby antonio1095 » Mon Jul 14, 2008 12:41 pm

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
Antonio
Madrid
España
antonio1095
 
Posts: 20
Joined: Sat Jul 22, 2006 12:34 pm
Location: Madrid - España

Postby FiveWiDi » Mon Jul 14, 2008 2:38 pm

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.
FiveWiDi
 
Posts: 1190
Joined: Mon Oct 10, 2005 2:38 pm

Postby Antonio Linares » Mon Jul 14, 2008 5:08 pm

Prueba esto:

MsgInfo( " 27" == Str( linsalid->factura, 6 ) )

Debería mostrarte .T.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42117
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby Antonio Linares » Mon Jul 14, 2008 5:12 pm

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.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42117
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby antonio1095 » Mon Jul 14, 2008 9:33 pm

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]
Antonio
Madrid
España
antonio1095
 
Posts: 20
Joined: Sat Jul 22, 2006 12:34 pm
Location: Madrid - España

Postby Antonio Linares » Mon Jul 14, 2008 9:57 pm

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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42117
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby antonio1095 » Tue Jul 15, 2008 9:50 am

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
Antonio
Madrid
España
antonio1095
 
Posts: 20
Joined: Sat Jul 22, 2006 12:34 pm
Location: Madrid - España

Postby Antonio Linares » Tue Jul 15, 2008 12:19 pm

Antonio,

Inténtalo de esta forma:

SELECT cAlias
SET FILTER TO str(factura,6) = m2filtro
...

en vez de llamar a DbSetFilter()
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42117
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby antonio1095 » Tue Jul 15, 2008 12:58 pm

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 ]
Antonio
Madrid
España
antonio1095
 
Posts: 20
Joined: Sat Jul 22, 2006 12:34 pm
Location: Madrid - España


Return to FiveWin para Pocket PC

Who is online

Users browsing this forum: No registered users and 12 guests