Clipper On Line • Ver Tópico - Criar Índice CDX em Modo Compartilhado
Página 1 de 3

Criar Índice CDX em Modo Compartilhado

MensagemEnviado: 07 Out 2006 08:03
por Dri
Hi!

People, gostaria de uma confirmação: é verdade que se eu criar índices CDX, desde que o nome do arquivo de índice não seja o mesmo nome do arquivo DBF, posso fazê-lo abrindo o arquivo em modo compartilhado (SHARED) e sem bloquear o arquivo (sem usar o FLOCK())?

Se for verdade, será possível criar índices temporários à vontade nas aplicações que rodam em rede!

Brigadinha!

MensagemEnviado: 07 Out 2006 17:48
por momente
Dri,

Se entendi sua pergunta, seria pra criar um arquivo de indice temporário?

Se for isso! Aconselho criar um dbf temporario e depois um indice para ele, pois imagine se alguem estiver incluindo um registro no exato momento que vc estiver criando o indice, eu acho (digo eu acho!) que vai dar alguma coisa errada! Acredito que este indice não vai estar correto! Eu particularmente nunca fiz desta maneira.

Valeu! :)Pos

MensagemEnviado: 07 Out 2006 18:27
por Dri
Hi, Momente!

Sim, é pra índice temporário.

É que estou com um problema... Como criar o índice temporário a partir de um arquivo que fica sempre em uso na rede?
E se optar pelo arquivo temporário, aí além de criar o índice, que já demora um pouco, imagine ainda ter que primeiro criar o arquivo...

MensagemEnviado: 08 Out 2006 05:08
por Maligno
Dri escreveu:É que estou com um problema... Como criar o índice temporário a partir de um arquivo que fica sempre em uso na rede?

Existe algum bom motivo que te impeça de tornar permanente esse índice temporário? Se a chave de indexação não mudar,...

[]'s
Maligno
http://www.buzinello.com/prg

MensagemEnviado: 08 Out 2006 07:31
por Dri
Hi, Maligno!

Maligno, é difícil afirmar para você as coisas! hihihihihi
Meus conhecimentos são reles comparados aos seus e não me permite isto.
Então vou lhe responder assim: "Sabe, Maligno, eu acho (toda mulher inteligente é cheia de dúvidas... eu acho!) que existe um bom motivo para criar índices temporários!"... rsrsrsrsrs

Chega de embromação!

É o seguinte: Há uma consulta onde um dos parâmetros é um campo que o usuário informará uma partícula do nome. Ao iniciar a consulta, seriam obtidos todos os clientes com aquela partícula do nome e estes exibidos num browser.
Particularmente, pensei em criar um índice temporário montando-o com o operador "$".
Testei e funciona, mas aí ficou a dúvida quanto a criar o índice se o arquivo já está em uso por outro usuário, e para tal, eu teria que bloquear este arquivo ou então abri-lo em modo exclusivo.

E então, Maligno? Ou terei que mudar de estratégia?

Obrigada!

sx_WildSeek

MensagemEnviado: 08 Out 2006 11:39
por Maligno
É o seguinte: Há uma consulta onde um dos parâmetros é um campo que o usuário informará uma partícula do nome. Ao iniciar a consulta, seriam obtidos todos os clientes com aquela partícula do nome e estes exibidos num browser.
Particularmente, pensei em criar um índice temporário montando-o com o operador "$".
Testei e funciona, mas aí ficou a dúvida quanto a criar o índice se o arquivo já está em uso por outro usuário, e para tal, eu teria que bloquear este arquivo ou então abri-lo em modo exclusivo.

E então, Maligno? Ou terei que mudar de estratégia?

Bom, acho que nesse caso talvez você nem precise utilizar um índice temporário. O RDD CDX (estou falando da LIB SIX) possui uma função chamada sx_WildSeek(), que permite pesquisar por partes de nomes. Exemplo:

Suponhamos que você tenha no seu cadastro:

ABC IND. DE APARELHOS DE GINASTICA LTDA
AUTO MOLAS SANTISTA LTDA
BAR E LANCHONETE PAULISTA LTDA
RECUPERADORA SANTARÉM LTDA
OFICINA DO TOLEDO S/A
BOAVISTA COMERCIO DE CEREAIS LTDA

sx_WildSeek("*ISTA",.F.)
while Found()
   ? NOME
   sx_WildSeek("*ISTA",.T.)
end

