Page 1 of 2

Tdolphin: se bloquea seek al cambiar el orden de Query

Posted: Mon May 07, 2012 3:41 am
by interwin
Buenas noches

En una aplicacion tengo la necesidad de brindar al usuario la opcion de hacer busquedas en un query sobre un campo numero o sobre un campo nombre. Si el usuario hace una busqueda en un query ordenado sobre el campo numero y despues hace una busqueda sobre el campo nombre todo funciona bien, pero si despues se vuelve a hacer otra busqueda sobre el campo numero el sistema se bloquea, a continuacion pongo el codigo con un ejemplo del problema:

Code: Select all

   //1.- se  ordena por el campo numero y se hace una busqueda (esta busqueda funciona bien)
   oQry:setOrder('Numero'+" ASC",.t.)
   If oQry:seek('5', 'Numero',,,.f. ) > 0
         msginfo('numero 5 encontrado')
   else
         msginfo('numero 5 no encontrado')
   endif

   //2.- Se ordena por el campo nombre y se hace una busqueda (esta busqueda funciona bien)
   oQry:setOrder('Nombre'+" ASC",.t.)
   If oQry:seek('A', 'Nombre',,,.f. ) > 0
         msginfo('Nombre A encontrado')
   else
         msginfo('Nombre A no encontrado')
   endif

   //3.-  se  ordena por el campo numero y se hace una busqueda: identico al paso 1, [b]aqui se bloquea el sistema[/b]
   oQry:setOrder('Numero'+" ASC",.t.)
   If oQry:seek('5', 'Numero',,,.f. ) > 0
         msginfo('numero 5 encontrado')
   else
         msginfo('numero 5 encontrado')
   endif
 
Saludos

Re: Tdolphin: se bloquea seek al cambiar el orden de Query

Posted: Mon May 07, 2012 10:21 am
by Daniel Garcia-Gil
Hola

como es la consulta?

Re: Tdolphin: se bloquea seek al cambiar el orden de Query

Posted: Mon May 07, 2012 3:51 pm
by interwin
Daniel buenos dias.

Te paso el ejemplo con el query de consulta

Code: Select all

.
.
.

    cArchivo:='Clientes'
    DEFINE QUERY oQry "SELECT * FROM "+ cArchivo +" order by numero"

   //1.- se  ordena por el campo numero y se hace una busqueda (esta busqueda funciona bien
   oQry:setOrder('Numero'+" ASC",.t.)
   If oQry:seek('5', 'Numero',,,.f. ) > 0
         msginfo('numero 5 encontrado')
   else
         msginfo('numero 5 no encontrado')
   endif

   //2.- Se ordena por el campo nombre y se hace una busqueda (esta busqueda funciona bien)
   oQry:setOrder('Nombre'+" ASC",.t.)
   If oQry:seek('A', 'Nombre',,,.f. ) > 0
         msginfo('Nombre A encontrado')
   else
         msginfo('Nombre A no encontrado')
   endif

   //3.-  se  ordena por el campo numero y se hace una busqueda: identico al paso 1, aqui se bloquea el sistema
   oQry:setOrder('Numero'+" ASC",.t.)
   If oQry:seek('5', 'Numero',,,.f. ) > 0
         msginfo('numero 5 encontrado')
   else
         msginfo('numero 5 encontrado')
   endif
.
.
.
 
Saludos

Re: Tdolphin: se bloquea seek al cambiar el orden de Query

Posted: Fri Jun 21, 2013 1:42 am
by cmsoft
Este tema tuvo solución Daniel? Porque estoy teniendo el mismo problema...
Gracias!

Re: Tdolphin: se bloquea seek al cambiar el orden de Query

Posted: Sat Jun 22, 2013 3:48 am
by Daniel Garcia-Gil
Saludos

Iterwin, tu ejemplo funciona perfectamente bien

Code: Select all

//#include "hbcompat.ch"
#include "tdolphin.ch"

