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

Вниз

Добавить колонку в ДБ-грид, если там уже есть результат SQL-запро   Найти похожие ветки 

 
Rat   (2005-06-09 08:40) [0]

Грид связан с датасетом, вызывающим рез-т SQL-запроса(в AdoQuery или AdoStoredProc). После того, как содержимое этого SQL датасета отобразится в гриде, могу ли я в этот грид еще добавлять колонки? Просто когда их начинаю добавлять, то показываются только эти новые,( а старые исчезают) . Или единственный выход- добавлять эту колонку в запрос? Не хотелось бы, т.к. мне она нужна для помечания записей для дальнейшей обработки(т.е. от запроса эта колонка не должна зависеть).


 
ORMADA ©   (2005-06-09 09:06) [1]

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


 
Rat   (2005-06-09 09:22) [2]

Что за вычисляемое поле- к чему оно относится- к гриду,  к запросу,  или к таблицам, фигурирующим в запросе ?


 
ORMADA ©   (2005-06-09 09:29) [3]

к датасету в дизайн тайме можно сделать его так выбираешь датасет делаешь правый клик\ New Field\Field Type =Calculated

в рантайме тож легко замутить
делаешь к примеру булевое поле

           with TBooleanField.Create(MainDataSet) do
           begin
             FieldKind := fkData;
             FieldName := MainQuery.Fields.Fields[i].FieldName;
             DataSet := MainDataSet;
             Name := DataSet.Name + "Fields" + IntToStr(i);
             MainDataSet.FieldDefs.Add(name, ftBoolean);
           end;

и ставишь ему тип calcaluted

из за того что все поля прибиваются если они не были заданы явно приходится ручками переносить эти поля из какого нить временного дасасета, а потом уж добавлять calculated
что-то типа этого не знаю может быть можно сделать как то проще..

   //--- Переносим все поля из MainQuery в MainDataSet ---begin----------------
   for i := 0 to MainQuery.FieldCount - 1 do
     case MainQuery.Fields.Fields[i].DataType of

       ftAutoInc:
         begin
           with TAutoIncField.Create(MainDataSet) do
           begin
             FieldKind := fkData;
             ReadOnly := True;
             FieldName := MainQuery.Fields.Fields[i].FieldName;
             DataSet := MainDataSet;
             Name := DataSet.Name + "Fields" + IntToStr(i);
             MainQuery.FieldDefs.Add(name, ftAutoInc);
           end;
         end;

       ftWord: //--- он же tinyint ---
         begin
           with TWordField.Create(MainDataSet) do
           begin
             FieldKind := fkData;
             FieldName := MainQuery.Fields.Fields[i].FieldName;
             DataSet := MainDataSet;
             Name := DataSet.Name + "Fields" + IntToStr(i);
             MainQuery.FieldDefs.Add(name, ftWord);
           end;
         end;

       ftInteger:
         begin
           with TIntegerField.Create(MainDataSet) do
           begin
             FieldKind := fkData;
             FieldName := MainQuery.Fields.Fields[i].FieldName;
             DataSet := MainDataSet;
             Name := DataSet.Name + "Fields" + IntToStr(i);
             MainQuery.FieldDefs.Add(name, ftInteger);
           end;
         end;

       ftSmallint:
         begin
           with TSmallintField.Create(MainDataSet) do
           begin
             FieldKind := fkData;
             FieldName := MainQuery.Fields.Fields[i].FieldName;
             DataSet := MainDataSet;
             Name := DataSet.Name + "Fields" + IntToStr(i);
             MainQuery.FieldDefs.Add(name, ftSmallint);
           end;
         end;

       ftBCD:
         begin
           with TBCDField.Create(MainDataSet) do
           begin
             FieldKind := fkData;
             FieldName := MainQuery.Fields.Fields[i].FieldName;
             DataSet := MainDataSet;
             Name := DataSet.Name + "Fields" + IntToStr(i);
             MainQuery.FieldDefs.Add(name, ftBCD);
           end;
         end;

       ftString:
         begin
           with TStringField.Create(MainDataSet) do
           begin
             FieldKind := fkData;
             FieldName := MainQuery.Fields.Fields[i].FieldName;
             DataSet := MainDataSet;
             Name := DataSet.Name + "Fields" + IntToStr(i);
             Size := MainQuery.Fields.Fields[i].Size;
             DisplayWidth := MainQuery.Fields.Fields[i].Size;
             MainDataSet.FieldDefs.Add(name, ftString);
           end;
         end;

       ftDateTime:
         begin
           with TDateField.Create(MainDataSet) do
           begin
             FieldKind := fkData;
             FieldName := MainQuery.Fields.Fields[i].FieldName;
             DataSet := MainDataSet;
             Name := DataSet.Name + "Fields" + IntToStr(i);
             MainDataSet.FieldDefs.Add(name, ftDate);
           end;
         end;

       ftFloat:
         begin
           with TFloatField.Create(MainDataSet) do
           begin
             FieldKind := fkData;
             FieldName := MainQuery.Fields.Fields[i].FieldName;
             DataSet := MainDataSet;
             Name := DataSet.Name + "Fields" + IntToStr(i);
             MainDataSet.FieldDefs.Add(name, ftFloat);
           end;
         end;

       ftBytes:
         begin
           with TBytesField.Create(MainDataSet) do
           begin
             FieldKind := fkData;
             FieldName := MainQuery.Fields.Fields[i].FieldName;
             DataSet := MainDataSet;
             Name := DataSet.Name + "Fields" + IntToStr(i);
             MainDataSet.FieldDefs.Add(name, ftBytes);
           end;
         end;

       ftBoolean:
         begin
           with TBooleanField.Create(MainDataSet) do
           begin
             FieldKind := fkData;
             FieldName := MainQuery.Fields.Fields[i].FieldName;
             DataSet := MainDataSet;
             Name := DataSet.Name + "Fields" + IntToStr(i);
             MainDataSet.FieldDefs.Add(name, ftBoolean);
           end;
         end;
     end;
   //--- Переносим все поля из MainQuery в MainDataSet ---end-----------------


 
