Chave primária.....

Delphi

11/02/2004

Estou com um problemão...

tenho uma tabela em paradox one no CAMPO NOME...coloquei uma chave primária...

só que presciso duplicar alguns registros ... tipo um nome,.... maria das graças,.. quantas Marias exitem... só que salvo o registro com nome duplicado me dá um erro de chave primária...


como resolver isso, sem ter quer que desabilitar a chave prim....?

GCM...


Gigatel

Gigatel

Curtidas 0

Respostas

Vinicius2k

Vinicius2k

11/02/2004

Colega,

sinto desanimá-lo, mas é impossível... o sentido de uma primarykey ou qualquer outro indice unique é travar a duplicação de registros...
na verdade existe um erro de projeto do seu banco de dados e melhor vc corrigí-lo agora para que não se agrave..

T+


GOSTEI 0
Gigatel

Gigatel

11/02/2004

Presciso de ajuda ....está chave primária serve para uma cisa bem legal que fiz.. funciona assim... tenho um DBCombobox....modifico este para ficar com aparencia de um edit normal.... quando a pessoa digita o nome de um cliente, este vai auto encrementando o restante do nome.... só que isto funciona somente com chave primária no BD...
vejam o código e vê se dá para adptar sem a chave....

procedure T_FormContas.DBComboBox1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
l:Integer;
begin
if (key=VK_BACK) or (key=VK_DELETE) or (key=VK_LEFT) or (key=VK_RIGHT)
or (KEY=vk_home) or (key=VK_END) or (key=VK_SHIFT) or (key=VK_TAB) then exit;
ComboBox1.DroppedDown:=true;
l:=Length(Combobox1.text);
Table1.FindNearEst([combobox1.Text]);
if Copy(Table1.Fieldbyname(´Nome´).asString,1,L)=
Copy(ComboBox1.Text,1,L) then begin
Combobox1.Text:= Table1.Fieldbyname(´nome´).asString;
Combobox1.SelStart:=l;
ComboBox1.SelLength:=Length(ComboBox1.Text)-l;
end;
end;


GCM


GOSTEI 0
Gigatel

Gigatel

11/02/2004

Outra coisa a mensagem de erro que dá é este
´ Table1: Indice corrente não ativo ´...
vou ter que tirar esta chave de qualquer jeito....


GOSTEI 0
Vinicius2k

Vinicius2k

11/02/2004

Tranquilo...
troca o método FindNearest pelo método Locate (é um pouco mais lento pq não usa índice), mas resolve o problema da primarykey...

não me recordo se, realmente, o FindNearest está limitado na primarykey, mas tenho a impressão que não... ou seja se vc definir um índice secundário para o campo nome e dizer pra sua table q o índice dela é este, o FindNearest deve funcionar da mesma forma...

para o locate :
Table1.Locate(´NOME_DO_CAMPO´,combobox1.Text,[]);


T+


GOSTEI 0
Gigatel

Gigatel

11/02/2004

O problema parece que é aki...

if Copy(Table1.Fieldbyname(´Nome´).asString,1,L)=


GOSTEI 0
Vinicius2k

Vinicius2k

11/02/2004

O problema parece que é aki... if Copy(Table1.Fieldbyname(´Nome´).asString,1,L)=


como assim, problema? vc mudou alguma coisa?
T+


GOSTEI 0
Gigatel

Gigatel

11/02/2004

Eu nudei como vc me indicou....


procedure T_FormContas.DBComboBox1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
l:Integer;
begin
if (key=VK_BACK) or (key=VK_DELETE) or (key=VK_LEFT) or (key=VK_RIGHT)
or (KEY=vk_home) or (key=VK_END) or (key=VK_SHIFT) or (key=VK_TAB) then exit;
ComboBox1.DroppedDown:=true;
l:=Length(Combobox1.text);
[url]Table1.FindNearEst([combobox1.Text]); [/url]
if Copy(Table1.Fieldbyname(´Nome´).asString,1,L)=
Copy(ComboBox1.Text,1,L) then begin
Combobox1.Text:= Table1.Fieldbyname(´nome´).asString;
Combobox1.SelStart:=l;
ComboBox1.SelLength:=Length(ComboBox1.Text)-l;
end;
end;


Mas não funcinol... dá o memo erro citado acima.....


GOSTEI 0
Gigatel

Gigatel

11/02/2004

Eu nudei como vc me indicou.... procedure T_FormContas.DBComboBox1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); var l:Integer; begin if (key=VK_BACK) or (key=VK_DELETE) or (key=VK_LEFT) or (key=VK_RIGHT) or (KEY=vk_home) or (key=VK_END) or (key=VK_SHIFT) or (key=VK_TAB) then exit; ComboBox1.DroppedDown:=true; l:=Length(Combobox1.text); [url]Table1.FindNearEst([combobox1.Text]); [/url] if Copy(Table1.Fieldbyname(´Nome´).asString,1,L)= Copy(ComboBox1.Text,1,L) then begin Combobox1.Text:= Table1.Fieldbyname(´nome´).asString; Combobox1.SelStart:=l; ComboBox1.SelLength:=Length(ComboBox1.Text)-l; end; end; Mas não funcinol... dá o memo erro citado acima.....



desculpe errei

é aki
substituí este:

Table1.FindNearEst([combobox1.Text]);

por aquele que tú me endicou...


valeuuu


GOSTEI 0
Vinicius2k

Vinicius2k

11/02/2004

Colega,

desculpe... se a busca é parcial, vc precisa do parametro LoPartialKey para o método Locate... assim :
Table1.Locate(´NOME´,combobox1.Text,[LoPartialKey]);


só q não entendi uma coisa : vc não está usando a rotina no OnKeyUp errado?
pelo q vc postou ela está no OnKeyUP do DBComboBox1, mas o correto não seria no do ComboBox1 ?

T+


GOSTEI 0
POSTAR