Indexação em rede usando CDX
Moderador: Moderadores
Indexação em rede usando CDX
Olá a todos!!!
Essa é minha primeira participação neste forum. Estou com dificuldades na indexação dos indices CDX em rede.
Abro os dbf's em modo exclusivo e após executo:
IF FILE("CLIENTE.DBF")
FERASE("CLIENTE.CDX")
SELECT Cli
PACK
INDEX ON COD_CLI TAG COD TO CLIENTE
INDEX ON NOM_CLI TAG NOM TO CLIENTE
ENDIF
CLOSE ALL
RETURN
A rotina em si não me gera erro, mas quando saio e entro por ex. no cadastro de clientes, da erro de abertura do indice (DOS ERROR 2). Notei que os arquivos CDX, após cada indexação, ora existem e ora não existem !!!!???
Agradeço a ajuda de vcs. :xau
Essa é minha primeira participação neste forum. Estou com dificuldades na indexação dos indices CDX em rede.
Abro os dbf's em modo exclusivo e após executo:
IF FILE("CLIENTE.DBF")
FERASE("CLIENTE.CDX")
SELECT Cli
PACK
INDEX ON COD_CLI TAG COD TO CLIENTE
INDEX ON NOM_CLI TAG NOM TO CLIENTE
ENDIF
CLOSE ALL
RETURN
A rotina em si não me gera erro, mas quando saio e entro por ex. no cadastro de clientes, da erro de abertura do indice (DOS ERROR 2). Notei que os arquivos CDX, após cada indexação, ora existem e ora não existem !!!!???
Agradeço a ajuda de vcs. :xau
- alaminojunior
- Colaborador

- Mensagens: 1717
- Registrado em: 16 Dez 2005 21:26
- Localização: Ubatuba - SP
Obrigado ao alaminojunior e ao gvc pela atenção.alaminojunior escreveu:Este DOS ERROR 2 se dá por não encontrar o tal arquivo.
Poste para nós (já que vc usa CDX) a rotina de abertura dos arquivos e as primeiras linhas de seu PRG, para termos como melhor ajudar.
Coloco abaixo minha rotina de indexação. Como disse anteriormente executo pela primeira vez essa rotina e verifico que todos os arquivos .CDX existem, blz. Numa segunda execução saio do sistema e então os .CDX já não existem mais. Numa terceira execução, pronto lá estão os ditos cujo.
O fato de eu estar verificando a existencia dos .DBF's não interfere em nada, pois eles sempre existem!!!!
No programa principal, uso comandos para a criação destes arquivos com os seus correspondentes .CDX, caso eles não existam.
Agradeço a atenção de todos.
Rotina de Indexação:
Ok := .T.
IF AbreArq("CLIENTE","Cli","E",5); ENDIF
IF AbreArq("MUNICIP","Mun","E",5); ENDIF
IF AbreArq("MODELO","Mod","E",5); ENDIF
IF AbreArq("TIPO","Tip","E",5); ENDIF
IF AbreArq("COR","Cor","E",5); ENDIF
IF !Ok
CLOSE ALL
RETURN
ENDIF
IF FILE("CLIENTE.DBF")
FERASE("CLIENTE.CDX")
SELECT Cli
PACK
INDEX ON COD_CLI TAG COD TO CLIENTE
INDEX ON NOM_CLI TAG NOM TO CLIENTE
ENDIF
IF FILE("MUNICIP.DBF")
FERASE("MUNICIP.CDX")
SELECT Mun
PACK
INDEX ON COD_MUN TAG COD TO MUNICIP; Grafico("MUNICIP.CDX [CODIGO]")
INDEX ON NOM_MUN TAG NOM TO MUNICIP; Grafico("MUNICIP.CDX [NOME]")
ENDIF
IF FILE("MODELO.DBF")
FERASE("MODELO.CDX")
SELECT Mod
PACK
INDEX ON COD_MOD TAG COD TO MODELO; Grafico("MODELO.CDX [CODIGO]")
INDEX ON NOM_MOD TAG NOM TO MODELO; Grafico("MODELO.CDX [NOME]")
ENDIF
IF FILE("TIPO.DBF")
FERASE("TIPO.CDX")
SELECT Tip
PACK
INDEX ON COD_TIP TAG COD TO TIPO; Grafico("TIPO.CDX [CODIGO]")
INDEX ON NOM_TIP TAG NOM TO TIPO; Grafico("TIPO.CDX [NOME]")
ENDIF
IF FILE("COR.DBF")
FERASE("COR.CDX")
SELECT Cor
PACK
INDEX ON COD_COR TAG COD TO COR; Grafico("COR.CDX [CODIGO]")
INDEX ON NOM_COR TAG NOM TO COR; Grafico("COR.CDX [NOME]")
ENDIF
CLOSE ALL
RETURN
//-----------------------------------------------------------------------------
FUNCTION AbreArq(arquivo,area,modo,tempo)
LOCAL cor := SETCOLOR()
LOCAL linha := SAVESCREEN(23,00,23,79)
LOCAL pSempre := (tempo=0)
IF !Ok; RETURN (.F.); ENDIF
SETCOLOR("N/W")
@ 23,01 SAY SPACE(77)
@ 23,02 SAY "Aguarde"
@ 23,09 SAY REPLICATE(".",tempo)
DO WHILE (pSempre .OR. tempo>0) .AND. LASTKEY()!=27
IF modo="E"
USE (arquivo) ALIAS (area) EXCLUSIVE NEW
ELSE
USE (arquivo) ALIAS (area) SHARED NEW
ENDIF
IF !NETERR()
RESTSCREEN(23,00,23,79,linha)
SETCOLOR(cor)
RETURN (.T.)
ENDIF
tempo--
INKEY(1)
IF !pSempre; @ 23,09+tempo SAY " "; ENDIF
ENDDO
SETCOLOR("N*/W")
@ 23,01 SAY SPACE(77)
@ 23,02 SAY "Arquivo n„o dispon¡vel no momento!!!"
INKEY(3)
RESTSCREEN(23,00,23,79,linha)
SETCOLOR(cor)
Ok := .F.
RETURN (.F.)
[/b]
- alaminojunior
- Colaborador

- Mensagens: 1717
- Registrado em: 16 Dez 2005 21:26
- Localização: Ubatuba - SP
Olá alaminojunior, desculpe a insistência.alaminojunior escreveu:Meu amigo no inicio de seu prg precisa haver as seguintes linhas:
REQUEST DBFCDX
RDDSETDEFAULT("DBFCDX")
RDDSETDEFAULT("_DBFCDX")
DBSETDRIVER("DBFCDX")
As referidas linhas existem no começo do primeiro prg do sistema, com exceção da RDDSETDEFAULT("_DBFCDX"), pois utilizo a versão 5.2e com o RTLINK, que talvez seja a causa do problema.
O que realmente acho estranho é que quando NÃO existem os .CDX a rotina os cria, verifico com dir *.cdx e se JÁ existem quando executo a rotina e verifico com dir *.cdx aí vem meu desespero (rssss) não existem mais.
Se por acaso alguem poder me disponibilizar alguma rotina de indexação EM REDE usando CDX, agradeceria desde já.
Meu e-mail é mfrsistemas@hotmail.com
Grato a todos, valeu. :)Pos
- alaminojunior
- Colaborador

- Mensagens: 1717
- Registrado em: 16 Dez 2005 21:26
- Localização: Ubatuba - SP
Como vc pediu, segue aí minha rotina de abertura, porém utilizo Clipper 5.3b+Comix (_DBFCDX)
Function Abre
select 1
use CDSEC000 shar
if (!file("indsec.cdx"))
index on SecCod tag indsec01 to indsec
index on SecDsc tag indsec02 to indsec
endif
DbSetIndex("indsec")
select 2
use CDPRE000 shar
if (!file("indpre.cdx"))
index on PreCod tag indpre01 to indpre
index on PreDsc tag indpre02 to indpre
index on PreSec+PreDsc tag indpre03 to indpre
index on PreMar+PreDsc tag indpre04 to indpre
endif
DbSetIndex("indpre")
Function Abre
select 1
use CDSEC000 shar
if (!file("indsec.cdx"))
index on SecCod tag indsec01 to indsec
index on SecDsc tag indsec02 to indsec
endif
DbSetIndex("indsec")
select 2
use CDPRE000 shar
if (!file("indpre.cdx"))
index on PreCod tag indpre01 to indpre
index on PreDsc tag indpre02 to indpre
index on PreSec+PreDsc tag indpre03 to indpre
index on PreMar+PreDsc tag indpre04 to indpre
endif
DbSetIndex("indpre")
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Buenas Pessoal...tava eu aqui renventando a roda e me deparei com o mesmo problema no nosso colega TECO...ai não me vi por satisfeito e comecei a procurar soluções aqui no forum ...mas não achei nd...entuam...tive que gastar fosfato pra acabar resolvendo a questão.
O problema é que TENHO um arquivo AGENDA.DBF e um AGENDA.CDX e uma hora indexo tah lah o indice outra hora indexo não esta mais. bom resolvi o o problema simplesmente mudando o nome do indice de AGENDA.CDX para AGEN.CDX ......gente até hj eu não sabia disso...por isso achei que eu deveria postar aqui.
Fui.....
O problema é que TENHO um arquivo AGENDA.DBF e um AGENDA.CDX e uma hora indexo tah lah o indice outra hora indexo não esta mais. bom resolvi o o problema simplesmente mudando o nome do indice de AGENDA.CDX para AGEN.CDX ......gente até hj eu não sabia disso...por isso achei que eu deveria postar aqui.
Fui.....
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
-
MARCELOG
- Usuário Nível 4

- Mensagens: 546
- Registrado em: 15 Mar 2005 16:54
- Localização: Divinópolis/MG
Numa rotina de indexação, eu faço o seguinte:
1) Verifico se o arquivo dbf e seu índice está aberto, fechando o mesmo.
2) Apago o arquivo de índice e verifico se operação foi mesmo realizada.
-Já tive problema em fechar o arquivo e o índice para apagá-lo e o Windows, enquanto a aplicação estivesse ativa, não liberava os mesmos, impossibilitando a operação.
3) Reabro o arquivo em modo exclusivo (não precisa, mas garante a integralidade do índice), crio o índice e fecho o arquivo novamente.
5) Pronto.
... Nunca tive problema com cdx e uso clipper 5.2.
Pode ser necessário, em face do seu jeitão de programar, sair do sistema.
No meu caso, após apagar o índice, saio do sistema.
Criei uma rotina para que, na entrada do sistema, se o arquivo índice não existir o mesmo é criado.
É importante avisar o usuário quanto ao acesso no caso de aplicação multiusuária.
Marcelo Giovane.
Ps: apague no braço os arquivos de índices e veja se estão sendo corretamente criados na pasta.
1) Verifico se o arquivo dbf e seu índice está aberto, fechando o mesmo.
2) Apago o arquivo de índice e verifico se operação foi mesmo realizada.
-Já tive problema em fechar o arquivo e o índice para apagá-lo e o Windows, enquanto a aplicação estivesse ativa, não liberava os mesmos, impossibilitando a operação.
3) Reabro o arquivo em modo exclusivo (não precisa, mas garante a integralidade do índice), crio o índice e fecho o arquivo novamente.
5) Pronto.
... Nunca tive problema com cdx e uso clipper 5.2.
Pode ser necessário, em face do seu jeitão de programar, sair do sistema.
No meu caso, após apagar o índice, saio do sistema.
Criei uma rotina para que, na entrada do sistema, se o arquivo índice não existir o mesmo é criado.
É importante avisar o usuário quanto ao acesso no caso de aplicação multiusuária.
Marcelo Giovane.
Ps: apague no braço os arquivos de índices e veja se estão sendo corretamente criados na pasta.
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
MARCELOG, tche eu faço exatamente igual ao que vc disse com exeção que não saio do sistema depois de indexar e uso o CLIPPER 5.3, mas dando umas mexidas em vão me deparei que quando eu colocava o mesmo nome do DBF no INDICE ele tem hora q cria e tem que hora que não cria o indice.....não sei lhe dizer pq...mas sei que estava acontecendo isso aqui comigo...como sempre usei nomes de DBF diferente de indice nunca tive esse problema...e somente essa semana passada quando eu quiz mexer onde não devia que deu isso ai.....
Vc usa o mesmo nome para DBF e CDX ?
Abraços
Vc usa o mesmo nome para DBF e CDX ?
Abraços
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
-
MARCELOG
- Usuário Nível 4

