Страница 1 из 1

Все основные данные В ОДНОМ ПОЛЕ

Добавлено: 25 ноя 2008, 12:21
Solo
Здравствуйте. Разработчик отказался сопровождать свой проект. База полисов ОСАГО. На FoxPro. Велено переписать. Решил на FB, на самом родном.
Залез в таблицы, там все по-хитрому.
Главная таблица (я ожидал, что там будет за сотню полей) - ведь в форме заполнения полиса их чуть не столько :shock:
Оказалось, что там 10 полей.

Код: Выделить всё

Field          Type          FieldSize          Decimal
FORM          C              6                       0
ID_REC        N              6                       0
ID_FIELD     C             16                       0
VTYPE         C              1                        0
N                N              18                      4
D                D               8                       0
T                T               8                      0
L                C               10                     0
ENABLED     N               1                      0
C               C               254                    0
ID_REC - понятно. Одно число объединяет записи, относящиеся к одному полису. В поле ID_FIELD хранятся названия полей. То-есть, ожидаемые мной имена столбцов хранятся в одном столбце... :roll:
Type - тип, раз уж все в куче. N, D, T, L - очевидно поля, где хранятся сами данные. В N - цифры, в D и T - дата и время полиса или чего там еще. В последнем поле - все остальное. И "Иванов", и "Иван", и "Иванович", и "Волга-Газ-24", и "Республика Калмыкия", и "легковой автомобиль"
Вопрос: как они все это вытаскивают во вполне человеческий вид на клиенте. В гриде. И главное - как это все отразить в полях ввода? Ведь я привык просматривать и редактировать 1 запись. А тут штук 100 - и все в одной куче.

Re: Все основные данные В ОДНОМ ПОЛЕ

Добавлено: 25 ноя 2008, 13:46
WildSery
Например, читаем как есть и уже клиент распихивает в CDS.
Не пойму, в чём беда-то? Ты хочешь один-в-один всё перенести?

Re: Все основные данные В ОДНОМ ПОЛЕ

Добавлено: 25 ноя 2008, 14:17
Solo
Ну, снаружи клиент желательно чтобы был максимально похож, иначе пользователи скажут, что раньше вверху окошечко было, а теперь внизу. Что такое CDS - я не знаю.
Я не пойму - вот несколько полей ввода на форме. Все они отображают значения полей одной записи
А тут много записей. Какой должен быть SELECT, INSERT и т.п. Или что, последовательно для каждого TDBEdit запрос повторять? Типа для фамилии

Код: Выделить всё

SELECT C FROM MYTABLE WHERE ID_REC = 365 AND ID_FIELD = 'FAM'?
Так их куча же, этих полей!!! Или цикл устраивать? Хм... Можно присвоить компонентам те же имена, что и ID_FIELD, и обходить последовательно все компоненты на форме, подставляя их в один и тот же запрос как параметры?

Re: Все основные данные В ОДНОМ ПОЛЕ

Добавлено: 25 ноя 2008, 14:22
kdv
Какой должен быть SELECT, INSERT и т.п. Или что, последовательно для каждого TDBEdit запрос повторять?
именно. похоже, ты не въезжаешь в использованную модель хранения данных.
кстати, тут дбедиты вообще не в кассу.

Re: Все основные данные В ОДНОМ ПОЛЕ

Добавлено: 25 ноя 2008, 14:52
Solo
kdv писал(а):
Какой должен быть SELECT, INSERT и т.п. Или что, последовательно для каждого TDBEdit запрос повторять?
именно. похоже, ты не въезжаешь в использованную модель хранения данных.
кстати, тут дбедиты вообще не в кассу.
Потому и спрашиваю. Понятно, простые TEditы, я оговорился. Ну хотя бы где можно про это почитать? У меня есть книга Хелен Борри, но что-то там я этого не нашел...
Если последовательно селектить сотню значений, да не с локальной машины, не приведет ли это к долгому заполнению
формы? Насколько оправдан такой подход? Может, проще действительно много полей сделать?

Re: Все основные данные В ОДНОМ ПОЛЕ

Добавлено: 25 ноя 2008, 15:54
kdv
это объектная модель. описания есть тут:
http://www.ibase.ru/develop.htm в разделе "древовидные", можешь начать с ООП в РСУБД.

собственно, ты привел структуру центральной таблицы с описанием метаданных.
Данные, как видно, все строковые, и хранятся в одной таблице типа
id_rec, id_field, data

один запрос выбирает одну "запись", в виде пачки записей со строками data. Эта "запись" уже показывается как обычная запись в форме.
набор записей вывести "автоматически "в грид" - это то же самое, только побольше работы, и надо чтобы данные как-то были отсортированы по записям.
вообще нафиг такая схема тут - не знаю, возможно "записи" могут иметь плавающий формат, т.е. разный набор столбцов. Это надо смотреть в базе и знать предметную область (ОСАГО?).
Может быть, у оригинального разработчика просто был какой-то инструмент клепания ПО на этой модели данных. Насколько я в курсе, по той же модели сделана 1С версии 8.

