On 30-May-2014 10:15 -0500, Jeff Young wrote:
I have a file that I want to monitor for a change to a specific
field. If this field becomes negative, I want to set it to zero.
  I can image almost no way, how, that could be a valid business rule.
The file is updated by many programs and is my inventory master, so
there are a large number of transactions all day.
  I would expect that if any program was setting the value to less than 
zero, the program almost surely has a problem.  That, or negative values 
are valid, but perhaps only if representative of the SUM of those items 
on back-order; thus the app or a trigger ensures that corresponding data 
is kept in sync.?
Is a trigger the best way to do this?
  As the scenario is stated originally, yes, that is the best way.  And 
the only way to get the effect, without ensuring no such updates are 
capable outside of a specific [set of] application(s); i.e. if for 
example the rule should apply irrespective of that update being done via 
an ad hoc SQL request, via a DFU request, etc., or via the [set of] 
authorized application interface(s).
  But I would expect the true desire is something different than 
alluded; i.e. I doubt resetting what the program does is the desired 
effect.?  To ensure the effects are more accurate and representative of 
the business [i.e. valid transactions], I would expect some other 
approach like a CHECK CONSTRAINT that would fail the improper I/O would 
be more appropriate.
If not, what would be the best method with the least impact on
performance?
  The best method is to ensure an application is the only updater of 
the data, and that the application would ensure that business rule is 
applied.  Often that would have all the programs invoking one service 
program that owned the update interface to that data, at least to the 
function of decrementing the inventory in that file, and that one 
service program ensures the decrement below zero sets the value to zero 
instead of the negative value.
  If the value must be zero only in reading, then [if using SQL] an 
expression such as the following, might be better for zero-impact on 
updates, but obviously some impact on SELECT performance [and more if 
the column is used for selection; a derived INDEX with the same 
expression could help]:
  CASE SIGN(Inventory_field)
    WHEN 1 THEN Inventory_field
    ELSE 0.0
  END as Inventory_field
If so, what is the impact on performance?
  The impact of the trigger in normal non-batch-style work is generally 
insignificant, especially if the program is either in a named activation 
group or the activation group of the *CALLER and the caller is not 
generated *NEW nor the default activation, and the activation is not 
reclaimed unnecessarily.
The system is at release V7R1M0 L00 TL12115
  Refreshing to see that tidbit; so rare that such information ever is 
offered in an OP describing an issue.
As an Amazon Associate we earn from qualifying purchases.