Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оцените пожалуйста код, запись данных из StrigGrid в Table 
:(
    Опции темы
Chechaco
Дата 28.10.2005, 06:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 6.10.2005
Где: из Канска

Репутация: 1
Всего: 1



Здравствуйте все, написал код который переносит данные из StringGrid в деталь-таблицу Table2, в соответствии с записями в мастер-таблице Query1. Оцените пожалуйста, имеет ли сие творение право на жизнь. У меня все это работает, но насколько это будет надежно в будущем не знаю.

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
Query1.Last;
Query1.First;
Table2.First;
for SGRow := 0 to Query1.RecordCount - 1 do
begin
if StringGrid1.Cells[1, SGRow+1] <> '' then // Записываем в Napil, если значение в СтрингГриде не пустое
begin
Table2.Edit;
Table2.FieldByName('Obyem').AsString := StringGrid1.Cells[1, SGRow+1];
Table2.FieldByName('NapilDate').AsDateTime := DateTimePicker1.Date;
Table2.Post;
end
else begin  //Если в СтрингГрид пусто, а в таблице есть значение то удаляем из таблицы
if not Table2.FieldByName('Obyem').IsNull then
Table2.Delete;
end;
Table2.Next;
Query1.Next;
end;
end;


PM MAIL   Вверх
<Spawn>
Дата 31.10.2005, 05:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 2
Всего: 64



Имхо, неудачный код - стоит задуматься о еге переделке smile. Смотри - у тебя в начале стоит Query1.Last. Ты представляешь какие будут тормоза на клиенте, если данный НД будет содержать ну хотя бы 10 - 50 т. записей?
Далее, свойство RecordCount не желательно использовать, т.к. если ты перейдешь на клиент-серверную СУРБД, то оно вряд ли будет работать...
Далее, зачем ты используешь StringGrid, когда есть DBGrid?


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Chechaco
Дата 31.10.2005, 07:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 6.10.2005
Где: из Канска

Репутация: 1
Всего: 1



Query1.Last я действительно приписал ни к селу ни к городу. Данная кверя (мастер) будет содержать не более 20 записей.
Клиент-серверной моя база никогда не будет, специфика не та.
StringGrid я использую чтобы видеть все записи деталь-таблицы соответствующие записям мастер-таблицы на определенную дату (каждой записи мастер-таблицы соответствует только одна запись деталь таблицы на определенную дату). Если использовать DBGrid то я могу видеть только одну запись в деталь-таблице - ту, которой соответствует запись в мастер-таблице на которой находится курсор.
Я хотел использовать две Query (мастер-детали) но не знаю как связать их через Query.
PM MAIL   Вверх
YurikGL
Дата 31.10.2005, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 5.7.2005
Где: Уфа

Репутация: нет
Всего: 2



Цитата
StringGrid я использую чтобы видеть все записи деталь-таблицы соответствующие записям мастер-таблицы на определенную дату (каждой записи мастер-таблицы соответствует только одна запись деталь таблицы на определенную дату). Если использовать DBGrid то я могу видеть только одну запись в деталь-таблице - ту, которой соответствует запись в мастер-таблице на которой находится курсор.
Я хотел использовать две Query (мастер-детали) но не знаю как связать их через Query.


Долго читал.... плохо понял что надо, но подозреваю, что нужно что-то вроде такого:

Есть некая таблица со, скажем, приходами (query1). У каждого прихода есть много позицей (вторая таблица query2). Таким образом есть два грида и при движении по первому (т.е. по приходам) нужно во второй таблице показывать только позиции данного прихода. Если моя догадка верна, то делается это так:

query1.text:='select * from приходы' //это понятно - выбираем все приходы

к query1 подцеплен datasource1. У datasource1 в событии OnDataChange прописываем примерно следующий код

query2.close
query2.text:='select * from ПозицииПриходов where ПозицииПриходов.idПрихода='+query1.fieldbyName('idПрихода').asString
query2.open

Разумеется, к query2 должен быть привязан datasource2 к которому зацеплен грид.

В этом случае, при движени по гриду с приходами (он завязан на query1) будет выполняться событие datasource1.onDataChange и данные в query2 будут меняться динамически автоматически.

А стринг-грид для этих целей абсолютно не подходит...


--------------------
 
PM MAIL WWW ICQ   Вверх
Chechaco
Дата 1.11.2005, 05:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 6.10.2005
Где: из Канска

Репутация: 1
Всего: 1



Честно говоря я когда потом прочитал, тоже плохо понял что хотел сказать smile
А нужно мне как раз обратное. У меня есть таблица с размерами (Query1) Каждому размеру соответсвует много позиций (вторая таблица, у меня Table2) Пока все сходится, как и у YurkGL, но тут сходство заканчивается.

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

Query1 Table2
Размеры Дата | Объем
---------- ---------------|-----------
25х100 27.10.2005 | 0,265
25х125 27.10.2005 | 5,236
25х150 27.10.2005 | 8,167
25х175 |
25х200 |
25х225 27.10.2005 | 4,236
50х100 27.10.2005 | 1,141

Поэтому я и делал Table2 в СтрингГриде, чтобы видеть все позиции, не зависимо от положения курсора в Query1.


PM MAIL   Вверх
bas
Дата 1.11.2005, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 14.8.2002
Где: Молдова, Кишинев

Репутация: 1
Всего: 2



Цитата(Chechaco @ 1.11.2005, 05:06)
Мне нужно чтобы при движении по таблице с размерами я видел позиции не только для данного размера, а все позиции для всех размеров на какую-либо дату

Так создай запрос и повесь его на AfterScroll.
PM MAIL   Вверх
Chechaco
Дата 1.11.2005, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 6.10.2005
Где: из Канска

Репутация: 1
Всего: 1



Цитата
Так создай запрос и повесь его на AfterScroll.


Так пробовал, объединял в одном запросе 2 таблицы, в этом случае записи не редактируются, только просмотр...
PM MAIL   Вверх
bas
Дата 1.11.2005, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 14.8.2002
Где: Молдова, Кишинев

Репутация: 1
Всего: 2



А запросы по умолчанию только для чтения .
Посмотри на компонент UpdateSql .
PM MAIL   Вверх
Chechaco
Дата 1.11.2005, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 6.10.2005
Где: из Канска

Репутация: 1
Всего: 1



UpdateSQL пробовал, все равно не сохраняет, просто не все запросы (в частности объединенные таблицы) могут редактироваться, насколько я знаю. Видимо придется работать с Table, тем более что база будет локальная.
PM MAIL   Вверх
YurikGL
Дата 1.11.2005, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 5.7.2005
Где: Уфа

Репутация: нет
Всего: 2



Цитата
Т.е. для каждого размера существует много позиций, но на каждый день недели позиция может быть только одна.

Давай определимся, на каждый день недели (понедельник, вторник) или каждый день вообще?

Если на каждый день недели, заранее создаются записи на все возможные сочетания, просто в поле позиции ставишь пусто. Таким образом в гриде будет твоя пустая ячейка.

Теперь, при движении по Table1 тебе нужно просто выставлять курсор на запись в Table2, которая соответсвует размеру (который выбран в Table1) и сегодняшнему дню недели? Дык пропиши в datasource1.onDataChange код типа Table2.locate (здесь локейтишь по двум полям) или lookup (не помню точно).

--------------------
 
PM MAIL WWW ICQ   Вверх
Chechaco
Дата 2.11.2005, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 6.10.2005
Где: из Канска

Репутация: 1
Всего: 1



Цитата
на каждый день недели (понедельник, вторник) или каждый день вообще?

На каждый день вообще, т.е. 1.10.2005 и т.д.

Цитата
Теперь, при движении по Table1 тебе нужно просто выставлять курсор на запись в Table2, которая соответсвует размеру (который выбран в Table1) и сегодняшнему дню недели?


Да, мне нужно выставлять курсор в Table1 (Размеры) на тот размер, который соответствует ячейке в Table2, причем выставлять перемещаясь по Table2 (т.е. переместился на ячейку вниз и в Table1 курсор тоже перемещается на ячейку вниз). А день недели должен браться из DateTimePicker.

Написал следующее:
Код

procedure TForm1.DataSource2DataChange(Sender: TObject; Field: TField);
begin
Query1.Locate('Tolshina','50',[loCaseInsensitive]);
Table1.FieldByName('NapilDate').AsDateTime := DateTimePicker1.Date;
end;


В этом случае у меня курсор уже при загрузке устанавливается на запись со значением 50 и никуда не двигается.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

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


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1233 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.