Gracias por responder Daniel!
La tabla tiene 24 filas, es bastante chica por cierto.
Tal vez hago algo mal y por eso el programa deja de responder.
Lo solucioné parcialmente haciendo otra consulta poniendo en el WHERE el codigo a buscar, pero obviamente no es la forma más practica, ya que levanto la consulta cada vez que tengo que validar el código.
La idea es que si el código existe en la tabla (consulta) me devuelva el nombre y siga, y sino, que me muestre un XBrowse (ordenado por nombre) para que seleccione (con búsqueda incremental incluida)
Este es el dialogo que pide el dato (que tiene que estar en la tabla de códigos)
- Code: Select all Expand view RUN
oQ := oServer:Query("SELECT codigo,nombre FROM codigos ORDER BY codigo")
DEFINE DIALOG oDlg1 TITLE "Agrega codigo a empresa "+str(nCodEmp) FROM 05,15 TO 12,65 OF oDlg
@ 05, 05 SAY "Codigo:" OF oDlg1 PIXEL SIZE 60,20 RIGHT
@ 20, 05 SAY "Descripcion:" OF oDlg1 PIXEL SIZE 60,20 RIGHT
@ 05, 70 GET oGet[1] VAR nCod OF oDlg1 PIXEL ;
PICTURE "9999" RIGHT VALID(Buscar(oQ,oDlg1,oGet[1],oGet[2])) //Esta es la funcion que falla: Buscar
@ 20, 70 GET oGet[2] VAR cNom OF oDlg1 PIXEL WHEN(.F.)
@ acor[1],acor[2] BUTTON oBot[1] PROMPT "&Agrega" OF oDlg1 SIZE 30,10 ;
ACTION ((lRta := .t.), oDlg1:End() ) PIXEL
@ acor[3],acor[4] BUTTON oBot[2] PROMPT "&Cancelar" OF oDlg1 SIZE 30,10 ;
ACTION ((lRta := .f.), oDlg1:End() ) PIXEL CANCEL
ACTIVATE DIALOG oDlg1 CENTER ON INIT oGet[1]:SetFocus()
Esta es la función buscar
- Code: Select all Expand view RUN
#include "FiveWin.ch"
#include "xbrowse.ch"
#include "tdolphin.ch"
FUNCTION buscar(oQr, oWnd, oGet1, oGet2)
LOCAL oDlg1, oBot1, oLbx, n := VAL(oGet1:cText)
IF oQr:Seek(n,"codigo") > 0 //Lo encontró
IF oGet2 <> nil
oGet2:cText := oQr:nombre // Pone el nombre en el Get (si se pasa como parametro el 2do get
oGet2:Refresh()
ENDIF
RETURN .t. // Devuelve .t.
ELSE // Si no lo encontró
oQr:SetOrder("nombre",.T.) // Cambia el orden a nombre
oQr:GoTop()
DEFINE DIALOG oDlg1 RESOURCE "BUSCAR" TITLE "Busqueda" OF oWnd
oDlg1:lHelpIcon := .f.
REDEFINE XBROWSE oLbx DATASOURCE oQr;
COLUMNS "Codigo","Nombre";
SIZES 100,500;
ID 111 OF oDlg1 AUTOSORT ON DBLCLICK oDlg1:End()
REDEFINE SAY oLbx:oSeek PROMPT "" ID 102 OF oDlg1
base:bOnChangePage := {|| oLbx:Refresh() }
oLbx:bKeyDown := {|nKey| IF(nKey==13,oDlg1:End(),.t.) }
PintaBrw(oLbx) // Esta función formatea el Browse para que se vea lindo
REDEFINE BUTTON oBot1 ID 103 OF oDlg1 ACTION oDlg1:end() CANCEL
ACTIVATE DIALOG oDlg1 ON INIT oLbx:SetFocus()
oGet1:cText := oQr:codigo
IF oGet2 <> nil
oGet2:cText := oQr:nombre
oGet2:Refresh()
ENDIF
oQr:SetOrder("codigo",.T.) // vuelvo a poner el orden por codigo para que quede listo para la busqueda nuevamente
ENDIF
RETURN .t.
Como veras ésta es una función genérica que tengo para toda ayuda de tablas (que siempre tienen el campo codigo y nombre).
Esto funciona bien la primera vez. Si yo pongo un código válido anda, si pongo uno inválido muestra la ayuda ordenada por nombre y anda, pero si vuelvo a entrar a editar el primer get, después de haber hecho una búsqueda por nombre, ahí me da un error de Windows y se me va.
Gracias por el tiempo y la ayuda