Rat   (2005-06-09 09:42) [4]

спасибо, попробую.
Кто-то мне кстати здесь посоветовал вместо введения дополнительного поля сохранять в какой-нить массив указатели на строки грида. А как получить этот указатель на строку ? И возможно ли это вообще?


 
ORMADA ©   (2005-06-09 10:04) [5]

указатель на строки - гон какой то :)
и чё они тебе дадут ?
как с их помощью ты даш юзеру возможность юзеру выбрать записи ?

можно хранить канешна идентификаторы поля из таблицы (уникальное какое нить нить поле однозначно определяющее запись) и потом по нему позиционироваться а большего от них ты не получишь ...


 
Mikle   (2005-06-09 11:17) [6]

ORMADA скажи пожалуйста что это значит
открывай таблицы в режиме кэширования


 
Desdechado ©   (2005-06-09 11:34) [7]

указатели - это TBookMark, он коректен только в текущей выборке
можно использовать, в принципе, но нужно ли - решает каждый сам


 
Rat   (2005-06-10 02:23) [8]

А данные об этом bookmark что-ли никак нельзя сохранить(в массив какой-нить) для последующего использования.
У меня тут был уже топик в другом разделе, но его закрыли.
Суть проблемы вообще была такая- Надо чтобы в рамках текущего сеанса работы с dbgrid"ом юзер мог помечать записи на удаление- то есть выбрал, нажал на кнопку, они пометились(напр желтым цветом). Потом, напр. выбрал другие записи и добавил в список удаления(или убрал какие-то записи из списка). А потом, по нажатию на кнопку эти помеченные записи должны удаляться.
(Сейчас программа работает просто- выделил записи, нажал на кнопку, =>цикл по bookmark, они удаляются)
Вот и вопрос- кроме как вводить доп. колонку булевского типа, другого выхода нет?
P/S действительно, что значит открывать в режиме кэширования?


 
ORMADA ©   (2005-06-10 07:23) [9]

//А данные об этом bookmark что-ли никак нельзя сохранить(в //массив какой-нить) для последующего использования.
легко сделай Tlist и храни там указатели на букмарки
но видишь ли букмарки такая вещь непостоянна закрыл/открыл датасет - можешь их выкидывать
а лучше хранить в массиве идентификатор записи (код однозначно идентифицирующий запись) а потом по нему локейтить к примеру
----------------------------------------------------------------
режим кеширования у адо квери к примеру выставляешь LockType=ltBatchOptimistic это означает что данные находятся в режиме кэширования и всякие операции типа delete INSERT и т.д. не идут в бд пока не будут подтверждены (ADOStoredProc.UpdateBatch;) или отменены (ADOStoredProc.CancelBatch)
----------------------------------------------------------------
ну если не хочешь колонку пусть пользователь выбирает у тя записи как нить а ты сохраняй идентификаторы их (к примеру уникальный код однозначно идентифицирующий запись) а потом их можно будет не в цикле удалить все а послал серверу команду типа delete FROM t1 WHERE код IN (идентификаторы записи через "," к примеру "1,2,3")


 
Rat   (2005-06-10 07:58) [10]

Уникальный ID- это поле из запроса или у грида тоже есть какие-то ID?. Просто поначалу мне хотелось, чтобы этот процесс не зависел от запроса(этот ID у разных таблиц может по разному называться). Но придется думаю так и сделать. Никто от меня универсальности пока и не требует. Если что, с дополнительной колонкой поэксперементирую.
Спасибо всем за советы.


 
evvcom ©   (2005-06-10 09:27) [11]


> что-то типа этого не знаю может быть можно сделать как то
> проще..

Можно проще. Для этого делаешь свой компонент:

 TMyStoredProc = class(TAnyStoredProc)
 private
   FOnCreateFields: TDataSetNotifyEvent;
 protected
   procedure CreateFields; override;
 public
   function CreateCalcField(FieldName: string; DataType: TFieldType): TField;
 published
   property OnCreateFields: TDataSetNotifyEvent read FOnCreateFields write FOnCreateFields;
 end;

procedure TMyStoredProc.CreateFields;
begin
 inherited;
 if Assigned(FOnCreateFields) then
   FOnCreateFields(Self);
end;

function TMyStoredProc.CreateCalcField(FieldName: string;
 DataType: TFieldType): TField;
var l_FieldClass: TFieldClass;
begin
 l_FieldClass := GetFieldClass(DataType);
 if Assigned(l_FieldClass) then begin
   Result := l_FieldClass.Create(Self);
   Result.FieldName := FieldName;
   Result.FieldKind := fkCalculated;
   Result.DataSet   := Self;
 end
 else
   Result := nil;
end;

Вешаешь обработчик на OnCreateFields, в нем и вызываешь CreateCalcField. Все поля уже будут созданы, ты добавляешь только те, которые тебе нужны (или удаляешь :))


 
Anatoly Podgoretsky ©   (2005-06-10 09:55) [12]

Rat   (10.06.05 02:23) [8]
bookmark фтопку
Есть первичные ключи


 
Desdechado ©   (2005-06-10 11:06) [13]

2 AP
зачем так категорично?

2 Rat
Для такой цели вообще в гриде мультиселект придумали - выбирается много записей, а потом цикл по их букмаркам и все.

2 AP
А первичный ключ может быть ведь длинным (или из нескольких полей), причем для разных выборок он разный - зачем огород городить?
Хотя любителям - простор для выращивания багов :)



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

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

Наверх




Память: 0.51 MB
Время: 0.01 c
3-1118485403
_vvv_
2005-06-11 14:23
2005.07.25
SQL generator


14-1120200830
zorik
2005-07-01 10:53
2005.07.25
Кто как создает файлы помощи?


3-1118748042
lexa12345
2005-06-14 15:20
2005.07.25
Системная дата в IB


14-1120140519
_dimka
2005-06-30 18:08
2005.07.25
Вопрос по транзакциям в IB


4-1117539519
[tek]
2005-05-31 15:38
2005.07.25
Отловить копирование файла





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