Indices para Não-Duplicação
Olá Amigos,
Estou usando o D6 com Zeos e o PostGreSQL e a qualidade do meu sistema está mt superior.
Porém me deparei com um problema que também já tive no FireBird mas gostaria de saber se tem como resolver.
Por exemplo,crio a tabela:
CREATE TABLE TipoDeCobranca
(
tco_codigo INTEGER,
tco_descricao VARCHAR(30) NOT NULL,
constraint pk_tco_codigo primary key (tco_codigo),
constraint uk_tco_descricao unique (tco_descricao)
)
Fazendo desta forma eu incluo na boa mas quando o caracter muda MAIUSCULA/minuscula ele aceita.
Exemplo:
INSERT INTO TipoDeCobranca VALUES (1, ´Carteira´);
INSERT INTO TipoDeCobranca VALUES (2, ´CARTEIRA´);
INSERT INTO TipoDeCobranca VALUES (3, ´CaRtEirA´);
Jà vi em vários lugares que eu poderia criar alguma trigger tipo fazendo um
SELECT COUNT(*) FROM tipodecobranca WHERE UPPER(tco_descricao) = ´tal tal tal´ e comparar.
Mas senhores, não há outra forma de resolver? talvez criando algum indice no campo definindo um Collation diferente? Gostaria que o banco de dados verificasse isto para mim. Teria como?
Pois eu não gostaria de fixar no meu sistema que tudo seja MAIUSCULOS e sem acentuação.
Abraços!!!
Romulo Oliveira Almeida
Estou usando o D6 com Zeos e o PostGreSQL e a qualidade do meu sistema está mt superior.
Porém me deparei com um problema que também já tive no FireBird mas gostaria de saber se tem como resolver.
Por exemplo,crio a tabela:
CREATE TABLE TipoDeCobranca
(
tco_codigo INTEGER,
tco_descricao VARCHAR(30) NOT NULL,
constraint pk_tco_codigo primary key (tco_codigo),
constraint uk_tco_descricao unique (tco_descricao)
)
Fazendo desta forma eu incluo na boa mas quando o caracter muda MAIUSCULA/minuscula ele aceita.
Exemplo:
INSERT INTO TipoDeCobranca VALUES (1, ´Carteira´);
INSERT INTO TipoDeCobranca VALUES (2, ´CARTEIRA´);
INSERT INTO TipoDeCobranca VALUES (3, ´CaRtEirA´);
Jà vi em vários lugares que eu poderia criar alguma trigger tipo fazendo um
SELECT COUNT(*) FROM tipodecobranca WHERE UPPER(tco_descricao) = ´tal tal tal´ e comparar.
Mas senhores, não há outra forma de resolver? talvez criando algum indice no campo definindo um Collation diferente? Gostaria que o banco de dados verificasse isto para mim. Teria como?
Pois eu não gostaria de fixar no meu sistema que tudo seja MAIUSCULOS e sem acentuação.
Abraços!!!
Romulo Oliveira Almeida
Romulocpd
Curtidas 0
Respostas
_rodfaria_
28/11/2005
Apenas uma idéia. Tenha dois campos com a mesma informação. Num você converte para maiúsculas e cria um índice sobre ele. O outro você deixa como foi digitado. Nos seus relatórios você usa o campo ´original´.
Algo assim:
CREATE TABLE TipoDeCobranca
(
tco_codigo INTEGER,
tco_descricao_indice VARCHAR(30) NOT NULL,
tco_descricao_original VARCHAR(30) NOT NULL,
constraint pk_tco_codigo primary key (tco_codigo),
constraint uk_tco_descricao_indice unique (tco_descricao_indice)
)
E faça insert´s assim:
INSERT INTO TipoDeCobranca VALUES (1, Upper(´Carteira´),´Carteira´);
INSERT INTO TipoDeCobranca VALUES (2, Upper(´CARTEIRA´),´CARTEIRA´);
INSERT INTO TipoDeCobranca VALUES (3, Upper(´CaRtEirA´),´CaRtEirA´);
* Substitua Upper pela função correta para maiúsculas. Não me lembro agora.
Algo assim:
CREATE TABLE TipoDeCobranca
(
tco_codigo INTEGER,
tco_descricao_indice VARCHAR(30) NOT NULL,
tco_descricao_original VARCHAR(30) NOT NULL,
constraint pk_tco_codigo primary key (tco_codigo),
constraint uk_tco_descricao_indice unique (tco_descricao_indice)
)
E faça insert´s assim:
INSERT INTO TipoDeCobranca VALUES (1, Upper(´Carteira´),´Carteira´);
INSERT INTO TipoDeCobranca VALUES (2, Upper(´CARTEIRA´),´CARTEIRA´);
INSERT INTO TipoDeCobranca VALUES (3, Upper(´CaRtEirA´),´CaRtEirA´);
* Substitua Upper pela função correta para maiúsculas. Não me lembro agora.
GOSTEI 0
Romulocpd
28/11/2005
Rod,
É uma dica interessante, mas isso até poderia sobrecarregar o banco de dados pois teria que fazer isso para cada indice unico em cada tabela do sistema. O sistema chegará a 103 tabelas até o momento.
É uma dica interessante, mas isso até poderia sobrecarregar o banco de dados pois teria que fazer isso para cada indice unico em cada tabela do sistema. O sistema chegará a 103 tabelas até o momento.
GOSTEI 0
_rodfaria_
28/11/2005
Eu raramente uso campos tipo caracter como chave de tabela.
Normalize (http://www.imasters.com.br/artigo.php?cn=2521&cc=149) seu banco de dados e para evitar este problema do usuário digitar a descrição faça uso de ´dblookup´
Normalize (http://www.imasters.com.br/artigo.php?cn=2521&cc=149) seu banco de dados e para evitar este problema do usuário digitar a descrição faça uso de ´dblookup´
GOSTEI 0
Romulocpd
28/11/2005
Olá,
Veja Rod que não estou usando como chave explicitamente, só quero evitar duplicação.
Imagina no cadastro de Condições de Pagamento o sistema deixar passar:
A VISTA
A Vista
À Vista
Vista
Desta forma só queria que o banco não permitisse, mas independente de Maiusculas e Minusculas, mas talvez eu vou ter que fazer um UPPER mesmo para evitar isso.
Veja Rod que não estou usando como chave explicitamente, só quero evitar duplicação.
Imagina no cadastro de Condições de Pagamento o sistema deixar passar:
A VISTA
A Vista
À Vista
Vista
Desta forma só queria que o banco não permitisse, mas independente de Maiusculas e Minusculas, mas talvez eu vou ter que fazer um UPPER mesmo para evitar isso.
GOSTEI 0
Joni Nunes
28/11/2005
Por que vc simplesmente nao define um padrão para o seu sistema, por exemplo, só permitir informações em MAIUSCULO, assim vc evitaria esses problemas, até por que, qual usuário iria necessitar do nome de um produto ou de um cliente escrito assim ´JoNi´.
Resumindo a história e mostrando algo de útil efetivamente, vai lá:
1. Defina padrões para o seu sistema;
2. Crie uma constraint no banco para evitar a duplicidade;
É isso ai, espero ter colaborado de alguma forma.
Resumindo a história e mostrando algo de útil efetivamente, vai lá:
1. Defina padrões para o seu sistema;
2. Crie uma constraint no banco para evitar a duplicidade;
É isso ai, espero ter colaborado de alguma forma.
GOSTEI 0
Romulocpd
28/11/2005
Fala Junifoz,
Este foi o caminho que tive que fazer, o sistema é tudo em Maiusculo e nao tem acentuação. Daí pra nao ter problema, vai ter cliente que vai reclamar mas nao tem outro caminho.
Vlw
Este foi o caminho que tive que fazer, o sistema é tudo em Maiusculo e nao tem acentuação. Daí pra nao ter problema, vai ter cliente que vai reclamar mas nao tem outro caminho.
Vlw
GOSTEI 0