OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 06 Декабрь, 2019 19:35

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Понедельник, 22 Декабрь, 2008 11:18 

Зарегистрирован: Понедельник, 22 Декабрь, 2008 09:45
Сообщения: 10
Откуда: Красноярск
Дано: настроенное ODBC соединение к БД Oracle, драйвер ODBC от Oracle
Необходимо:
Получить результаты запроса:
SELECT max(id) FROM companies
ни в какую,
после выполнения table.Read(0, m)
table.res равен SqlDB.noData
причем c min не отрабатывает тоже, с другими функциями отрабатывает нормально например строки из таких запросов
извлекаются без проблем
SELECT decode(id,4,-1,id) FROM companies
SELECT sign(id) FROM companies

Можно предположить, что ОДВС глючит с запросами типа выбрать максимальное минимальное значение?
Или я что то не понимаю?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Декабрь, 2008 11:28 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9161
Откуда: Россия, Орёл
А в самом ББ Вы указываете как драйвер модуль SqlOdbc или SqlOdbc3? Надо 3-ку.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Декабрь, 2008 12:17 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2933
Откуда: г. Ярославль
У меня MySQL 5.0.67, драйвер MyODBC 3.51.15, BB 1.5re026. Запрос 'SELECT MAX(product) FROM event_product' возвращает корректный результат.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Декабрь, 2008 12:20 

Зарегистрирован: Понедельник, 22 Декабрь, 2008 09:45
Сообщения: 10
Откуда: Красноярск
protocol = "SqlOdbc3";


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Декабрь, 2008 16:27 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4539
Откуда: Россия, Орёл
Столкнулся с проблемами работы с ODBC-драйвером HyTech:
1) Поля-даты определяются как "unknown"-тип (драйвер указывает WinSql.SQL_OWNER_USAGE в качетстве типа).
2) В таблице-результате отсутствует последняя строка.

Разработчик ответил:
Цитата:
По п.1 91 это не SQl_OWNER_USAGE, а SQL_TYPE_DATE ( используется для odbcver старше 3. )
По п.2 строки не пропадают.

Pavel.Yakushev, проверьте, возможно у Вас проблема 2.

Из-за чего возникает проблема, нужно разбираться.
a) Может быть неточность в реализации SqlOdbc3, который, вероятно, переделывали из SqlOdbc
b) Либо какие-то замуты с самим драйвером, про которые упоминается в SqlOdbc и SqlOdbc3:
Цитата:
(* The major problem with ODBC is that many of its functions, or many uses of them, are optional.
This means that one can never rely on a function to be really implemented by the current ODBC driver.
As a result, one often has to try the best approach first, then back off if necessary to the next best, etc.
This is cumbersome and difficult to test exhaustively. *)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 23 Декабрь, 2008 06:34 

Зарегистрирован: Понедельник, 22 Декабрь, 2008 09:45
Сообщения: 10
Откуда: Красноярск
Коллеги, приветствую!
По проблеме Не нравится Oberon(у) функции min,max в запросе к БД
Решение следующее:

Проблема в драйвере ODBC, у меня был установлен драйвер производства Oracle v=10.01.00.02
Я скачал с сайта Oracle драйвер v=10.02.00.4 (Oracle ODBC Instant Client for Windows)
Теперь данные из запросов вида "select max(id) from companies"
извлекаются нормально.

PS:
1) Я не сомневался в ВВ, было подозрение на драйвер ODBC.
2) Есть желание заюзать BB для создания интерфейса пользователей к БД Oracle 10g
3) Драйвер Oracle ODBC Instant Client for Windows хорош тем, что может устанавливаться один на виндовую машину, без установки.
клиента Oracle


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 23 Декабрь, 2008 08:29 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2933
Откуда: г. Ярославль
Видно, проблемы с версиями драйверов ODBC не только у MySQL :)

Недавно экспериментировал с базой и поставил драйвер 3.51.11. И вдруг поля времени стали обнуляться. Сначала думал на свой код, а потом в баг-листе MySQL обнаружил, что проблема именно в этой версии драйвера. Проблема решилась заменой версии драйвера на 3.51.15.

Pavel.Yakushev писал(а):
2) Есть желание заюзать BB для создания интерфейса пользователей к БД Oracle 10g
У нас сделан интерфейс пользователя к базам MySQL. Кое-какой опыт наработан, и могу сказать - что это дело вполне осуществимое. Более того, на базе ББ можно без особого труда делать автоматические генераторы интерфейса пользователя БД.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 23 Декабрь, 2008 08:53 

Зарегистрирован: Понедельник, 22 Декабрь, 2008 09:45
Сообщения: 10
Откуда: Красноярск
Хорошо бы небольшой пример из двух форм см. п 2.1 и 2.2
следующего вида:


1) скрипт создания таблиц с данными

2.1) Форма со скролл-областью для ввода и корректировки данных-
типа в скролл выбрал строку кликнул по строке попал в нескролл форму и редактируешь поля
а строка скролл на которой стоял выделена цветом