Isso resultará em:
AUTO MOLAS SANTISTA LTDA
BAR E LANCHONETE PAULISTA LTDA
BOAVISTA COMERCIO DE CEREAIS LTDA

sx_WildSeek("*INA",.F.)
while Found()
   ? NOME
   sx_WildSeek("*INA",.T.)
end

Isso resultará em:
ABC IND. DE APARELHOS DE GINASTICA LTDA
OFICINA DO TOLEDO S/A

O valor lógico no segundo argumento da função, se FALSE, força a função a começar a pesquisa a partir do início do arquivo. Por isso a primeira chamada fica fora do WHILE.

É disso que você precisa?

[]'s
Maligno
http://www.buzinello.com/prg

MensagemEnviado: 09 Out 2006 04:50
por Dri
Well...

Maligno, este problema está num pequenino sistema que tenho (pequeno mesmo, três cadastros, uma transação de movimentos, e umas quatro consultas com opções de impressão).
Este sistema está compilado com a lib SIX2, utilizando índices NSX.
Adoro esta lib e utilizo alguns de seus recursos, inclusive a função sx_WildSeek().
Tirei uma noite no início da semana passada para deixar este sistema com Clipper puro, excluindo dele todas as libs externas, que por ser o menor que tenho, é ele que quero usar para fazer a primeira migração (estava convicta a ir para o xHarbour, lembra? E li qualquer coisa que o xHarbour não aceita a lib SIX na versão FREE, parece-me que só na versão paga).
A primeira coisa foi mudar o RDD para CDX, que foi tranqüilo.
Depois, foi substituir as funções da SIX2 por funções, comandos ou rotinas em Clipper.
Foi daí que pensei num índice temporário com o operador "$" para substituir a função sx_WildSeek() da SIX2.

Maligno, mil desculpas...
Quando citei
Há uma consulta onde um dos parâmetros é um campo que o usuário informará uma partícula do nome
deveria ter citado também que isto já é feito utilizando a função sx_WildSeek() da SIX2 e queria achar uma forma de substituí-la, mas não o fiz para encurtar o problema e acabei fazendo você perder um precioso tempo em me passar uma coisa que já faço. Não imaginei que você citaria esta função... Desculpe novamente... :( , mas muito obrigada!

Voltamos ao ponto de partida... :'(

MensagemEnviado: 09 Out 2006 06:02
por rochinha
Amiguinha

Existe sim uma possibilidade de voce filtrar dados de forma super rapida e que podem substituir os indices temporários.

Use SETSCOPE() do CDX.

Primeiro voce cria um indice permanente, exemplo codigo de cliente, IDCLIENTE(supondo que seja de 5 digitos) para o arquivo de pedidos PEDIDOS.DBF

...
INDEX ON str(PEDIDOS->IDCLIENTE,5,0) ...
...

Depois em qualquer momento voce podera filtrar os dados deste cliente assim:

...
M->IDCLIENTE := PEDIDOS->IDCLIENTE
...
dbSelectArea("PEDIDOS")
OrdSetFocus(1) // sete o foco para o indice criado
SetScope(0, str(M->IDCLIENTE,5,0) ) // 0 define o inicio do Range
SetScope(1, str(M->IDCLIENTE,5,0) ) // 0 define o final do Range
dbGoTop()

Outro caso é voce filtrar varios registros em uma mesma tabela assim:

...
M->IDCLIENTE1 := 50
M->IDCLIENTE2 := 75
...
dbSelectArea("PEDIDOS")
SetScope(0, str(M->IDCLIENTE1,5,0) ) // 0 define o inicio do Range
SetScope(1, str(M->IDCLIENTE2,5,0) ) // 0 define o final do Range
dbGoTop()

Neste caso serao filtrados dados dos clientes com codigo 50 ate 75

Será que ajudou?

@braços :?)

MensagemEnviado: 09 Out 2006 10:54
por Dri
Hi, Rochinha!

Look this...
Primeiro, fiz o Maligno perder tempo fazendo-me citações a respeito da função sx_WildSeek() da SIX2, pois o sistema já era como ele sugeriu.
Agora, dê-me licença que deu pra mim e vou arrancar meus cabelos...
(Dois ou três minutos depois, semi-calva e mais calma...)

