Icon View Incident Report

Serious Serious
Reported By: Guenter Angerer
Reported On: 3/22/2001
For: Version 2.08 Build 1
# 766 Using RestructureIndexDefs.Add Method in Various Orders May Cause Index Creation to Fail

The following code will demonstrate where an index is not properly created under one of two different scenarios:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, 
Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

uses dbisamtb, db;

procedure TForm1.Button1Click(Sender: TObject);
var lTable: TDBIsamTable;
begin
  lTable := TDBIsamTable.create(nil);
  with lTable do
  try
    TableName := 'bad';
    if Exists then
      DeleteTable;

    with FieldDefs.AddFieldDef do
    begin
      Name := 'ID';
      DataType := ftInteger;
      required := true;
    end;
    with FieldDefs.AddFieldDef do
    begin
      Name := 'TestFirst';
      DataType := ftString;
      Size := 10;
      required := true;
    end;
    with FieldDefs.AddFieldDef do
    begin
      Name := 'TestSecond';
      DataType := ftString;
      Size := 10;
      required := true;
    end;
    CreateTable;

    RestructureIndexDefs.clear;
    RestructureFieldDefs.Update;
    with RestructureIndexDefs do
    begin
      // THE IMPORTANT PART
      Add('Idx_One', 'ID;TestFirst', [], icNone);
      Add('Idx_Two', 'ID;TestSecond', [], icNone);
      Add('Idx_Test', 'ID;TestFirst;TestSecond', [ixPrimary], icNone);
    end;

    RestructureTable(0, 0, 0, 0, false, '', '', 512, -1, true);

  finally
    free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var lTable: TDBIsamTable;
begin
  lTable := TDBIsamTable.create(nil);
  with lTable do
  try
    TableName := 'good';
    if Exists then
      DeleteTable;

    with FieldDefs.AddFieldDef do
    begin
      Name := 'ID';
      DataType := ftInteger;
      required := true;
    end;
    with FieldDefs.AddFieldDef do
    begin
      Name := 'TestFirst';
      DataType := ftString;
      Size := 10;
      required := true;
    end;
    with FieldDefs.AddFieldDef do
    begin
      Name := 'TestSecond';
      DataType := ftString;
      Size := 10;
      required := true;
    end;
    CreateTable;

    RestructureIndexDefs.clear;
    RestructureFieldDefs.Update;
    with RestructureIndexDefs do
    begin
      // THE IMPORTANT PART
      Add('Idx_Test', 'ID;TestFirst;TestSecond', [ixPrimary], icNone);
      Add('Idx_One', 'ID;TestFirst', [], icNone);
      Add('Idx_Two', 'ID;TestSecond', [], icNone);
    end;

    RestructureTable(0, 0, 0, 0, false, '', '', 512, -1, true);

  finally
    free;
  end;
end;

end.



Resolution Resolution
Fixed Problem on 3/23/2001 in version 2.09 build 1
Image