Project

General

Profile

hql-issue.p

Ovidiu Maxiniuc, 04/20/2015 01:41 PM

Download (2.49 KB)

 
1
DEFINE TEMP-TABLE tt1
2
    FIELD f1 AS INT
3
    FIELD f2 AS DATE.
4

    
5
CREATE tt1.
6
ASSIGN tt1.f1 = -1 tt1.f2 = ?.
7

    
8
CREATE tt1.
9
ASSIGN tt1.f1 = 2 tt1.f2 = TODAY.
10

    
11
CREATE tt1.
12
ASSIGN tt1.f1 = 3 tt1.f2 = ?.
13

    
14
CREATE tt1.
15
ASSIGN tt1.f1 = 5 tt1.f2 = 12/12/12.
16

    
17
DEFINE TEMP-TABLE tt2
18
    FIELD f1 AS INT
19
    FIELD f2 AS DATE.
20

    
21
CREATE tt2.
22
ASSIGN tt2.f1 = -1 tt2.f2 = 01/01/01.
23

    
24
CREATE tt2.
25
ASSIGN tt2.f1 = 2 tt2.f2 = TODAY.
26

    
27
CREATE tt2.
28
ASSIGN tt2.f1 = 3 tt2.f2 = ?.
29

    
30
CREATE tt2.
31
ASSIGN tt2.f1 = 5 tt2.f2 = 12/12/12.
32

    
33

    
34
/* common for multiple functions */
35
DEFINE QUERY qq FOR tt1, tt2.
36
DEFINE VAR cnt AS INTEGER.
37

    
38
FUNCTION f-dynamic RETURN INTEGER () :
39
   DISPLAY "Dynamic" SKIP WITH NO-LABEL FRAME fr-dynamic.
40
   DEFINE VARIABLE qh AS HANDLE NO-UNDO.
41
   CREATE QUERY qh.
42
   qh:SET-BUFFERS(BUFFER tt1:HANDLE, BUFFER tt2:HANDLE).
43
   qh:QUERY-PREPARE("FOR EACH tt1, EACH tt2 WHERE tt2.f1 EQ tt1.f1 AND tt2.f2 EQ tt1.f2").
44
   qh:QUERY-OPEN.
45
   qh:GET-NEXT(NO-LOCK).
46
   cnt = 1.
47

    
48
   DO WHILE NOT qh:QUERY-OFF-END:
49
      DISPLAY tt1 WITH FRAME fr-dynamic.
50
      DISPLAY tt2 WITH FRAME fr-dynamic.
51
      cnt = cnt * tt1.f1.
52
      qh:GET-NEXT().
53
   END.
54
   
55
   qh:QUERY-CLOSE().
56
   DELETE OBJECT qh.
57
   RETURN cnt.
58
END FUNCTION.
59

    
60

    
61
FUNCTION f-static RETURN INTEGER () :
62
   DISPLAY "Static" SKIP WITH NO-LABEL FRAME fr-static.
63
   cnt = 1.
64

    
65
   FOR EACH tt1, EACH tt2 WHERE tt2.f1 EQ tt1.f1 AND tt2.f2 EQ tt1.f2:
66
      DISPLAY tt1 WITH FRAME fr-static.
67
      DISPLAY tt2 WITH FRAME fr-static.
68
      cnt = cnt * tt1.f1.
69
   END.
70
   
71
   RETURN cnt.
72
END FUNCTION.
73

    
74

    
75
FUNCTION f-static-query RETURN INTEGER () :
76
   DISPLAY "Static Query" SKIP WITH NO-LABEL FRAME fr-static-query.
77
   OPEN QUERY qq FOR EACH tt1, EACH tt2 WHERE tt2.f1 EQ tt1.f1 AND tt2.f2 EQ tt1.f2.
78
   GET FIRST qq. 
79
   cnt = 1.
80
   
81
   DO WHILE AVAILABLE tt1:
82
      DISPLAY tt1 WITH FRAME fr-static-query.
83
      DISPLAY tt2 WITH FRAME fr-static-query.
84
      cnt = cnt * tt1.f1.
85
      GET NEXT qq.
86
   END.
87

    
88
   RETURN cnt.
89
END FUNCTION.
90

    
91

    
92
FUNCTION f-static-preselect RETURN INTEGER () :
93
   DISPLAY "Static Preselect" SKIP WITH NO-LABEL FRAME fr-static-preselect.
94
   OPEN QUERY qq PRESELECT EACH tt1, EACH tt2 WHERE tt2.f1 EQ tt1.f1 AND tt2.f2 EQ tt1.f2.
95
   GET FIRST qq. 
96
   cnt = 1.
97
   
98
   DO WHILE AVAILABLE tt1:
99
      DISPLAY tt1 WITH FRAME fr-static-preselect.
100
      DISPLAY tt2 WITH FRAME fr-static-preselect.
101
      cnt = cnt * tt1.f1.
102
      GET NEXT qq.
103
   END.
104

    
105
   RETURN cnt.
106
END FUNCTION.
107

    
108
DISPLAY  "Expected: 2 * 3 * 5 = 30" SKIP
109
         f-dynamic() f-static() f-static-query() f-static-preselect().
110

    
111