A SIX2 tem algo semelhante, acho que é sx_Setscope (não posso afirmar... não estou em casa e aqui onde estou não tem Clipper).
Como queria deixar o sistema sem libs de terceiros, em todos os lugares, principalmente nas funções que ativam o TBrowse, tirei todas as funções sx_Setscope e substituí por Whiles com controles de variáveis, etc., etc., etc...
Não imaginava que a lib DBFCDX.LIB tinha uma função similar... :'(
E a sx_WildSeek() (uma similar, claro!), a DBFCDX.LIB tem também?

A propósito, existe alguma documentação (NG, preferencialmente) para a DBFCDX.LIB? Ou fica no próprio NG do Clipper (como disse, não tem como eu ver aqui o NG do Clipper)?

Obrigada, gente! Apesar das asneiras que cometi neste tópico (e também no meu sistema "reinventando a roda" para substituir as funções da SIX2), a coisa tá fluindo bem, graças a estes amigos feras e sempre dispostos a ajudar!

MensagemEnviado: 09 Out 2006 12:12
por MARCELOG
Olá Dri,
procure o NG do clipper 5.3 na internet, ele traz as informações das funções que controlam os índices cdx.
A função citada pelo Rochinha, s.m.j., é ORDSCOPE() e não SETSCOPE().
Importante destacar que o índice ativo tem que suportar a pesquisa.
Assim, quando criar um índice para filtro, fixo ou temporário, não esqueça essa situação.
Elabore índices compostos se necessário, pois permitirá diversas ordenações sem prejudicar a performance do filtro.
Lembre-se que os índices CDX comportam até 99 "ordens" de ordenação por arquivo (de índices).
Por outro lado, é importante que você leia tutoriais básicos, inclusive relativos aos rdd´s que você vai utilizar.
Sempre tem alguma coisa interessante que você pode usar para melhorar a performance ou reduzir codificação.
Contudo, se não precisar da informação, vai ter conhecimento de todas as funções e, tal qual o Rochinha fez, "lembrar" de alguma que atenda a sua necessidade e/ou possa ajudar os amigos.

MarceloG

MensagemEnviado: 09 Out 2006 12:24
por MARCELOG
Outra saída para o seu problema é jogar as informações em uma array e visualizar a mesma com tbrowse.
Em clipper, é importante que você tenha certeza absoluta de que o array a ser criado terá no máximo 4096 elementos.
No xHarbour este problema não existe.

Simples algorítimo:
..
Pega cvariavel para filtro

Ar:={}

use arquivo
DbGoTop()
Do While !Eof()
if cvariavel $ campodoarquivo
aadd(ar,{recno(),campo1,campo2,campo3,...})
endif
DbSkip() //ou DbSKip(1) para melhor legibilidade (Santo Perfeccionismo)
EndDo

Exibe array que admite qualquer ordenação, etc.

Inclui o nº do registro no exemplo para que, se o usuário escolher um item, você possa encaminhá-lo para o registro correspondente através da referência.

Na seção de download´s, tem exemplos para criar indice temporário e visualizar array, vê se ajuda.

Não deixe de ver, quanto a array´s, o www.caclipperwebsite.com

MarceloG

MensagemEnviado: 09 Out 2006 15:41
por dbsh
utilizo clipper 5.2e e blinker 7.0

oi se entendi voce esta querendo criar arquivo de indice temporario somente utilizando DBFCDX, utilizo da seguinte forma em um cliente com 25 maquinas em rede todos acessando o mesmo sistema e a mesma base de dados, utilizando indices temporarios em IDX sendo que os indices fixos do sistema e em CDX.
EX:
use arquivo inde aquivo new shar //extensão CDX
inde on campo to (TmpDBF := TmpDBF()) [for <expressão>] [while <exprtessão>]

TmpDbf() e uma funcao que gera arquivo temporario exclusivo com extensão IDX

MensagemEnviado: 09 Out 2006 17:12
por Dri
Hi, Marcelo e dbsh!

procure o NG do clipper 5.3 na internet, ele traz as informações das funções que controlam os índices cdx

Marcelo, jamais imaginava que no NG do Clipper 5.3 eu encontraria informações das funções que controlam os índices CDX... Agora, se é uma lib, tinha que ter documentação à parte, específica! Concorda?

A função citada pelo Rochinha, s.m.j., é ORDSCOPE() e não SETSCOPE().
Importante destacar que o índice ativo tem que suportar a pesquisa.
Assim, quando criar um índice para filtro, fixo ou temporário, não esqueça essa situação.

Mesma coisa da função similar da SIX2.

Lembre-se que os índices CDX comportam até 99 "ordens" de ordenação por arquivo (de índices).

