Szukaj…


Wprowadzenie

TEMP-TABLE jest bardzo potężną funkcją Progress ABL. Jest to tymczasowa tabela w pamięci (głównie przynajmniej), której można używać do pisania złożonej logiki. Może być stosowany jako parametry wejściowe / wyjściowe w procedurach, funkcjach i innych programach. Jeden lub więcej Temp-tabele mogą nadrobić fundament DATASET (często zwanego ProDataset).

Prawie wszystko, co można zrobić za pomocą natywnej tabeli bazy danych Progress, można wykonać za pomocą tabeli tymczasowej.

Definiowanie prostej tabeli temp

To jest definicja TEMP-TABLE nazwie ttTempTable z trzema polami. NO-UNDO oznacza, że nie trzeba wykonywać operacji cofania (zwykle to jest to, co chcesz zrobić, chyba że naprawdę potrzebujesz czegoś przeciwnego).

DEFINE TEMP-TABLE ttTempTable NO-UNDO
    FIELD field1 AS INTEGER
    FIELD field2 AS CHARACTER
    FIELD field3 AS LOGICAL.

Tabela temp. Z indeksem

Tabele tymczasowe można (i należy) tworzyć z indeksami, jeśli planujesz uruchamiać zapytania przeciwko nim.

Ta tabela ma jeden indeks (indeks1) zawierający jedno pole (pole1). Ten indeks jest pierwotny i unikalny (co oznacza, że nie dwa rekordy mogą mieć tę samą zawartość pola 1).

DEFINE TEMP-TABLE ttTempTable NO-UNDO
    FIELD field1 AS INTEGER
    FIELD field2 AS CHARACTER
    FIELD field3 AS LOGICAL
    INDEX index1 IS PRIMARY UNIQUE field1 .

Więcej indeksów - indeksy ...

Możesz zdefiniować wiele wskaźników dla każdej tabeli tymczasowej. Jeśli ich potrzebujesz - zdefiniuj je. Zasadniczo indeks pasujący do zapytania i / lub porządku sortowania poprawi wydajność!

DEFINE TEMP-TABLE ttWithIndex NO-UNDO
    FIELD field1 AS INTEGER
    FIELD field2 AS CHARACTER
    FIELD field3 AS LOGICAL
    INDEX field1 field1.

DEFINE TEMP-TABLE ttWithoutIndex NO-UNDO
    FIELD field1 AS INTEGER
    FIELD field2 AS CHARACTER
    FIELD field3 AS LOGICAL.

DEFINE VARIABLE i              AS INTEGER     NO-UNDO.
DEFINE VARIABLE iWithCreate    AS INTEGER     NO-UNDO.
DEFINE VARIABLE iWithFind      AS INTEGER     NO-UNDO.
DEFINE VARIABLE iWithoutCreate AS INTEGER     NO-UNDO.
DEFINE VARIABLE iWithoutFind   AS INTEGER     NO-UNDO.

ETIME(TRUE).
DO i = 1 TO 1000:
    CREATE ttWithIndex.
    ttWithIndex.field1 = i.
END.
iWithCreate = ETIME.

ETIME(TRUE).
DO i = 1 TO 1000:
    CREATE ttWithoutIndex.
    ttWithoutIndex.field1 = i.
END.
iWithoutCreate = ETIME.

RELEASE ttWithIndex.
RELEASE ttWithoutIndex.

ETIME(TRUE).
DO i = 1 TO 1000:
    FIND FIRST ttWithIndex WHERE ttWithIndex.field1 = i NO-ERROR.
END.
iWithFind = ETIME.

ETIME(TRUE).
DO i = 1 TO 1000:
    FIND FIRST ttWithoutIndex WHERE ttWithoutIndex.field1 = i NO-ERROR.
END.
iWithoutFind = ETIME.

MESSAGE 
    "With index took" iWithFind "ms to find and" iWithCreate "ms to create" SKIP 
    "Without index took" iWithoutFind "ms to find and" iWithoutCreate "ms to create"
    VIEW-AS ALERT-BOX.

wprowadź opis zdjęcia tutaj

Wyszukiwanie z indeksem było około 70 razy szybsze w porównaniu z brakiem indeksu! To oczywiście tylko jedna seria, więc nie jest to dowód naukowy, ale konfiguracja indeksu będzie miała wpływ.

Wprowadzanie i wysyłanie tabel temp

Przekazywanie tabel tymczasowych do programów, procedur i funkcji jest bardzo proste.

Może to być przydatne, jeśli chcesz, aby procedura przetwarzała większą liczbę danych, niż możesz łatwo zapisać w ciągu lub podobnym. Możesz przekazywać tabele tymczasowe jako dane INPUT , OUTPUT i INPUT-OUTPUT .

Wprowadzanie jednej tabeli temp i wysyłanie innej:

DEFINE TEMP-TABLE ttRequest NO-UNDO
    FIELD fieldA AS CHARACTER
    FIELD fieldB AS CHARACTER.

/* Define a temp-table with the same fields and indices */
DEFINE TEMP-TABLE ttResponse NO-UNDO LIKE ttRequest.

