Dúvidas sobre criação de índices???

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
Marcos
Usuário Nível 3
Usuário Nível 3
Mensagens: 355
Registrado em: 20 Set 2003 09:16
Localização: Cáceres/Mato Grosso

Dúvidas sobre criação de índices???

Mensagem por Marcos »

Olá a todos do fórum, estou precisando de uma informação de suma importância para o meu pequeno sistema, e consequentemente para o meu aprendizado, certo da colaboração dos Senhores aí vai a dúvida:
Na rotina de indexação do meu sistema, ele dá um Pack em todos os arquivos de índices antes de cria-los novamente, isto faz com que a Indexação demore bastante devido a alguns arquivos DBF´S com muitos registros, gostaria de saber se é necessário em todas as Indexações este procedimento? Todas as vezes que o sistema é interrompido por algum erro, é executado a Reorganização onde encontra-se esta rotina que dá o Pack nos arquivos de índices.
Desde já obrigado a todos pela atenção.
Marcos.
Da Roça.
Dudu_XBase
Membro Master
Membro Master
Mensagens: 1071
Registrado em: 25 Ago 2003 16:55

Mensagem por Dudu_XBase »

...cara se vc tem um banco de mais de 100 megas....como eu tenho...se vc precisar reorganizar por causa de indice corrompido...eh bom rodar sem pack....soh pra dar solução rápida...mas...a reorganização msm eh bom usar o pack....
Pérche ?? Porque qdo vc exclui um registro ele fica marcado como excluido certo.....se vc usa o comando set delete on ... para não mostrar os excluídos o q ele faz....ele filtra os regs do dbfs pra naum mostrar os excluidos....se vc tiver mta exclusão nesse banco....vc notara depois de um certo tempo sem "packear" q ele ficara lerdo pra "caramba"..rs...perde performance....isso eu notei....ai coloquei uma rotina q a guardava o ultimo dia reorganizado se desse mais de 4 dias..."pack" no bixo...se vc usa indices Ntx...migre para o CDX ou NSX indices compostos....eles tb saum gerados mais rapidamente q o padrão NTX....espero ter ti ajudado...


________________________________________________________________________________________________________
(Aow Saudade) Clipper 5.2e, Blinker 7, RDD SIXNSX, DBFCDX /Xharbour 1.0, Rdd Mediator (Mysql) Free , RDD Sqlrdd (Sql Server) Comercial
(Hoje) C# Python Sql Server e Oracle




Avatar do usuário
Marcos
Usuário Nível 3
Usuário Nível 3
Mensagens: 355
Registrado em: 20 Set 2003 09:16
Localização: Cáceres/Mato Grosso

Mensagem por Marcos »

Boa Tarde Dudu_XBase, eu uso índices com extensão NSX, mas já deu para eu ter uma idéia a respeito do assunto, só uma outra dúvida: C for organizar somente por causa de Índices Corrompidos é necessário estar em modo Exclusive?
Obrigado pela atenção, foi muito importante sua idéia e experiência.
Abraços,
Marcos
Da Roça.
Dudu_XBase
Membro Master
Membro Master
Mensagens: 1071
Registrado em: 25 Ago 2003 16:55

Mensagem por Dudu_XBase »

Sim sempre reorganize em modo exclusivo...modo compartilhado soh indices temporários...


________________________________________________________________________________________________________
(Aow Saudade) Clipper 5.2e, Blinker 7, RDD SIXNSX, DBFCDX /Xharbour 1.0, Rdd Mediator (Mysql) Free , RDD Sqlrdd (Sql Server) Comercial
(Hoje) C# Python Sql Server e Oracle




ABeltrani
Usuário Nível 2
Usuário Nível 2
Mensagens: 54
Registrado em: 09 Nov 2007 10:05
Localização: Porto Ferreira-SP

Mensagem por ABeltrani »

Boa tarde !

Para indexar um DBF por dois campos numéricos, preciso obrigatoriamente converte-los para string ? Exemplo:

inde on str(codigo)+str(valor) to indice1

Grato
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Dá até pra indexar, mas o resultado não vai ser o que vc tem em mente... Imagina, no registro X, CODIGO=100 e VALOR=50:

Código: Selecionar todos

inde on codigo+valor to indice
* vai ser usado o valor 150 (100+50) no índice...
* e não é isso o que vc quer, certo?

inde on strzero(codigo,5,0)+strzero(valor,7,2) to indice
* vai ser usado o valor '001000050.00' ('00100'+'0050.00') no índice...
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 »

ABeltrani escreveu:Para indexar um DBF por dois campos numéricos, preciso obrigatoriamente converte-los para string ? Exemplo:

inde on str(codigo)+str(valor) to indice1

Grato
Uma chave de índice pode conter valores numéricos. Inclusive combinando dois campos distintos. Mas isso tem aplicação apenas em raríssimas ocasiões, onde essa combinação gere uma informação numérica inteligível.
No entanto, ao combinar valores numéricos convertendo-os para strings, você deve atentar para o método que o compilador usa para comparar strings. Do jeito que demonstrou está correto, embora também se possa usar StrZero(), como demonstrou o Eolo. Providencialmente, a conversão de número para string, por meio de Str(), gera uma string com espaços à esquerda. Se fossem à direita, seria problema na certa.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Providencialmente, a conversão de número para string, por meio de Str(), gera uma string com espaços à esquerda. Se fossem à direita, seria problema na certa.
O que fatalmente aconteceria com o segundo campo. Por isso nesse caso em que o segundo campo em diante for numerico, converta com strzero().
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
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 »

Nem sempre. Vai depender do teor do segundo campo e de como o conjunto é interpretado. Além do quê, somados, os dois mantém seus espaços à esquerda. Trocar os espaços por zeros não muda muita coisa.

Aliás, é sempre bom lembrar que StrZero() consome mais tempo de CPU do que Str(). Como é uma questão acerca de uma chave de índice, que poderá ser processada milhares de vezes, é mais prudente usar StrZero() apenas se for realmente necessário.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Netavin
Usuário Nível 3
Usuário Nível 3
Mensagens: 306
Registrado em: 28 Fev 2007 08:37
Localização: Cacoal-RO

Índices

Mensagem por Netavin »

Boa tarde amigos !
Pegando um gancho aquí no "Índice" ... eu tenho uma rotina de relatório onde imprimo o código e o nome do produto com respectivo subtotal. Porém o nº de identificação não sai em órdem. Estive lendo sobre "Ascend()" mas não aplicá-lo adequadamente. Alias, nunca usei. Como poderia resolver ?
Obrigado !

Netavin

Código: Selecionar todos

Function Rela_tl
LOCAL L, PG, VARI, Linh, Num, Tot
LOCAL VTOTAL:=000000.00
LOCAL VSUBTOTAL:=000000.00

Sele 1
Use CADTORA index placa ,esse

If !File("placa.ntx")
    Index on plac to placa
Else
    Set Index to placa
Endif
If !File("esse.ntx")
    Index on esse to esse
Else
    Set Index to esse
Endif

Set Index to placa, esse
OrdSetFocus(2)
DbGoTop()

Tone(1800,1)

Linh:=0
vDtini:=Ctod(" ")
vDtfin:=Ctod(" ")

DispBox(Linh+37,C+14,Linh+42,C+41,chr(219),"BG/W")
@ Linh+38,C+15 Clear to Linh+41,C+40                                     
Set Cursor on                                                      
@ Linh+39,C+16 Say "Data inicial:" Get vDtini Valid !Empty(vDtini)    
@ Linh+40,C+16 Say "Data final  :" Get vDtfin Valid !Empty(vDtfin)    
Read                                                               

If Lastkey() = 27
    Tone(1700,1)
    Alert("Opera‡Æo abortada!")
    DbCloseAll()
    Return
Endif

Set Exac on

L   :=0
Num :=0
Pg  :=1
Tot :=0
Vari:=esse

Set Print on
Set Filter to Plac >=1 .and. Dtbx >= vDtini .and. Dtbx <= vDtfin
Set Printer to c:\Temp\Ent_tl.txt
Set Console off

Do While !Eof()
    If L =  0
       ? PADC("MADEIREIRA CANELINHA LTDA",80)
       ? "      Relat¢rio de plaquetas baixadas no per¡odo de "+ dtoc(vDtini)  + " a " + Dtoc(vDtfin)
        ? "                       Relat¢rio em "+ dtoc(date()) + " …s "+Left(time(),5)+ "h"
        ? "P g.:" + Alltrim(STR(PG)) + Space(14) + lori
        ? "------------------------------------------------------------------------------"
        ? "  Placa     Roma   M3     Essˆncia          Data Bx"
        ? "------------------------------------------------------------------------------"
        L:=7
    Endif

    If Dtbx < vDtini .or. Dtbx > vDtfin
        Skip
    Endif

    If Alltrim(vari) # Alltrim(esse)
        ? "    Subtotal: " + Transform(vsubtotal, "@e 9,999.999")
        vtotal:=vtotal+vsubtotal
        vsubtotal:=000000.00
        vari:=esse
    Endif

    If Alltrim(vari) = Alltrim(esse)
        ? Space(1),PLAC,Space(2),ROMA,TTM3,Space(1),ESSE, dtbx
        vsubtotal:=vsubtotal + ttm3
    Endif

    Dbskip()
    L++
    Num++

    If Eof()
        ? "    Subtotal: " + Transform(vsubtotal, "@e 9,999.999")
        vtotal:=vtotal + vsubtotal
        vari:=esse
    Endif

