![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как из Table с вычисляемыми полями сделать новую таблицу? [D6, dBase, FoxPro]
Zn © (2003-04-04 10:09:00)Работаю с dbf. Есть таблица Table1 с несколькими вычисляемыми полями. Данные нужно сохранить в виде физической таблицы. Я создал Table2, в которой в FieldsDefs описаны все поля, такие же как и в Table1. Потом делаю Table2.CreateTable и Table2.BatchMove(Table1, batCopy). Table2.CreateTable таблицу создаёт, а Table2.BatchMove выдаёт ошибку "Invalid record structure" и удаляет физическую таблицу (Table2.TableName).
В чём ошибка? Или такая задача решается как-то по-другому?
Zn (2003-04-04 15:51:00) [1]
> Соловьев © (04.04.03 15:41)
В том-то вся и беда, что для вычисляемого поля я использую свои функции, которые находятся в модулях. Если бы было что-то типа field2+100, то и вопросов бы не было. Придётся, видимо, использовать
Соловьев © (04.04.03 11:31)
with Table1 do
begin
if not Active then Open;
First;
while not Eof do
begin
Table2.Insert;
Table2.FieldByName("???").AsString := FieldByName("???").AsString;
...
Table2.Post;
Next;
end;//while
end;//with
Спасибо за консультацию!
Соловьев (2003-04-04 15:41:00) [2]
select field1, field2+100 as calc from table
calc и будет вычисляемое.
Zn (2003-04-04 15:37:00) [3]
> они должны быть физически...
Это размышление или указание к действию? Если второе, прошу объяснить.
Все поля (вычисляемые в том числе) у меня созданы в Fields Editor, в Гриде они видны. Что ещё нужно?
Соловьев (2003-04-04 15:20:00) [4]
> TQuery - аналогично! Не находит вычисляемых полей
они должны быть физически...
Mike Kouzmine (2003-04-04 15:15:00) [5]Вообще-то с парадоксом (попробовать сейчас недосуг), если не изменяет память, проходило.
Zn (2003-04-04 15:10:00) [6]Фиг вам! Попробовал через TQuery - аналогично! Не находит вычисляемых полей. А может это от того, что работаю с dbf? Paradox-овские таблицы Delphi понимает лучше.
Zn (2003-04-04 14:00:00) [7]
> MsGuns © (04.04.03 13:48)
Я ж о чём и говорю: раз TTable потомок TDataSet, думал, что и TBatchMove будет с ним работать. Но раз TQuery, пусть будет TQuery. Просто нигде не написано, что с TTable не получится.
MsGuns (2003-04-04 13:48:00) [8]>Zn (04.04.03 13:43)
>Я-то думал, что TTable - это тоже НД.
И TTable, и TQuery, и TClientDataSet, и TStordProc, и TADOTable, и TIBQuery и еще очень много разных цацек - все они происходят от одного "папы" - TDataSet`а, который предназначен для ПРЕДОСТАВЛЕНИЯ ПРИЛОЖЕНИЮ (КЛИЕНТУ) НАБОРА ЗАПИСЕЙ, называемого еще курсором. Вот он-то и "обзывется" НАБОРОМ ДАННЫХ или НД
Zn (2003-04-04 13:43:00) [9]Я-то думал, что TTable - это тоже НД.
MsGuns (2003-04-04 13:29:00) [10]>Соловьев © (04.04.03 13:16)
А кто вообще говорил о ХП ? Я имел в виду следующее:
Есть таблица 1
1. Кол-во
2. Цена
Надо вывести в таблицу 2
1. Кол-во
2. Цена
3. Сумма
Если таблицу 1 юзать TTable`ом, а поле суммы создавать Calc`ом, то бачмув захавает только 2 первых.
Если написать запрос
SELECT *, CUST(<Кол-во>*<Сумма> as DECIMAL(8.2)) as SUMMA
FROM <Таблица 1>
то вот тут-то бачмув и захавает все 3 поля в Таблицу 2
Соловьев (2003-04-04 13:16:00) [11]
> котором вычисляемые "виртуальные" (отсутствующие в физ.таблице)
>
данная СУБД не поддерживает ХП. А алгоритм, в принцыпе, можно разбить на несколько Query...
MsGuns (2003-04-04 13:13:00) [12]>Zn (04.04.03 13:07)
Обращение идет не к физ.таблице, а к набору данных. Вместо TTable надо использовать в качестве исходного НД TQuery, в котором вычисляемые "виртуальные" (отсутствующие в физ.таблице) поля будет представлены весьма реально и бачмув их вполне "съест", не поперхнувшись ;))
Zn (2003-04-04 13:07:00) [13]
> Mike Kouzmine © (04.04.03 13:02)
Составил. На вычисляемом поле пишет Field "Calc" not found. Убираю его - остальные поля переносит. Т.е. обращение идёт к физической таблице, а не к НД (насколько я понял).
Mike Kouzmine (2003-04-04 13:02:00) [14]А map составил?
Zn (2003-04-04 12:41:00) [15]
> MsGuns © (04.04.03 11:45)
Попробовал, но только вычисляемых полей TBatchMove не скопировал. Выдаёт на них ошибку, что такого поля не существует. Без вычисляемых всё нормально. Нужно установить какое-то свойство?
Zn (2003-04-04 12:02:00) [16]
> MsGuns © (04.04.03 11:45)
Вот насчёт компонента TBatchMove - это интересно! Спасибо!
Сейчас полажу по Help"у!
MsGuns (2003-04-04 11:45:00) [17]Для получения новой таблицы из уже существующей, в которой есть вычисляемые поля, лучше работать так.
Из таблицы-образца получить запросом НД, в котором уже подсчитаны все Calc-поля.
C помощью компонента (но не метода) TBatchMove с Mode=batCopy из этого "полноценного" НД создать таблицу с нужным именем.
Если нужны индексы,ключи, реструктурировать полученную таблицу SQL запросами (DDL-ALTER).
В любом случае твой способ - "грубая работа" (попытка определить структуру несуществующей таблицы в Design-Mode)
ИМХО, проект обречен на частые катаклизмы при малейшей модификации структур БД
Zn (2003-04-04 11:41:00) [18]Да, наверное так и сделаю. Благодарю за подсказку.
Соловьев (2003-04-04 11:31:00) [19]
with Table1 do
begin
if not Active then Open;
First;
while not Eof do
begin
Table2.Insert;
Table2.FieldByName("???").AsString := FieldByName("???").AsString;
...
Table2.Post;
Next;
end;//while
end;//with
и не парь себе мозни с BatchMove или разберись с ним почитай хелп.
Zn (2003-04-04 11:25:00) [20]Вот такое описание. Всё вроде как положено, имена и типы совпадают (вроде):
object Penia: TTable
Active = True
OnCalcFields = PeniaCalcFields
DatabaseName = "Tax"
Filter = "VID>="#39"280"#39" and VID<="#39"282"#39
Filtered = True
StoreDefs = True
TableName = "PENIA"
TableType = ttFoxPro
Left = 8
Top = 72
object Peniakod: TStringField
DisplayWidth = 12
FieldName = "kod"
Required = True
FixedChar = True
Size = 10
end
object Peniavb: TStringField
DisplayWidth = 3
FieldName = "vb"
Required = True
FixedChar = True
Size = 2
end
object Peniard: TStringField
DisplayWidth = 5
FieldName = "rd"
Required = True
FixedChar = True
Size = 4
end
object Peniapg: TStringField
DisplayWidth = 3
FieldName = "pg"
Required = True
FixedChar = True
Size = 2
end
object Peniast: TStringField
DisplayWidth = 3
FieldName = "st"
Required = True
FixedChar = True
Size = 2
end
object PeniaNedoim: TFloatField
DisplayWidth = 15
FieldKind = fkCalculated
FieldName = "Nedoim"
DisplayFormat = "### ### ### ##0.00"
currency = True
Precision = 2
Calculated = True
end
object Peniazn: TFloatField
DisplayWidth = 15
FieldName = "zn"
Required = True
DisplayFormat = "### ### ### ##0.00"
currency = True
Precision = 2
end
object Peniadateup: TDateField
DisplayWidth = 12
FieldName = "dateup"
Required = True
end
object Peniavid: TStringField
DisplayWidth = 4
FieldName = "vid"
Required = True
FixedChar = True
Size = 3
end
end
object PeniaStruct: TTable
OnCalcFields = PeniaCalcFields
Filtered = True
FieldDefs = <
item
Name = "Kod"
DataType = ftString
Size = 10
end
item
Name = "Vb"
DataType = ftString
Size = 2
end
item
Name = "Rd"
DataType = ftString
Size = 4
end
item
Name = "Pg"
DataType = ftString
Size = 2
end
item
Name = "St"
DataType = ftString
Size = 2
end
item
Name = "Nedoim"
DataType = ftFloat
Precision = 2
end
item
Name = "Zn"
DataType = ftFloat
Precision = 2
end
item
Name = "Dateup"
DataType = ftDate
end
item
Name = "Vid"
DataType = ftString
Size = 3
end>
StoreDefs = True
TableName = "PENIA1"
TableType = ttFoxPro
Left = 8
Top = 112
object StringField1: TStringField
DisplayWidth = 12
FieldName = "kod"
Required = True
FixedChar = True
Size = 10
end
object StringField2: TStringField
DisplayWidth = 3
FieldName = "vb"
Required = True
FixedChar = True
Size = 2
end
object StringField3: TStringField
DisplayWidth = 5
FieldName = "rd"
Required = True
FixedChar = True
Size = 4
end
object StringField4: TStringField
DisplayWidth = 3
FieldName = "pg"
Required = True
FixedChar = True
Size = 2
end
object StringField5: TStringField
DisplayWidth = 3
FieldName = "st"
Required = True
FixedChar = True
Size = 2
end
object FloatField1: TFloatField
DisplayWidth = 15
FieldKind = fkCalculated
FieldName = "Nedoim"
DisplayFormat = "### ### ### ##0.00"
currency = True
Precision = 2
Calculated = True
end
object FloatField2: TFloatField
DisplayWidth = 15
FieldName = "zn"
Required = True
DisplayFormat = "### ### ### ##0.00"
currency = True
Precision = 2
end
object DateField1: TDateField
DisplayWidth = 12
FieldName = "dateup"
Required = True
end
object StringField6: TStringField
DisplayWidth = 4
FieldName = "vid"
Required = True
FixedChar = True
Size = 3
end
end
end