Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / PB и Oracle для удаленного юзера / 25 сообщений из 30, страница 1 из 2
02.03.2005, 16:48
    #32941835
Pasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
Попробую вначале здесь, т.к. вероятность найти людей PB + Oracle тут больше. Если пойму что не тут проблема, пойду в Оракл.

Ситуация следующая
программа разработана на PB 9.0.1 Version 7119
БД Оракл 9.2.0.5
Клиент Оракл

Сейчас установил программу достаточено удаленному пользователю, да еще и с каналом 64к. И возникла проблема - теряются введенные данные.

Процес в следующем: есть dw , в котором на событие Insert, update висят процедуры Оракла.

Пользователь набивает допустим строк 50 новых, сохраняет. Потом заходит в программу - а данных нет. Также описывает следующую ситуацию набивает сохраняет, опять набивает - сохраняет, в итоге определенной кол-во всеравно пропадает.

Если кто сталкивался с этим, подскажите куда лезть?
...
Рейтинг: 0 / 0
02.03.2005, 17:02
    #32941882
PL99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
хм...

а commit происходит?
...
Рейтинг: 0 / 0
02.03.2005, 17:09
    #32941899
tru55
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
Я не понял, он после набора выходит из программы? Может, если он "достаточно удаленный" просто часть данных не доходит (разрыв коннекта) или не доходит COMMIT?
...
Рейтинг: 0 / 0
02.03.2005, 17:11
    #32941908
Pasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
commit стоит после того как сохранил
вот код
integer li_result

li_result = MessageBox('Ñîõðàíåíèå.', 'Âû õîòèòå ñîõðàíèòü èíôîðìàöèþ?', Question!, YesNoCancel!, 1)
Choose Case li_result
Case 1
dw_group.Event pfc_update(True, True)
dw_detail.Event pfc_update(True, True)
If SQLCA.SQLCode < 0 Then
MessageBox( "SQL error", SQLCA.SQLErrText);
SQLCA.of_rollback( )
Else
SetPointer(HourGlass!)
SQLCA.of_commit( )
cb_save.Enabled = False
End If
Case 2
dw_group.ResetUpdate()
dw_detail.ResetUpdate()
Case 3
Return -1
End Choose
cb_save.Enabled = False
...
Рейтинг: 0 / 0
02.03.2005, 17:14
    #32941916
Pasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
Данная проблема возникла только у юзеров, которые удаленно работаю.
Сейчас в процессе получения нового канала, но сам "звоночек" мне не понравилось и пока канал не расширили, хочу разобраться в чем проблема.
...
Рейтинг: 0 / 0
02.03.2005, 17:15
    #32941927
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
Я в Оракле ничего не понимаю , но, отвлекаясь от конкретной СУБД, я бы попробовал каким-нибудь образом выяснить, что именно доходит с этого клиента до сервера. Будет хоть какая-то пища для ума.
____________________________________
- Гарфилд, мышь!
- Спасибо, я сыт!
...
Рейтинг: 0 / 0
02.03.2005, 17:23
    #32941964
tru55
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
Dim2000Я в Оракле ничего не понимаю , но, отвлекаясь от конкретной СУБД, я бы попробовал каким-нибудь образом выяснить, что именно доходит с этого клиента до сервера. Будет хоть какая-то пища для ума.
____________________________________
- Гарфилд, мышь!
- Спасибо, я сыт!


Это разумно, я сам хотел предложить после ответа на вопрос. Можно для сессии включить трассировку на сервере (правда трассировочный файл тоже будет на сервере). Если с этим проблем нет, то это самое то для локализации ошибки
...
Рейтинг: 0 / 0
02.03.2005, 18:08
    #32942147
PL99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
На 64К канале не пробовал, а на 128, по которому, кроме всего прочего, передавался еще и voice, проблем замечено не было. Клиент в Москве, сервер - в Самаре.

Теперь общие соображения. Приведенный код не может не настораживать - может быть, все дело в драйвере DirectHand.sys?
Код: plaintext
1.
2.
3.
4.
dw_group.Event pfc_update(True, True)
dw_detail.Event pfc_update(True, True)
If SQLCA.SQLCode <  0  Then 
MessageBox( "SQL error", SQLCA.SQLErrText); 
SQLCA.of_rollback( ) 
Какие основания считать, что dw_group успешно сохраняется? Почему вообще сделано два вызова pfc_update вместо pfc_save в окне?

