Skip to content

Commit b31b2d1

Browse files
committed
DELETE-Statement implemented
1 parent 964fa9a commit b31b2d1

7 files changed

+262
-18
lines changed

app/src/Inline Query/codeunit/InlineQueryCompiler.Codeunit.al

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ codeunit 50103 "Inline Query Compiler"
1818
case QueryType of
1919
QueryType::Select:
2020
exit(CompileSelectQuery(JQueryNode));
21+
QueryType::Delete:
22+
exit(CompileDeleteQuery(JQueryNode));
2123
else
2224
Error(NotImplementedErr, QueryType);
2325
end;
@@ -46,6 +48,23 @@ codeunit 50103 "Inline Query Compiler"
4648
exit(InlineQueryJsonHelper.AsSelectQuery(Top, JFields, JTable, JFilters, JOrderByFields));
4749
end;
4850

51+
local procedure CompileDeleteQuery(JQueryNode: JsonObject): JsonObject
52+
var
53+
Top: Integer;
54+
JParseTable: JsonObject;
55+
JParseFilters: JsonArray;
56+
JTable: JsonObject;
57+
JFilters: JsonArray;
58+
TableID: Integer;
59+
begin
60+
InlineQueryJsonHelper.ReadDeleteQuery(JQueryNode, Top, JParseTable, JParseFilters);
61+
62+
JTable := CompileTable(JParseTable, TableID);
63+
JFilters := CompileFilters(JParseFilters, TableID);
64+
65+
exit(InlineQueryJsonHelper.AsDeleteQuery(Top, JTable, JFilters));
66+
end;
67+
4968
local procedure CompileFilters(JFilters: JsonArray; TableID: Integer): JsonArray
5069
var
5170
JToken: JsonToken;

app/src/Inline Query/codeunit/InlineQueryImpl.Codeunit.al

Lines changed: 72 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ codeunit 50101 "Inline Query Impl"
77
InlineQueryTokenizer: Codeunit "Inline Query Tokenizer";
88
InlineQueryParser: Codeunit "Inline Query Parser";
99
InlineQueryCompiler: Codeunit "Inline Query Compiler";
10+
NotImplementedErr: Label 'Query Type ''%1'' not implemented.', Comment = '%1 = Query Type';
1011
EmptyQueryErr: Label 'Query should not be empty.';
1112
FunctionExpectedErr: Label 'Function expected.';
1213
SingleFunctionExpectedErr: Label 'A single function expected.';
@@ -114,15 +115,84 @@ codeunit 50101 "Inline Query Impl"
114115

115116
procedure AsJsonArray(QueryText: Text; JFieldHeaders: JsonArray; UseNames: Boolean): JsonArray
116117
var
117-
RecordRef: RecordRef;
118118
JQueryNode: JsonObject;
119+
QueryType: Enum "Inline Query Type";
120+
begin
121+
JQueryNode := Compile(QueryText);
122+
QueryType := InlineQueryJsonHelper.GetQueryType(JQueryNode);
123+
124+
case QueryType of
125+
QueryType::Select:
126+
exit(SelectQueryAsJsonArray(JQueryNode, JFieldHeaders, UseNames));
127+
QueryType::Delete:
128+
Execute(JQueryNode);
129+
else
130+
Error(NotImplementedErr, QueryType);
131+
end;
132+
end;
133+
134+
procedure Execute(QueryText: Text): Integer
135+
var
136+
JQueryNode: JsonObject;
137+
begin
138+
JQueryNode := Compile(QueryText);
139+
exit(Execute(JQueryNode));
140+
end;
141+
142+
local procedure Execute(JQueryNode: JsonObject): Integer
143+
var
144+
QueryType: Enum "Inline Query Type";
145+
begin
146+
QueryType := InlineQueryJsonHelper.GetQueryType(JQueryNode);
147+
148+
case QueryType of
149+
QueryType::Delete:
150+
exit(ExecuteDelete(JQueryNode));
151+
else
152+
Error(NotImplementedErr, QueryType);
153+
end;
154+
end;
155+
156+
local procedure ExecuteDelete(JQueryNode: JsonObject): Integer
157+
var
158+
RecordRef: RecordRef;
159+
Top: Integer;
160+
JTable: JsonObject;
161+
JFilters: JsonArray;
162+
Counter: Integer;
163+
begin
164+
InlineQueryJsonHelper.ReadDeleteQuery(JQueryNode, Top, JTable, JFilters);
165+
OpenTable(RecordRef, JTable);
166+
ApplyFilters(RecordRef, JFilters);
167+
168+
if Top = 0 then begin
169+
Counter := RecordRef.Count();
170+
RecordRef.DeleteAll(true);
171+
172+
exit(Counter);
173+
end;
174+
175+
if RecordRef.FindSet() then
176+
repeat
177+
RecordRef.Delete(true);
178+
179+
Counter += 1;
180+
if Counter = Top then
181+
break;
182+
until RecordRef.Next() = 0;
183+
184+
exit(Counter);
185+
end;
186+
187+
local procedure SelectQueryAsJsonArray(JQueryNode: JsonObject; JFieldHeaders: JsonArray; UseNames: Boolean): JsonArray
188+
var
189+
RecordRef: RecordRef;
119190
JFields: JsonArray;
120191
JTable: JsonObject;
121192
JFilters: JsonArray;
122193
JOrderByFields: JsonArray;
123194
Top: Integer;
124195
begin
125-
JQueryNode := Compile(QueryText);
126196
InlineQueryJsonHelper.ReadSelectQuery(JQueryNode, Top, JFields, JTable, JFilters, JOrderByFields);
127197

128198
if HasColumnFunctions(JFields) then

app/src/Inline Query/codeunit/InlineQueryJsonHelper.Codeunit.al

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ codeunit 50105 "Inline Query Json Helper"
44

55
var
66
QueryTypeTxt: Label 'QueryType', Locked = true;
7-
Select_Top_Txt: Label 'Top', Locked = true;
7+
Query_Top_Txt: Label 'Top', Locked = true;
8+
Query_Table_Txt: Label 'Table', Locked = true;
9+
Query_Filters_Txt: Label 'Filters', Locked = true;
810
Select_Fields_Txt: Label 'Fields', Locked = true;
9-
Select_Table_Txt: Label 'Table', Locked = true;
10-
Select_Filters_Txt: Label 'Filters', Locked = true;
1111
Select_OrderBy_Txt: Label 'OrderBy', Locked = true;
1212
Source_Table_Name_Txt: Label 'Table', Locked = true;
1313
Source_Table_Company_Txt: Label 'Company', Locked = true;
@@ -40,10 +40,10 @@ codeunit 50105 "Inline Query Json Helper"
4040
JQueryNode: JsonObject;
4141
begin
4242
JQueryNode.Add(QueryTypeTxt, "Inline Query Type"::Select.AsInteger());
43-
JQueryNode.Add(Select_Top_Txt, Top);
43+
JQueryNode.Add(Query_Top_Txt, Top);
4444
JQueryNode.Add(Select_Fields_Txt, JFields);
45-
JQueryNode.Add(Select_Table_Txt, JTable);
46-
JQueryNode.Add(Select_Filters_Txt, JFilters);
45+
JQueryNode.Add(Query_Table_Txt, JTable);
46+
JQueryNode.Add(Query_Filters_Txt, JFilters);
4747
JQueryNode.Add(Select_OrderBy_Txt, JOrderByFields);
4848

4949
exit(JQueryNode);
@@ -59,16 +59,16 @@ codeunit 50105 "Inline Query Json Helper"
5959
var
6060
JToken: JsonToken;
6161
begin
62-
if JQueryNode.Get(Select_Top_Txt, JToken) then
62+
if JQueryNode.Get(Query_Top_Txt, JToken) then
6363
Top := JToken.AsValue().AsInteger();
6464

