Atualizar registro em uma Thread (usando dbExpress)

Delphi

24/06/2011

[b]Boa tarde Sr(a)s ![/b] Tenho uma aplicação em que duas Threads acessam o mesmo banco Firebird (1.5). Para cada Thread criei o trio de componentes dbExpress dinamicamente mais o TSqlConnetion (dinamico também). Coforme abaixo :
var
 smsConecta1  : TSQLConnection;
 smsSqlqry1   : TSQLQuery;
 smsProvider1 : TDataSetProvider;
 smsClient1   : TClientDataSet;
begin
 smsConecta1 := TSQLConnection.Create(Application);
 smsConecta1.Name := 'smsConecta1';
 smsConecta1.ConnectionName := 'BANCO_RECEBE';
 smsConecta1.DriverName := 'Interbase';
 smsConecta1.GetDriverFunc := 'getSQLDriverINTERBASE';
 smsConecta1.LibraryName   := 'dbexpint.dll';
 smsConecta1.LoginPrompt   := FALSE;
 smsConecta1.VendorLib     := 'GDS32.DLL';
 smsConecta1.Params.Values['User_Name'] := 'SYSDBA';
 smsConecta1.Params.Values['Password']  := 'masterkey';
 smsConecta1.Params.Values['Database']  := 'ADMBANCO.FDB';

 smsSqlqry1 := TSQLQuery.Create(Application);
 smsSqlqry1 .Name := 'smsSqlqry';
 smsSqlqry1.SQL.Add('SELECT SITUACAO,MENSAGEM  FROM MENSAGENS ORDER BY  DATA_RECEBIMENTO DESC, HORA_RECEBIMENTO DESC');
 smsSqlqry1.SQLConnection := smsConecta1;
 smsProvider1 := TDataSetProvider.Create(Application);
 smsProvider1.Name := 'smsProvider';
 smsProvider1.DataSet := smsSqlqry1;
 smsClient1 := TClientDataSet.Create(Application);
 smsClient1.Name := 'smsClient';
 smsClient1.ProviderName := 'smsProvider';
 smsClient1.Open;
 .
 .
 .
     smsClient1.Append;
     smsClient1.FieldByName('MENSAGEM').AsString := sMsg2;
     smsClient1.FieldByName('SITUACAO').AsString := 'R';
     smsClient1.Post;
     smsClient1.ApplyUpdates(-1);
     smsClient1.Refresh;
Este trecho exibido é da Thread que faz a inclusão de registros. Ela funciona corretamente. Porém no trecho (na outra Thread)  abaixo onde devo atualizar um registro ele aparentemente faz a alteração mas não grava (não ocorre nenhum erro).
var
 smsConecta  : TSQLConnection;
 smsSqlqry     : TSQLQuery;
 smsProvider  : TDataSetProvider;
 smsClient      : TClientDataSet;
begin
 smsConecta := TSQLConnection.Create(Application);
 smsConecta.Name := 'smsConectaProcessar';
 smsConecta.ConnectionName := 'BANCO_RECEBE';
 smsConecta.DriverName := 'Interbase';
 smsConecta.GetDriverFunc := 'getSQLDriverINTERBASE';
 smsConecta.LibraryName   := 'dbexpint.dll';
 smsConecta.LoginPrompt   := FALSE;
 smsConecta.VendorLib     := 'GDS32.DLL';
 smsConecta.Params.Values['User_Name'] := 'SYSDBA';
 smsConecta.Params.Values['Password']  := 'masterkey';
 smsConecta.Params.Values['Database']  := 'ADMBANCO.FDB';
 smsSqlqry := TSQLQuery.Create(Application);
 smsSqlqry.Name := 'smsSqlqryProcessar'
 smsSqlqry.SQL.Add('SELECT MENSAGEM,SITUACAO  FROM MENSAGENS WHERE SITUACAO = '+ '''R'''+' ORDER BY  DATA_RECEBIMENTO, HORA_RECEBIMENTO');
 smsSqlqry.SQLConnection := smsConecta;
 smsSqlqry.Open;
 smsSqlqry.FieldByName('SITUACAO').ProviderFlags := [pfInUpdate,pfInWhere];
 smsSqlqry.FieldByName('MENSAGEM').ProviderFlags := [pfInUpdate,pfInWhere];

 smsProvider := TDataSetProvider.Create(Application);
 smsProvider.Name := 'smsProviderProcessar';
 smsProvider.DataSet := smsSqlqry;
 smsClient := TClientDataSet.Create(Application);
 smsClient.Name := 'smsClientProcessar';
 smsClient.ProviderName := smsProvider.name;
 while true do
 begin
   smsClient.Open;
   if smsClient.RecordCount > 0 then
   begin
    smsClient.Edit;
    smsClient.FieldByName('MENSAGEM').AsString := strMSgRetorno;
    smsClient.FieldByName('SITUACAO').AsString := 'P';
    smsClient.Post;
    smsClient.ApplyUpdates(-1);
   end;
   smsClient.Close;
end;
O Recordcount nunca diminui e os dados não são gravados. O que pode estar ocorrendo já que consigo Incluir mas não consigo alterar. Desde já agradeço
William Maciel.

William Maciel.

Curtidas 0

Respostas

Wilson Junior

Wilson Junior

24/06/2011

Tente substituir o seu if
if smsClient.RecordCount > 0 then


por

if not smsClient.IsEmpty then


Espero ter colaborado.
GOSTEI 0
POSTAR