Inserir registro utilizando valor de um campo externo

19/02/2006

0

A questão é a seguinte:

Tenho uma tabela onde controlo o AGRUPAMENTO DOS REGISTROS com a seguinte estrutura:

CREATE TABLE PRODUTOS_DESCR (
AGRUPAMENTO INTEGER NOT NULL,
DESCRICAO DESCR100 NOT NULL /* DESCR100 = VARCHAR(100) */
);



E uma outra tabela onde cadastro os PRODUTOS, com a seguinte estrutura:

CREATE TABLE PRODUTOS (
PRODUTO INTEGER NOT NULL,
AGRUPAMENTO INTEGER NOT NULL,
IDENTIFICACAO DESCR100 NOT NULL /* DESCR100 = VARCHAR(100) */,
DESCRICAO DESCR50 NOT NULL /* DESCR50 = VARCHAR(50) */,
UNIDADE DESCR50 NOT NULL /* DESCR50 = VARCHAR(50) */
);



Na primeira tabela tenho varios AGRUPAMENTOS cadastrados, em que o usuario não terá acesso para inserir/editar, excluir, etc.
Na segunda tabela, ao inserir o registro eu gostaria que o numero do PRODUTO fosse cadastrado da seguinte forma:

AGRUPAMENTOPRODUTO
1001000001
1001000002
1001000003
1011010001
1021010002
1031010003
...
1101100001

Pensei em utilizar o codigo da seguinte forma:

procedure TFrmCadProdutos.btInserirClick(Sender: TObject);
var Prod: String;
Increm: Integer;
begin
with DMod.dsProdutos do
begin
Close;
SelectSQL.Clear;
SelectSQL.Add(´Select * from PRODUTOS´);
SelectSQL.Add(´Where AGRUPAMENTO = ´+QuotedStr(edAgrupd.text);
Open;
end;
Prod := DMod.dsProdutosPRODUTO.Value;
Increm := Strtoint(Prod+1);
DMod.dsProdutos.Insert;
edProduto.text := inttostr(Increm);
end;

Mas se não houver nenhum PRODUTO cadastrado ao AGRUPAMENTO selecionado, o valor do PRODUTO ficará como 1, se tentar inserir mais de uma vez dará um erro de violção de chave primária, alguem teria uma luz pra me dar?

Valeu pela atenção.

Flávia


Flavinha

Flavinha

Responder

Posts

19/02/2006

Edilcimar

o que vc deve fazer é verificar se o grupamento existe, caso não exista não deixe cadastrar


Responder

19/02/2006

Flavinha

Sim, mas por exemplo, se nao houver nenhum registro pro agrupamento 112 e eu for inserir, ao inves do produto ficar como 1120001 ele ficará como 1, e é essa a minha duvida...
Sabe como fazer?


Responder

19/02/2006

Edilcimar

mas é exatamente isto, primeiro vc verifica se o grupamento existe, caso não exista vc não deve permitir o cadastramento, caso exista aí então vc pega o número do grupamento, pega o número de registros neste grupamento, coloca zeros à esquerda e depois concatena com o número do grupamento


Responder

19/02/2006

Flavinha

Pode ser mais claro?


Responder

19/02/2006

Edilcimar

na hora de cadastrar faça o seguinte:
crie uma sql para procurar o grupamento
select * from tabeladogrupamento where campogrupamento = : grupamento
if query1.fieldbyname(´CAMPOGRUPAMENTO´) <> ´´ then
continue a inclusão
else
begin
showmessage(´GRUPAMENTO INEXISTENTE´);
abort;
end;
no continue inclusão faça um select para pegar o último número do grupamento, acrescente 1 e coloque quantos zeros à esquerda quiser e depois contatene o grupamento com esta variável e faça a inclusão


Responder

19/02/2006

Flavinha

procedure TFrmCadProdutos.btInserirClick(Sender: TObject);
var Produto: String;
begin
sbProdutos.Panels[0].Text := ´Inserindo um novo registro´;
with DMod.dsProdutos do
begin
Close;
SelectSQL.Clear;
SelectSQL.Add(´Select * from PRODUTOS´);
SelectSQL.Add(´Where AGRUPAMENTO = ´+QuotedStr(edAgruPD.Text));
end;
if DMod.dsProdutos.RecordCount < 1 then
begin
DMod.dsProdutos.Insert;
Produto := edAgrupd.Text + ´0001´; //é aqui que esta dando erro
edProd.Text := Produto;
end else
if DMod.dsProdutos.RecordCount >=1 then
begin
DMod.dsProdutos.Last;
DMod.dsProdutos.Insert;
Produto := inttostr(DMod.dsProdutosPRODUTO.Value + 1);
edProd.Text := Produto;
end;
end;


Responder

19/02/2006

Flavinha

Tentei usar da seguinte forma, mas está dando erro...


procedure TFrmCadProdutos.btInserirClick(Sender: TObject);
var Produto: String;
begin
sbProdutos.Panels[0].Text := ´Inserindo um novo registro´;
with DMod.dsProdutos do
begin
Close;
SelectSQL.Clear;
SelectSQL.Add(´Select * from PRODUTOS´);
SelectSQL.Add(´Where AGRUPAMENTO = ´+QuotedStr(edAgruPD.Text));
end;
if DMod.dsProdutos.RecordCount < 1 then
begin
DMod.dsProdutos.Insert;
Produto := edAgrupd.Text + ´0001´; //é aqui que esta dando erro
edProd.Text := Produto;
end else
if DMod.dsProdutos.RecordCount >=1 then
begin
DMod.dsProdutos.Last;
DMod.dsProdutos.Insert;
Produto := inttostr(DMod.dsProdutosPRODUTO.Value + 1);
edProd.Text := Produto;
end;
end;


Responder

19/02/2006

Edilcimar

Produto := edAgrupd.Text + ´0001´; //é aqui que esta dando erro
só que eu não vi a definição de edAgrupd.Text antes deste local!


Responder

20/02/2006

Flavinha

Achei o erro, eu estava esquecendo de abrir a tabela apos o select do bloco with.
Valeu pela atenção Edilcimar.


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar