0

私は次のコードを持っています。コードは車両のリストを調べて各登録のスペースを削除するだけですが、変更する前に、修正された登録が存在しないことを確認する必要があります。次のコードは私が使用しているものです:

unit Main;
interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Menus, cxLookAndFeelPainters, StdCtrls, cxButtons, Gauges, DB,
 DBTables, StrUtils;

type
TfrmMain = class(TForm)
  prgTotal: TGauge;
  btnStart: TcxButton;
  tblVeh: TTable;
  tblVehRegNo: TStringField;
  procedure btnStartClick(Sender: TObject);
private
  procedure OpenTable(pTable: TTable);
  procedure CloseTable(pTable: TTable; pPost: Boolean);
  { Private declarations }
public
  { Public declarations }
end;

var
  frmMain   : TfrmMain;
  lvRegLst  : TStringList;
  lvTblSize : Integer;
  lvOrigReg : String;
  lvNewReg  : String;
  lvTest    : integer;

implementation

{$R *.dfm}

procedure TfrmMain.btnStartClick(Sender: TObject);
begin
  btnStart.Enabled := False;
  lvRegLst  := TStringList.Create;

  // Open Tables
  tblVeh.Open;
  tblVeh.First;

  // Set progress
  prgTotal.MinValue := 0;
  lvTblSize         := tblVeh.RecordCount;
  prgTotal.MaxValue := tblVeh.RecordCount;
  btnStart.Caption  := 'Parsing Registration Numbers...';

  // Conversion
  while not tblVeh.Eof do
  begin
    lvRegLst.Add(tblVehRegNo.AsString);
    tblVeh.Next;
    prgTotal.AddProgress(1);
    Application.ProcessMessages;
  end;

  tblVeh.First;
  lvTest            := lvRegLst.Count;
  prgTotal.Progress := 0;
  btnStart.Caption  := 'Removing Spaces...';

  while not tblVeh.Eof do
  begin
    lvOrigReg := tblVehRegNo.AsString;
    lvNewReg  := AnsiReplaceStr(lvOrigReg,' ','');

    if lvRegLst.IndexOf(lvNewReg) = -1 then
    begin
      tblVeh.Edit;
      tblVehRegNo.AsString := lvNewReg;
      prgTotal.AddProgress(1);
      tblVeh.Post;
    end;

    tblVeh.Next;
    prgtotal.AddProgress(1);
    Application.ProcessMessages;
  end;

  // Close Tables
  tblVeh.Edit;
  tblVeh.Post;
  tblVeh.Close;

  btnStart.Caption := '&Start Conversion';
  btnStart.Enabled := True;
end;

コードをステップスルーしましたが、すべて正常に見え、車両に対する登録が正常に変更されましたが、後でテーブルを見ると、変更は加えられていません。

4

1 に答える 1

0

問題はデータベース自体にあり、「RegNo」が唯一のキーフィールドであることが判明したため、これがデフォルトのインデックスです。私の変換が実行されている間、登録が変更され、「カーソル」が移動し、いくつかの登録がスキップされました。

この変換のために別のインデックスを追加しましたが、データを約50〜60回パスすると、最終的にすべての登録が分類されます。

助けてくれてありがとう。

于 2012-11-02T10:07:35.240 に答える