Re: Все основные данные В ОДНОМ ПОЛЕ

Добавлено: 25 ноя 2008, 15:59
WildSery
Наверное как-то так:

Код: Выделить всё

while not q.Eof do
begin
  NextControl := Form1.FindChildControl(q.FieldByName('ID_FIELD').AsString);
  if Assigned(NextControl) then
    if NextControl is TEdit then
      TEdit(NextControl).Text := q.FieldByName('C').AsString;
  q.Next;
end;
Это только намёк, конечно.

Re: Все основные данные В ОДНОМ ПОЛЕ

Добавлено: 25 ноя 2008, 16:01
WildSery
kdv писал(а):Насколько я в курсе, по той же модели сделана 1С версии 8.
В каком месте?

Re: Все основные данные В ОДНОМ ПОЛЕ

Добавлено: 25 ноя 2008, 16:31
Solo
kdv писал(а):это объектная модель. описания есть тут:
http://www.ibase.ru/develop.htm в разделе "древовидные", можешь начать с ООП в РСУБД.

собственно, ты привел структуру центральной таблицы с описанием метаданных.
Данные, как видно, все строковые, и хранятся в одной таблице типа
id_rec, id_field, data

один запрос выбирает одну "запись", в виде пачки записей со строками data. Эта "запись" уже показывается как обычная запись в форме.
набор записей вывести "автоматически "в грид" - это то же самое, только побольше работы, и надо чтобы данные как-то были отсортированы по записям.
вообще нафиг такая схема тут - не знаю, возможно "записи" могут иметь плавающий формат, т.е. разный набор столбцов. Это надо смотреть в базе и знать предметную область (ОСАГО?).
Может быть, у оригинального разработчика просто был какой-то инструмент клепания ПО на этой модели данных. Насколько я в курсе, по той же модели сделана 1С версии 8.
По порядку: данные не все строковые. Строковые хранятся в поле C - в последнем, размер 254. Дата хранится в поле D, время - в поле T, числа в N. В шахматном порядке... На деревянную базу это не похоже, я с дерева начинал осваивать FB, то-есть тут не растерялся бы. Да и иерархии нет. Причем количество строк для каждого случая одинаковое. Даже если это юрлицо, там все равно есть в поле ID_FIELD строки P_FAM, P_IM, P_OT (имя, фамилия, отчество). Только не заполненные #-o там где данные должны быть
Статью почитаю. В общем-то я весь сайт прочитал, когда начинал. Но не проникся, видимо :^o

Re: Все основные данные В ОДНОМ ПОЛЕ

Добавлено: 25 ноя 2008, 16:42
Solo
В общем, так:
ID_REC ID_FIELD VTYPE N D T L C
365 S_FAM C Иванов
365 S_IM C Сергей
365 S_BORN D 12.02.1970
365 S_SUM N 120.32
365...

Блин, не получается выровнять. В общем, дата рождения - в столбце D, деньги - в столбце по имени N (и типы их тоже соответствующие). Ну а строки - все, и люди, и адреса, и номера машин - в столбце C
Матрица...

Re: Все основные данные В ОДНОМ ПОЛЕ

Добавлено: 25 ноя 2008, 17:14
WildSery
Solo писал(а):В общем, дата рождения - в столбце D, деньги - в столбце по имени N (и типы их тоже соответствующие).
Что, даже этого не умеешь? :shock:

Код: Выделить всё

  if Assigned(NextControl) then
    case q.FieldByName('ID_FIELD').AsString of
      'D': if NextControl is TDateEdit then
             TDateEdit(NextControl).Date := q.FieldByName('D').AsDateTime;
      'N': if NextControl is TRxCalcEdit then
             TRxCalcEdit(NextControl).Value := q.FieldByName('N').AsDouble;
      else if NextControl is TEdit then
            TEdit(NextControl).Text := q.FieldByName('C').AsString;
    end;
Сдаётся мне, что тебе не на этот форум, а в программирование.

Re: Все основные данные В ОДНОМ ПОЛЕ

Добавлено: 25 ноя 2008, 20:16
kdv
По порядку: данные не все строковые. Строковые хранятся в поле C - в последнем, размер 254. Дата хранится в поле D, время - в поле T, числа в N.
ну не в строках, а вот таким экзотическим способом. не легче.
На деревянную базу это не похоже
речь не про деревья, или хранение объектов, а вообще про организацию хранения произвольных структур. Это как раз и есть такая модель. "Запись" можно обозвать объектом. Деревья - ввести, ибо структура легко позволяет.
Считай имеющуюся у тебя базу самым простым вариантом "объектного хранилища".

Re: Все основные данные В ОДНОМ ПОЛЕ

Добавлено: 26 ноя 2008, 08:53
Solo
2KDV:Да, спасибо. Нашел кое-что на эту тему. Просто я действительно с этим не сталкивался раньше.

2WildSery
Что, даже этого не умеешь? :shock:
Код: Выделить всё
if Assigned(NextControl) then
case q.FieldByName('ID_FIELD').AsString of
'D': if NextControl is TDateEdit then
TDateEdit(NextControl).Date := q.FieldByName('D').AsDateTime;
'N': if NextControl is TRxCalcEdit then
TRxCalcEdit(NextControl).Value := q.FieldByName('N').AsDouble;
else if NextControl is TEdit then
TEdit(NextControl).Text := q.FieldByName('C').AsString;
end;
Что-то Python 2.5.2 не принимает твой пример :( Может, оттого, что первая строка по-русски

Re: Все основные данные В ОДНОМ ПОЛЕ

Добавлено: 26 ноя 2008, 11:20
kdv
Что-то Python 2.5.2 не принимает твой пример
??? этот пример на дельфях. у меня появляются нехорошие подозрения...

Re: Все основные данные В ОДНОМ ПОЛЕ

Добавлено: 26 ноя 2008, 11:37
WildSery
Solo писал(а):Что-то Python 2.5.2 не принимает твой пример :( Может, оттого, что первая строка по-русски
Он и не будет работать. И не потому, что он на Дельфи, а потому, что он не полный, и только показывает примерный алгоритм, как бы я обрабатывал список контролов.
(На самом деле, я бы их вообще динамически создавал, пожалуй, и дополнительной суперфункцией форматировал их красиво на форме)
На питоне же такие вещи вообще "на раз" делаются. Я не изучаю питон пока, но видел его возможности. Куда проще чем на Дельфях.

Re: Все основные данные В ОДНОМ ПОЛЕ

Добавлено: 26 ноя 2008, 12:11
Dimitry Sibiryakov
Что-то я не пойму: старый разработчик что, исходников не оставил? FoxPro, конечно, та ещё зверушка, но всё-же не rocket science, как сказал бы Джим... В Дельфи код можно переносить практически один-к-одному.

Re: Все основные данные В ОДНОМ ПОЛЕ

Добавлено: 26 ноя 2008, 12:19
Solo
Это шутка была. В ответ на "даже этого не можешь". Я ж сказал, что русскую строчку не пропускает.
Могу я этого, могу. И компоненты динамически, и универсальную форму на разные структуры таблиц с определением типа, и нормализацию забитых вручную адресов по КЛАДРу (процент попадания около 80) при помощи регулярных выражений и хранимых процедур. Осталось только Delphi от Pythonа по коду научиться отличать.
Просто у меня вовсе не программистское образование, и поэтому знания не систематизированные, а now and then

2Dmitry Sibiryakov
Да нет конечно. Это ж фирма по прог. продуктам. Это же их хлеб. У себя на сайте держат наш баннер как партнеры, а сами хамят по телефону. Но прога прилично сделанная, даже подсказки на gdi+ прорисовывают с градиентами да стрелочками.

Re: Все основные данные В ОДНОМ ПОЛЕ

Добавлено: 26 ноя 2008, 14:07
WildSery
Solo писал(а):даже подсказки на gdi+ прорисовывают с градиентами да стрелочками.
Вот оно что, Петрович... Теперь это показатель приличности проги :mrgreen:

Re: Все основные данные В ОДНОМ ПОЛЕ

Добавлено: 26 ноя 2008, 15:40
Solo
WildSery писал(а):
Solo писал(а):даже подсказки на gdi+ прорисовывают с градиентами да стрелочками.
Вот оно что, Петрович... Теперь это показатель приличности проги :mrgreen:
Подсказки не хинты, а контекстные объяснения по ходу заполнения. Там очень много условностей.
Ну... могу добавить дружественный интерфейс, логичность ожидания действий пользователя, не раздражающую цветовую гамму, взаимодействие с главной корпоративной базой... Но вот логику базы никак не мог просечь. Сейчас читаю вот про объектный подход.
А что, надо было, чтобы она с шелла управлялась?

Re: Все основные данные В ОДНОМ ПОЛЕ

Добавлено: 26 ноя 2008, 20:16
Dimitry Sibiryakov
Solo писал(а):Да нет конечно. Это ж фирма по прог. продуктам. Это же их хлеб.
Я - тоже фирма по прог.продуктам, но мне одиночного заказчика проще скинуть вместе с исходниками. Типа, "вот вам ваше дерьмо, наслаждайтесь и забудьте мой телефон".

Помнится, в моё время для фокса были декомпиляторы...