Oracle FORMS - Validate or invalidate records

0

I'm doing a FORM with a series of columns in GRID which are

PARAMETER - ALPHA VALUE - VALUE NUMBER - VALUE DATE - COMMENT

Parameter and Comment are mandatory but I want the user to have to enter at least one of the values. If you enter one of them, the others are disabled. Up there well. The fact is that when you reach 'COMMENT', if you have not entered one of the 3 values, a warning trigger will be issued, but continue to the next record. Would there be any way to return to the first field of that record ('PARAMETER') and not continue to the next record as usual?

I add the trigger that I am using:

DISPSTD.WHEN_VALIDATE_ITEM;
DECLARE
v_alerta number;
BEGIN
IF :system.trigger_item = 'B2.VALOR_ALFA' THEN
    IF :B2.VALOR_ALFA IS NOT NULL THEN
        SET_ITEM_PROPERTY('B2.VALOR_NUMERO',ENABLED,PROPERTY_FALSE);
        SET_ITEM_PROPERTY('B2.VALOR_FECHA',ENABLED,PROPERTY_FALSE);
    END IF;
    IF :B2.VALOR_ALFA IS NULL THEN
        SET_ITEM_PROPERTY('B2.VALOR_NUMERO',ENABLED,PROPERTY_TRUE);
            SET_ITEM_PROPERTY('B2.VALOR_NUMERO',UPDATE_ALLOWED,PROPERTY_TRUE);
        SET_ITEM_PROPERTY('B2.VALOR_FECHA',ENABLED,PROPERTY_TRUE);
            SET_ITEM_PROPERTY('B2.VALOR_FECHA',UPDATE_ALLOWED,PROPERTY_TRUE);
    END IF;
END IF;
IF :system.trigger_item = 'B2.VALOR_NUMERO' THEN
IF :B2.VALOR_NUMERO IS NOT NULL THEN
        SET_ITEM_PROPERTY('B2.VALOR_ALFA',ENABLED,PROPERTY_FALSE);
        SET_ITEM_PROPERTY('B2.VALOR_FECHA',ENABLED,PROPERTY_FALSE);
    END IF;
    IF :B2.VALOR_NUMERO IS NULL THEN
        SET_ITEM_PROPERTY('B2.VALOR_ALFA',ENABLED,PROPERTY_TRUE);
            SET_ITEM_PROPERTY('B2.VALOR_ALFA',UPDATE_ALLOWED,PROPERTY_TRUE);
        SET_ITEM_PROPERTY('B2.VALOR_FECHA',ENABLED,PROPERTY_TRUE);
            SET_ITEM_PROPERTY('B2.VALOR_FECHA',UPDATE_ALLOWED,PROPERTY_TRUE);
    END IF;
END IF;
IF :system.trigger_item = 'B2.VALOR_FECHA' THEN
    IF :B2.VALOR_FECHA IS NOT NULL THEN
        SET_ITEM_PROPERTY('B2.VALOR_NUMERO',ENABLED,PROPERTY_FALSE);
        SET_ITEM_PROPERTY('B2.VALOR_ALFA',ENABLED,PROPERTY_FALSE);
    END IF;
    IF :B2.VALOR_FECHA IS NULL THEN
        SET_ITEM_PROPERTY('B2.VALOR_NUMERO',ENABLED,PROPERTY_TRUE);
            SET_ITEM_PROPERTY('B2.VALOR_NUMERO',UPDATE_ALLOWED,PROPERTY_TRUE);
        SET_ITEM_PROPERTY('B2.VALOR_ALFA',ENABLED,PROPERTY_TRUE);
            SET_ITEM_PROPERTY('B2.VALOR_ALFA',UPDATE_ALLOWED,PROPERTY_TRUE);
    END IF;
END IF;
IF :system.trigger_item = 'B2.D_PARAMETRO' THEN
        IF :B2.VALOR_ALFA IS NULL AND :B2.VALOR_NUMERO IS NULL AND :B2.VALOR_FECHA IS NULL THEN
        v_alerta := show_alert('NULL_ALERT');
        END IF;
END IF;
END;
    
asked by Kora 10.12.2018 в 13:16
source

1 answer

0

For all those who want to know the answer and for the record of future Oracle Forms programmers, here is how I have solved it:

First, and first of all, change the validation of the items. In my question I had put a field disable when one of them was introduced, but in the end it is cumbersome because when trying to change it it "locks up" and you have to click on another field to activate the rest. In this way it is achieved that when writing another, the previous one is deleted.

WHEN-VALIDATE-ITEM

DISPSTD.WHEN_VALIDATE_ITEM;
DECLARE
  v_alerta number;
BEGIN
  IF :system.trigger_item = 'B2.VALOR_ALFA' THEN
     IF :B2.VALOR_ALFA IS NOT NULL THEN
          :B2.VALOR_NUMERO := NULL;
            :B2.VALOR_FECHA := NULL;
     END IF;
  ELSIF :system.trigger_item = 'B2.VALOR_NUMERO' THEN
 IF :B2.VALOR_NUMERO IS NOT NULL THEN
        :B2.VALOR_ALFA := NULL;
        :B2.VALOR_FECHA := NULL;
     END IF;
  ELSIF :system.trigger_item = 'B2.VALOR_FECHA' THEN
     IF :B2.VALOR_FECHA IS NOT NULL THEN
        :B2.VALOR_ALFA := NULL;
        :B2.VALOR_NUMERO := NULL;
     END IF;
  END IF;
END;

Now we create a new trigger with the following code:

WHEN-VALIDATE-RECORD

DISPSTD.WHEN_VALIDATE_RECORD;
DECLARE
  V_ALERTA      NUMBER;
BEGIN
  IF :B2.VALOR_ALFA IS NULL 
 AND :B2.VALOR_NUMERO IS NULL 
 AND :B2.VALOR_FECHA IS NULL THEN
 MSG.MENSAJE('RI','PARAMNUL');
     :PARAMETER.P_CONDICION := 'NO';
     :PARAMETER.P_RECORD := :SYSTEM.TRIGGER_RECORD;
  ELSE
     :PARAMETER.P_CONDICION :='SI';
  END IF;
END;

Obviously, the parameters P_CONDICION and P_RECORD will have to be created by us.

Now, finally we create the trigger that will pick up that parameter:

WHEN-NEW-RECORD-INSTANCE

DISPSTD.WHEN_NEW_RECORD_INSTANCE;
BEGIN
  IF :PARAMETER.P_CONDICION = 'NO' THEN
    GO_RECORD(:PARAMETER.P_RECORD);
  END IF;
END;

I hope you solve the problem:)

    
answered by 12.12.2018 в 10:02