Page 1 of 2

Busqueda en xBrowse con QSeek de Dolphin

Posted: Fri Aug 29, 2014 8:29 pm
by acuellar
Amigos

En la función Qseek no activa el cSortOrder mientras no se de click en la cabecera de la columna.
Cuando se pusla BackSpace para borrar la cadena de búsqueda se queda con el primer carácter.

Luego de hacer _ he logrado que lo realice, pero al mover el puntero o click en el browse se ubica en el registro delprimer carácter, al parecer lo mantiene en buffer.

Si se hizo un búsqueda y luego se pulsa la tecla HOME no borra el contenido del oSay.

Quizas exista otra manera de buscar, que no he encontrado en el foro.

Aquí parte del código y la función con las modificaciones.

Code: Select all

  DEFINE DIALOG oDlg RESOURCE "MUE_EMPL" Title "EMPLEADOS";oDlg:lHelpIcon:=.F.
   
  @0,0 xBrowse oBrw Of oDlg AUTOCOLS AUTOSORT 
   oBrw:setdolphin(oQry,.F.) 
   oBrw:nMarqueeStyle:=5
   oBrw:lHScroll:=.F.
   oBrw:lAllowRowSizing:= .f.
   oBrw:nColDividerStyle:=LINESTYLE_LIGHTGRAY
   oBrw:nRowDividerStyle:=LINESTYLE_LIGHTGRAY
   oBrw:bClrSelFocus:={ || { CLR_BLACK, { { 0.10,16777215,12961221 } }} }
   oBrw:bClrSel:={ || { CLR_BLACK, { { 0.30,16777215,12961210 } }} }
   oBrw:lRecordSelector:=.F.
    oBrw:lAllowColHiding := .f. 
   oBrw:lAllowColSwapping := .f.
  
              
   oCol:=oBrw:AddCol()
   oCol:bStrData  := { || oQry:CODIGO }
   oCol:nHeadStrAlign := AL_CENTER
   oCol:cHeader:= "COD."
   oCol:nWidth:=30
   oCol:cSortOrder := "CODIGO"
   oCol:bLClickHeader:= {|| oBrw:Gotop() }
    
   oCol:=oBrw:AddCol()
   oCol:bStrData  := { || oQry:NOMBRE }
   oCol:nHeadStrAlign := AL_CENTER
   oCol:cHeader   := "NOMBRE Y APELLIDOS"
   oCol:nWidth:=223
   oCol:cSortOrder := "NOMBRE"
   oCol:bLClickHeader:= {|| oBrw:Gotop() }

   oBrw:CreateFromResource(105)

   REDEFINE SAY oSay  ID 114 OF oDlg UPDATE PICTURE "@!"
   oBrw:bSeek  := { | c | QSeek( c,oBrw,oSay ) }
   ACTIVATE DIALOG oDlg CENTERED

//...


FUNCTION QSeek( c, oBrw, oSay )
   LOCAL oQry := oBrw:oMySql
   LOCAL cSortOrder, nStart
   LOCAL uData, nNum, lRet

   STATIC aLastRec := {}
   
   nNum := AScan( oBrw:aCols, {| o | !Empty( o:cOrder ) } )

   IF nNum < 1
     nNum:=1 ////Linea agregada para que ordene por la 1ra columna
     //RETURN FALSE
   ENDIF

   cSortOrder := oBrw:aCols[ nNum ]:cSortOrder

   IF Len( c ) == 1
      aLastRec := {}
   ENDIF

   IF Len( aLastRec ) < Len( c )
      IF Len( aLastRec ) == 0
         nStart := 1
      ELSE
         nStart := oQry:RecNo()
      ENDIF
      AAdd( aLastRec, nStart )
   ELSE
      ASize( aLastRec, Len( c ) - 1 )
      
      IF Len( aLastRec ) == 0
          nStart := 1
          aLastRec := {};c:="";oSay:Refresh();oBrw:GoTop();oBrw:Refresh();__KeyBoard(chr(1)) //Linea agregada
      ELSE
         nStart := ATail( aLastRec )
      ENDIF
   ENDIF
   IF HB_IsObject( oSay )
       oSay:SetText( Upper( c ) )
   ENDIF
   lRet := ( oQry:Seek( c, cSortOrder, nStart-1, oQry:LastRec(), !oQry:FieldType( cSortOrder  )=='N', .T. ) != 0 )
    
