Форум: "Базы";
Текущий архив: 2003.07.21;
Скачать: [xml.tar.bz2];
ВнизРеструктурирование таблиц dBASE программным путем Найти похожие ветки
← →
SCORPION ZP (2003-06-24 11:43) [0]Добавление, изменение, удаление полей в таблице, создание и удаление таблиц программным путем - это нечто большее, чем работа с Database Desktop.
Для многих это уже давно пройденный этап и ничего сложного в этом нет. Но есть ещё люди для которых такая задача может оказаться впервой, а темы посвященной этому материалу в форуме нет.
Вот, например, новичку нужно реализовать след. вещи:
-удаление поля/ей в таблице;
-добавление поля/ей в таблице;
-перенос поля/ей из DBF1 в DBF2;
-объединение таблиц DBF1 с DBF2;
-создание таблиц.
← →
Соловьев (2003-06-24 11:49) [1]LocalSQL.hlp - искать Create table..., insert into table select...,
alter table ...
← →
Anatoly Podgoretsky (2003-06-24 11:51) [2]SCORPION ZP © (24.06.03 11:43)
Большинство к этму этапу и не преступали, в справке есть dbiDoRestructure - посмотри и поймешь о чем это я.
← →
Семен Сорокин (2003-06-24 11:55) [3]Реструктурирование таблиц dBASE программным путем
function RestructBase(aDB: TDatabase): boolean;
var
_i : integer;
_list : TStrings;
Props : CURProps;
hDb : hDBIDb;
tblDesc: CRTblDesc;
begin
Result := true;
aDB.CloseDataSets;
_list := tStringList.Create;
try
Session.GetTableNames(aDB.DatabaseName, "*.db", false, false, _list);
for _i := 0 to _list.Count - 1 do
with TTable.Create(nil) do
try
DatabaseName := aDB.DatabaseName;
TableType := ttParadox; // можно dBase
Exclusive := true;
TableName := _list[_i];
try
Open;
Check(DbiGetCursorProps(Handle, Props));
FillChar(tblDesc, SizeOf(tblDesc), 0);
Check(DbiGetObjFromObj(hDBIObj(Handle), objDATABASE, hDBIObj(hDb)));
StrPCopy(tblDesc.szTblName, _list[_i]);
StrPCopy(tblDesc.szTblType, Props.szTableType);
tblDesc.bPack := True;
Close;
DbiDoRestructure(hDb, 1, @tblDesc, nil, nil, nil, False);
except
on E: Exception do begin
MessageDlg("Ошибка перестроения:" + E.Message, mtError, [mbOk], 0);
Result := false
end
end
finally
Close;
Free
end
finally
_list.Free
end
end;
← →
SCORPION ZP (2003-06-24 12:09) [4]Вот такой короткий код, который не раб. с базой dbf, а ищёт db :
var FileName,sql : string;
...
if FileName = s[1] then
begin //"Executor.dbf"
sql:="ALTER TABLE Executor DROP COLUMN SUMKR";
Query1.sql.text:=sql;
Query1.ExecSQL;
end
...
Почему?
← →
Anatoly Podgoretsky (2003-06-24 12:17) [5]А почему он должен искать dbf, ты ему это сказал?
← →
SCORPION ZP (2003-06-24 12:27) [6]Anatoly Podgoretsky
> А почему он должен искать dbf, ты ему это сказал?
Когда я переделываю строку
sql:="ALTER TABLE Executor DROP COLUMN SUMKR";
на
sql:="ALTER TABLE Executor.dbf DROP COLUMN SUMKR";
то получаю ошибку вида:
Table does not exist. File or dir does not exist
..\dbf.DB
..\dbf.DBF
..\dbf.txt
..\dbf
← →
Соловьев (2003-06-24 12:31) [7]создай алиас(standart, dBase) и присвой его имя Query.Database!!!
← →
SCORPION ZP (2003-06-24 12:44) [8]Соловьев
> создай алиас(standart, dBase) и присвой его имя Query.Database!!!
Я алиасов не создаю. У меня 97 баз dBASE для реконструкции, причем в разных каталогах (по 8-10 шт. в каждом).Я ищу базу и если нашел, то присваиваю:
Table1.DatabaseName:=...
Table1.TableName:= ...
А Query1.DatabaseName:=Table1.DatabaseName;
← →
Соловьев (2003-06-24 12:57) [9]
> Я алиасов не создаю. У меня 97 баз dBASE для реконструкции,
> причем в разных каталогах (по 8-10 шт. в каждом).Я ищу базу
> и если нашел, то присваиваю:
> Table1.DatabaseName:=...
> Table1.TableName:= ...
> А Query1.DatabaseName:=Table1.DatabaseName;
бред....
посмотри в сторону Session + Database
← →
SCORPION ZP (2003-06-24 13:11) [10]Нашел две ошибки:
1. Перед реконструкцией я делал Table1.Open; - мне казалось, что
прежде чем что-то добавить или удалить из таблицы, то нужно её
открыть. Но это не относится к реконструкции таблицы (к удалению или добавлению полей)..
2.Строка
sql:="ALTER TABLE Executor.dbf DROP COLUMN SUMKR";
должна иметь вид
sql:="ALTER TABLE "Executor.dbf" DROP COLUMN SUMKR";
← →
SCORPION ZP (2003-06-24 15:34) [11]Можно ли записать короче след. код:
procedure TForm1.Button4Click(Sender: TObject);
var i:integer;
begin
with Table1 do
begin
Active := False;
DatabaseName := "d:\REPAIR\";
TableName := "KDSRV.DBF";
TableType := ttDBase;
with FieldDefs do
begin
Clear;
Add("KD_SRV", ftString, 1, False);
Add("NAM_SRV", ftString, 20, False);
end;
CreateTable;
//Free;
end;
if Table1.Exists then
begin
Table1.Open;
Table1.First;
for i:=1 to 6 do
begin
Table1.Append;
if i=1 then begin
Table1.FieldByName("KD_SRV").Value:="1";
Table1.FieldByName("NAM_SRV").Value:="механическое";
end;
if i=2 then begin
Table1.FieldByName("KD_SRV").Value:="2";
Table1.FieldByName("NAM_SRV").Value:="энергетическое";
end;
if i=3 then begin
Table1.FieldByName("KD_SRV").Value:="3";
Table1.FieldByName("NAM_SRV").Value:="железнодорожное";
end;
if i=4 then begin
Table1.FieldByName("KD_SRV").Value:="4";
Table1.FieldByName("NAM_SRV").Value:="строительное";
end;
if i=5 then begin
Table1.FieldByName("KD_SRV").Value:="5";
Table1.FieldByName("NAM_SRV").Value:="электрическое";
end;
if i=6 then begin
Table1.FieldByName("KD_SRV").Value:="6";
Table1.FieldByName("NAM_SRV").Value:="транспортное";
end;
Table1.Post;
Table1.Next;
end;
ShowMessage("База создана!");
end;
end;
← →
Семен Сорокин (2003-06-24 15:41) [12]const
MaxKd = 6;
_arr : array [1..MaxKd] of string = ("механическое", ...);
with Table1 do
if Exists then begin
Open;
for i := 1 to MaxKd do begin
Append;
FieldByName("KD_SRV").Value := IntToStr(i);
FieldByName("NAM_SRV").Value:= _arr[i];
Post
end
end
← →
SCORPION ZP (2003-06-24 17:47) [13]Семен Сорокин
Так оно лаконичнее!
← →
Соловьев (2003-06-24 17:56) [14]
> SCORPION ZP © (24.06.03 15:34)
так никто не делает!
> Семен Сорокин © (24.06.03 15:41)
sct правильно написал
← →
SCORPION ZP (2003-06-24 19:04) [15]Где ошибка:
sql:="CREATE TABLE "EQUIPMES.DBF"" +
"(NUM_ORDER CHAR(9),"+
"NUM_SUB CHAR(3),"+
"NAM_EQPMNT CHAR(120),"+
"KD_SHOP CHAR(5),"+
"PREC_EXP NUMERIC(16,2),"+
"PREC_DUR NUMERIC(3,0),"+
"SIGNATURE NUMERIC(3,0),"+
"CLAIM_SH LOGIGAL"+
"CLAIM_TC LOGIGAL"+
"DATE_STOP DATE"+
"LONG_KR NUMERIC(3,0),"+
"EXPENS_EXP NUMERIC(16,2),"+
"CATEGORY NUMERIC(1,0),"+
"DATE_CLAIM DATE"+
"KD_SRV CHAR(1),"+
"IS_SUB LOGIGAL"+
"IS_LAST LOGIGAL"+
"IS_MAIN LOGIGAL)";
Query1.sql.text:=sql;
Query1.ExecSQL;
Правильно ли я объявляю поля даты и логические?
← →
sniknik (2003-06-24 19:43) [16]> Где ошибка:
сдесь.
-> SCORPION ZP © (24.06.03 19:04)
вместо этого поста должно быть чтение по типам того движка который используеш. (предлагаеш догадатся? видимо я не понял и это ребус :-))
могу сказать например вместо LOGIGAL поставь BIT, но это пойдет для jet а ты как догадываюсь не его используеш.
обшее, делаеш запрос на создание таблици из 1-го поля, сработает добавляй еще одно в типе которого не уверен и т.д.
и запятые расставь. и еще посмотри потом на созданную таблицу в фоксе или еще чем, что у тебя на месте NUMERIC-ов будет.
← →
SCORPION ZP (2003-06-26 10:28) [17]sniknik
1.Запятые я пропустил. ВместоLOGIGAL
поставилBOOLEAN
, а вместоNUMERIC(x,y)
,
которые при любом раскладе получались какNUMERIC( 0, 0)
, поставилDECIMAL(x,y)
.
Последнее в Database Desktop выглядет какNUMERIC(x,y)
. Но почему при комбинации ALTER TABLE типа
sql:="ALTER TABLE "DOGOVOR.DBF" ADD FACT_SUM NUMERIC(16,2),ADD DAYPM NUMERIC(3,0)";
для получения типа Number с необходимой размерностью NUMERIC срабатывает, а в предложении CREATE TABLE - NUMERIC(x,y)
полю Number не задает размерности?
2. Если я создаю таблицу или поле, которые уже существуют с пом. Local SQL, то получаю соответственно ошибку выполнения, а если
это написать обычным кодом, то таблица просто пересоздаётся вместо бывшей. Конечно можно поставить проверку на существование такой-то таблицы(if not Table1.Exists then
) или такого-то поля в ней(тут я используюif Table1.FieldByName("FACT_SUM").IsNull then
и думаю, что это неверно), но при этом после ExecSQL выдается ошибка типа:"Table1: Feld "FACT_SUM" not found"- хотя поле в этом примере там есть.
3. Я бы не работал с SQL, если бы знал как задать в обычном коде
with FieldDefs do
begin //with FieldDefs
Clear;
Add("KD_SRV", ftString, 3, False);
Add("NAM_SLG", ftString, 13, False);
end; //with FieldDefs
например поле N(16,2) - т.е. Number с размером и точностью, а в FieldDefs.Add третий параметр задает только
размер...
4. Кто знает как обратиться к заголовку таблицы. Например мне нужно узнать установленную кодировку (29-й байт файла DBF) или проще это определять по значениям строковых полей?
← →
Sliften (2003-06-27 01:08) [18]Удалено модератором
Примечание: Задай свой вопрос в отдельной ветке
← →
SCORPION ZP (2003-06-27 09:34) [19]Каким образом можно вставить поля(новые или из др. базы) в уже существующую базу, но не в конец базы, а скажеь между 3 и 4 полем?
← →
mike-d (2003-06-27 10:16) [20]http://www.degisy.com/download.php?lang=rus
Degisy Db 1.0 - посмотри. там есть компонент для реструктуризации таблиц и индексов.
← →
SCORPION ZP (2003-06-27 11:08) [21]Все таблицы, которые я создаю в dBASE, состаят из полей Character, Number, Date и Logigal. Причём 90% это поля Number.
Так вот незадача практически для всех них нужно задавать точность
типа N(16,2)чего не удаётся сделать в строке(см. ниже). По умолчанию (если 0) получаю формат N(20,4), а как задать
нужный мне формат - ведь в Add("Number", ftBCD, 0,False);
третий параметр это Size и только...
...
with FieldDefs do
begin
Clear;
Add("Character", ftString, 13, False);
Add("Number", ftBCD, 0,False);
Add("Date", ftDate,0,False);
Add("Logigal", ftBoolean,0,False);
end;
...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.07.21;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.011 c