Topic: Заполнение Грида скриптом

Дмитрий, добрый день!
Очередняа проблема. Суть такова:
Заполняю Грид скриптом, для этого делаю следующее
1. Само собой задаю Гриду столбцы и имена столбцов (тут есть ещё 1 момент, возможно ли вручную задать количество столбцов гриду. Просто по умолчанию у него 6 столбцов, и если в базе столбцов меньше то приходиться удалять лишние, а это не есть гуд, хоть и не критично).
2. Определяю количество записей в базе.
3. Создаю условие, при котором если в базе записей нет вообще, то id первой записи я вписываю 1 без каких либо хитрых манипуляций. Если записи есть, то определяю максимальный id и следующая запись которая вписывается получает значение MAX(id)+1.
4. Запускаю цикл в котором уже по количеству записей в базе создаю строки в Гриде, и вписываю значения строки из базы в Грид.
Вот здесь и появляется проблема. Не знаю каким образом корректно записать значение id из базы в Грид что бы они совпадали.
На данный момент все это выглядит так:

procedure Form1_Button1_OnClick (Sender: string; var Cancel: boolean);
var
s1, s2, s3, s4: string;
r: integer;
begin
IF (Form1.Edit2.Text='') OR (Form1.Edit3.Text='') OR (Form1.DateTimePicker1.Checked=False)
THEN
ShowMessage('Поля пустые')
ELSE
    begin
    IF SQLExecute('SELECT Count(id) FROM Contracts') < 1
    THEN
        begin
        Form1.CGrid.ClearRows;
        s1:= '1';
        s2:= ReplaceStr(Form1.Edit3.Text,'"','""');
        s3:= ReplaceStr(Form1.Edit2.Text,'"','""');
        s4:= ReplaceStr(DateToStr(Form1.DateTimePicker1.DateTime),'"','""');
        SQLExecute('INSERT INTO Contracts (id, Number, Date, Customer) VALUES ("'+s1+'","'+s2+'","'+s3+'","'+s4+'")');
        UpdateDatabase('Contracts');
        FOR r:= 0 TO (SQLExecute('SELECT Count(id) FROM Contracts')-1) DO
            begin
            Form1.CGrid.AddRow;
            Form1.CGrid.Cells[0,r]:= IntToStr(r+1);
            Form1.CGrid.Cells[1,r]:= SQLExecute('SELECT Number FROM Contracts WHERE id="'+IntToStr(r+1)+'"');
            Form1.CGrid.Cells[2,r]:= SQLExecute('SELECT Date FROM Contracts WHERE id="'+IntToStr(r+1)+'"');
            Form1.CGrid.Cells[3,r]:= SQLExecute('SELECT Customer FROM Contracts WHERE id="'+IntToStr(r+1)+'"');
            end;
        end
    ELSE
        begin
        Form1.CGrid.ClearRows;
        s1:= IntToStr(SQLExecute('SELECT Max(id) FROM Contracts')+1);
        s2:= ReplaceStr(Form1.Edit3.Text,'"','""');
        s3:= ReplaceStr(Form1.Edit2.Text,'"','""');
        s4:= ReplaceStr(DateToStr(Form1.DateTimePicker1.DateTime),'"','""');
        SQLExecute('INSERT INTO Contracts (id, Number, Date, Customer) VALUES ("'+s1+'","'+s2+'","'+s3+'","'+s4+'")');
        UpdateDatabase('Contracts');
        FOR r:= 0 TO (SQLExecute('SELECT Count(id) FROM Contracts')-1) DO
            begin
            Form1.CGrid.AddRow;
            Form1.CGrid.Cells[0,r]:= IntToStr(r+1);
            Form1.CGrid.Cells[1,r]:= SQLExecute('SELECT Number FROM Contracts WHERE id="'+IntToStr(r+1)+'"');
            Form1.CGrid.Cells[2,r]:= SQLExecute('SELECT Date FROM Contracts WHERE id="'+IntToStr(r+1)+'"');
            Form1.CGrid.Cells[3,r]:= SQLExecute('SELECT Customer FROM Contracts WHERE id="'+IntToStr(r+1)+'"');
            end;
        end;
    end;
end;
То есть на данный момент id в Грид записывается нехитрой записью Form1.CGrid.Cells[0,r]:= IntToStr(r+1); что конечно же не верно.
Если например id записей в базе идут не по порядку, то есть есть разрыв в порядке, то соответствие id в базе и значения этих записей в столбце КОД в Гриде будут разные.
Вопрос: как вытаскивать id записи из базы и записывать в Грид.

Re: Заполнение Грида скриптом

Приветствую,

1. Само собой задаю Гриду столбцы и имена столбцов (тут есть ещё 1 момент, возможно ли вручную задать количество столбцов гриду. Просто по умолчанию у него 6 столбцов, и если в базе столбцов меньше то приходиться удалять лишние, а это не есть гуд, хоть и не критично).

