12.04.2018, 15:18 | #1 |
Участник
|
Размер буфера записи превышен. Как так может быть?
На форму поставщика попросили добавить три поля - ссылки на Работника компании (как в стандарте уже сделана ссылка на контактное лицо)
Добавила. В таблице все ок, на форме же при открытии выпадает сразу " The total, internal size of the records in your joined SELECT statement is 71176 bytes, but Microsoft Dynamics is by default performance-tuned not to exceed 49152 bytes." Проблема в том, что reference group добавляет джойн к HcmWorker и еще до кучи DirParty. А таких группы нужно целых три.... Что делать - приблизительно понятно: либо увеличивать размер допустимый буфера или же убирать поля из VendTable и создавать новую таблицу с новыми полями... Вопросы: 1) Если я помещу поля в отдельную новую таблицу, то все равно, чтобы их показывать форме поставщика, надо будет этй таблицу джойнить с VendTable на форме и то размер буфера останется приблизительно таким же. То есть, та же ошибка будет 2) Я не понимаю вот что. Я вижу, что размер буфера при удалении каждого из новых полей уменьшается на 7198 байтов. То есть, удалила поле и получила сообщение "SELECT statement is 63978 bytes ...." , удалила второе - уже " is 56780 bytes" , потом " 49582 bytes" (то же самое происходит, если удаляю стандартую сслку на контакное лицо. То есть, проблема не в том, что я что-то криво делаю). Смотрю формируемый запрос и вижу. что да, две таблицы HcmWorker и DirParty присоединяются, но из них берутся только следующие поля: T12.PERSON, T12.RECVERSION, T12.RECID, T16.NAME, T16.RECID, T16.RECVERSION, T16.INSTANCERELATIONTYPE, T16.RECVERSION, T16.RECID Тут все поля int64, кроме имени, что в базе хранится как nvarchar(100) и поэтому максимум может быть 200 байтов. Это все хозяйтво заведомо меньше даже 300 . Вопрос - откуда берется разница в 7198 байтов (что видно из вышеприведенных собщений от ошибках) при добавлении каждого поля ?????? Последний раз редактировалось kitty; 12.04.2018 в 15:51. |
|
12.04.2018, 16:19 | #2 |
Banned
|
Столкнулся неделю назад с таким же на этой же форме. Когда 23 датасоурса форма рано или поздно сойдет с ума.
Как я понял при подсчете буфера считается не текущий размер а максимально возможный. Лучше обойтись вообще сторонней таблицей и без join. Не уверее насчет влияния типа join. Например будет ли считаться passive. Если не строк грида, а есть вертикальные табы, то можно прекрасно обойтись без датасоурс. А тяжесть форм что CustTable что SalesTable какая-то беспредельная в AX2012. То есть я бы не пытался понять почему, а просто сделал бы тупое решение на display/edit методах даже без датасоурс. Недавно даже сделал на голых несвязанных контролах в SalesTable заполняя их на run() и на смене CustAccount так как display методы не подошли. Там где можно сделать без добавления полей без датасоурс - лучше делать без них на таких монстрах. Датасоурсы это больше для совместного грида. P.S. Как вариант можно очищать автомический join и указывать свою собсвенную связь на уровне методов датасоурса. В системе много таких примеров. Но это может быть overkill если речь о показе трех полей. Даже edit методы будут дешевле так как полностью сбоку. PPS Но если вдруг то можно даже искать не по RecID, а скажем по имени или номеру etc. Эти RecId они очень вражеские. qbdsLocation.clearLinks(); qbdsLocation.addLink(fieldNum(InventSite, SiteId ), fieldNum(InventLocation, InventSiteId)); qbdsLocation.addRange(fieldNum(InventLocation, InventLocationType)).value(queryValue(_inventLocationType)); Последний раз редактировалось ax_mct; 12.04.2018 в 16:43. |
|
12.04.2018, 16:19 | #3 |
Участник
|
Скорее всего это : Maximum buffer size
|
|
|
За это сообщение автора поблагодарили: ax_mct (3). |
12.04.2018, 16:49 | #4 |
Banned
|
Цитата:
Сообщение от Alexius
Скорее всего это : Maximum buffer size
Цитата:
info(int2str(SysDictTable::newTableId(tableNum(CustTable)).recordSize()));
Автору. Думаю что стоит учитавать всякие CU которые скорее будут увеличивать размер и не считать байты, а как-то сделать сбоку. Если не строки грида, то вариантов много. |
|
12.04.2018, 17:33 | #5 |
Участник
|
Извините, а как Вы делали на edit-методе ? То есть, вот есть у меня поле recID, на форме нужно показывать Name. Имя не уникально. Получается, что мы можем по хранящемуся RecID вывести Name, а вот обратно, когда Set = true, то по Name однозначно оперделить recid уже не можем... Можно в из lookup доставать recid и на modified() контрола прописывать его, наверное, но как-то некрасиво ....
|
|
12.04.2018, 17:59 | #6 |
Участник
|
Ну вот еще в dirPartyLookup, там перехватывается закрытие формы и прописываются recid значения в вызывающий контрол... По сути , та же идея, что и с modified(), кот я имела ввиду, но нужно еще отдельную lookup форму делать ....
В любом случае, просто edit-методом не понимаю, как можно отделаться .... |
|
|
За это сообщение автора поблагодарили: ax_mct (3). |
12.04.2018, 18:55 | #7 |
Banned
|
Цитата:
Сообщение от kitty
Извините, а как Вы делали на edit-методе ? То есть, вот есть у меня поле recID, на форме нужно показывать Name. Имя не уникально. Получается, что мы можем по хранящемуся RecID вывести Name, а вот обратно, когда Set = true, то по Name однозначно оперделить recid уже не можем... Можно в из lookup доставать recid и на modified() контрола прописывать его, наверное, но как-то некрасиво ....
Поодиночке они нам неинтересны. В случае строк грида это скорее всего свой X++ map на уровне формы. Достаточно общий в AX подход. В случае просто одиноких полей, можно и так. А можно просто иметь отдельный контрол для RecId и отдельный контрол для Name. Lookup по контролу RecId, display Name. То что пользователь будет видеть 777777777 и рядом Name, ему все равно. |
|
12.04.2018, 19:33 | #8 |
Участник
|
Спасибо
Вроде, мне повезло. Посмотрела на HcmWorker таблицу попристальней, там есть уникальное string поле PersonnelNumber . Многие стандартные таблицы вообще по нему связаны...а не по recId .... с ней. Я так понимаю, что не супер идеально, но вполне можно мне тоже просто PersonnelNumber добавить на VendTable и обойтись стандартным лукапом.... без referenceGroup, раз в стандарте себе такое позволяют ? |
|
12.04.2018, 20:59 | #9 |
Banned
|
Цитата:
Сообщение от kitty
Спасибо
Вроде, мне повезло. Посмотрела на HcmWorker таблицу попристальней, там есть уникальное string поле PersonnelNumber . Многие стандартные таблицы вообще по нему связаны...а не по recId .... с ней. Я так понимаю, что не супер идеально, но вполне можно мне тоже просто PersonnelNumber добавить на VendTable и обойтись стандартным лукапом.... без referenceGroup, раз в стандарте себе такое позволяют ? Если есть рабочий пример в системе то быстрее сделать так же, чем придумывать как идеально. Идеально оно было в 3.0 |
|
12.04.2018, 23:07 | #10 |
Участник
|
Понятно, что нормализация в теории красиво выглядит, но реализация - какое-то маркобесие.
А когда еще и в стандарте видишь, что сами предпочитают связываться по полю из alternate key, а не по навязываемым суррогатным, то так и хочется предать этих проповедников анафеме.... Осталось вот еще консультанту объясить, почему добавление трех полей занимает не обещанные 5 минут, а чертисколько....рррррр Последний раз редактировалось kitty; 12.04.2018 в 23:13. |
|
13.04.2018, 01:26 | #11 |
Banned
|
Цитата:
Обьяснить в данном случае легко так все упирается на размер дозволенного буфера и надо искать workaround - это понятное обьяснение. Типа авария на дороге. А вот говорить про то что чей то код не так расширяем как ты предполагал, то такое не всякий поймет. Язык то супер-расширяемый, значит дело в тебе программист. А не в том что все вокруг не умеют водить. |
|
13.04.2018, 09:16 | #12 |
Участник
|
|
|
|
|