sql >> Database >  >> RDS >> Oracle

Vensterbeheer in Oracle D2k Forms

Vensterbeheer in Oracle D2k-formulieren

In dit gedeelte worden twee zeer nuttige technieken voor vensterbeheer in Oracle D2k Forms gepresenteerd:een actief venster sluiten door op het x-pictogram rechtsboven te klikken en elk geopend actief venster in een formulier vergroten of verkleinen, verplaatsen en sluiten. De eerste is een zeer gewaardeerde gebruikersvereiste die Oracle Forms niet heeft; het is in strikte overeenstemming met elke standaard Windows-toepassing. De tweede techniek is een generieke routine om de programmeerinspanning en de inspanning van de eindgebruiker te minimaliseren bij het afzonderlijk sluiten van elk open venster.

Een venster sluiten met het x-pictogram

Een venster sluiten door op het x-pictogram in de rechterbovenhoek te klikken is een vaak vereiste functie en ook standaard Windows-functionaliteit. Hoewel deze techniek door Forms wordt genegeerd, kunt u dit bereiken door middel van een paar regels code. Om dit te doen, schrijft u een WHEN-WINDOW-CLOSED trigger, en navigeer uit het venster of verlaat het formulier indien nodig door te controleren op :SYSTEM.EVENT_WINDOW. Om bijvoorbeeld een formulier af te sluiten door op x te klikken wanneer het actieve venster het consolevenster is (meestal WINDOW1 ), de procedure p_close_window kan als volgt worden gecodeerd:
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;

Deze procedure is generiek in die zin dat het kan worden gebruikt om elk venster te sluiten, niet alleen het consolevenster. Er kan een formulierspecifieke toetsafsluiting worden geschreven om speciale controles uit te voeren voordat dat specifieke formulier wordt gesloten door op het x-pictogram te klikken.

Het formaat wijzigen, herpositioneren en elk venster sluiten

Onderliggende vensters met gestapelde doeken zijn vaak nodig in een vorm om informatie weer te geven die onderdeel wordt van het primaire venster. Er kan bijvoorbeeld een selectielijst worden weergegeven in het primaire venster en daaropvolgende details en subdetails kunnen voorkomen in een of meer gestapelde doeken die worden vastgehouden door onderliggende vensters. Het dynamisch verkleinen, verplaatsen of sluiten van elk van deze vensters is essentieel wanneer meerdere vensters tegelijkertijd moeten worden weergegeven. Dit vereist een aanzienlijke hoeveelheid code. Deze techniek biedt een generieke routine om elk venster in een enkele vorm te vergroten of te verkleinen, te herpositioneren en te sluiten, waardoor de programmeur de tijd en moeite bespaart die nodig is om de substantiële vereiste code te schrijven. TipHet gebeurtenisvenster moet de close_allowed, . hebben resize_allowed, en move_allowed eigenschappen ingesteld op Ja/True in ontwerptijd. Dit is nodig om de standaardfuncties voor sluiten, vergroten/verkleinen en verplaatsen in te schakelen. Procedures voor het wijzigen van de grootte en het verplaatsen van elk venster kunnen op vergelijkbare regels worden geschreven:
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 voorgaande twee procedures en de procedure die in de vorige sectie is gegeven, kunnen worden gegeneraliseerd door een extra parameter toe te voegen met de naam 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;

De oproep naar p_close_window kan worden vervangen door p_action_window als volgt:
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;

De code voor elk van de drie procedures p_close_window, p_resize_window, en p_reposition_window kan worden aangepast om toepassingsspecifieke logica aan te kunnen. Bijvoorbeeld de code voor de p_close_window procedure kan worden aangepast om oproepen te bevatten om expliciete navigatie uit het respectieve venster te starten, zoals GO_ITEM of GO_BLOCK, waardoor dat venster kan worden gesloten en ook een Wilt u opslaan? alert in geval van openstaande databasewijzigingen. Ook, zoals te zien is in het voorbeeld van het sluiten van het consolevenster, EXIT_FORM kan handig zijn bij het sluiten van alle vensters die het verlaten van een bepaald formulier initiëren. TipDe oproep naar de ingebouwde SET_WINDOW_PROPERTY met de eigenschap ZICHTBAAR ingesteld op FALSE sluit (verbergt) het venster alleen als het venster geen navigeerbare items bevat of als de vensterstijl Document is. Als het venster ten minste één navigeerbaar item bevat, of als de vensterstijl Dialoogvenster is, blijft het venster weergegeven tenzij en totdat de gebruiker expliciet uit het venster navigeert. Ook als het venster modaal is, is de enige manier om af te sluiten door middel van expliciete navigatie. Dit kan worden geregeld door het aanpassen van het p_close_window procedure zoals beschreven in het voorgaande voorbeeld.
  1. "Query niet toegestaan ​​in Waitfor" Fout 101 in SQL Server

  2. Gegevensblokken dumpen

  3. Hoe maak je een PL/SQL-functie in Oracle Database?

  4. Dagen aan een datum toevoegen in T-SQL