Indexando um arquivo por campo de outro.

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

roneiluft
Usuário Nível 1
Usuário Nível 1
Mensagens: 12
Registrado em: 01 Dez 2011 21:16
Localização: Toledo/Parana

Indexando um arquivo por campo de outro.

Mensagem por roneiluft »

Boa noite, minha dúvida é a seguinte:

Tenho um banco de dados de clientes e nesse banco existe um campo que grava o código da cidade do cliente.
Tenho também um outro banco de cidades, que possue a código e a descrição da cidade.

O que eu preciso é criar um indice do banco de cliente, ordenando pela descrição da cidade.

index on str(cidade,3)+Nome to indclici = banco ordenado pelo codigo da cidade, mais o nome do cliente

preciso que ao inves do codigo da cidade, seja a descricao da cidade, e não sei como se faz isso.

Se alguem puder me ajudar agraço.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Indexando um arquivo por campo de outro.

Mensagem por alxsts »

Olá Ronei.

Seja bem-vindo ao Fórum!

O que você pretende fazer é impossível. Só se pode criar um índice para uma tabela baseado nas colunas da própria tabela.

Sugiro que você crie uma tabela de relacionamento auxiliar onde constariam os campos:
- nome da cidade
- código do cliente
- se precisar coloque a UF ou o código da cidade

Crie um índice pelo nome da cidade.
[]´s
Alexandre Santos (AlxSts)
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á

Indexando um arquivo por campo de outro.

Mensagem por Pablo César »

O que você pretende fazer é impossível
Talvez você não saiba, mas impossível não é. Não que a sua sugestão não seja boa ou talvez mais indicada que a seguinte sugestão (vai depender como e qual propósito):

Você pode indexar e colocar como chave, uma função que localize o codigo e retorne o nome da cidade.
Para isso aconselho criar um novo índice, mas para mantê-lo atualizado você vai ter que disponibilizar a função que estará dentro da chave. Veja como ficaria exemplificando:

Código: Selecionar todos

SELE 1
USE CLIENTES
/*
+-------- CLIENTES.DBF ---------+
| Nr  Nome          Tipo Tam Dec|
+-------------------------------+
| 01 "COD_CLI"     ,"N",003,000 |
| 02 "NOME"        ,"C",036,000 |
| 03 "COD_CID"     ,"N",003,000 |
+------ Nr Registros 5154 ------+
*/
SELE 2
USE CIDADES
/*
+--------- CIDADES.DBF ---------+
| Nr  Nome          Tipo Tam Dec|
+-------------------------------+
| 1  "CODCID"      ,"N",003,000 |
| 2  "NOMCID"      ,"C",030,000 |
+------- Nr Registros 3 --------+
*/
INDEX ON STR(CODCID,3,0) TO CID_001
SELE 1
INDEX ON VQCIDADE(COD_CID)+NOME TO CLI_023
LIST NOME,VQCIDADE(COD_CID) FOR !EMPTY(VQCIDADE(COD_CID))

FUNCTION VQCIDADE(nCid)
SELE 2
SEEK STR(nCid,3,0)
IF FOUND()
   cRet:=(2->NOMCID)
ELSE
   cRet:=SPACE(30)
ENDIF
SELE 1
RETURN cRet
Caberia saber qual seria a necessidade desse índice. Se seria para consulta, para exibição ou se é para localização e alteração. Nada impede de usar, só que se por exemplo precisar alterar no DBU com esse índice especial, vai dai erro porque não vai achar a função VQCIDADE()
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
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Indexando um arquivo por campo de outro.

Mensagem por ANDRIL »

Pablo César escreveu:INDEX ON VQCIDADE(COD_CID)+NOME TO CLI_023
Pablo não testei seu codigo, porem creio que ocorrera um erro aqui na criação do indice. Na area 1 nao tem o campo retornado pela funcao VQCIDADE ocasionara o erro.

Voce estou esta codigo?
Abraços
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
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á

Indexando um arquivo por campo de outro.

Mensagem por Pablo César »

creio que ocorrera um erro aqui na criação do indice. Na area 1 nao tem o campo retornado pela funcao VQCIDADE ocasionara o erro.
Não, não ocorre erro algum. Perceba que a função retorna uma string e não nome de campo algum. Isto funciona sim. Além de ter utilizado essa prática em meu sistema, eu testei sim antes de postar.

Deixo arquivo de teste.exe e o prg que irão criar os dbfs com a estrutura citada para comprovar a minha indicação.

Impressionante mas aí mostra como na realidade funciona o arquivo de índices.
Anexos
TESTES.rar
(104.03 KiB) Baixado 138 vezes
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
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Indexando um arquivo por campo de outro.

Mensagem por ANDRIL »

Pablo, fiz o teste e funcionou certinho sim. Como disse, "creio" postei do celular e nao tinha como fazer o teste na pratica, alem do mais, é uma grata novidade.
Obrigado.
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
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á

Indexando um arquivo por campo de outro.

Mensagem por Pablo César »

postei do celular e nao tinha como fazer o teste na pratica, alem do mais, é uma grata novidade.
Do celular, ohh que chique ! Pois é colega, para mim já era antigo. Mas lembre que a função de procura em outro dbf, tem que estar presente para qualquer consulta e alteração de arquivo. No DBU já não ia ser possível alterar nem pesquisar. Outra coisa, essa função quanto mais implementações tiver, mais vai demorar na composição seja de consulta ou atualização do arquivo. Fico feliz saber que poderá trazer benefícios com a publicação desta "descoberta".
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.
roneiluft
Usuário Nível 1
Usuário Nível 1
Mensagens: 12
Registrado em: 01 Dez 2011 21:16
Localização: Toledo/Parana

Indexando um arquivo por campo de outro.

Mensagem por roneiluft »

Muito obrigado pela dica, será muito util no meu sistema, e isso eu necessito para um relatorio de clientes ordenados pelo nome da cidade.
Responder