Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Оцените пожалуйста код


Автор: Chechaco 28.10.2005, 06:47
Здравствуйте все, написал код который переносит данные из 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;


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

Автор: Chechaco 31.10.2005, 07:01
Query1.Last я действительно приписал ни к селу ни к городу. Данная кверя (мастер) будет содержать не более 20 записей.
Клиент-серверной моя база никогда не будет, специфика не та.
StringGrid я использую чтобы видеть все записи деталь-таблицы соответствующие записям мастер-таблицы на определенную дату (каждой записи мастер-таблицы соответствует только одна запись деталь таблицы на определенную дату). Если использовать DBGrid то я могу видеть только одну запись в деталь-таблице - ту, которой соответствует запись в мастер-таблице на которой находится курсор.
Я хотел использовать две Query (мастер-детали) но не знаю как связать их через Query.

Автор: YurikGL 31.10.2005, 19:11
Цитата
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 будут меняться динамически автоматически.

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


Автор: Chechaco 1.11.2005, 05:06
Честно говоря я когда потом прочитал, тоже плохо понял что хотел сказать 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.


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

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

Автор: Chechaco 1.11.2005, 11:25
Цитата
Так создай запрос и повесь его на AfterScroll.


Так пробовал, объединял в одном запросе 2 таблицы, в этом случае записи не редактируются, только просмотр...

Автор: bas 1.11.2005, 13:30
А запросы по умолчанию только для чтения .
Посмотри на компонент UpdateSql .

Автор: Chechaco 1.11.2005, 18:06
UpdateSQL пробовал, все равно не сохраняет, просто не все запросы (в частности объединенные таблицы) могут редактироваться, насколько я знаю. Видимо придется работать с Table, тем более что база будет локальная.

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

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

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

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

Автор: Chechaco 2.11.2005, 10:38
Цитата
на каждый день недели (понедельник, вторник) или каждый день вообще?

На каждый день вообще, т.е. 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 и никуда не двигается.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)