Página 1 de 1

Como pesquisar dados em matriz parecido a OrdWildSeek

Enviado: 30 Set 2016 10:31
por gilbertosilverio
Ola amigos,

Existe alguma função parecida com a OrdWildSeek, para fazer a pesquisa de um treco do item em um matriz.

Uso o ASCAN( aProdutos, { |x| ( alltrim(cTXT) $ x[2]) } ), mais ele me posiciona no sempre primeiro item que corresponde a pesquisa, como faço pra ele listar todas as coincidências que existem dentro da matriz.

Grato.

Como pesquisar dados em matriz parecido a OrdWildSeek

Enviado: 30 Set 2016 11:23
por Toledo
Amigo, tente o seguinte:

Código: Selecionar todos

n_pos_ini:=1  //declarar no inicio do PRG
...
n_pos:=ASCAN( aProdutos, { |x| ( alltrim(cTXT) $ x[2]) }, n_Pos_ini )
n_pos_ini:=n_pos+1
Abraços,

Como pesquisar dados em matriz parecido a OrdWildSeek

Enviado: 30 Set 2016 12:33
por gilbertosilverio
Toledo,

Obrigado pela ajuda.

Veja como ficou... não e aquela maravilha de codigo, mais funciona... rsrsrs

Código: Selecionar todos


FUNCTION PESQUISA_TRECHO_01()
    LOCAL aMATA:={}, DT1, oBrowse31, nPOS:=0, C:=1, nPOS_INI:=0, nPOS_A:=0

    PRIVATE cTXT:=SPAC(20)

    MSGGETTEXTO( [Pesquisar item em estoque], [Entre trecho da pesquisa], @cTXT )

    IF cTXT <> SPAC(20)
       DT1:=ALLTRIM(@cTXT)
       oBar:=HProgressBar():NewBox( "Pesquisando : "+lTrim(strZERO(C,6))+" De "+lTrim(strZERO(LEN(aProdutos),6))+" Registro(s)",,,350,,LEN(aProdutos))
       DO WHILE .T.
          nPOS := ASCAN( aProdutos, { |x| ( alltrim(DT1) $ x[2]) }, C, LEN(aProdutos)-C )
          IF nPOS > 0
             nPOS_A := ASCAN( aMATA, { |x| ( STRZERO(nPOS,6) $ x[5]) } )
             IF nPOS_A = 0
                AADD ( aMATA,  { aPRODUTOS[nPOS,2], aPRODUTOS[nPOS,1], [EAN], [SALBASE], STRZERO(nPOS,6) } )
             ENDIF
          ENDIF
          IF C > LEN(aProdutos)
             oBar:CLOSE()
             EXIT
          ELSE
             C++
             oBar:Step("Pesquisando : "+lTrim(strzero(C,6))+" De "+lTrim(Strzero(len(aProdutos),6))+" Registro(s)")
          ENDIF
       ENDDO
    ELSE
       RETURN NIL
    ENDIF

    IF LEN(aMATA) = 0
       HWG_MSGSTOP([Não existem dados para esta pesquisa],[Atenção])
       RETURN NIL
    ENDIF

    ASORT( aMATA, 1, , { |X,Y| X[1] < Y[1] } )

    INIT DIALOG oDlg TITLE "Resultado da pesquisa " AT 40,40 SIZE 980,560  CLIPPER ;
         FONT HFont():Add( 'Verdana',0,-13,400,,,) STYLE WS_POPUP+WS_CAPTION+WS_SYSMENU+WS_SIZEBOX

    Thisfo31 := oDlg

    @ 10, 40 SAY oLABEL5 CAPTION [Itens localizado]  TRANSPARENT SIZE 400,19

    @ 10, 65 BROWSE oBrowse31 ARRAY SIZE 960,440 AUTOEDIT STYLE WS_TABSTOP+WS_HSCROLL  ;
             ON CLICK { || zREC:=ThisFo31:oBrowse31:aarray[ThisFo31:oBrowse31:nCurrent, 05], HWG_ENDDIALOG()  }

    hwg_CREATEARLIST( oBrowse31, aMata )

    oBrowse31:aColumns[01]:heading  := "Descrição"
    oBrowse31:aColumns[02]:heading  := "Codigo"
    oBrowse31:aColumns[03]:heading  := "EAN"
    oBrowse31:aColumns[04]:heading  := "Sal Base"
    oBrowse31:aColumns[05]:heading  := "Registro"

    oBrowse31:aColumns[1]:nJusHead := DT_LEFT
    oBrowse31:aColumns[2]:nJusHead := DT_LEFT
    oBrowse31:aColumns[3]:nJusHead := DT_LEFT
    oBrowse31:aColumns[4]:nJusHead := DT_LEFT
    oBrowse31:aColumns[5]:nJusHead := DT_LEFT


    oBROWSE31:REFRESH()
    oBROWSE31:Setfocus()

    @ 863,513 BUTTONEX oButtonex2 CAPTION "&Sair"  SIZE 98,32 STYLE WS_TABSTOP ON CLICK {|| hwg_EndDialog()  }

    oButtonex2:Anchor := 12

   ACTIVATE DIALOG oDlg

RETURN NIL

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *>


Como pesquisar dados em matriz parecido a OrdWildSeek

Enviado: 30 Set 2016 14:16
por alxsts
Olá!

Segue um exemplo antigo, publicado na documentação do Clipper 5.2 (Norton Guides):

Código: Selecionar todos

     .  This example demonstrates scanning for multiple instances of a
        search argument after a match is found:

        LOCAL aArray := { "Tom", "Mary", "Sue",;
                           "Mary" }, nStart := 1
        //
        // Get last array element position
        nAtEnd := LEN(aArray)
        DO WHILE (nPos := ASCAN(aArray, "Mary", ;
                     nStart)) > 0
           ? nPos, aArray[nPos]
           //
           // Get new starting position and test
           // boundary condition
           IF (nStart := ++nPos) > nAtEnd
              EXIT
           ENDIF
        ENDDO

Como pesquisar dados em matriz parecido a OrdWildSeek

Enviado: 30 Set 2016 16:07
por rossine
Olá,

Baseado no exemplo do Alexandre, montei o exemplo abaixo, veja se ajuda.

Código: Selecionar todos

function main

local aArray := { "Tom", "Mary", "Sue", "Mary Test" }

cls

? "Extamente igual a <Mary>", hb_valtoexp( ArrayLocate( aArray, "Mary" ) )

? "Que contenha a string <Mary>", hb_valtoexp( ArrayLocate( aArray, "Mary", .F. ) )

? "Que contenha a string <Mary> apartir do elemento 3", hb_valtoexp( ArrayLocate( aArray, "Mary", .F., 3 ) )

? "Extamente igual a <Mary> apartir do elemento 3", hb_valtoexp( ArrayLocate( aArray, "Mary", .T., 3 ) )

return NIL

********************
function ArrayLocate( aArray, cString, lExact, nStart )
********************

local nAtEnd, nPos, aRet := { }

__DefaultNIL( @lExact, .T. )
__DefaultNIL( @nStart, 1 )

nAtEnd  := len(aArray)
cString := lower(cString)

do while ( nPos := ascan( aArray, { |aItem| iif( lExact, lower(aItem) == cString, lower(aItem) = cString ) }, nStart ) ) > 0
   aadd( aRet, { nPos, aArray[nPos] } )
   // Get new starting position and test boundary condition
   if ( nStart := ++nPos) > nAtEnd
      exit
   endif
enddo

return aRet

T+