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

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

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

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

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

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

а commit происходит?
...
Рейтинг: 0 / 0
PB и Oracle для удаленного юзера
    #32941899
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не понял, он после набора выходит из программы? Может, если он "достаточно удаленный" просто часть данных не доходит (разрыв коннекта) или не доходит COMMIT?
...
Рейтинг: 0 / 0
PB и Oracle для удаленного юзера
    #32941908
Pasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
PB и Oracle для удаленного юзера
    #32941916
Pasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Данная проблема возникла только у юзеров, которые удаленно работаю.
Сейчас в процессе получения нового канала, но сам "звоночек" мне не понравилось и пока канал не расширили, хочу разобраться в чем проблема.
...
Рейтинг: 0 / 0
PB и Oracle для удаленного юзера
    #32941927
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я в Оракле ничего не понимаю , но, отвлекаясь от конкретной СУБД, я бы попробовал каким-нибудь образом выяснить, что именно доходит с этого клиента до сервера. Будет хоть какая-то пища для ума.
____________________________________
- Гарфилд, мышь!
- Спасибо, я сыт!
...
Рейтинг: 0 / 0
PB и Oracle для удаленного юзера
    #32941964
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim2000Я в Оракле ничего не понимаю , но, отвлекаясь от конкретной СУБД, я бы попробовал каким-нибудь образом выяснить, что именно доходит с этого клиента до сервера. Будет хоть какая-то пища для ума.
____________________________________
- Гарфилд, мышь!
- Спасибо, я сыт!


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

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

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
PB и Oracle для удаленного юзера
    #32942812
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pasha PL99Ну и messagebox перед rollback - тоже не самый лучший стиль программирования.
Был бы признателен, чем плох этот стиль
Тем, что изменения в базе откатываются после нажатия на кнопку ОК. Если пользователь ушел покурить, то все, кто попытается изменить данные, затронутые транзакцией первого пользователя тоже будут курить, пока первый не нажмет на ОК. На блокировочниках же пользователи даже не смогут прочитать данные.
...
Рейтинг: 0 / 0
PB и Oracle для удаленного юзера
    #32942841
Pasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркТем, что изменения в базе откатываются после нажатия на кнопку ОК. Если пользователь ушел покурить, то все, кто попытается изменить данные, затронутые транзакцией первого пользователя тоже будут курить, пока первый не нажмет на ОК. На блокировочниках же пользователи даже не смогут прочитать данные.
Спасибо, важное замечание.
...
Рейтинг: 0 / 0
PB и Oracle для удаленного юзера
    #32943303
Pasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поэксперементировал я вначале с 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
PB и Oracle для удаленного юзера
    #32943456
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый код тоже логически неверен. Необходимо делать COMMIT только тогда, когда прошел И update родительской таблицы, И update дочерней
...
Рейтинг: 0 / 0
PB и Oracle для удаленного юзера
    #32943632
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор//*************** 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
PB и Oracle для удаленного юзера
    #32944880
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
PB и Oracle для удаленного юзера
    #32945262
Pasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
PB и Oracle для удаленного юзера
    #32945506
zuzu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
PB и Oracle для удаленного юзера
    #32945534
Pasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я пробовал как с ПФС, так и без.
А пройдя далее по ПФС, заканчивается тем же самым Update().

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

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

IF rtn = 1 AND SQLCA.SQLNRows > 0 THEN


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

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

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

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

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


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