|
|
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
Великий ALL. ЕСть вопрос. PB9.0, W2003, работаю в ПФС. Есть простая таблица-хочу ее видеть на одной закладке в GRID для скорости навигации и простого редактирования, на другой в FORM для редактирования(полей много). Закладки u_tabpg. Все of_updateable. 1-вариант-shareData этих DW. В результате pfc_save пишет -your DW doesn't have UPDATE capability? Error 3-...between retrieve and update-то есть ничего не получается. 2-вариант-воспользовался Linkage. Дает ошибку в синтаксисе оператора UPDATE-хотя с виду Update совершенно правильный. Кто знает как сделать такую вещь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2005, 11:35 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
Знаем. Нужно прекратить халтурить и написать изменения БД руками. Тогда всё получится. ____________________________________ - Гарфилд, мышь! - Спасибо, я сыт! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2005, 11:40 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответ-только что значит "писать изменения руками"? у каждого руки разные! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2005, 11:58 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
Формировать INSERT/UPDATE/DELETE в БД вручную, а не встроенными средствами. Немного муторно, но избавляет от загадочных глюков. Кроме того, проще делать валидацию вводимых данных. ____________________________________ - Гарфилд, мышь! - Спасибо, я сыт! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2005, 12:49 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
Dim2000Формировать INSERT/UPDATE/DELETE в БД вручную, а не встроенными средствами. Немного муторно, но избавляет от загадочных глюков. Кроме того, проще делать валидацию вводимых данных. ____________________________________ Очень не хочется пользоваться нештатными(скажем нетипичными) средствами ПБ-там где можно штатными. Это мой принцип. Хотелось бы совета, как управляя Properties /events избежать этой маленькой хитрости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2005, 12:55 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
sboykoОчень не хочется пользоваться нештатными(скажем нетипичными) средствами ПБ-там где можно штатными. С каких пор ESQL стал нештатным средством? Это мой принцип. У меня другой принцип - делать так, как работает . Хотелось бы совета, как управляя Properties /events избежать этой маленькой хитрости. Не ко мне. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2005, 13:05 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
sboyko1-вариант-shareData этих DW. В результате pfc_save пишет -your DW doesn't have UPDATE capability? Error 3-...between retrieve and update-то есть ничего не получается. проверь Update Properties твоих DWobject'ов ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2005, 13:31 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
sboyko Dim2000Формировать INSERT/UPDATE/DELETE в БД вручную, а не встроенными средствами. Немного муторно, но избавляет от загадочных глюков. Кроме того, проще делать валидацию вводимых данных. ____________________________________ Очень не хочется пользоваться нештатными(скажем нетипичными) средствами ПБ-там где можно штатными. Это мой принцип. Хотелось бы совета, как управляя Properties /events избежать этой маленькой хитрости.Насколько я понимаю, вам нужно формировать update только для одного DW - второе получает разделяемые данные. Вообще, рекомендую посмотреть исходный код объектов в pfc-библиотеках, начиная с события pfc_save в pfc_w_master. Там все довольно прозрачно. Dim2000... Это мой принцип. У меня другой принцип - делать так, как работает . ...Хм... Не от таких ли принципов возникает код, принципиально требующий присутствия автора? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2005, 15:31 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
У меня одновременно используеться и ShareData и LinckAge ! Все очень просто - как сказали выше, из всех Шареных DW надо оставить одно со свойством is_updateble , первое! Отсальные - убрать. Тогда pfc_save() - будет работать нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2005, 15:55 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
sboykoВеликий ALL. ЕСть вопрос. PB9.0, W2003, работаю в ПФС. Есть простая таблица-хочу ее видеть на одной закладке в GRID для скорости навигации и простого редактирования, на другой в FORM для редактирования(полей много). Закладки u_tabpg. Все of_updateable. 1-вариант-shareData этих DW. В результате pfc_save пишет -your DW doesn't have UPDATE capability? Error 3-...between retrieve and update-то есть ничего не получается. Попробуй сделать ShareDataOff перед сохранением и ShareData после сохранения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2005, 16:00 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
PL99 Dim2000...У меня другой принцип - делать так, как работает .Хм... Не от таких ли принципов возникает код, принципиально требующий присутствия автора? Честно говоря, мне абсолютно всё равно, что будет с моим кодом после моей смерти ;). Но, по отзывам других людей, написанное мной требует минимального внимания и легко понятно даже начинающим. Не так уж и плохо. Что же касается внесения изменений в БД только "руками" - это моё убеждение, выстраданное переделкой разного рода глюкал, оставшихся мне в наследство от других. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2005, 16:12 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
Из соседнего топика цитата: ФилиппНи строчки embedded SQL!!! :-)Обеими руками - за. Любителей ESQL - давить! Загадочность глюков как правило проистекает из недостаточно четкого понимания как работает datawindow (ну или PFC). Делать какие-либо действия с БД в обход стандартных возможностей DW - неправильно. При таком подходе - данные из DW сохраняются вручную с помощью ESQL - кода больше - соответственно производительность падает - возрастает вероятность ошибки. И поддерживать сложнее, что бы Вы там ни говорили. По поводу вопроса - правильно использовать Linkage и ShareData одновременно. Linkage переключить в режим Scroll. Linkage обеспечивает скроллинг, ShareData - синхронность данных. updateable у FORM надо отключить ( of_SetUpdateable(False) ? ) поскольку достаточно того, что изменения сохранит GRID. Выключать ShareData перед сохранением - бред! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2005, 17:10 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
Dim2000Знаем. Нужно прекратить халтурить и написать изменения БД руками. Тогда всё получится. Более безобразного совета на этом форуме я ещё не слышал. Ни в коем случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2005, 18:56 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
Филипп Dim2000Знаем. Нужно прекратить халтурить и написать изменения БД руками. Тогда всё получится. Более безобразного совета на этом форуме я ещё не слышал. Ни в коем случае. Можно обосновать? Я свою точку зрения вообще-то обосновал - на разного рода трудновоспроизводимые глюки от использования DW для модификации данных я насмотрелся предостаточно для того, чтобы понять, что это делать не нужно. Оригинальным автором поделий был не я - я их доводил до ума. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2005, 19:09 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
Г-н sboyko, сделать нужно следующим образом: 1) n_dsa descendant instance variable (назовём для наглядности ids_defaults) на твоём таб контроле, который и будет шариться с DWми на закладках. 2) В Constructorе таб контрола пишешь типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 3) На datawindows, сидящих на закладках, скриптаешь всё как полагается, pfc_Validation и т.п., НО override pfc_Update и в нём просто пишешь RETURN SUCCESS , поскольку эти datawindows - display only. По сути дела - всё, остальное - косметика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2005, 19:12 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
Dim2000на разного рода трудновоспроизводимые глюки от использования DW для модификации данных я насмотрелся предостаточно для того, чтобы понять, что это делать не нужно. 1) разного рода трудновоспроизводимые глюки от использования DW для модификации данных возникают от кривых рук программистов. 2) НЕ использовать DW для модификации данных - оксюморон, это всё равно что сказать - мы используем Powerbuilder, но при этом НЕ используем Powerbuilder . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2005, 19:15 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
Филипп2) НЕ использовать DW для модификации данных - оксюморон, это всё равно что сказать - мы используем Powerbuilder, но при этом НЕ используем Powerbuilder . Нее - круче сказать - "Мы используем PB, но не пользуемся DW" :) Dim2000 Глюки конечно есть, но при достаточно граммотно подходе они все обходятся. Делитесь глюками, глядишь найдуться люди, которые их давно обошли. Не использовать же DW для сохранения данных что через Update table, что через Update Procedure - для меня по меньшей мере странно звучит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2005, 23:17 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
ASCRUSНее - круче сказать - "Мы используем PB, но не пользуемся DW" :) Не-а, мы пользуемся DW для доставания и показывания данных. Это у него получается просто замечательно . Глюки конечно есть, но при достаточно граммотно подходе они все обходятся. Делитесь глюками, глядишь найдуться люди, которые их давно обошли. Тынц Проблема не у меня (у меня их нет), но с удовольствием прочитаю о способах её решения ;). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2005, 16:45 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
Ну так это проблема ADO.Net провайдера, а не datawindow, не надо нам тут передёргивать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2005, 17:44 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
ФилиппНу так это проблема ADO.Net провайдера, а не datawindow Я считаю это проблемами DW. Ибо select @@identity должно нормально работать на любом хотя бы условно пригодном к использованию провайдере. не надо нам тут передёргивать... Это и всё, что Вы можете сказать по существу проблемы ;)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2005, 18:01 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
Проблема не у меня (у меня их нет),У стоматолога который считает что зубы не надо лечить, а надо сразу вырывать нафик - тоже проблем нет. Проблемы потом у пациентов но с удовольствием прочитаю о способах её решения ;).Так там уже есть как минимум два решения - пользоваться OLEDB вместо ADO.NET ( в семерке когда только появился OLEDB он тоже глючил, потом стало гораздо лучше) - делать select scope_identity() после UPDATE. ( именно так и приходилось делать при использовании OLEDB под 7ой или 8ой - не помню уже.) Слегка подправить поведение DW и полностью ампутировать INSERT/UPDATE/DELETE это знаете ли разные вещи. Я тоже считаю что "трудновоспроизводимые глюки" это либо неумение, либо нежелание разобраться. Я не сталкивался за последние 10 лет с глюками при сохранении DW которые нельзя было бы обойти, в худшем случае - с помощью пары тройки десятков строк кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2005, 18:44 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
Считать вы можете всё, что угодно, но если воспользоваться вашим блестящим советом и "написать изменения БД руками", то бишь взять и написать embedded SQL, который к примеру пойдёт через тот же "любой хотя бы условно пригодный к использованию провайдер", то у вас каким то чудом произойдёт fetch identity прямо внутри UPDATE statementа, и опять же каким то чудом значение identity будет засунуто в какую то локальную переменную? Если "любой хотя бы условно пригодный к использованию провайдер" поддерживает такую операцию, тогда значение identity появится и в соответствующем datawindow, если нет, то нет, причём здесь datawindow? Так что не надо нам тут НЕ по существу проблемы передёргивать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2005, 18:51 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
Dim2000 Тынц Проблема не у меня (у меня их нет), но с удовольствием прочитаю о способах её решения ;).Пожалуйста! Если проблема возникает при миграции на очередную версию среды разработки, то, прежде всего, стоит задаться вопросом - надо ли переходить? Посчитать все плюсы и минусы, к которым такой переход приведет. В приведенном вами случае минусы перевешивают все имеющиеся плюсы. Думаю, что через год-полтора проблема будет решена, тогда и можно будет задуматься о переходе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2005, 19:21 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
ФилиппСчитать вы можете всё, что угодно, но если воспользоваться вашим блестящим советом и "написать изменения БД руками", то бишь взять и написать embedded SQL, который к примеру пойдёт через тот же "любой хотя бы условно пригодный к использованию провайдер", то у вас каким то чудом произойдёт fetch identity прямо внутри UPDATE statementа, и опять же каким то чудом значение identity будет засунуто в какую то локальную переменную? Внутри - не пойдёт. А вот select @@identity into :new_id from dummy (или как там правильно для MSSQL - я сижу на ASA) пока что не подводило. Так что не надо нам тут НЕ по существу проблемы передёргивать... Не говорите, что мне нужно делать... продолжение знаете ? Так вот, если по существу вопроса - откуда такая уверенность, что дело не в том, что DW "забывает" послать этот самый select @@identity (или что там нужно посылать) на сервер? Если бы Вы сказали, что select @@identity, посланный с помощью ESQL через ADO.NET на MSSQL, возвращает какую-то чушь - это бы меня убедило (даже поверю на слово - "десятки" под рукой нет). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2005, 20:10 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
Ещё по существу проблемы (не в этом топике): 1) OLEDB и ADO.NET are equivalent at this point as the current ADO.NET support in PB is limited to the Data Provider for OLEDB (as the ADO.NET support is limited to the .NET Data Provider for OLEDB which is in the System.Data.OleDb namespace) 2) From Sybase's employee - ADO.NET in PB 10 is a layer above PB10. I don't see a compelling use of the ADO.NET driver in PB10. It will be key in PB11 when we can create .NET assemblies, and it's key now in DataWindow .NET 1.0/1.5. Отсюда вывод - даже в РВ10 НЕ надо использовать ADO.NET (он там ТОЛЬКО для DataWindow.NET) , а надо OLEDB ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2005, 20:51 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
А я согласен с Dim2000. ESQL есть вполне штатное средство и запрещать использовать его так же глупо как запрещать использовать DW. В очень многих случаях намного удобнее и быстрее послать изменения в базу через ESQL'ные INSERT/UPDATE/DELETE чем заводить ради одной переменной dataobject и класть его в pbl. Тоже самое насчет создания DataStore на основе SQLCA.SyntaxFromSQL, плюс еще десяток строк - смена параметров свежесозданого DataStore объекта. И все это ради того чтобы повторить функциональность одной SQL команды??? ЗоринАндрейЯ не сталкивался за последние 10 лет с глюками при сохранении DW которые нельзя было бы обойти, в худшем случае - с помощью пары тройки десятков строк кода. Все верно. Обойти глюки можно. И способо обхода тоже множество. Вот только потом, когда надо поменять функциональность или исправить обнаруженую ошибку приходится долго и муторно бегать по десятку окошек. Проверь event'ы и функции навешаные на конкретный dw contorl, потом проверь pfc_* event'ы и функции навешаные на окно. Потом пойди в родителя этого окна и проверь все эти события и функции там. Потом вернись в потомка проверь их все заново.... Все это чрезвычайно муторно и неприятно. Намного проще когда вся процедура сохранения данных находится в одном месте. Пусть даже и написана она на чистом ESQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2005, 22:59 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
ЗоринАндрейЛюбителей ESQL - давить! Призываю совесть модераторов!!! Это что за безобразие???? Не надо тут разжигать "межнациональные войны"! Ведь это достаточно оскорбительно. Давить... Я хоть и не любитель ESQL, но скажу так: если Вы не видите смысла в чем-то, это не значит, что его там нет. Ну зачем, скажите, делать ДС, ретривить туда данные из базы, а потом бегать циклом по этому ДС и делать с ними все что нужно. Почему я сразу не могу сделать тоже самое, что и ПБ? Взять курсор, открыть, отфетчить и закрыть?! А для кого скажите тогда придумали динамические курсоры, которые гораздо проще в использовании чем ДС? И они тоже находят применение, только реже! Будем считать, что Вы это сказали не подумавши и в конкретном контексте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2005, 23:22 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
Гм, логику в БД выносите, и не будет религиозных войн, ESQL будет применятся только там где нужно и все писаться только через DW. Я лично применяю ESQL на уровне "SELECT INTO Var", все остальное DW и DECLARE PROCEDURE, курсорами в PB не пользуюсь вообще (собственно говоря и в БД то редко ими пользуюсь). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2005, 07:58 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
ASCRUSГм, логику в БД выносите, и не будет религиозных войн почему обезательно в БД, мы ее вынесли на сервер, у нас архитектура клиент-сервер-БД, и все что загружается идет через наш сервер, у клиента нет прямого конекта на БД, все операции идут через сервер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2005, 10:42 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
zuzu ASCRUSГм, логику в БД выносите, и не будет религиозных войн почему обезательно в БД, мы ее вынесли на сервер, у нас архитектура клиент-сервер-БД, и все что загружается идет через наш сервер, у клиента нет прямого конекта на БД, все операции идут через сервер. Потому в БД, что работы меньше по проектированию, доработке и сопровождению. Для создания 3-х звенок нужны веские обоснования, хотя лучше дальше не продолжать, в форуме "Сравнение СУБД" немало копий в религиозных войнах "2vs3звенки" сломано и ничего не доказано - только пришли к выводу, что кто как может, тот так и делает :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2005, 10:54 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
White OwlА я согласен с Dim2000. ESQL есть вполне штатное средство и запрещать использовать его так же глупо как запрещать использовать DW.Согласен, запрещать не стоит :-) White OwlВ очень многих случаях намного удобнее и быстрее послать изменения в базу через ESQL'ные INSERT/UPDATE/DELETE чем заводить ради одной переменной dataobject и класть его в pbl.Оно конечно, заплатку налепить быстрее... Как обеспечить корректное разграничение доступа при таком использовании ESQL? White Owl Тоже самое насчет создания DataStore на основе SQLCA.SyntaxFromSQL, плюс еще десяток строк - смена параметров свежесозданого DataStore объекта. И все это ради того чтобы повторить функциональность одной SQL команды???Все это можно только через специализированные сервисы, инкапсулирующие ESQL вызовы и обеспечивающие всю обвязку - проверку ошибок, разграничение доступа и т.п. В случае использования DW/DS все это должно быть реализовано в соответствующих предках. White OwlВот только потом, когда надо поменять функциональность или исправить обнаруженую ошибку приходится долго и муторно бегать по десятку окошек. Проверь event'ы и функции навешаные на конкретный dw contorl, потом проверь pfc_* event'ы и функции навешаные на окно. Потом пойди в родителя этого окна и проверь все эти события и функции там. Потом вернись в потомка проверь их все заново.... Все это чрезвычайно муторно и неприятно. Намного проще когда вся процедура сохранения данных находится в одном месте. Пусть даже и написана она на чистом ESQL.Вот именно. Если архитектура приложения для изменения функциональности требует подобных действий, может стоит задуматься - а не поменять ли что-нибудь в консерватории? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2005, 11:24 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
PL99 White OwlВ очень многих случаях намного удобнее и быстрее послать изменения в базу через ESQL'ные INSERT/UPDATE/DELETE чем заводить ради одной переменной dataobject и класть его в pbl.Оно конечно, заплатку налепить быстрее... Как обеспечить корректное разграничение доступа при таком использовании ESQL? Э? Что там разграничивать? Разграничение доступа к отдельным таблицам по принципу имени или группы юзера деалается на уровне базы данных. Никак не приложения. То есть вполне хватит проверить SQLCA.SQLCode после выполнения ESQL команды и если в данном конретном месте возможно получить отлуп по недостатку прав выдать соотвествующее предупреждение пользователю или проигнорировать ошибку... Ну как захочется :) А во вторых, та же самая проблема есть и при использовании DW. Точно так же можно получить dw_1.Update() = -1 при нехватке прав. В любом случае, проблема разграничения доступа никак не связана с решением использовать ESQL в данном конкретном месте или заводить специальный datastore. PL99Все это можно только через специализированные сервисы, инкапсулирующие ESQL вызовы и обеспечивающие всю обвязку - проверку ошибок, разграничение доступа и т.п. В случае использования DW/DS все это должно быть реализовано в соответствующих предках. Все равно этого предка еще надо делать. А во вторых, опять же на все случаи жизни предков не напасешься. В любом варианте тебе прийдется модифицировать предка под сиюминутные нужды. Имя таблицы там поменять или фильтр по другому построить. Все равно при использовании даже заранее сочиненного u_super_dw_for_update прийдется писать несколько настроечных строк. Да еще и прийдется помнить какие именно настройки это u_super_dw_for_update требует :) А так, одна строка: update sometable a set f1=(select f2 from othertable b where a.fk=b.pk and a.pk=:iRowId); И вся проблема решена :) PL99Вот именно. Если архитектура приложения для изменения функциональности требует подобных действий, может стоит задуматься - а не поменять ли что-нибудь в консерватории? Ой, да я бы с удовольствием. Но эта архитектура естественное следствие идиотской PowerBuilder'овской системы наследования объектов и его кривой реализации редактора евентов/функций. Ну почему для редактирования одного евента надо обязательно закрыть другой? Почему нельзя одновременно открыть на экране два евента одного объекта? Почему нельзя открыть и окно-родителя и окно-потомка и вместе их рассматривать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2005, 19:23 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
ASCRUSГм, логику в БД выносите, и не будет религиозных войн Религиозные войны идут и по вопросу выносить логику в БД или не выносить :) А даже если логика и вынесена с клиента на сервер все равно этой логикой еще и управлять как-то надо. Данные ей кидать, указывать по какому из принципов обрабатывать вот эти конкретные данные. Мы ж тут и флудим про то как именно указывать, как именно кидать данные :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2005, 19:32 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
White OwlНо эта архитектура естественное следствие идиотской PowerBuilder'овской системы наследования объектов и его кривой реализации редактора евентов/функций. Ну почему для редактирования одного евента надо обязательно закрыть другой? Почему нельзя одновременно открыть на экране два евента одного объекта? Почему нельзя открыть и окно-родителя и окно-потомка и вместе их рассматривать? А это что за бред? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2005, 19:42 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
Филипп White OwlНо эта архитектура естественное следствие идиотской PowerBuilder'овской системы наследования объектов и его кривой реализации редактора евентов/функций. Ну почему для редактирования одного евента надо обязательно закрыть другой? Почему нельзя одновременно открыть на экране два евента одного объекта? Почему нельзя открыть и окно-родителя и окно-потомка и вместе их рассматривать? А это что за бред? К сожалению, вам Филипп, этого не понять. Вот если бы у вас был опыт писания на Java/C++/Delphi/whatever а не один только PowerBuilder, то вы бы сами все это увидели бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2005, 19:49 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
White OwlК сожалению, вам Филипп, этого не понять. Вот если бы у вас был опыт писания на Java/C++/Delphi/whatever а не один только PowerBuilder, то вы бы сами все это увидели бы. Г-н computer scientist, вы знаете что бывает когда you assume ? - You make an ass of u and me (для нечитающих по аглицки - когда вы предполагаете, вы делаете задницу из себя и меня)... И на Java, и на C++ (VC++/MFC) я писал, и имел ужас неоднократно любоваться на Visual Basic код... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2005, 20:09 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
White Owl PL99Оно конечно, заплатку налепить быстрее... Как обеспечить корректное разграничение доступа при таком использовании ESQL? Э? Что там разграничивать? Разграничение доступа к отдельным таблицам по принципу имени или группы юзера деалается на уровне базы данных. Никак не приложения. Разграничение прав на уровне БД не отменяет необходимости корректной их обработки на клиенте. White OwlТо есть вполне хватит проверить SQLCA.SQLCode после выполнения ESQL команды и если в данном конретном месте возможно получить отлуп по недостатку прав выдать соотвествующее предупреждение пользователю или проигнорировать ошибку... Ну как захочется :) Во-во. Именно о таком кривом коде я и говорил. White OwlА во вторых, та же самая проблема есть и при использовании DW. Точно так же можно получить dw_1.Update() = -1 при нехватке прав. В любом случае, проблема разграничения доступа никак не связана с решением использовать ESQL в данном конкретном месте или заводить специальный datastore.Вы же ниже приводите мои слова о том, как эти проблемы решены. Что непонятно-то? PL99Все это можно только через специализированные сервисы, инкапсулирующие ESQL вызовы и обеспечивающие всю обвязку - проверку ошибок, разграничение доступа и т.п. В случае использования DW/DS все это должно быть реализовано в соответствующих предках. White OwlВсе равно этого предка еще надо делать. А во вторых, опять же на все случаи жизни предков не напасешься. Почему-то у меня таких проблем нет, на все случаи жизни давным давно заведены соответствующие сервисы. В том числе и для таких постоянно применяемых, а не сиюминутных вещей , как White OwlИмя таблицы там поменять или фильтр по другому построить.. Если же задача новая, то написать код, пригодный для повторного использования, и оформить его в виде сервиса мне удобнее/проще/дешевле, чем лепить какие-то невнятные тексты... White OwlВсе равно при использовании даже заранее сочиненного u_super_dw_for_update прийдется писать несколько настроечных строк. Да еще и прийдется помнить какие именно настройки это u_super_dw_for_update требует :)Настроечная информация хранится в соответствующих таблицах/файлах/разделах реестра и называется метаинформацией. А помнить надо только наименование документа, где эти фичи (и все прочие) документированы. White OwlА так, одна строка: update sometable a set f1=(select f2 from othertable b where a.fk=b.pk and a.pk=:iRowId); И вся проблема решена :)Я бы не стал раздувать флейм, если бы волею судьбы мне не приходилось сейчас рыть код, в котором в течении четырех лет все проблемы решали подобным образом. White Owl PL99Вот именно. Если архитектура приложения для изменения функциональности требует подобных действий, может стоит задуматься - а не поменять ли что-нибудь в консерватории? Ой, да я бы с удовольствием. Но эта архитектура естественное следствие идиотской PowerBuilder'овской системы наследования объектов и его кривой реализации редактора евентов/функций. Ну почему для редактирования одного евента надо обязательно закрыть другой? Почему нельзя одновременно открыть на экране два евента одного объекта? Почему нельзя открыть и окно-родителя и окно-потомка и вместе их рассматривать?Вы пятую версию PB используете или четвертую? Впрочем, неважно... Какая связь между архитектурой приложения и реализацией среды разработки? А вот система наследования вполне соответствует принципам ООП, поясните, что там такого идиотского? Впрочем, что-то мне подсказывает, что возможность открыть код предка и потомка одновременно в двух окнах не избавило бы вас от желания легко и просто написать строчку ESQL... А вот использовать copy&paste? наоборот, поощрило бы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2005, 20:11 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
PL99 White OwlТо есть вполне хватит проверить SQLCA.SQLCode после выполнения ESQL команды и если в данном конретном месте возможно получить отлуп по недостатку прав выдать соотвествующее предупреждение пользователю или проигнорировать ошибку... Ну как захочется :) Во-во. Именно о таком кривом коде я и говорил. А что в этом кривого? Если ты используешь dw_1.Update ты получаешь все тоже самое. Точно так же прийдется заниматься отловом ошибки и разбираться почему именно. Только не при вызове dw_1.Update() а в dw_1.dberror. Конечно более красиво и чисто было бы просто не допускать вызова ESQL команды update или dw_1.Update() если пользователь заведомо получит отлуп по недостатку прав. Но и в том и в другом варианте принцип работы совершенно одинаков. Еще раз повторю, с точки зрения разграничения прав нету разницы чем пользоваться - dw или esql. PL99 White OwlВсе равно этого предка еще надо делать. А во вторых, опять же на все случаи жизни предков не напасешься. Почему-то у меня таких проблем нет, на все случаи жизни давным давно заведены соответствующие сервисы. Иех, хорошо наверное жить в конторе, в которой специалисты на протяжении десятилетий вылизывает одну единственную библиотеку. PL99В том числе и для таких постоянно применяемых, а не сиюминутных вещей , как White OwlИмя таблицы там поменять или фильтр по другому построить.. Если же задача новая, то написать код, пригодный для повторного использования, и оформить его в виде сервиса мне удобнее/проще/дешевле, чем лепить какие-то невнятные тексты... Ок. Есть база, в базе две сотни таблиц. Нужно в этих таблицах обновлять значения отдельных полей. Покажи мне подготовленный заранее сервис который справится с такой задачей в одну строку при сиюминутном использовании. Покажи мне сервис использование которого позволит мне убрать из кода строки типа select max(f1) into :tmp from dba.t1; и insert into dba.t2 (f2) values (:tmp); Чтоб он работал для любой из сотни имеющихся таблиц, с любым полем в этих таблицах. Я хочу посмотреть на такой сервис. PL99 White OwlВсе равно при использовании даже заранее сочиненного u_super_dw_for_update прийдется писать несколько настроечных строк. Да еще и прийдется помнить какие именно настройки это u_super_dw_for_update требует :)Настроечная информация хранится в соответствующих таблицах/файлах/разделах реестра и называется метаинформацией. А помнить надо только наименование документа, где эти фичи (и все прочие) документированы. Все равно, на все случаи жизни заранее сочиненых настроек не напасешься. Затем возможность настроек и делается чтобы их можно было при нужде менять, верно? Но менять то их все равно прийдется. Так зачем строить свою систему, для замены SQL если этот самый SQL уже доступен? Вот если делать систему которой клиент сможет рулить, тогда да - прийдется сочинять настроечные таблицы. Но мы же не о клиентах сейчас говорим, а о себе любимых. Зачем самому себе делать лишний уровень системной инкапсуляции? PL99 White OwlА так, одна строка: update sometable a set f1=(select f2 from othertable b where a.fk=b.pk and a.pk=:iRowId); И вся проблема решена :)Я бы не стал раздувать флейм, если бы волею судьбы мне не приходилось сейчас рыть код, в котором в течении четырех лет все проблемы решали подобным образом. Ха! А я уже четвертый год довожу до ума проект в котором все запросы к базе решали созданием новых dw. У меня на руках три десятка pbl с сотней dw в каждой. Как ты думаешь сколько там совершенно одинаковых dw различающихся только именем? А? :) А сколько времени надо убить чтобы найти в которой именно из pbl лежит нужный dw? А как весело когда в двух разных pbl лежат два разных dw с одинаковыми именами... Я бы тоже не стал раздувать флейм, если бы мои коллеги и предшественники почаще пользовались бы ESQL или SQLCA.SyntaxFromSQL. Весь код по объему сократился бы вдвое как минимум. PL99Вы пятую версию PB используете или четвертую? Впрочем, неважно... Какая связь между архитектурой приложения и реализацией среды разработки? А вот система наследования вполне соответствует принципам ООП, поясните, что там такого идиотского? Девятую я использую. А среда разработки здесь очень сильно вмешивается. Когда ты делаешь даже простую двузвенку родитель-потомок тебе очень часто приходится переключаться между ними пока разбираешься какой код остается в родителе, а какой выносится в потомка. PB требует чтобы потомок и родитель были уже скомпилированы и лежали в pbl готовом для линковке виде так? Так. А это значит, что если мы добавили в одного потомка некую функциональность, потом собираемся перенести эту функциональность в родителя нам прийдется несколько раз делать код-заглушку или коментарить весь кусок недописаного кода целиком чтобы пойти и проверить как это делалось раньше... В итоге, очень велика вероятность просто забыть убрать заглушку или снять коментарий. Сделаные, только ради того, чтобы PB позволил нам посмотреть на другой участок кода. Тоже самое относится и к кодированию евентов/функций. Если в двух сходных функциях надо сделать copy/paste или просто посмотреть имя/параметры вызываемой функции, или уточнить смысл какого-то параметра.... Все равно прийдется делать заглушки/коментарии требующиеся исключительно для удовлетворения PB-шной среды. Принципы ООП не нарушаются, но увеличивается шанс допустить ошибку. PL99Впрочем, что-то мне подсказывает, что возможность открыть код предка и потомка одновременно в двух окнах не избавило бы вас от желания легко и просто написать строчку ESQL... А вот использовать copy&paste? наоборот, поощрило бы... Как говаривал один мой знакомый "Зачем нужно модульное программирование, если есть блочное копирование?" :) Copy&paste не так уж и плохо. Плохо если оно используется без ума :) А ESQL как я уже говорил - очень полезная и правильная возможность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2005, 21:13 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
White Owl Ха! А я уже четвертый год довожу до ума проект в котором все запросы к базе решали созданием новых dw. У меня на руках три десятка pbl с сотней dw в каждой. Как ты думаешь сколько там совершенно одинаковых dw различающихся только именем? А? :) А сколько времени надо убить чтобы найти в которой именно из pbl лежит нужный dw? А как весело когда в двух разных pbl лежат два разных dw с одинаковыми именами... для того чтобы знать в рунтайме имя ДВ и ПБЛ мы сделали проще: при CTRL+SHIFT+leftdoubleclick поевляется мессага с полным путем до пбл и еще коечто, насчет дублирующих объектах: всегда используется первый из очереди прицепленных ПБЛ к проекту, и вообсче лутше не иметь дублирующих объектов тоесть с одинаковыми иминами так как при компиляции у вас наверно поевляются дофига warningov, что не есть GOOD. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2005, 21:58 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
White Owl В итоге, очень велика вероятность просто забыть убрать заглушку или снять коментарий. Сделаные, только ради того, чтобы PB позволил нам посмотреть на другой участок кода. для этого я открываю две IDE PowerBuilderа на тотже прожект, покачто глюков от этого не заметил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2005, 22:04 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
А сколько времени надо убить чтобы найти в которой именно из pbl лежит нужный dw?Бред. File -> Open (Ctrl-O) . В listbox Libraries выбрали ВСЕ pbl. Набрали имя datawindow object в Object Name. Нажали Ok. Если ранее выбирали все PBL то при следующем Ctrl-O - они уже выбраны. Так что если имя datawindow уже в clipboard - открыть его - полсекунды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2005, 22:11 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
А это значит, что если мы добавили в одного потомка некую функциональность, потом собираемся перенести эту функциональность в родителя нам прийдется несколько раз делать код-заглушку или коментарить весь кусок недописаного кода целиком чтобы пойти и проверить как это делалось раньше...Бред. Открываем предка и любых его потомков через Edit Source и резвимся как хотим. ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2005, 22:17 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
Филипп!!! Я восхищён!!! Мы в восхищении!!! (Копирайт Кот Бегемот) -- это по поводу Вашей работы со словом assume. --------------------------------------------------------------------------- Тот, кто различает слова -- дело того праведно. Святой Кабир Сахиб, один из Мастеров Сюрат Шабд Йоги. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2005, 00:29 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
zuzuдля этого я открываю две IDE PowerBuilderа на тотже прожект, покачто глюков от этого не заметил. Сумасшедший. ЗоринАндрей А сколько времени надо убить чтобы найти в которой именно из pbl лежит нужный dw?Бред. Слову "бред" ты научился у Филиппа или это спецефическая фенечка этого форума? :) Ну тут я конечно погорячился слегка (смущенно краснеет). Я предпочитаю искать при помощи FARа и pbldump. Тоже вполне быстро и удобно получается. ЗоринАндрейБред. Открываем предка и любых его потомков через Edit Source и резвимся как хотим. ;-) Можно конечно, только неудобно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2005, 01:04 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
White Owl PL99 White OwlТо есть вполне хватит проверить SQLCA.SQLCode после выполнения ESQL команды и если в данном конретном месте возможно получить отлуп по недостатку прав выдать соотвествующее предупреждение пользователю или проигнорировать ошибку... Ну как захочется :) Во-во. Именно о таком кривом коде я и говорил. А что в этом кривого? Гм... Проверять надо не SQLCA.SQLCode, a SQLDbCode используемого в данной ситуации объекта транзакции (в общем случае в приложении их более одного). Делать это должен объект, инкапсулирующий базовую функциональность, который, среди прочего, умеет обрабатывать ошибки БД и разграничивать права доступа. White OwlЕсли ты используешь dw_1.Update ты получаешь все тоже самое. Точно так же прийдется заниматься отловом ошибки и разбираться почему именно. Только не при вызове dw_1.Update() а в dw_1.dberror.А еще любая программа, в конечном счете, становится набором инструкций процессора. Я уже отловил все стандартные ошибки (вроде нарушений ссылочной целостности или отсутствия прав доступа) в предке, передал их в предка невизуального бизнес-объекта (он содержит ссылку на idw_requestor), а там - см. выше. Если ошибка специфична для конкретного бизнес-объекта, то я иду по пути ASCRUS - ловлю их на сервере, клиент получает стандартную структурированную строку, разбирает ее, отображает сообщение об ошибке, пишет в логфайл. White OwlКонечно более красиво и чисто было бы просто не допускать вызова ESQL команды update или dw_1.Update() если пользователь заведомо получит отлуп по недостатку прав. Но и в том и в другом варианте принцип работы совершенно одинаков. Еще раз повторю, с точки зрения разграничения прав нету разницы чем пользоваться - dw или esql.Да нет, я действительно не допущу вызова метода, на который пользователь не имеет прав - и при этом ограничусь только метаинформацией. White OwlИех, хорошо наверное жить в конторе, в которой специалисты на протяжении десятилетий вылизывает одну единственную библиотеку.Действительно, мне в этой конторе нравится :-)). Библиотек у нас хватает, проектов тоже, и если бы мы не облегчали себе жизнь грамотным проектированием, то, боюсь штат пришлось бы увеличить раза в три... А с этим сейчас довольно напряженно. White OwlЕсть база, в базе две сотни таблиц. Нужно в этих таблицах обновлять значения отдельных полей. Покажи мне подготовленный заранее сервис который справится с такой задачей в одну строку при сиюминутном использовании. Покажи мне сервис использование которого позволит мне убрать из кода строки типа select max(f1) into :tmp from dba.t1; и insert into dba.t2 (f2) values (:tmp); Чтоб он работал для любой из сотни имеющихся таблиц, с любым полем в этих таблицах. Я хочу посмотреть на такой сервис.Приезжайте, покажу. Адрес по запросу на мыло в профиле. Правда, база не одна, а больше, в том смысле, что это совершенно разные проекты совершенно разных заказчиков. Бизнес у них тоже разный. White OwlНо мы же не о клиентах сейчас говорим, а о себе любимых. Зачем самому себе делать лишний уровень системной инкапсуляции?Ленивый я :-) Тут у нас народ заметил, что уже до такой степени обленились все, что DW руками рисовать - и то влом :-) White OwlХа! А я уже четвертый год довожу до ума проект в котором все запросы к базе решали созданием новых dw. У меня на руках три десятка pbl с сотней dw в каждой. Как ты думаешь сколько там совершенно одинаковых dw различающихся только именем? А? :) А сколько времени надо убить чтобы найти в которой именно из pbl лежит нужный dw? А как весело когда в двух разных pbl лежат два разных dw с одинаковыми именами... Я бы тоже не стал раздувать флейм, если бы мои коллеги и предшественники почаще пользовались бы ESQL или SQLCA.SyntaxFromSQL. Весь код по объему сократился бы вдвое как минимум.Ты просто не умеешь их готовить (С). offtop Не более двух лет назад вы задавали элементарные вопросы по PB. Так что, IMHO, насчет "довожу до ума" несколько преувеличено. end offtop White OwlКогда ты делаешь даже простую двузвенку родитель-потомок тебе очень часто приходится переключаться между ними пока разбираешься какой код остается в родителе, а какой выносится в потомка. PB требует чтобы потомок и родитель были уже скомпилированы и лежали в pbl готовом для линковке виде так? Так. А это значит, что если мы добавили в одного потомка некую функциональность, потом собираемся перенести эту функциональность в родителя нам прийдется несколько раз делать код-заглушку или коментарить весь кусок недописаного кода целиком чтобы пойти и проверить как это делалось раньше... В итоге, очень велика вероятность просто забыть убрать заглушку или снять коментарий. Сделаные, только ради того, чтобы PB позволил нам посмотреть на другой участок кода.Мда... Если забыть свой адрес, то можно и домой не попасть. White OwlКак говаривал один мой знакомый "Зачем нужно модульное программирование, если есть блочное копирование?" :) Copy&paste не так уж и плохо. Плохо если оно используется без ума :)Глубина мысли просто потрясает... Слово рефакторинг не слыхали? Однозначно, править в консерватории :-) White OwlА ESQL как я уже говорил - очень полезная и правильная возможность. Плохо если оно используется без ума (С) White Owl ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2005, 02:00 |
|
||
|
sharedata()
|
|||
|---|---|---|---|
|
#18+
Знаете народ, я пожалуй этот топик прикрою. Тема уже давно по топику не обсуждается, а страсти накаляются уже неплохо. Мое мнение такое: кому как удобнее, тот так и делает. Если благодаря этому проекты успешно работает и человек не пытается учить других словам "правильно", "не правильно", "делай как я", то значит этот человек достиг кармы и он счастлив. В конце то концов проекты мы делаем не за тем, чтобы все красиво и правильно сделать, а чтобы заработать денег (слова моего очень очень высокого ранга в различных структурах шефа, который ни шиша не разбирается в IT, но зато очень разбирается, куда деньги вкладывать нужно). А все остальное (в том числе и жизненный опыт каждого из нас) - это просто философия для души, смысла для других не имеющая и понятная только тем, кто примерно думает так же и готов учиться дальше в данном направлении. Так что я модераторской палочкой с обсуждения "DWvsESQL" вполне благопристойно заменяю на "DW&ESQL" и думаю, что никто не спорит, что в разных ситуациях применяются разные решения, причем одни из них от недостатка опыта, а другие по производственной необходимости и важно помнить, что доказать никому ничего не возможно, можно только обмениваться опытом, учить и учиться. Так что уважаемые коллеги форума PB, нас не так уж много здесь присутствует(можно сказать национальное меньшинство на SQL.RU), давайте жить дружно !!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2005, 02:20 |
|
||
|
|

start [/forum/topic.php?all=1&fid=15&tid=1338524]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
88ms |
get tp. blocked users: |
1ms |
| others: | 210ms |
| total: | 390ms |

| 0 / 0 |
