Hmm...

Try this and if you get the same results, then it sounds like the rule is being 
checked before the row is saved. That kind of makes sense.
   RULES 'Vehicle ID must be either blank or unique: two drivers cannot +
be assigned to the same vehicle' +
    FOR Drivers FAILS +
    WHERE VID IS NOT NULL AND Exists +
    (SELECT VID FROM DRIVERS d1, DRIVERS d2 WHERE d2.VID = d1.VID AND +
d2.DCode <> d1.DCode)
When you enter the first duplicate, if the rule is checked before the row is 
saved, it won't FAIL. But after the row is saved, when you try to enter another 
dup, it will FAIL.

The solution here could be  a rule checking eep as an exit from the control or 
from the row.

Another method might be to assign VID to a variable and change the RULE to use 
the variable as in

   RULES 'Vehicle ID must be either blank or unique: two drivers cannot +
be assigned to the same vehicle' +
    FOR Drivers FAILS WHERE .VIDvariable IN (SELECT VID FROM DRIVERS)

Come to think of it, maybe

   RULES 'Vehicle ID must be either blank or unique: two drivers cannot +
be assigned to the same vehicle' +
    FOR Drivers FAILS WHERE VID IN (SELECT VID FROM DRIVERS)
will work if the rule is checked before the row is saved. (I assume column VID 
is NOT NULL in DRIVERS table).


Regards,

Stephen Markson
The Pharmacy Examining Board of Canada
416.979.2431 x251

From: [email protected] [mailto:[email protected]] On Behalf Of David Blocker
Sent: July-31-13 3:07 PM
To: RBASE-L Mailing List
Subject: [RBASE-L] - Re: An unresolved RULES issue from earlier email

The first results in the error message:

?This rule?s WHERE clause is invalid. (2652)?
R:Base accepts the second syntax.  It?s results are SLIGHTLY better than 
earlier versions:  as with the others, it correctly allows NULL values in VID.  
 However, it allows me to put in ONE duplicate but traps when I try to set a 
third row to the same value!  All other earlier versions let me put in multiple 
rows with the same VID.
But still not there!
David

David Blocker
Email: [email protected]<mailto:[email protected]>
Phone: 781-344-1920
Cell: 339-206-0261

-----Original Message-----
From: Stephen Markson [mailto:[email protected]]
Sent: Wednesday, July 31, 2013 02:08 PM
To: 'RBASE-L Mailing List'
Subject: [RBASE-L] - Re: An unresolved RULES issue from earlier email
Hi David,

Did you try

RULES +
'Another driver is already assigned to that vehicle' +
FOR Drivers +
SUCCEEDS +
WHERE VID IS NULL +
OR NOT EXISTS +
(SELECT * FROM Drivers d1, Drivers d2 +
  WHERE d2.VID = d1.VID AND d2.DriverID <> d1.DriverID)
Or

    RULES 'Vehicle ID must be either blank or unique: two drivers cannot +
be assigned to the same vehicle' +
    FOR Drivers FAILS +
    WHERE VID IS NOT NULL AND VID IN +
    (SELECT VID FROM DRIVERS d1, DRIVERS d2 WHERE d2.VID = d1.VID AND +
d2.DCode <> d1.DCode)
?

Regards,

Stephen Markson
The Pharmacy Examining Board of Canada
416.979.2431 x251

From: [email protected]<mailto:[email protected]> [mailto:[email protected]] On 
Behalf Of David Blocker
Sent: July-31-13 1:08 PM
To: RBASE-L Mailing List
Subject: [RBASE-L] - Re: An unresolved RULES issue from earlier email

Bill
I tried your rule as sent to me a few weeks back.  Your exact syntax:
RULES +
'Another driver is already assigned to that vehicle' +
FOR Drivers +
SUCCEEDS +
WHERE VID IS NULL +
OR NOT EXISTS +
(SELECT * FROM Drivers d2 +
  WHERE d2.VID = Drivers.VID AND d2.DriverID <> Drivers.DriverID)
