Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Все, иду вешаться. / 25 сообщений из 26, страница 1 из 2
09.01.2006, 02:41
    #33472226
Tea-pot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
Пишу, чтобы поплакаться в жилетку.

Ёлки-палки. Первый раз за 10 лет программирования не могу баг найти. Уже 4 дня бьюсь.

Он мне уже во сне снится. Наглый, усатый.

Что-то милый и пушистый юзверь использует такое хитрое в программе, в datawindow, что одно из полей пересчитывается в неправильную цифру.

Все триггеры уже пересмотрела в ораклевой базе.

Код в РВ. О! Это отдельная песня. Начинали его писать в Бельгии в 1995г, много надписей в DW на немецком, потом продолжали во Норвегии. Теперь вот это в Австралии 4-е года как работает. Бывает идешь по следу, смотришь - первая функция визывает вторую из другого обьекта, та вторая - третью, и т.д. И в конце концов доходишь до заглушки return 1.

Расставила шас всяких логов - ловушек, мож какая-нить зараза поймается. Но что-то надежды мало.

Эх, иконок с человеческими эмоциями жалко здесь нет, передать мои чувства.

Посоветуйте плиз какие-нить талисманы, или дУхов каких, богов. Может тут нечисть какая водится... Или напиться что-ли? Что вам помогало в таких случаях?
...
Рейтинг: 0 / 0
09.01.2006, 03:38
    #33472235
ЗоринАндрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
Почему то вспомнилось про задачу поймать льва в пустыне
возможно тебе подойдет "Метод Больцано-Вейерштрасса"

З.Ы. Как то про код написанный в Австралии (на вопрос как такое можно написать) коллега сказал - ну дык ить что ж ты хочешь походи всю жизнь вниз головой и не такое напишешь

З.З.Ы. Талисман говоришь? тут наверное нужен шаманский бубен с логотипом Sybase.
...
Рейтинг: 0 / 0
09.01.2006, 05:48
    #33472263
Tea-pot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
ЗоринАндрейПочему то вспомнилось про задачу поймать льва в пустыне
возможно тебе подойдет "Метод Больцано-Вейерштрасса"

А-а-а.
Да-да.
Метод половинного сечения.

Не помогааааееееет....

ЗоринАндрейЗ.Ы. Как то про код написанный в Австралии (на вопрос как такое можно написать) коллега сказал - ну дык ить что ж ты хочешь походи всю жизнь вниз головой и не такое напишешь



Явно индус постарался.
...
Рейтинг: 0 / 0
09.01.2006, 14:47
    #33472636
pjanri
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
У меня коллега такой, так что из опыта могу сказать:

"Метод половинного сечения"

помогает, нужно только терпения набраться.
...
Рейтинг: 0 / 0
09.01.2006, 20:09
    #33472965
boogiman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
А поставить Debuger, перед тем как меняется это поле в DataWindow например перед dw.Retrieve() и просмотреть все переменные, из которых берутся косяковые значения в DW? Я думаю с 10 раза полюбому найдёте откуда косяки идут! Если этот косяк всплывает раз из 10 случаев, то всё таки домучать Юзвера в какой именно ситуации всплывает кривое поле! Это конечно примитивно, но другого выхода нет! Да чуть не забыл, часто такие безумные косяки всплывают из базы, например поле было varchar(3), изменился формат толкаются на вход процедуры varchar(4) ну и после этого это поле безбожно обрезается! Вот то что приходит на ум на вскидку! Удачи!
...
Рейтинг: 0 / 0
09.01.2006, 21:17
    #33473026
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
Это может быть все что угодно, в т.ч. баг самого PB.
В частности недавно мы обнаружили такой пренеприятнейший баг:
Код: plaintext
1.
2.
3.
4.
5.
dec{ 0 } n
...
n = n + dw_1.GetItemDecimal(row, col)  // все ОК
а вот если вместо этого написать:
n += dw_1.GetItemDecimal(row, col)  // то в n оказывается мусор
Наблюдается только иногда.

В Вашем случае, я бы сначала локализовал бы место возникновения проблемы:
допустим проблема предположительно в том DW, значит надо для начала убедиться в этом. Для этого retreive() убираем, а вместо него заносим в DW тестовые данные, для которых известен правильный результат и убеждаемся что проблема возникает не ранее чем данные заносятся в DW(то есть с тестовыми данными проблема повторяется). Если подтвердили - ищем следующую потенциальную точку.
И т.д. (Вот здесь как раз и пригодился бы метод половинного деления)

Когда будет сформулирована проблема, включая место и условия, при которых она возникает, можно будет думать как ее решать.

Есть еще способ - отдайте программу другому человеку на отладку.
У этого способа есть положительный побочный эффект - не найдет этот баг, зато очень вероятно найдет многие другие. Только нужно заинтересовать его как то, либо материально либо духовно. Либо если этот человек - Ваш муж, то могут быть разные варианты :)
...
Рейтинг: 0 / 0
10.01.2006, 06:14
    #33473225