Ну и messagebox перед rollback - тоже не самый лучший стиль программирования.
...
Рейтинг: 0 / 0
02.03.2005, 20:01
    #32942351
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
Да и вообще, каким образом по
If SQLCA.SQLCode < 0 Then
можно пытаться судить о результате операции Update на datawindow контроле?
Поже это не DirectHand.sys а DirectBrain.sys шалит :-)
...
Рейтинг: 0 / 0
03.03.2005, 06:41
    #32942655
Геннадич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
Пробывал заливать блоб(~100к) в Оракле(8и) из Билдера(9), правда без ПФЦ, на канале 33600 - всё получается замечательно. Если во время закачки на сервер связь разрывалась, то получал ошибку -1.
...
Рейтинг: 0 / 0
03.03.2005, 06:48
    #32942658
Геннадич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
Pasha
....
SQLCA.of_rollback( )
Else
SetPointer(HourGlass!)
SQLCA.of_commit( )
....

SetPointer(HourGlass!) - зачем перед SQLCA.of_commit( ), лучше перед SQLCA.of_rollback( ).
COMMIT достаточно быстрая операция, чего не скажешь о ROLLBACK (я имею ввиду Оракле).
...
Рейтинг: 0 / 0
03.03.2005, 07:21
    #32942680
AIZ
AIZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
В таком режиме, наверное, перед всеми операциями с базой нужно проверять коннект. А далее, в зависимости от результата проверки.
...
Рейтинг: 0 / 0
03.03.2005, 09:23
    #32942776
Pasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
Спасибо за ответы, начну по порядку

PL99Какие основания считать, что dw_group успешно сохраняется? Почему вообще сделано два вызова pfc_update вместо pfc_save в окне?
Вчера еще до вашего сообщения начал переделывать, посмотрим что покажет.

PL99Ну и messagebox перед rollback - тоже не самый лучший стиль программирования.
Был бы признателен, чем плох этот стиль

ГеннадичПробывал заливать блоб(~100к) в Оракле(8и) из Билдера(9), правда без ПФЦ, на канале 33600 - всё получается замечательно. Если во время закачки на сервер связь разрывалась, то получал ошибку -1.
Самое что интересное, в этой программе очень много приходится работать с блобом, так за время тестирования, порядка 2 недель, с блобом ниразу проблем не было. Проблема возникла именно с одним местом, где просто тупо набивается часто список людей.

ГеннадичSetPointer(HourGlass!) - зачем перед SQLCA.of_commit( ), лучше перед SQLCA.of_rollback( ).
COMMIT достаточно быстрая операция, чего не скажешь о ROLLBACK (я имею ввиду Оракле).
Этот код бывает еще вылезает от эпохи использования Mat. view, тогда процесс сохранения долгий был Спасибо
...
Рейтинг: 0 / 0
03.03.2005, 09:41
    #32942812
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
Pasha PL99Ну и messagebox перед rollback - тоже не самый лучший стиль программирования.
Был бы признателен, чем плох этот стиль
Тем, что изменения в базе откатываются после нажатия на кнопку ОК. Если пользователь ушел покурить, то все, кто попытается изменить данные, затронутые транзакцией первого пользователя тоже будут курить, пока первый не нажмет на ОК. На блокировочниках же пользователи даже не смогут прочитать данные.
...
Рейтинг: 0 / 0
03.03.2005, 09:51
    #32942841
Pasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
Локшин МаркТем, что изменения в базе откатываются после нажатия на кнопку ОК. Если пользователь ушел покурить, то все, кто попытается изменить данные, затронутые транзакцией первого пользователя тоже будут курить, пока первый не нажмет на ОК. На блокировочниках же пользователи даже не смогут прочитать данные.
Спасибо, важное замечание.
...
Рейтинг: 0 / 0
03.03.2005, 12:16
    #32943303
Pasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
Поэксперементировал я вначале с PB и есть некоторые рез-ты, жаль положительных мало. Начну по порядку
PL99Почему вообще сделано два вызова pfc_update вместо pfc_save в окне

в инициализации окна
//*************** update setting *********************************
lpo_objs[1] = dw_group
lpo_objs[2] = dw_detail
of_SetUpdateObjects(lpo_objs)
//****************************************************************

на нажатие кнопки делаю
li_return = event pfc_save()
Результат 0

ФилиппДа и вообще, каким образом по
If SQLCA.SQLCode < 0 Then
можно пытаться судить о результате операции Update на datawindow контроле?
почитал хелп, книжки. переделал
li_return = dw_group.Event pfc_update(True, True)
If SQLCA.SQLNRows > 0 Then
MessageBox('commit','group ' + string(li_return))
Else
SetPointer(HourGlass!)
MessageBox('roll back','group ' + string(li_return))
End If
li_return = dw_detail.Event pfc_update(True, True)
If SQLCA.SQLNRows > 0 Then
SQLCA.of_commit( )
MessageBox('commit','detail ' + string(li_return))
Else
SetPointer(HourGlass!)
SQLCA.of_rollback( )
MessageBox('roll back','detail ' + string(li_return))
End If

Получается li_return = 1, но SQLNRows не больше 0, по этому все попадает на RollBack

PL99Ну и messagebox перед rollback - тоже не самый лучший стиль программирования.
Есть интересная вешь, данная мессага нам позволяла быстро исправлять ошибки. Если выскакивало данное сообщение, юзер делает принтскрин и вставляет в файл который в момент до нас долетает.

Пойду в оракле копаться.
Где проблема пока не знаю, т.к. данные сохраняются, но не всегда надо это "не всегда" исправить
...
Рейтинг: 0 / 0
03.03.2005, 12:59
    #32943456
tru55
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
Новый код тоже логически неверен. Необходимо делать COMMIT только тогда, когда прошел И update родительской таблицы, И update дочерней
...
Рейтинг: 0 / 0
03.03.2005, 13:49
    #32943632
PL99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
автор//*************** update setting *********************************
lpo_objs[1] = dw_group
lpo_objs[2] = dw_detail
of_SetUpdateObjects(lpo_objs)
//****************************************************************в чем смысл приведенного кода?
Окно не является потомком w_master? Или объекты создаются динамически в runtime?

Если на оба вопроса ответ - нет и если оба DW updatable, то будут обновляться автоматически.

авторli_return = event pfc_save()
Результат 0li_return = 0 - значит в DW не было изменений

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
//	Returns:  integer
//	  1  = success
//	  0  = No pending changes found 
//	- 1  = AcceptText error
//	- 2  = UpdatesPending error was encountered
//	- 3  = Validation error was encountered
// - 9  = The pfc_updateprep process failed
//	- 4  = The pfc_preupdate process failed
//	- 5  = The pfc_begintran process failed
//	- 6  = The pfc_update process failed
//	- 7  = The pfc_endtran process failed
//	- 8  = The pfc_postsave process failed

Все процессы управления транзакциями в PFC вынесены в соответствующие события, не надо на кнопках никагого лишнего кода писать.

Рекомендации по телодвижениям с бубном:
Посмотреть на клиенте какие sql-запросы отсылаются на сервер
Посмотреть на сервере, что из отправленного доходит до сервера
Сделать правильные выводы :-)
...
Рейтинг: 0 / 0
03.03.2005, 19:54
    #32944880
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
Pasha
ФилиппДа и вообще, каким образом по
If SQLCA.SQLCode < 0 Then
можно пытаться судить о результате операции Update на datawindow контроле?
почитал хелп, книжки. переделал
li_return = dw_group.Event pfc_update(True, True)
If SQLCA.SQLNRows > 0 Then
MessageBox('commit','group ' + string(li_return))
Else
SetPointer(HourGlass!)
MessageBox('roll back','group ' + string(li_return))
End If
li_return = dw_detail.Event pfc_update(True, True)
If SQLCA.SQLNRows > 0 Then
SQLCA.of_commit( )
MessageBox('commit','detail ' + string(li_return))
Else
SetPointer(HourGlass!)
SQLCA.of_rollback( )
MessageBox('roll back','detail ' + string(li_return))
End If

