Gerar Código Automaticamente no DBx
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.
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
Curtidas 0
Respostas
Emerson Nascimento
25/03/2010
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;
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;
GOSTEI 0
Wilton Júnior
25/03/2010
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?
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?
GOSTEI 0
Emerson Nascimento
25/03/2010
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.
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.
GOSTEI 0