Página 1 de 1

Criar indices .fpt

Enviado: 16 Out 2014 21:21
por Laudelino Scarmagnani
Olá pessoal.
Tenho uma estrutura com um campo memo. Tenho que gerar os índices desta estrutura. Como faço isso no xHabour? Para os índices normais uso:
INDEX ON STR(CDFILIAL,3)+STR(CDCLIENTE,7)+STR(NRNOTAFISC,9)+IDSERIENF+STR(NRSEQITEM,3)+;
STR(NRSEQUENC,3)+STR(CDOBSERV,3) TO ESOBS
Abraços.
Laudelino

Criar indices .fpt

Enviado: 16 Out 2014 23:02
por Itamar M. Lins Jr.
Você quer dizer CDX, porque FPT é o campo memo antigo DBT.

Código: Selecionar todos

INDEX ON STR(CDFILIAL,3)+STR(CDCLIENTE,7)+STR(NRNOTAFISC,9)+IDSERIENF+STR(NRSEQITEM,3)+;
STR(NRSEQUENC,3)+STR(CDOBSERV,3)  TAG 001 
INDEX on NOME TAG 002
INDEX on CODIGO TAG 003
Não esquecer do REQUEST "DBCDX","DBFFPT"... RDDSETDEFAULT("DBFCDX")...
Tem exemplos aqui no forum...

Saudações,
Itamar M. Lins Jr.

Criar indices .fpt

Enviado: 17 Out 2014 08:52
por Jairo Maia
Olá Laudelino,

Não é possível criar índices com campos Memo. Somente os campos com tipos: Caractere, Data, Numérico e Lógico podem ser criados índices.

Criar indices .fpt

Enviado: 17 Out 2014 19:04
por Laudelino Scarmagnani
Quando crio um campo memo em um arquivo .DBF, é criado um arquivo com o nome da estrutura.fpt. Exemplo
NFAUX.DBF. Dentro dela tenho definido o campo XML tipo MEMO.
NFAUX.CDX ->Primeiro Indice
NFAUX1.CDX -> Segundo Indice.
NFAUX.FPT é criado pelo sistema. Se eu deletar este arquivo por algum motivo, da erro ao setar o arquivo.
Não sei como cria-lo novamente.
Laudelino

Criar indices .fpt

Enviado: 17 Out 2014 19:58
por Itamar M. Lins Jr.
Você não pode deletar um arquivo seja FPT ou DBT, quando você faz isso, não consegue mais abrir o arquivo DBF é normal.
Se deseja apagar um arquivo FPT ou DBT, modifique a estrutura do DBF, apague a campo memo do DBF na estrutura via modi struct...
E ainda está errado sua forma de trabalhar com CDX.
Não fica vários indices CDX, apenas um CDX para cada DBF, e dentro do CDX que é uma sacola (BAG) ficam todos os indices.

Saudações,
Itamar M. Lins Jr.

Criar indices .fpt

Enviado: 17 Out 2014 22:21
por JoséQuintas
Tem que lembrar de duas coisas:
- Existe um limite para o tamanho da chave de índice
- A chave do índice precisa tamanho fixo. Ao usar campo memo, isso vai deixar o índice "doidão" e corrompido.

Então pra indexar por um campo memo, teria que fixar um tamanho.

Código: Selecionar todos

INDEX ON PAD( campomemo, 200 ) TO INDEX

Criar indices .fpt

Enviado: 18 Out 2014 01:39
por Jairo Maia
Está errado também o raciocínio. Arquivos FPT ou DBT não são índices, mas sim arquivos literais. Quando você grava o XML no campo memo, esse XML não está no DBF mas sim no FPT. É possível recriar um arquivo FPT vazio para ter acesso ao DBF, mas o conteúdo do campo memo se perdeu ao apagar o arquivo.

Criar indices .fpt

Enviado: 18 Out 2014 10:54
por JoséQuintas
Ok, vi a primeira mensagem, ele cita sobre indexar por um campo memo.
Em outra mensagem ele diz sobre ter perdido do FPT.

Se for pra indexar, é o que já mencionei.

Se for pra recuperar o FPT:
O conteúdo se perdeu, não há mais como recuperá-lo.
A única opção é criar uma estrutura com o memo, e copiar o FPT vazio pra ocupar o lugar do perdido.

Criar indices .fpt

Enviado: 19 Out 2014 10:55
por Jairo Maia
Olá José,

Minha mensagem anterior onde eu disse: "Está errado também o raciocínio", deu a impressão que eu estava me referindo a sua. Mas na verdade eu estava dando continuidade a uma citação do Itamar mais acima, o correto teria sido colocar essa citação ficando assim:
Itamar M. Lins Jr. escreveu:E ainda está errado sua forma de trabalhar com CDX.
Está errado também o raciocínio. [restante da msg].

Já quanto também minha interpretação na primeira mensagem foi que ele pretendia criar um índice usando um campo Memo, e eu disse que não era possível. Porém, realmente é sim usando a função PAD(). Aprendi mais uma, valeu a dica:

Código: Selecionar todos

REQUEST DBFCDX

PROC REC_estr     // estrutura do arquivo RECADOS
 Local aEstr := {;
                {"codcli"  ,"N",  5, 0},;
                {"nomecli" ,"C", 40, 0},;
                {"obs"     ,"M", 10, 0};
                }

 RddSetDefault( "DBFCDX" )

 DBCreate( "TestMemo", aEstr )
 Use TestMemo Shared New
 
 Append Blank
 Replace Codcli With 3
 Replace nomecli With "Cliente 1"
 Replace obs With Repl( "3 Testar index em campo Memo - ", 20 )
 
 Append Blank
 Replace Codcli With 2
 Replace nomecli With "Cliente 2"
 Replace obs With Repl( "2 Testar index em campo Memo - ", 20 )
 
 Append Blank
 Replace Codcli With 1
 Replace nomecli With "Cliente 3"
 Replace obs With Repl( "1 Testar index em campo Memo - ", 20 )
 
 DbCommit()
 
 Index On codcli Tag Codigo To TestMemo
 Index On nomecli Tag NomeCli To TestMemo
 Index On Pad( obs, 20 ) Tag Obs To TestMemo
 
 Set Order To Tag Codigo
 Browse()

 Set Order To Tag NomeCli
 Go Top
 Browse()

 Set Order To Tag Obs
 Go Top
 Browse()

Return Nil

Criar indices .fpt

Enviado: 19 Out 2014 13:45
por JoséQuintas
Sem problemas.

Tem também um erro básico... INDEX ON Trim( nome )
Isso também causaria problemas de índice, porque o tamanho da chave ficaria indefinido.

Mas acho que o mais comum pode ser mesmo o tamanho da chave.
Se não me engano, pra NTX o limite é 100 caracteres, e pra CDX 200.
Algo assim, estouraria o limite:

Código: Selecionar todos

index on NomeDepto + NomeSecao + NomeCategoria + NomeGrupo + NomeProduto TO temp
Num caso desses, um pedaço do nome + código pode ser útil.