2.2) Форма со скролл-областью для ввода и корректировки данных-
типа в скролл выбрал строку кликнул и редактируешь поля в самой текущей строки скролл области

3) при переходе по строкам скролл-области в поле х отображаются значение какого либо текущего поля

Автоматически генерировать это когда при создании формы указываешь модуль? - впечатляет продуманность.
Видел доки с большими примерами, пока не разбирался, но может оказаться что в них
за деревьями леса не будет видно ))


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 23 Декабрь, 2008 10:35 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2933
Откуда: г. Ярославль
Цитата:
1) скрипт создания таблиц с данными

У нас таблицы создаются обычным SQL-запросом, посылаемым серверу через ODBC. Так же происходит и изменение структуры БД у клиента. Все необходимые SQL-запросы формулируются, записываются в текстовый файл, который отправляется клиенту. Тот у себя нажимает кнопку "обновить", запросы последовательно читаются из файла и предлагаются серверу БД. Просто и удобно.

Цитата:
...скролл выбрал строку кликнул по строке попал в нескролл форму и редактируешь поля, а строка скролл на которой стоял выделена цветом

Прикрепил скриншот, browse-form.png

Цитата:
... в скролл выбрал строку кликнул и редактируешь поля в самой текущей строки скролл области

Такое есть в стандартной таблице BB и можно вполне использовать для интерфейса к БД, но я ещё хочу так же сделать в своей таблице + написать удобное сопряжение с реляционной моделью.

Цитата:
при переходе по строкам скролл-области в поле х отображаются значение какого либо текущего поля

Ну, такое делается схемой "таблица-уведомитель-интерактор поля". Но тут есть тонкий момент - если в уведомителе делать обновление интерактора через Dialog.Update, то может возникнуть бесконечный цикл "обновил-уведомление-обновил". Поэтому приходится использовать отложенное действие Services.Action.
Прикрепил скриншот, browse-item.png

Цитата:
Автоматически генерировать это когда при создании формы указываешь модуль? - впечатляет продуманность.

Нет-нет. Для случая простого справочника это будет выглядеть так:
- выбираем SQL-таблицу в БД,
- выбираем поля, которые будут видны в экранной таблице
- нажимаем кнопку "Сгенерировать".
Генератор сам определяет ключ SQL-таблицы, генерирует необходимые структуры данных, SQL-запросы SELECT, INSERT, UPDATE, DELETE, создаёт диалоговые формы, размещает контролы и привязывает их к интеракторам. Остаётся только откомпилировать и запустить.

Сейчас все эти действия у нас делаются обычным копипастом из модулей-шаблонов с последующей доводкой напильником :) Генератора ещё нет, потому что постепенно вырисовывается схема "объектная модель приложения + реляционная модель реализации", которую генерить куда интереснее.

Цитата:
Видел доки с большими примерами, пока не разбирался, но может оказаться что в них за деревьями леса не будет видно ))
Я тоже так раньше думал. Опыт показал, что в примерах заложено почти всё, что требуется.