Такой возможности не реализовал, не предполагал, что понадобится кому то заполнять грид скриптом )


ваш цикл заполнения грида будет корректно работать, только в случае когда id записи соответствует его порядковому номеру, после удаления и создания новых записей, будет работать неверно. В целом пока нет возможности у скрипта поочередно перебрать все записи из базы данных, зная их количество.


Вопрос: как вытаскивать id записи из базы и записывать в Грид.

идентификатор записи хранится в поле с именем id в каждой таблице, т.е. SELECT id FROM ....


В гриде идентификатор записи находится в последнем столбце, но он скрыт от пользователя, таким вот образом:
TableGrid1.Columns[здесь номер последней колонки].Visible := False;



А для чего вам понадобилось заполнять грид с помощью скрипта? )

Dmitry.

Re: Заполнение Грида скриптом

Дмитрий добрый день!
Заполнять Грид скриптом мне нужно для того что бы связать 2 Грида.
Например у меня есть грид со списком заказчиков, и есть отдельный грид где расположены все контракты по этому заказчику с полной информацией. Так вот при выборе определенного Заказчика в Гриде1, во втором Гриде хочу вывести из базы контрактов только те записи которые принадлежат именно этому Заказчику. Пробовал кнопкой через sql-запросы и поиском, но не смог понять как это сделать, и все время выдаются ошибки, либо ошибок просто нет и результата тоже.

идентификатор записи хранится в поле с именем id в каждой таблице, т.е. SELECT id FROM .... - это понятно, но вот как раз таки тут и кроется проблема. Как вытащить именно нужный мне id? Все остальные данные из таблицы я вытаскиваю с помощью запроса где в условии указывается id записи. Но как вытащить именно сам id зная только само значение id. Ведь если я сделаю запрос следующего вида: SELECT id FROM Table Where id= C, где С - это переменная которую я использую для перебора id, то синтаксис выражения уже не правилен. Вот я и думаю как мне вытащить именно тот id который существует в базе. Ведь синтаксис моего скрипта работать будет правильно если в ней не будут удаляться строки из базы и в дальнейшем не будут изменяться значения id. А если существуют разрывы в порядке id, например есть записи с 1 по 12, записи с 13 по 16 удалены. Тогда при заполнении Грида у меня в колонке Код, значений с 13 по 16 быть не должно.
Судя по Вашему ответу на данный момент это сделать скриптом невозможно.

Re: Заполнение Грида скриптом

Это можно сделать без скрипта.
В примере используется свойство Increm. Search компонента GridAbonent


Скачайте проект с примером:
http://myvisualdatabase.com/forum/misc. … download=1

Dmitry.

Re: Заполнение Грида скриптом

Спасибо разобрался.
А возможно как нибудь записывать занчения в Грид2 (тут собираются значения из 1 и 2 таблиц) и Грид3 (тут собираются значения из 3 и 4 таблицы)  по выбору значения в Грид1?

Re: Заполнение Грида скриптом

К сожалению не пойму, что вы имеете ввиду под "записывать занчения в Грид2"

Dmitry.

Re: Заполнение Грида скриптом

DriveSoft wrote:

К сожалению не пойму, что вы имеете ввиду под "записывать занчения в Грид2"

Имел ввиду ввыводить значения из таблицы.
В общем я хотел сделать как:
1. Есть таблица исполнители по контракту:
2. Есть таблица банков
3. Есть таблица расчетных счетов
4. Есть таблица сертификатов соответсвия
5. Есть таблица лицензий.

Записи таблицы исполнители по контракту выводятся в Грид1.
Записи Таблицы банков и расчетных счетов выводятся в Грид2
Записи Таблицы сертификатов соответствия и лицензии выводятся в Грид3

Но есть условие, в Грид2 и Грид3 выводятся записи которые относятся к к конкретному исполнителю в Грид1.
Если бы надо было связать только Грид1 и Грид2 то встроенная функция Increm.Search работает, так как здесь мы указываем какая конпка должна сработать. Вот я и хотел узнать как в определеннем событии сработали не 1 кнопка а 2.
Я уже разобрался с этим.
Я просто ничего в функции Increm.Search не указываю, а вот в самом скрипте создаю событие нажатия на кнопки, где есть события поиска, например кнопка1 и кнопка2, то есть в кодовом выражении
Form1.Button1.Click
Form1.Button2.Click
что в принципе и есть встроенная функция Increm.Search только с возможностью неограниченного выбора кнопок.

Re: Заполнение Грида скриптом

alik
Т.е. все ок, разобрались? )

Dmitry.

Re: Заполнение Грида скриптом

DriveSoft wrote:

alik
Т.е. все ок, разобрались? )

Да вопрос решен!
Спасибо Вам Дмитрий, Вы как всегда, если даже прямо не говорите как есть, задаете курс решения проблемы, а дальше дело техники!