Busqueda en xBrowse con QSeek de Dolphin

Busqueda en xBrowse con QSeek de Dolphin

Postby acuellar » Fri Aug 29, 2014 8:29 pm

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 algunos cambios 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  Expand view  RUN

  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
Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1644
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Busqueda en xBrowse con QSeek de Dolphin

Postby acuellar » Fri Aug 29, 2014 9:30 pm

Distinguidos

Con estos cambios funciona lo de vaciar la cadena.
Almacenando la cadena en una variable.
Code: Select all  Expand view  RUN

   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
Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1644
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Busqueda en xBrowse con QSeek de Dolphin

Postby acuellar » Fri Aug 29, 2014 10:46 pm

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
Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1644
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Busqueda en xBrowse con QSeek de Dolphin

Postby MarioG » Mon Sep 01, 2014 12:37 pm

Ademar;
sería así:
Code: Select all  Expand view  RUN
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/multiple-column-indexes.html

No encuentro en MariaDB la página de ayuda... alguien sabe donde encontrar su help?
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
MarioG
 
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: Busqueda en xBrowse con QSeek de Dolphin

Postby acuellar » Mon Sep 01, 2014 5:42 pm

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
Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1644
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Busqueda en xBrowse con QSeek de Dolphin

Postby sysctrl2 » Mon Sep 01, 2014 8:01 pm

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..
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
sysctrl2
 
Posts: 1022
Joined: Mon Feb 05, 2007 7:15 pm

Re: Busqueda en xBrowse con QSeek de Dolphin

Postby acuellar » Mon Sep 01, 2014 8:22 pm

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 dos campos.

Saludos,

Adhemar
Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1644
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Busqueda en xBrowse con QSeek de Dolphin

Postby Marcelo Via Giglio » Mon Sep 01, 2014 9:22 pm

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
Marcelo Via Giglio
 
Posts: 1065
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: Busqueda en xBrowse con QSeek de Dolphin

Postby sysctrl2 » Mon Sep 01, 2014 9:34 pm

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.
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
sysctrl2
 
Posts: 1022
Joined: Mon Feb 05, 2007 7:15 pm

Re: Busqueda en xBrowse con QSeek de Dolphin

Postby acuellar » Mon Sep 01, 2014 9:57 pm

Distinguidos

La cosa es que hay que aplicarlo al Qseek para que haga la búsqueda.
Mis columnas son estas
Code: Select all  Expand view  RUN

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
Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1644
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Busqueda en xBrowse con QSeek de Dolphin

Postby MarioG » Tue Sep 02, 2014 1:14 am

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 ambos campos y crear un tercero con Ape y Nom que sirva para la busqueda... (jajajaja, esto es muy loco)
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
MarioG
 
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: Busqueda en xBrowse con QSeek de Dolphin

Postby acuellar » Tue Sep 02, 2014 10:01 am

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
Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1644
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Busqueda en xBrowse con QSeek de Dolphin

Postby sysctrl2 » Tue Sep 02, 2014 5:07 pm

qseek busca en el array,

porque no buscar directamente en el QUERY ?

y después de buscar en el query,

refrescar el xbrw.

saludos..
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
sysctrl2
 
Posts: 1022
Joined: Mon Feb 05, 2007 7:15 pm

Re: Busqueda en xBrowse con QSeek de Dolphin

Postby acuellar » Tue Sep 02, 2014 6:37 pm

Cesar
Lo del HOME ya lo solucioné con:

Code: Select all  Expand view  RUN

 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 los campo DATE no se pueden guardar vacios, o hay forma de hacerlo?

Gracias por la ayuda

Saludos,

Adhemar
Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1644
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Busqueda en xBrowse con QSeek de Dolphin

Postby sysctrl2 » Tue Sep 02, 2014 6:53 pm

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  Expand view  RUN
@ 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.
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
sysctrl2
 
Posts: 1022
Joined: Mon Feb 05, 2007 7:15 pm

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: lubin and 79 guests