Как выбрать СУБД ?

Модератор: Модераторы

Сообщение Сергей Смирнов » 10.08.2007 10:27:49

debi12345 писал(а):Если создавать поля через "CREATЕ TABLE" - то их типы легко вытаскиваются через API DLL. Но тип определяется именно типом поля при создании таблицы, а не результатом выборки.
Это так, да, но, как минимум, кроме полей, полученных с помощью агрегатных функций. Соответственно, универсального решения не получится.
debi12345 писал(а):Чтобы это работало прозрачно с БД-компонентами, MSEgui делает следующее:
1) использует соглашения о точных названиях типов для "create table", чтобы потом, узнав типы через API, назначить им корректный "ft*" в FieldDefs; тип "boolean" также прекрасно работает;
2) имеет возможность явно переназначить тип поля в FiedDefs- что для табличного поля, что для произвольного выражения.
Я понимаю, что это единственный выход, но мне такая работа не нравится.
debi12345 писал(а):Это врядли скоро исправится. Потому что затык пошел на повальном использовыании Variant-типа и Variant-массивов из-за привязки к Дельфям. Lookup-поддержка - вообще необозримое будущее.
Возможно, но и без этого глюков хватает.

debi12345 писал(а):О, это повод для шуток Мартина.
Джуст упорствует в пресловутой Дельфи-совместимости до последней закорючки, причем и 20% не сделано по части копирования БД-фичей Дельфей. Мечтатель !
А серьезные баги для него Мартин находил и фиксил - но потом надоело патчей месяцами ждать, и форкнул.
Да, Мартин их там здорово расшевелил, но, похоже, весь пар ушел в свисток (в разборки с Мартином). Джуст, ИМХО, вообще тормоз тот ещё. Хотя, может быть, он просто занят и ему не до этих игрушек.
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Сообщение Attid » 10.08.2007 12:07:27

Буду танцевать с бубном теперь над firebird, надеюсь в интеренте есть хоть один пример с этой базой..

не надо над птичкой танцавать там все работает с пол оборота надо чтоб руки правельно расли и доку читать. примеры прям на форуме есть и в поставке с UIB.

а ничего Smile просто раньше никогда не занимался БД, и мне без разницы с чего начинать.

тогда тем более с птички. SQLite это не полноценая БД =) к ней придешь когда потрбуется что-то переносимое и маленькое, хотя птичка и так может.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение debi12345 » 10.08.2007 13:52:57

Это так, да, но, как минимум, кроме полей, полученных с помощью агрегатных функций. Соответственно, универсального решения не получится.
...
Я понимаю, что это единственный выход, но мне такая работа не нравится.

???
Пробежаться по FieldDefs и подправить не-обнаруженные типы ( константы, агрегаты, функции, выражения) - это трудно, если даже займет максимум 0.01% от всей работы ?
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение Сергей Смирнов » 10.08.2007 16:44:07

debi12345 писал(а):???
Пробежаться по FieldDefs и подправить не-обнаруженные типы ( константы, агрегаты, функции, выражения) - это трудно, если даже займет максимум 0.01% от всей работы ?
Не то, чтобы трудно... ну, может, у вас в MSEgui всё так красиво, а у нас в лазаре можно нарваться на какие-нибудь первобытные глюки, особенно при конвертации строка-дата-строка.
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Сообщение debi12345 » 10.08.2007 18:53:27

"Игрушечный" SQlite3 :

Код: Выделить всё
-------------------------
attach database '..\2007\data_ss.db' as dss;
attach database '..\2007\data_retail.db' as dretail;

select
ss_office_id,
ring,
office,
c.amount as amount_ss,
d.amount as amount_retail
from
(select
a.office_id as ss_office_id,
ring as ring,
ring_order,
name as office,
case
  when 8=1   then m01
  when 8=2   then m02
  when 8=3   then m03
  when 8=4   then m04
  when 8=5   then m05
  when 8=6   then m06
  when 8=7   then m07
  when 8=8   then m08
  when 8=9   then m09
  when 8=10 then m10
  when 8=11 then m11
  when 8=12 then m12
  else 0
end as amount
from
data_ss a,
ref_offices b
where
  (a.index_id = 1)
and
  (a.office_id = b.id)
) c,
(select
a.office_id as retail_office_id,
case
  when 8=1   then m01
  when 8=2   then m02
  when 8=3   then m03
  when 8=4   then m04
  when 8=5   then m05
  when 8=6   then m06
  when 8=7   then m07
  when 8=8   then m08
  when 8=9   then m09
  when 8=10 then m10
  when 8=11 then m11
  when 8=12 then m12
  else 0
end as amount
from
data_retail a,
ref_offices b
where
  (a.index_id = 1)
and
  (a.office_id = b.id)
) d
where
ss_office_id=retail_office_id
order by
ring,
ring_order
;

