Array
(
)

Inserir registro utilizando valor de um campo externo

Flavinha
   - 19 fev 2006

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


Edilcimar
   - 19 fev 2006

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


Flavinha
   - 19 fev 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?


Edilcimar
   - 19 fev 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


Flavinha
   - 19 fev 2006

Pode ser mais claro?


Edilcimar
   - 19 fev 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


Flavinha
   - 19 fev 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;


Flavinha
   - 19 fev 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;


Edilcimar
   - 19 fev 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!


Flavinha
   - 20 fev 2006

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