|
21.12.2005, 13:04 | #1 |
Участник
|
Глюк в том, когда поле не заполнено и нет ни одной записи в related-таблице ... делаем `GoToMainTable` и создаём там новую запись, то она проподает... (при условии что там нет ни одной записи)
Примеры: 1) TaxTable -> Tab: Tax Reporting (4-ый tab).. где ссылки на `TaxReportCollection`... 2) ZipCode -> поле: Страна -> GoToMainTable (форма `Country`) 3) будут ещё наверно ... PS: проблему решил так... в форме, которая открывается из GoToMainTable: Код: public void init() { FormStringControl callerControl; ; if (element.args().caller()) { callerControl = SysTableLookup::getCallerStringControl(element.args()); if (callerControl) { isFromParentControl = true; callerCountryId = callerControl.valueStr(); } } super(); } Код: public void research() { if (isFromParentControl && callerCountryId && !Country::exist(callerCountryId)) { return; } super(); } Спасибо! PPS: Ax_3.0_SP4_EeastEurope [MSSQL 2k DevelopEdition] + AOS_3.0_SP4_EE PPS2: probuju sozdat' svoji tablici i formi - ne poluchajetsja etot gljuk povtorit'... a v standartnih forma - ne udajetsja bez haka popravit' |
|
21.12.2005, 16:18 | #2 |
Участник
|
Замечу что поле по которому осуществляется переход - цифровое.
Проблема в том, что передается значение Args().LookupValue() == "0". При этом у Axapta'ы слегка срывает крышу и она пытется периодически перевыполнить запрос (повторно вызывает research() датасоурса). Чтобы решить глобально - перекрыть метод Init() класса SysSetupFormRun и дописать после super() следующий код <div class='XPPtop'>X++</div><div class='XPP'> [color=:blue]public[/color] [color=:blue]void[/color] init() { DictField dictField; ; [color=:blue]super[/color](); [color=:green]// --> D.Andy исправление глюка с переходом на цифровое поле [/color] [color=:blue]if[/color] (this.args().lookupField() && this.args().lookupValue() [color=:blue]==[/color] [color=:red]"0"[/color]) { dictField = [color=:blue]new[/color] DictField(this.dataSource().cursor().TableId, this.args().lookupField());} [color=:green]// <-- D.Andy [/color] ... }</div> Эта же проблема проявляется при открытии Lookup-формы
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Logger (1). |
21.12.2005, 17:17 | #3 |
Участник
|
Спасибо.. помогло пока..
а что на счет ZipCode -> поле: Country -> GoToMainTable (форма: Country).. ??? Там ведь `String`... Именно у меня проблема, когда значение несуществует в таблице... (симулировать можна поменяв на прямыю значение в таблице через SQL manager или Query ) например при импорте код страны попал как 2-символа,.. а компания ID использует kak ISO код (3 символа) ПС: такие Fix-ы надо включать в hotfix-ы или ServicePack |
|
21.12.2005, 17:34 | #4 |
Участник
|
ZipCode - это таблица?
Честно сказать с Country у меня все нормально (3.0 CIS sp3 cu1) По хорошему - после изменения глобального класса не мешало бы сделать полную компиляцию
__________________
Axapta v.3.0 sp5 kr2 |
|
21.12.2005, 17:49 | #5 |
Участник
|
Eto potomu chto skoree vsego znachenije suschestvujet v tablice...
Vot moj Final-kod Код: public void init() { DictField dictField; Common c; ; super(); if (this.args().lookupField() && this.args().lookupValue() != "" ) { // Check bug on Integer `0` value if (this.args().lookupValue() == "0") { // --> Thanks AndyD dictField = new DictField(this.dataSource().cursor().TableId, this.args().lookupField()); if (dictField && dictField.baseType() == Types::Integer) this.args().lookupValue(""); // <-- Thanks AndyD } else { // Check if exists c.data(this.dataSource().cursor()); select c where c.(this.args().lookupField()) == this.args().lookupValue(); if ( !c.RecId ) { this.args().lookupValue(""); } } } } |
|
21.12.2005, 18:05 | #6 |
Участник
|
Нет, так нельзя - вообще ломается jumpRef.
__________________
Axapta v.3.0 sp5 kr2 |
|
21.12.2005, 18:08 | #7 |
Участник
|
v smisle?
U menja shas vse rabotaet... Fix: Код: c = this.dataSource().cursor(); |
|
21.12.2005, 18:18 | #8 |
Участник
|
2-х или 3-х звенка?
__________________
Axapta v.3.0 sp5 kr2 |
|
21.12.2005, 18:45 | #9 |
Участник
|
Вообще - значение "0" может иметь и строковое поле - так что, по идее, надо проверять сначала какой тип у этого поля
<div class='XPPtop'>X++</div><div class='XPP'> dictField = [color=:blue]new[/color] DictField(this.dataSource().cursor().TableId, this.args().lookupField()); [color=:blue]if[/color] (dictField && dictField.baseType() [color=:blue]==[/color] Types::Integer && this.args().lookupValue() [color=:blue]==[/color] [color=:red]"0"[/color]) this.args().lookupValue([color=:red]""[/color]);[color=:blue]else[/color] { проверка на существование }</div> А вообще сомнения у меня есть в целесообразности второй проверки - может лучше делать это при импорте?
__________________
Axapta v.3.0 sp5 kr2 |
|
21.12.2005, 19:49 | #10 |
Участник
|
3-x zvenka...
Nu puskaj budet sdes' proverka... 2-x zvenka tozhe rabotaet... nashet proverki pri importi - bivajut vsjakie polzovateli, i zaimportirovat' mogut shto ugodno.. a X++ pisat' konechno ne umejut... Esli String budet "0"... to budet proverjatsja na nalichie Spasibo za to.. glavnoe najti mesto gde ispravit'... |
|