× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



On 12/19/06, Barbara Morris <bmorris@xxxxxxxxxx> wrote:
Chris Pando wrote:
>
> Which would get deeply nested for a bunch of keys. I have a generic
> file comparison report, which needs to be able to compare 1 to n key
> fields; I do it like:
> ...
>   DoU ($I = keyCnt Or memcmpstr <> 0);
>      $I = $I + 1;
>      memcmpstr = memcmp( @bfr1@($I)
>                        : @bfr2@($I)
>                        : @fldLnB($I)
>                        );
> ...

The deep nesting can be easily avoided (see below).  The problem with
comparing by memcmp is that it doesn't compare correctly for many data
types.  For example,
  packed data: -99999 < 12345, but x'99999d' > x'12345f'
  varying length:  'abc' < 'd', but x'0003818283??????' >
x'000184????????????'
  etc.

Indeed. The code segment is from a tool we use for regression testing, when
we want to quickly compare the same file in different environments.
The comparisons use the 'natural' key, which has yet to include one
with negative
numbers. In fact, the documentation states that it won't work on a
negative numeric key. If the need arises, I'll fix the logic to allow
for negative numeric
keys, but the need has yet to arise.

I don't think natural keys should include negative numbers, but that's just me.
As for a varying length key field, all I can say is blecch; I'd rather hash to
a numeric key.l

Here's Jon's code reduced to a single select, with no extra nesting.
The nested select is a bit nicer, but I think this is ok too.
      select;
          // compare the year first
          when E1.Year < E2.Year;
               return -1;
          when E1.Year > E2.Year;
               return 1;

          // year is equal; compare the month next
          when E1.Month < E2.Month;
               return -1;
          when E1.Month > E2.Month;
               return 1;

          // everything is equal
               return 0;
      endsl;


I think the above is a little easier to understand, if you know the
fields to be compared at compile time. It won't work if that information
is available until run time, however.

Chris
--
"The issue is not one of power, but coping with the
human difficulty in understanding complex structures".
- Leif Svalgaard

As an Amazon Associate we earn from qualifying purchases.

This thread ...

Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.