` Printed Icetips Article

Icetips Article



ABC: Autoincrement on alias files
1998-11-02 -- Jim Gambon
 
Newsgroups: topspeed.products.c5ee.bugs

I have come across a bug that was in C4b and is still in C5EE. This bug
concerns auto incrementing keys on alias files. The bug is in the
FileManager.PrimeRecord method. The method tests to see if the priming is
happening to an alias file. If it is, it primes the "real" file instead (as
it should, so as to use any over-ridden field priming methods in the "real"
file's filemanager.) But, instead of correctly swapping file buffers and
auto incremented numbers back to the alias file, it tends to lose its place
and run time errors may occur - especially if the "real" file and the alias
file are needing to be updated from the same browse or form.

Andrew Guidroz came up with a technique in C4b to solve this problem. I
enhanced it slightly and it works well for what I need. I discovered that
C5EE did not implement Andrew's bug fix when I tried to place two combo
lists on the same form, one from a "real" file and one from an alias of the
same file. The file had two keys - the auto incrementing key and a unique
name key. The alias file would get a "duplicate key" error on the unique
name key if the "real" file buffer was not empty. I tracked the error back
to the same Alias file buffering problem in the PrimeRecord method that
Andrew helped me fix in C4b months ago.

The following is from the C5EE abfile.clw - Filemanager.PrimeRecord method:

  ELSE
      BufferHandle=SELF.AliasedFile.SaveBuffer()
      Result=SELF.AliasedFile.PrimeRecord(SC)
      IF ~Result
        SELF.Buffer=SELF.AliasedFile.Buffer
      END
      SELF.AliasedFile.RestoreBuffer(BufferHandle)
      RETURN Result
  END

The following is the same section with the bug fix (commented).

  ELSE
      BufferHandle=SELF.AliasedFile.SaveBuffer()
  ! Start of Bug Fix 11/11/1998 - Part 1
  ! The following line was added by JMG on 11/11/1998 to correct a
  ! bug caused by not clearing the file buffer when autoincrememting
  ! an Aliased file.
      SELF.AliasedFile.Buffer = SELF.Buffer
  ! End of Fix - Part 1
      Result=SELF.AliasedFile.PrimeRecord(SC)
      IF ~Result
        SELF.Buffer=SELF.AliasedFile.Buffer
  ! Start of Bug Fix 11/10/1998 - Part 2
  ! The following five line were added by JMG for working around a
  ! bug in C4b and C5EE (11/11/1998) concerning AutoInc keys in ALIAS files.
  ! This fix devised by Andrew Guidroz II.
  ! First get the correct position in the ALIASed file
        Self.TryReget(Self.AliasedFile.Position())
  ! Set the AutoInc flags Properly
        Self.Info.AutoIncDone = Self.AliasedFile.Info.AutoIncDone
        Self.AliasedFile.Info.AutoIncDone = 0
  ! Update the Autoinc Flag on both files
        PUT(Self.Info)
        PUT(Self.AliasedFile.Info)
  ! End of Andrew's revisions
  ! End of Fix - Part 2
      END
      SELF.AliasedFile.RestoreBuffer(BufferHandle)
      RETURN Result
  END

If you run across this bug I hope this helps you work around it.

Jim

P.S. Thanks again Andrew for this bug fix.



Printed November 21, 2024, 7:17 am
This article has been viewed/printed 35398 times.
Google search has resulted in 26 hits on this article since January 25, 2004.