Campo primario sem ser unique
como fazer para um campo primario não ser unique, isso é, receber dados repetidos.
Grato pela Atenção
Grato pela Atenção
Gandalf
Curtidas 0
Respostas
Afarias
24/11/2003
*não* faz!!
A condição *fundamental* para uma chave primária é ser ÚNICO!! -- não teria sentido um CADASTRO NACIONAL DE PESSOA FÍSICA (CPF) se pudesse haver duas pessoas com o mesmo número -- então, quando vc enviasse sua declaração de imposto de renda, como o leão ia saber quem é vc???
T+
A condição *fundamental* para uma chave primária é ser ÚNICO!! -- não teria sentido um CADASTRO NACIONAL DE PESSOA FÍSICA (CPF) se pudesse haver duas pessoas com o mesmo número -- então, quando vc enviasse sua declaração de imposto de renda, como o leão ia saber quem é vc???
T+
GOSTEI 0
Gandalf
24/11/2003
bom não to fazendo um programa pra fazenda, e uma tabela que se cadastrar as operaões e o operador não faz tudo de uma vez.
No IBOConsole é so ir em Unique Constraints e remover alinha correspondente.
No IBOConsole é so ir em Unique Constraints e remover alinha correspondente.
GOSTEI 0
Afarias
24/11/2003
|bom não to fazendo um programa pra fazenda, e uma tabela que se
|cadastrar as operaões e o operador não faz tudo de uma vez.
foi só um exemplo! :roll:
|No IBOConsole é so ir em Unique Constraints e remover alinha
|correspondente.
pode até ser q vc consiga realmente ´driblar´ o banco removendo o índice/contraint único(a) criado como suporte a chave primária (o q seria uma falha/bug do IB possivelmente corrigida em versões futuras e muito provavelmente não existente em muitos outros bancos)
Isso -- se realmente for possível -- não quer dizer que esteja certo! Fazer mau uso da ferramenta ou dos conceitos base de modelagem de dados pode tornar seu sistema uma fonte de problemas no futuro.
Só minha opnião.!
T+
|cadastrar as operaões e o operador não faz tudo de uma vez.
foi só um exemplo! :roll:
|No IBOConsole é so ir em Unique Constraints e remover alinha
|correspondente.
pode até ser q vc consiga realmente ´driblar´ o banco removendo o índice/contraint único(a) criado como suporte a chave primária (o q seria uma falha/bug do IB possivelmente corrigida em versões futuras e muito provavelmente não existente em muitos outros bancos)
Isso -- se realmente for possível -- não quer dizer que esteja certo! Fazer mau uso da ferramenta ou dos conceitos base de modelagem de dados pode tornar seu sistema uma fonte de problemas no futuro.
Só minha opnião.!
T+
GOSTEI 0
Gandalf
24/11/2003
mas o banco de dados não e pra te ajudar?
se existem problemas em que o campo primario tem de ser repetido, isso não pode ser um bug, ou não deve ser tratado com um bug, ja que existe a necessidade em certas aplicações de compo primario ser repetido.
na minha aplicação o campo ´operacao´ e o mais importante. poderia ter colocado ele como não primario mas os demais campos (coisas do tipo data, inicio, termino) pode acontecer de vir repetido tbm.
tbm é só uma opinião.
abraços...
se existem problemas em que o campo primario tem de ser repetido, isso não pode ser um bug, ou não deve ser tratado com um bug, ja que existe a necessidade em certas aplicações de compo primario ser repetido.
na minha aplicação o campo ´operacao´ e o mais importante. poderia ter colocado ele como não primario mas os demais campos (coisas do tipo data, inicio, termino) pode acontecer de vir repetido tbm.
tbm é só uma opinião.
abraços...
GOSTEI 0
Afarias
24/11/2003
|mas o banco de dados não e pra te ajudar?
Sim, mas é necessário conhecê-lo. Um alicate de crimpar (cabos de rede) será muito pouco útil para cortar fios elétricos.
|se existem problemas em que o campo primario tem de ser repetido,
|isso não pode ser um bug, ou não deve ser tratado com um bug, ja que
|existe a necessidade em certas aplicações de compo primario ser
|repetido.
Isso não existe!!! Se um campo tem de ser repetido então ele não deve ser CHAVE PRIMÁRIA! *não é sua natureza* -- A questão ai é entender os conceitos.
|na minha aplicação o campo ´operacao´ e o mais importante. poderia ter
|colocado ele como não primario mas os demais campos (coisas do tipo
|data, inicio, termino) pode acontecer de vir repetido tbm.
Ser o mais importante não é ser chave primária. A chave primária em um banco de dados relacional deve identificar únicamente cada tupla (linha).
Se vc pode ter vários registros de mesma operação está claro q esta não é uma chave primária!
No seu caso, vc poderia criar um campo alimentado por um generator para ser sua chave primária -- este campo não tem q ter qualquer ´função de negócio´ (isso é normal e tb uma boa prática) -- servirá ´apenas´ para identificar exclusivamente cada registro!!
Aqui já não é questão de opnião. Se vc não possuir uma chave primária (de verdade) NÃO conseguirá editar um ÚNICO registro (pelo menos com facilidade) -- e não poderá garantir que as operações nesta tabela sejam corretas.
T+
Sim, mas é necessário conhecê-lo. Um alicate de crimpar (cabos de rede) será muito pouco útil para cortar fios elétricos.
|se existem problemas em que o campo primario tem de ser repetido,
|isso não pode ser um bug, ou não deve ser tratado com um bug, ja que
|existe a necessidade em certas aplicações de compo primario ser
|repetido.
Isso não existe!!! Se um campo tem de ser repetido então ele não deve ser CHAVE PRIMÁRIA! *não é sua natureza* -- A questão ai é entender os conceitos.
|na minha aplicação o campo ´operacao´ e o mais importante. poderia ter
|colocado ele como não primario mas os demais campos (coisas do tipo
|data, inicio, termino) pode acontecer de vir repetido tbm.
Ser o mais importante não é ser chave primária. A chave primária em um banco de dados relacional deve identificar únicamente cada tupla (linha).
Se vc pode ter vários registros de mesma operação está claro q esta não é uma chave primária!
No seu caso, vc poderia criar um campo alimentado por um generator para ser sua chave primária -- este campo não tem q ter qualquer ´função de negócio´ (isso é normal e tb uma boa prática) -- servirá ´apenas´ para identificar exclusivamente cada registro!!
Aqui já não é questão de opnião. Se vc não possuir uma chave primária (de verdade) NÃO conseguirá editar um ÚNICO registro (pelo menos com facilidade) -- e não poderá garantir que as operações nesta tabela sejam corretas.
T+
GOSTEI 0
Gandalf
24/11/2003
vc tem razão!!!
o problema e que qualquer consulta que eu fizer no meu banco de dados tera de ser feita por operação, data, refulgo, etc. não tenho a necessidade de diferenciar campos, como na tebela de componentes onde cada uma tem um codigo especifico, com isso um campo sequencial nao me sera util. pos isso perguntei sobre o campo não ser unique. talvez isso me gere problemas no futuro.
o problema e que qualquer consulta que eu fizer no meu banco de dados tera de ser feita por operação, data, refulgo, etc. não tenho a necessidade de diferenciar campos, como na tebela de componentes onde cada uma tem um codigo especifico, com isso um campo sequencial nao me sera util. pos isso perguntei sobre o campo não ser unique. talvez isso me gere problemas no futuro.
GOSTEI 0
Gandalf
24/11/2003
ja que estamos neste debate me ajude aqui:
quando a operação e concluida preciso somar as peças produzidas e inserir no campo de uma outra tabela. o problema e que começam uma operação sem ter concluida a anterior entao os dados ficam espalhados:
operação 10 quantidade X
operação 10 quantidade X
operação 20 quantidade X
operação 30 quantidade X
operação 20 quantidade X
operação 10 quantidade X
etc;
como vou fazer para ele somar as quantidades de peças de determinada operação.
quando a operação e concluida preciso somar as peças produzidas e inserir no campo de uma outra tabela. o problema e que começam uma operação sem ter concluida a anterior entao os dados ficam espalhados:
operação 10 quantidade X
operação 10 quantidade X
operação 20 quantidade X
operação 30 quantidade X
operação 20 quantidade X
operação 10 quantidade X
etc;
como vou fazer para ele somar as quantidades de peças de determinada operação.
GOSTEI 0
Afarias
24/11/2003
select sum(quantidade) from sua_tabela
where operacao = 10;
T+
where operacao = 10;
T+
GOSTEI 0
Gandalf
24/11/2003
valeu pela resposta
isso eu tava ligado, mas como eu coloco isso em uma variavel?
desculpe a chatiação
isso eu tava ligado, mas como eu coloco isso em uma variavel?
desculpe a chatiação
GOSTEI 0
Gandalf
24/11/2003
valeu ja descobri!
GOSTEI 0
Afarias
24/11/2003
uma variável ONDE???
no INTERBASE (SP/Trigger) ::
select sum(quantidade) from sua_tabela
where operacao = 10
into :sua_variavel;
no Delphi (seno o SQL de um componente xxQuery um, o acima) ::
xxQuery1.Open;
sua_variavel := xxQuery1.Fields[0].AsInteger; // ou AsFloat, ...
T+
no INTERBASE (SP/Trigger) ::
select sum(quantidade) from sua_tabela
where operacao = 10
into :sua_variavel;
no Delphi (seno o SQL de um componente xxQuery um, o acima) ::
xxQuery1.Open;
sua_variavel := xxQuery1.Fields[0].AsInteger; // ou AsFloat, ...
T+
GOSTEI 0
Gandalf
24/11/2003
não descobri não
não deu certo
se vc poder me responder.
valeu
não deu certo
se vc poder me responder.
valeu
GOSTEI 0
Afarias
24/11/2003
|se vc poder me responder.
??
veja minha resposta anterior. espero q ajude.
T+
??
veja minha resposta anterior. espero q ajude.
T+
GOSTEI 0
Gandalf
24/11/2003
agora como faço para passar nome da tabela e operacao como parametro?
valeu
valeu
GOSTEI 0
Gandalf
24/11/2003
para facilitar:
como eu faço para passar como paramentro o codigo sql do componente IBQuery?
Grato pela GRANDE atenção;
como eu faço para passar como paramentro o codigo sql do componente IBQuery?
Grato pela GRANDE atenção;
GOSTEI 0
Afarias
24/11/2003
bom, existem muitas formas de fazer isso... é muito específico. Aqui vai só um peq. exemplo::
procedure TxxDataModule.OpenQuery(ATableName: string);
const
SQLText = ´select * from ¬s´;
begin
with xxQuery1 do
begin
Transaction.Commit;
SQL.Text := Format(SQLText, [ATableName]);
Open;
end;
end;
então vc pode fazer::
OpenQuery(´nome_da_tabela);
T+
procedure TxxDataModule.OpenQuery(ATableName: string);
const
SQLText = ´select * from ¬s´;
begin
with xxQuery1 do
begin
Transaction.Commit;
SQL.Text := Format(SQLText, [ATableName]);
Open;
end;
end;
então vc pode fazer::
OpenQuery(´nome_da_tabela);
T+
GOSTEI 0