На первое время сделал следующим образом:

В таблице справочнике кроме полей id и name добавил bg (задний фон) и fg (передний фон).

При обновлении основной таблицы читаю "стили" и прохожусь по строкам:

procedure f_Main_tgItems_OnChange (Sender: string);
var i, rows : integer;
    Results: TDataSet;
begin
    SQLQuery('select id,bg,fg from dic_doctype order by id', Results);
    f_Main.tgItems.BeginUpdate;
    rows := f_Main.tgItems.RowCount-1;
    for i:= 0 to rows do
        begin
            if f_Main.tgItems.Cell[2,i].asInteger >0 then
            begin
                if Results.Locate('id',f_Main.tgItems.Cell[2,i].asInteger,0) then
                begin
                    if Results.Fields[1].Value <> NULL then f_Main.tgItems.Cell[2,i].Color :=  Results.Fields[1].asInteger;
                    if Results.Fields[2].Value <> NULL then f_Main.tgItems.Cell[2,i].TextColor :=  Results.Fields[2].asInteger;
                end;
            end;
        end;
    f_Main.tgItems.EndUpdate;
end;

Получается довольно быстро,если "мерять" скорость с помощью MilliSecondsBetween, то раскраска двух столбцов в таблице из 10000 строк у меня занимает около 1 секунды. Но минимум половину времени занимает locate,так что ищу более забавные методы.

Добрый день!

Подскажите пожалуйста, есть ли возможность в скрипте сделать свой тип?
Мне необходимо хранить три значения и обращаться к ним по индексу.номер_значения или что-то вроде.
К сожалению компилятор ругается на type ff=record , на любые попытки объявить свой класс, и даже на array of array.
Пытался использовать tlist и туда запихнуть массив, но это не вышло так как злобная машина ругается и на ^array..

Что тут разрешено?

Добрый день!

Подскажите пожалуйста, как лучше реализовать следующую схему:

На главной форме есть таблица, некоторые ячейки берут свои значения из связанных таблиц (словари), и некоторым из этих значений нужно помимо содержимого еще и настроить цвет фона\текста, причем эти настройки также нужно хранить в бд.

Пока что у меня две мысли:

1) Просто добавить цвета в таблицу словаря, и подтягивать их в виде дополнительных столбцов в тейблгрид. далее на Onchange скрывать эти столбцы, брать из них значения и раскрашивать все что нужно. Это, конечно, самый простой метод, но меня расстраивает количество "лишней" информации. Получается что на 4 столбца с данными у меня будет 8 столбцов с цветами.

2) Загружать стили из словарей заранее в некоторую переменную и дальше уже применять исходя из номера столбца и содержимого ячейки. В этом случае я не могу найти типа данных, который бы мне подошел. То есть например у меня есть строка и два цвета к ней - фона и текста. Есть ли какое-то key-value хранилище кроме tsringlist с его values?

Как будет лучше? Может кто-то уже делал что-то подобное? Спасибо.

Дмитрий, это интересно но скорее как отдельный продукт smile Мне кажется, что пользователи выбравшие изначально путь "нативного" приложения имели на это свои виды.

