My understanding of the hashed concept is that once the group is calculated
based on normalizing the ID and dividing by the modulo, a binary search
occurs through the sorted ID's within the group to locate the real record
id.  Therefore a collision could only occur if truncation of an ID created
an ID that already existed elsewhere.  (This is why lists are stored as the
ID's of records, rather that the group number and record number within that
group.)

This could be averted by doing a read of the new ID after truncation and
before deleting or writing the record with the new ID, and if it was found
to already exist, abort that transaction and issue a warning of collision.

Or perhaps I just misunderstood your point....I got the Monday morning blues
going on here.

        *=aee=*

-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] Behalf Of Dean Fox
Sent: Monday, December 13, 2004 11:04
To: '[EMAIL PROTECTED]'
Subject: RE: [U2] LOOP or GOTO on READNEXT


Your understanding of the BASIC select is correct. It starts in group one
and works it's way down.  In my early years of PICK programming I learned
this the hard way.  As this user hasn't yet seen adverse effects is luck vs.
design.

Probably because of the a change to the least significant portion of the ID
(hash wise) and the number of groups vs. items, they're all hashing to the
same group after the ID change.

In a similar test where the new ID would hash to a forward group, in the
code provided, it would be deleted. Been there, done that and now know
better.

-[d]-

-----Original Message-----
From: Derek Falkner [mailto:[EMAIL PROTECTED]
Sent: Monday, December 13, 2004 11:16 AM
To: [EMAIL PROTECTED]
Subject: RE: [U2] LOOP or GOTO on READNEXT


Karl,

I cannot speak to the issue of speed but I am concerned about the safety of
either process; I believe you may end up with missing employees!

I believe the BASIC SELECT sets a pointer at the start of group 1 and steps
it through each item in that group before moving on to group 2. What could
happen is that the record with the new 6 digit key is written to a later
group and the item with the old key is deleted. Later, the SELECT would pick
up the new employee and, even though it already has a 6-digit key, would
write it back to the file and then immediately delete it!

I would prefer to see a TCL-style SELECT be performed instead of the BASIC
SELECT, e.g. PERFORM "SELECT CUSTEMP" instead of SELECT CF. This will
definitely not select any of the newly-created items, though it would also
fail if any employees on file already had 6-digit keys.

Alternatively, you could check the new item key differs from the original
item key before deleting an item.
E.g.       write REC on CF,NK
         if K # NK then
            delete CF,K
         end

If my understanding of the BASIC SELECT is wrong I would be happy if someone
on this list could enlighten me.

Oh, and I must add that I much prefer the LOOP ... REPEAT syntax too! I
wouldn't imagine there would be much difference in speed and I find it
easier to write/debug.

Thanks for the interesting question!

Derek Falkner
Kingston, Ontario, Canada


-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of
[EMAIL PROTECTED]
Sent: Monday, December 13, 2004 10:33 AM
To: [EMAIL PROTECTED]
Subject: [U2] LOOP or GOTO on READNEXT


I've seen 2 ways to read a client key, change the length to 6 digits, then
write it back out, delete the old one and move on:

EXAMPLE 1 of 2:
!(FIXEMPNO) - Fix the employee number length
      open '','CUSTEMP' to CF else stopm 'Not'
      select CF
10:   readnext K else stop
      read REC from CF,K then
         NK = fmt(K,"R%6")
         write REC on CF,NK
         delete CF,K
      end
      go 10
   end

EXAMPLE 2 of 2:
!(FIXEMPNO) - Fix the employee number length
      DONE = 0
      open '','CUSTEMP' to CF else stopm 'Not'
      select CF
      loop
         readnext K else DONE = 1
      read REC from CF,K then
         NK = fmt(K,"R%6")
         write REC on CF,NK
         delete CF,K
      end
      repeat
   end

My intent is not to start a religious discussion about GO or GOTOs because I
see that method all over the place and regardless of why, who or whatever,
my question is, which is faster. (I prefer using loop..repeat syntax, FWIW).

--
Karl L. Pearson
Director of IT,
ATS Industrial Supply
Direct: 801-978-4429
Toll-free: 800-789-9300 1,29
Fax: 801-972-3888
http://www.atsindustrial.com
[EMAIL PROTECTED]
-------
u2-users mailing list
[EMAIL PROTECTED]
To unsubscribe please visit http://listserver.u2ug.org/
-------
u2-users mailing list
[EMAIL PROTECTED]
To unsubscribe please visit http://listserver.u2ug.org/
-------
u2-users mailing list
[EMAIL PROTECTED]
To unsubscribe please visit http://listserver.u2ug.org/
-------
u2-users mailing list
[EMAIL PROTECTED]
To unsubscribe please visit http://listserver.u2ug.org/

Reply via email to