Fórum Record Lock Failed !!!!!!!!!!!! #185301

30/09/2003

0

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


Cabelo

Cabelo

Responder

Posts

30/09/2003

Luizfernando777

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.


Responder

Gostei + 0

30/09/2003

Cabelo

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..


Responder

Gostei + 0

30/09/2003

Luizfernando777

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


Responder

Gostei + 0

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

Aceitar