Fórum Campo auto incremento... #283168

28/05/2005

0

E ae galera, blz? O campo auto incremento é um tormento pra quem tá começando, como eu. Tenho uma tela de cadastro de clientes, e o projeto está assim estruturado:

1 - dbxpress - sqlconection, sqldataset, datasetprovider, clientdataset e datasource

2 - No sqldataset, tá assim - insert into clientes(cod_clie, nome, endereco, etc...) values (:cod_clie, :nome, :endereco, etc...)

3 - No interbase, criei a tabela, e também:

GENERATOR GEN_CODCLIENTE FROM CLIENTES;

SET GENERATOR GEN_CODCLIE TO 1;

CREATE TRIGGER ´TRG_CODCLIE´ FOR ´CLIENTES´
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.cod_clie is null) then
new.cod_clie = gen_id(gen_codclie, 1);
end
^

COMMIT WORK ^
SET TERM ;^

4 - No delphi, no clique do botao gravar, tá com os seguintes códigos:

procedure TfrmCadClientes.btnGravarClick(Sender: TObject);
var
TD : TTransactionDesc;
Codigo : integer;
begin
try
td.TransactionID := 1;
td.IsolationLevel := xilreadcommitted;
with dm.cdsIncluirClientes do
begin
dm.Conexao.StartTransaction(TD);

//params.ParamByName(´COD_CLIE´).AsInteger := inttostr(edtCodigo.Text); - foi ignorada depois que tentei colocar com auto incremento.

params.ParamByName(´NOME´).AsString := edtNome.Text;
params.ParamByName(´ENDERECO´).AsString := edtEndereco.Text;
params.ParamByName(´BAIRRO´).AsString := edtBairro.Text;
params.etc...;

dm.cdsIncluirClientes.open;
dm.cdsIncluirClientes.CommandText := ´select max(cod_clie) as codigo from clientes´;
Codigo := dm.sqlClientesCOD_CLIE.AsInteger + 1;
dm.cdsIncluirClientes.close;
edit1.Text := InttoStr(codigo);

execute;
showmessage(´O cliente ´+edtNome.Text+´ foi cadastrado com sucesso!!!´);
dm.Conexao.Commit(TD);
end;
except
on E:Exception do
begin
dm.Conexao.Rollback(td);
showmessage(E.Message);
end;
end;
end;

Gostaria que, qdo clicasse no botão gravar, mostrasse o código gerado no edtCodigo.text, e realmente gravasse na tabela. Sei que estou errando em algum lugar, por isso peço a ajuda de vcs que tem muito mais experiência do que eu.

Fico no aguardo de uma resposta, e desde já agradeço a atenção.

[]´s


Roger1976

Roger1976

Responder

Posts

01/06/2005

Fabioss

Bem, o que vc tem que fazer é o seguinte:

1º - Retire a trigger que aciona o autoincremento pois com ele vc não tem como consegui recuperar o valor do campo que foi inserido;

2º - Crie uma função que busque o generator que vc quer acrescentando (+1), pode ser assim:

function GeraCodigo(Generator: String): String; // Gera novos códigos;
var valor: string;
Begin
With DM.SQLGenerator Do
Begin
Close;
SQL.Clear;
SQL.ADD(´SELECT GEN_ID(´+Generator+´,1) CODIGO FROM RDB$DATABASE´);
Open;
Result:=DM.SQLGenerator.FieldByName(´CODIGO´).AsString;
FmtStr(valor, ´¬.5d´, [StrToInt(Result)]);
Result:=valor;
End;
End;

Essa função já traz o código incrementado(+1) e com a máscara (00000);
É só atribuir o valor do resultado da função a seu edit e mandar gravar na tabela, a questão é que se houver algum problema aquele número já foi descartado, para evitar isso faça um tratamento nos campos obrigatórios.
Espero ter ajudado.


Responder

Gostei + 0

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

Aceitar