Форум: "Базы";
Текущий архив: 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.009 c