Indexação em rede usando CDX

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

teco
Usuário Nível 1
Usuário Nível 1
Mensagens: 29
Registrado em: 26 Ago 2006 13:43

Indexação em rede usando CDX

Mensagem por teco »

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
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

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.
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

Vc verifica se existe o arquivo CLIENTE.DBF para apagar o CLIENTE.CDX?
Normalmente verificamos se existe o arquivo CDX e se ele existe, apagamos o referido arquivo.

Vc abriu o CLIENTE.DBF sem abrir o respectivo arquivo CDX?
teco
Usuário Nível 1
Usuário Nível 1
Mensagens: 29
Registrado em: 26 Ago 2006 13:43

Mensagem por teco »

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.
Obrigado ao alaminojunior e ao gvc pela atenção.
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. ???? e assim vai alternadamente.
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]
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Meu amigo no inicio de seu prg precisa haver as seguintes linhas:


REQUEST DBFCDX
RDDSETDEFAULT("DBFCDX")
RDDSETDEFAULT("_DBFCDX")
DBSETDRIVER("DBFCDX")
teco
Usuário Nível 1
Usuário Nível 1
Mensagens: 29
Registrado em: 26 Ago 2006 13:43

Mensagem por teco »

alaminojunior escreveu:Meu amigo no inicio de seu prg precisa haver as seguintes linhas:


REQUEST DBFCDX
RDDSETDEFAULT("DBFCDX")
RDDSETDEFAULT("_DBFCDX")
DBSETDRIVER("DBFCDX")
Olá alaminojunior, desculpe a insistência.
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
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

(Desculpe. Vai ter pedrada para meu lado agora.)
Eu sempre tive problema do Clipper 5.2 com o CDX.

Tente o Clipper 5.3.
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

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")
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

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.....
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Mensagem por MARCELOG »

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.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

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
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Mensagem por MARCELOG »

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
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

MARCELOG escreveu:Como não tem uma função do tipo "dbcloseindex()", é necessário fechar o arquivo para que o arquivo índice seja fechado.
ordListClear() ou "set index to".

[]'s
Maligno
http://www.buzinello.com/prg
MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Mensagem por MARCELOG »

Tudo bem. Mas não fecha o índice.
Quer dizer, com essa função, no meu caso, é como se o windows guardasse numa variável os arquivos de índice abertos e não se desfizesse da mesma.
Se você tentar manipular o arquivo dá erro!.

MarceloG
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

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.

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. )

O que estou fazendo de errado ? como posso melhor essa rotina ?

Desde já Agradeço a Todos...
Abraços...
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Responder