|
njkc07 Beginner
Joined: 09 May 2008 Posts: 15
|
Posted: Wed May 14, 2008 10:07 pm
avoiding duplicates in databases |
I realize this may be posted in the wrong section. If it is please forgive me.
I was recently perusing the help files for CMUD's database and saw a help on making a database for identifying objects. Thought it would be great and it works great! the only problem I have is that it doesn't state a way to avoid making duplicate records of the same object. I tried putting the object's name from identify in a strig list and the checking the string list for that name but it isn't working.
Code: |
Object '(*)', Item type: (%w) |
Trigger capture
Code: |
#IF (%ismember(%1, idItems)) {#T- identify;#EC Already know about that item} {#ADDITEM idItems %1} |
Adding objects name to stringlist idItems
Obviously the identify class is where all my triggers are to populate a database record and add a new record to my db.
It's not working. plenty of records of the same object, never once has it closed the class and ecoed anything.
I am sure there has to be an easier way to avoid getting duplicates in the db and would be glad to hear. If not then would be glad to hear what I am doing wrong here. I know if this were SQL or Access I could just declare objName a primary key and that would solve it but don't see any way to establish a primary key in CMUD |
|
|
|
Progonoi Magician
Joined: 28 Jan 2007 Posts: 430
|
Posted: Wed May 14, 2008 10:12 pm |
%additem allows dups, #additem doesn't.
idItems=%additem(%1,@idItems)
Prog |
|
_________________ The Proud new owner of CMud.
--------------------------------
Intel Core i5-650 3,2GHz
4 DD3 RAM
GTX 460 768MB
Win 7 Home Premium 64x
-------------------------------- |
|
|
|
njkc07 Beginner
Joined: 09 May 2008 Posts: 15
|
Posted: Wed May 14, 2008 10:31 pm |
I don't want duplicates. for instance right now I keep identifying the same item. The object name is "a pair of red steel greaves" (no quotes obviously). It doesn't seem to be checking if that name is in my idItems string list. The name is in there, I see it in there. So it should be turning off the identify class and telling me I already have id'ed that item or whatever I told it to echo.
*EDIT:
Never mind I am an idiot at times and forgot the @ infront of my string list when checking. Thanks for trying to help!! |
|
|
|
njkc07 Beginner
Joined: 09 May 2008 Posts: 15
|
Posted: Wed May 14, 2008 10:39 pm |
one last question. I get this at some items in the bottom of the identify.
Code: |
Can affect you as :
Affects: DEX By 2
Affects: MAXMOVE By 10 |
I have a field in my db for this and it is type memo (probably not the best type for it but thought it would be easier). How can I capture all the affects message and put them into the single memo field in my db?
I realize I can make a trig to capture each individual Affects: line but awfully time consuming, not mention I would have to make an individual field for each affect possible, which would be quite a few. |
|
|
|
Anaristos Sorcerer
Joined: 17 Jul 2007 Posts: 821 Location: California
|
Posted: Thu May 15, 2008 12:46 am |
You may store it into the database as a stringlist or, alternatively, you can convert the stringlist to a string (using " " as the separator) and store it, instead. If your data contains blanks, you can use some other (unused) character as your separator.
|
|
_________________ Sic itur ad astra. |
|
|
|
njkc07 Beginner
Joined: 09 May 2008 Posts: 15
|
Posted: Thu May 15, 2008 2:06 am |
Anaristos wrote: |
You may store it into the database as a stringlist or, alternatively, you can convert the stringlist to a string (using " " as the separator) and store it, instead. If your data contains blanks, you can use some other (unused) character as your separator. |
These sound like great things but unfortunately my knowledge of such is quite limited. Perhaps you could give some examples on how they are syntax wise? Thanks for the help!! |
|
|
|
Anaristos Sorcerer
Joined: 17 Jul 2007 Posts: 821 Location: California
|
Posted: Thu May 15, 2008 2:41 am |
A stringlist can be created by using the #ADDITEM command or the %additem() function. By using the command you make sure that no duplicate data is added to the stringlist. if you want duplicate items, or don't care if you have any, you can use the function.
A stringlist is a string with the following format:
Code: |
value1|value2|value3|.....|valuen
|
The | separator is a must for a stringlist.
You use the %numitems() function to find out how many elements exist in the stringlist. You use the %item() function to extract values from the list by providing a 1-based index.
Note that a stringlist which has its separator (|) replaced by a " ", becomes a standard string. Assuming that the items don't have any blank characters in them. The reverse is also true.
The corollary from this is that you can use the %replace() function to convert strings to stringlists and vice versa. Also, the %expandlist can be use for conversion.
From this you can gather that this is something you can do:
Code: |
#ADDKEY dbvar data=%replace(stringlistvariable,"|"," ")
|
This will add the data key to the dbvar variable, for instance. You can use any replacement character you like, so if your items have blanks in them, you can choose another replacement for your stringlist separator.
These are just examples of what you can do. You must choose a suitable method for your specific application. Your application may not be suitable for any of these ideas.
I suggest you read this page to become familiarized with the concept of stringlists. |
|
_________________ Sic itur ad astra. |
|
|
|
njkc07 Beginner
Joined: 09 May 2008 Posts: 15
|
Posted: Thu May 15, 2008 3:10 am |
I get string lists just didn't know I could use replace to make it into a solid string. Is " " mandatory or could I replace with ", "? Thanks for the help. you all here are awesome
|
|
|
|
shalimar GURU
Joined: 04 Aug 2002 Posts: 4690 Location: Pensacola, FL, USA
|
Posted: Thu May 15, 2008 4:02 am |
you can replace it with whatever you wish
|
|
_________________ Discord: Shalimarwildcat |
|
|
|
OxnyxWS Newbie
Joined: 23 Oct 2006 Posts: 8
|
Posted: Tue May 27, 2008 3:12 am Different Solution |
I tried the #ADDKEY thing but as far as I could tell the problem was that of course you want to clear the VAR of the setting after adding the data to the database so #ADDKEY just didn't cut it.
#QUERY on the other hand, is helpful cause it checks the database. Below is the code I currently using. @Item is a VAR that has the new entry for the database I query the name field (echo if currently in database) then do a null name check and add the data. Hopefully this helps
Code: |
#IF (%QUERY((&Name = @Item.Name)))
{#Echo @Item.Name is found in database; #DBRESET}
{#Echo @Item.Name is a new item; #DBRESET
#IF (!%null(@Item.Name))
{#Echo Data is present; #NEW All|Database @Item
#EC Added @Item.Name}
{#ECHO Null Name }
}
#T- Gather
#T- AddData
#VAR Item " "
|
|
|
|
|
|
|