-------------------------
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение Attid » 10.08.2007 19:21:19

"Игрушечный" SQlite3 :

какой-то не понятный отрезок с обсолютно не рабочем коде взять хотябы

Код: Выделить всё
  when 8=6   then m06
  when 8=7   then m07
  when 8=8   then m08


:o
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение debi12345 » 10.08.2007 21:44:45

Это я отлаживал параметрический запрос :) Вместо "8" в оригингале - параметр. Просто лень было в доку заглядывать - на синтаксис команд PREPARE / EXECUTE.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 » 24.08.2007 10:58:41

Еще один пример "игрушечности" SQlite3 :

Код: Выделить всё
select
name,
a.id as ref_office_id,
data_ss_id,
ring_copied,
route_copied,
m01,m02,m03,m04,m05,m06,m07,m08,m09,m10,m11,m12
from
  v_offices a
left outer join (
  select
   id as data_ss_id,
   office_id,
   ring_copied,
   route_copied
  from
   data_ss
  where
   month_n=:MONTH_N and index_id=:INDEX_ID
) b on a.id=b.office_id
left outer join (
  select
   a01.office_id as sum_office_id,
   m01,m02,m03,m04,m05,m06,m07,m08,m09,m10,m11,m12
  from
   (select office_id,sum(amount) as m01 from data_ss where month_n=1  and index_id=:INDEX_ID group by office_id) a01,
   (select office_id,sum(amount) as m02 from data_ss where month_n=2  and index_id=:INDEX_ID group by office_id) a02,
   (select office_id,sum(amount) as m03 from data_ss where month_n=3  and index_id=:INDEX_ID group by office_id) a03,
   (select office_id,sum(amount) as m04 from data_ss where month_n=4  and index_id=:INDEX_ID group by office_id) a04,
   (select office_id,sum(amount) as m05 from data_ss where month_n=5  and index_id=:INDEX_ID group by office_id) a05,
   (select office_id,sum(amount) as m06 from data_ss where month_n=6  and index_id=:INDEX_ID group by office_id) a06,
   (select office_id,sum(amount) as m07 from data_ss where month_n=7  and index_id=:INDEX_ID group by office_id) a07,
   (select office_id,sum(amount) as m08 from data_ss where month_n=8  and index_id=:INDEX_ID group by office_id) a08,
   (select office_id,sum(amount) as m09 from data_ss where month_n=9  and index_id=:INDEX_ID group by office_id) a09,
   (select office_id,sum(amount) as m10 from data_ss where month_n=10 and index_id=:INDEX_ID group by office_id) a10,
   (select office_id,sum(amount) as m11 from data_ss where month_n=11 and index_id=:INDEX_ID group by office_id) a11,
   (select office_id,sum(amount) as m12 from data_ss where month_n=12 and index_id=:INDEX_ID group by office_id) a12
  where
   a01.office_id=a02.office_id and
   a02.office_id=a03.office_id and
   a03.office_id=a04.office_id and
   a04.office_id=a05.office_id and
   a05.office_id=a06.office_id and
   a06.office_id=a07.office_id and
   a07.office_id=a08.office_id and
   a08.office_id=a09.office_id and
   a09.office_id=a10.office_id and
   a10.office_id=a11.office_id and
   a11.office_id=a12.office_id
  ) d on a.id=d.sum_office_id
order by
name
;


Это параметрический запрос выполняется на "ура"
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение Attid » 24.08.2007 11:28:21

застрелится, либо не правельная проэктировка, либо дикая фантазия разбираться лень. но трехэтажные запросы для получения годового отчета изврат. насколько я понимаю это надо делать кросс отчетом на клиенте.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение debi12345 » 24.08.2007 13:18:49