RETURN lRet
 
Gracias por la ayuda

Saludos,

Adhemar

Re: Busqueda en xBrowse con QSeek de Dolphin

Posted: Fri Aug 29, 2014 9:30 pm
by acuellar
Distinguidos

Con _ funciona lo de vaciar la cadena.
Almacenando la cadena en una variable.

Code: Select all

   REDEFINE SAY oSay VAR xSeek ID 114 OF oDlg UPDATE PICTURE "@!"
   oBrw:bSeek  := { | c | xSeek:=c,QSeek( c,oBrw,oSay ) }
       
   oBrw:bKeyDown:={|nKey| iif( nKey == VK_BACK, If(Len(xSeek)=1,(xSeek:="",oSay:Refresh(),oBrw:GoTop()), ), )

 
Ya no es necesario la cadena agregada en la función QSeek.

Faltaría lo de la tecla HOME, como saber cuando se pulsó ya que el nKey no da ningún valor.

Gracias

Saludos,

Adhemar

Re: Busqueda en xBrowse con QSeek de Dolphin

Posted: Fri Aug 29, 2014 10:46 pm
by acuellar
Amigos
Aquí una más
Como se crean los índices concatenados en MySql / MariaDB usando HeidiSQL, MySQL Front o con comandos

Ej. Tengo 2 Campos NOMBRE,APELLIDOS
Con DBF lo tengo asi:
INDEX ON AllTrim(NOMBRE)+" "+APELLIDOS TAG CNOMBRE

Gracias por la ayuda.

Saludos,

Adhemar

Re: Busqueda en xBrowse con QSeek de Dolphin

Posted: Mon Sep 01, 2014 12:37 pm
by MarioG
Ademar;
sería así:

Code: Select all

CREATE TABLE test (
    id         INT NOT NULL,
    last_name  CHAR(30) NOT NULL,
    first_name CHAR(30) NOT NULL,
    PRIMARY KEY (id),
    INDEX name (last_name,first_name)
Lo saque de la ayuda de MySQL
http://dev.mysql.com/doc/refman/5.1/en/ ... dexes.html

No encuentro en MariaDB la página de ayuda... alguien sabe donde encontrar su help?

Re: Busqueda en xBrowse con QSeek de Dolphin

Posted: Mon Sep 01, 2014 5:42 pm
by acuellar
Gracias Mario

Ya hice lo que e indicas pero no funciona para la búsqueda incremental en el xBrowse, sólo puedo buscar por el nombre y no deja escribir el apellido.

Lo que haré es grabar el nombre completo en un nuevo campo, claro que la base crece ya que necesito el nombre y los apellidos por separados.

Saludos,

Adhemar

Re: Busqueda en xBrowse con QSeek de Dolphin

Posted: Mon Sep 01, 2014 8:01 pm
by sysctrl2
Mas que busqueda incremental en mi sistema
busca lo que contiene NOMBRE,
creo es mas comodo para el USUARIO.
Image
si te sirve me avisas,
saludos..

Re: Busqueda en xBrowse con QSeek de Dolphin

Posted: Mon Sep 01, 2014 8:22 pm
by acuellar
Cesar

Claro que busca por el nombre sin la búsqueda querés llegar al deseado sin pulsar flechas no se puede.

Ej: MARIA CASTRO
MARIA PEREZ

Quiero llegar directamente a MARIA PEREZ escribiendo MARIA P y no puedo por son _.

Saludos,

Adhemar

Re: Busqueda en xBrowse con QSeek de Dolphin

Posted: Mon Sep 01, 2014 9:22 pm
by Marcelo Via Giglio
Adhemar,

en una DB SQL, no puedes hacer la busqueda de esa manera, podría hacer algo así

select * from pesornas where trim( nombres ) + ' ' + (apellidos) like consulta

donde consulta := strtran( alltrim(cosnulta), ' ', '%' ) + '%'

dependiendo la DB trim( nombres ) + ' ' + (apellidos) pude formarse de manera diferente, por ejemplo en Oracle para concatenar string se usa ||, idea es que si buscas 'MARIA PEREZ' la consulta se formaria MARIA%P% , entonces si tienes un registro nombre=MARIA y apellidos=PEREZ , con esto podrías ubicarlo.

Puede ser mas complejo, pero lo puedes componer con OR y AND en función como tengas almacenada la información, pudes alternar los ordenes por si se busca por PEREZ MARIA...

Saludos

Marcelo

Re: Busqueda en xBrowse con QSeek de Dolphin

Posted: Mon Sep 01, 2014 9:34 pm
by sysctrl2
Athemar creo que tu respuesta la tiene el propio MySql con la funcion concat_ws

SELECT concat_ws(' ', nombre, paterno, materno) as nombre_largo FROM clientes

se crea una consulta solo con la columna: NOMBRE_LARGO

saludos.

Re: Busqueda en xBrowse con QSeek de Dolphin

Posted: Mon Sep 01, 2014 9:57 pm
by acuellar
Distinguidos

La cosa es que hay que aplicarlo al Qseek para que haga la búsqueda.
Mis columnas son estas

Code: Select all

oCol:=oBrw:AddCol()
   oCol:bStrData  := { || EMPL:CODIGO }
   oCol:nHeadStrAlign := AL_CENTER
   oCol:cHeader:= "COD."
   oCol:nWidth:=30
   oCol:cSortOrder := "CODIGO"
   oCol:bLClickHeader:= {|| oBrw:Gotop() }
    
   oCol:=oBrw:AddCol()
   oCol:bStrData  := { || Alltrim(NOMBRE)+" "+APELLIDOS }
   oCol:nHeadStrAlign := AL_CENTER
   oCol:cHeader   := "NOMBRE Y APELLIDOS"
   oCol:nWidth:=223
   oCol:cSortOrder := "NOMBRE"
   oCol:bLClickHeader:= {|| oBrw:Gotop() }
 
La búsqueda por CODIGO funciona perfecto, por nombre sólo puedo buscar el nombre y el no apellidos.

Gracias por la ayuda.

Saludos,

Adhemar

Re: Busqueda en xBrowse con QSeek de Dolphin

Posted: Tue Sep 02, 2014 1:14 am
by MarioG
Adhemar;
En mi opinión no es posible porque xBrowse busca por una XX columna que se corresponde con un campo (o columna para SQL).
Vos, en realidad, estas juntando 2 campos en una columna. No va a funcionar porque no es la filosofía de xBrowse (es lo que deduzco).
Para hacer lo que queres, quizás deberias estudiar si te conviene que apellido/s y nombre/s esten en un solo campo. O qizas, mantener _ y crear un tercero con Ape y Nom que sirva para la busqueda... (jajajaja, esto es muy loco)

Re: Busqueda en xBrowse con QSeek de Dolphin

Posted: Tue Sep 02, 2014 10:01 am
by acuellar
Mario

Así es he comprobado que con MySQL/MariaDB no se puede.

He creado otro campo donde tengo el nombre completo y así funciona.

Lo que me queda pendiente la función Qseek es que luego de hacer una búsqueda y pulso la tecla HOME no vacía lo escrito.

Gracias por la ayuda.

Saludos,

Adhemar

Re: Busqueda en xBrowse con QSeek de Dolphin

Posted: Tue Sep 02, 2014 5:07 pm
by sysctrl2
qseek busca en el array,

porque no buscar directamente en el QUERY ?

y después de buscar en el query,

refrescar el xbrw.

saludos..

Re: Busqueda en xBrowse con QSeek de Dolphin

Posted: Tue Sep 02, 2014 6:37 pm
by acuellar
Cesar
Lo del HOME ya lo solucioné con:

Code: Select all

 oBrw:bChange:={||  If(oQry:RecNo()=1,(xSeek:="",oSay:Refresh()), )
 
La verdad que no se como hacer la búsqueda directamente en el QUERY
Estoy aprendiendo el mundo de SQL con Dolphin y MariaDB.

Tengo otra pregunta
Me parece que _ DATE no se pueden guardar vacios, o hay forma de hacerlo?

Gracias por la ayuda

Saludos,

Adhemar

Re: Busqueda en xBrowse con QSeek de Dolphin

Posted: Tue Sep 02, 2014 6:53 pm
by sysctrl2
en el ADMIN DE MYSQL,
modifica el campo,
a que acepte valores NULOS.
cQry += "fecha_compra date NULL, "

a mi me funciona la búsqueda incremental de la siguiente forma
por cierto, es una función que me la paso el colega PACO HORTA y yo la modifique a mis necesidades.

se puede mejorar,, pero no he tenido tiempo de meterle código jeje.

Code: Select all

@ 10,10 SAY oSay PROMPT cBusca OF oDlg SIZE 200,12 PIXEL ;
  COLOR CLR_HRED,CLR_YELLOW BORDER 


   oBrw:bKeyDown := { |nKey| IF( nKey == VK_RETURN,(lOk:=.T.,oDlg:End()),;
  IF( nKey<>13, ( SeekProd(nKey,@oQry,LOWER(cTmp),"nombre",oBrw,@cBusca,,,@lKeyboard,oSelf:oCon),oSay:Refresh() ),)) }


*---------------------------------------
* FUNCION: SeekProd
* Descripcion: Busqueda Incremental
* Fecha: 22/08/2013
*---------------------------------------
static FUNCTION SeekProd(nKey,oQry2,oTabla,oOrden,oLbx,cbusca,cSelect,cWhere,lKeyboard,oCon)
  Local cQuery,campo
  
  DEFAULT cSelect := "*",;
  cWhere := ""

  cSelect := "grupo,alterno,nombre,direccion,colonia,localidad,telefono"

  IF nKey == 91
    IF !lKeyboard
      oLbx:Keydown( VK_BACK )
      lKeyboard := .t.
    ENDIF
    oLbx:Refresh(.T.)
    oLbx:SetFocus()
    RETURN NIL
  ENDIF

  MsgBeep()

  IF nKey=8
     cbusca:= SubStr(cbusca,1,Len(cbusca)-1)
    cQry := "select " + cSelect
    cQry += " from "  + oTabla
    cQry += " where " + oOrden
    cQry += " like '%" + cstr2( cBusca ) + "%'"
    cQry += " ORDER by " + oOrden

    oQry := oCon:Query( cQry )
    oLbx:SetDolphin( oQry )
    oQry:Refresh()
    oQry:GoTop()
  ELSE
    If nKey=190
      cbusca :=cbusca + "."
    ElseIF nKey = 192 .OR. nKey = 164 .OR. nKey = 165
      cbusca := cbusca + "Ñ"
    Else
      // ? cBusca,nKey, chr( nKey )

      cbusca := cbusca + Upper(chr(nkey))
    Endif

    IF Empty(cWhere)
    
      cQry := "select " + cSelect
      cQry += " from "  + oTabla
      cQry += " where " + oOrden
      cQry += " like '%" + cstr2( cBusca ) + "%'"
      cQry += " ORDER by " + oOrden 

    ELSE
      
      cQry := "SELECT "+ cSelect
      cQry += " FROM "+oTabla
      cQry += " " + cWhere + " AND "+oOrden
      cQry += " like '%" + cstr2( cBusca ) + "%'"
      cQry += " ORDER by " + oOrden

    ENDIF //72
    
    oQry := oCon:Query( cQry )
    oLbx:SetDolphin( oQry )

    oQry:Refresh()
    oQry:GoTop()
  ENDIF
  oLbx:Refresh(.T.)
  oLbx:SetFocus()

RETURN NIL
SALUDOS.