1) Сворачивание в трей и возможность собственного меню для него.
2) Деревья. Без них возможность очень-очень ограничены. Пусть это будет просто как справочник id,parent_id,name - этого уже хватит почти на все что можно (а если еще и поддержка иконок из коллекции - вообще улет)
3) Собственные иконки для кнопок.
4) Такой элемент на форме как сплиттер - чтобы можно было менять размеры панелей в реальном времени.
5) Встроенную форму "редактор словарей" для таблиц вида id-name, делать для десятков таблиц отдельно очень утомляет
6) Чисто для редактора форм - возможность экспортировать\импортировать настройки полей в гриде (тоесть список полей, название столбцов, вид "итога". Часто при добавлении нового поля в таблицу приходится менять это дело в 10 местах (на разных кнопках поиска и т.д.)

Еще вопрос по теме - а можно ли как-либо задать собственную функцию компаратор для сортировки?

Вопрос растет отсюда - у меня есть поле (строка) с неким буквенно-цифровым номером. И выглядит родным алгоритмом примерно так:

107
109
11
110
112

Что не очень устраивает.

Добрый день!

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

Как это можно сделать? С Table.columns.add у меня не получилось.

Спасибо!

Разобрался почему не работало сложение в скрипте - оказывается преобразование строки в число с запятой чувствительно к системной настройке "разделителя дробной части".
У меня в числе была точка, а ей подавай запятую. На разных машинах может быть по-разному, так что для уверенности, если у кого будет похожая ошибка, можно делать так:

function StrToFloatSep(s: string):extended;
var res:string;
begin
  if DecimalSeparator<>'.' then
     res:=ReplaceStr(s, '.', DecimalSeparator);
  if DecimalSeparator<>',' then
     res:=ReplaceStr(s, ',', DecimalSeparator);
  result:= strtofloat(res);
end;
DriveSoft wrote:

попробуйте такое вычисляемое поле:

(
   select printf("%.2f",sum(cost)) from s_history where (s_history.id_numbers = t_history.id_numbers) and (date(s_history.sd) >= date(t_history.sd)) and (date(s_history.ed) <= date(t_history.ed))
)

+

(
 select printf("%.2f",sum(cost)) from p_history where (p_history.id_t_history = t_history.id)
)

Дмитрий, это работать скорее всего будет, но, к сожалению, мне нужны именно все три значения - одно, второе и сумма. выборка для каждого из значений итак немаленькая, и считать одно и то-же просто для того чтобы сложить мне кажется ужасным расточительством...

Понял, спасибо!

Добрый день!

У меня в таблице есть два вычисляемых поля:

total_s:  (некая сумма денег)

(
   select printf("%.2f",sum(cost)) from s_history where (s_history.id_numbers = t_history.id_numbers) and (date(s_history.sd) >= date(t_history.sd)) and (date(s_history.ed) <= date(t_history.ed))
)

и total_p: (еще сумма денег)

(
 select printf("%.2f",sum(cost)) from p_history where (p_history.id_t_history = t_history.id)
)

Я хочу еще одно, total = total_s + total_p
Но если просто так и написать в новом вычесляемом поле то вылетает ошибка что "total_s" не найдено.

Решил сделать "проще" и посчитать это дело прямо при выводе в таблицу,
добавил ненужный столбец и пытаюсь его заполнить:

procedure numStat_TableGrid1_OnChange (Sender: string);
var
   i,c: integer;
begin
     c := numStat.TableGrid1.RowCount - 1;
     for i := 0 to c do
     begin
         numStat.TableGrid1.Cells[7,i] :=  FloatToStr(strtofloat(numStat.TableGrid1.Cells[5,i]) + strtofloat(numStat.TableGrid1.Cells[6,i]));
     end;
end;

Что тоже не работает, заявляя, например: " '189.08' is not a valid floating point value." Я вот хоть убей не понимаю, почему оно нот вэлид smile

Подскажите пожалуйста, куда крутить?

Добрый день!

Подскажите пожалуйста, можно ли после вызова формы редактирования по нажатию кнопки "сохранить запись" (или скриптом) добавить не одну а несколько одинаковых записей со значениями полей из формы?

Спасибо!

Добрый день!

Столкнулся со следующей проблемой - редактор форм работает с ужасными тормозами, например:
Я щелкаю по элементу на форме (любому).
Около 2-х секунд ничего не происходит.
И только потом на элементе появляются квадратные маркеры изменения размера и становится доступным редактирование свойств. Очень раздражает.

Причем перемещать контролы по форме можно начинать сразу, не дожидаясь "подгрузки" (кроме грида - он всеравно лагает).

От конкретного проекта это не зависит, одинаково и на примерах и на моих.

С чем это может быть связано?
Версия 1.52 , система win7 64pro,i5 2.8, 8gb. Ничего другое не тормозит, загрузка незначительная.

0) Документацию по доступным в скриптах командам\компонентам!  Пусть даже просто списком, без описания! Таймеры, меню и прочее оказывается есть и могут быть созданы из кода, но узнать об этом можно только если основательно прошерстить форум.

1) TreeView ! Без него очень многое остается только в мечтах
2) Возможность подключаться к внешнему sql серверу
3) Хорошо бы иметь встроенную форму редактор справочников, слева список справа таблица. Они всеравно большей частью имеют только поля идентификатора и имя, но строить тучу форм на 10 или 20 таких таблиц очень занудно.