Получается li_return = 1, но SQLNRows не больше 0, по этому все попадает на RollBack
Где это вы такую книжку нашли, что почитав её написали ту же самую ерунду как и до моего вопроса?
Команда dw_whatever.Update() никаким образом не влияет на свойтсва SQLCA...
...
Рейтинг: 0 / 0
04.03.2005, 08:57
    #32945262
Pasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
2 Филипп

Powerbuilder Help
As before, this example connects to the database, specifies a transaction object for the DataWindow control with SetTransObject, and then updates the database with the changes made in dw_employee. After Update is executed, the example checks the return code and depending on the success of the update, executes a COMMIT or ROLLBACK:

integer rtn

CONNECT USING SQLCA;

dw_employee.SetTransObject(SQLCA)

rtn = dw_employee.Update()

IF rtn = 1 AND SQLCA.SQLNRows > 0 THEN

COMMIT USING SQLCA;

ELSE

ROLLBACK USING SQLCA;

END IF
...
Рейтинг: 0 / 0
04.03.2005, 10:28
    #32945506
zuzu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
Pasha2 Филипп

Powerbuilder Help
As before, this example connects to the database, specifies a transaction object for the DataWindow control with SetTransObject, and then updates the database with the changes made in dw_employee. After Update is executed, the example checks the return code and depending on the success of the update, executes a COMMIT or ROLLBACK:

integer rtn

CONNECT USING SQLCA;

dw_employee.SetTransObject(SQLCA)

rtn = dw_employee.Update()

IF rtn = 1 AND SQLCA.SQLNRows > 0 THEN

COMMIT USING SQLCA;

ELSE

ROLLBACK USING SQLCA;

END IF
Это не есть ПФС, а ты юзаешь ПФС
...
Рейтинг: 0 / 0
04.03.2005, 10:36
    #32945534
Pasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
Я пробовал как с ПФС, так и без.
А пройдя далее по ПФС, заканчивается тем же самым Update().

Если я не прав, то буду признателен, если поправите.
...
Рейтинг: 0 / 0
04.03.2005, 11:20
    #32945678
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
Pasha2 Филипп

Powerbuilder Help
...
rtn = dw_employee.Update()

IF rtn = 1 AND SQLCA.SQLNRows > 0 THEN


Выделенное условие не имеет смысла после dw.Update(), т.к. этот метод не меняет состояние SQLCA.

Видимо пример остался в справке со времен когда было по-другому.
...
Рейтинг: 0 / 0
04.03.2005, 11:37
    #32945749
Pasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
Anatoly Moskovsky
Выделенное условие не имеет смысла после dw.Update(), т.к. этот метод не меняет состояние SQLCA.

Видимо пример остался в справке со времен когда было по-другому.
Понятно спасибо.
А вот условие SQLCA.SQLCode показывает, была ли ошибка при сохранении или нет. По крайней мере я тестировал следующие варианты:
1) не введено обязательно поле
2) неверно настроена процедура на событие Insert/Update/Delete
3) если после ввода данных, перед сохранением, выдернуть сетевой шнур, т.е. грубо симетировать потерю связи с сервером.
Ну если поидии и это не должно работать, то к сожалению или к радости, у нас работает.
...
Рейтинг: 0 / 0
04.03.2005, 12:45
    #32946020
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PB и Oracle для удаленного юзера
PashaА вот условие SQLCA.SQLCode показывает, была ли ошибка при сохранении или нет. По крайней мере я тестировал следующие варианты:
1) не введено обязательно поле
2) неверно настроена процедура на событие Insert/Update/Delete
3) если после ввода данных, перед сохранением, выдернуть сетевой шнур, т.е. грубо симетировать потерю связи с сервером.
Ну если поидии и это не должно работать, то к сожалению или к радости, у нас работает.

Состояние объекта transaction НЕ меняется при .Update(), .Retrieve().
Значит, если у Вас SQLCA.SQLCode показывает ошибку, то она там была еще до .Update(), или по-крайней мере вызвана вне DW, например, где-то раньше есть вызов Embedded SQL, который вызвал ошибку.

Поэтому ловить ошибку надо только проверкой возвращаемого значения .Update(), а в событии dberror смотреть подробности ошибки в его аргументах.
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / PB и Oracle для удаленного юзера / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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