Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.02.27;
Скачать: [xml.tar.bz2];

Вниз

Работа со связанными таблицами Paradox   Найти похожие ветки 

 
Eugene_   (2003-02-08 21:21) [0]

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


 
kerkonst   (2003-02-08 21:25) [1]

А чуть-чуть подробнее можно ?

Таблица Master или Detail или как... .


 
Eugene_   (2003-02-08 21:34) [2]

Не получается добавить в detail. Пишет, что неправильный ключ ... :-((


 
Pat   (2003-02-08 22:24) [3]

>Eugene_ © (08.02.03 21:34)
Возможно не устанавливаешь поля, по которым идет связь?


 
mike-d   (2003-02-08 22:52) [4]

опять игры в угадайку. пришли хоть кусок кода...

> Pat © (08.02.03 22:24)
> Возможно не устанавливаешь поля, по которым идет связь?
они должны автоматом ставиться если мастер-детайл


 
Eugene_   (2003-02-09 08:32) [5]

Вот так не работает.

MainForm.TaraTable.Append;
MainForm.TaraTable.FieldValues["Name"]:=Edit1.Text;
MainForm.TaraTable.Post;

Поля в таблице такие:
Code (Number)
Code_s (Number) - связано с мастером
Name (Alpha)
Group (Number)

Поле Code (Внутренний код-порядковый номер записи), но не автоматический. Автоматический не получилось связать с мастером.
Так вот при добавлении новой записи мне нужно поле Code заполнить самому, в противном случае оно остается пустое. Просьба подсказать: Как я могу узнать последний порядковый номер во всей таблице?


 
mike-d   (2003-02-09 16:18) [6]

не совсем понял порядок полей и как ты их сумел связать с мастером, но для нормальной связки нужно делать так:
1. Code_s (Number) - ключ - для связки с мастером
2. Code (Number) - ключ для уникальности записей (его и можно сделать AutoInc)
3. так далее...

"последний порядковый номер во всей таблице" можно узнать SQL запросом


 
Eugene_   (2003-02-09 16:24) [7]


> mike-d © (09.02.03 16:18)
> 1. Code_s (Number) - ключ - для связки с мастером
> 2. Code (Number) - ключ для уникальности записей (его и
> можно сделать AutoInc)


Я так и сделал, только поле Code (Number) у меня не AutoInc.
Вот для этого мне и нужно перед добавлением следующей записи узнать значение поля Code предыдущей записи. AutoInc мне не подходит.


 
mike-d   (2003-02-09 16:31) [8]

SELECT MAX(Code)
FROM "как_там_назвал_свою_таблицу"
можно еще добавить
WHERE Code_S=:Code_S
хотя впрочем и необязательно...


 
Eugene_   (2003-02-09 19:49) [9]

Все равно так не работает.

Я пишу вот так:
MainForm.Query.DataSource:=MainForm.Level5;
MainForm.Query.Close;
MainForm.Query.SQL.Clear;
MainForm.Query.SQL.Add("select max(Code) From ".\Data\Tara.db"");
MainForm.Query.ExecSQL;
MainForm.Query.Open;
MaxN:=MainForm.Query.RecordCount;
MainForm.TaraTable.DisableControls;
MainForm.TaraTable.Last;
MainForm.TaraTable.Insert;
MainForm.TaraTable.FieldValues["Code"]:=MaxN;
MainForm.TaraTable.FieldValues["Code_s"]:=Main.Where;
MainForm.TaraTable.FieldValues["Name"]:=Edit1.Text;
MainForm.TaraTable.FlushBuffers;
MainForm.TaraTable.EnableControls;


Я так понимаю, что вот здесь --> MainForm.Query.RecordCount и должно быть общее кол-во записей, а тут все равно только текущее кол-во с мастера.


 
mike-d   (2003-02-09 20:29) [10]

однако...
давай по порядку:

Query: TQuery; - должен быть объявлен, и у него DataSource=nil, DatabaseName = текущему Alias

// Получение следующего максимального значения Code
// из всей таблицы TARA.DB
function GetNextId: Integer;
var
N: Integer;
begin
Query.SQL.Clear;
Query.SQL.Add("SELECT MAX(Code) AS MaxID FROM "tara.db"");
Query.Open;
N := Query.FieldByName("MaxID").AsInteger;
Query.Close;
Result := N + 1;
end;

если тебе приспичит выбирать максимальное из детайла этой таблицы, тогда примерно так

Query.SQL.Clear;
Query.SQL.Add("SELECT MAX(Code) AS MaxID FROM "tara.db"" +
WHERE Code_S=" + MainForm.Level5.FieldByName("Code_S").AsString);
Query.Open;

...
// вставка значения Code
procedure MainForm.TaraTableAfterInsert(DataSet: TDataSet);
begin
TaraTable.FieldByName("Code").AsInteger := GetNextId;
end;


 
Eugene_   (2003-02-09 22:07) [11]

Спасибо тебе Михаил!
Я уже сам разобрался. Дело оказывается вот в чем:

Запрос у меня вополняется правильно. Только вот максимальное значение записей лежит не в "MainForm.Query.RecordCount" и даже не в "Query.FieldByName("MaxID").AsInteger", а в "MainForm.Query.FieldValues["Max OF Code"]" !!!

Там как раз было то число, которое и нужно. А узнал очень просто: взял твой пример запроса и открыл его в Database Desktop. Выполнил запрос и получил таблицу с одной записью, но двумя полями и вот в одном из них и было необходимое значение !!!

Еще раз спасибо ...



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.02.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.036 c
1-87459
Alessio2003
2003-02-18 21:47
2003.02.27
TMemo


1-87378
AnnReal
2003-02-17 16:44
2003.02.27
Трабл с BitBtn, глотает нажатие Enter, а он необх. в др. месте


3-87323
denis24
2003-02-10 16:45
2003.02.27
создание *.dbf


3-87337
dimmu3
2003-02-10 21:39
2003.02.27
Процедуры Interbase


1-87496
Анрей Фомичев
2003-02-15 21:59
2003.02.27
Работа с Таймером





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский