Key Violeition
Bom dia amigos, tenho um sistema de venda com tabela de pedido e tabela de itens de pedido, o que acontece é o seguinte, se por acaso eu for incluir o mesmo produto 2 vezes a tabela da um erro de Key Violeition, a pergunta é tem como eu colocar 2 produtos iguais no pedido sem dar este erro, nao estou conseguindo fazer isto
Grato
Grato
Megamix
Curtidas 0
Respostas
Gandalf.nho
21/01/2005
[b:2a05f6d7fa][color=red:2a05f6d7fa]Notificação de Infração às Regras de Conduta :[/color:2a05f6d7fa][/b:2a05f6d7fa]
Duplicidade
[url]http://delphiforum.icft.com.br/forum/viewtopic.php?p=182133[/url]
Para maiores esclarecimentos pode mandar-me uma [url=http://delphiforum.icft.com.br/forum/privmsg.php?mode=post&u=8378]Mensagem Particular[/url].
Duplicidade
[url]http://delphiforum.icft.com.br/forum/viewtopic.php?p=182133[/url]
Para maiores esclarecimentos pode mandar-me uma [url=http://delphiforum.icft.com.br/forum/privmsg.php?mode=post&u=8378]Mensagem Particular[/url].
GOSTEI 0
Eixox
21/01/2005
acredito que seria da seguinte forma:
1 - primeiro você deverá analisar que você tem uma tabela Master (acredito eu) e uma tabela cliente. O que está acontecendo é uma violação de chave, justamente porque um produto foi cadastrado e o segundo possui a mesma chave. Tudo bem, vamos ver o que se pode fazer.
A - Ao invés de cadastrar automaticamente o produto, você pode fazer uma verificação se ele já foi cadastrado sobre aquele número de pedido; se foi, altere somente os campos Total e Quantidade.
ou então,
B - crie um campo autoincremento que gerará um código para cada item inserido na tabela, assim sendo, a chave primária será refeita com o novo campo e você terá n... números de itens listados no mesmo item.
Qualquer uma das duas formas resolverá o seu problema. Porém se isso for impresso em Notas Fiscais, existe uma obrigatoriedade de agrupamento dos diversos itens. Você não pode lançar 10 itens por exemplo de chaveta, mas sim, uma linha contendo o código, referência, valor unitário, quantidade, descrição e total da peça chaveta.
Já encontrei casos de desenvolver notas fiscais para empresas em municípios diferentes em que inclusive a quantidade de itens para cada nota era estipulado com um número máximo. Eis a vantagem do ECF nesse ponto.
1 - primeiro você deverá analisar que você tem uma tabela Master (acredito eu) e uma tabela cliente. O que está acontecendo é uma violação de chave, justamente porque um produto foi cadastrado e o segundo possui a mesma chave. Tudo bem, vamos ver o que se pode fazer.
A - Ao invés de cadastrar automaticamente o produto, você pode fazer uma verificação se ele já foi cadastrado sobre aquele número de pedido; se foi, altere somente os campos Total e Quantidade.
ou então,
B - crie um campo autoincremento que gerará um código para cada item inserido na tabela, assim sendo, a chave primária será refeita com o novo campo e você terá n... números de itens listados no mesmo item.
Qualquer uma das duas formas resolverá o seu problema. Porém se isso for impresso em Notas Fiscais, existe uma obrigatoriedade de agrupamento dos diversos itens. Você não pode lançar 10 itens por exemplo de chaveta, mas sim, uma linha contendo o código, referência, valor unitário, quantidade, descrição e total da peça chaveta.
Já encontrei casos de desenvolver notas fiscais para empresas em municípios diferentes em que inclusive a quantidade de itens para cada nota era estipulado com um número máximo. Eis a vantagem do ECF nesse ponto.
GOSTEI 0
Eixox
21/01/2005
acredito que seria da seguinte forma:
1 - primeiro você deverá analisar que você tem uma tabela Master (acredito eu) e uma tabela cliente. O que está acontecendo é uma violação de chave, justamente porque um produto foi cadastrado e o segundo possui a mesma chave. Tudo bem, vamos ver o que se pode fazer.
A - Ao invés de cadastrar automaticamente o produto, você pode fazer uma verificação se ele já foi cadastrado sobre aquele número de pedido; se foi, altere somente os campos Total e Quantidade.
ou então,
B - crie um campo autoincremento que gerará um código para cada item inserido na tabela, assim sendo, a chave primária será refeita com o novo campo e você terá n... números de itens listados no mesmo item.
Qualquer uma das duas formas resolverá o seu problema. Porém se isso for impresso em Notas Fiscais, existe uma obrigatoriedade de agrupamento dos diversos itens. Você não pode lançar 10 itens por exemplo de chaveta, mas sim, uma linha contendo o código, referência, valor unitário, quantidade, descrição e total da peça chaveta.
Já encontrei casos de desenvolver notas fiscais para empresas em municípios diferentes em que inclusive a quantidade de itens para cada nota era estipulado com um número máximo. Eis a vantagem do ECF nesse ponto.
1 - primeiro você deverá analisar que você tem uma tabela Master (acredito eu) e uma tabela cliente. O que está acontecendo é uma violação de chave, justamente porque um produto foi cadastrado e o segundo possui a mesma chave. Tudo bem, vamos ver o que se pode fazer.
A - Ao invés de cadastrar automaticamente o produto, você pode fazer uma verificação se ele já foi cadastrado sobre aquele número de pedido; se foi, altere somente os campos Total e Quantidade.
ou então,
B - crie um campo autoincremento que gerará um código para cada item inserido na tabela, assim sendo, a chave primária será refeita com o novo campo e você terá n... números de itens listados no mesmo item.
Qualquer uma das duas formas resolverá o seu problema. Porém se isso for impresso em Notas Fiscais, existe uma obrigatoriedade de agrupamento dos diversos itens. Você não pode lançar 10 itens por exemplo de chaveta, mas sim, uma linha contendo o código, referência, valor unitário, quantidade, descrição e total da peça chaveta.
Já encontrei casos de desenvolver notas fiscais para empresas em municípios diferentes em que inclusive a quantidade de itens para cada nota era estipulado com um número máximo. Eis a vantagem do ECF nesse ponto.
GOSTEI 0
Megamix
21/01/2005
Obrigado amigo
Exatamente isto, cliei um campo antes de tudo chamado item e a cada registro este campo tem que ter um numero diferente tipo 1, depois 2, depois 3, depois 4 e assim por diante, deu tudo certo, so que estou digitando este campo na mao, esta rotina de colocar estes numeros altomaticamente, eu nao estou conseguindo fazer, pois so aparece o numero um, fiz assim Tb_ItensVendaItem.Value:=Tb_ItensVendaItem.Value+1;
Mas nao da ceerto pois ele nao lembra que ja tem um numero na linha de cima do dbgrid, vc pode me dar mais uma maozinha amigo
Grato
Exatamente isto, cliei um campo antes de tudo chamado item e a cada registro este campo tem que ter um numero diferente tipo 1, depois 2, depois 3, depois 4 e assim por diante, deu tudo certo, so que estou digitando este campo na mao, esta rotina de colocar estes numeros altomaticamente, eu nao estou conseguindo fazer, pois so aparece o numero um, fiz assim Tb_ItensVendaItem.Value:=Tb_ItensVendaItem.Value+1;
Mas nao da ceerto pois ele nao lembra que ja tem um numero na linha de cima do dbgrid, vc pode me dar mais uma maozinha amigo
Grato
GOSTEI 0
Eixox
21/01/2005
Vou dar a seguinte dica que consegui a um bom tempo atráz e realmente é de um uso bastante grande.
Você cria uma tabela contendo somente um campo do tipo inteiro;
Essa tabela guardará somente esses nnúmeros.
Após criar a sua tabela, vá no delphi coloque a tabela e faça os devidos links. Após isso defina a propriedade Exclusive para True; Isso permite que somente uma pessoa na rede estará usando a devida tabela;
na sua unit crie a seguinte função - eu crio numa unit em separado para usá-la nos diversos forms.
function MeuFormulario.IncrementaCampos(vTable: TTable; vCampo: String):LongInt;
var
Para: Boolean;
begin
Repeat
Para := True;
try
vTable.Active := True; //Abre a tabela
except
Para := False;
end;
until Para = True;
vTable.Edit;
vTable.FieldByName(vCampo).AsInteger := vTable.FieldByName(vCampo).AsInteger + 1;
vTable.Post;
vTable.Active := False;
end;
Você chamará a rotina com o nome da tabela usada para gerar código e o campo é o nome do campo criado na tabela (ele deve ser chave primária e só ter ele na tabela).
É recomendável que você execute o Refresh e o descarregamento do buffer do teclado através da rotina do DBISaveChanges após o comando post na propriedade AfterPost da tabela.
Para pegar o número só para ver se está funcionando coloque a rotina no evento beforeInsert da tabela que receberá o valor e o atribua ao campo em que ele deverá ser armazenado.
Essa rotina eu consegui a um bom tempo atraz se não me engano aqui no forum do Clube Delphi e ainda uso até hoje para pequenas aplicações em rede e funciona que é uma maravilha.
Você cria uma tabela contendo somente um campo do tipo inteiro;
Essa tabela guardará somente esses nnúmeros.
Após criar a sua tabela, vá no delphi coloque a tabela e faça os devidos links. Após isso defina a propriedade Exclusive para True; Isso permite que somente uma pessoa na rede estará usando a devida tabela;
na sua unit crie a seguinte função - eu crio numa unit em separado para usá-la nos diversos forms.
function MeuFormulario.IncrementaCampos(vTable: TTable; vCampo: String):LongInt;
var
Para: Boolean;
begin
Repeat
Para := True;
try
vTable.Active := True; //Abre a tabela
except
Para := False;
end;
until Para = True;
vTable.Edit;
vTable.FieldByName(vCampo).AsInteger := vTable.FieldByName(vCampo).AsInteger + 1;
vTable.Post;
vTable.Active := False;
end;
Você chamará a rotina com o nome da tabela usada para gerar código e o campo é o nome do campo criado na tabela (ele deve ser chave primária e só ter ele na tabela).
É recomendável que você execute o Refresh e o descarregamento do buffer do teclado através da rotina do DBISaveChanges após o comando post na propriedade AfterPost da tabela.
Para pegar o número só para ver se está funcionando coloque a rotina no evento beforeInsert da tabela que receberá o valor e o atribua ao campo em que ele deverá ser armazenado.
Essa rotina eu consegui a um bom tempo atraz se não me engano aqui no forum do Clube Delphi e ainda uso até hoje para pequenas aplicações em rede e funciona que é uma maravilha.
GOSTEI 0