Tea-pot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
Спасибо за поддержку и советы.
А то совсем пожалиться некому тут на чужбине. :-)))
Как-то повеселее стало.


Отдать на отладку некому.., это мне на отладку отдали.

Вся проблема в том, что я не могу поймать, когда она возникает.
Я пыталась безуспешно повторить эту ситуацию.
Юзверя пытала - улыбается и руками разводит.
Производишь "пересчет" и цифры меняются на правильные.

Про тот баг с += GetItemDecimal показалось интересной идеей, но не помогло.

Подсчитывается это поле элементарно (accept перед этим выполяется):

dw_1.object.количество[row] = dw_1.object.общийВес[row]/dw_1.object.вес1штуки{row]


Подчитывается оно в событии itemchanged для соответствующих полей.

Всю систему расписывать долго и не хочу никого загружать.
Скажу лишь, что это окно ввода заказа на бумажние роллы.
Здесь вес, количество зависят друг от друга и от того, какой вес одного ролла, который в свою очередь зависит от диаметра, ширины и плотности.
Компания по производству бумаги.

Хоть золотое сечение, хоть половинное, ничего не помогает.
Когда я в разных вариациях ввожу/меняю все цифры правильные.

Ладно, не буду вас утомлять. :-)))
...
Рейтинг: 0 / 0
10.01.2006, 08:52
    #33473320
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
Навскидку - нет явного приведения типов. Я бы посоветовал вместо dw.object.Поле использовать методы GetItem/SetItem. Далее - есть Accept или нет Accept-а, в любом случае пересчет должен быть вынесен в отдельное событие, а в ItemChanged оно должно вызываться через Post. Так надежнее и правильнее.
...
Рейтинг: 0 / 0
10.01.2006, 09:17
    #33473352
Tea-pot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
Спасибо, только так оно и есть.
Это я сократила, для наглядности. Сорри.)))

Без сокрашения выглядит обработка одного из полей в itemchanged так.
Код - не мой, конечно.

(неправильно считается Quantity, вернее у меня всегда правильно, а юзер примерно в 5% случаев ухитряется сделать так, чтобы сохранилось неправильное значение).


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	CASE 'order_item_weight','order_item_unit_price_committed'
		AcceptText()
		ls_Product_Code = GetitemString(Row,'Order_Item_Product_Code')
		lc_Weight = GetItemNumber(Row,'order_item_weight')
		lc_Quantity = uo_ord_da.f_CalcProductQuantity(uo_ord_da.ids_OrderItem,ls_Product_Code,lc_Weight)
		SetItem(Row,'order_item_quantity',lc_Quantity)
		SetItem(Row,'order_item_cust_quantity',lc_Quantity)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public function long f_calcproductquantity (Datastore ads_OrderItem, string as_product_code, decimal ac_weight);Decimal lc_Net_Weight
Long ll_Quantity
Transaction lt_Module
Boolean lb_Result

lc_Net_Weight = ads_OrderItem.GetItemNumber(ads_OrderItem.GetRow(),'Net_Weight')
IF IsNull(lc_Net_Weight) THEN lc_Net_Weight =  0 

IF ac_Weight =  0  THEN Return  0 
IF lc_Net_Weight =  0  THEN Return  0 

ll_Quantity = Round(ac_Weight / lc_Net_Weight, 0 )

Return ll_Quantity
end function


Я вот начнаю подозревать синхронизацию datawindow и datastore, их используются десятки.
...
Рейтинг: 0 / 0
10.01.2006, 09:28
    #33473380
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
Еще навскидку:
1. Все таки вынесите код из ItemChanged в отдельное событие с параметром row и вызывайте его через Post. Конечно мое личное IMHO, но не хорошо вызывать внутри ItemChanged AcceptText и SetItem.
2. Настораживает функция, зачем она - передавать ей DataStore, чтобы она примитивно посчитала и вернула результат. Может быть легче все эти действия как раз проделать в событии, которое я порекомендовал в п.1
3. Нужна функция или нет, но еще я бы в отдельной функции с целью предотвращения ошибок не стал вызывать GetRow() у переданного DS, а лучше бы и передавал параметр row - событийная модель любого ООП языка штука коварная - никогда нельзя предугадать, какие события на что успели повлиять, поэтому нужно максимально не полагаться на предполагаемое. Отсюда и такие плавающие и трудноотлаживаемые глюки возникают.
...
Рейтинг: 0 / 0
10.01.2006, 09:34
    #33473394
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
P.S. Кстати, Вы там случайно не с программой для стоматологии возитесь ? Или Австралия - это родина PB проектов, которые в разное время писались и сопровождались в разных странах мира, но с обязательным условием всей бизнес-логики на клиенте и разных подходов в разных частях задачи
...
Рейтинг: 0 / 0
10.01.2006, 10:50
    #33473561
PL99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
PowerBuilder Help AcceptText method (DataWindows)
...
Events
AcceptText may trigger an ItemChanged or an ItemError event.
AcceptText in the ItemChanged event Calling AcceptText in the ItemChanged event has no effect.

Вообще-то, я присоединяюсь к мнению ASCRUS - в itemchanged надо асинхронно вызывать функцию обработки и ничего больше не делать.
...
Рейтинг: 0 / 0
10.01.2006, 11:53
    #33473751
SergeyGor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
Можно попробовать следующим образом:

Создать копию изменяемого поля базы в DW с другим именем.
Сразу должно показать где меняется, в базе или программе.
А дальше терпение,
если в программе, то везде
добавлять изменения по новому полю как по старому,
как станет одинаково меняться там и искать.

если в базе то в триггере на update этого поля
raise_application_error
и покажет когда меняется в базе.
...
Рейтинг: 0 / 0
10.01.2006, 12:45
    #33473947
spas2001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
Не торопитесь
А в поле точно не может быть ну скажем значения null до того как вы проверяете , а во вторых замечено, что GetRow в том виде как вы проверяете может выдать некоторое значение и близко не подходящее к реальному
так что если у Вас где -то что-то синхронизируется сначала проверьте та ли это строка, выше уже предлагали передать ее точно, или find использовать, кроме того замечание насчет поста не лишнее
...
Рейтинг: 0 / 0
11.01.2006, 01:25
    #33475342
Tea-pot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
Ок. Спасибо большое.

Все внимательно перечитала и приняла к сведению.

Теперь буду убеждать начальство менять код в этом месте.

Еще раз повторюсь, что код писался годами и не мной.

Я еще только 4 месяца здесь работаю, и о РВ до этого только слышала.
Новичек еще совсем + самоучка (что очень нехорошо).

А компания по производству бумаги.

Всем удачи в новом году. :-)))
...
Рейтинг: 0 / 0
12.01.2006, 18:30
    #33479876
Ursego
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
Tea-potА то совсем пожалиться некому тут на чужбине. :-)))Вот и у нас в середине Канады, прямо между океанами, одна степь кругом и ни одного русского пауэрбилдерщика... Дикие места! Так что давай плакаться друг другу! :-)
...
Рейтинг: 0 / 0
13.01.2006, 01:17
    #33480247
Tea-pot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
UrsegoВот и у нас в середине Канады, прямо между океанами, одна степь кругом и ни одного русского пауэрбилдерщика... Дикие места! Так что давай плакаться друг другу! :-)

Calgary? ;-)
...
Рейтинг: 0 / 0
13.01.2006, 10:52
    #33480700
boogiman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
>To Usergo

А вы Филиппа в гости приглашайте, ему там недалеко, он подъедет. Вот и поплачитесь ему в жилетку!!!
...
Рейтинг: 0 / 0
13.01.2006, 11:27
    #33480830
ЗоринАндрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
Ага. Всего то 4 тыщи км.
...
Рейтинг: 0 / 0
13.01.2006, 11:30
    #33480842
boogiman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
Зато через окиян плыть не надо! Токма через дикую степь на поезде!!!
...
Рейтинг: 0 / 0
13.01.2006, 11:31
    #33480847
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
boogiman пишет:

> Зато через окиян плыть не надо! Токма через дикую степь на поезде!!!

Скорее уж над дикой степью на самолёте :).
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
13.01.2006, 21:51
    #33482565
Ursego
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
Tea-potCalgary? ;-)Куда там - Калгари просто очаг цивилизации по сравнинию моим Виннипегом! А ещё центр, блин - в 30 км от географического центра Северной Америки. А Калгари западнее на 1300 км. А ты где?
...
Рейтинг: 0 / 0
14.01.2006, 07:26
    #33482699
Геннадич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
Dim2000
boogiman пишет:

> Зато через окиян плыть не надо! Токма через дикую степь на поезде!!!

Скорее уж над дикой степью на самолёте :).
Posted via ActualForum NNTP Server 1.3
На собаках быстрее будет
...
Рейтинг: 0 / 0
17.01.2006, 03:34
    #33486129
Tea-pot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
Ursego Tea-potCalgary? ;-)Куда там - Калгари просто очаг цивилизации по сравнинию моим Виннипегом! А ещё центр, блин - в 30 км от географического центра Северной Америки. А Калгари западнее на 1300 км. А ты где?

Melbourne
...
Рейтинг: 0 / 0
17.01.2006, 18:28
    #33488101
Ursego
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все, иду вешаться.
Да, в гости не зайти...
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Все, иду вешаться. / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]