Вложения:
Комментарий к файлу: Связка диалогов "browse + form"
browse-form.png
browse-form.png [ 23.5 КБ | Просмотров: 10174 ]
Комментарий к файлу: Запись + детальная информация
browse-item.png
browse-item.png [ 16.65 КБ | Просмотров: 10173 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 24 Декабрь, 2008 13:30 

Зарегистрирован: Понедельник, 22 Декабрь, 2008 09:45
Сообщения: 10
Откуда: Красноярск
Коллеги, есть ещё какие книги по работе с Базами Данных
кроме книги
Brett S. Hallett "Developing Programs with BlackBox Oberon" Книга посвящена разработке бизнес-приложений в среде BlackBox: создание пользовательских интерфейсов, работа с текстами, доступ к СУБД (на примере MySQL), генерация отчетов...

Чет не пойму как сделать форму (пока для отображения) состоящую из
одной скролл области связанной с одной таблицей БД
Требуется пример.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 24 Декабрь, 2008 14:12 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2933
Откуда: г. Ярославль
Pavel.Yakushev писал(а):
Чет не пойму как сделать форму (пока для отображения) состоящую из одной скролл области связанной с одной таблицей БД


1. Создаём модуль MyModule с интерактором table: StdTables.Table и компилируем.
2. Создаём пустую форму.
3. Кидаем на неё таблицу (Controls, Insert Table Control) и связываем её с интерактором MyModule.table.
4. Коннектимся к базе, посылаем ей SQL-запрос и получаем ответ в виде result: SqlDB.Table.
5. Инициализируем наш интерактор table, последовательно читаем result и заполняем ячейки таблицы-интерактора.
6. Делаем обновление контрола: Dialog.UpdateList(table)

Примерно так.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 29 Декабрь, 2008 13:02 

Зарегистрирован: Понедельник, 22 Декабрь, 2008 09:45
Сообщения: 10
Откуда: Красноярск
Иван Кузьмицкий, брось кусок кода по пункту 5.
Нужен пример инициализации и заполнения.
Не пойму что значит инициализировать интерактор table


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 29 Декабрь, 2008 22:49 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2933
Откуда: г. Ярославль
Приаттачил подсистему со всем необходимым. Скриншот прилагается. Для отработки примера, естественно, необходимо создать ODBC-соединение и подставить его параметры в процедуру Init.

А вот полный текст примера:
Код:
MODULE TestSql;

   IMPORT
      SqlDB, StdTables, Dialog, StdLog;

   TYPE
      (* структура для чтения результата запроса должна иметь экспортированные поля *)
      Rec = RECORD
         name*: ARRAY 50 OF CHAR
      END;
      
   VAR
      db: SqlDB.Database;  (* глобальный указатель на БД *)
      table*: StdTables.Table; (* интерактор для таблицы *)

   PROCEDURE Init (OUT d: SqlDB.Database; IN id, password, datasource: Dialog.String);
      VAR res: INTEGER;
   BEGIN
      SqlDB.OpenDatabase('SqlOdbc3', id, password, datasource, SqlDB.async, SqlDB.showErrors, d, res);
      IF d # NIL THEN
            (* Пример инициализации SQL-сеанса для сервера БД MySQL 5.0.xx *)
            d.Exec("SET NAMES 'cp1251'");
            d.Exec("SET CHARACTER SET cp1251");
            d.Exec("SET SQL_MODE='REAL_AS_FLOAT,PIPES_AS_CONCAT,IGNORE_SPACE'");
      END;
   END Init;

   (*Сервисная процедура*)
   PROCEDURE Query (db: SqlDB.Database; IN statement : ARRAY OF CHAR; OUT t: SqlDB.Table);
   BEGIN
      ASSERT(db#NIL, 21);
      t := db.NewTable();
      t.Exec(statement);
   END Query;
   
   PROCEDURE Do*;
      VAR rows, res : INTEGER; t: SqlDB.Table; i: INTEGER; rec: Rec;
   BEGIN
         IF db # NIL THEN
            Query(db, "SELECT name FROM ref_cities", t);
            (* Обработка результата запроса *)
            IF t.rows > 0 THEN
               table.SetSize(t.rows, 1); table.SetLabel(0, 'Город'); (* Инициализация интерактора *)
               FOR i := 0 TO t.rows-1 DO
                  t.Read(i, rec);
                  table.SetItem(i, 0, rec.name$)
               END;
               Dialog.Update(table)
            END
         END
   END Do;
BEGIN
   Init(db, 'user', 'password', 'odbcSource');
END TestSql.

"TestSql.Do; StdCmds.OpenAuxDialog('Test\Rsrc\Sql.odc', 'SQL')"


Вложения:
Sql.JPG
Sql.JPG [ 61.57 КБ | Просмотров: 10143 ]
Test.zip [2.29 КБ]
Скачиваний: 273
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 13 Июль, 2009 11:08 

Зарегистрирован: Среда, 14 Ноябрь, 2007 19:03
Сообщения: 1314
Надо чтоб в ячейки можно было вставлять вьюхи всякие,и линки?Кузьмицкий - спаси! :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 13 Июль, 2009 12:10 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2933
Откуда: г. Ярославль
В какие ячейки?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 13 Июль, 2009 14:54 

Зарегистрирован: Среда, 14 Ноябрь, 2007 19:03
Сообщения: 1314
Которые Dialog.String :D В StdTables. Я его поверхностно смотрел только,но чую ,что не вставить мне в ячейку таблицы View. :(


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 13 Июль, 2009 15:22 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2933
Откуда: г. Ярославль
Пожалуйте для обсуждения сюда: viewtopic.php?p=31816#p31816


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 14 Июль, 2009 11:19 

Зарегистрирован: Среда, 14 Ноябрь, 2007 19:03
Сообщения: 1314
Вот еще такой вопрос.Пусть у меня есть таблица, в ячейки которой я прописываю данные из результатов запроса.
В стобцах таблицы отображаються не все данные запроса.Но ,при двойном щелчке по строке таблицы вылезает документ с детальной информацией по каждой записи.Мне как лучше быть. Вытягивать заново детальные данные запросом к базе по ключу в процедуре вызова документа,или организовать ,скажем,массив записей, в которые заранее зафигачить всю нужную информацию?

Ага :lol: Вот есть тема:
Цитата:
Привязка контрола не к интерактору, а к экземпляру?
:lol:
Я вам хочу сказать,что это неприятная засада,хотя и решаемая вроде


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 14 Июль, 2009 13:10 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2933
Откуда: г. Ярославль
У меня по дабл-клику, делается запрос к базе на детализацию. Так удобнее, ведь детали могут занимать значительный объём.

Привязка контрола к экземпляру работает, но проблема заставить сработать уведомитель.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 14 Июль, 2009 14:20 

Зарегистрирован: Среда, 14 Ноябрь, 2007 19:03
Сообщения: 1314
Я и так и так порпробовал.Однакож,неприятная история. :(


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB