Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-68063
Nik8.
2003-07-06 00:27
2003.07.21
Вопрос 2


6-67954
BJValentine
2003-05-14 17:51
2003.07.21
Стандартная компонента NMSMTP


1-67908
iXuSs
2003-07-08 14:57
2003.07.21
Открыть все модули проекта.


7-68082
dim-
2003-05-08 12:04
2003.07.21
Сканеры с автоподачей


3-67663
Senator
2003-06-26 10:03
2003.07.21
IBX





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский