Como indexar por campo relacionado.

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

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á

Como indexar por campo relacionado.

Mensagem por Pablo César »

Estou abrindo um novo tópico para atender a uma questão interessante que o colega Ademir fez:
Boa tarde !

Tenho 2 arquivos:

Arq1

Codi N 6
Data D 8

Arq2

Codi N 6
Nome C 60


Existe a possibilidade de se criar um indice para Arq2 dessa forma?

sele Arq2
set relation to Codi into Arq1
inde on Nome + Dtos(Arq1 -> Data) to Arq2x

Grato
Interessante essa questão, mas eu nunca fiz. Você chegou a fazer e não deu certo ?. Não sei fazer com campo relacionado mas para esse caso eu faria da seguinte forma:

Código: Selecionar todos

sele Arq2 
inde on VQNOME(codi) + Dtos(Arq1 -> Data) to Arq2x 

FUNCTION VQNOME(VCOD)
SELE ARQ1
SEEK STRZERO(VCOD,8,0) /* Eu acostumo utiliza o STRZERO, coloque conforme a chave em que foi indexado com a mesma forma e tamanho, este é apenas exemplo */
IF FOUND()
   VRET:=(ARQ1->NOME)
ELSE
   VRET:=CHR(255) // ou simplesmente    VRET:=" "
ENDIF
SELE ARQ2
RETURN VRET
Desculpa Ademir eu publicar aqui pois acho importante compartilhar para que o resto do pessoal possa advir com a mesma necessidade ou parecido. Teste, e nos diga se deu o resultado esperado.

Obs.: Desculpe que demorei em responder, pois tive que re-fazer a minha mensagem pois eu estava no WIN98 e travou, empacou e perdí a mensagem quando tive que desligar (mas isto de desligar foi barberagem minha), mas que o WIN98 é uma droga para INTERNET, isso é !.
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
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 »

Se alguém tiver outra idéia, por favor sinta-se a vontade de postar seu exemplo. Dessa forma todos aprederemos novas técnicas.
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
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Como indexar por campo relacionado.

Mensagem por gvc »

Pablo César escreveu: sele Arq2
inde on VQNOME(codi) + Dtos(Arq1 -> Data) to Arq2x

FUNCTION VQNOME(VCOD)
SELE ARQ1
SEEK STRZERO(VCOD,8,0) /* Eu acostumo utiliza o STRZERO, coloque conforme a chave em que foi indexado com a mesma forma e tamanho, este é apenas exemplo */
IF FOUND()
VRET:=(ARQ1->NOME)
ELSE
VRET:=CHR(255) // ou simplesmente VRET:=" "
ENDIF
SELE ARQ2
RETURN VRET
No seu exemplo específico, vc terá problema pois a chave de indexação terá tamanhos diferentes, dependento do retorno da função.
Eu conheço isso como índice composto. Não é exatamente o que o "médico recomenda". Eu sempre evito de usar essa técnica, mas como não dá para evitar, tente o exemplo abaixo.

...
index on nome + fu_data() to arqx
...

*** Função do Usuário
function fu_data

arq1->(dbseek(arq2->codi))

return(dtos(arq1->data))
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
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 »

Pergunta ao Ademir: cara, pra que exatamente vc quer ou precisa de um índice criado assim? Dá um exemplo (não o código fonte!) de uma situação em que isso seja necessário.
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: Como indexar por campo relacionado.

Mensagem por Pablo César »

gvc escreveu:No seu exemplo específico, vc terá problema pois a chave de indexação terá tamanhos diferentes, dependento do retorno da função.
Não, negativo. Quanto a isso não pois eu não estou fazendo ALLTRIM(arq1->NOME), o retorno ficará igual salvo os registros cujos codi não forem encontrados (que acho um pouco difícil se tomou-se o cuidado de deleção condicional pai/filhos).
gvc escreveu:index on nome + fu_data() to arqx
Gostei, mas irá depender se o segundo arquivo de dados contiver mais do que um registro atendendo ao mesmo codi. Daí não funcionaria.
Eolo escreveu:Pergunta ao Ademir: cara, pra que exatamente vc quer ou precisa de um índice criado assim?
Eu também estou curioso. Lamentávelmente ele tinha feito este questionamento por MP (mas temos que dar um desconto pois ele recém se inscreve no forum, não conhece bem as regras). O jeito é esperar que ele responda a essas perguntas.
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
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

...Eu também estou curioso. Lamentávelmente ele tinha feito este questionamento por MP...
Pois é, de repente está-se discutindo a marca do caminhão, quando talvez não se saiba se vai ser preciso o caminhão...
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 »

Sim, é sempre assim quando o autor do tópico (neste caso eu no nome dele) não responde as mensagem e nós ficamos deduzindo... e buscando a quinta pata ao gato... hihih

:)Pos

Viu os SMILES sumiram... (para que optou no perfil o "Não" para exibição de smiles)
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.
Ademir
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 31 Jul 2007 16:28
Localização: Porto Ferreira-SP

Mensagem por Ademir »

Pessoal, bom dia !


Primeiramente, agradeço a atenção e o interesse por parte de vcs quanto a minha duvida. Então deixa eu explicar exatamente o que preciso:

Tenho dois arquivos Arq1 e Arq2. O Arq1 tem os seguintes campos:

Codi N 6
Data D 8

O Arq2 tem os seguintes campos:

Codi N 6
Nome C 60

No Arq2 terei varios registros com o mesmo Codi. Não quero dar SEEK no nome. Apenas mostrar quando pesquisar por nome em ordem de nome+data. Para isso não quero precisar gravar o campo data tambem no Arq2. Quero mostrar os nomes ordenados, mas quando for o mesmo nome que eles saiam listados em ordem de data. Isso é uma exigencia do cliente. Na verdade, fiz um primeiro teste e funcionou. Indexei por nome + dtos(arq1->data) e funcionou legal. Só estou meio inseguro de colocar para rodar isso no cliente porque nunca tinha feito desta forma. Por isso resolvi consultar o forum para ver se encontrava alguem que ja tivesse testado isso.

Só para ficar mais claro o entendimento, segue um exemplo do conteudo dos arquivos.

Arq1

Data Codi
28/07/2007 1
27/07/2007 2
28/07/2007 3
29/07/2007 4
29/07/2007 5

Arq2

Nome Codi
Zé da silva 1
Joao de Souza 1
Fulano de tal 2
Joao de Souza 2


Na hora de listar por nome, o Joao de Souza com codi=2 seria listado antes do codi=1 devido a sua data ser anterior.


Espero que tenham entendido.

Grato
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 »

Confesso que fiquei sorpreso em ver que esse tipo de indexação é possível. Mas este procedimento não fica lento ?

Eu pensei que esse campo "codi" era para identificar o individuo (pessoa). No arquivo ARQ1, existe algum campo que dê para identificar o individuo ?. Creio que pelo que você ja disse, não tem.

No entanto se você consegiu indexar na boa, então podemos assumir que isto é possível e fica registrado como experiência pros outros. Poderia nos dizer qual é a finalidade do seu aplicativo ?. A quê se destina ?
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.
Ademir
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 31 Jul 2007 16:28
Localização: Porto Ferreira-SP

Mensagem por Ademir »

Então cara acho que vou instalar e colocar em teste no cliente. Como tenho no sistema alem da pesquisa por nome, pesquisa por RG e por CPF/CNPJ vou precisar utilizar a mesma tecnica. O sistema é um indice de atos para Cartorio de notas. O arq1 é o arquivo de atos e o arq2 são os nomes que fazem parte de cada ato. O cliente precisa pesquisar por nome e esses nomes tem que sair listados em ordem de data do ato. Nunca tinha feito algo parecido. Quando resolvi testar e deu certo fiquei no inicio desconfiado. Pesquisei em tudo quanto foi publicação de Clipper. Hoje trabalho com a versao 5.3b. Nem nos manuais existe exemplo de uma indexação dessa forma. Depois de testar te passo o que eu fiz. Acho um assunto interessante para todos.

Um abraço
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 »

Só uma pergunta: esse arquivo de índice, você irá criar-lo toda vez que precisar eitir o relatório ou vai deixa-lo como um índice ativo ?. Porque se for um índice temporário, tem que ser avalido o tamanho do BD e considerar em fazé-lo no local de cada estação (ou atém mesmo com nome aleatório), senão poderá dar erro no caso de dois acessarem ao mesmo tempo e claro se for índice temporário no caso. Mas avalie se é muito utilizado o relatorio e se seu BD é muito grande. Senão estar criando a toda hora, não dá !.
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.
Ademir
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 31 Jul 2007 16:28
Localização: Porto Ferreira-SP

Mensagem por Ademir »

Na verdade vou usar o indice para pesquisa na tela apenas. Nos meus programas, crio todas as rotinas (inclusao/exclusao/alteraçao/pesquisas) tudo na mesma tela, o que torna o sistema menos burocratico na minha opiniao. Assim, este indice sera ativo.

Se eu puder ajudar em alguma duvida, me coloco a disposição de todos.


Um abraço


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

Mensagem por sygecom »

Tche, vou pegar o bonde andando e vou sou dar uma pequena dica.....Ademir, como eu vi que vc já esta usando o Clipper 5.3b ..lhe pergunto vc esta usando o CDX....se tiver vc pode usar o ORDSCOPE() com um indice simples ou com TAG....de uma procurada no forum que tem varios post de como usar o ORDSCOPE().

Abraços
Leonardo Machado
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
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 »

Muito bom seu Ademir, você mostra madurez e conhecimento. Acho que fazer telinha não está com nada, sempre e quando seu sistema não fique limitado a não poder implementar mais recursos ao seu sistema. Mas ficar numa tela só, não vejo mal algum nisso.

Obrigado por compartilhar sua experiência e conhecimento.
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
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

Pablo,

Isto era para ser postado ontem a noite, mas parou tudo aqui.
Sua função esta errada em:

- ARQ1 não tem o campo NOME.

- Sua função VQNOME retorna chr(255) ou " " se não encontrou o registro (seek) na área ARQ1. 1 caracter. E quando encontra, retorna 60 caracteres.

- Eu só tirei o relation e coloquei uma pesquisa dentro de uma função.

- Foi o Eolo que pediu para perguntar "pra que..."

Tá! Tá! Tá! Acho que estou pegando pesado. Então vamos com MUITA calma. Não quero provocar ninguem. Só estou colocando algumas coisas que já "pastei". Eu tb fiquei curioso sobre essa necessidade. Não posso criticar, sem saber a real necessidade do ... Ademir (achei).
Vou dar uma BOA olhada no que o Ademir esta fazendo. Acho que já conheço essa necessidade.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Responder