Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Delphi7-Скопировать запись из одного набора данных в другой.  [new]
Grigoriy
Guest
Опишу задачу:
Из нескольких xls файлов я записываю в сводный (общий) массив данные. В результате получаю 15-25 тысяч записей по 12 полей каждая.
Потом из этого массива заполняю Ttable (сделать напрямую не получается, надо следить, чтобы буквы не попали в числовые поля и т.д.) результат в dbGrid1
По данному TTable делаю запрос (нечто вроде SELECT * FROM ' +BaseName+' WHERE UPPER(Name) like UPPER('''+Edit1.Text)+'%'')
Результат запроса Query1 виден в dbGrid2.
Теперь проблема: Пользователь щелкает по записи в dbGrid2 (или нажимает insert) и указанная им запись переходит в третий набор данных Ttable2.
Но я так и не нашел, как:
а) создать Ttable2 по образу и подобию Ttable1, только пустую (Assign не работает почему-то)
б) переносить не AppendRecord из-за которого приходится описывать все поля, а целиком всю запись.
в) каким-нибудь образом отмечать скопированную запись в dbGrid2. Что-нибудь вроде checkbox рядом или * на fixedcolumns
27 фев 04, 16:56    [555222]     Ответить | Цитировать Сообщить модератору
 Re: Delphi7-Скопировать запись из одного набора данных в другой.  [new]
HolyGun
Member

Откуда:
Сообщений: 89
Если второй грид именно DB, то на что-то он должен быть завернут? На что?
27 фев 04, 17:17    [555300]     Ответить | Цитировать Сообщить модератору
 Re: Delphi7-Скопировать запись из одного набора данных в другой.  [new]
Grigoriy
Guest
В смысле "завернут"?
Ttable1->DBGrid1
Query1->DBGrid2
Ttable2->DBGrid3
27 фев 04, 21:39    [555643]     Ответить | Цитировать Сообщить модератору
 Re: Delphi7-Скопировать запись из одного набора данных в другой.  [new]
Luchkin Dmitry
Member

Откуда: Новосибирск -> Ангарск
Сообщений: 1919
2Grigoriy: ассигном очень порадовал
примитивно так:
создаёшь, если ещё не создал таблицу идентичной структуры (пожалуй autoinc не надо поля делать, превратить их в инт)

var Table2 : TTable;
begin
Table2:= dbCreateLikeThis('table2.db', Table1, True, True);
//см приложение

table2.Append;
for nl:= 0 to table2.fieldCount-1 do table2.Fields[nl].AsString:= table1.Fields[nl].AsString;
table2.Post.

Приложение:
function dbCreateLikeThis(cNewFileName : string; Table : TTable; lClearIndexes, lNoAutoInc : Boolean) : TTable;
var
nl : integer;
begin
Result:= TTable.Create(Table.Owner);
with Result do begin
DatabaseName:= Table.DatabaseName;
TableName:= Table.TableName;
IndexDefs.Clear;
if not lClearIndexes then IndexDefs.Update;
if not lNoAutoInc then FieldDefs.Update else begin
Table.FieldDefs.Update;
with FieldDefs do begin
Clear;
for nl:= 0 to Table.FieldDefs.Count - 1 do with Table.FieldDefs.Items[nl] do
if DataType = ftAutoInc then Add(Name, ftInteger, Size, Required)
else Add(Name, DataType, Size, Required);
end
end;
TableName:= cNewFileName;
TableType:= Table.TableType;
CreateTable;
end;
end;
27 фев 04, 22:04    [555650]     Ответить | Цитировать Сообщить модератору
 Re: Delphi7-Скопировать запись из одного набора данных в другой.  [new]
Grigoriy
Guest
Нет, а что с Ассайном не так? Структура же наверняка где-то в памяти лежит? Почему бы ее не скопировать? Или я не так понимаю вопрос?
Таблицу номер два я создаю по аналогии с первой - вручную, каждое поле, задавая свойства и т.д.
А данные переношу так:
  Table1.AppendRecord([

DBGrid1.datasource.dataset.FieldbyName('Name').Value,
DBGrid1.datasource.dataset.FieldbyName('Price').Value,
DBGrid1.datasource.dataset.FieldbyName('Code').Value,
DBGrid1.datasource.dataset.FieldbyName('Producer').Value,
DBGrid1.datasource.dataset.FieldbyName('Supplier').Value,
DBGrid1.datasource.dataset.FieldbyName('ProdQuant').Value
]);

Хотя думаю о BatchMove для создания и структуры и переноса данных
Странно, что нельзя
28 фев 04, 23:40    [556032]     Ответить | Цитировать Сообщить модератору
 Re: Delphi7-Скопировать запись из одного набора данных в другой.  [new]
Grigoriy
Guest
Вобщем BatchMove выручил
Инфа с этого сайта плюс немного экспериментов - и я создаю таблицу сразу и без проблем.
ИМХО это лучше, чем в лоб. Изящней, по крайней мере...
29 фев 04, 14:55    [556240]     Ответить | Цитировать Сообщить модератору
 Re: Delphi7-Скопировать запись из одного набора данных в другой.  [new]
Miktor
Member

Откуда: г. Хабаровск
Сообщений: 388
На мой взгляд лучше проблему решить несколько другим путем:
1. на 3 грид повесить TQuery.
2. его св-во SQL формировать динамически примерно так:
'SELECT * FROM Table1 WHERE [Ключевое поле] IN ('+WhereStr+'-1)';
где WhereStr - свойство или переменная, которая заполняется при нажатии пользователем на 2 гриде. Что-то типа: WhereStr := WhereStr + Query1.FieldByName('Ключевое поле').AsString+', ';
после чего переоткрываем Query2.
3. Когда пользователь закончил отбирать нужные ему строки, отсылаем одним запросом все это безобразие в новую таблицу тем же самым запросом:
'SELECT * INTO [ИмяТаблицы] FROM Table1 WHERE [Ключевое поле] IN ('+WhereStr+'-1)';
и... ExecSQL;
ИМХО так будет изящней и правильней.
29 фев 04, 15:41    [556258]     Ответить | Цитировать Сообщить модератору
 Re: Delphi7-Скопировать запись из одного набора данных в другой.  [new]
Grigoriy
Guest
Надо подумать, я пока не вижу преимуществ этого способа...
Но есть другая проблема. И судя по всему не только у меня...
С запросом SQL - функция UPPER работает нормально... если не стоит буква "я"
т.е. по Upper (''юни%'') я найду и "Юни" и "юни"
А вот по Upper (''яни%'') я найду только "яни"
Как так и что можно сделать?
29 фев 04, 19:36    [556327]     Ответить | Цитировать Сообщить модератору
 Re: Delphi7-Скопировать запись из одного набора данных в другой.  [new]
Andriy Tysh
Member

Откуда: Ukraine
Сообщений: 298
Я бы вместо TTable использовал TClientDataSet. А у него есть очень полезная вещь - CloneCursor(). Я когда разобрался с ним, очень обрадовался. Получаеш полноценную копию датасета, а если перед этим поставить хорошенький фильтр, то и выборочка из датасета получится.
1 мар 04, 14:37    [557436]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить
 
Лучший учебный центр Microsoft!
Новейшие курсы Microsoft SQL Server 2014!
Статус Academy Oracle. Очень привлекательные цены на курсы Oracle!
Отсрочка платежа или скидка 5% на комплексные программы!