Problemas com Indices de Datas
Moderador: Moderadores
Problemas com Indices de Datas
Estou com 2 problemas relativos a datas, o 1º é que ao gravar um novo registro, ao mostra-lo, este ultimo aparece no final do arquivo, desobedecendo a indexação que é por data, e o 2º é que não consigo filtrar um intervalo de datas com o SET FILTER, sempre o resultado é errado. Por favor me ajudem...
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Buenas...
Obs :caso soh tenha somente um indice para esse dbf vc soh abre ele junto com o dbf e ele vai assumir automaticamente o indice que vc abriu sem prescissar colocar um SET ORDER TO 1 ou 2 .....
Fui...qualquer duvida posta ai....
Abraços
Tche, pelo o que entendi referente a gravar acho que não existe outra maneira ele tem que gravar no final do arquivo.......o emlhor ele abre somente um novo registro sempre no fim do DBF .....agora para vc mostrar ele em tela por exemplo vc deve abrir o indice por data e seter ele na hora de mostrar !! exemplo abaixoEstou com 2 problemas relativos a datas, o 1º é que ao gravar um novo registro, ao mostra-lo, este ultimo aparece no final do arquivo, desobedecendo a indexação que é por data
Código: Selecionar todos
use dados alias dados shared excl
index on DATA TAG 1 to dados1 EVAL Progress() every lastrec()/10
DATA=CAMPO DATA
PROGRESS=FUNÇÃO QUE USO PARA INDEXAÇÃO
Bom ...se vc der uma procura ai no forum vai achar diversos post sobre o set filter....que na minha opnião é uma ferramenta muito boa para filtro mas estremamente devagar...alias é a opnião de varios aqui no forum...abaixo um exemplo com o SET FILTER e data.2º é que não consigo filtrar um intervalo de datas com o SET FILTER, sempre o resultado é errado.
Código: Selecionar todos
SET FILTER TO DTOS(DATA) >= DTOS(INICIO) .AND. DTOS(DATA) <= DTOS(FINAL)
Abraços
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
bfrodrigo :
Poste aqui como é que vc esta criando o índice que esta apresentando o problema mensionado.
sygecom:
Vc não precisa colocar DTOS nesse seu filtro. Pode ser colocado assim:
SET FILTER TO DATA >= INICIO .AND. DATA <= FINAL
Boa sorte.
Poste aqui como é que vc esta criando o índice que esta apresentando o problema mensionado.
sygecom:
Vc não precisa colocar DTOS nesse seu filtro. Pode ser colocado assim:
SET FILTER TO DATA >= INICIO .AND. DATA <= FINAL
Boa sorte.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
{POG - Programação Orientada a Gambiarra}
Caro Amigo:
Sempre que vou usar o banco de dados faço assim:
sele 1
use NOMEARQUIVO
index on CAMPOCHAVE to ARQUIVOINDICE
dbsetindex("ARQUIVOINDICE")
Claro isso no inicio do procedimento, após só alterno entre os bancos de dados com o comando sele 1, sele 2, e etc... Acho que isto não faz diferença.
Bom o problema é que faço as inclusões ao banco de dados normalmente, e na hora da consulta, que deveria ser por ordem de data (é um sistema de controle bancário, daí a necessidade de ser em ordem de data, e muitas vezes é feito lançamentos de dias anteriores), voltando, quando peço a listagem do intervalo de datas, alguns registrtos aparecem na ordem que foram gravados e não na ordem de data, será que deu para entender ! O filtro entre as datas já consegui acertar, mas este problema da quedra dos índices está me pondo louco.
Se os amigos puderem, e se não for pedir muito gostaria de instruções para reindexar estes registros que já estão gravados (claro, isto é apenas uma idéia minha, acho que não soluciona o problema, apenas possibilita a correção). Pois atualmente, cada vez que é feita alguma inclusão, tenho que entrar no DBU, criar o indice novamente lá, e editar o banco de dados e apenas dar um enter sobre o campo data já gravado para que ele vá para o devido lugar.
Amigos necessito muito dessas informações, não sei se soube me fazer entender, mas estou certo de vossa ajuda.
Abraços
Rodrigo
Sempre que vou usar o banco de dados faço assim:
sele 1
use NOMEARQUIVO
index on CAMPOCHAVE to ARQUIVOINDICE
dbsetindex("ARQUIVOINDICE")
Claro isso no inicio do procedimento, após só alterno entre os bancos de dados com o comando sele 1, sele 2, e etc... Acho que isto não faz diferença.
Bom o problema é que faço as inclusões ao banco de dados normalmente, e na hora da consulta, que deveria ser por ordem de data (é um sistema de controle bancário, daí a necessidade de ser em ordem de data, e muitas vezes é feito lançamentos de dias anteriores), voltando, quando peço a listagem do intervalo de datas, alguns registrtos aparecem na ordem que foram gravados e não na ordem de data, será que deu para entender ! O filtro entre as datas já consegui acertar, mas este problema da quedra dos índices está me pondo louco.
Se os amigos puderem, e se não for pedir muito gostaria de instruções para reindexar estes registros que já estão gravados (claro, isto é apenas uma idéia minha, acho que não soluciona o problema, apenas possibilita a correção). Pois atualmente, cada vez que é feita alguma inclusão, tenho que entrar no DBU, criar o indice novamente lá, e editar o banco de dados e apenas dar um enter sobre o campo data já gravado para que ele vá para o devido lugar.
Amigos necessito muito dessas informações, não sei se soube me fazer entender, mas estou certo de vossa ajuda.
Abraços
Rodrigo
O problema que você citou não é esse. É com a ordem da data. Mas não mostrou como é a chave do índice que leva essa data. Você usa DTOS()?bfrodrigo escreveu:sele 1
use NOMEARQUIVO
index on CAMPOCHAVE to ARQUIVOINDICE
dbsetindex("ARQUIVOINDICE")
Se você usa DTOC() numa chave complexa, vai dar problema mesmo. Se usa DTOS(), não tem porque a data sair fora de ordem.
[]'s
Maligno
http://www.buzinello.com/prg
Caro Amigo !
Maligno escreveu:bfrodrigo escreveu:sele 1
Se você usa DTOC() numa chave complexa, vai dar problema mesmo. Se usa DTOS(), não tem porque a data sair fora de ordem.
Realmente, agora vc me pegou, pois eu não uso nenhuma das funções, o campo do banco de dados é formato data, e eu uso o CTOD() sempre que preciso informar o valor da variavel:
Na inclusão faço assim:
VARIAVEL = ctod(" / / ")
e dou um GET normal na variavel, e depois gravo normalmente.
Na consulta faço assim:
@ l,c get VARIAVEL1 pict "99/99/99"
@ l,c get VARIAVEL2 pict "99/99/99"
read
VAR1 = ctod(VARIAVEL1)
VAR2 = ctod(VARIAVEL2)
if empty(VAR1) .and. !empty(VAR2)
set filter to CAMPODATA<=VAR2
endif
if !empty(VAR1) .and. empty(VAR2)
set filter to CAMPODATA>=VAR1
endif
if !empty(VAR1) .and. !empty(VAR2)
set filter to CAMPODATA>=VAR1 .and. CAMPODATA<=VAR2
endif
declare vpc[5]
vpc[01]="CAMPODATA"
vpc[02]="NOME"
vpc[03]="VALOR"
go bottom
dbedit(08,03,15,76,vpc,"fd1_cor",.t.,vpc2,chr(196),chr(179),)
Amigo, espero que vcs possam realmente me ajudar, mesmo que tenha que refazer tudo, o que preciso é resolver. Obrigado pela sua atenção.
Abraço
Rodrigo
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Rodrigo, o que o colega MALIGNO, estava tentando te dizer é que você precisa dizer pra nós como você faz para indexar por data esse arquivo ?.
O que é normalmente usado é:
INDEX ON DTOS(CAMPODATA) TO CLIEN001.NTX
É assim que você utiliza para indexar ?
Outra coisa que é importante, é que TODA vez que for abrir o arquivo e precisar ESCREVER (incluir, modificar, deletar) nele CLIENTES.DBF (vamos assim dizer) você terá que abrir JUNTO o arquivo de índices. Exemplo:
USE CLIENTES INDEX CLIEN001
Para que todas as atualizações façam-se TAMBÉM no NTX.
OK ? Um clip-abraço :)Pos
O que é normalmente usado é:
INDEX ON DTOS(CAMPODATA) TO CLIEN001.NTX
É assim que você utiliza para indexar ?
Outra coisa que é importante, é que TODA vez que for abrir o arquivo e precisar ESCREVER (incluir, modificar, deletar) nele CLIENTES.DBF (vamos assim dizer) você terá que abrir JUNTO o arquivo de índices. Exemplo:
USE CLIENTES INDEX CLIEN001
Para que todas as atualizações façam-se TAMBÉM no NTX.
OK ? Um clip-abraço :)Pos
Amigo, realmente pode ser isso, eu não estava abrindo o índice corretamente no momento da inclusão, estava fazendo assim:
sele 1
use NOMEARQUIVO
index on CAMPOCHAVE to ARQUIVOINDICE
dbsetindex("ARQUIVOINDICE")
E é assim que eu crio o índice de datas, será que este procedimento é o mais correto ?
Obrigado pela dica. Estou testando.
Abraço
Rodrigo
sele 1
use NOMEARQUIVO
index on CAMPOCHAVE to ARQUIVOINDICE
dbsetindex("ARQUIVOINDICE")
E é assim que eu crio o índice de datas, será que este procedimento é o mais correto ?
Obrigado pela dica. Estou testando.
Abraço
Rodrigo
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Eu acho que se o arquivo NTX já existir, não vejo a necessidade de estar INDEXANDO a toda hora. Ora porque isto causa muita demora. Eu faria assim:
NOMEARQUIVO:="CLIENTES.DBF"
ARQUIVOINDICE:="CLIEN001.NTX"
CAMPOCHAVE:="DTANAS"
sele 1
use (NOMEARQUIVO) SHARED
IF !FILE(ARQUIVOINDICE)
index on DTOS(DTANAS) to (ARQUIVOINDICE )
ENDIF
dbsetindex("ARQUIVOINDICE") // Isto se tiver apenas um NTX para este DBF
Agora precisamos saber o qual é o valor dessa variável CAMPOCHAVE, você poderia nos dizer ?. Veja que ao INDEXAR utilizei o nome do CAMPO e não a variável (também não sei se daria certo como você faz, acho que sim, mas não testei). De todas formas, faça a INDEXAÇÃO de forma CONDICIONAL e ponha o nome do campo mesmo.
Um clip-abraço :)Pos
NOMEARQUIVO:="CLIENTES.DBF"
ARQUIVOINDICE:="CLIEN001.NTX"
CAMPOCHAVE:="DTANAS"
sele 1
use (NOMEARQUIVO) SHARED
IF !FILE(ARQUIVOINDICE)
index on DTOS(DTANAS) to (ARQUIVOINDICE )
ENDIF
dbsetindex("ARQUIVOINDICE") // Isto se tiver apenas um NTX para este DBF
Agora precisamos saber o qual é o valor dessa variável CAMPOCHAVE, você poderia nos dizer ?. Veja que ao INDEXAR utilizei o nome do CAMPO e não a variável (também não sei se daria certo como você faz, acho que sim, mas não testei). De todas formas, faça a INDEXAÇÃO de forma CONDICIONAL e ponha o nome do campo mesmo.
Um clip-abraço :)Pos
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Eu sabia que essa variável iria atrapalhar na idexação.
Veja da seguinte forma, de acordo com a estrutura de variáveis que você tem no seu sistema:
CAMPOCHAVE:="DTANAS" // aqui o CAMPOCHAVE é uma variável, certo ?
então se você tiver que indexar, a forma correta com essa VARIÁVEL é:
index on DTOS((&CAMPOCHAVE)) to (ARQUIVOINDICE)
Eu particularmente não gosto de fazer isto. Mas se for pra seguir o seu padrão então faça como eu disse acima em negrito.
Um clip-abraço :)Pos
Onde eu disse: CAMPOCHAVE:="DTANAS" veja que o DTANAS é o nome do campo que eu dei (tem que ver qual é o seu no DBF. OK ?
Veja da seguinte forma, de acordo com a estrutura de variáveis que você tem no seu sistema:
CAMPOCHAVE:="DTANAS" // aqui o CAMPOCHAVE é uma variável, certo ?
então se você tiver que indexar, a forma correta com essa VARIÁVEL é:
index on DTOS((&CAMPOCHAVE)) to (ARQUIVOINDICE)
Eu particularmente não gosto de fazer isto. Mas se for pra seguir o seu padrão então faça como eu disse acima em negrito.
Um clip-abraço :)Pos
Onde eu disse: CAMPOCHAVE:="DTANAS" veja que o DTANAS é o nome do campo que eu dei (tem que ver qual é o seu no DBF. OK ?
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Veja Rodrigo que quando eu fiz:
NOMEARQUIVO:="CLIENTES.DBF"
ARQUIVOINDICE:="CLIEN001.NTX"
CAMPOCHAVE:="DTANAS"
Foi para dar sentido a coisa, pois essas são variáveis que contém o nome do DBF, NTX e do campo a ser indexado.
Desculpe, mas presumo que além de você ser novato, essa aplicação deve ter sido feita através de GERADOR DE APLICATIVO, tou certo ?. Desculpe então se parece eu estar substimando-te (não é essa a minha intenção). Mas para ver essas varáveis, o melhor método seria pelo DEBUG do Clipper (CLD), e o outro é imprimir na tela a variável, assim:
// Lá naquele lugar antes de chamar seu DBEDIT
? NOMEARQUIVO
? ARQUIVOINDICE
? CAMPOCHAVE
INKEY(0)
Aí você conseguirá ver seu conteúdo ou então procurar seu PRG onde faz aquela declarações (bem no começo do seu sistema ou num PRG de funções ou de arquivos, algo assim). Fusse, que você acha !
Um clip-abraço :)Pos
NOMEARQUIVO:="CLIENTES.DBF"
ARQUIVOINDICE:="CLIEN001.NTX"
CAMPOCHAVE:="DTANAS"
Foi para dar sentido a coisa, pois essas são variáveis que contém o nome do DBF, NTX e do campo a ser indexado.
Desculpe, mas presumo que além de você ser novato, essa aplicação deve ter sido feita através de GERADOR DE APLICATIVO, tou certo ?. Desculpe então se parece eu estar substimando-te (não é essa a minha intenção). Mas para ver essas varáveis, o melhor método seria pelo DEBUG do Clipper (CLD), e o outro é imprimir na tela a variável, assim:
// Lá naquele lugar antes de chamar seu DBEDIT
? NOMEARQUIVO
? ARQUIVOINDICE
? CAMPOCHAVE
INKEY(0)
Aí você conseguirá ver seu conteúdo ou então procurar seu PRG onde faz aquela declarações (bem no começo do seu sistema ou num PRG de funções ou de arquivos, algo assim). Fusse, que você acha !
Um clip-abraço :)Pos
Amigo, acho que não soube me expressar, eu não uso variáveis, como acabei deixando subentendido, au faço direto no campochave, mas foi bom vc falar. Acho que o maior erro era na hora que ia fazer uma inclusão, assim:
Use Clientes
index on dat to clidat(arquivo ntx)
dbsetindex("clidat")
Agora, estou fazendo assim:
Use Clientes index Clidat
Pelo que entendi era isso que estava faltando. E qual seria a finalidade do comando SHARED que vc usou.
A propósito este sistema não é gerado por um gerador, eu é que fiz, é que não tenho muita pratica em clipper, sei o básico, não tenho os macetes ainda...
Obrigado
Abraços
Rodrigo
Use Clientes
index on dat to clidat(arquivo ntx)
dbsetindex("clidat")
Agora, estou fazendo assim:
Use Clientes index Clidat
Pelo que entendi era isso que estava faltando. E qual seria a finalidade do comando SHARED que vc usou.
A propósito este sistema não é gerado por um gerador, eu é que fiz, é que não tenho muita pratica em clipper, sei o básico, não tenho os macetes ainda...
Obrigado
Abraços
Rodrigo
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Que bom Rodrigo, que parece ter resolvido essa questão. Legal também saber que o sistema foi feito por você mesmo e quanto as varáveis, você me sorprendeu. Isso é sinal que você ja mostra grande personalidade em programação. Quanto a você não ter muita prática, bem... isso todos nós ja passamos por isso... e você não será nem o primeiro nem o ultimo... sinta-se a vontade, aqui todos nós estamos aqui com o mesmo propósito.
SET DATE TO BRITISH // Seleciona o formatado como o utilizado aqui no Brasil
SET CENTURY ON // Para trabalhar com 4 dígitos do ano
SELE 1
USE CLIENTES SHARED
IF !FILE("CLINUM.NTX")
INDEX ON STRZERO(CODCLI,5,0) TO CLICOD.NTX
ENDIF
IF !FILE("CLIDAT.NTX")
INDEX ON DTOS(DTANAS) TO CLIDAT.NTX
ENDIF
SET INDEX TO CLICOD,CLIDAT // isto é o mesmo que fazer DBSETINDEX("CLIDAT")
SELE 2
USE NOTAS SHARED
IF !FILE("NFDAT.NTX")
INDEX ON STRZERO(COD_CLI,5,0)+DTOS(NFDTA) TO NFCLDT.NTX
ENDIF
VCOD:="00001" // veja que contém zeros por causa do STRZERO()
SELE 1
SEEK VCOD
IF FOUND()
VNOM:=(1->NOME) // Veja o 1 dizendo que da área 1 (clientes.dbf)
ELSE
MENSAGEM("Cliente não encontrado !",3)
RETURN .F.
ENDIF
VDTA:=CTOD("01/04/2007") // Trabalhe sempre com 4 dígitos no ano (+seguro)
SELE 2
SEEK VCOD+DTOS(VDTA) // o DTOS, irá transformar as data AAAAMMDD
// Veja que CONCATENEI o cpodigo_cliente MAIS a data_compra
// Mas precisa ser indexado do mesmo jeito.
DO WHILE (2->(!EOF()))
? STRZERO(2->NF,8,0)+" "+DTOC(2->VENCE)+" "+TRANSFORM((2->VALOR),"@E 999,999.99")
SKIP
ENDDO

