Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TcxDBCheckComboBox, определить индекс значения


Автор: lotax 24.11.2009, 10:03
Приветствую

Подскажите пожалуйста...

Использую TcxDBCheckComboBox (DevExpress) при этом свойство компонента Properties.EditValueFormat = cvfInteger

при отметке данных формируется сумма выделенных значений

Test1 - 1
Test2 - 2
Test3 - 4
Test4 - 8

то есть,  если выделены строки Test2 и Test4 значение поля будет 10

Вопрос
  Как извлечь в SQL из значения поля индекс выделенной записи..в запросе не могу сгруппировать...

Автор: Akella 24.11.2009, 11:03
Цитата(lotax @  24.11.2009,  10:03 Найти цитируемый пост)
Properties.EditValueFormat = cvfInteger

тип смени на другой, не используй cvfInteger


Цитата(lotax @  24.11.2009,  10:03 Найти цитируемый пост)
то есть,  если выделены строки Test1 и Test4 значение поля будет 10

может 9?


Цитата(lotax @  24.11.2009,  10:03 Найти цитируемый пост)
 Как извлечь в SQL из значения поля индекс выделенной записи..в запросе не могу сгруппировать...

Я не понял вопроса :(

Автор: lotax 24.11.2009, 12:49
Цитата(Akella @  24.11.2009,  11:03 Найти цитируемый пост)
тип смени на другой, не используй cvfInteger


Да, но на данный момент в базе хранится в числовом варианте...
плюсы в том, значение хранится в числовом формате, если брать строковый вариант
то строки длинные и всю строку выбора хранить в бд как то не очень



Цитата(Akella @  24.11.2009,  11:03 Найти цитируемый пост)
может 9?


исправил  smile 



Цитата(Akella @  24.11.2009,  11:03 Найти цитируемый пост)
Я не понял вопроса :( 


На данный момент в базе, данное поле хранится в выше описанном варианте, потребовалось узнать 
общее количество каждого  значения.. группировка этого поля..но с этих чисел я не могу вытащить 
каждое значение индекс в списке, чтоб сгруппировать данные...
Если бы в свойстве было cvfCaptions, в запросе  хотя бы через Like в строке можно было найти..

...или в данном случае только, подсчитывать в коде, например через GetItemState

Автор: Akella 24.11.2009, 12:55
Цитата(lotax @  24.11.2009,  12:49 Найти цитируемый пост)
Да, но на данный момент в базе хранится в числовом варианте...

ну и что, при ftInteger нельзя использовать более 256 элементов. Или не более 64.

Добавлено через 6 минут и 33 секунды
Дельфи нет под рукой, как поставлю, дам пример, если никто не опередит. Или на сайте девок смотри примеры/справку пока что.

Автор: lotax 24.11.2009, 13:07
Цитата(Akella @  24.11.2009,  12:55 Найти цитируемый пост)
ну и что, при ftInteger нельзя использовать более 256 элементов. Или не более 64. 


Согласен
..но список у меня не превышает 64 строк, но в самих Item хранятся длинные значения, и при выборе всех значений
длина будет больше 256..при строковых значений

бд использую MySQL наверное придется ставить varchar 500

так же хотел услышать совет, если можно, какое значение лучше всего использовать в Properties.EditValueFormat

Автор: Akella 24.11.2009, 13:37
Посмотри этот пример.
http://community.devexpress.com/forums/p/62220/210741.aspx

Автор: lotax 24.11.2009, 14:44
Цитата(Akella @  24.11.2009,  13:37 Найти цитируемый пост)
Посмотри этот пример.
http://community.devexpress.com/forums/p/62220/210741.aspx 


Большое спасибо, буду разбираться

Автор: Akella 24.11.2009, 23:08
Я работаю, не с DB, а с обычным списком переключателей.

Заполняем
Код

procedure TfmMain.FeelCxCheckListBox(clb:TcxCheckListBox;fibds:TpFibDataSet);
begin
  clb.EditValueFormat := cvfCaptions;

  if not fibds.Active then
    fibds.Open
  else
    fibds.First;

  fibds.DisableControls;
  clb.Items.BeginUpdate;
  try
    While not fibds.Eof do begin
        with TcxCheckListBoxItem.Create(clb.Items) do begin
          Text    := fibds.FBN('NAME').AsString;
          Tag     := fibds.FBN('ID').AsInteger;
        end;

        fibds.Next;
    end;
  finally
    clb.Items.EndUpdate;
    fibds.EnableControls;
  end;
end;



Считываем:
Код

Function cxCheckStr(CLB:TcxCheckListBox):String;
Var
 i:integer;
begin
  result:='';
  if clb.Count <= 0 then exit;


  For i := 0 to clb.Count-1  do
    if CLB.Items[i].Checked then
      result := IntToStr(CLB.Items[i].Tag)+','+Result;

  if result <> '' then begin
    Delete(result, Length(result),1);
    result := '('+result+')';
  end;
end;

возвращается строка для запроса вида
where id_spav in (10,15,20,21,22,41) (курсиов то, что возвращает функция cxCheckStr)

В частности для FibPlus conditions
Код

//clbStreets - TcxCheckListBox
Conditions.AddCondition('Streets', 'ID_STREET in '+ cxCheckStr(clbStreets), True);


Добавлено через 1 минуту и 3 секунды
Код
EditValueFormat := cvfCaptions


Добавлено через 9 минут и 36 секунд
получается примерно такой запрос
Код
select t1.id, t1.name from teble1 t1 where t1.id_spav in (10,15,20,21,22,41)


можно на соединения (join) переделать

Автор: lotax 25.11.2009, 06:39
Akella, большое Вам спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)