#define CRLF Chr( 13 ) + Chr( 10 )

PROCEDURE Main()
   
   LOCAL oServer   := NIL

   LOCAL aStruc, aRow, uItem
   LOCAL oQry, n, cArchivo
   
   SET CENTURY ON
   SET DATE FORMAT "dd/mm/yyyy"
   
   IF ( oServer := ConnectTo() ) == NIL
      RETURN 
   ENDIF

    cArchivo:='custo'
    DEFINE QUERY oQry "SELECT * FROM "+ cArchivo +" order by id"

   //1.- se  ordena por el campo id y se hace una busqueda (esta busqueda funciona bien
   oQry:setOrder('id'+" ASC",.t.)
   If oQry:seek('5', 'id',,,.f. ) > 0
         msginfo('id 5 encontrado')
   else
         msginfo('id 5 no encontrado')
   endif

   Inkey(0)

   //2.- Se ordena por el campo first y se hace una busqueda (esta busqueda funciona bien)
   oQry:setOrder('first'+" ASC",.t.)
   If oQry:seek('A', 'first',,,.f. ) > 0
         msginfo('first A encontrado')
   else
         msginfo('first A no encontrado')
   endif

   Inkey(0)

   //3.-  se  ordena por el campo id y se hace una busqueda: identico al paso 1, aqui se bloquea el sistema
   oQry:setOrder('id'+" ASC",.t.)
   If oQry:seek('5', 'id',,,.f. ) > 0
         msginfo('id 5 encontrado')
   else
         msginfo('id 5 encontrado')
   endif

   Inkey(0)

RETURN
   

PROCEDURE MsgInfo(c)
   ? c
RETURN

#include "connto.prg"
 
cmsoft

Todo dependera de la cantidad de filas que retorne la consulta, recuerda que estamos hablando de datos que normalmente se encuentran de forma remota, para eso los sistemas de sql usan limites en sus consultas, con la finalidad de agilizar el proceso

Re: Tdolphin: se bloquea seek al cambiar el orden de Query

Posted: Sat Jun 22, 2013 4:34 am
by cmsoft
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

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

#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

Re: Tdolphin: se bloquea seek al cambiar el orden de Query

Posted: Mon Aug 05, 2013 3:20 pm
by Biel EA6DD
interwin wrote:
En una aplicacion tengo la necesidad de brindar al usuario la opcion de hacer busquedas en un query sobre un campo numero o sobre un campo nombre. Si el usuario hace una busqueda en un query ordenado sobre el campo numero y despues hace una busqueda sobre el campo nombre todo funciona bien, pero si despues se vuelve a hacer otra busqueda sobre el campo numero el sistema se bloquea,
Me sucede exactamente lo mismo, el problema parece que está en la funcion mySeek2, he leido varios mensaje en relación a esa función, con _.

Este problema sigue existiendo, o soy yo que no tengo la última versión.

Re: Tdolphin: se bloquea seek al cambiar el orden de Query

Posted: Tue Aug 06, 2013 1:05 pm
by Daniel Garcia-Gil
Hola

por favor podrian colocar un ejemplo que reproduzca el error, recuerden que el servidor de pruebas de dolphin sigue activo y lo pueden usar para estas circunstancias

les dejo practicamente el mismo ejemplo del principio, pero ya construido

http://www.sitasoft.net/dolphin/samples/testsk3.zip

Re: Tdolphin: se bloquea seek al cambiar el orden de Query

Posted: Tue Aug 06, 2013 3:02 pm
by Biel EA6DD
Hola Daniel, gracias por tu tiempo.
Efectivamente el ejemplo que incluyes no da error.
Aunque la verdad le habia dedicado tiempo intentando ver donde pudiera estar el problema, habia un pequeño detalle que se me estaba pansado por alto, los comandos de configuración del entorno (idioma, Casesensitive, ...).