was rejected by R:Base as an invalid WHERE clause.  I translated it to the 
equivalent:
RULES +
'Another driver is already assigned to that vehicle' +
FOR Drivers +
SUCCEEDS +
WHERE VID IS NULL +
OR VID NOT IN +
(SELECT VID FROM Drivers d2 +
  WHERE d2.VID = Drivers.VID AND d2.DriverID <> Drivers.DriverID)
This was accepted by R:Base.
However, the rule still does not work.  Nulls are accepted by R:Base, as they 
were with my FAILS version of the rule, but R:Base happily allows me to put the 
same VID value in for 2 or more rows.  (And yes, RULES are ON)
Here's my original rule again:
    RULES 'Vehicle ID must be either blank or unique: two drivers cannot +
be assigned to the same vehicle' +
    FOR Drivers FAILS +
    WHERE VID IS NOT NULL AND VID IN +
    (SELECT VID FROM DRIVERS d2 WHERE d2.VID = Drivers.VID AND +
d2.DCode <> Drivers.DCode)
(Bill, this means it fails if it's FILLED IN - NOT NULL AND is a duplicate of 
one already there)
Looks like I may have to go with Dennis? solution unless anyone else has an 
idea.
Razzak, care to weigh in?
David

David Blocker
Email: [email protected]<mailto:[email protected]>
Phone: 781-344-1920
Cell: 339-206-0261

-----Original Message-----
From: Bill Downall [mailto:[email protected]]
Sent: Tuesday, July 30, 2013 06:15 PM
To: 'RBASE-L Mailing List'
Subject: [RBASE-L] - Re: An unresolved RULES issue from earlier email
David,

In order for the rule to fail, the VID must be null, and the VID also must be 
found in the lookup. I would have a hard time fining any rows that would fail 
under those conditions.

Your reversing of the logic from the SUCCEEDS version got twisted too much, 
because you changed the OR to an AND, and you also changed the NOT IN to an IN.

Did you try the SUCCEEDS syntax I came up with originally? Did it also not 
work? I know it violates our tried and true DMB methodology, but it is easier 
to read and mentally translate into English.

Bill

RULES +
'Another driver is already assigned to that vehicle' +
FOR Drivers +
SUCCEEDS +
WHERE VID IS NULL +
OR NOT EXISTS +
(SELECT * FROM Drivers d2 +
  WHERE d2.VID = Drivers.VID AND d2.DriverID <> Drivers.DriverID)

On Tue, Jul 30, 2013 at 5:01 PM, David Blocker 
<[email protected]<mailto:[email protected]>> wrote:

Hi friends
I just realized as I temporarily moved forward on my project that an issue I 
wrote to the list about several weeks ago never was resolved.  I?m trying again 
to see if anyone has an idea for a solution.

Here?s the Structure:  VEH (vehicles) table has primary key column VID (vehicle 
ID)
Table DRIVERS (people who drive the vehicles) has Foreign key column VID.

When a driver is assigned a vehicle, the VID column for that driver?s row is 
set to the VID value.

However, there are two wrinkles here:
1)      A Driver may NOT currently be assigned a vehicle, so VID could be NULL
2)      If Driver A has a certain vehicle, say VID = 1, Driver B should NOT be 
allowed to get that vehicle.  In other words, NO TWO RECORDS in Drivers should 
have the same value for VID

So the rule I want would:
1)      Permit Nulls
2)      Forbid two rows in Drivers from having the same value.

A rule is needed, because a Unique Key for VID in Drivers cannot be set up 
unless the column has a NOT NULL constraint.

Here?s the rule that I tried based on some emails back and forth with Bill 
Downall:

    RULES 'Vehicle ID must be either blank or unique: two drivers cannot +
be assigned to the same vehicle' +
    FOR Drivers FAILS +
    WHERE VID IS NOT NULL AND VID IN +
    (SELECT VID FROM DRIVERS d2 WHERE d2.VID = Drivers.VID AND +
d2.DCode <> Drivers.DCode)

This does NOT work.  R:Base DOES allow null values, but it also allows me to 
set multiple rows to the same VID value.

Any ideas?

David Blocker
David Blocker
Email: [email protected]<mailto:[email protected]>
Phone: 781-344-1920
Cell: 339-206-0261




Reply via email to