- Mensagens: 546
- Registrado em: 15 Mar 2005 16:54
- Localização: Divinópolis/MG
Sim, eu uso o mesmo nome do dbf para o índice.
Tenho índices com até 45 tag´s (ordens).
Parece que foi aqui no fórum que eu vi o assunto sobre esse problema do windows (98 ou xp) não fechar corretamente os arquivos.
Como não tem uma função do tipo "dbcloseindex()", é necessário fechar o arquivo para que o arquivo índice seja fechado.
Se o arquivo de índice estiver em uso, ainda que somente leitura, não vai ser possível apagá-lo ou criar corretamente o novo índice.
Os registros serão adicionados à ordem existente em duplicidade.
MarceloG
Tenho índices com até 45 tag´s (ordens).
Parece que foi aqui no fórum que eu vi o assunto sobre esse problema do windows (98 ou xp) não fechar corretamente os arquivos.
Como não tem uma função do tipo "dbcloseindex()", é necessário fechar o arquivo para que o arquivo índice seja fechado.
Se o arquivo de índice estiver em uso, ainda que somente leitura, não vai ser possível apagá-lo ou criar corretamente o novo índice.
Os registros serão adicionados à ordem existente em duplicidade.
MarceloG
ordListClear() ou "set index to".MARCELOG escreveu:Como não tem uma função do tipo "dbcloseindex()", é necessário fechar o arquivo para que o arquivo índice seja fechado.
[]'s
Maligno
http://www.buzinello.com/prg
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Marcelo, não quero lhe contrariar...mas abro os DBF em EXCL para poder executar a função de indexar..se caso ele não conseguir abrir ele passa em branco....o estranho é que quando ele consegue abrir em EXCL e eu fizer um aconpanhamento pelo explore ele deleta o arquivo mas não cria ele novamente.....mas na mesma funçao ele as vezes deleta e cria...ou se jah não existir ele cria bonitinho.....vou postar abaixo um exemplo de como eu uso:
Obs:Nessa rotina abaixo se eu colocar o mesmo nome de DBF e INDICE ele dah o problema relatado acima.
O que estou fazendo de errado ? como posso melhor essa rotina ?
Desde já Agradeço a Todos...
Abraços...
Obs:Nessa rotina abaixo se eu colocar o mesmo nome de DBF e INDICE ele dah o problema relatado acima.
Código: Selecionar todos
************
FUNC INDEXAR
************
SET EXCLUSIVE ON
use dados\PAP alias PAP excl new
IF !neterr()
pack
DELETE FILE dados\PAP1.CDX
index on FORNECEDOR TAG 1 TO dados\PAP1 EVAL Progress() every lastrec()/10
index on NUMBOL TAG 2 to dados\PAP1 EVAL Progress() every lastrec()/10
index on TITULO TAG 3 to dados\PAP1 EVAL Progress() every lastrec()/10
index on VENCNF TAG 4 to dados\PAP1 EVAL Progress() every lastrec()/10
index on DATAPG TAG 5 to dados\PAP1 EVAL Progress() every lastrec()/10
index on VALORNF TAG 6 to dados\PAP1 EVAL Progress() every lastrec()/10
index on CODFOR TAG 7 to dados\PAP1 EVAL Progress() every lastrec()/10
index on CODCTA TAG 8 to dados\PAP1 EVAL Progress() every lastrec()/10
index on SITUACAO TAG 9 to dados\PAP1 EVAL Progress() every lastrec()/10
set date BRIT
use
ELSE
@ 16,13 say "ARQUIVO EM USO!" COLOR "R*/W"
ENDIF
*************
FUNC Progress
*************
@ 10,13 SAY " AGUARDE INDEXANDO BANCO DE DADOS " COLOR "R*/W"
@ 11,13 say " 0 10 20 30 40 50 60 70 80 90 100 " COLOR "R*/W"
@ 12,13 say " ÚÙ....³....³....³....³....³....³....³....³....³....À¿ " COLOR "N/W*"
@ 13,13 say " ³ ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±³ " COLOR "N/W*"
@ 14,13 say " ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ " COLOR "N/W*"
@ 13,17 say Replicate("±", RecNo() / LASTREC() * 43 ) COLOR "GR++"
Return ( .t. )
Desde já Agradeço a Todos...
Abraços...
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql

