O exemplo que coloquei acima é o usual... o que normalmente todos fazem... a minha dúvida é com relação aos índices em memória... se funcionam da mesma forma... pois estou utilizando os comando para criar os temporários e esta permanecendo apenas um único índice... segue a forma que estou fazendo...
Código: Selecionar todos
IF !CriaStr( SUBSTR( (_ADbf)->CodStr, 1, 4 ), _Nome, _AArqs[7], _AArqs[8], _AArqs[9], .T., _Caminho, .T., _Alias )
MsgMenu('Erro na criação do Arquivo '+ _Nome,{'&OK'},,"IM__ERRO",'Erro...',,,'32 ERR CAN',,,_branco_)
_ret := FALSE
EXIT
END
nIndIni := 0
IF (_ANtx)->( DBSEEK( (_ADbf)->Codigo ) )
WHILE !(_ANtx)->( EOF() ) .AND. (_ADbf)->Codigo == (_ANtx)->CodDbf
_NomeInd := ALLTRIM( (_ANtx)->Nome )
_Tag := ALLTRIM( (_ANtx)->Tag )
_Chave := ALLTRIM( (_ANtx)->Chave )
IF !NETERR() // tenta travar o arquivo para criacao do indices
_NomeIndFim := 'MEM:'+_NomeInd
IF nIndIni = 0
INDEX ON &(_Chave) TAG &(_NomeIndFim) TEMPORARY
nIndIni = 1
ELSE
INDEX ON &(_Chave) TAG &(_NomeIndFim) TEMPORARY ADDITIVE
END
IF REGLOCK( (_ANtx) )
(_ANtx)->Normal := 'S'
(_ANtx)->( DBCOMMIT() )
(_ANtx)->( DBUNLOCK() )
END
END
(_ANtx)->( DBSKIP() )
END
END
(_Alias)->(DBCLOSEAREA())
_Nome := 'MEM:'+_Nome
NETUSE( _Nome, _Alias, ONLY )
IF (_ANtx)->( DBSEEK( (_ADbf)->Codigo ) )
_NomeInd := 'MEM:'+ALLTRIM( (_ANtx)->Nome )
DBSETINDEX( _NomeInd )
END
*****************************
* Funcao.....: CriaStr()
* Finalidade.: Cria o arquivo com base na estrutura
FUNCTION CriaStr( _CodCria, _ArqCria, __Str, __StrI, __AStr, __Recria, __Caminho, __arqtemp, __alias )
// _CodCria -- Codigo para pesquisa no arq. de Estrutura
// _ArqCria -- Nome do arquivo a ser criado
// __Str -- Arquivo de Estruturas dos arquivos
// __StrI -- Arquivo de Indices da estruturas
// __AStr -- Alias da Estrutura
// __Recria -- Se cria o arquivo mesmo que existir
// __Caminho -- Onde sera criado o arquivo
LOCAL _StrDef, aChou, xOpErro
LOCAL _AbreS := .F., __CaminhoLeto
_StrDef := {}
__Recria := IIF( __Recria = NIL, .F., __Recria )
__arqtemp := IIF( __arqtemp = NIL,.F., __arqtemp )
IF EMPTY( SELECT( __AStr ) )
// Tenta abrir arquivo de (estruturas) em modo compartilhado
IF NETUSE( __Str, (__AStr), SHARE )
DBSETINDEX( __StrI )
ELSE
MsgMenu('Arq.' + __Str + ' não pode ser aberto !!! Verifique os terminais !!!',{'&OK'},,"IM__ERRO",'Erro...',,,'32 ERR CAN',,,_branco_)
RETURN( FALSE )
END
_AbreS := .T.
END
(__AStr)->( DBSEEK(_CodCria) )
WHILE (__AStr)->Codigo == _CodCria
AADD( _StrDef, { ALLTRIM((__AStr)->Nome), (__AStr)->Tipo, (__AStr)->Tamanho, (__AStr)->Decimal } )
(__AStr)->( DBSKIP() )
END
IF EMPTY( _StrDef )
RETURN( FALSE )
ELSE
IF !__arqtemp
xOpErro = 1
IF FILE(__Caminho+_ArqCria) .AND. !__Recria
xOpErro := MsgMenu('Arq.' + __Caminho +_ArqCria + ' já existe !!! Cria novamente ???',{'&Sim','&Não'},,"IM__PERGUNTA",'Atenção',,,'42 ASK',,,_branco_) = 1
END
IF xOpErro = 1
__CaminhoLeto := zLetoDB + SUBSTR(__Caminho,4,LEN(__Caminho)-3)
IF EMPTY(zLetoDB)
DBCREATE(IIF(EMPTY(zLetoDB),__Caminho,__CaminhoLeto) + _ArqCria, _StrDef )
ELSE
DBCREATE(IIF(EMPTY(zLetoDB),__Caminho,__CaminhoLeto) + _ArqCria, _StrDef, "LETO" )
END
HB_FCOMMIT()
END
ELSE
IF EMPTY(zLetoDB)
DBCREATE("MEM:"+_ArqCria,_StrDef,"SIXCDX",.T.,__alias)
ELSE
DBCREATE("MEM:"+_ArqCria,_StrDef,"LETO",.T.,__alias)
END
END
END
IIF( _AbreS, (__AStr)->( DBCLOSEAREA() ), '' )
RETURN( TRUE )
Esta criando a tabela temporária na memória e esta criando o índice, mas o que quero saber é... tenha uma tabela (de uso temporário) com vários índices, dai quando necessito de um determinado índice uso ORDSETFOCUS(2), por exemplo... ou seja, inicio o sistema, crio a tabela e os índices... dai uso quando preciso... no temporário da para fazer a mesma coisa ou tenho que criar o índice na hora que for usar... pois parece que ele cria apenas 1 índice para 1 tabela... se for assim, tenho apenas que mudar a forma de tratar isso... entro no sistema, gero os arquivos, dai a hora que for usar, populo a tabela e crio o índice que eu quiser...
Só para ficar mais claro....
Se eu fizer assim, da forma que exemplifiquei acima...
temp->(ordsetfocus(1))
alert(temp->(indexkey()) -> irá aparecer o indice 1...ok
temp->(ordsetfocus(2))
alert(temp->(indexkey()) -> irá ficar em branco...
temp->(ordsetfocus(3))
alert(temp->(indexkey()) -> irá ficar em branco...
F.Freire