-
Notifications
You must be signed in to change notification settings - Fork 15
/
RecordDeletionMgt.Codeunit.al
569 lines (547 loc) · 31.1 KB
/
RecordDeletionMgt.Codeunit.al
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
codeunit 50000 "Record Deletion Mgt."
{
Permissions = TableData "17" = IMD, Tabledata "36" = IMD, Tabledata "37" = IMD, Tabledata "38" = IMD, Tabledata "39" = IMD, Tabledata "81" = IMD, Tabledata "21" = IMD, Tabledata "25" = IMD, Tabledata "32" = IMD, Tabledata "110" = IMD, TableData "111" = IMD, TableData "112" = IMD, TableData "113" = IMD, TableData "114" = IMD, TableData "115" = IMD, TableData "120" = IMD, Tabledata "121" = IMD, Tabledata "122" = IMD, Tabledata "123" = IMD, Tabledata "124" = IMD, Tabledata "125" = IMD, Tabledata "169" = IMD, Tabledata "379" = IMD, Tabledata "380" = IMD, Tabledata "271" = IMD, Tabledata "5802" = IMD, tabledata "6650" = IMD, tabledata "6660" = IMD;
procedure InsertUpdateTables();
var
RecordDeletion: Record "Record Deletion";
AllObjWithCaption: Record AllObjWithCaption;
begin
AllObjWithCaption.SetRange("Object Type", AllObjWithCaption."Object Type"::Table);
// Do not include system tables
AllObjWithCaption.SetFilter("Object ID", '< %1', 2000000001);
if AllObjWithCaption.FindSet() then
repeat
RecordDeletion.Init();
RecordDeletion."Table ID" := AllObjWithCaption."Object ID";
RecordDeletion.Company := CopyStr(CompanyName, 1, MaxStrLen(RecordDeletion.Company));
if RecordDeletion.Insert() then;
until AllObjWithCaption.Next() = 0;
end;
procedure SuggestRecordsToDelete();
var
RecordDeletion: Record "Record Deletion";
BeforeSuggestionDeleteCount: Integer;
AfterSuggestionDeleteCount: Integer;
RecordsWereSuggestedMsg: Label '%1 records to delete were suggested.', Comment = '%1 = number of suggested records';
begin
RecordDeletion.SetRange("Delete Records", true);
BeforeSuggestionDeleteCount := RecordDeletion.Count();
SetSuggestedTable(Database::"Action Message Entry");
SetSuggestedTable(Database::"Analysis View Budget Entry");
SetSuggestedTable(Database::"Analysis View Entry");
SetSuggestedTable(Database::"Analysis View");
SetSuggestedTable(Database::"Approval Comment Line");
SetSuggestedTable(Database::"Approval Entry");
SetSuggestedTable(Database::"Assemble-to-Order Link");
SetSuggestedTable(Database::"Assembly Comment Line");
SetSuggestedTable(Database::"Assembly Header");
SetSuggestedTable(Database::"Assembly Line");
SetSuggestedTable(Database::"Avg. Cost Adjmt. Entry Point");
SetSuggestedTable(Database::"Bank Acc. Reconciliation Line");
SetSuggestedTable(Database::"Bank Acc. Reconciliation");
SetSuggestedTable(Database::"Bank Account Ledger Entry");
SetSuggestedTable(Database::"Bank Account Ledger Entry");
SetSuggestedTable(Database::"Bank Account Statement Line");
SetSuggestedTable(Database::"Bank Account Statement");
SetSuggestedTable(Database::"Bank Stmt Multiple Match Line");
SetSuggestedTable(Database::"Campaign Entry");
SetSuggestedTable(Database::"Capacity Ledger Entry");
SetSuggestedTable(Database::"Cash Flow Manual Revenue");
SetSuggestedTable(Database::"Cash Flow Manual Expense");
SetSuggestedTable(Database::"Cash Flow Forecast Entry");
SetSuggestedTable(Database::"Cash Flow Worksheet Line");
SetSuggestedTable(Database::"Certificate of Supply");
SetSuggestedTable(Database::"Change Log Entry");
SetSuggestedTable(Database::"Check Ledger Entry");
SetSuggestedTable(Database::"Comment Line");
SetSuggestedTable(Database::"Contract Change Log");
SetSuggestedTable(Database::"Contract Gain/Loss Entry");
SetSuggestedTable(Database::"Contract/Service Discount");
SetSuggestedTable(Database::"Cost Budget Entry");
SetSuggestedTable(Database::"Cost Budget Register");
SetSuggestedTable(Database::"Cost Entry");
SetSuggestedTable(Database::"Cost Journal Line");
SetSuggestedTable(Database::"Cost Register");
SetSuggestedTable(Database::"Credit Trans Re-export History");
SetSuggestedTable(Database::"Credit Transfer Entry");
SetSuggestedTable(Database::"Credit Transfer Register");
SetSuggestedTable(Database::"Cust. Ledger Entry");
SetSuggestedTable(Database::"Date Compr. Register");
SetSuggestedTable(Database::"Detailed Cust. Ledg. Entry");
SetSuggestedTable(Database::"Detailed Vendor Ledg. Entry");
SetSuggestedTable(Database::"Dimension Set Entry");
SetSuggestedTable(Database::"Dimension Set Tree Node");
SetSuggestedTable(Database::"Direct Debit Collection Entry");
SetSuggestedTable(Database::"Direct Debit Collection");
// SetSuggestedTable(Database::"DO Payment Trans. Log Entry");
SetSuggestedTable(Database::"Document Entry");
SetSuggestedTable(Database::"Email Item");
SetSuggestedTable(Database::"Employee Absence");
SetSuggestedTable(Database::"Error Buffer");
SetSuggestedTable(Database::"Exch. Rate Adjmt. Reg.");
SetSuggestedTable(Database::"FA G/L Posting Buffer");
SetSuggestedTable(Database::"FA Ledger Entry");
SetSuggestedTable(Database::"FA Register");
SetSuggestedTable(Database::"Filed Contract Line");
SetSuggestedTable(Database::"Filed Service Contract Header");
SetSuggestedTable(Database::"Fin. Charge Comment Line");
SetSuggestedTable(Database::"Finance Charge Memo Header");
SetSuggestedTable(Database::"Finance Charge Memo Line");
SetSuggestedTable(Database::"G/L - Item Ledger Relation");
SetSuggestedTable(Database::"G/L Budget Entry");
SetSuggestedTable(Database::"G/L Budget Name");
SetSuggestedTable(Database::"G/L Entry - VAT Entry Link");
SetSuggestedTable(Database::"G/L Entry");
SetSuggestedTable(Database::"G/L Register");
SetSuggestedTable(Database::"Gen. Jnl. Allocation");
SetSuggestedTable(Database::"Gen. Journal Line");
SetSuggestedTable(Database::"Handled IC Inbox Jnl. Line");
SetSuggestedTable(Database::"Handled IC Inbox Purch. Header");
SetSuggestedTable(Database::"Handled IC Inbox Purch. Line");
SetSuggestedTable(Database::"Handled IC Inbox Sales Header");
SetSuggestedTable(Database::"Handled IC Inbox Sales Line");
SetSuggestedTable(Database::"Handled IC Inbox Trans.");
SetSuggestedTable(Database::"Handled IC Outbox Jnl. Line");
SetSuggestedTable(Database::"Handled IC Outbox Purch. Hdr");
SetSuggestedTable(Database::"Handled IC Outbox Purch. Line");
SetSuggestedTable(Database::"Handled IC Outbox Sales Header");
SetSuggestedTable(Database::"Handled IC Outbox Sales Line");
SetSuggestedTable(Database::"Handled IC Outbox Trans.");
SetSuggestedTable(Database::"IC Comment Line");
SetSuggestedTable(Database::"IC Document Dimension");
SetSuggestedTable(Database::"IC Inbox Jnl. Line");
SetSuggestedTable(Database::"IC Inbox Purchase Header");
SetSuggestedTable(Database::"IC Inbox Purchase Line");
SetSuggestedTable(Database::"IC Inbox Sales Header");
SetSuggestedTable(Database::"IC Inbox Sales Line");
SetSuggestedTable(Database::"IC Inbox Transaction");
SetSuggestedTable(Database::"IC Inbox/Outbox Jnl. Line Dim.");
SetSuggestedTable(Database::"IC Outbox Jnl. Line");
SetSuggestedTable(Database::"IC Outbox Purchase Header");
SetSuggestedTable(Database::"IC Outbox Purchase Line");
SetSuggestedTable(Database::"IC Outbox Sales Header");
SetSuggestedTable(Database::"IC Outbox Sales Line");
SetSuggestedTable(Database::"IC Outbox Transaction");
SetSuggestedTable(Database::"Incoming Document");
SetSuggestedTable(Database::"Ins. Coverage Ledger Entry");
SetSuggestedTable(Database::"Insurance Register");
SetSuggestedTable(Database::"Inter. Log Entry Comment Line");
SetSuggestedTable(Database::"Interaction Log Entry");
SetSuggestedTable(Database::"Internal Movement Header");
SetSuggestedTable(Database::"Internal Movement Line");
SetSuggestedTable(Database::"Intrastat Jnl. Line");
SetSuggestedTable(Database::"Inventory Adjmt. Entry (Order)");
SetSuggestedTable(Database::"Inventory Period Entry");
SetSuggestedTable(Database::"Inventory Report Entry");
SetSuggestedTable(Database::"Issued Fin. Charge Memo Header");
SetSuggestedTable(Database::"Issued Fin. Charge Memo Line");
SetSuggestedTable(Database::"Issued Reminder Header");
SetSuggestedTable(Database::"Issued Reminder Line");
SetSuggestedTable(Database::"Item Analysis View Budg. Entry");
SetSuggestedTable(Database::"Item Analysis View Entry");
SetSuggestedTable(Database::"Item Analysis View");
SetSuggestedTable(Database::"Item Application Entry History");
SetSuggestedTable(Database::"Item Application Entry");
SetSuggestedTable(Database::"Item Budget Entry");
SetSuggestedTable(Database::"Item Charge Assignment (Purch)");
SetSuggestedTable(Database::"Item Charge Assignment (Sales)");
SetSuggestedTable(Database::"Item Entry Relation");
SetSuggestedTable(Database::"Item Journal Line");
SetSuggestedTable(Database::"Item Ledger Entry");
SetSuggestedTable(Database::"Item Register");
SetSuggestedTable(Database::"Item Tracking Comment");
SetSuggestedTable(Database::"Job Entry No.");
// SetSuggestedTable(Database::"Job G/L Account Price");
// SetSuggestedTable(Database::"Job Item Price");
SetSuggestedTable(Database::"Job Journal Line");
SetSuggestedTable(Database::"Job Ledger Entry");
SetSuggestedTable(Database::"Job Planning Line Invoice");
SetSuggestedTable(Database::"Job Planning Line");
SetSuggestedTable(Database::"Job Queue Log Entry");
SetSuggestedTable(Database::"Job Register");
// SetSuggestedTable(Database::"Job Resource Price");
SetSuggestedTable(Database::"Job Task Dimension");
SetSuggestedTable(Database::"Job Task");
SetSuggestedTable(Database::"Job Task");
SetSuggestedTable(Database::"Job Usage Link");
SetSuggestedTable(Database::"Job WIP Entry");
SetSuggestedTable(Database::"Job WIP G/L Entry");
SetSuggestedTable(Database::"Job WIP Total");
SetSuggestedTable(Database::"Job WIP Warning");
SetSuggestedTable(Database::"Loaner Entry");
SetSuggestedTable(Database::"Lot No. Information");
SetSuggestedTable(Database::"Maintenance Ledger Entry");
SetSuggestedTable(Database::"Maintenance Registration");
SetSuggestedTable(Database::"Opportunity Entry");
SetSuggestedTable(Database::"Order Promising Line");
SetSuggestedTable(Database::"Order Tracking Entry");
// SetSuggestedTable(Database::"Overdue Notification Entry");
SetSuggestedTable(Database::"Payable Vendor Ledger Entry");
SetSuggestedTable(Database::"Payment Application Proposal");
SetSuggestedTable(Database::"Payment Export Data");
SetSuggestedTable(Database::"Payment Jnl. Export Error Text");
SetSuggestedTable(Database::"Payment Matching Details");
SetSuggestedTable(Database::"Phys. Inventory Ledger Entry");
SetSuggestedTable(Database::"Planning Assignment");
SetSuggestedTable(Database::"Planning Component");
SetSuggestedTable(Database::"Planning Error Log");
SetSuggestedTable(Database::"Planning Routing Line");
SetSuggestedTable(Database::"Post Value Entry to G/L");
SetSuggestedTable(Database::"Posted Approval Comment Line");
SetSuggestedTable(Database::"Posted Approval Entry");
SetSuggestedTable(Database::"Posted Assemble-to-Order Link");
SetSuggestedTable(Database::"Posted Assembly Header");
SetSuggestedTable(Database::"Posted Assembly Line");
SetSuggestedTable(Database::"Posted Invt. Pick Header");
SetSuggestedTable(Database::"Posted Invt. Pick Line");
SetSuggestedTable(Database::"Posted Invt. Put-away Header");
SetSuggestedTable(Database::"Posted Invt. Put-away Line");
SetSuggestedTable(Database::"Posted Payment Recon. Hdr");
SetSuggestedTable(Database::"Posted Payment Recon. Line");
SetSuggestedTable(Database::"Posted Whse. Receipt Header");
SetSuggestedTable(Database::"Posted Whse. Receipt Line");
SetSuggestedTable(Database::"Posted Whse. Shipment Header");
SetSuggestedTable(Database::"Posted Whse. Shipment Line");
// SetSuggestedTable(Database::"Posting Exch. Field");
// SetSuggestedTable(Database::"Posting Exch.");
SetSuggestedTable(Database::"Prod. Order Capacity Need");
SetSuggestedTable(Database::"Prod. Order Comment Line");
SetSuggestedTable(Database::"Prod. Order Comp. Cmt Line");
SetSuggestedTable(Database::"Prod. Order Component");
SetSuggestedTable(Database::"Prod. Order Line");
SetSuggestedTable(Database::"Prod. Order Routing Line");
SetSuggestedTable(Database::"Prod. Order Routing Personnel");
SetSuggestedTable(Database::"Prod. Order Routing Tool");
SetSuggestedTable(Database::"Prod. Order Rtng Comment Line");
SetSuggestedTable(Database::"Prod. Order Rtng Qlty Meas.");
SetSuggestedTable(Database::"Production Forecast Entry");
SetSuggestedTable(Database::"Production Order");
SetSuggestedTable(Database::"Purch. Comment Line Archive");
SetSuggestedTable(Database::"Purch. Comment Line");
SetSuggestedTable(Database::"Purch. Cr. Memo Hdr.");
SetSuggestedTable(Database::"Purch. Cr. Memo Line");
SetSuggestedTable(Database::"Purch. Inv. Header");
SetSuggestedTable(Database::"Purch. Inv. Line");
SetSuggestedTable(Database::"Purch. Rcpt. Header");
SetSuggestedTable(Database::"Purch. Rcpt. Line");
SetSuggestedTable(Database::"Purchase Header Archive");
SetSuggestedTable(Database::"Purchase Header");
SetSuggestedTable(Database::"Purchase Line Archive");
SetSuggestedTable(Database::"Purchase Line");
SetSuggestedTable(Database::"Registered Invt. Movement Hdr.");
SetSuggestedTable(Database::"Registered Invt. Movement Line");
SetSuggestedTable(Database::"Registered Whse. Activity Hdr.");
SetSuggestedTable(Database::"Registered Whse. Activity Line");
SetSuggestedTable(Database::"Reminder Comment Line");
SetSuggestedTable(Database::"Reminder Header");
SetSuggestedTable(Database::"Reminder Line");
SetSuggestedTable(Database::"Reminder/Fin. Charge Entry");
SetSuggestedTable(Database::"Requisition Line");
SetSuggestedTable(Database::"Res. Capacity Entry");
SetSuggestedTable(Database::"Res. Journal Line");
SetSuggestedTable(Database::"Res. Ledger Entry");
SetSuggestedTable(Database::"Reservation Entry");
SetSuggestedTable(Database::"Resource Register");
SetSuggestedTable(Database::"Return Receipt Header");
SetSuggestedTable(Database::"Return Receipt Line");
SetSuggestedTable(Database::"Return Shipment Header");
SetSuggestedTable(Database::"Return Shipment Line");
SetSuggestedTable(Database::"Returns-Related Document");
SetSuggestedTable(Database::"Reversal Entry");
SetSuggestedTable(Database::"Rounding Residual Buffer");
SetSuggestedTable(Database::"Sales Comment Line Archive");
SetSuggestedTable(Database::"Sales Comment Line");
SetSuggestedTable(Database::"Sales Cr.Memo Header");
SetSuggestedTable(Database::"Sales Cr.Memo Line");
SetSuggestedTable(Database::"Sales Header Archive");
SetSuggestedTable(Database::"Sales Header");
SetSuggestedTable(Database::"Sales Invoice Header");
SetSuggestedTable(Database::"Sales Invoice Line");
SetSuggestedTable(Database::"Sales Line Archive");
SetSuggestedTable(Database::"Sales Line");
SetSuggestedTable(Database::"Sales Planning Line");
SetSuggestedTable(Database::"Sales Shipment Header");
SetSuggestedTable(Database::"Sales Shipment Line");
SetSuggestedTable(Database::"Segment Criteria Line");
SetSuggestedTable(Database::"Segment Header");
SetSuggestedTable(Database::"Segment History");
SetSuggestedTable(Database::"Segment Interaction Language");
SetSuggestedTable(Database::"Segment Line");
SetSuggestedTable(Database::"Serial No. Information");
SetSuggestedTable(Database::"Service Comment Line");
SetSuggestedTable(Database::"Service Contract Header");
SetSuggestedTable(Database::"Service Contract Line");
SetSuggestedTable(Database::"Service Cr.Memo Header");
SetSuggestedTable(Database::"Service Cr.Memo Line");
SetSuggestedTable(Database::"Service Document Log");
SetSuggestedTable(Database::"Service Document Register");
// SetSuggestedTable(Database::"Service E-Mail Queue");
SetSuggestedTable(Database::"Service Header");
SetSuggestedTable(Database::"Service Invoice Header");
SetSuggestedTable(Database::"Service Invoice Line");
SetSuggestedTable(Database::"Service Item Component");
SetSuggestedTable(Database::"Service Item Line");
SetSuggestedTable(Database::"Service Item Log");
SetSuggestedTable(Database::"Service Item");
SetSuggestedTable(Database::"Service Ledger Entry");
SetSuggestedTable(Database::"Service Line Price Adjmt.");
SetSuggestedTable(Database::"Service Line");
SetSuggestedTable(Database::"Service Order Allocation");
SetSuggestedTable(Database::"Service Register");
SetSuggestedTable(Database::"Service Shipment Header");
SetSuggestedTable(Database::"Service Shipment Item Line");
SetSuggestedTable(Database::"Service Shipment Line");
SetSuggestedTable(Database::"Time Sheet Cmt. Line Archive");
SetSuggestedTable(Database::"Time Sheet Comment Line");
SetSuggestedTable(Database::"Time Sheet Detail Archive");
SetSuggestedTable(Database::"Time Sheet Detail");
SetSuggestedTable(Database::"Time Sheet Header Archive");
SetSuggestedTable(Database::"Time Sheet Header");
SetSuggestedTable(Database::"Time Sheet Line Archive");
SetSuggestedTable(Database::"Time Sheet Line");
SetSuggestedTable(Database::"Time Sheet Posting Entry");
SetSuggestedTable(Database::"To-do");
SetSuggestedTable(Database::"Tracking Specification");
SetSuggestedTable(Database::"Transfer Header");
SetSuggestedTable(Database::"Transfer Line");
SetSuggestedTable(Database::"Transfer Receipt Header");
SetSuggestedTable(Database::"Transfer Receipt Line");
SetSuggestedTable(Database::"Transfer Shipment Header");
SetSuggestedTable(Database::"Transfer Shipment Line");
SetSuggestedTable(Database::"Unplanned Demand");
SetSuggestedTable(Database::"Untracked Planning Element");
SetSuggestedTable(Database::"Value Entry Relation");
SetSuggestedTable(Database::"Value Entry");
SetSuggestedTable(Database::"VAT Entry");
SetSuggestedTable(Database::"VAT Rate Change Log Entry");
SetSuggestedTable(Database::"VAT Report Header");
SetSuggestedTable(Database::"VAT Report Line");
SetSuggestedTable(Database::"VAT Report Line Relation");
SetSuggestedTable(Database::"VAT Report Error Log");
SetSuggestedTable(Database::"Vendor Ledger Entry");
SetSuggestedTable(Database::"Warehouse Activity Header");
SetSuggestedTable(Database::"Warehouse Activity Line");
SetSuggestedTable(Database::"Warehouse Entry");
SetSuggestedTable(Database::"Warehouse Journal Line");
SetSuggestedTable(Database::"Warehouse Receipt Header");
SetSuggestedTable(Database::"Warehouse Receipt Line");
SetSuggestedTable(Database::"Warehouse Register");
SetSuggestedTable(Database::"Warehouse Request");
SetSuggestedTable(Database::"Warehouse Shipment Header");
SetSuggestedTable(Database::"Warehouse Shipment Line");
SetSuggestedTable(Database::"Warranty Ledger Entry");
SetSuggestedTable(Database::"Whse. Internal Pick Header");
SetSuggestedTable(Database::"Whse. Internal Pick Line");
SetSuggestedTable(Database::"Whse. Internal Put-away Header");
SetSuggestedTable(Database::"Whse. Internal Put-away Line");
SetSuggestedTable(Database::"Whse. Item Entry Relation");
SetSuggestedTable(Database::"Whse. Item Tracking Line");
SetSuggestedTable(Database::"Whse. Pick Request");
SetSuggestedTable(Database::"Whse. Put-away Request");
SetSuggestedTable(Database::"Whse. Worksheet Line");
SetSuggestedTable(Database::Attachment);
SetSuggestedTable(Database::Attendee);
SetSuggestedTable(Database::Job);
SetSuggestedTable(Database::Opportunity);
RecordDeletion.SetRange("Delete Records", true);
AfterSuggestionDeleteCount := RecordDeletion.Count();
Message(RecordsWereSuggestedMsg, AfterSuggestionDeleteCount - BeforeSuggestionDeleteCount);
end;
procedure ClearRecordsToDelete();
var
RecordDeletion: Record "Record Deletion";
begin
RecordDeletion.ModifyAll("Delete Records", false);
end;
procedure DeleteRecords(RunTrigger: Boolean);
var
RecordDeletion: Record "Record Deletion";
RecordDeletionRelError: Record "Record Deletion Rel. Error";
RecordRef: RecordRef;
UpdateDialog: Dialog;
DeleteRecordsQst: Label 'Delete Records with RunTrigger = false?';
DeleteRecordsWithTriggerQst: Label 'Delete Records with RunTrigger = true?';
DeletingRecordsTxt: Label 'Deleting Records!\Table: #1#######', Comment = '%1 = Table ID';
begin
if RunTrigger then begin
if not Confirm(DeleteRecordsWithTriggerQst, false) then
exit;
#pragma warning disable AA0005
end else begin
if not Confirm(DeleteRecordsQst, false) then
exit;
end;
#pragma warning restore AA0005
UpdateDialog.OPEN(DeletingRecordsTxt);
if RecordDeletion.FindSet() then
repeat
if RecordDeletion."Delete Records" then begin
UpdateDialog.Update(1, Format(RecordDeletion."Table ID"));
RecordRef.OPEN(RecordDeletion."Table ID");
RecordRef.DeleteAll(RunTrigger);
RecordRef.Close();
RecordDeletionRelError.SetRange("Table ID", RecordDeletion."Table ID");
RecordDeletionRelError.DeleteAll();
end;
until RecordDeletion.Next() = 0;
UpdateDialog.Close();
end;
procedure CheckTableRelations();
var
Field: Record Field;
Field2: Record Field;
KeyRec: Record "Key";
RecordDeletion: Record "Record Deletion";
RecordDeletionRelError: Record "Record Deletion Rel. Error";
TableMetadata: Record "Table Metadata";
RecordRef: RecordRef;
RecordRef2: RecordRef;
FieldRef: FieldRef;
FieldRef2: FieldRef;
SkipCheck: Boolean;
UpdateDialog: Dialog;
EntryNo: Integer;
NotExistsTxt: Label '%1 => %2 = ''%3'' does not exist in the ''%4'' table', Comment = '%1 = RecRef Position, %2 = FieldRef Name, %3 = FieldRef Value, %4 = Record Ref Name';
CheckRelationsQst: Label 'Check Table Relations?';
CheckingRelationsTxt: Label 'Checking Relations Between Records!\Table: #1#######', Comment = '%1 = Table ID';
begin
if not Confirm(CheckRelationsQst, false) then
exit;
UpdateDialog.OPEN(CheckingRelationsTxt);
RecordDeletionRelError.DeleteAll();
if RecordDeletion.FindSet() then
repeat
UpdateDialog.Update(1, Format(RecordDeletion."Table ID"));
// Only allow "normal" tables to avoid errors, Skip TableType MicrosoftGraph and CRM etc.
TableMetadata.SetRange(ID, RecordDeletion."Table ID");
TableMetadata.SetRange(TableType, TableMetadata.TableType::Normal);
if not TableMetadata.IsEmpty then begin
RecordRef.OPEN(RecordDeletion."Table ID");
if RecordRef.FindSet() then
repeat
field.SetRange(TableNo, RecordDeletion."Table ID");
field.SetRange(Class, field.Class::Normal);
field.SetFilter(RelationTableNo, '<>0');
if field.FindSet() then
repeat
FieldRef := RecordRef.field(field."No.");
if (Format(FieldRef.VALUE) <> '') and (FORMAT(FieldRef.VALUE) <> '0') then begin
RecordRef2.OPEN(field.RelationTableNo);
SkipCheck := false;
if field.RelationFieldNo <> 0 then
FieldRef2 := RecordRef2.field(field.RelationFieldNo)
else begin
KeyRec.Get(field.RelationTableNo, 1); // PK
Field2.SetRange(TableNo, field.RelationTableNo);
Field2.SetFilter(FieldName, CopyStr(KeyRec.Key, 1, 30));
if Field2.FindFirst() then // No Match if Dual PK
FieldRef2 := RecordRef2.field(Field2."No.")
else
SkipCheck := true;
end;
if (FieldRef.TYPE = FieldRef2.TYPE) and (FieldRef.LENGTH = FieldRef2.LENGTH) and (not SkipCheck) then begin
FieldRef2.SetRange(FieldRef.VALUE);
if not RecordRef2.FindFirst() then begin
RecordDeletionRelError.SetRange("Table ID", RecordRef.NUMBER);
if RecordDeletionRelError.FindLast() then
EntryNo := RecordDeletionRelError."Entry No." + 1
else
EntryNo := 1;
RecordDeletionRelError.Init();
RecordDeletionRelError."Table ID" := RecordRef.NUMBER;
RecordDeletionRelError."Entry No." := EntryNo;
RecordDeletionRelError."Field No." := FieldRef.NUMBER;
RecordDeletionRelError.Error := CopyStr(StrSubstNo(NotExistsTxt, Format(RecordRef.GETPOSITION()), Format(FieldRef2.NAME), Format(FieldRef.VALUE), Format(RecordRef2.NAME)), 1, 250);
RecordDeletionRelError.Insert();
end;
end;
RecordRef2.Close();
end;
until field.Next() = 0;
until RecordRef.Next() = 0;
RecordRef.Close();
end;
until RecordDeletion.Next() = 0;
UpdateDialog.Close();
end;
procedure ViewRecords(RecordDeletion: Record "Record Deletion");
begin
Hyperlink(GetUrl(ClientType::Current, CompanyName, ObjectType::Table, RecordDeletion."Table ID"));
end;
procedure SetSuggestedTable(TableID: Integer);
var
RecordDeletion: Record "Record Deletion";
begin
if RecordDeletion.Get(TableID) then begin
RecordDeletion."Delete Records" := true;
RecordDeletion.Modify();
end;
end;
procedure CalcRecordsInTable(TableNoToCheck: Integer): Integer
var
Field: Record Field;
RecordRef: RecordRef;
NoOfRecords: Integer;
begin
Field.SetRange(TableNo, TableNoToCheck);
if not Field.IsEmpty() then begin
RecordRef.Open(TableNoToCheck);
RecordRef.LockTable();
NoOfRecords := RecordRef.Count();
RecordRef.Close();
exit(NoOfRecords);
end;
exit(0);
end;
procedure SuggestUnlicensedPartnerOrCustomRecordsToDelete();
var
RecordDeletion: Record "Record Deletion";
RecsSuggestedCount: Integer;
RecordsSuggestedMsg: Label '%1 unlicensed partner or custom records were suggested.', Comment = '%1 number of unlicensed records';
begin
RecordDeletion.SetFilter("Table ID", '> %1', 49999);
if RecordDeletion.FindSet(false) then
repeat
if not IsRecordStandardTable(RecordDeletion."Table ID") then
if not IsRecordInLicense(RecordDeletion."Table ID") then begin
SetSuggestedTable(RecordDeletion."Table ID");
RecsSuggestedCount += 1;
end;
until RecordDeletion.Next() = 0;
Message(RecordsSuggestedMsg, RecsSuggestedCount);
end;
local procedure IsRecordInLicense(TableID: Integer): Boolean
var
LicensePermission: Record "License Permission";
begin
// LicensePermission.Get(LicensePermission."Object Type"::Table, TableID);
LicensePermission.Get(LicensePermission."Object Type"::TableData, TableID);
if (LicensePermission."Read Permission" = LicensePermission."Read Permission"::" ") and
(LicensePermission."Insert Permission" = LicensePermission."Insert Permission"::" ") and
(LicensePermission."Modify Permission" = LicensePermission."Modify Permission"::" ") and
(LicensePermission."Delete Permission" = LicensePermission."Delete Permission"::" ") and
(LicensePermission."Execute Permission" = LicensePermission."Execute Permission"::" ")
then
exit(false)
else
exit(true);
end;
local procedure IsRecordStandardTable(TableID: Integer): Boolean
begin
case true of
//5005270 - 5005363
// 5005363 = "Phys. Invt. Diff. List Buffer"
// (TableID >= Database::"Delivery Reminder Header") and (TableID <= Database::"Phys. Invt. Diff. List Buffer"):
(TableID >= 5005270) and (TableID <= 5005363):
exit(true);
//99000750 - 99008535
// 99000750 = Workshift
(TableID >= 99000750) and (TableID <= 99008535):
exit(true);
// Microsoft Localizations
(TableID >= 100000) and (TableID <= 999999):
exit(true);
end;
exit(false);
end;
}