/* A procedure that simply swap the values of fieldA and fieldB */
PROCEDURE swapFields:
    DEFINE INPUT  PARAMETER TABLE FOR ttRequest.
    DEFINE OUTPUT PARAMETER TABLE FOR ttResponse.

    FOR EACH ttRequest:
        CREATE ttResponse.
        ASSIGN 
            ttResponse.fieldA = ttRequest.fieldB
            ttResponse.fieldB = ttRequest.fieldA.
    END.
END PROCEDURE.

CREATE ttRequest.
ASSIGN ttRequest.fieldA = "A"
       ttRequest.fieldB = "B".

CREATE ttRequest.
ASSIGN ttRequest.fieldA = "B"
       ttRequest.fieldB = "C".

CREATE ttRequest.
ASSIGN ttRequest.fieldA = "C"
       ttRequest.fieldB = "D".

/* Call the procedure */
RUN swapFields ( INPUT  TABLE ttRequest
               , OUTPUT TABLE ttResponse).

FOR EACH ttResponse:
    DISPLAY ttResponse.
END.

Wynik:

fieldA--------fieldB--------

B             A
C             B
D             C

Dane wyjściowe tabeli temp:

DEFINE TEMP-TABLE ttCalculate NO-UNDO
    FIELD num1     AS INTEGER
    FIELD num2     AS INTEGER
    FIELD response AS DECIMAL.

PROCEDURE pythagoras:
    DEFINE INPUT-OUTPUT PARAMETER TABLE FOR ttCalculate.

    FOR EACH ttCalculate:
        ttCalculate.response = SQRT( EXP(num1, 2) + EXP(num2, 2)).
    END.

END PROCEDURE.

CREATE ttCalculate.
ASSIGN ttCalculate.num1 = 3
       ttCalculate.num2 = 4.

CREATE ttCalculate.
ASSIGN ttCalculate.num1 = 6
       ttCalculate.num2 = 8.

CREATE ttCalculate.
ASSIGN ttCalculate.num1 = 12
       ttCalculate.num2 = 16.

/* Call the procedure */
RUN pythagoras ( INPUT-OUTPUT  TABLE ttCalculate ).

FOR EACH ttCalculate:
    DISPLAY ttCalculate.
END.

Wynik:

----------num1-- ----------num2-- -------response-

         3                4             5.00
         6                8            10.00
        12               16            20.00

Przekazywanie do funkcji

DEFINE TEMP-TABLE ttNumbers NO-UNDO
    FIELD num1     AS INTEGER
    FIELD num2     AS INTEGER
    INDEX index1 num1 num2.

DEFINE VARIABLE iNum AS INTEGER     NO-UNDO.

/* Forward declare the function */
FUNCTION hasAPair RETURNS LOGICAL (INPUT TABLE ttNumbers) FORWARD.

DO iNum = 1 TO 100:
    CREATE ttNumbers.
    ASSIGN ttNumbers.num1 = RANDOM(1,100)
           ttNumbers.num2 = RANDOM(1,100).
END.

MESSAGE hasAPair(INPUT TABLE ttNumbers) VIEW-AS ALERT-BOX.


/* Function to check if two records has the same value in num1 and num2 */
FUNCTION hasAPair RETURNS LOGICAL (INPUT TABLE ttNumbers):

    FIND FIRST ttNumbers WHERE ttNumbers.num1 = ttNumbers.num2 NO-ERROR.
    IF AVAILABLE ttNumbers THEN
        RETURN TRUE.
    ELSE 
        RETURN FALSE.

END FUNCTION.

Przekazywanie do plików programu

Przekazujesz tabele tymczasowe do iz innych programów .p w taki sam sposób, jak przekazujesz je do innych procedur. Jedyna różnica polega na tym, że zarówno program wywołujący, jak i program wywoływany muszą mieć tę samą deklarację tabeli temp. Jednym prostym sposobem jest przechowywanie programu tabeli temp w trzecim pliku - dołączeniu używanym w obu programach.

Dołącz plik zawierający definicję tabeli temp: / * ttFile.i * / DEFINE TABELA TEMP ttFile NIE-Cofnij POLE fName JAKO FORMAT ZNAKU ”x (20)„ POLA isADirectory AS LOGICAL.

Program sprawdza wszystkie pliki w tabeli tymczasowej. Czy to są katalogi?

/* checkFiles.p */
{ttFile.i}

DEFINE INPUT-OUTPUT PARAMETER TABLE FOR ttFile.

FOR EACH ttFile:
    FILE-INFO:FILE-NAME = ttFile.fName.

    IF FILE-INFO:FILE-TYPE BEGINS "D" THEN
        ttFile.isADirectory = TRUE.
END.

Główny program:

{ttFile.i}

CREATE ttFile.
ASSIGN ttFile.fname = "c:\temp\".

CREATE ttFile.
ASSIGN ttFile.fname = "c:\Windows\".

CREATE ttFile.
ASSIGN ttFile.fname = "c:\Windoose\".

RUN checkFiles.p(INPUT-OUTPUT TABLE ttFile).

FOR EACH ttFile:
    DISPLAY ttFile.
END.

Wynik:

fName----------------- isADirector

c:\temp\               yes
c:\Windows\            yes
c:\Windoose\           no


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow