수색…


소개

TEMP-TABLE 은 Progress ABL의 매우 강력한 기능입니다. 복잡한 논리를 작성하는 데 사용할 수있는 임시 인 메모리 (대부분 최소한) 테이블입니다. 프로 시저, 함수 및 기타 프로그램에 대한 입 / 출력 매개 변수로 사용할 수 있습니다. 하나 이상의 임시 테이블이 DATASET (종종 ProDataset이라고 함)의 기초를 구성 할 수 있습니다.

네이티브 Progress 데이터베이스 테이블로 수행 할 수있는 거의 모든 작업은 임시 테이블을 사용하여 수행 할 수 있습니다.

간단한 임시 테이블 정의

이것은 세 개의 필드가있는 ttTempTable이라는 TEMP-TABLE 의 정의입니다. NO-UNDO 는 실행 취소 처리가 필요하지 않음을 나타냅니다 (실제로는 반대가 필요하지 않으면 일반적으로 수행하려는 작업입니다).

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

인덱스가있는 임시 테이블

임시 테이블은 쿼리를 실행할 계획이라면 인덱스를 사용하여 만들 수 있습니다.

이 테이블에는 하나의 필드 (field1)를 포함하는 하나의 인덱스 (index1)가 있습니다. 이 색인은 기본적이고 고유합니다 (두 개의 레코드가 field1과 동일한 내용을 가질 수 없음을 의미).

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

인덱스 추가 - 인덱스 ...

각 임시 테이블에 대해 여러 인덱스를 정의 할 수 있습니다. 필요한 경우 - 정의하십시오. 기본적으로 쿼리 및 / 또는 정렬 순서와 일치하는 인덱스가 성능에 도움이됩니다!

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.

여기에 이미지 설명을 입력하십시오.

색인으로 검색하는 것은 색인없이 비교하여 약 70 배 더 빠릅니다! 이것은 물론 하나의 과정이므로 과학적 증거는 아니지만 색인 설정이 효과를 발휘합니다.

임시 테이블 입력 및 출력

프로그램, 프로 시저 및 함수에서 임시 테이블을 전달하는 것은 매우 간단합니다.

문자열이나 비슷한 것으로 쉽게 저장할 수있는 것보다 많은 수의 데이터를 처리하는 프로 시저가 필요하면 편리 할 수 ​​있습니다. 임시 테이블을 INPUT , OUTPUTINPUT-OUTPUT 데이터로 전달할 수 있습니다.

하나의 임시 테이블을 입력하고 다른 테이블을 출력하는 중 :

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.

결과:

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

B             A
C             B
D             C

임시 테이블 입력 - 출력 :

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.

결과:

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

         3                4             5.00
         6                8            10.00
        12               16            20.00

함수에 전달

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.

프로그램 파일에 전달

임시 테이블을 다른 .p 프로그램에 전달하거나 다른 프로 시저에서 전달하는 것과 같은 방법으로 임시 테이블을 전달합니다. 유일한 차이점은 호출하는 프로그램과 호출 된 프로그램이 동일한 임시 테이블 선언을 가져야한다는 것입니다. 하나의 쉬운 방법은 두 번째 프로그램에 사용되는 포함 파일 인 세 번째 파일에 임시 테이블 프로그램을 저장하는 것입니다.

임시 테이블 정의를 포함하는 파일을 포함하십시오. / * ttFile.i * / DEFINE TEMP-TABLE ttFile NO - UNDO FIELD fName AS CHARACTER FORMAT "x (20)"FIELD는 AS LOGICAL으로 표시됩니다.

임시 테이블에있는 모든 파일을 검사하는 프로그램입니다. 디렉토리입니까?

/* 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.

주요 프로그램 :

{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.

결과:

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

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


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow