Clipper On Line • Ver Tópico - Super seleção de dados com ordenação dos registros

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

 

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

Mensagempor rochinha » 10 Out 2006 12:57

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:
#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:
/***
* 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 fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4547
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 807 vezes
Mens.Curtidas: 246 vezes

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

Mensagempor deividdjs » 12 Jan 2022 07:42

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 + Visual Lib + GTWVG
Avatar de usuário

deividdjs
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 246
Data de registro: 19 Set 2006 09:39
Cidade/Estado: Foz do Iguaçu / Pr
Curtiu: 81 vezes
Mens.Curtidas: 8 vezes

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

Mensagempor rochinha » 12 Jan 2022 10:02

Amiguinhos,

deividdjs
Use este método:
           // 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 fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4547
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 807 vezes
Mens.Curtidas: 246 vezes

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

Mensagempor rochinha » 12 Jan 2022 10:20

Amiguinhos,

Trecho mais complexo de exemplo.
     // 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 fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4547
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 807 vezes
Mens.Curtidas: 246 vezes

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

Mensagempor alxsts » 12 Jan 2022 14:00

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...
// 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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

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

Mensagempor rochinha » 12 Jan 2022 17:22

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 fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4547
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 807 vezes
Mens.Curtidas: 246 vezes

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

Mensagempor alxsts » 12 Jan 2022 18:04

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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

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

Mensagempor JoséQuintas » 12 Jan 2022 20:31

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18151
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

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

Mensagempor deividdjs » 12 Jan 2022 23:29

tenho programa em xharbour ainda e estou tentando melhorar minha pesquisa em rede ....e vi este poste kkkkkk
Windows 11 + Harbour 3.2 + Visual Lib + GTWVG
Avatar de usuário

deividdjs
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 246
Data de registro: 19 Set 2006 09:39
Cidade/Estado: Foz do Iguaçu / Pr
Curtiu: 81 vezes
Mens.Curtidas: 8 vezes

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

Mensagempor rochinha » 12 Jan 2022 23:36

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 fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4547
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 807 vezes
Mens.Curtidas: 246 vezes

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

Mensagempor JoséQuintas » 13 Jan 2022 04:12

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18151
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

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

Mensagempor paiva » 13 Jan 2022 08:31

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.
paiva
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 257
Data de registro: 04 Ago 2005 10:28
Curtiu: 0 vez
Mens.Curtidas: 9 vezes




Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 6 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro