Super seleção de dados com ordenação dos registros

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Super seleção de dados com ordenação dos registros

Mensagem por rochinha »

Amiguinhos

Aproveitando o tópico sobre indices CDX coloquei aqui uma função muito util para filtragem de grande bases de dados para um arquivo temporário com opção de organização.

Analise o exemplo que pode ser compilado em Clipper puro.

Código exemplo:

Código: Selecionar todos

#include "common.ch"
#include "inkey.ch"
#include "fivewin.ch"

/* **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
#include "selector.ch"

/*
static clientes := {}, nRegiao
function main
   SET DEFAULT TO D:\CLEVER\FATALL
   USE CLIENTES NEW
   USE FORNEC NEW
   @ clientes SELECT clientes->nome, clientes->endereco, clientes->bairro, clientes->estado ;
              FROM clientes ;
              FOR clientes->estado='SP' ;
              TO tempo1
              BROWSE()
   @ clientes SELECT clientes->nome, clientes->endereco, clientes->bairro, clientes->estado ;
              FROM clientes ;
              FOR clientes->estado='CE' ;
              TO tempo2
              BROWSE()
   @ clientes SELECT clientes->regiao ;
              FROM clientes ; //              INDEX ON regiao+dtoc(datacad)
              TO tempo3 ;
              SUMMARY nRegiao
              BROWSE()
   CLOSE DATA
   return
   */

