15.11.2018, 17:09 | #1 |
Участник
|
delete_from по связанным таблицам
Добрый день,
Необходимо массово удалить строки по связанным таблицам. Подскажите пожалуйста как это делается? Таблиц 4. Необходимо удалить строки из таблицы строк, затем соотвествующие журналы из таблицы журналов а затем и два справочника. Microsoft пишет что delete_from не поддерживает inner join и предлагает такой вариант как обходной static void DeleteInnerJoin2bJob(Args _args) { MyWidgetTable tabWidget; // extends xRecord. ; ttsBegin; while select from tabGalaxy where tabGalaxy .isTrusted == 0 { delete_from tabWidget where tabWidget .GalaxyRecId == tabGalaxy .RecId; } ttsCommit; } но у меня 4 таблицы по факту. И мне было сказано что вариант выше долго работает и есть другое решение. Заранее спасибо. |
|
15.11.2018, 17:40 | #2 |
Administrator
|
Если связанные таблицы связаны между собой Relation-ом и есть Delete Action от главной таблицы к подчиненной с режимом Cascade, то удаление записей из главной таблицы автоматически удалит записи из подчиненной.
Например: X++: delete_from journals where journals.Status == 0 Далее, delete_from - самостоятельный оператор и while select, да еще и с транзакциями ему не нужно Inner Join поддерживается (непонятно, откуда такая информация, что не поддерживается). Правда удаление все равно будет идти только из одной таблицы. Например: X++: delete_from trans join journals where journals.RecId == trans.journalsRecId && journals.Status == 1 X++: delete_from journals where journals.Status == 1
__________________
Возможно сделать все. Вопрос времени |
|
15.11.2018, 17:43 | #3 |
Administrator
|
Если у Вас связаны 3 таблицы, как 1:N (справочник-журнал-строки) и между справочником и журналом стоит Cascade, а между журналом и строками Cascade или Cascade+Restricted, то удаление данных из справочника сразу удалит связанные данные из журнала и из строк
__________________
Возможно сделать все. Вопрос времени |
|
16.11.2018, 06:42 | #4 |
Участник
|
Цитата:
X++: journals.skipDataMethods(true); journals.skipDeleteActions(true); journals.skipDatabaseLog(true); Однако вам нужно будет провести удаление всех 4 таблиц. Если вам нужно не быстрее, а проще - удалите записи таблицы с настроенными DeleteActions, остальное по связям удалится автоматом, как уже написали выше.
__________________
// no comments |
|
16.11.2018, 08:39 | #5 |
Участник
|
если вопрос по версии до D365 и нужна именно скорость, то не проще ли вызвать операцию truncate на SQL?
|
|
16.11.2018, 10:12 | #6 |
Участник
|
спасибо за ответ. то что delete_form не поддерживает inner join сказано майкрософтом здесь
https://docs.microsoft.com/en-us/dyn...er/delete-from строчки Example 2: Delete Plus Inner Join Logic X++ does not support an inner join on the delete_from statement. Therefore you cannot use the unmodified join keyword on the delete_from statement. However, there are other ways to logically accomplish an inner join. The examples in this section show techniques for achieving inner join logic by a sequence of X++ statements. так же редактор говорит следующее когда я пытаюсь написать X++: delete_from journalStringsAzat join journalAzat where journalAzat.journalIDAzat == journalStringsAzat.journalIDAzat а вот такая конструкция ошибок не вызывает X++: delete_from journalStringsAzat exists join journalAzat where journalAzat.journalIDAzat == journalStringsAzat.journalIDAzat Спасибо. |
|
|
За это сообщение автора поблагодарили: sukhanchik (2). |
16.11.2018, 14:50 | #7 |
Участник
|
напишите sql скрипт
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|