Это не отчет, это для рабочей ( редактируемой ! ) таблицы :) То есть сами таблицы - человеческие, но свертка из них - сами видите. Это вынужденная переделка ДОС-программы ( на Клиппер ) - заказчик рогами уперся, чтобы выглядело так, как раньше. Хорошо, что только в одном месте. Даже отчеты и те проще.

А вообще - никаких проблем.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 » 24.08.2007 15:34:53

Исправленный и одновременно упрощенный вариант :

Код: Выделить всё
select
name,
a.id as ref_office_id,
data_ss_id,
ring_copied,
route_copied,
m01,m02,m03,m04,m05,m06,m07,m08,m09,m10,m11,m12
from
  v_offices a
left outer join (
  select
   id as data_ss_id,
   office_id,
   ring_copied,
   route_copied,
   case when month_n=1  then amount else null end as m01,
   case when month_n=2  then amount else null end as m02,
   case when month_n=3  then amount else null end as m03,
   case when month_n=4  then amount else null end as m04,
   case when month_n=5  then amount else null end as m05,
   case when month_n=6  then amount else null end as m06,
   case when month_n=7  then amount else null end as m07,
   case when month_n=8  then amount else null end as m08,
   case when month_n=9  then amount else null end as m09,
   case when month_n=10 then amount else null end as m10,
   case when month_n=11 then amount else null end as m11,
   case when month_n=12 then amount else null end as m12
  from
   data_ss
  where
   month_n=:MONTH_N and index_id=:INDEX_ID
) b on a.id=b.office_id
;
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение Attid » 24.08.2007 15:35:13

Код: Выделить всё
sum(amount)

это тоже редактируется в гриде ?
тогда снимаю шляпу.


ЗЫ соболезную. когда заказчик упирается в неправельное решение это грустно.
ЗЫЫ а не вы ли в какой-то ветке расказывали что у вас в стране прог расказывает как работать с программой, а не заказчик ? =)
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение Attid » 24.08.2007 15:36:09

а вот второй вариант мне нравится.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение debi12345 » 24.08.2007 21:33:38

ЗЫ соболезную. когда заказчик упирается в неправельное решение это грустно.
ЗЫЫ а не вы ли в какой-то ветке расказывали что у вас в стране прог расказывает как работать с программой, а не заказчик ? =)

А это не заказчик, а свои, родные. Которые работали с старой программой несколько лет и успели выработать вредные (или нет ?) привычки. Программа умерла из-за закодирования некоторой справочной информации прямо в бинарный код. Даже декомпилировав тот клипперовский исходник - оказалось, что проще самому написать, чем разбираться в чужих идеях.
А правильное решение (чтобы душа пела ) в той проге быть не может в ПРИНЦИПЕ (бывают и такие задачи, что неподдаются комплекной автоматизации, по крайней мере - силами одного человека )

Вообще, хорошие девчонки - для таких не жалко потрудиться.

Еще фишка - сверхскоростное писание, за 2..3 недели. А проект неслабый - сами видите. Только сейчас понимаю, как мне повезло, что 1) Мартин написал MSEgui 2) Мартин заинтересован в 1-ю очередь в БД-програмировании 3) выложил фрэймворк в Сеть 4) прилично знаю английский. Это позволило отойти от "портяночного" к многомерному (по Мартину - ортогональному) программированию.


ПС:

А редактировать "sum(amount)" - нет проблем, после приобретения некоторого опыта. Описываешь InsertSQL, UpdateSQL или OnApplyRecUpdate (MSEgui) - и в результате автоматом выполняется SQL, даже не имеющий ничего общего с кодом первичной выборки, затем обновляешь выборку (проблема быват "придумать ключ записи для правильного места обновления" - на крайнях выручает составной ).
Уже несколько проектов так сделал. Почему вас и критикую за работу с БД по типу "ExecSQL(команда)" - когда нужно отлаживать имеющиеся крайне удобные средства автоматизации этой рутины.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение Attid » 25.08.2007 22:31:08

Почему вас и критикую за работу с БД по типу "ExecSQL(команда)" - когда нужно отлаживать имеющиеся крайне удобные средства автоматизации этой рутины.

зато ExecSQL позволяеет более явно управлять транзакциями.
кстати в МСЕ есть разделение на пищущие и читающие транзакции в тойже птичке например ?
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Пред.След.

Вернуться в Базы данных

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

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

Рейтинг@Mail.ru