Problemas de inserção em DbGrid e Firebird

Delphi

26/04/2007

Estou utilizando Firebird 2.0, delphi 7, criei uma tela com uma dbgrid, onde será inserida itens do pedido diretamente nela, criei um generator e uma trigger para criação de num. sequencial para não dar problema como quando há repetição de itens, utilizo também componentes dbexpress como SQLDataSet, DataSetProvider, ClientDataSet, enfim, o problema é o seguinte, informo o código, qtde e valor e pulo a linha, o dbgrid faz o salvamento automatico, coloquei o ApllyUpdates no after post, mas quando insiro o segundo item ele me retorna Key Violation, mas antes mesmo do segundo aplyupdates, ou seja, desconfio que ele não salva o campo incrementado, mas olho dentro da base, e eles está lá. Então, onde estou errando, alguém pode me dar uma dica, por favor!!!


Bareja

Bareja

Curtidas 0

Respostas

Paullsoftware

Paullsoftware

26/04/2007

eu faço assim:
dispara o meu gerador...
function NewGen(GenName: String; aConexao:TSQLConnection): integer;
var
  ResultSet: TCustomSQLDataSet;
  SQLstmt: string;
begin
  SQLStmt := ´SELECT CAST(gen_id(´ + GenName + ´,1)as integer) as NewValor from RDB$DATABASE;´;
  ResultSet := nil;
  try
    aConexao.Execute(SQLstmt, nil, @ResultSet);
    if Assigned(ResultSet) then
    begin
      Result := ResultSet.FieldByName(´NewValor´).AsInteger;
    end;
  finally
    ResultSet.Free;
  end;
end; (* NewGen *)


Modo de usar:
NewGen(´Nome_do_Gerador´,SqlConnection1);
no evento [b:5e65ed853c]BeforeUpdateRecord[/b:5e65ed853c] do seu DataSetProvider principal faça mais ou menos como o código abaixo...
  if SourceDS.Name = ´dstFILIAIS´ then
     DeltaDS.FieldByName(´CODIGO´).NewValue   := NewGen(´GEN_FILIAIS_ID´,sqlCONN);
  if SourceDS.Name = ´dstTEXTOS_CONFIG´ then
     DeltaDS.FieldByName(´ID´).NewValue       := NewGen(´GEN_TEXTOS_ID´,sqlCONN);
  if SourceDS.Name = ´dstACERVO´ then
     DeltaDS.FieldByName(´CODIGO´).NewValue   := NewGen(´GEN_ACERVO_ID´,sqlCONN);
  if SourceDS.Name = ´dstATORES´ then
     DeltaDS.FieldByName(´CODIGO´).NewValue    := NewGen(´GEN_ATOR_ID´,sqlCONN);
  if SourceDS.Name = ´dstCATEGORIAS´ then
     DeltaDS.FieldByName(´CODIGO´).NewValue   := NewGen(´GEN_CATEG_ID´,sqlCONN);


além disso eu tb altero as opções do DSP que são:

AutoRefresh = True;
AllowCommandText = True; [i:5e65ed853c]mais nesse caso só útil quando usamos comandos SQL no ClienteDataSet...[/i:5e65ed853c]
PropogateChanges = True;
CascadeUpdates = True;
CascadeDeletes = True;
mais algumas dessas propriedades são necessárias apenas em alguns casos...

espero ter ajudado! :wink:


GOSTEI 0
POSTAR