Página 1 de 1

parametros index on por referencia

Enviado: 28 Mai 2014 18:25
por Minduim
boa noite;

por gentileza, existe alguma forma de passar os parametros ( unique, usefilter, descending ) do comando INDEX ON por referencia:

cUnique:= "UNIQUE"
cUseFilter:= "USEFILTER"
cDescending:= "DESCENDING"

index on xxx tag xxx to xxx cUnique cUseFilter cDescending

agradeço a colaboração;

parametros index on por referencia

Enviado: 28 Mai 2014 19:16
por Toledo
Acho meio difícil fazer isto, mas você poderia usar os comandos abaixo antes do INDEX ON:

SET UNIQUE on | OFF

SET DESCENDING on | OFF

SET FILTER TO

Abraços,

parametros index on por referencia

Enviado: 28 Mai 2014 19:20
por alxsts
Olá!

Creio não ter entendido bem a questão... de qualquer forma, para passar um parâmetro por referência em xBase, usa-se o operador apropriado: @

Código: Selecionar todos

FUNCTION Main()

   LOCAL nVal

   CLS
   
   MyFunc( @nVal )

   ? nVal

RETURN NIL
//-----------------------------------
STATIC Function MyFunc( nVal )

   FOR nVal := 1 TO 10
   NEXT
   
RETURN NIL
//-----------------------------------
Não sei qual utilidade poderia ter isso mas, você pode criar uma função ou procedure que indexe um arquivo, passando os parâmetros por referência. Desconheço o parâmetro usefilter que você menciona. Para indíces com chaves únicas para uma coluna da tabela, especifica-se com um valor lógico (lUnique := .T.) e para índices descendentes usa-se a função Descend(), após fazer o Request Descend. Forneça mais detalhes...

parametros index on por referencia

Enviado: 29 Mai 2014 08:11
por Minduim
agradeço a colaboração de todos;

estou criando uma rotina para centralizar todas as referencias de indexação dos arquivos temporários e ao passar os parametros para a rotina que executará a função de index, não estou conseguindo atribuir a função INDEX ON os parametros extras de indexação;

mas, acredito que encontrei uma solução, as funções ORDCREATE e ORDCONDSET, contem todos os parametros extras e aparentemente posso passar os valores para estas funções;

vou fazer uns testes e posto aqui o resultados;

Código: Selecionar todos

OrdCreate( <cIndexFile> , ;
          [<cIndexName>], ;
           <cIndexExpr> , ;
           <bIndexExpr> , ;
          [<lUnique>]     ) --> NIL

OrdCondSet( [<cForCondition>]  , ;
            [<bForCondition>]  , ;
            [<lAllRecords>]    , ;
            [<bWhileCondition>], ;
            [<bEval>]          , ;
            [<nInterval>]      , ;
            [<nStart>]         , ;
            [<nNext>]          , ;
            [<nRecord>]        , ;
            [<lRest>]          , ;
            [<lDescend>]       , ;
            [<reserved>]       , ;
            [<lAdditive>]      , ;
            [<lCurrent>]       , ;
            [<lCustom>]        , ;
            [<lNoOptimize>]    , ;
            [<cWhileCondition>], ;
            [<lTemporary>]     , ;
            [<lUseFilter>]     , ;
            [<lExclusive>]       ) --> lSucces

parametros index on por referencia

Enviado: 29 Mai 2014 10:02
por Minduim
agradeço a colaboração de todos;

as funções ORDCREATE e ORDCONDSET resolveram o problema;

mais um problema resolvido

observação.: o uso da função rddSetDefault() no lugar da rddName(), esta posicionado corretamente na rotina;

Código: Selecionar todos

********************************
function GER_INDE(npa)

   * npa - [1] - nome do banco de dados
   *       [2] - campos de index
   *       [3] - parametros de index (opcional)
  * nfile() - rotina que retorna um nome valido conforme parametro
   * kvetor1[114] - variavel publica com o caminho para arquivos temporarios
   * kvetor1[147] - variavel publica com a extencao do rdd default
 
   local wainde:= {}, watag, wacont, waarqu, wapara:= {}, wauniq

   for wacont:= 1 to len(npa)
      if rddSetDefault() = "DBFNTX"
         watag:= nfile("NTX")
         waarqu:= watag
      elseif rddSetDefault() = "DBFCDX"
         watag:= npa[wacont][1] + chr(64 + wacont)
         waarqu:= npa[wacont][1]
      endif
      waarqu:= kvetor1[114] + waarqu + kvetor1[147] 

      if len(npa[wacont]) > 2
         asize(wapara, 20)

         wauniq:= .F.
         if at("UNIQUE", npa[wacont][3]) > 0
            wauniq:= .T.
         endif
         if at("DESCENDING", npa[wacont][3]) > 0
            wapara[11]:= .T.
         endif
         if at("USEFILTER", npa[wacont][3]) > 0
            wapara[19]:= .T.
         endif

         while !ordCondSet( wapara )
         end
      endif

      aadd(wainde, {waarqu, watag})

      ordCreate( waarqu, watag, (npa[wacont][2]),, wauniq)
      
   next

   ordListClear()

   for wacont:= 1 to len(wainde)
      ordListAdd(wainde[wacont][1], wainde[wacont][2])
   next

   return wainde

parametros index on por referencia

Enviado: 29 Mai 2014 12:26
por alxsts
Olá!

Como suspeitei ao ler o tópico pela primeira vez, a sua necessidade não tem nada a ver com passagem de parâmetros por referência (pass by reference, operador @).

Só para ficar claro: quando se usa este operador, é passado o endereço de memória da variável referenciada, como parâmetro para a função chamada e as modificações feitas nesta variável pela função chamada refletem na função chamadora - veja exemplo que postei acima. Já no comportamento padrão das linguagens xBase (pass by val), ao invés do endereço de memória, é passada uma cópia do valor da variável e as modificações feitas nela pela função chamada nesta cópia não se refletem no valor original armazenado na função chamadora. A exceção é quando a variável é declarada pública ou privada na função chamadora.