Record Lock Failed !!!!!!!!!!!!
Caros amigos
estou precisando urgente de uma solução
Trabalho com Delphi 5 e acesso um banco paradox, em um determinado momento tenho que alterar alguns caracteres de uma string, por exemplo :
Eu importo do MS-Money um certo relatório gerencial que tenho que aplicar no meu sistema, mas o valor quando é pagamento, isto é negativo, ele vem com a seguinte formatação (5.002,65), e tenho que transformar para - 5.002,65, para isso eu uso StringReplace, até aqui tudo bem, quando eu clicar em botão dou um While de todos os registros da tabelo, quando ele passa para o segundo registro, o Delphi retorno este erro Record Lock Failed, preciso descobrir o pq?
Obs : utilizo Query´s para o acesso e alteração no banco.
A seguir a codificação que eu uso..
procedure TfrmFI49100.btnFiltrarDadosClick(Sender: TObject);
var v_sql, v_valor, v_old_value, v_data, v_texto : string;
v_record, v_i, v_j : integer;
v_data_new : TDatetime;
//v_memo : TMemo;
begin
AniEspera.Active := true;
v_sql := ´delete from Previsto where C_VALOR = ´´´´´;
F_wwQuery(dtmEnges.QGERAL, v_sql, ´E´);
v_sql := ´delete from Previsto where C_VALOR = ´´Montante´´´;
F_wwQuery(dtmEnges.QGERAL, v_sql, ´E´);
v_sql := ´delete from Realizado where C_VALOR = ´´´´´;
F_wwQuery(dtmEnges.QGERAL, v_sql, ´E´);
v_sql := ´delete from Realizado where C_VALOR = ´´Montante´´´;
F_wwQuery(dtmEnges.QGERAL, v_sql, ´E´);
v_sql := ´select * from Previsto´;
F_wwQuery(QSELECT, v_sql, ´O´);
v_j := 0;
while not QSELECT.Eof do
begin
v_j := QSELECT.RecNo;
for v_i := 0 to QSELECT.FieldCount - 1 do
begin //Esta rotina realiza a transformação de aspas simples para acento
//grave, pois o banco de dados Interbase e o Delphi utilizam
//aspas simples para definir string.
if QSELECT.Fields[v_i].ClassName = ´TStringField´ then
begin
v_texto := StringReplace(QSELECT.fieldbyname(
QSELECT.Fields[v_i].FieldName).asstring,
´´´´, ´´´, []);
v_texto := StringReplace(v_texto, ´´´, ´´´, []);
QSELECT.Edit;
QSELECT.fieldbyname(QSELECT.Fields[v_i].FieldName).asstring := v_texto;
end
else if QSELECT.Fields[v_i].ClassName = ´TMemoField´ then
begin
{v_memo := TMemo.Create(self);
v_memo.Parent := frmFI49100;
v_memo.Lines.Add(StringReplace(QSELECT.fieldbyname(
QSELECT.Fields[v_i].FieldName).asstring, ´´´´, ´´´, []));
QSELECT.Edit;
QSELECT.fieldbyname(QSELECT.Fields[v_i].FieldName).asstring := string(v_memo);
v_memo.Free;}
end;
end;
if QSELECT.fieldbyname(´C_DATA´).asstring = ´´ then
begin //esta rotina realiza a alteração da data em branco que vem exportada do Access
//pois quando utilizo a categoria dividir, os registros filhos da divisão vem
//com a data em branco
if v_j <= 1 then
begin
v_record := 2;
end
else
begin
v_record := v_j - 1;
end;
v_sql := ´select * from Previsto´;
F_wwQuery(QAUXILIAR, v_sql, ´O´);
while not QAUXILIAR.Eof do
begin
if QAUXILIAR.RecNo = v_record then
begin
v_data_new := QAUXILIAR.fieldbyname(´C_DATA´).asdatetime;
end;
QAUXILIAR.Next;
end;
QAUXILIAR.Close;
v_record := 0;
QSELECT.Edit;
v_sql := ´update Previsto set C_DATA = ´´´+formatdatetime(´mm/dd/yy´,
v_data_new)+´´´ where ´+
´C_VALOR = ´´´+QSELECT.fieldbyname(´C_VALOR´).asstring+´´+
´´´ and C_FAVORECIDO = ´´´+
QSELECT.fieldbyname(´C_FAVORECIDO´).asstring+´´+
´´´ and C_NUMERO = ´´´+
QSELECT.fieldbyname(´C_NUMERO´).asstring+´´+
´´´ and C_CATEGORIA_1_SUB = ´´´+
QSELECT.fieldbyname(´C_CATEGORIA_1_SUB´).asstring+´´+
´´´ and C_CATEGORIA_2_SUB = ´´´+
QSELECT.fieldbyname(´C_CATEGORIA_2_SUB´).asstring+´´+
´´´ and C_FREQUENCIA = ´´´+
QSELECT.fieldbyname(´C_FREQUENCIA´).asstring+´´+
´´´ and C_CONTA = ´´´+
QSELECT.fieldbyname(´C_CONTA´).asstring+´´´´;
if F_wwQuery(dtmEnges.QGERAL, v_sql, ´E´) then
begin
QSELECT.Next;
end;
end;
v_old_value := QSELECT.fieldbyname(´C_VALOR´).asstring;
v_valor := StringReplace(v_old_value, ´(´, ´-´, []);
v_valor := StringReplace(v_valor, ´)´, ´´, []);
QSELECT.Edit;
v_sql := ´update Previsto set C_VALOR = ´´´+v_valor+´´´ where ´+
´C_VALOR = ´´´+v_old_value+´´´ and C_FAVORECIDO = ´´´+
QSELECT.fieldbyname(´C_FAVORECIDO´).asstring+´´´ and ´+
´C_DATA = ´´´+formatdatetime(´mm/dd/yy´,
QSELECT.fieldbyname(´C_DATA´).asdatetime)+´´+
´´´ and C_NUMERO = ´´´+
QSELECT.fieldbyname(´C_NUMERO´).asstring+´´+
´´´ and C_CATEGORIA_1_SUB = ´´´+
QSELECT.fieldbyname(´C_CATEGORIA_1_SUB´).asstring+´´+
´´´ and C_CATEGORIA_2_SUB = ´´´+
QSELECT.fieldbyname(´C_CATEGORIA_2_SUB´).asstring+´´+
´´´ and C_FREQUENCIA = ´´´+
QSELECT.fieldbyname(´C_FREQUENCIA´).asstring+´´+
´´´ and C_CONTA = ´´´+
QSELECT.fieldbyname(´C_CONTA´).asstring+´´´´;
F_wwQuery(dtmEnges.QGERAL, v_sql, ´E´);
QSELECT.Next;
end;
AniEspera.Active := false;
MessageDlg(´Alterações Realizadas com sucesso!´, mtConfirmation, [mbOk], 0);
end;
Agradeço antecipadamente
Cabelo
estou precisando urgente de uma solução
Trabalho com Delphi 5 e acesso um banco paradox, em um determinado momento tenho que alterar alguns caracteres de uma string, por exemplo :
Eu importo do MS-Money um certo relatório gerencial que tenho que aplicar no meu sistema, mas o valor quando é pagamento, isto é negativo, ele vem com a seguinte formatação (5.002,65), e tenho que transformar para - 5.002,65, para isso eu uso StringReplace, até aqui tudo bem, quando eu clicar em botão dou um While de todos os registros da tabelo, quando ele passa para o segundo registro, o Delphi retorno este erro Record Lock Failed, preciso descobrir o pq?
Obs : utilizo Query´s para o acesso e alteração no banco.
A seguir a codificação que eu uso..
procedure TfrmFI49100.btnFiltrarDadosClick(Sender: TObject);
var v_sql, v_valor, v_old_value, v_data, v_texto : string;
v_record, v_i, v_j : integer;
v_data_new : TDatetime;
//v_memo : TMemo;
begin
AniEspera.Active := true;
v_sql := ´delete from Previsto where C_VALOR = ´´´´´;
F_wwQuery(dtmEnges.QGERAL, v_sql, ´E´);
v_sql := ´delete from Previsto where C_VALOR = ´´Montante´´´;
F_wwQuery(dtmEnges.QGERAL, v_sql, ´E´);
v_sql := ´delete from Realizado where C_VALOR = ´´´´´;
F_wwQuery(dtmEnges.QGERAL, v_sql, ´E´);
v_sql := ´delete from Realizado where C_VALOR = ´´Montante´´´;
F_wwQuery(dtmEnges.QGERAL, v_sql, ´E´);
v_sql := ´select * from Previsto´;
F_wwQuery(QSELECT, v_sql, ´O´);
v_j := 0;
while not QSELECT.Eof do
begin
v_j := QSELECT.RecNo;
for v_i := 0 to QSELECT.FieldCount - 1 do
begin //Esta rotina realiza a transformação de aspas simples para acento
//grave, pois o banco de dados Interbase e o Delphi utilizam
//aspas simples para definir string.
if QSELECT.Fields[v_i].ClassName = ´TStringField´ then
begin
v_texto := StringReplace(QSELECT.fieldbyname(
QSELECT.Fields[v_i].FieldName).asstring,
´´´´, ´´´, []);
v_texto := StringReplace(v_texto, ´´´, ´´´, []);
QSELECT.Edit;
QSELECT.fieldbyname(QSELECT.Fields[v_i].FieldName).asstring := v_texto;
end
else if QSELECT.Fields[v_i].ClassName = ´TMemoField´ then
begin
{v_memo := TMemo.Create(self);
v_memo.Parent := frmFI49100;
v_memo.Lines.Add(StringReplace(QSELECT.fieldbyname(
QSELECT.Fields[v_i].FieldName).asstring, ´´´´, ´´´, []));
QSELECT.Edit;
QSELECT.fieldbyname(QSELECT.Fields[v_i].FieldName).asstring := string(v_memo);
v_memo.Free;}
end;
end;
if QSELECT.fieldbyname(´C_DATA´).asstring = ´´ then
begin //esta rotina realiza a alteração da data em branco que vem exportada do Access
//pois quando utilizo a categoria dividir, os registros filhos da divisão vem
//com a data em branco
if v_j <= 1 then
begin
v_record := 2;
end
else
begin
v_record := v_j - 1;
end;
v_sql := ´select * from Previsto´;
F_wwQuery(QAUXILIAR, v_sql, ´O´);
while not QAUXILIAR.Eof do
begin
if QAUXILIAR.RecNo = v_record then
begin
v_data_new := QAUXILIAR.fieldbyname(´C_DATA´).asdatetime;
end;
QAUXILIAR.Next;
end;
QAUXILIAR.Close;
v_record := 0;
QSELECT.Edit;
v_sql := ´update Previsto set C_DATA = ´´´+formatdatetime(´mm/dd/yy´,
v_data_new)+´´´ where ´+
´C_VALOR = ´´´+QSELECT.fieldbyname(´C_VALOR´).asstring+´´+
´´´ and C_FAVORECIDO = ´´´+
QSELECT.fieldbyname(´C_FAVORECIDO´).asstring+´´+
´´´ and C_NUMERO = ´´´+
QSELECT.fieldbyname(´C_NUMERO´).asstring+´´+
´´´ and C_CATEGORIA_1_SUB = ´´´+
QSELECT.fieldbyname(´C_CATEGORIA_1_SUB´).asstring+´´+
´´´ and C_CATEGORIA_2_SUB = ´´´+
QSELECT.fieldbyname(´C_CATEGORIA_2_SUB´).asstring+´´+
´´´ and C_FREQUENCIA = ´´´+
QSELECT.fieldbyname(´C_FREQUENCIA´).asstring+´´+
´´´ and C_CONTA = ´´´+
QSELECT.fieldbyname(´C_CONTA´).asstring+´´´´;
if F_wwQuery(dtmEnges.QGERAL, v_sql, ´E´) then
begin
QSELECT.Next;
end;
end;
v_old_value := QSELECT.fieldbyname(´C_VALOR´).asstring;
v_valor := StringReplace(v_old_value, ´(´, ´-´, []);
v_valor := StringReplace(v_valor, ´)´, ´´, []);
QSELECT.Edit;
v_sql := ´update Previsto set C_VALOR = ´´´+v_valor+´´´ where ´+
´C_VALOR = ´´´+v_old_value+´´´ and C_FAVORECIDO = ´´´+
QSELECT.fieldbyname(´C_FAVORECIDO´).asstring+´´´ and ´+
´C_DATA = ´´´+formatdatetime(´mm/dd/yy´,
QSELECT.fieldbyname(´C_DATA´).asdatetime)+´´+
´´´ and C_NUMERO = ´´´+
QSELECT.fieldbyname(´C_NUMERO´).asstring+´´+
´´´ and C_CATEGORIA_1_SUB = ´´´+
QSELECT.fieldbyname(´C_CATEGORIA_1_SUB´).asstring+´´+
´´´ and C_CATEGORIA_2_SUB = ´´´+
QSELECT.fieldbyname(´C_CATEGORIA_2_SUB´).asstring+´´+
´´´ and C_FREQUENCIA = ´´´+
QSELECT.fieldbyname(´C_FREQUENCIA´).asstring+´´+
´´´ and C_CONTA = ´´´+
QSELECT.fieldbyname(´C_CONTA´).asstring+´´´´;
F_wwQuery(dtmEnges.QGERAL, v_sql, ´E´);
QSELECT.Next;
end;
AniEspera.Active := false;
MessageDlg(´Alterações Realizadas com sucesso!´, mtConfirmation, [mbOk], 0);
end;
Agradeço antecipadamente
Cabelo
Cabelo
Curtidas 0
Respostas
Luizfernando777
30/09/2003
Caro colega, o formato do seu Valor esta (5.038,85), qdo é negativo,
vc já foi em config. regionais do Windows,
item moeda, formato de núm. negativo,
espero que ajude vc.
vc já foi em config. regionais do Windows,
item moeda, formato de núm. negativo,
espero que ajude vc.
GOSTEI 0
Cabelo
30/09/2003
Caro colega, obrigado, mas o meu problema é o seguinte :
Este campo na tabela não é numérico, ele é string, pq quando eu exporto do MsMoney, ele vem com esse formato quando é número negativo.
(5.000,98) por exemplo.
Se vc puder me ajudar eu agradeço muito..
Este campo na tabela não é numérico, ele é string, pq quando eu exporto do MsMoney, ele vem com esse formato quando é número negativo.
(5.000,98) por exemplo.
Se vc puder me ajudar eu agradeço muito..
GOSTEI 0
Luizfernando777
30/09/2003
function TForm1.Converter(Valor:String):String;
begin
if copy( Edit1.Text, 1, 1 ) = ´(´ then
Result := ´-´+Copy( Valor, 2, length(Valor)-2 )
else
Result := Valor;
end;
Isso fara com que o
valor negativo seja convertido para
-5009,30, se preferir pode alterar conforme a
necessidade
begin
if copy( Edit1.Text, 1, 1 ) = ´(´ then
Result := ´-´+Copy( Valor, 2, length(Valor)-2 )
else
Result := Valor;
end;
Isso fara com que o
valor negativo seja convertido para
-5009,30, se preferir pode alterar conforme a
necessidade
GOSTEI 0