Duvida qto a execução de um Trigger
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
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
Curtidas 0
Respostas
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
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 ???????
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
29/01/2004
Em Gen.id leia-se Gen_id
GOSTEI 0
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
Grato
GOSTEI 0
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::
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)::
se tiver problemas com ´campo está vazio´ ... defina a propriedade REQUIRED do TField que representa o campo Código para FALSE.
T+
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;
SeuDataSet.FieldByName(´CODIGO´).AsInteger := GetNewID(´nome_generator´);
GOSTEI 0
Martins
29/01/2004
A Solução do A. Faria é brilhante, eu mesmo já utilizei essa dica, valeu, resolveu meu problema.
8)
Boa Sorte!
8)
Boa Sorte!
GOSTEI 0
Arc
29/01/2004
Preciso fazer isso com o ClientDataSet
GOSTEI 0
Arc
29/01/2004
eu defini a propriedade REQUIRED do TField(campo codigo) para false no clientdataset e a trigger funcionou
GOSTEI 0
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...
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
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
clientdatasetclientes.active:=true;
clientdatasetclientes.insert;
//insero os dados
clientedataset.applyupdate(-1);
clientdataset.active:=false;
meu codigo é chave primaria
GOSTEI 0
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
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 ???
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
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