Page 1 of 1

Comentario sobre una busqueda...

PostPosted: Thu Nov 09, 2006 10:50 am
by Elias Torres
Hola a todos...

Lo que pretendo es que al introducir un código me realice una búsqueda en la tabla de articulos y me muestre el nombre de este y la cantidad. El codigo que estoy usando es el siguiente...


Alguien podría decirme si este codigo está mal?

.....

DEFINE FONT oFont NAME "Courier New" SIZE 6, -14
odlg:bKeyChar = { | nKey, nFlags | Search_art(nKey,@cSearch,Nombre ),oSay:REFRESH()}

redefine say oSay prompt cSearch id 130 of odlg
redefine get oGetNombre var nombre id 4004 of odlg
odlg:REFRESH()
ACTIVATE dialog odlg



y la llamada a search_art es la siguiente

*--------------------------------------------------
function Search_art( nKey, cSearch,Nombre )
*--------------------------------------------------

if nKey = 8
cSearch = SubStr( cSearch, 1, Len( cSearch ) - 1 )
else
cSearch += Upper( Chr( nKey ) )
ENDIF
articulos->( DbSeek( cSearch, .t. ) )
nombre:=articulos->nom_art

return nil

La verdad es que no veo en que está fallando... Por cierto si pongo en la funcion de arriba el nkey=13, ¿estoy preguntando si se ha pulsado la tecla intro?

Un saludo y gracias..

Elías Torres

PostPosted: Thu Nov 09, 2006 6:09 pm
by Elias Torres
Hola a todos...

Al final creo que he solucionado el tema con lo que tenia, pero lo que pasa es que no se como refrescar un get....

La informacion a buscar la quiero poner en :

redefine get oGetNombre var articulos->nom_art id 4004 of odlg

He probado a refrescar el odlg completo pero no me refresca ese get. El valor que tiene articulos->nom_art despues de la busqueda es correcto porque pongo un msginfo(articulos->nom_art) y cambia dependiendo de la busqueda, pero luego no me lo pone en el GET..

Alguien sabe por que?

Un saludo y gracias..

Elías Torres.

PostPosted: Thu Nov 09, 2006 7:03 pm
by wilsongamboa
Elias prueba
oGetNombre:Refresh()

Saludos

PostPosted: Thu Nov 09, 2006 7:35 pm
by Elias Torres
Gracias wilsongamboa, efectivamente era esa boberia....

Una curiosidad, a ver si alguien me puede responder.. Si mirais el procedimiento de arriba vereis que en nkey controlo la tecla que se pulsa. Hasta ahi correcto. Pero mi sorpresa viene cuando compruebo que la tecla intro, tanto en el teclado virtual con en el otro, no tiene su correspondiente numeración. Me explico, si se pulsa la tecla de borrar y ponemos msginfo(nkey) nos devuelve un 8, si pulsamos el espacio nos devuelve un 32 (creo) pero cuando se pulsa en el intro no hace nada. Es como que no tiene accion ninguna. ¿Alguien sabe porque ocurre esto, y si tiene alguna solución?. En mi caso lo que pretendo hacer es que escribo un codigo y hasta que no le de al intro no realiza la actualizacion de la pantalla, pero claro por ahora lo tengo para que me funcione al pulsar el espacio, pero me gustaria que fuera con la tecla intro.

Un saludo y gracias..

Elías Torres.

PostPosted: Fri Nov 10, 2006 10:04 am
by Antonio Linares
Elías,

Por favor muestra el código de cómo lo estás haciendo, gracias

PostPosted: Fri Nov 10, 2006 10:43 am
by Elias Torres
Perdona Antonio, se me paso poner el codigo....

Bueno, estas son las dos funciones que estoy utilizando. Lo que pretendo hacer es un inventario, en el que al introducir un codigo muestre la descripcion y las cantidades(estas ultimas se podrán modificar) y asi sucesivamente....

Yo creo que el motivo por el que no funciona el intro (ni en el emulador ni en el teclado) es por el procedimiento de busqueda que realizo, pero mi duda es porque el borrar si lo hace....

Si tienes alguna sugerencia de como realizar la busqueda una vez introducido el codigo, comentamela...te lo agradeceria mucho.

El codigo es el siguiente....

******************
FUNCTION Registros()
******************
local oDlg
LOCAL oGetInventario, oGetNombre, oGetAcumulado, oGetCantidad, LOCAL oGetFecha, cantidad:=0,acumulado:=0, cSearch := "",nombre

SELECT inventario
IF EOF()
c=1
ELSE
inventario->(dbgobottom())
c=val(inventario->numdoc)+1
endif
oGetInventario_cod=RIGHT(STR(1000000+c),6)
oGetFecha=(DTOC(date())+' '+cValToChar((TIME())))
Inventario->(dbappend())
inventario->numdoc:=oGetInventario_cod
inventario->fecha_doc:=oGetFecha
showkeyboard()
(cAliasInventario)->(DbSeek((cAliasArticulos)->cod_art,.t.))

DEFINE dialog odlg resource "Inventario"

redefine group ogrp id 600 of odlg color CLR_RED,RGB(230,184,94)

DEFINE font oFont2 name "Courier New" bold
redefine say id 4001 of odlg color CLR_RED, RGB(230,184,94)
redefine say id 4002 of odlg color CLR_RED, RGB(230,184,94)
redefine say id 4003 of odlg color CLR_RED, RGB(230,184,94)
redefine say id 120 of odlg color CLR_RED, RGB(230,184,94)
redefine say id 4010 of odlg color RGB(1,1,1),RGB(230,184,94)
redefine say id 4011 of odlg color RGB(1,1,1),RGB(230,184,94)
DEFINE FONT oFont NAME "Courier New" SIZE 6, -14

redefine say oSay prompt cSearch id 130 of odlg COLOR CLR_BLACK, CLR_WHITE
oSay:bKeyChar = { | nKey, nFlags | Search_art( nKey, @cSearch),oSay:REFRESH(),oGetNombre:Refresh()}

redefine get oGetAcumulado var acumulado id 4007 of odlg
redefine get oGetCantidad var cantidad id 4005 of odlg
redefine get oGetNombre var articulos->nom_art id 4004 of odlg
redefine get oGetNumDoc var oGetInventario_cod id 4008 of odlg
redefine get oGetFecha_Doc var oGetFecha id 4009 of odlg
odlg:setcolor(RGB(1,1,1),RGB(230,184,94))
inventario->codigo:=articulos->cod_art
inventario->pvp:=articulos->precio
inventario->nombre:=articulos->nom_art
inventario->stock:= acumulado
inventario->cant:= cantidad
ACTIVATE dialog odlg;
on init barra_desplazamiento( odlg)
oFont:End()
RETURN nil


************************************
function Search_art( nkey,cSearch,nombre )
************************************

if nKey = 8 &&equivale a pulsar la tecla de borrar
cSearch = SubStr( cSearch, 1, Len( cSearch ) - 1 )
else
cSearch += Upper( Chr( nKey ) )
ENDIF
IF nKey = 32 &&equivale a pulsar el espacio
articulos->( DbSeek( ALLTRIM(@cSearch)),.t.)
cSearch=""
endif
return nil


Un saludo y gracias.

Elías Torres.

PostPosted: Fri Nov 10, 2006 10:59 am
by Antonio Linares
Elías,

Prueba a usar:

oSay:bKeyDown = { | nKey, nFlags | If( nKey == VK_RETURN, MsgInfo( "return" ),) }

PostPosted: Fri Nov 10, 2006 11:06 am
by Elias Torres
Antonio, he probado lo que me has dicho pero no funciona. En nkey no se registra el VK_RETURN. Cualquier otra cosa si pero ese no....

Saludos...

Elías Torres.

PostPosted: Fri Nov 10, 2006 11:44 am
by Antonio Linares
Elías,

Este ejemplo funciona correctamente:
Code: Select all  Expand view
// FiveWin for Pocket PC - Testing browses with incremental search

#include "FWCE.ch"

REQUEST DBFCDX

//----------------------------------------------------------------------------//

function Main()

   local oWnd, oBrw, hBmp := ReadBitmap( CurDir() + "\go.bmp" )
   local oSay, cSearch := ""

   USE ( CurDir() + "\Customer" ) VIA "DBFCDX"
   INDEX ON Customer->Last TO "LAST"
   Customer->( OrdSetFocus( "LAST" ) )
   Customer->( DbGoTop() )

   DEFINE WINDOW oWnd TITLE "IncSearch"
   
   @ 1, 1 LISTBOX oBrw ;
      FIELDS hBmp, Customer->Last, Customer->First ;
      HEADERS "", "Last", "First" ;
      SIZE 220, 167
   
   oBrw:bKeyChar = { | nKey, nFlags | Search( nKey, @cSearch ), oBrw:Refresh(),;
                                      oSay:Refresh() }
   
   @ 14,  2 SAY "Searching:" SIZE 60, 30
   @ 14, 12 SAY oSay PROMPT cSearch SIZE 80, 30
   
   ACTIVATE WINDOW oWnd ;
      ON CLICK MsgInfo( "Click!" )
   
return nil

//----------------------------------------------------------------------------//

function Search( nKey, cSearch )

   #define VK_RETURN 13

   if nKey == VK_RETURN
      MsgInfo( "ok" )
   endif   

   if nKey = 8
      cSearch = SubStr( cSearch, 1, Len( cSearch ) - 1 )
   else
      cSearch += Upper( Chr( nKey ) )
   endif
   
   Customer->( DbSeek( cSearch, .t. ) )

return nil

//----------------------------------------------------------------------------//

PostPosted: Fri Nov 10, 2006 12:06 pm
by Elias Torres
Antonio, efectivamente el ejemplo que me pasas funciona correctamente pero para mi aplicacion no va..... He estado comparandolos y la unica diferencia que veo es que en el ejemplo se trabaja con un browse y mi aplicacion con un say, ¿puede ser ese el problema?..

**********
Mi aplicacion
**********

oSay:bKeyChar = { | nKey, nFlags | Search_art( nKey, @cSearch),oSay:REFRESH(),oGetNombre:Refresh()}


**********
El ejemplo
**********

oBrw:bKeyChar = { | nKey, nFlags | Search( nKey, @cSearch ), oBrw:Refresh(),oSay:Refresh() }


Ademas he colocado el #define VK_RETURN 13 en el Search(nkey,@cSearch) porque eso si que no lo tenia, pero nada, no va....


Un saludo y gracias.

Elías Torres.

PostPosted: Fri Nov 10, 2006 1:31 pm
by Antonio Linares
Elías,

Un SAY no responde a los eventos de teclado. No puedes usarlo.