6565
if JQueryNode.Get(Select_Fields_Txt, JToken) then
6666
JFields := JToken.AsArray();
6767

68-
if JQueryNode.Get(Select_Table_Txt, JToken) then
68+
if JQueryNode.Get(Query_Table_Txt, JToken) then
6969
JTable := JToken.AsObject();
7070

71-
if JQueryNode.Get(Select_Filters_Txt, JToken) then
71+
if JQueryNode.Get(Query_Filters_Txt, JToken) then
7272
JFilters := JToken.AsArray();
7373

7474
if JQueryNode.Get(Select_OrderBy_Txt, JToken) then
@@ -288,4 +288,37 @@ codeunit 50105 "Inline Query Json Helper"
288288
JFieldHeader.Add(Select_Header_Name_Txt, Name);
289289
exit(JFieldHeader);
290290
end;
291+
292+
procedure AsDeleteQuery(
293+
Top: Integer;
294+
JTable: JsonObject;
295+
JFilters: JsonArray): JsonObject
296+
var
297+
JQueryNode: JsonObject;
298+
begin
299+
JQueryNode.Add(QueryTypeTxt, "Inline Query Type"::Delete.AsInteger());
300+
JQueryNode.Add(Query_Top_Txt, Top);
301+
JQueryNode.Add(Query_Table_Txt, JTable);
302+
JQueryNode.Add(Query_Filters_Txt, JFilters);
303+
304+
exit(JQueryNode);
305+
end;
306+
307+
procedure ReadDeleteQuery(
308+
JQueryNode: JsonObject;
309+
var Top: Integer;
310+
var JTable: JsonObject;
311+
var JFilters: JsonArray)
312+
var
313+
JToken: JsonToken;
314+
begin
315+
if JQueryNode.Get(Query_Top_Txt, JToken) then
316+
Top := JToken.AsValue().AsInteger();
317+
318+
if JQueryNode.Get(Query_Table_Txt, JToken) then
319+
JTable := JToken.AsObject();
320+
321+
if JQueryNode.Get(Query_Filters_Txt, JToken) then
322+
JFilters := JToken.AsArray();
323+
end;
291324
}

app/src/Inline Query/codeunit/InlineQueryParser.Codeunit.al

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ codeunit 50102 "Inline Query Parser"
99
InvalidSyntaxNearErr: Label 'Incorrect syntax near ''%1''.', Comment = '%1 = Token Value';
1010
NotImplementedErr: Label 'Query type ''%1'' not implemented.', Comment = '%1 = Query Type';
1111
SelectKeywordTxt: Label 'SELECT', Locked = true;
12+
DeleteKeywordTxt: Label 'DELETE', Locked = true;
1213
TopKeywordTxt: Label 'TOP', Locked = true;
1314
WhereKeywordTxt: Label 'WHERE', Locked = true;
1415
AndKeywordTxt: Label 'AND', Locked = true;
@@ -33,6 +34,8 @@ codeunit 50102 "Inline Query Parser"
3334
case QueryType of
3435
QueryType::Select:
3536
exit(ParseSelectQuery(JTokens, Pos));
37+
QueryType::Delete:
38+
exit(ParseDeleteQuery(JTokens, Pos));
3639
else
3740
Error(NotImplementedErr, QueryType);
3841
end;
@@ -56,6 +59,32 @@ codeunit 50102 "Inline Query Parser"
5659
exit(InlineQueryJsonHelper.AsSelectQuery(Top, JFields, JTable, JFilters, JOrderByFields));
5760
end;
5861

62+
local procedure ParseDeleteQuery(JTokens: JsonArray; var Pos: Integer): JsonObject
63+
var
64+
Top: Integer;
65+
JTable: JsonObject;
66+
JFilters: JsonArray;
67+
begin
68+
Top := ParseTopClause(JTokens, Pos);
69+
ReadFromKeyword(JTokens, Pos);
70+
JTable := ParseTable(JTokens, Pos);
71+
JFilters := ParseFilters(JTokens, Pos);
72+
EndOfQuery(JTokens, Pos);
73+
74+
exit(InlineQueryJsonHelper.AsDeleteQuery(Top, JTable, JFilters));
75+
end;
76+
77+
local procedure ReadFromKeyword(JTokens: JsonArray; var Pos: Integer)
78+
var
79+
TokenValue: Text;
80+
TokenType: Enum "Inline Query Token Type";
81+
begin
82+
InlineQueryTokenizer.ReadToken(JTokens, Pos, TokenValue, TokenType, StrSubstNo(InvalidSyntaxNearErr, TokenValue));
83+
84+
if (UpperCase(TokenValue) <> FromKeywordTxt) then
85+
Error(InvalidSyntaxNearErr, TokenValue);
86+
end;
87+
5988
local procedure ParseTopClause(JTokens: JsonArray; var Pos: Integer): Integer
6089
var
6190
TokenValue: Text;
@@ -98,6 +127,8 @@ codeunit 50102 "Inline Query Parser"
98127
case UpperCase(TokenValue) of
99128
SelectKeywordTxt:
100129
exit("Inline Query Type"::Select);
130+
DeleteKeywordTxt:
131+
exit("Inline Query Type"::Delete);
101132
else
102133
Error(InvalidQueryErr, QueryText);
103134
end;
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
codeunit 50106 "Try Inline Query"
2+
{
3+
trigger OnRun()
4+
var
5+
InlineQuery: Codeunit "Inline Query";
6+
JFieldHeaders: JsonArray;
7+
begin
8+
JResult := InlineQuery.AsJsonArray(QueryText, JFieldHeaders, true);
9+
end;
10+
11+
procedure SetQuery(NewQueryText: Text)
12+
begin
13+
QueryText := NewQueryText;
14+
end;
15+
16+
procedure GetResult(): JsonArray
17+
begin
18+
exit(JResult);
19+
end;
20+
21+
var
22+
QueryText: Text;
23+
JResult: JsonArray;
24+
}

app/src/Inline Query/page/InlineQueryAnalyzer.Page.al

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,25 @@ page 50100 "Inline Query Analyzer"
1616

1717
trigger ExecuteQuery(QueryText: Text)
1818
begin
19-
if not ExecuteQuery(QueryText) then
20-
CurrPage.QueryAnalyzerControlAddIn.UpdateError(QueryText, GetLastErrorText);
19+
ExecuteQuery(QueryText);
2120
end;
2221
}
2322
}
2423
}
2524

26-
[TryFunction]
2725
local procedure ExecuteQuery(QueryText: Text)
2826
var
29-
InlineQuery: Codeunit "Inline Query";
30-
JRows: JsonArray;
27+
TryInlineQuery: Codeunit "Try Inline Query";
28+
JResult: JsonArray;
3129
JFieldHeaders: JsonArray;
3230
begin
33-
JRows := InlineQuery.AsJsonArray(QueryText, JFieldHeaders, true);
34-
CurrPage.QueryAnalyzerControlAddIn.UpdateResults(QueryText, JFieldHeaders, JRows);
31+
TryInlineQuery.SetQuery(QueryText);
32+
if not TryInlineQuery.Run() then begin
33+
CurrPage.QueryAnalyzerControlAddIn.UpdateError(QueryText, GetLastErrorText);
34+
exit;
35+
end;
36+
37+
JResult := TryInlineQuery.GetResult();
38+
CurrPage.QueryAnalyzerControlAddIn.UpdateResults(QueryText, JFieldHeaders, JResult);
3539
end;
3640
}

0 commit comments

Comments
 (0)