Os índices NSX da SIX2 também suportam 99 "ordens" por arquivo de índice e, se não me engano, 15 arquivos de índices por cada arquivo DBF. Numa conta rápida: 1.485 ordens para cada arquivo DBF. Troço doido!!!

Por outro lado, é importante que você leia tutoriais básicos, inclusive relativos aos rdd´s que você vai utilizar.

Ai, minha orelha... rsrsrsrsrrs
Procurei alguma coisa sim, mas não encontrei. Não imagina que no NG do Clipper 5.3 eu encontraria. Até porque não uso e não gosto do Clipper 5.3 (acho que arrumei uma encrenca revelando isto...)

Em clipper, é importante que você tenha certeza absoluta de que o array a ser criado terá no máximo 4096 elementos.
No xHarbour este problema não existe.

No array eu já havia pensado, Marcelo, mas descartei exatamente pela limitação dos 4.096 elementos.
A lib FAST permite 16.777.216 elementos num array (4.096²). Só que é uma lib de terceiros, que estou evitando (por enquanto... logo, logo, enfio a SIX2, a FAST, a NANFOR... e pronto!!!).
O xHarbour eu já sabia que esta limitação não existe, entre outros recursos (32 bits, por exemplo), daí a minha idéia fixa de migrar para xHarbour, e até tenho um post a respeito... Mas terei que pensar bem, afinal, há controvérsias!!!
E não é só pelas controvérsias, afinal, migrar não é apenas recompilar, então não dá pra ter os sistemas rodando, a cada dia, com uma linguagem diferente! Quero dizer, se a decisão não for acertada, blau, blau! Terei uma linguagem que não me agrada e serei obrigada a engoli-la.

Na seção de download´s, tem exemplos para criar indice temporário e visualizar array, vê se ajuda

Estou vendo sim, Marcelo.
Mas estou achando este xHarbour meio complicado... Talvez até não seja, talvez seja devido minha familiaridade com o Clipper... Eu acho!

25 maquinas em rede todos acessando o mesmo sistema e a mesma base de dados, utilizando indices temporarios em IDX sendo que os indices fixos do sistema e em CDX


dbsh, interessante sua solução...
Se não me engano, ao criar um índice CDX sem TAG, sua extensão é IDX. É isto mesmo?
Ainda pretendo achar uma solução sem criar o índice temporário, porém, se não encontrar, sua sugestão para índice temporário pareceu-me a mais apropriada.

Brigada, people! Vocês estão realmente contribuindo com meus problemas, assim como contribuem com os problemas de todos mutuamente no grupo!

MensagemEnviado: 09 Out 2006 17:27
por Dri
Hi!

Como disse, se realmente tiver que criar um índice temporário, aceitarei a sugestão do dbsh e, para nomear o arquivo idx criado, criarei um mecanismo que controlará o nome do arquivo.
Os arquivos ficariam assim: tmp00001.idx, tmp00002.idx, tmp00003.idx...
Os índices seriam criados localmente, e não na rede.

Raciocinando um pouco, acho que realmente não precisa bloquear ou abrir o arquivo em modo exclusivo para criar um índice, pois o que será reescrito será o índice, e não o DBF, e será um arquivo único de índice, ou seja, não há qualquer possibilidade de outro usuário estar com um arquivo aberto utilizando um índice que corre o risco de ser reescrito.

Concordam (mas só partirei pra índice temporário depois de esgotar outras possibilidades)?

MensagemEnviado: 09 Out 2006 17:34
por MARCELOG
Perfeitamente justificável a sua dúvida,
investir tempo em algo que não se conhece bem é complicado.
É como trocar de namorado/a.
A namorada/o da gente não é "supra sumo" e tem várias vantagens, especialmente as limitações e defeitos que eu já connheço bem.
Mas, migrar para xharbour é fácil e quase indolor.
Com o uso do hbmake, mais fácil ainda.
Apenas a sua função principal vai mudar de nome, passando a se chamar main.
O resto, se você usa clipper puro, fica do mesmo jeito e funciona legal.

MarceloG

PS: se vai usar clipper mesmo, umas dicas:
1) Force a variável para o filtro com um número mínimo de caracteres (3,4,5,..., etc.).
Isso já reduz bem o número de elementos.

2) Crie um contador dentro do while e, se chegar a 4096 elementos, avise o usuário, peça para refinar a pesquisa e aborte o loop para evitar erro.
Não acredito que qualquer usuario vá percorrer e identificar 4096 itens.

