Fórum Gerar Código Automaticamente no DBx #131081
25/03/2010
0
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
Curtir tópico
+ 0Posts
25/03/2010
Emerson Nascimento
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
25/03/2010
Wilton Júnior
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
25/03/2010
Emerson Nascimento
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
Clique aqui para fazer login e interagir na Comunidade :)