15

(9 replies, posted in Russian)

DriveSoft wrote:

Dreada
Скачайте пожалуйста еще раз, скорей всего я уже исправил эту ошибку, дайте знать результат
http://myvisualdatabase.com/download/myvisualdb.exe

Помогло, спасибо большое!

16

(9 replies, posted in Russian)

Обновился до новой версии, проект открылся, чтение из базы работает отлично. А вот при создании новых записей проблема вылезает - Access Violation. Но не везде, закономерность отловить не удалось. Как можно более точно продиагностировать ?

17

(8 replies, posted in Russian)

Нашел в форуме про Itemindex и doonchange - все заработало! Жалко что документация не сразу обновляется smile

18

(8 replies, posted in Russian)

DriveSoft wrote:

Dreada
Забыл, что подзапрос в вычисляемом поле необходимо брать в скобках

(SELECT person.name FROM person WHERE person.id = id_person1)

узнать код последнего запроса к сожалению пока нельзя.

Заработало как часы, спасибо огромное!

Подскажите еще, пожалуйста, как можно реализовать подобную штуку:

На форме есть грид, который используется для задания связанного поля по словарю.
Все работает, все красиво.

Но хотелось бы отображать данные в гриде с определенным фильтром - добавил комбобокс для информации от фильтра к нему кнопочку с поиском через sql, связал из как "инкремент" - все опять-таки здорово.

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

Спасибо!

19

(8 replies, posted in Russian)

DriveSoft wrote:
Dreada wrote:

Остается вопрос про две ссылки на одну таблицу - пока никак не могу разобраться...

чтобы можно было второе поле вывести в TableGrid, необходимо в таблице базы данных создать вычисляемое поле, которое и будет содержать значение второй ссылки.


пример

SELECT person.name FROM person WHERE person.id = id_person1

Попробовал -
"near select: syntax error" sad

есть ли какой-нибудь способ узнать код последнего запроса?

20

(8 replies, posted in Russian)

И еще - как исключить поле из условия Where в запросе если, например установлен определенный флаг?
Тоесть есть комбобокс с выбором значения, а еще нужно предусмотреть вариант "любой" для поля настраиваемого этим комбобоксом.

21

(8 replies, posted in Russian)

Чучкин Евгений wrote:

В файле settings.ini который в папке с Вашей базой
в режиме редактирования в конце после
[DisableUpperCase]
добавляете

ТаблицаюСтрока=
примерно так
organ.name=
Proj.name=

Спасибо, с этим разобрался!
С деревьями тоже уже все ясно.
Про универсальный редактор тоже понятно, через скрипты с sql.

Остается вопрос про две ссылки на одну таблицу - пока никак не могу разобраться...

22

(8 replies, posted in Russian)

Здравствуйте!

Спасибо за такую простую и полезную программу, я очень доволен что наконец-то нашел достаточно простой инструмент для работы с бд!
Сейчас потихоньку делаю первые шаги, и у меня возникло следующее затруднение:

Есть таблица-справочник с одним полем name типа ТЕКСТ.
Есть грид для её просмотра и форма с полем ввода для редактирования.
Само по себе все работает но есть такой нюанс - если ввести текст с несколькими заглавными буквами, например "Кольцо С Букашкой", то после сохранения оно приобретает вид "Кольцо с букашкой", что выглядит красиво, но не применимо для фамилий, например. Я пробовал  в скрипте выставить для инпута свойство CharCase (единственное что нашел), но не помогло.

Имеется также вопрос можно ли вручную добавлять данные в выпадающий список (из скрипта а не из бд), и можно ли менять привязку кнопочек к таблицам из скрипта? У меня просто планируется тьма таблиц-справочников, и хотелось бы сделать единый интерфейс для работы с ними, а то для каждого делать окошки редактирования (хотя даже имена полей одни и те-же) как-то не комильфо.

И еще вопрос - насколько я понимаю, деревья совсем-совсем не поддерживаются?

Спасибо!


upd: Еще вопрос - у меня в одной и той-же таблице есть несколько связей с другой таблицей. (например связь со списком людей, и нужно указать сразу двух - исполнителя и поручителя, например) Как в таком случае вывести данные в грид для обоих полей?