3) Pegue o total de registros e divida por 4096.
Depois, com ajuda de um for/next, crie quantas array´s forem necessárias para cobrir o total de registros.
(Como essa variável vai ser private por causa de macro, acho que só podem existir 250, ou algo próximo, tenho que verificar)
Depois, preencha as arrays até achar o fim do arquivo.
Descarte as arrays vazias.
Exiba, com o tbrowse, a primeira array.
Se o usuário não achar o que procura nesta array, exiba a segunda, e assim sucessivamente.
Como o processamento será em nível de memória, vai ser bem rápido.
Com dbf temporário também não há problema, ou qualquer limitação.
Crie os campos do arquivo numa array, o nome exclusivo (único) do arquivo a ser criado e crie o mesmo.
Como vair ser único, abra exclusivamente o arquivo criado, procure no arquivo anterior os registros que atendem ao filtro e grave os mesmos no novo arquivo.
Crie os indices com o arquivo temporário exclusivo do jeito que quiser.
Abandonada a rotina, apague o arquivo temporário e índices criados.

MensagemEnviado: 09 Out 2006 18:02
por MARCELOG
Desde quando eu era pequenininho lá em Barbacena, só é recomendável criar índices com uso exclusivo do arquivo.
Todavia, dá prá criá-los em modo compartilhado, mas não há garantia de integridade dos dados.

MarceloG

MensagemEnviado: 09 Out 2006 18:18
por momente
Amigos,

Essa eu realmente não sabia, consigo através do indice cdx fazer pesquisa de parte de uma string? Por exemplo :

No Arquivo -
Rogerio LUIS Martins
Rogerio LUIS Alfredo
LUIS Sebastião

e digitar para pesquisa LUIS o sistema consegue me devolver os nomes acima com LUIS? Afinal qual a melhor saida para isso?

Realmente não sabia que existia uma função para isto!

Obrigado amigos!!! :|<

MensagemEnviado: 09 Out 2006 18:35
por vagucs
Minha dica.

O INDICE CDX é ótimo e as rotinas SX_SETSCOPE com certeza te ajudarão


A rotina ORDSCOPE sempre existe no RDD DBFCDX da COMIX que faz parte do Clipper 5.3 com o nome de _DBFCDX.LIB, nela o ORDSCOPE já exista a mais de 10 anos atras.

Como você não quer usar libs de terceiros, acho interessante compilar em Clipper 5.3 ou xHarbour, trabalho de fazer a compilação em ambos será o mesmo.

MensagemEnviado: 09 Out 2006 19:09
por Dri
Hi, Momenté e Vanger!

Momenté, dá um tempo aí nas suas conclusões...

consigo através do indice cdx fazer pesquisa de parte de uma string?

Um "Momenté" (adoro trocadilhos! rsrsrsrs)
Eu tenho um problema sério... Minha memória é inferior aos 48 Kbytes do TK-90X (lembram dele? eu, claro que não lembro! É mais velho que eu! Só que meu pai tem um... Não vende! Não troca! Não dá! Não empresta! É a Ferrari dele! E o mais incrível: Ele tem a embalagem original! Por isso sei que ele tem 48 Kb de RAM! rsrsrsrs)
Eu tenho quase certeza absoluta que ninguém afirmou isto.
O que afirmamos, a partir do Maligno, é que a lib SIX2, com índices NSX, é possível fazer uma pesquisa por parte de uma string.
Quanto ao índice CDX, o que foi afirmado é que é possível estabelecer um range para o filtro, lembrando que o 0 (zero) define o início da range e o 1 (um) define o final da range.
Na SIX2, índices NSX, depois do filtro, a range tinha que ser "desligada". Acredito que no DBFCDX.LIB, também!

Vagner, pelos posts aqui que pesquisei, sei que você trabalha e usa o xHarbour.
Fale-me dele, por favor (prós e contras!).

MensagemEnviado: 09 Out 2006 19:14
por Dri
hihihihihihih

Bah, tchê!

Escrevi "um" entre parênteses e o sistema do fórum interpretou que eu queria um emoticom para "umbrella" (guarda-chuva)... rsrsrsrsrsrsrsrs

Deduções errôneas, as mesmas que o Excel e o Word me irritam tanto!!!

MensagemEnviado: 09 Out 2006 19:22
por MARCELOG
Sobre o driver six, cdx, etc. vejam isto.

http://www.x-hacker.org/ng/six3/index-2.html

Tá em "ingleis", mas e daí uai.

MarceloG.

MensagemEnviado: 10 Out 2006 10:38
por momente
Amiguinha Dri,

Desculpa eu pegar carona contigo, é que este assunto muito me interessa, pois tenho uma rotina danada pra fezer essa pesquisa e derepente poder troca-la por uma simples função me deixou realmente interessado.

Uso cdx a tempo, e gostaria realmente de saber como posso pesquisar parte de uma string usando apenas uma função, sei la, preciso realmente compilar com clipper53, ou posso usar algumas libs do 53b com 52e?

Valeu pessoal! :)Pos

MensagemEnviado: 10 Out 2006 11:04
por vagucs
Tem algumas libs do 5.3 que podem ser usadas no 5.2, o PCODE de ambos os clipper muda em pouca coisa, eu mesmo uso a LLIBG no clipper 5.3 e ela fica bem mais rapida, uso em modo real ao inves do modo protegido, so nunca tentei usar as libs de RDD pois nao tenho certeza se elas tem a mesma estrutura, mas seria interessante, se o RDD da comix funciona com o Clipper 5.2 seria ideal.

MensagemEnviado: 10 Out 2006 13:02
por rochinha
Amiguinhos

Acabei de postar um tópico com uma função bem interessante. Não tive tempo para analisa-la e acrescentar no array que a mesma criaa coluna que armazena o recno() do registro.

Quem fizer esta alteração por favor poste a mesma aqui neste tópico para que eu faça a referida modificação.

Vejam em Super seleção de dados com ordenação dos registros:

http://www.pctoledo.com.br/forum/viewto ... 8325#18325

Esta função recebe os parametros via comando, interpreta, cria o array e gera o arquivo .DBF com a estrutura pedida no comando e os registros selecionados.

Puro Clipper.

@braços :?)

Criar Índice CDX em Modo Compartilhado - N O V I D A D E S

MensagemEnviado: 10 Out 2006 13:37
por Dri
Hi!

Nas minhas andanças pela NET, pesquisando no google artigos, fóruns, materiais... e outras firulas a respeito do xHarbour, VB, VFP... patati, patatá... e também algo mais profundo a respeito de índices CDX, me deparei num fórum (por ética, não citarei qual) onde há um tópico bem extenso sobre alguns testes com índices NTX e CDX. Uma pessoa defende o NTX; a outra, defende o CDX.

Tá interessante e postaram um teste que deixou-os alarmados (não esperavam!) pelo resultado (eu idem... fiz os testes e quase caí das pernas, tchê!).
E pior, um alega certos resultados em seus testes; outro alega outros resultados.

Vou postar os testes, mas antes quero fazer uma pergunta:

Ao abrir um arquivo com índices CDX e há índices com o mesmo nome do arquivo DBF (por exemplo, clientes.dbf e o índice, clientes.cdx), o índice é aberto junto automaticamente?
Os meus não abrem!

Agora, por favor, criem um arquivo DBF (vamos chamar de TOLEDO, para facilitar) com apenas um campo char, de tamanho 10, chamado NOME e insiram neste DBF cinco registros nesta seqüência:

MALIGNO
VAGNER
ADRIANA
MARCELO
ROCHINHA


Concluído esta estapa, compilem, linkem e rodem este teste aí embaixo (exemplo copiado lá do outro fórum) com índices NTX:

clear
use toledo new // Abre o arquivo num nova área
index on nome to toledo // Indexa o arquivo por nome com índices NTX
set index to toledo // Abre o índice (eu sei, não precisava esta linha!)
run dir TOLEDO.NTX // Exibirá o arquivo TOLEDO.NTX
inkey(0)
clear
dbedit() // Exibiu os dados indexados por nome, certo?
ferase("TOLEDO.NTX") // Comigo, o índice aberto FOI excluído!
clear
run dir TOLEDO.NTX // Não me mostrou o arquivo (foi mesmo excluído!)
inkey(0)
seek pad("ROCHINHA",10) // Comigo, o SEEK funcionou!
? found() // Comigo, indicou que o SEEK foi mesmo sucesso (.T.)
inkey(0)
dbedit() // Comigo, exibiu "ROCHINHA" e "VAGNER"!
quit


E aí? Comportou-se com vocês da mesma forma que comportou-se comigo?

Well... Por favor, façam mais este então só que agora com índices CDX:

REQUEST DBFCDX
RDDSETDEFAULT("DBFCDX")
DBSETDRIVER("DBFCDX")
clear
use toledo new // Abre o arquivo num nova área
index on nome tag nome // Indexa o arquivo por nome com índices CDX
set index to toledo // Abre o índice (eu sei, não precisava esta linha!)
run dir TOLEDO.CDX // Exibirá o arquivo TOLEDO.CDX
inkey(0)
clear
dbedit() // Exibiu os dados indexados por nome, certo?
ferase("TOLEDO.CDX") // Comigo, o índice aberto FOI excluído!
clear
run dir TOLEDO.CDX // Não me mostrou o arquivo (foi mesmo excluído!)
inkey(0)
seek pad("ROCHINHA",10) // Comigo, o SEEK funcionou!
? found() // Comigo, indicou que o SEEK foi mesmo sucesso (.T.)
inkey(0)
dbedit() // Comigo, exibiu "ROCHINHA" e "VAGNER"!
quit


(Neste exemplo, não esqueçam de linkar a lib DBFCDX.LIB).

E aí? Qual foi o comportamento? Houve diferenças de comportamentos entre o NTX e o CDX?
Comigo não, só que o interessante... Eu consegui excluir o arquivo de índice que estava aberto, tanto o NTX quanto o CDX.
Lá no outro fórum, os testes de um dos caras se comportou como o meu; os testes de outro cara, comportou-se como o meu só nos índices CDX.
Segundo o cara que os testes se comportaram diferentes para NTX e CDX, afirmou que o arquivo de índice NTX não foi excluído (disse ele que deu o erro DOS de arquivo em uso).

Não esperava também estes resultados...
Se com vocês deu o mesmo resultado, seja no NTX, CDX ou ambos, alguém poderia me explicar porque?
E ainda, se o arquivo foi excluído, porque a indexação é mantida enquanto eu estiver com o programa em execução?
Lá acreditam estar na memória... Não sei não... Depois digo porque acho que não!

Aguardo e com muita curiosidade!!!

Alteração REGISTRO - Lentidão em rede

MensagemEnviado: 10 Out 2006 19:04
por rochinha
Amiguinha

Faça os mesmo testes no DOS puro, sem prompt e sem janelas.

Desligue o cache SMARTDRV e reveja os resultados.

Na verdade quando se trabalha com Windows e principalmente com Clipper é necessário ajustar algumas chaves no registro para evitar estes transtornos.

Veja neste trecho de script de meu instalador padrão que eu configuro algumas chaves do registro para melhorar a resposta de rede de meus aplicativos DOS.

;
; Resolve problemas de rede com o Clipper
;
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\"     ; ValueType: dword; ValueName: "EnableOpLocks"          ; ValueData: "0"; Components: clipper
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\"     ; ValueType: dword; ValueName: "CachedOpenLimit"        ; ValueData: "0"; Components: clipper
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\LanmanWorkStation\Parameters\"; ValueType: dword; ValueName: "UseOpportunisticLocking"; ValueData: "0"; Components: clipper
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\LanmanWorkStation\Parameters\"; ValueType: dword; ValueName: "UtilizeNtCaching"       ; ValueData: "0"; Components: clipper
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\LanmanWorkStation\Parameters\"; ValueType: dword; ValueName: "UseLockReadUnlock"      ; ValueData: "0"; Components: clipper

;
; Melhora resposta do cache do Windows
;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Compress Old Files"          ; flags: DeleteKey         ; Components: desempenho\cache
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RemoteComputer\NameSpace\ClassId key"     ; flags: DeleteKey         ; Components: desempenho\cache


@braços :?)

MensagemEnviado: 10 Out 2006 21:10
por vagucs
Rochinha esta foi 10!!!!!!!!!!!!!!


