Chave primária.....
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...
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
Curtidas 0
Respostas
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+
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
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
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
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....
´ Table1: Indice corrente não ativo ´...
vou ter que tirar esta chave de qualquer jeito....
GOSTEI 0
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 :
T+
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
11/02/2004
O problema parece que é aki...
if Copy(Table1.Fieldbyname(´Nome´).asString,1,L)=
if Copy(Table1.Fieldbyname(´Nome´).asString,1,L)=
GOSTEI 0
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
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.....
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
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
11/02/2004
Colega,
desculpe... se a busca é parcial, vc precisa do parametro LoPartialKey para o método Locate... assim :
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+
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