First of all, I have never bothered to use
hash before, so perhaps I will miss some
hash specific details.

As far as I know, hash!s are very similar to blocks.
That means you can put in any number of any
datatype.

There is, due to the key, duplication of data in
the database. The code appears before each
object and within each object. I would try to
eliminate one of them.
I would simplify your hash to a series of
objects only (with the keys in the objects.)

However, that may well not be very speedy.

So you may decide to have two keys then an object,
or store all your keys and data in the objects.
You will need to modify your functions either way.

With your two key example, this line will not work:

        all [find database code find database chknum]

It would find code somewhere, then chknum somewhere else,
but who says they are together? Nobody. ;)
Use this instead:

        find/skip database reduce [key1 key2] 3

The skip refinement treats the series as records
of fixed number of objects, which is 3 in this case
(2 keys and 1 object).

Anton.

>  From studying what both of you have said, I think that the root problem
> may be that I have a basic design flaw in my database.  This is (I think)
> what has confused me, and also is perhaps what has made it difficult for
> you to understand my problem.  I think I only have one key but need two
> keys.  (Or maybe I don't need any keys at all!  Is only one key
> per record
> allowed?)
>
> Here are the first few records from the database:
>
>  >> probe database
> make hash! ["bbi"
>      make object! [
>          code: "bbi"
>          chknum: "298"
>          date: 26-Jan-2001
>          amount: $40.00
>          special: $0.00
>      ] "bbi"
>      make object! [
>          code: "bbi"
>          chknum: "315"
>          date: 9-Feb-2001
>          amount: $40.00
>          special: $0.00
>      ] "boo"
>      make object! [
>          code: "boo"
>          chknum: "9898"
>          date: 19-Jan-2001
>          amount: $100.00
>          special: $0.00
>      ] "boo"
>      make object! [
>          code: "boo"
>          chknum: ""
>          date: 20-Apr-2001
>          amount: $100.00
>          special: $0.00
>      ] "bho"
>      make object! [
>          code: "bho"
>          chknum: "5259"
>          date: 27-Jul-2001
>          amount: $100.00
>          special: $0.00
>
> What I am wanting to do is to make sure that the record is not already in
> the database before I insert it.  In other words, no duplicate _records_
> are allowed.  Note, however,  that although the records are all
> unique, the
> code data is not necessarily unique, nor is the chknum data. There may be
> many records with the same code, and also many records with the same
> chknum.  Only the code / chknum combination is unique.
>
> So, do I perhaps need the records to look like this?:
>
>      ] "bho" "5259"  ; <===<<< TWO KEYS.
>      make object! [
>          code: "bho"
>          chknum: "5259"
>          date: 27-Jul-2001
>          amount: $100.00
>          special: $0.00
>
> Would not this line then return none if the unique record does not exist,
> and return the chknum otherswise?:
>
> all [find database code find database chknum]
>
> Am I correct about all this?  If so, won't the following
> functions have to
> be rewritten?:
>
> load-data: has [data] [
>      if exists? db-file [
>          data: reduce load/all db-file
>          clear database
>          if data [
>              foreach item data [
>                  item: make record item
>                  repend database [item/code item] ;item/key_field item
>              ]
>          ]
>          database: make hash! database
>      ]
>
> ]
>
>
> update-key-data: func [code-old code-new /local record] [
>      record: find database code-old
>      if none? record [alert reform ["Missing record:" code-old] exit]
>      insert clear first record code-new
> ]
>
>
> save-data: has [data] [
>      data: copy []
>      foreach [key obj] database [
>          append/only data obj 5   ; number of fields in each record
>      ]
>      save db-file data
> ]
>
>
>
> find-data: func [code] [select database code]
>
>
> remove-data: func [code] [remove/part find database code 2]
>
>
> insert-data: func [code' chknum' date' amount' special'] [
>      repend database [
>          code'
>          make record [
>              code: code'
>              chknum: chknum'
>              date: date'
>              amount: amount'
>              special: special'
>          ]
>      ]
> ]
>
> These are the functions that Carl wrote for me several years ago for a
> database that only had one key.  Thanks again Carl!  They have served me
> well in several databases.  This is my first need for two keys.
>
> Thanks again for your help.
>
> Louis

-- 
To unsubscribe from this list, please send an email to
[EMAIL PROTECTED] with "unsubscribe" in the 
subject, without the quotes.

Reply via email to