El error sucede cuando se usa Set_MyLang( "esp" ), si se realiza la siguente secuencia de Seek se produce un exception error.

Set_MyLang( "esp" )
SetOrder campo Numérico
Seek OK
SetOrder campo Caracter
Seek OK
SetOrder campo Numérico
Seek ERROR

Lo he probado con el servidor de pruebas y se produce el error, supongo que podras reproducirlo, si lo requieres puedo enviarte un exe construido.

Re: Tdolphin: se bloquea seek al cambiar el orden de Query

Posted: Tue Aug 06, 2013 3:29 pm
by sysctrl2
Por cierto, alguien puede explicar para que es esa funcion?
Set_MyLang( "esp" )

saludos..

Re: Tdolphin: se bloquea seek al cambiar el orden de Query

Posted: Tue Aug 06, 2013 4:34 pm
by TecniSoftware
Biel EA6DD wrote:Hola Daniel, gracias por tu tiempo.
Efectivamente el ejemplo que incluyes no da error.
Aunque la verdad le habia dedicado tiempo intentando ver donde pudiera estar el problema, habia un pequeño detalle que se me estaba pansado por alto, los comandos de configuración del entorno (idioma, Casesensitive, ...).

El error sucede cuando se usa Set_MyLang( "esp" ), si se realiza la siguente secuencia de Seek se produce un exception error.

Set_MyLang( "esp" )
SetOrder campo Numérico
Seek OK
SetOrder campo Caracter
Seek OK
SetOrder campo Numérico
Seek ERROR

Lo he probado con el servidor de pruebas y se reproduce el error, supongo que podras reproducirlo, si lo requieres puedo enviarte un exe contruido.
Con respecto al cuelgue al cambiar el orden y volver al numerico:
Armas el xbrowse con autocols o le agregas las columnas manualmente?
Me parece que eso tiene mucho que ver, el comportamiento es distinto y creo que por ahi viene el problema.

Saludos!

Re: Tdolphin: se bloquea seek al cambiar el orden de Query

Posted: Tue Aug 06, 2013 5:12 pm
by Biel EA6DD
sysctrl2 wrote:Por cierto, alguien puede explicar para que es esa funcion?
Set_MyLang( "esp" )

saludos..
Por lo que he podido ver sirve para definir la configruación regional(Locale Support), y en concreto para la comparación de cadenas, pero el master Daniel nos lo concretará.

Re: Tdolphin: se bloquea seek al cambiar el orden de Query

Posted: Tue Aug 06, 2013 5:14 pm
by Biel EA6DD
TecniSoftware wrote: Con respecto al cuelgue al cambiar el orden y volver al numerico:
Armas el xbrowse con autocols o le agregas las columnas manualmente?
Me parece que eso tiene mucho que ver, el comportamiento es distinto y creo que por ahi viene el problema.

Saludos!
Al principio de darme el error lo hacia usando xBrowse con las columnas definidas manualmente (si bien haciendo uso del método de xBrowse SetColFromMysQl, que en el fondo es lo que hace autocols), después probe con autocols, obteniendo el mismo resultado.
Y finalmente prescindi de xBrowse, para reproducir y aislar el error.

Re: Tdolphin: se bloquea seek al cambiar el orden de Query

Posted: Tue Aug 06, 2013 5:28 pm
by Biel EA6DD
En mi caso el problema se soluciona sustituyendo

Code: Select all

Set_MyLang( "esp" )
por

Code: Select all

Set_MyLang( "es_ES" )
Alguien más con el mismo problema puede probarlo y confirmar que funciona.

Re: Tdolphin: se bloquea seek al cambiar el orden de Query

Posted: Tue Aug 06, 2013 5:41 pm
by TecniSoftware
Biel EA6DD wrote:
Aguien más con el mismo problema puede probarlo y confirmar que funciona.
Grande! hice el cambio a Set_MyLang( "es_ES" ) y ya no se cuelga!

Muchos saludos