sql >> Database teknologi >  >> RDS >> Oracle

Vinduesstyring i Oracle D2k-formularer

Window Management i Oracle D2k Forms

Dette afsnit præsenterer to meget nyttige teknikker til vinduesstyring i Oracle D2k Forms:lukning af et aktivt vindue ved at klikke på x-ikonet øverst til højre og ændre størrelse, omplacere og lukke ethvert åbent aktivt vindue i en formular. Førstnævnte er et meget værdsat brugerkrav, som Oracle Forms mangler; det er i nøje overensstemmelse med enhver standard Windows-applikation. Den anden teknik er en generisk rutine til at minimere programmeringsindsatsen, såvel som slutbrugerens indsats, ved at lukke hvert åbent vindue individuelt.

Luk et vindue med x-ikonet

At lukke et vindue ved at klikke på x-ikonet i øverste højre hjørne er en ofte påkrævet funktion og også standard Windows-funktionalitet. Selvom denne teknik ignoreres af Forms, kan du opnå den ved hjælp af et par linjer kode. For at gøre det skal du skrive en NÅR-VINDU-LUKKET trigger, og naviger ud af vinduet eller forlad formularen efter behov ved at kontrollere for :SYSTEM.EVENT_WINDOW. For eksempel at afslutte en formular ved at klikke på x, når det aktive vindue er konsolvinduet (som generelt er WINDOW1 ), proceduren p_close_window kan kodes som følger:
PROCEDURE p_close_window(p_window_name  VARCHAR2,

                         console_window VARCHAR2,

                         ret_code OUT NUMBER)

IS

   Win_id Window;

BEGIN

Win_id := FIND_WINDOW(p_window_name);

    IF ID_NULL(win_id) THEN

        Ret_code := -1;

        Return;

     END IF;



   IF NAME_IN('SYSTEM.EVENT_WINDOW') = p_window_name THEN

      IF console_window = 'Y'THEN

         DO_KEY('EXIT_FORM');

      ELSE

       SET_WINDOW_PROPERTY(win_id, VISIBLE, PROPERTY_FALSE);

      END IF;

      IF FORM_SUCCESS THEN

        Ret_code := 0;

      ELSE

        Ret_code := -1;

      END IF;

   END IF;



END;

Denne procedure er generisk i den forstand, at den kan bruges til at lukke et hvilket som helst vindue, ikke kun konsolvinduet. En formularspecifik nøgleafslutning kan skrives for at tage sig af enhver speciel kontrol, før den pågældende formular lukkes, ved at klikke på x-ikonet.

Ændre størrelse, omplacering og luk ethvert vindue

Børnevinduer med stablede lærreder er meget ofte påkrævet i en form for at vise information, der bliver en del af det primære vindue. For eksempel kan en valgliste blive vist i det primære vindue, og efterfølgende detaljer og underdetaljer kan forekomme i et eller flere stablede lærreder, der holdes af underordnede vinduer. Dynamisk ændring af størrelse, omplacering eller lukning af hvert af disse vinduer er afgørende, når flere vinduer skal vises på samme tid. Dette kræver en betydelig mængde kode. Denne teknik giver en generisk rutine til at ændre størrelse, omplacere og lukke ethvert givet vindue i en enkelt form, hvilket sparer programmøren for den nødvendige tid og indsats for at skrive den væsentlige kode, der kræves. TipBegivenhedsvinduet skal have close_allowed, ændre størrelse_tilladt, og move_allowed egenskaber sat til Ja/True på designtidspunktet. Dette er nødvendigt for at aktivere standardfunktionerne for lukning, ændring af størrelse og omplacering. Procedurer for at ændre størrelse og flytte ethvert vindue kan skrives på lignende linjer:
PROCEDURE p_resize_window(p_window_name  VARCHAR2,

                          console_window VARCHAR2,

                          width NUMBER,

                          height NUMBER,

                          ret_code OUT NUMBER)

IS

   Win_id Window;

BEGIN



/* The window name, its target width, and its height are passed

as input parameters. Also, an additional parameter to identify whether

the window under consideration is a console window is passed as input. */



    Win_id := FIND_WINDOW(p_window_name);

/* If input window does not exist, exit the procedure and return –1 */



    IF ID_NULL(win_id) THEN

        Ret_code := -1;

        Return;

     END IF;

/* If the input window is the active window and is not the console window,

resize it to the specified width and height */



   IF NAME_IN('SYSTEM.EVENT_WINDOW') = p_window_name THEN

      IF console_window = 'Y'THEN

        NULL; /* CANNOT RESIZE CONSOLE WINDOW */

      ELSE

        RESIZE_WINDOW(win_id, WIDTH, HEIGHT);

      END IF;

      IF FORM_SUCCESS THEN

        Ret_code := 0;

      ELSE

        Ret_code := -1;

      END IF;

   END IF;



END;



PROCEDURE p_reposition_window(p_window_name VARCHAR2,

                              console_window VARCHAR2,

                              xpos number,

                              ypos NUMBER,

                              ret_code OUT NUMBER)

IS

   Win_id Window;

BEGIN

/* The window name and its target (x,y) position are passed as

input parameters. Also, an additional parameter to identify whether the window

under consideration is a console window is passed as input. */



     Win_id := FIND_WINDOW(p_window_name);



/* If the input window does not exist, exit the procedure and return –1 */



    IF ID_NULL(win_id) THEN

        Ret_code := -1;

        Return;

     END IF;

/* If the input window is the active window and is not the console window,

resize it to the specified width and height */



   IF NAME_IN('SYSTEM.EVENT_WINDOW') = p_window_name THEN

      IF console_window = 'Y'THEN

        NULL; /* CANNOT RESIZE CONSOLE WINDOW */

      ELSE

        MOVE_WINDOW(win_id, xpos, ypos);

      END IF;

      IF FORM_SUCCESS THEN

        Ret_code := 0;

      ELSE

        Ret_code := -1;

      END IF;

   END IF;



END;

De foregående to procedurer og den, der er givet i det foregående afsnit, kan generaliseres til én ved at tilføje en ekstra parameter ved navn action_type :
PROCEDURE p_action_window(p_window_name VARCHAR2,

                          console_window VARCHAR2,

                          action_type VARCHAR2,

          Width number, height number, xpos number, ypos number,

          ret_code OUT NUMBER,

)

IS

   Win_id Window;

   V_window_name VARCHAR2(40);

BEGIN



/* This procedure takes the action type (CLOSE, RESIZE or REPOSITION )

as an input parameter and calls the corresponding procedure

(p_close_window,

 p_rresize_window or p_reposition_window ) to perform that action.

Initially, it checks for the existence of the input window name */



Win_id := FIND_WINDOW(NAME_IN(p_window_name));



    IF ID_NULL(win_id) THEN

        Ret_code := -1;

        Return;

     END IF;

     IF (action_type = 'CLOSE') THEN

          P_close_window(p_window_name, console_window, ret_code);

      ESLIF (action_type = 'RESIZE') THEN

        P_resize_window(p_window_name, console_window, ret_code);

      ELSIF (action_type = 'REPOSITION')

        P_reposition_window(p_window_name, console_window, ret_code);

      END IF;

      IF FORM_SUCCESS THEN

          ret_code := 0;

       ELSE

          (ret_code = -1);

       END IF;

   END IF;



END;

Kaldet til p_close_window kan erstattes af p_action_window som følger:
WHEN-WINDOW-CLOSED



DECLARE

    ret_code NUMBER;

BEGIN



p _action_window('WINDOW0'), 'Y','CLOSE', ret_code);

IF (ret_code <>  0) THEN

    MESSAGE('Error closing Console Window!');

    RAISE FORM_TRIGGER_FAILURE;

END IF;

END;

Koden for hver af de tre procedurer p_close_window, p_resize_window, og p_reposition_window kan tilpasses til at håndtere applikationsspecifik logik. For eksempel koden for p_close_window proceduren kan tilpasses til at indeholde opkald for at starte eksplicit navigation ud af det respektive vindue, såsom GO_ITEM eller GO_BLOCK, hvilket vil gøre det muligt for vinduet at lukke og også smide en Vil du gemme? alarm i tilfælde af afventende databaseændringer. Som det ses i eksemplet med lukning af konsolvinduet, EXIT_FORM kan være behjælpelig med at lukke alle vinduer, der starter udgangen af ​​en bestemt formular. TipOpkaldet til den indbyggede SET_WINDOW_PROPERTY med ejendommen VISIBLE indstillet til FALSK lukker (skjuler) kun vinduet, hvis vinduet ikke har nogen navigerbare elementer i det, eller vinduesstilen er Dokument. Hvis vinduet har mindst ét ​​navigerbart element i sig, eller vinduesstilen er Dialog, forbliver vinduet vist, medmindre og indtil brugeren eksplicit navigerer ud af vinduet. Desuden, hvis vinduet er modalt, er den eneste måde at afslutte ved hjælp af eksplicit navigation. Dette kan klares ved at tilpasse p_close_window procedure som beskrevet i det foregående eksempel.
  1. Træk måneder fra en dato i PostgreSQL

  2. Hvordan skriver man en lagret procedure ved hjælp af phpmyadmin, og hvordan bruger man den gennem php?

  3. Kan jeg i en Oracle-trigger tildele ny og gammel til en rækketypevariabel?

  4. Database korruption