Página 1 de 1
Indexando um arquivo por campo de outro.
Enviado: 01 Dez 2011 21:26
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.
Indexando um arquivo por campo de outro.
Enviado: 01 Dez 2011 21:56
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.
Indexando um arquivo por campo de outro.
Enviado: 02 Dez 2011 11:02
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()
Indexando um arquivo por campo de outro.
Enviado: 02 Dez 2011 12:40
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
Indexando um arquivo por campo de outro.
Enviado: 02 Dez 2011 13:51
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.
Indexando um arquivo por campo de outro.
Enviado: 02 Dez 2011 14:21
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.
Indexando um arquivo por campo de outro.
Enviado: 02 Dez 2011 14:28
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".
Indexando um arquivo por campo de outro.
Enviado: 03 Dez 2011 12:28
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.