Enddo

? "------------------------------------------------------------------------------"
? "Total baixado:" + Transform(vtotal, "@e 9,999.999") + " M3  /  " + Alltrim(Str(Num)) + " toras."

Run Readme c:\Temp\Ent_tl.txt

Set Device to Screen
Set Print off
Set Console on
Set Printer to

DbCloseAll()
Return
TK90 / TK95 / APPLE IIe / 286 / 386 / 486 / 586 / AMD Atlhon
" Sem saber que era impossível, foi lá e fez !! "
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Eu não vi ainda sobre a sua questão de ordenação. Mas ví o final e percebí um erro grande. Você está chamado o REDME.EXE para ler seu arquivo texto antes dele ser finalizado pela sua rotina. Caberia colocar este comando: Run Readme c:\Temp\Ent_tl.txt logo após fechar o SET PRINTER TO (final do seu código)
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Netavin
Usuário Nível 3
Usuário Nível 3
Mensagens: 306
Registrado em: 28 Fev 2007 08:37
Localização: Cacoal-RO

Índices

Mensagem por Netavin »

Olá Pablo!
Então colega. Quando trabalho na construção de qualquer rotina, vou fazendo e testando. Como funcionou da maneira que está ... ficou.
Seguindo sua idéia, fiz as alterações e também funcionou de igual forma.
Aguardo idéias dos colegas para solucionar o problema que escrevi no post inicial.

Muito obrigado !

Netavin
TK90 / TK95 / APPLE IIe / 286 / 386 / 486 / 586 / AMD Atlhon
" Sem saber que era impossível, foi lá e fez !! "
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 »

eu tenho uma rotina de relatório onde imprimo o código e o nome do produto com respectivo subtotal. Porém o nº de identificação não sai em órdem. Estive lendo sobre "Ascend()" mas não aplicá-lo adequadamente. Alias, nunca usei. Como poderia resolver ?
Qual é o formato desse número de identificação? Dê alguns exemplos. A resposta ao seu problema está na comparação ASCII. Certamente você deve estar se esquecendo de alguma coisa. Mas é coisa simples.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Re: Índices

Mensagem por Pablo César »

Netavin escreveu:funcionou da maneira que está ... ficou.
Sim tudo bem, até onde você evoca o README.EXE eu diria que o seu relatório está quase terminado. É porque ja foi gravado, mas lembre que o arquivo estando aberto, ainda está sujeiro a gravar alguma "sujeira" da tela. Digamos então, que seria o mais indicado terminar fechando o direcionamento para arquivo, daí a criação poderiamos dizer que estaria disponível sem sofre interferências.

Seria também BOM você listar a esturas dos DBFs e como o Maligno disse coloque algum exemplo. Para colocar exemplos ou criar o DBF que estão sendo usados no seu código pode ser utilizado as seguintes rotinas Clique aqui para ver, a fim de ser reproduzido e testado fielmente o seu exemplo, Netavin.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Netavin
Usuário Nível 3
Usuário Nível 3
Mensagens: 306
Registrado em: 28 Fev 2007 08:37
Localização: Cacoal-RO

Índices

Mensagem por Netavin »

Salve malígno !!

o formato é numérico inteiro com 5 casas.

Um exemplo de relatório claro estéticamente seria no formato:
placa nome
1450 ipê
1451 ipê
1460 ipê
24345 ipê
... com as placas identificadoras em órdem crescente por exemplo. Poderia ser até em ordem contrária. Não faria diferença, contanto que esteja numa órdem.

Saúde e paz !!
[]´s
Netvin
TK90 / TK95 / APPLE IIe / 286 / 386 / 486 / 586 / AMD Atlhon
" Sem saber que era impossível, foi lá e fez !! "
Responder