14.09.2015, 14:25 | #1 |
Участник
|
Копирование строки
Доброго времени суток, пытаюсь скопировать строку из таблицы и изменить ее связь (RefRecId) перед вставкой. Проблема в том что данное поле является FK, и не разрешает себя изменить. Как можно еще такое провернуть?
Мой код: X++: while select cv1 where cv1.RefRecId == ljt1.RecId { cv2.data(cv1); cv2.RefRecId = ljt2.RecId; if (!cv2.validateWrite()) { throw Exception::Error; } cv2.insert(); } |
|
14.09.2015, 15:03 | #2 |
Гость
|
не очень понял в чем проблема.
Как ругается то? |
|
14.09.2015, 15:04 | #3 |
Участник
|
По сути оно не ругается, просто ничего в таблицу не записывается. В дебаггере на переменно пишет что то типа "Replacemnt FAILED FK key" на поле cv2.RefRecId
|
|
14.09.2015, 15:16 | #4 |
Участник
|
попробуйте вместо этого
X++: cv2.data(cv1); X++: buf2buf(cv1, cv2); |
|
14.09.2015, 15:16 | #5 |
Участник
|
"Replacemnt FAILED FK key" в отладчике означает лишь то, что отладчик не смог по FK подтянуть для отображения ключ замены: либо на таблице не настроен relation для FK, либо на связанной таблице не настроен ключ замены, либо там нет записи, на которую ссылается FK.
|
|
14.09.2015, 15:24 | #6 |
Участник
|
Вот полный код. Пытался разбивать на 2 транзакции, то же самое...
X++: public void DoCopy() { LedgerJournalTrans ljt1; LedgerJournalTrans ljt2; LedgerJournalTrans ljt3; CustVendPaymJournalFee cv1; CustVendPaymJournalFee cv2; LedgerJournalTable ljt; NumberSequenceTable numberSequenceTable; NumberSequenceCode nsc; Voucher voucher; LedgerVoucher ledgerVoucher; it = new MapIterator(paMarked); while (it.more()) { ttsbegin; ljt = LedgerJournalTable::findByJournalNum(JN); nsc = numberSequenceTable::find(ljt.NumberSequenceTable).NumberSequence; voucher = NumberSeq::newGetNumFromCode(nsc).num(); ljt1 = LedgerJournalTrans::findRecId(it.key(), false); ljt2.data(ljt1); ljt2.TransDate = ljt.NASLedgerJourDate; ljt2.Voucher = voucher; ljt2.JournalNum = JN; if(_Reverse) { ljt2.AmountCurDebit = ljt2.AmountCurDebit * -1; ljt2.AmountCurCredit = ljt2.AmountCurCredit * -1; } if (!ljt2.validateWrite()) { throw Exception::Error; } ljt2.insert(); //ttscommit; //ttsbegin; //ljt3 = LedgerJournalTrans::find(JN, voucher, false); while select cv1 where cv1.RefRecId == ljt1.RecId { //cv2.data(cv1); buf2Buf(cv1, cv2); //cv2.RefRecId = ljt3.RecId; cv2.RefRecId = ljt2.RecId; if (!cv2.validateWrite()) { throw Exception::Error; } cv2.insert(); } ttscommit; it.next(); } } |
|
14.09.2015, 16:17 | #7 |
Гость
|
По ощущениям
X++: ljt = LedgerJournalTable::findByJournalNum(JN); nsc = numberSequenceTable::find(ljt.NumberSequenceTable).NumberSequence; Цитата:
По сути оно не ругается, просто ничего в таблицу не записывается
ЗЫ и вы конечно видите что метод insert на CustVendPaymJournalFee не так уж и прост boolean skipTrans = false и т п? Последний раз редактировалось axm2013; 14.09.2015 в 16:20. |
|
14.09.2015, 16:36 | #8 |
Участник
|
Видел, проверял. Все ключевые поля проверил, все везде заполнено.
|
|
14.09.2015, 16:44 | #9 |
Гость
|
Ну ок.
Replacemnt FAILED FK key как пишут выше это информация отладчика не более. Что в итоге то не так? ЗЫ сори если что за несообразительность но не могу понять в чем проблема то. |
|
14.09.2015, 16:48 | #10 |
Участник
|
Запись просто не отображается, хотя никаких ошибок не возникает и по идее она даже вставляется в таблицу
Последний раз редактировалось syl; 14.09.2015 в 16:53. |
|
14.09.2015, 16:58 | #11 |
Гость
|
Т.е. insert отрабатывает но записи в таблице CustVendPaymJournalFee c RecID видимым в отладчике не обнаруживается после отработки всего и вся?
Может запись далее где то затирается? |
|
14.09.2015, 17:04 | #12 |
Участник
|
Все разобрался. Источник данных таблицы CustVendPaymJournalFee с LinkDataSource LedgerJournalTrans. Связаны они по двум полям:
X++: cv2.RefRecId = ljt3.RecId; cv2.feeTransRecId = ljt3.RecId; Последний раз редактировалось syl; 14.09.2015 в 17:11. |
|