Como gerar índices com macro?
Enviado: 16 Nov 2007 23:09
Pessoal, estou patinando na elaboração de uma rotina que a princípio me parecia simples. Trata-se de gerar várias indexações em cima de frações de um mesmo campo caracter. Se alguém puder me dar uma luz, ficarei muito grato. Segue abaixo o exemplo:
Antonio Carlos - Curitiba
/*/
Preciso ordenar um campo com 20 caracteres por 10 indices diferentes, sendo
que cada indice correspondera a dois caracteres desse campo. Exemplo:
dados=21122334453424263637 - primeiro indice c/digitos 21
segundo indice c/digitos 12
terceiro indice c/digitos 23
...
Se eu utilizar o formato B abaixo funciona corretamente, mas com o formato B
nao da certo.
Preciso fazer funcionar o Formato A, pois no caso real serao 300 indices
/*/
clear
set decimals to 5
aq1:={}
aadd(aq1,{'seq','N',4,0})
aadd(aq1,{'dados','C',20,0})
dbcreate('teste',aq1)
use teste
zap
for g=1 to 15
string=''
for k=1 to 10
xx=second()*k
string+=right(str(xx),2)
next
inkey(.2)
append blank
replace seq with g
replace dados with string
next
go top
**Formato A - Preciso fazer funcionar neste formato
for g=1 to 10
h='ind'+alltrim(str(g))
index on substr(dados,(g*2)-1,2) to &h for substr(dados,(g*2)-1,2)<>' '
next
**Formato B
*index on substr(dados,1,2) to ind1 for substr(dados,1,2)<>' '
*index on substr(dados,3,2) to ind2 for substr(dados,1,2)<>' '
*index on substr(dados,5,2) to ind3 for substr(dados,1,2)<>' '
*index on substr(dados,7,2) to ind4 for substr(dados,1,2)<>' '
*index on substr(dados,9,2) to ind5 for substr(dados,1,2)<>' '
*index on substr(dados,11,2) to ind6 for substr(dados,1,2)<>' '
*index on substr(dados,13,2) to ind7 for substr(dados,1,2)<>' '
*index on substr(dados,15,2) to ind8 for substr(dados,1,2)<>' '
*index on substr(dados,17,2) to ind9 for substr(dados,1,2)<>' '
*index on substr(dados,19,2) to ind10 for substr(dados,1,2)<>' '
dbedit(4,10,20,68,,'ordem')
Function ordem(modo,ponteiro)
lk:=lastkey()
do case
case modo=4
if lk==27
return(0)
elseif lk==-1
@ 2,0 say 'Indice ... 02'
set index to ind2
return(2)
elseif lk==-2
@ 2,0 say 'Indice ... 03'
set index to ind3
return(2)
elseif lk==-3
@ 2,0 say 'Indice ... 04'
set index to ind4
return(2)
elseif lk==-4
@ 2,0 say 'Indice ... 05'
set index to ind5
return(2)
elseif lk==-5
@ 2,0 say 'Indice ... 06'
set index to ind6
return(2)
elseif lk==-6
@ 2,0 say 'Indice ... 07'
set index to ind7
return(2)
elseif lk==-7
@ 2,0 say 'Indice ... 08'
set index to ind8
return(2)
elseif lk==-8
@ 2,0 say 'Indice ... 09'
set index to ind9
return(2)
elseif lk==-9
@ 2,0 say 'Indice ... 10'
set index to ind10
return(2)
elseif lk==13
**o Enter apaga os digitos referentes ao indice 02 - Tecla F2
xdados=left(dados,2)+' '+right(dados,16)
replace dados with xdados
return(2)
endif
endcase
Antonio Carlos - Curitiba
/*/
Preciso ordenar um campo com 20 caracteres por 10 indices diferentes, sendo
que cada indice correspondera a dois caracteres desse campo. Exemplo:
dados=21122334453424263637 - primeiro indice c/digitos 21
segundo indice c/digitos 12
terceiro indice c/digitos 23
...
Se eu utilizar o formato B abaixo funciona corretamente, mas com o formato B
nao da certo.
Preciso fazer funcionar o Formato A, pois no caso real serao 300 indices
/*/
clear
set decimals to 5
aq1:={}
aadd(aq1,{'seq','N',4,0})
aadd(aq1,{'dados','C',20,0})
dbcreate('teste',aq1)
use teste
zap
for g=1 to 15
string=''
for k=1 to 10
xx=second()*k
string+=right(str(xx),2)
next
inkey(.2)
append blank
replace seq with g
replace dados with string
next
go top
**Formato A - Preciso fazer funcionar neste formato
for g=1 to 10
h='ind'+alltrim(str(g))
index on substr(dados,(g*2)-1,2) to &h for substr(dados,(g*2)-1,2)<>' '
next
**Formato B
*index on substr(dados,1,2) to ind1 for substr(dados,1,2)<>' '
*index on substr(dados,3,2) to ind2 for substr(dados,1,2)<>' '
*index on substr(dados,5,2) to ind3 for substr(dados,1,2)<>' '
*index on substr(dados,7,2) to ind4 for substr(dados,1,2)<>' '
*index on substr(dados,9,2) to ind5 for substr(dados,1,2)<>' '
*index on substr(dados,11,2) to ind6 for substr(dados,1,2)<>' '
*index on substr(dados,13,2) to ind7 for substr(dados,1,2)<>' '
*index on substr(dados,15,2) to ind8 for substr(dados,1,2)<>' '
*index on substr(dados,17,2) to ind9 for substr(dados,1,2)<>' '
*index on substr(dados,19,2) to ind10 for substr(dados,1,2)<>' '
dbedit(4,10,20,68,,'ordem')
Function ordem(modo,ponteiro)
lk:=lastkey()
do case
case modo=4
if lk==27
return(0)
elseif lk==-1
@ 2,0 say 'Indice ... 02'
set index to ind2
return(2)
elseif lk==-2
@ 2,0 say 'Indice ... 03'
set index to ind3
return(2)
elseif lk==-3
@ 2,0 say 'Indice ... 04'
set index to ind4
return(2)
elseif lk==-4
@ 2,0 say 'Indice ... 05'
set index to ind5
return(2)
elseif lk==-5
@ 2,0 say 'Indice ... 06'
set index to ind6
return(2)
elseif lk==-6
@ 2,0 say 'Indice ... 07'
set index to ind7
return(2)
elseif lk==-7
@ 2,0 say 'Indice ... 08'
set index to ind8
return(2)
elseif lk==-8
@ 2,0 say 'Indice ... 09'
set index to ind9
return(2)
elseif lk==-9
@ 2,0 say 'Indice ... 10'
set index to ind10
return(2)
elseif lk==13
**o Enter apaga os digitos referentes ao indice 02 - Tecla F2
xdados=left(dados,2)+' '+right(dados,16)
replace dados with xdados
return(2)
endif
endcase