![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Интерфейс для создания документа
Slider007 © (2007-05-03 14:04:00)Ребята, скоро я вас запарю совсем (сам уже запарился - взялся за проект, на который опыта не совсем хватает .. ну надо же когда-то его зарабатывать ..).
Вопрос наверное скорее философский, но и от реальности не оторваный, скорее наоборот:
Пишу некое подобие торговой программы, которая естественно не обойдется без документов. Документ по сути один, даже не знаю как его обозвать, наверное ближе всего он к счет-фактуре. Но это не суть важно, на форме это хозяйство должно выглядеть стандартно - шапка и таблица(сетка) с товарами (наименование, количество, цена, стоимость).
Споткнулся я на заполнении сетки:
Справочник товаров готов, из него всё замечательно выбирается - http://www.delphimaster.ru/cgi-bin/forum.pl?id=1176961998&n=0(здесь я упорно выяснял как мне это правильно сделать, за это отдельное вам спасибо).
Ближе к делу:
Непосредственно заполнение сетки.
Посмотрел как внешне это у 1с реализовано, решил сделать подобно, типа выбрал товар из модальной формы, в сетке выставил нужное количество, цену, перешел к следующей строке ...
Начал думать, какой компонент в качестве сетки использовать:
1. DBGrid(Eh). Хотел сделать "живой запрос", но с наскоку не получилось, потому что в свойстве SelectSQL запрос забит вида
select g.ID, g.ARTICUL_ID, a.NAME, g.QUANTITY, g.PRICE
from goodies g inner join articuls a on (g.articul_id = a.id)
where g.doc_id = 1
order by g.id
(goodies - таблица с содержимым документа, articuls - справочник товаров; запрос черновой, но суть отображена впринципе)
и я так понял (ошибся ?) что из запроса из нескольких таблиц нельзя сделать живой вопрос ? Или всётаки можно?
Ну если получится живой запрос, то идея в общем-то проста - в гриде добавляются/редактируются строки, потом всё это в базу заливается (у ДатаСета Cached Updates включить).
2. Взглянул на ListView. Как-то он мне не понравился (может зря ?).
3. Посмотрел что там ещё из "сеток" есть. Увидел StringGrid. С ним впринципе можно, но это ж при редактировании самого грида геморою не оберешся, а потом ещё и засунуть его содержимое в базу несколько проблематично, хотя конечно решаемо. И если при создании нового документа ещё впринципе терпимо, то при последующем редактировании там ваще голову сломать можно - какие-то строки добавились, какие-то ваще удалились .. как отследить ? Единственный вариант - из базы вообще вытереть старую версию документа и заменить её новой из СтрингГрида. Но как-то всё не красиво в общем...
Даа, много написал. Обобщу:
1. Так чем наиболее оптимально будет воспользоваться в данной ситуации (имеется ввиду 3 пункта перечисленых).
2. Если всётаки выбрать DBGrid, то возможно в ситуации с моим запросом сделать из него "живой" ?
3. Традиционный вопрос ;) - может кроме перечисленных мной решений есть ещё что-то более лучшее (простите за каламбур) ?
4. Если светлые мысли проскользуни в моем опусе, тыкните пальцем плиз где конкретно, буду развивать :).
Sergey13 (2007-05-04 08:54:00) [1]> [15] Slider007 © (04.05.07 08:32)
Это я с утра еще не проснулся, сори. 8-)
Читал сразу несколько веток и не въехал.
Slider007 (2007-05-04 08:32:00) [2]Sergey13 © (04.05.07 8:27) [14]
А ты как сюда попал? 8-)
Не понял тебя ? Попал в эту ветку или в этот форум ?
Sergey13 (2007-05-04 08:27:00) [3]> [7] ANB © (03.05.07 18:39)
> Тормозят локапы. Особливо, если справочник не маленький
Это есть. Но я так предполагал, что у автора небольшая контора и справочник соответственный. 1-2 тысячи записей в справочнике тормозов вряд ли добавят.
> [8] Kostafey © (03.05.07 18:57)
> По-моему речь шла о сетке (DBGrid)
Это тебе лучше знать - о чем шла речь.
> [12] Slider007 © (04.05.07 06:40)
А ты как сюда попал? 8-)
Slider007 (2007-05-04 08:09:00) [4]Остановлюсь пожалуй, на варианте с редактированием строки документа в отдельном окне. Наиболее оптимальный вариант для меня сейчас - простенько и со вкусом, и тем более документы не емкие будут совсем - максимум по 2-3 позиции. В будущих проектах (дай бог чтоб они появлялись) может быть что-нибудь другое изобретать придется, но пока некогда - сроки поджимают :(.
Спасибо всем, прям не ожидал, что столько ответов будет, все предложения взяты на заметку :).
Slider007 (2007-05-04 06:40:00) [5]Ребята, извиняюсь, что не указал СУБД. Использую FireBird 1.5.3, и компоненты IBX, в частности IBDataset.
Asail (2007-05-04 00:50:00) [6]
> Имеется в виду InterBase ?
Имеется в виду TClientDataSet. Тип БД значения не имеет.
Kostafey (2007-05-03 20:47:00) [7]> А чего ClientDataSet не использовать?
Имеется в виду InterBase ?
Asail (2007-05-03 19:33:00) [8]А чего ClientDataSet не использовать? Загнал в него все данные хоть из 100 таблиц и пусть себе юзверь в гриде извращается... А потом по кнопке "сохранить" раскидать по таблицам обратно (одной транзакцией ес-но). ИМХО самый удобный способ для редактируемого грида - короткие транзакции и все такое...
Kostafey (2007-05-03 18:57:00) [9]> Во первых фильтровать по ним можно
Замечание принято. Фильтровать можно, просто это не удобно.
> Во вторых нафиг по ним сортировка в твоем "документе"?
По-моему речь шла о сетке (DBGrid)
> В третьих - это не призывы, а мое личное мнение на этот
> счет - не нравится не юзай.
Да я ничего не оспариваю, просто пытаюсь найти некоторое универсальное решение,
чтобы и были все возможности и чтобы они удобно реализовывались.
Пока я такого решения не нашел...
ANB (2007-05-03 18:39:00) [10]
> Sergey13 © (03.05.07 16:16) [6]
Тормозят локапы. Особливо, если справочник не маленький - поиск то фуллсканом, хоть и в памяти.
Делаю их только, если нужно редактировать в гриде. И если справочник небольшой - иначе все равно неудобно будет.
Sergey13 (2007-05-03 16:16:00) [11]> [5] Kostafey © (03.05.07 16:06)
Во первых фильтровать по ним можно. Во вторых нафиг по ним сортировка в твоем "документе"? В третьих - это не призывы, а мое личное мнение на этот счет - не нравится не юзай.
Kostafey (2007-05-03 16:06:00) [12]Занятно, опять звучат призывы использовать LookUp- поля.
В то же время ведь по ним нельзя проводить сортировку/фильтрацию записей.
Если эти возможности не нужны, то хорошо, а если нужны?
Остается только SQL.
Sergey13 (2007-05-03 15:26:00) [13]> [0] Slider007 © (03.05.07 14:04)
> 2. Если всётаки выбрать DBGrid, то возможно в ситуации с
> моим запросом сделать из него "живой" ?
Это все равно, что зеркало оживить. 8-)
Нет в гриде данных, они в датасете (кстати что за БД и какие компоненты???? ну блин постоянно!!!!), который и должен быть живым. Для его оживления в нем предусмотрены не только SelectSQL, но и нечто вроде ModifySQL и другие.
На мой вкус, если работать со справочником товаров, то удобно его, этот справочник иметь на клиенте полностью и постоянно открытым (разумеется если он достаточно стабильный, а не постоянно пополняемый), и юзать данные из него не в запросах, а через лукап поля.
ANB (2007-05-03 15:23:00) [14]
> 1. DBGrid(Eh). Хотел сделать "живой запрос", но с наскоку
> не получилось, потому что в свойстве SelectSQL запрос забит
> вида
"Живой" запрос далеко не всегда кушает джойны. Как правило, для полноценного редактирования в гриде приходиться оставлять в запросе одну таблицу а наименования товаров подтаскивать из справочника как локаповое поле. Получается довольно громоздко и неудобно.
Есть более простое решение :
Запрос - только на чтение. Редактировать - через отдельную форму, в базу изменения вносить тоже запросами. А для визуализации изменений - рефрешить содержимое документа. Если в документ не будут вбиваться по 100 тыщ строк - то будет довольно шустро и удобно. Кстати, запросы на изменение очень удобно заменить вызовом хранимок.
Есно, стандартные делфовые Edit; ... Post; работать не будут.
Desdechado (2007-05-03 15:23:00) [15]Зачем живой? CachedUpdates для чего придумали? А на кнопку сохранения можешь повесить код рассовывания по нужным таблицам.
Kostafey (2007-05-03 15:11:00) [16]> 1. DBGrid(Eh). Хотел сделать "живой запрос", но с наскоку
> не получилось, потому что в свойстве SelectSQL запрос забит
> вида
В свойстве какого компонента ?
> 1. DBGrid(Eh). Хотел сделать "живой запрос", но с наскоку не получилось,
В наборе данных вводим необходимый запрос, из него и заполняем DBGrid(Eh).
Что тут такого ?
> Ну если получится живой запрос, то идея в общем-то проста
> - в гриде добавляются/редактируются строки, потом всё это
> в базу заливается (у ДатаСета Cached Updates включить).
Можно вообще отказаться от редактирования в сетке, а редактирование делать только
в специальной форме.
> 2. Взглянул на ListView. Как-то он мне не понравился (может
> зря ?).
> 3. Посмотрел что там ещё из "сеток" есть. Увидел StringGrid.
А чем не нравятся компоненты для работы с базой данных TDBxxx ?