Fórum Gerar Código Automaticamente no DBx #131081

25/03/2010

0

Ola,

Esse é o código que estou utilizando para fazer geração de códigos automaticamente:

function SeqNum(wtipcam:string):integer;
begin
   DM000.CD_Arq999.Active := true;

   DM000.CD_Arq999.Close;
   DM000.Arq999.CommandText := 'Select * from ARQ999 where tipcam = :wtipcam';
   DM000.ARQ999.parambyname('wtipcam').AsString := wtipcam;
   DM000.CD_ARQ999.Open;

   if DM000.CD_ARQ999.IsEmpty then
      begin
      wseqnum := 1;
      DM000.CD_Arq999.Insert;
      DM000.CD_Arq999tipcam.asstring := wtipcam;
      DM000.CD_Arq999seqnum.asinteger := wseqnum;
      DM000.CD_Arq999.Post;
      DM000.CD_Arq999.ApplyUpdates(-1);
      end
   else
      begin
       wseqnum := DM000.CD_Arq999Seqnum.asinteger + 1;
      DM000.CD_Arq999.Edit;
      DM000.CD_Arq999tipcam.asstring := wtipcam;
      DM000.CD_Arq999Seqnum.asinteger := wseqnum;
      DM000.CD_Arq999.Post;
      DM000.CD_Arq999.ApplyUpdates(-1);
      end;

   result := wseqnum;
end;

  A Inserção no banco de dados do código esta funcionando corretamente, o problema é que no update ou seja edit, não esta gravando no banco de dados.

Alguem pode me ajudar nessa dificuldade.

observação:
DM000 é um data modulo
Arq999 é um DataSet, liguei o dataset num DataProvider logo liguei o data provider no clientdataset e um datasource onde liguei o cliente data set.

Wilton Júnior

Wilton Júnior

Responder

Posts

25/03/2010

Emerson Nascimento

simplificando um pouco...
function SeqNum(wtipcam:string):integer;
begin
   DM000.CD_Arq999.Active := true;

   DM000.CD_Arq999.Close;
   DM000.ARQ999.CommandText := 'Select * from ARQ999 where tipcam = :wtipcam';
   DM000.ARQ999.parambyname('wtipcam').AsString := wtipcam;
   DM000.CD_ARQ999.Open;

   wseqnum := DM000.CD_ARQ999Seqnum.asinteger + 1;

   if not DM000.CD_ARQ999.IsEmpty then
      DM000.CD_ARQ999.Edit
   else
   begin
      DM000.CD_ARQ999.Insert;
      DM000.CD_ARQ999tipcam.asstring := wtipcam;
   end;

   DM000.CD_ARQ999Seqnum.asinteger := wseqnum;
   DM000.CD_ARQ999.Post;
   DM000.CD_ARQ999.ApplyUpdates(0);

   result := wseqnum;
end;


agora implemente o evento OnReconcileError do ClientDataset para que você possa ver se ocorreu algum erro ao tentar efetivar a gravação no banco de dados:
procedure TDM000.CD_Arq999ReconcileError(
  DataSet: TCustomClientDataSet; E: EReconcileError; UpdateKind: TUpdateKind;
  var Action: TReconcileAction);
begin
  ShowMessage(E.Message);
end;
Responder

Gostei + 0

25/03/2010

Wilton Júnior

Obrigado pela resposta Sr Emerson, gostei muito da forma simplicada da rotina mas veja, toda vez que eu debugo ela linha a linhha gera um erro "Unabled to find record. No key specified'.

sempre quando seja na DM000.CD_Arq999.ApplyUpdate(0);

Ao executar normalmente ela fica nó código doi e não muda
não faz update.

  pode me ajudar?
Responder

Gostei + 0

25/03/2010

Emerson Nascimento

possivelmente seu Provider está assinalado para atualizar baseado no campo chave (Provider.UpdateMode=upWhereKeyOnly).

nesse caso será necessário indicar ao provider qual(is) é(são) o(s) campo(s) chave.
você faz isso através da propriedade ProviderFlags dos campos ([pfInKey,pfInWhere]).

se não quiser definir quais são os campos chave, altere a propriedade UpdateMode do Provider para upWhereAll.

note que a forma mais eficiente é infomando os campos chave, pois assim a instrução de atualização será otimizada pelo Provider.
Responder

Gostei + 0

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

Aceitar