Inserir registro utilizando valor de um campo externo
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
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
Curtidas 0
Respostas
Edilcimar
19/02/2006
o que vc deve fazer é verificar se o grupamento existe, caso não exista não deixe cadastrar
GOSTEI 0
Flavinha
19/02/2006
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?
Sabe como fazer?
GOSTEI 0
Edilcimar
19/02/2006
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
GOSTEI 0
Flavinha
19/02/2006
Pode ser mais claro?
GOSTEI 0
Edilcimar
19/02/2006
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
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
GOSTEI 0
Flavinha
19/02/2006
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;
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;
GOSTEI 0
Flavinha
19/02/2006
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;
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;
GOSTEI 0
Edilcimar
19/02/2006
Produto := edAgrupd.Text + ´0001´; //é aqui que esta dando erro
só que eu não vi a definição de edAgrupd.Text antes deste local!
só que eu não vi a definição de edAgrupd.Text antes deste local!
GOSTEI 0
Flavinha
19/02/2006
Achei o erro, eu estava esquecendo de abrir a tabela apos o select do bloco with.
Valeu pela atenção Edilcimar.
Valeu pela atenção Edilcimar.
GOSTEI 0