/* **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
Procedure SELECTOR(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, ;
   Arg9, Arg10, Arg11, Arg12)

   Local Local1, Local2, Local3, Local4, Local5, Local6, Local7, ;
      Local8, Local9, Local10, Local11, Local12, Local13, Local14, ;
      Local15, Local16, Local17, Local18, Local19, Local20, Local21, ;
      Local22, Local23
   Local1:= Len(Arg1)
   Local6:= {}
   Local7:= ISARRAY(Arg3)
   Local14:= {}
   Local15:= .F.
   Local17:= ""
   Local19:= !(ISNIL(Arg10))
   If recco()=0
      msgrun('Arquivo vazio ou area sem uso','Selector Error')
      //return
   EndIf
   If (ISNIL(Arg2))
      Local10:= Select()
   Else
      If (ISNUMBER(Arg2))
         Local10:= Arg2
      ElseIf (ISCHARACTER(Arg2))
         Local10:= Select(Arg2)
      EndIf
      Select (Local10)
   EndIf
   If (Local7)
      Local11:= Select(Arg3[1])
   EndIf
   If (ISNIL(Arg7))
      Arg7:= "TEMP.DBF"
      Default Arg8 To "temp"
   ElseIf (ISNIL(Arg8))
      Arg8:= SubStr(Arg8:= SubStr(Arg7, rat("\", Arg7) + 1), 1, ;
         At(".", Arg8 + ".") - 1)
   EndIf
   Default Local16 To IIf((Local8:= rat(".", Arg7)) > rat("\", ;
      Arg7), SubStr(Arg7, 1, Local8 - 1), Arg7) + ".NTX"
   Local23:= RecNo()
   Goto LastRec() + 1
   If (Local7)
      (Local11)->(dbGoto(LastRec() + 1))
   EndIf
   For Local9:= 1 To Local1
      Local2:= eval(Arg1[Local9][1])
      Local4:= ValType(Local2)
      Local3:= Transform(Local2, "")
      Local5:= Len(Local3)
      AAdd(Local6, {IIf((Local8:= At("->", Arg1[Local9][2])) == 0, ;
         Arg1[Local9][2], SubStr(Arg1[Local9][2], Local8 + 2)), ;
         Local4, IIf(Arg1[Local9][3] != Nil, Arg1[Local9][3], ;
         IIf(Local4 == "D", 8, Local5)), IIf(Arg1[Local9][4] != Nil, ;
         Arg1[Local9][4], IIf(Local4 == "N" .AND. (Local8:= At(".", ;
         Local3)) > 0, Local5 - Local8, 0))})
      If (Arg1[Local9][5] == "G")
         If (!Local15)
            Local15:= .T.
         Else
            Local17:= Local17 + "+"
         EndIf
         Do Case
         Case Local4 == "C"
            Local17:= Local17 + Local6[Local9][1]
         Case Local4 == "N"
            Local17:= Local17 + ("Str(" + Local6[Local9][1] + ")")
         Case Local4 == "D"
            Local17:= Local17 + ("DToS(" + Local6[Local9][1] + ")")
         Case Local4 == "L"
            Local17:= Local17 + ("Iif(" + Local6[Local9][1] + ;
               [,"1","0")])
         EndCase
         AAdd(Local14, Arg1[Local9][1])
      ElseIf (Arg1[Local9][6] .AND. Local19 .AND. !Arg9)
         AAdd(Arg10, 0)
      EndIf
   Next
   Goto Local23
   If (Arg9)
      Local12:= Select(Arg8)
   Else
      dbcreate(Arg7, Local6)
      dbUseArea(.T., Nil, Arg7, Arg8, .F.)
      Local12:= Select()
      If (Local15)
         dbCreateIndex(Local16, Local17, &("{||" + Local17 + "}"))
      EndIf
      Select (Local10)
   EndIf
   If (!Arg6)
      Goto Top
   EndIf
   If (Local7)
      Do While (!EOF() .AND. !(Local11)->(dbSeek(Local13:= ;
            (Local10)->(eval(Arg3[2])), .F.)))
         dbSkip()
      EndDo
   EndIf
   Do While (!EOF() .AND. (ISNIL(Arg5) .OR. eval(Arg5)))
      If (ISBLOCK(Arg11))
         eval(Arg11)
      EndIf
      If (ISNIL(Arg4) .OR. eval(Arg4))
         Local18:= .F.
         If ((Local21:= "", aeval(Local14, { |_1| Local21:= Local21 ;
               + tostring(eval(_1)) }), !Local15 .OR. ;
               !(Local12)->(dbSeek(Local21, .F.))))
            (Local12)->(dbAppend())
            Local18:= .T.
         EndIf
         Local20:= 0
         For Local9:= 1 To Local1
            If (Arg1[Local9][6])
               Local20++
            EndIf
            If (!Local15 .OR. Local18 .OR. Arg1[Local9][5] $ "TA")
               Local2:= eval(Arg1[Local9][1])
               If (Arg1[Local9][5] == "T")
                  (Local12)->(fieldput(Local9, fieldget(Local9) + ;
                     Local2))
               ElseIf (Arg1[Local9][5] == "A" .AND. !Local18)
                  (Local12)->(fieldput(Local9, (fieldget(Local9) + ;
                     Local2) / 2))
               Else
                  (Local12)->(fieldput(Local9, Local2))
               EndIf
               If (Arg1[Local9][6] .AND. Local19)
                  Arg10[Local20]:= Arg10[Local20] + Local2
               EndIf
            EndIf
         Next
      EndIf
      //If (((Local11)->(dbSkip()), !Local7 .OR. (Local11)->(EOF() .OR. !(Local13 == eval(Arg3[3])))))
         dbSkip()
         If (Local7)
            Do While (!EOF() .AND. !(Local11)->(dbSeek(Local13:= ;
                  (Local10)->(eval(Arg3[2])), .F.)))
               dbSkip()
            EndDo
         EndIf
      //EndIf
   EndDo
   Select (Local12)
   Goto Top
   Return

Static Function TOSTRING(Arg1)
   Local Local1
   Local1:= ValType(Arg1)
   If (Local1 == "N")
      Arg1:= Str(Arg1)
   ElseIf (Local1 == "D")
      Arg1:= DToS(Arg1)
   ElseIf (Local1 == "L")
      Arg1:= IIf(Arg1, "1", "0")
   EndIf
   Return Arg1
Codigo do arquivo .CH:

Código: Selecionar todos

/***
* Selector.ch
*
*/

#xcommand @ <array> SELECT [<clauses,...>] ;
          => <array> := {} ;
           ; @ <array> SELECT , [ <clauses> ]

#xcommand @ <array> SELECT ;
          [FROM <from>] ;
          [OTM <otm> SEEK <seek> EQUAL <equal>] ;
          [FOR <for>] ;
          [WHILE <while>] ;
          [<rest:REST>] ;
          [TO <(file)>] ;
          [ALIAS <alias>] ;
          [<add:ADDITIVE> [IF <condition>]] ;
          [SUMMARY <summary>] ;
          [EVAL <block>] ;
          => Selector(<array>, <(from)>, [ { <(otm)>, <{seek}>, <{equal}> } ], ;
                      <{for}>, <{while}>, <.rest.>, ;
                      <(file)>, <(alias)>, <.add.> [.and. <condition>], <summary>, ;
                      <{block}>)

// @ SELECT <field> ...
#xcommand @ <array> SELECT , <field> [<clauses,...>] ;
          => aAdd(<array>, { <{field}>, <"field">, , , 'X', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> ...
#xcommand @ <array> SELECT , <expr> AS <name> [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, , , 'X', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> LENGHT <lenght> DEC <dec> ...
#xcommand @ <array> SELECT , <expr> AS <name> LENGHT <lenght> DEC <dec> [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, <lenght>, <dec>, 'X', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <field> GROUP ...
#xcommand @ <array> SELECT , <field> GROUP [<clauses,...>] ;
          => aAdd(<array>, { <{field}>, <"field">, , , 'G', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> GROUP ...
#xcommand @ <array> SELECT , <expr> AS <name> GROUP [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, , , 'G', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> LENGHT <lenght> DEC <dec> GROUP ...
#xcommand @ <array> SELECT , <expr> AS <name> LENGHT <lenght> DEC <dec> GROUP [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, <lenght>, <dec>, 'G', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <field> TOTAL ...
#xcommand @ <array> SELECT , <field> TOTAL [<clauses,...>] ;
          => aAdd(<array>, { <{field}>, <"field">, , , 'T', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <field> AVERAGE ...
#xcommand @ <array> SELECT , <field> AVERAGE [<clauses,...>] ;
          => aAdd(<array>, { <{field}>, <"field">, , , 'A', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> TOTAL ...
#xcommand @ <array> SELECT , <expr> AS <name> TOTAL [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, , , 'T', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> AVERAGE ...
#xcommand @ <array> SELECT , <expr> AS <name> AVERAGE [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, , , 'A', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> LENGHT <lenght> DEC <dec> TOTAL ...
#xcommand @ <array> SELECT , <expr> AS <name> LENGHT <lenght> DEC <dec> TOTAL [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, <lenght>, <dec>, 'T', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> LENGHT <lenght> DEC <dec> AVERAGE ...
#xcommand @ <array> SELECT , <expr> AS <name> LENGHT <lenght> DEC <dec> AVERAGE [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, <lenght>, <dec>, 'A', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <field> SUMMARY ...
#xcommand @ <array> SELECT , <field> SUMMARY [<clauses,...>] ;
          => aAdd(<array>, { <{field}>, <"field">, , , 'X', .T. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> SUMMARY ...
#xcommand @ <array> SELECT , <expr> AS <name> SUMMARY [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, , , 'X', .T. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> LENGHT <lenght> DEC <dec> SUMMARY ...
#xcommand @ <array> SELECT , <expr> AS <name> LENGHT <lenght> DEC <dec> SUMMARY [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, <lenght>, <dec>, 'X', .T. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <field> TOTAL SUMMARY ...
#xcommand @ <array> SELECT , <field> TOTAL SUMMARY [<clauses,...>] ;
          => aAdd(<array>, { <{field}>, <"field">, , , 'T', .T. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <field> AVERAGE SUMMARY ...
#xcommand @ <array> SELECT , <field> AVERAGE SUMMARY [<clauses,...>] ;
          => aAdd(<array>, { <{field}>, <"field">, , , 'A', .T. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> TOTAL SUMMARY ...
#xcommand @ <array> SELECT , <expr> AS <name> TOTAL SUMMARY [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, , , 'T', .T. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> AVERAGE SUMMARY ...
#xcommand @ <array> SELECT , <expr> AS <name> AVERAGE SUMMARY [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, , , 'A', .T. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> LENGHT <lenght> DEC <dec> TOTAL SUMMARY ...
#xcommand @ <array> SELECT , <expr> AS <name> LENGHT <lenght> DEC <dec> TOTAL SUMMARY [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, <lenght>, <dec>, 'T', .T. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> LENGHT <lenght> DEC <dec> AVERAGE SUMMARY ...
#xcommand @ <array> SELECT , <expr> AS <name> LENGHT <lenght> DEC <dec> AVERAGE SUMMARY [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, <lenght>, <dec>, 'A', .T. }) ;
           ; @ <array> SELECT [ <clauses> ]

#xcommand @ SELECT [<clauses,...>] ;
          => @ SelectList SELECT [ <clauses> ]

#xcommand REDEFINE SELECTOR [ <oSelec> VAR ] <nVar> ;
               [ ID <nId> ] ;
               [ ORIGIN ANGLE <nAngle1> ] ;
               [ LAST ANGLE <nAngle2> ] ;
               [ RANGE <nMin>, <nMax> ] ;
               [ MARKS <nMarks> ] ;
               [ <lExact: EXACT > ] ;
               [ <dlg: OF,WINDOW,DIALOG > <oWnd> ] ;
               [ ON CHANGE <uChange> ] ;
               [ ON THUMBPOS <uPos> ] ;
               [ <color: COLOR,COLORS > <nClrFore> [,<nClrBack> [,<nClrBtn> ] ] ] ;
               [ MESSAGE <cMsg> ] ;
               [ <update: UPDATE >  ] ;
      => ;
          [ <oSelec> := ] TSelector():Redefine( <nId>, bSETGET(<nVar>), ;
             [<nAngle1>], [<nAngle2>], ;
             <nMin>, <nMax>, <nMarks>, <.lExact.>, ;
             [<oWnd>], [\{|nVar|<uChange>\}], [\{|nVar|<uPos>\}], ;
             <cMsg>, <nClrFore>, <nClrBack>, <nClrBtn>, <.update.> )

#xcommand @ <nRow>, <nCol> SELECTOR [ <oSelec> VAR ] <nVar> ;
               [ ORIGIN ANGLE <nAngle1> ] ;
               [ LAST ANGLE <nAngle2> ] ;
               [ RANGE <nMin>, <nMax> ] ;
               [ MARKS <nMarks> ] ;
               [ <lExact: EXACT > ] ;
               [ SIZE <nWidth>, <nHeight> ] ;
               [ <lPixel: PIXEL > ] ;
               [ <dlg: OF,WINDOW,DIALOG > <oWnd> ] ;
               [ ON CHANGE <uChange> ] ;
               [ ON THUMBPOS <uPos> ] ;
               [ <color: COLOR,COLORS > <nClrFore> [,<nClrBack> [,<nClrBtn> ] ] ] ;
               [ MESSAGE <cMsg> ] ;
               [ <design: DESIGN >  ] ;
               [ <update: UPDATE >  ] ;
      => ;
          [ <oSelec> := ] TSelector():New( <nRow>, <nCol>, bSETGET(<nVar>), ;
             [<nAngle1>], [<nAngle2>], ;
             <nMin>, <nMax>, <nMarks>, <.lExact.>, ;
             [<oWnd>], [\{|nVar|<uChange>\}], [\{|nVar|<uPos>\}], ;
             <nWidth>, <nHeight>, <.lPixel.>, <cMsg>, ;
             <nClrFore>, <nClrBack>, <nClrBtn>, <.design.>, <.update.> )
@braços :?)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
deividdjs
Usuário Nível 3
Usuário Nível 3
Mensagens: 377
Registrado em: 19 Set 2006 09:39
Localização: Foz do Iguaçu / Pr

Super seleção de dados com ordenação dos registros

Mensagem por deividdjs »

bom dia Rochinha .. vc tem um exemplo de como uso essa função no tbrower do xharbour .. estou com problemas de lentidão em filtros ...

Abraço.;
Windows 11 + Harbour 3.2 + MINGW64 gcc 14.1.0 + Visual Lib + GTWVG + LETODBF WINDOWNS/LINUX
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Super seleção de dados com ordenação dos registros

Mensagem por rochinha »

Amiguinhos,

deividdjs
Use este método:

Código: Selecionar todos

           // Variaveis temporarias
           M->NUM_TEMP := STRZERO(RANDOM(9999),4)
           M->DBF_TEMP := lower(cPathDados)+"CO"+M->NUM_TEMP+".DB$"
           M->NTX_TEMP := cPathDados+"CO"+M->NUM_TEMP+".CD$"

           // tabela de onde vou puxar e filtrar os dados que necessito
           dbSelectArea("contas")
           OrdSetFocus(10)

           // Comando de seleção de campos e filtro de seleção
           @ dados SELECT idpedido,idboleto,idoperador,descricao,cobranca,documento,data,areceber,valor,controle,flag ;
                   FROM contas FOR data >= M->DT_INICIO .and. data <= M->DT_FINAL TO (DBF_TEMP)

           IF .NOT. FILE(DBF_TEMP)
               MsgStop( "Arquivo temporario "+(DBF_TEMP)+" nao foi criado." )
               return .t.
           ENDIF

           // Nova tabela criada com o range filtrado
           USE (DBF_TEMP)

           // Nova indexação dos dados filtrados
           INDEX ON data TO (NTX_TEMP)
           SET INDEX TO (NTX_TEMP)

           // Abrir o browse na area atual
           tBrowse( ... )
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Super seleção de dados com ordenação dos registros

Mensagem por rochinha »

Amiguinhos,

Trecho mais complexo de exemplo.

Código: Selecionar todos

     // Variaveis temporarias
     M->NUM_TEMP := STRZERO(RANDOM(9999),4)
     M->DBF_TEMP := cPath+cOnde+"\PN"+M->NUM_TEMP+".DB$"
     M->NTX_TEMP := cPath+cOnde+"\PN"+M->NUM_TEMP+".CD$"

     // tabela de onde vou puxar e filtrar os dados que necessito
     dbSelectArea("estoque")
     dbSelectArea(3)
     
     filtrados := {}
     // Usar este método pelo fato do comando ter limites de campos
     aAdd(filtrados,{ {||idlinha}   , "idlinha"   ,,,"X",.F. })
     aAdd(filtrados,{ {||descprolin}, "descprolin",,,"X",.F. })
     aAdd(filtrados,{ {||iditem}    , "iditem"    ,,,"X",.F. })
     aAdd(filtrados,{ {||resumido}  , "resumido"  ,,,"X",.F. })
     aAdd(filtrados,{ {||descricao} , "descricao" ,,,"X",.F. })
     aAdd(filtrados,{ {||quantidade}, "quantidade",,,"X",.F. })
     aAdd(filtrados,{ {||unitario}  , "unitario"  ,,,"X",.F. })
     aAdd(filtrados,{ {||valorvenda}, "valorvenda",,,"X",.F. })
     aAdd(filtrados,{ {||minimo}    , "minimo"    ,,,"X",.F. })
     aAdd(filtrados,{ {||pp}        , "pp"        ,,,"X",.F. })
     aAdd(filtrados,{ {||icms}      , "icms"      ,,,"X",.F. })
     aAdd(filtrados,{ {||ipi}       , "ipi"       ,,,"X",.F. })
     aAdd(filtrados,{ {||promocao}  , "promocao"  ,,,"X",.F. })
     aAdd(filtrados,{ {||malaok}    , "malaok"    ,,,"X",.F. })
     aAdd(filtrados,{ {||interno}   , "interno"   ,,,"X",.F. })
     aAdd(filtrados,{ {||vendavel}  , "vendavel"  ,,,"X",.F. })
     aAdd(filtrados,{ {||promocaoVL}, "promocaoVL",,,"X",.F. })
     aAdd(filtrados,{ {||promocaoDT}, "promocaoDT",,,"X",.F. })
     aAdd(filtrados,{ {||mascara}   , "mascara"   ,,,"X",.F. })
     aAdd(filtrados,{ {||medida}    , "medida"    ,,,"X",.F. }) 
     aAdd(filtrados,{ {||ncmfiscal} , "ncmfiscal" ,,,"X",.F. })
     aAdd(filtrados,{ {||gm}        , "gm"        ,,,"X",.F. })

     Selector(filtrados,"estoque",,,,.F.,(DBF_TEMP),,.F. ,,)
     dbGoTop()

     // Filtragens diversas
     M->FILTRO := "!deleted()"
     M->FILTRO := M->FILTRO + IIF(lTodos ,""," .AND. posicao->IDLINHA="+STRZERO(M->IDLINHA,3))
     do case
        case cPosicao = "Todos os produtos"
        case cPosicao = "Somente Vendaveis"
             M->FILTRO := M->FILTRO + " .AND. VENDAVEL='S'"
        case cPosicao = "Somente Internos"
             M->FILTRO := M->FILTRO + " .AND. INTERNO='S'"
        case cPosicao = "Somente Externos"
             M->FILTRO := M->FILTRO + " .AND. INTERNO#'S'"
        case cPosicao = "Quantidade zerada/negativa"
             M->FILTRO := M->FILTRO + " .AND. posicao->QUANTIDADE<=0"
        case cPosicao = "Quantidade maior que zero"
             M->FILTRO := M->FILTRO + " .AND. posicao->QUANTIDADE>0"
        case cPosicao = "Abaixo do Ponto de Pedido e Acima do Minimo"
             M->FILTRO := M->FILTRO + " .AND. posicao->QUANTIDADE<posicao->PP .AND. posicao->QUANTIDADE>posicao->MINIMO"
        case cPosicao = "Abaixo do Ponto de Pedido"
             M->FILTRO := M->FILTRO + " .AND. posicao->QUANTIDADE<posicao->PP"
        case cPosicao = "Abaixo do Minimo"
             M->FILTRO := M->FILTRO + " .AND. posicao->QUANTIDADE<posicao->MINIMO"
        case cPosicao = "Em promocao"
             M->FILTRO := M->FILTRO + " .AND. posicao->PROMOCAO#' '"
        case cPosicao = "Somente com N.C.M."
             M->FILTRO := M->FILTRO + " .AND. !empty(posicao->NCMFISCAL)"
        case cPosicao = "Somente com E.A.N."
             M->FILTRO := M->FILTRO + " .AND. (substr(posicao->resumido,1,3)='789'.and.len(posicao->resumido)=13)"
     endcase

     // Usando as filtragens diversas sobre os dados selecionados
     dbSetFilter( {|| &(FILTRO)}, "&(FILTRO)" )
     dbGoTop()

     // Abrir o browse na area atual
     tBrowse( ... )           
Parece complexo mas foi o meio que me auxiliou onde o SetScope() não supriu. Com SetScope() você filtra dados pelos indices diferentemente do Set Filter que filtra os dados, mas o setScope() atua pela chave, já que o indice é uma tabela acessória ao dbf que contém apenas o campo ordenado.

Eu uso este método porque na época do NTX nós usamos muito uma biblioteca chamada SUBNTX para Clipper 5.2 e Clipper 5.3, este último já nos presenteava com SET SCOPE e CDX.

Tudo vai depender do que se necessita e qual a vontade de ver como o código foi formado para obter o resultado.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Super seleção de dados com ordenação dos registros

Mensagem por alxsts »

Olá!
rochinha escreveu:Parece complexo
Eu achei.

Se é para criar um temporário e depois criar índice nele, eu usaria o comando SORT do próprio Harbour. Cria o temporário já ordenado...

Código: Selecionar todos

// The example creates a physically sorted database.

   PROCEDURE Main
      USE Customer

      SORT TO Cust01 ON Lastname, Firstname FOR < especificar os filtros aqui >

      USE Cust01

      Browse()

      CLOSE Cust01
   RETURN
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Super seleção de dados com ordenação dos registros

Mensagem por rochinha »

Amiguinhos,

Olha ai que maravilha. Mas acho que o SORT já vinha do dBase II, mas nunca usei e se usei acho que demorava tanto quanto SET FILTER, na época que resolvi esquecer.

Farei alguns testes em minha aplicação pra ver se posso vir a usá-lo.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Super seleção de dados com ordenação dos registros

Mensagem por alxsts »

Olá!

Não me lembro agora onde li, se é no Harbour 3.2 ou 3.4, que a funcionalidade do comando SORT foi totalmente reescrita e otimizada. Teria que olhar nos docs das versões.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Super seleção de dados com ordenação dos registros

Mensagem por JoséQuintas »

Sei lá.....
O post iniciou em 2006....
Naquela época muita gente já estava ultrapassada, e só conhecia NTX.

Precisa avisar o pessoal que não estamos mais em 1990, em 2006 isso já estava ultrapassado, e agora estamos em 2022.
Só prestar atenção na sintaxe de INDEX ON.

A não ser que isso seja pra ser usado com Clipper Summer 86..... acho que era esse o nome.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
deividdjs
Usuário Nível 3
Usuário Nível 3
Mensagens: 377
Registrado em: 19 Set 2006 09:39
Localização: Foz do Iguaçu / Pr

Super seleção de dados com ordenação dos registros

Mensagem por deividdjs »

tenho programa em xharbour ainda e estou tentando melhorar minha pesquisa em rede ....e vi este poste kkkkkk
Windows 11 + Harbour 3.2 + MINGW64 gcc 14.1.0 + Visual Lib + GTWVG + LETODBF WINDOWNS/LINUX
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Super seleção de dados com ordenação dos registros

Mensagem por rochinha »

Amiguinhos,

Eu uso até hoje e a velocidade de resposta é enorme. INDEX ON pode até ter mudado, se não precise travar o .DBF em tempo de execução com tabela aberta em outra estação então pode ser usado também.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Super seleção de dados com ordenação dos registros

Mensagem por JoséQuintas »

deividdjs escreveu:tenho programa em xharbour ainda e estou tentando melhorar minha pesquisa em rede ....e vi este poste kkkkkk
Depende muito do tipo de pesquisa, e com certeza NTX fica mais lento em rede.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
paiva
Usuário Nível 3
Usuário Nível 3
Mensagens: 300
Registrado em: 04 Ago 2005 10:28

Super seleção de dados com ordenação dos registros

Mensagem por paiva »

pegando o bonde andando...

se usa o xhb comercial

de longe o mais rápido e minha versão é BEM antiga

REQUEST RMDBFCDX // Utilize essa linha para utilizar a rotina para filtros rapidos
RddSetDefault("RMDBFCDX") // Utilize esse linha para definir CDX como padrao usando fitros otimizados


a tempos atrás ao fazer consultas em tabelas GRANDES, gravo arquivo temporário e depois abro o dbselect/browser
na época era inviável set filter Lembro que tipo 10.000 registros de base eram LIDOS, filtrados e gravado no temporario para exibicao
era INSTANTANEO.

atualmente uso MUITO index ON com clausulas FOR o que torna BEM rápido tambem geração de relatórios etc.
Responder