progress-4gl
TABELA TEMP
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.
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