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/