:{ :{ :{ :{ :{ :{ :{

MensagemEnviado: 11 Out 2006 11:02
por Dri
Hi!

Amiguinho Rochinha, meu nível de programação não chega ao de vocês.
E meu entendimento do registro do Windows, de sistema operacional e de rede, é num nível tão baixo que não entendi o que você postou... :(

Só nas horas vagas estou envolvida com o Clipper, e ainda tenho que conciliar o tempo também com a família, namoro (rsrsrsr), religião e lazer!
Acredito que vou continuar sem aprender o que deveria, pelo menos, no que diz respeito a redes, sistema operacional e o registro do Windows!

Não me interprete mal! O que você postou NÃO foi em vão e será muito útil para outros do grupo! E deve ter sido uma senhora solução, tanto que o Vagner te reverenciou... Só que o que você postou é avançado demais pra mim...

Bom, sobre o DOS puro que você citou, é possível isto no Windows XP, já que o DOS é emulado? Já usei o DOS puro algumas vezes quando tinha o Windows 98. Lembro que ficava uma carroça o programa... Pra compilar e linkar então... Bah! Horrível!

Agora, diz lá, sobre o que postei, de excluir um arquivo CDX em uso, e pior, excluir e a ordem continuar, as configurações que você faz em algumas chaves do registro são (também!) para resolver este problema? Então ele existe de fato? No DOS puro, eu não conseguiria remover o arquivo CDX em uso? É isto?

Obrigada, e desculpe perguntar tudo de novo! :(

MensagemEnviado: 11 Out 2006 14:31
por vagucs
qual sua religiao Dri?

Sem mais
Wagner Nunes
www.vagucs.com.br

MensagemEnviado: 11 Out 2006 18:41
por rochinha
Amiguinho Vagner,

Obrigado pelo apoio, voce também é 10!!!

Amiguinha Dri,

É basicamente isto mesmo, no DOS puro mesmo dentro de seu aplicativo por só existir uma sessão aberta é impossivel fechar um dos arquivos abertos.

Já em se tratando de Windows algumas coisas são possiveis de ocorrer com o mesmo e um exemplo é a liberação do LOCK imposto ao arquivo.

Uma coisa que me encafifa e ainda não me pus a testar(talvez já tenha testado e resolvido o problema) era o fato de travar um registro em uma estação e outra estação ao solicitar o travamento do mesmo acabava destravando o registro em todas estações e quando a primeira estação tentava destravar o registro ativo acabava deixando-o travado.

Erro de programação?, não, mas falta de afinamento da forma de uso dos comandos de rede, não bastando somente usá-los mas aliá-los a outras funções mais elaboradas para teste e conclusão.

Portanto voce deve tomar muito cuidado ao produzir os comandos de travamento e destravamento, usar funções que testes os travamentos antes de repassar dados aos .DBF e principalmente quanto aos COMMITs sendo executados.

Quanto ao fato de se usar ou não o CDX e que resultados feitos anteriormente não me levaram a abandonar o seu uso mesmo porque este é um erro intermitente e minhas rotinas não usam o mesmo método empregado no teste afim de provocar o mesmo problema.

Quanto ao fato de voce afirmar que é novata, para com isto, vamos no nivelar no mesmo patamar, eu, voce, Vagucs, Maligno, Dudu, Toledo, Evolver e mais 1500 forenses que tem aqui a sua marca.

Clipper, Registro do Windows, OOP, Harbour com X ou sem X, Fox, muitas vari''aveis de uma mesma esfera, a da programação e repito aqui todos tem o seu valor.

Melhor conhecer um pouco de tudo que que esperar a hora de aprender isto e ser um pouco tarde.

@braços :?)

Criar Índice CDX em Modo Compartilhado

MensagemEnviado: 06 Set 2014 11:15
por rubens
Olá a todos

Sei que é um post antigo (muito antigo), mas acredito que esta solução para o registro ainda seja valida...
Só gostaria de saber como adicioná-la ao meu registro..

Copiei o conteúdo e criei um arquivo .reg e clico duas vezes nele... o windows pergunta se quero mesmo adicioná-lo, respondo que sim mas quando ele vai adicionar dá erro falando que o arquivo não é um script do registro...

Rubens

Criar Índice CDX em Modo Compartilhado

MensagemEnviado: 06 Set 2014 14:29
por rochinha
Amiguinho,

Salve como rede.reg e execute:
Windows Registry Editor Version 5.00

;------------------------------------------------------------------------------------------------------------
;Remove chaves
[-SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Compress Old Files]
[-SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RemoteComputer\NameSpace\ClassId key]

;------------------------------------------------------------------------------------------------------------
;Adiciona ou modifica chaves
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\"
"EnableOpLocks"="0"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\"
"CachedOpenLimit"="0"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkStation\Parameters\"
"UseOpportunisticLocking"="0"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkStation\Parameters\"
"UtilizeNtCaching"="0"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkStation\Parameters\"
"UseLockReadUnlock"="0"

Criar Índice CDX em Modo Compartilhado

MensagemEnviado: 07 Set 2014 17:24
por rubens
Como sempre...
Num tem dúvida... é postar a dúvida/problema e pode contar com a solução...
-:]

Obrigado. Valeu.. um abração...

Rubens