Faça uso SEMPRE (ao menos que seja algum muito pequeno e tenha certeza que não usará em rede) das funções de tratamento para REDES. Comece sempre fazendo compartilhando os arquivos, pois um dia você vai se arrepender de não te-lo feito e dar o maior trabalho. Mas para isso, ja existem várias funções de tratamento, como por exemplo:
- Para abrir DBF em modo compartilhado, dando a mensagem de que este arquivo não foi possível abrir.
- Para bloquear o ARQUIVO, caso você precise fazer manutenção (como por exemplo, fazer um PACK).
- Para bloquear o REGISTRO, caso você precise gravar no DBF. Por exemplo, fazer um REPLACE ou DELETE
- Para adiconar um REGISTRO, caso você precise APPENDAR
Estas funções, que mencionei ja contém toa a forma seguras para estabelecer um SEMÁFORO na rede.
E outra coisa muito importante, que ajudará bastante no seu aprendizado é você ter AJUDA ONLINE como por exemplo o uso do NG (norton Guide) que ora ativado possa ser usado com o seu EDITOR-DE-TEXTOS, onde você se posiciona com o cursor no COMANDO ou FUNÇÃO e você ativando com as teclas-hot-key poderá procurar a sintaxe de cada comando/função de dentro do seu editor.
Ok, Robson. espero ter ajudado um pouco.
Um clip-abraço :)Pos
Bem, é importante saber expor a questão toda, exemplificando e mostrando (de preferência) seu código-fonte, onde pode estar ocorrendo o erro. Isso facilita na identificação de falhas.bfrodrigo escreveu:acho que não soube me expressar
Sim, não está errado abrir de essa forma. Mas seria conveniente, você sempre verificar se o NTX existe primeiramente. Também não sei se você utiliza o SELE 1, SELE 2, SELE 3, conforme você vai abrindo os diferentes DBFs. Com certeza seu sistema deve ter mais do que 1 DBF. E eu acho muito válido identificar as áreas conforme você vai abrindo, isto evita que você tenha que estar abrindo e fechando os DBFs. Um exemplo do uso do SELECT, é assim:bfrodrigo escreveu:Agora, estou fazendo assim:
Use Clientes index Clidat
SET DATE TO BRITISH // Seleciona o formatado como o utilizado aqui no Brasil
SET CENTURY ON // Para trabalhar com 4 dígitos do ano
SELE 1
USE CLIENTES SHARED
IF !FILE("CLINUM.NTX")
INDEX ON STRZERO(CODCLI,5,0) TO CLICOD.NTX
ENDIF
IF !FILE("CLIDAT.NTX")
INDEX ON DTOS(DTANAS) TO CLIDAT.NTX
ENDIF
SET INDEX TO CLICOD,CLIDAT // isto é o mesmo que fazer DBSETINDEX("CLIDAT")
SELE 2
USE NOTAS SHARED
IF !FILE("NFDAT.NTX")
INDEX ON STRZERO(COD_CLI,5,0)+DTOS(NFDTA) TO NFCLDT.NTX
ENDIF
VCOD:="00001" // veja que contém zeros por causa do STRZERO()
SELE 1
SEEK VCOD
IF FOUND()
VNOM:=(1->NOME) // Veja o 1 dizendo que da área 1 (clientes.dbf)
ELSE
MENSAGEM("Cliente não encontrado !",3)
RETURN .F.
ENDIF
VDTA:=CTOD("01/04/2007") // Trabalhe sempre com 4 dígitos no ano (+seguro)
SELE 2
SEEK VCOD+DTOS(VDTA) // o DTOS, irá transformar as data AAAAMMDD
// Veja que CONCATENEI o cpodigo_cliente MAIS a data_compra
// Mas precisa ser indexado do mesmo jeito.
DO WHILE (2->(!EOF()))
? STRZERO(2->NF,8,0)+" "+DTOC(2->VENCE)+" "+TRANSFORM((2->VALOR),"@E 999,999.99")
SKIP
ENDDO
O SHARED é para que o arquivo DBF seja aberto de forma COMPARTILHADO. Isto é fundamental, se você precisar utilizar seu sistema em REDE. Quer um conselhobfrodrigo escreveu:E qual seria a finalidade do comando SHARED que vc usou.
Faça uso SEMPRE (ao menos que seja algum muito pequeno e tenha certeza que não usará em rede) das funções de tratamento para REDES. Comece sempre fazendo compartilhando os arquivos, pois um dia você vai se arrepender de não te-lo feito e dar o maior trabalho. Mas para isso, ja existem várias funções de tratamento, como por exemplo:
- Para abrir DBF em modo compartilhado, dando a mensagem de que este arquivo não foi possível abrir.
- Para bloquear o ARQUIVO, caso você precise fazer manutenção (como por exemplo, fazer um PACK).
- Para bloquear o REGISTRO, caso você precise gravar no DBF. Por exemplo, fazer um REPLACE ou DELETE
- Para adiconar um REGISTRO, caso você precise APPENDAR
Estas funções, que mencionei ja contém toa a forma seguras para estabelecer um SEMÁFORO na rede.
E outra coisa muito importante, que ajudará bastante no seu aprendizado é você ter AJUDA ONLINE como por exemplo o uso do NG (norton Guide) que ora ativado possa ser usado com o seu EDITOR-DE-TEXTOS, onde você se posiciona com o cursor no COMANDO ou FUNÇÃO e você ativando com as teclas-hot-key poderá procurar a sintaxe de cada comando/função de dentro do seu editor.
Ok, Robson. espero ter ajudado um pouco.
Um clip-abraço :)Pos
Pablo,
Duas perguntas quanto ao seu post:
- primeiro, ao fazer USE CLIENTES SHARED e a seguir o INDEX, vc assume que o arquivo CLIENTES.DBF existe e que não está aberto EXCL por alguém na rede... Se não for verdade, vai dar run time error. Não era o caso de primeiro checar a existência do DBF, depois rodar o USE, depois o NETERR() pra confirmar que ele foi aberto de acordo, e só então cuidar do INDEX?
- segundo, vc reconstrói o INDEX com o DBF SHARED. Pergunto: não é aconselhável, na indexação, abrir em modo EXCLUSIVE? Porque imagino que vai dar encrenca se, durante a indexação iniciada pela Estação X, a estação Y, também com o DBF aberto SHARED, APPENDar um registro ou modificar algum registro chave... Ou não?
Eolo
Duas perguntas quanto ao seu post:
- primeiro, ao fazer USE CLIENTES SHARED e a seguir o INDEX, vc assume que o arquivo CLIENTES.DBF existe e que não está aberto EXCL por alguém na rede... Se não for verdade, vai dar run time error. Não era o caso de primeiro checar a existência do DBF, depois rodar o USE, depois o NETERR() pra confirmar que ele foi aberto de acordo, e só então cuidar do INDEX?
- segundo, vc reconstrói o INDEX com o DBF SHARED. Pergunto: não é aconselhável, na indexação, abrir em modo EXCLUSIVE? Porque imagino que vai dar encrenca se, durante a indexação iniciada pela Estação X, a estação Y, também com o DBF aberto SHARED, APPENDar um registro ou modificar algum registro chave... Ou não?
Eolo


