Página 1 de 2
Dúvidas sobre criação de índices???
Enviado: 06 Ago 2004 11:45
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.
Enviado: 06 Ago 2004 12:35
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...
Enviado: 06 Ago 2004 13:04
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.
Enviado: 06 Ago 2004 23:34
por Dudu_XBase
Sim sempre reorganize em modo exclusivo...modo compartilhado soh indices temporários...
Enviado: 30 Nov 2007 15:01
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
Enviado: 30 Nov 2007 16:56
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...
Enviado: 30 Nov 2007 20:03
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.
Enviado: 01 Dez 2007 10:03
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().
Enviado: 01 Dez 2007 10:41
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.
Índices
Enviado: 03 Dez 2007 15:56
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
Enviado: 03 Dez 2007 16:01
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)
Índices
Enviado: 03 Dez 2007 18:23
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
Enviado: 03 Dez 2007 18:28
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.
Re: Índices
Enviado: 03 Dez 2007 19:34
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.
Índices
Enviado: 03 Dez 2007 19:36
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