Duvida qto a execução de um Trigger

Delphi

29/01/2004

Criei uma tabela de Clientes e um Trigger para gerar o codigo do cliente(numero sequencial)....

Estava testando em um ClientDataSet, mas não funcionava, pelo que percebi ele (o trigger), só dispara se eu fizer a inclusão de linha usando o SQLDataSet.

O mais estranho é que eu comecei, de bobeira, a jogar automaticamente o valor zero no codigo, e as linhas seguintes começaram a receber o sequencial , no codigo de cliente,....

Qual seria a meneira mais apropriada de gerar etse sequencial no Interbase, esperando, é claro, que não ocorram erros como acontecem no autoincrement do Paradox. Eu até pensei em gerar uma tabelas de codigos, onde vou incrementando (+1) no momento em que eu salvar o novo ´registro´ da tabela....

Outra duvida, ...., o Interbase suporta bem a inclusçao de imagens em uma tabela de produtos ????

Abraço


Arc

Arc

Curtidas 0

Respostas

Maicongabriel

Maicongabriel

29/01/2004

Eu até pensei em gerar uma tabelas de codigos, onde vou incrementando (+1) no momento em que eu salvar o novo ´registro´ da tabela....
[b:e9b969c9da]Nunca[/b:e9b969c9da] !
Nestes seus ´testes´ você fez uso de ´GENERATORS´ ?


GOSTEI 0
Arc

Arc

29/01/2004

Eu fiz o seguinte no IBConsole....

1)
Create Generator Vcod_cli
Query/Execute;

2)
Set Generator Vcod_cli to 0;
Query/Execute

3)
Set Term ^
Create Trigger
Increm_vcod_cli for Clientes before insert as
begin
New.Cod_cli=Gen.id(vcod_cli,1);
end ^

Qdo eu exceuto a linha

DataModule.CDSCliente.ApplyUpdate(-1) // CDSCliente - ClientDataSet;

O sistema exibe mensagem informando que o campo Cod_cli deve ser preenchido....


ps.: PQ Nunca ???????


GOSTEI 0
Arc

Arc

29/01/2004

Em Gen.id leia-se Gen_id


GOSTEI 0
Arc

Arc

29/01/2004

Alguem pode me ajudar com esta trigger ou me dar alguma outra sugestão para criar codigo autoincremento no Interbase ???

Grato


GOSTEI 0
Maicongabriel

Maicongabriel

29/01/2004

[quote:0f670ff516=´arc´]Eu até pensei em gerar uma tabelas de codigos, onde vou incrementando (+1) no momento em que eu salvar o novo ´registro´ da tabela....
Nunca fazer isso (a ideia que você teve!). O certo é com Generators mesmo, pq é para isso que eles servem! ! [/quote:0f670ff516] :wink:

Este problema da chave primária é comum, pelo modo como o delphi trabalha com os registros, uma boa solução foi dada pelo Afarias em um de seus post´s, veja ::
crie um generator no banco:: CREATE GENERATOR nome_generator; crie a seginte ´função´ no delphi::

function TFormx.GetNewID(const AGenerator: string): Integer;
const
  SQLText = ´select gen_id(¬s, 1) from rdb$database´;
begin
  with IBSQL1 do
  begin
    SQL.Text := Format(SQLText, [AGenerator]);
    Transaction.StartTransaction;
    try
      ExecQuery;
      Result := Fields[0].AsInteger;
    finally
      Transaction.Commit;
    end;
  end;
end;

vc pode substituir o IBSQL por outro componente q esteja usando (que execute SQLs no IB) vc pode usar o seginte código para pegar um novo código (no BeforePost ou OnNewRecord do seu DataSet)::
  SeuDataSet.FieldByName(´CODIGO´).AsInteger := GetNewID(´nome_generator´);
se tiver problemas com ´campo está vazio´ ... defina a propriedade REQUIRED do TField que representa o campo Código para FALSE. T+



GOSTEI 0
Martins

Martins

29/01/2004

A Solução do A. Faria é brilhante, eu mesmo já utilizei essa dica, valeu, resolveu meu problema.

8)

Boa Sorte!


GOSTEI 0
Arc

Arc

29/01/2004

Preciso fazer isso com o ClientDataSet


GOSTEI 0
Arc

Arc

29/01/2004

eu defini a propriedade REQUIRED do TField(campo codigo) para false no clientdataset e a trigger funcionou


GOSTEI 0
Maicongabriel

Maicongabriel

29/01/2004

É claro que funciona, mas existe uns ´porens´
Pergunto::
Após o ´Post´ você fez um refresh dos dados ?
Se sim :: Blz, tudo ok (mas trabalhar com ClientDataSet´s e dar Refresh´s adoidado é loucura!)
Se não :: Então quando tentar inserir un segundo registro, ou atualizar dados sobre este mesmo, o programa lhe retornará um erro de Violação da Chave Primária!

Ah! Isto é claro, se o campo no qual você esta usando Generator é a Chave primária! Não sendo, pode desconciderar tudo isto...


GOSTEI 0
Arc

Arc

29/01/2004

estou fazendo o seguinte:

clientdatasetclientes.active:=true;
clientdatasetclientes.insert;
//insero os dados
clientedataset.applyupdate(-1);
clientdataset.active:=false;

meu codigo é chave primaria


GOSTEI 0
Maicongabriel

Maicongabriel

29/01/2004

clientdatasetclientes.active:=true; { ... } clientdataset.active:=false;


Isso é o ´[b:e0bf33ce5c]refresh[/b:e0bf33ce5c]´, porem como havia dito, é loucura, se é para fazer assim, não preciza utilizar ClientDataSet. Pq toda a funcionalidade do ClientDataSet esta sendo ignorada desta forma, apenas isto...


GOSTEI 0
Arc

Arc

29/01/2004

Devo seguir as suas instruções acima ???? Posso usá-lo no ClientDataSet ???

No exemplo que vi, o autor usava o SQLDataSet, mas usava edit spara inserir as informações , passando para a tabela depois usando parametros.

Eu quero usar o dbedit .....

Porque vc acha Loucura as minhas intruções ???


GOSTEI 0
Maicongabriel

Maicongabriel

29/01/2004

No exemplo que vi, o autor usava o SQLDataSet..... Porque vc acha Loucura as minhas intruções ???

Não acho as suas instruções ´Loucura´, apenas disse isso pelo fato de você estar utilizando o ´ClientDataSet´ para isso! Entende? Se é para fazer assim poderia ser direto no ´SQLDataSet´, sem a nescessidade do ´ClientDataSet´, apenas isso.
Utilize aquilo o que se adequar melhor à sua forma de programar!
Sem mais...
[]´s :D


GOSTEI 0
POSTAR