Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 193

DBGrid вывести в место цифры слово

09.12.2023, 21:33. Показов 2333. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общих чертах я это реализовал кодом ниже:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure TFormMain.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
  ArrStatus: array[1..6] of string = ('Черновик', 'В очереди', 'В работе', 'Собрано', 'Выдано', 'Отклонено');
begin
  with TDBGrid(Sender) do begin
    if DataSource.DataSet = DM1.FDQZayavkiByFilter then begin
      var Status := DataSource.DataSet.FieldByName('Status').AsInteger;
      case Status of
        1: Canvas.Brush.Color := clWindow; //Черновик.
        2: Canvas.Brush.Color := TColor($f6f6f6); //В очереди.
        3: Canvas.Brush.Color := TColor($fffef1); //В работе.
        4: Canvas.Brush.Color := TColor($fcfffb); //Собрано.
        5: Canvas.Brush.Color := TColor($eef4ff); //Выдано.
        6: Canvas.Brush.Color := TColor($ffefef); //Отклонено.
      end;
      DefaultDrawColumnCell(Rect, DataCol, Column, State);
 
      if Column.FieldName = 'Status' then begin
        Canvas.FillRect(Rect);
        Canvas.TextOut(Rect.Left+2, Rect.Top+2, ArrStatus[Status]);
      end;
    end;
  end;
end;


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

Но я не понимаю что это за клас, где это событие. Привожу цитату из статьи. Помогите с этим делом где это событие? Как код выше будет выгледить если его реализовать через этот вариан.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Но это не единственный способ! Те, кто не любит экзотику, следующий абзац могут не читать. :о)
Есть такой класс TField, у него есть интересное событие TField.OnGetText. Происходит это событие тогда, когда требуется обновить содержимое текущей ячейки на экране. Ясно, что это событие возникает гораздо реже, чем перерисовка ячейки DBGrid. Сомневающимся предлагаю поэкспериментировать.
В обработчике этого события нам доступны само поле Sender, текст Text, который будет выводиться в этом поле и признак DisplayText.
Читая help, видим, что переопределив этот обработчик мы полностью контролируем что именно будет выводиться в поле и запрещаем автоматический вывод его значения из таблицы. Таким образом, просто переопределив пустой обработчик этого события, мы запрещаем выводить текст в поле, в котором собираемся рисовать картинку !
 
procedure TformColorGrid.TableBioGraphicGetText(Sender: TField;
  var Text: String; DisplayText: Boolean);
begin
 
end;
Вот и все. Канву можно не беспокоить.
 
 
***********
 
Итак, нам нужно вместо числа сантиметров написать, длинная эта рыба или короткая.
 Вспомним только что упомянутое событие TField.OnGetText - это как раз то, что нам нужно! Просто и, главное, быстро!
 Не нужно перерисовывать канву ячейки при каждом передвижении курсора по DBGrid'у.
 
procedure TformColorGrid.TableBioLengthcmGetText(Sender: TField;
  var Text: String; DisplayText: Boolean);
begin
    IF Sender.AsFloat > 100
    Then Text := 'Длинная рыба'
    Else Text := 'Короткая рыба'
end;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.12.2023, 21:33
Ответы с готовыми решениями:

В предложении из n слов первое слово поставить на место второго, второе - на место третьего, и т.д.
В предложении из n слов первое слово поставить на место второго, второе - на место третьего, и т.д., (n-е слово - на место n-го, n-е слово...

Выводить последовательно цифры от 0 до 9 в одно место экрана. При вводе с клавиатуры какой-либо цифры менять темп вывода
Задание: Выводить последовательно цифры от 0 до 9 в одно место экрана. При вводе с клавиатуры какой-либо цифры менять темп вывода. Значение...

Вывести все четные цифры, содержащиеся в слове наибольшей длины, и вывести число повторений каждой этой цифры
Дан массив из n слов произвольной длины (длина слова не превышает 80 символов). Элементами слов могут быть любые графические символы....

20
 Аватар для Beltar
830 / 444 / 39
Регистрация: 05.05.2022
Сообщений: 3,067
09.12.2023, 22:05
Это делается с помощью лукап-полей, или вычислимых полей.
0
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 193
09.12.2023, 22:39  [ТС]
Цитата Сообщение от Beltar Посмотреть сообщение
Это делается с помощью лукап-полей, или вычислимых полей.
Мне кажется что в статье описано нечто другое или я не прав?
У меня 6 вариантов статуса которые не вычисляются я их сам присваиваю мне проще еще одно поле сделать и писать туда сразу по русски статус. Или вообще не юзать цифровые статусы а юзать текстовые на русском языке.

Нужно либо так же красиво как в статье либо нефиг заморачиваться ... но я не понимаю что написано в сатье в той части что я привел. Откуда он это все взял. Что это за "дополнительные" события которых у меня нет у грида.
0
 Аватар для Beltar
830 / 444 / 39
Регистрация: 05.05.2022
Сообщений: 3,067
09.12.2023, 22:57
Если вам нужно на основе значений одних полей, посчитать значение другого, то это вычислимое поле. Статья же про то, как рисовать в ячейке грида. Вывод текста - это частный случай рисования, на практике значения особого не имеющий, т. к. выводить текст грид умеет и сам, вся задача лишь в генерации этого текста.

Если у вас есть поле ДлинаРыбы, и вы хотите поделить на категории, то создайте вычисляемое поле, скажем, КатегорияДлиныРыбы и пишите в OnCalcFields

Delphi
1
2
3
4
5
case ДлинаРыбы.AsInteger of
 0..100:КатегорияДлиныРыбы.AsString:='Короткая рыба';
 101..150:КатегорияДлиныРыбы.AsString:='Обычная рыба'
 esle КатегорияДлиныРыбы.AsString:='Длинная рыба'; 
ens
Ну или какие там у вас критерии. Если на этом всё, то больше ничего делать не надо. Если хотите как-то по своему отображать, тогда другой вопрос. Хотя простые цветовые манипуляции с изменением Brush или Pen я бы даже к рисованию не относил.
0
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 193
09.12.2023, 23:04  [ТС]
Петрович аш 2003г знал об этом. Чутка подразобрался это событие в датасете. Только на том форуме речь шла о статической таблице а у меня динамическая я не могу в дезайнере добавить поля. У меня через FDQ с помощью SQL генерится запрос. Как программно реализовать то что говорит человек для таблицы сформированной SQL запросом?

https://forum.sources.ru/index... 39631&st=0


Кликните здесь для просмотра всего текста
А еще, у всех TField существует свойство DisplayText которое используется всеми визуальными компонентами чувствительными к данным (DataAware), в том числе и TDBGrid'ом. Т.е. TDBGrid выводит именно это свойство. В свою очередь, значение этого свойства по умолчанию равно значению из поля БД, с учетом свойства DisplayFormat (у кого оно есть). Но это по умолчанию.
Реально-же, у всех TField есть событие OnGetText. Если оно определено для поля, то DisplayText этого поля будет возвращать то, что вернет OnGetText.
Словами слишком запутанно smile.gif, проще на примере:
Если поля созданы в дизайнере, то требуемому полю (например FFF) вешаем обработчик FFFOnGetText событию OnGetText.
Если-же поля создаются динамически, то соответственно вешаем обработчик динамически.
Пример обработчика:
procedure FFFOnGetText (Sender: TField; var Text: String; DisplayText: Boolean);
begin
if DisplayText then Text := AnsiUpperCase(Text);
end;

С таким обработчиком, в поле FFF DBGrid'а, все символы будут заглавными, вне зависимости какие они в БД.
Естественно в БД они не меняются. При этом возникает интересный эффект. Если вы начнете редактировать поле FFF, то оно приобретет вид такой как в БД smile.gif, до тех пор пока Вы не закончите редактирование.
Естественно это работает и для TDBEdit и пр.

Этот способ удобно применять когда нужно выполнить только текстовое преобразование для отображения значения поля.
0
 Аватар для Beltar
830 / 444 / 39
Регистрация: 05.05.2022
Сообщений: 3,067
09.12.2023, 23:20
Продам компоненты для запросов, оптом. 10 компонентов - 100 рублей.

А вообще, вам никто не запрещает программно подцепить к нужным полям обработчики onGetText. Вы же всегда знаете, какие поля у вас будут.
0
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 193
09.12.2023, 23:52  [ТС]
Цитата Сообщение от Beltar Посмотреть сообщение
А вообще, вам никто не запрещает программно подцепить к нужным полям обработчики onGetText. Вы же всегда знаете, какие поля у вас будут.
В том то и проблема что я не знаю как это сделать. Я привожу тексты других людей и н понимаю что они говорят, и прошу объяснить о чем они толкуют. Откуда эти обработчики событий у них появились, как с ними работать...

В общем запихал я в чат GPT свой код и попросил его переделать так чтобы OnGetText был. Вышла лажа, полная лажа, но в одном моменте заработало, собственно, что мне и нужно было само слово начало появляться, не там где надо но появляется.
Допилил и вот так это выгледит на текущий момент может что то и лишнее но работает.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
procedure TFormMain.GetStatusText(Sender: TField; var Text: string; DisplayText: Boolean);
var
Status: Integer;
const
  ArrStatus: array[1..6] of string = ('Черновик', 'В очереди', 'В работе', 'Собрано', 'Выдано', 'Отклонено');
begin
Status := Sender.AsInteger;
Text := ArrStatus[Status];
end;
 
 
procedure TFormMain.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
  ArrStatus: array[1..6] of string = ('Черновик', 'В очереди', 'В работе', 'Собрано', 'Выдано', 'Отклонено');
begin
  with TDBGrid(Sender) do begin
    if DataSource.DataSet = DM1.FDQZayavkiByFilter then begin
      var Status := DataSource.DataSet.FieldByName('Status').AsInteger;
      if gdSelected In State then begin
        DefaultDrawColumnCell(Rect, DataCol, Column, State);
        if Column.FieldName = 'Status' then begin
          Column.Field.OnGetText := GetStatusText; // Устанавливаем событие OnGetText для поля Status
        end;
      end else begin
        case Status of
          1: Canvas.Brush.Color := clWindow; //Черновик.
          2: Canvas.Brush.Color := TColor($F0FFFF); //В очереди.
          3: Canvas.Brush.Color := TColor($B3DEF5); //В работе.
          4: Canvas.Brush.Color := TColor($F0FFF0); //Собрано.
          5: Canvas.Brush.Color := TColor($FFFFF0); //Выдано.
          6: Canvas.Brush.Color := TColor($CBC0FF); //Отклонено.
        end;
 
        DefaultDrawColumnCell(Rect, DataCol, Column, State);
        if Column.FieldName = 'Status' then begin
          Column.Field.OnGetText := GetStatusText; // Устанавливаем событие OnGetText для поля Status
        end;
      end;
    end;
  end;
end;
Но в такой реализации есть БАГ когда информация запрашивается первый раз почему то статус в первой-выделенной строке отображается не словом а цифрой. Щелкаешь по гриду и дальше все нормально. Можно не щелкать можно сплитер подвинуть. Вобщем надо вызвать еще раз перересовку грида.
не понятно почему но первая строка которая по умолчанию выбрана становиться при активации запроса работает с таким багом.
Хотя мы идем вот по этому ветвлению:
Delphi
1
2
3
4
5
      if gdSelected In State then begin
        DefaultDrawColumnCell(Rect, DataCol, Column, State);
        if Column.FieldName = 'Status' then begin
          Column.Field.OnGetText := GetStatusText; // Устанавливаем событие OnGetText для поля Status
        end;
Непонятно почему не срабатывает нормально.
0
 Аватар для Beltar
830 / 444 / 39
Регистрация: 05.05.2022
Сообщений: 3,067
10.12.2023, 00:16
На примере кастомного onClick для TBitBtn

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure MyOnButtonClick(Sender: TObject);//Просто процедура с правильной сигнатурой. В данном случае обычный TNotifyEvent.
  public
    { Public declarations }
  end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
BitBtn1.OnClick:=MyOnButtonClick;
end;
 
procedure TForm1.MyOnButtonClick(Sender: TObject);
begin
ShowMessage('Это мой обработчик');
end;
Для поля точно так же.

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

При разработке своих компонентов еще бывает нужно делать свои события со своими наборами параметров, тогда для них делается соответствующий процедурный тип с припиской of object.
0
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 193
10.12.2023, 18:32  [ТС]
Вопрос порассуждать. Какой смысл использовать в качестве статусов цифры а не словесные описания сразу же?

Плюсы:
Плюсы очевидны при больших базах данных в 10.000-100.000-1.000.000 строк наверника выборка по числам [1..10] будет гараздо быстрее чем поиск соответствия по 10 словам.

Удобство в ветвлении в самом Delphi через case of без создания доп. списка как это нужно делать в случае слов.

Недостатки:
Недостатки в том что приходиться колхозить всякие преобразования из цифры в слово каждый раз когда появляется эта цифра. D DBGrid например. Причем получается я просматриваю кучу данных кучу полей дабы отобрать это поле и присвоить ему соответствующее значение. То есть если в записи 25 полей я каждый раз делаю IF ради одного поля.
Плюс у меня это поле отображается периодически в Grid, Label, Memo и везде я должен это преобразование написать в самом Delphi.

Так же у меня есть другая процедура кликая по DBGrid по записи я вывожу всю инфу из этой записи. Какие там данные я не знаю они могут быть разные, разные поля. Но среди прочих в какой то момент будет запись которая содержит поле Status и оять я должен все проверять через IF ради одного поля Status чтобы вывести в мемо фразу "Статус: В работе", а не "Статус: 3"
на текущий моенент у меня в гриде могут появляться порядка 150 различных полей и это все я должен сравнить, а не поле ли это Status....

Быть может на малых базах данных целесообразно использовать сразу текстовые значения статусов при условии что эти статусы выводяться в DBGrid, Мемо, Edit, Label?
0
 Аватар для Beltar
830 / 444 / 39
Регистрация: 05.05.2022
Сообщений: 3,067
10.12.2023, 18:41
Делается таблица статусов. А за текстовые ключи надо руки отрывать и давать розгами по месту из которого они растут.
1
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,612
11.12.2023, 02:19
Цитата Сообщение от Beltar Посмотреть сообщение
На примере кастомного onClick для TBitBtn
Разве это пример?
Во-первых кнопка уже создана в дизайнере. Во-вторых для компонента TxxxField нужно не только задать обработчик, но и подключить его к нужному Dataset.
А почему было не дать пример именно с классом TxxxField?
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
11.12.2023, 11:42
TxxxField создается датасетом. что там к чему надо подключать??
Delphi
1
2
f1 := dataset.fieldByname('xxx');
f1.OnZzzzz := fieldZzzzHandler;
0
 Аватар для Beltar
830 / 444 / 39
Регистрация: 05.05.2022
Сообщений: 3,067
11.12.2023, 11:48
Во-1, мне лень создавать поля, и вообще приложение с БД, принцип все равно тот же.
Во-2, уже 100 раз сказали, что проще всего создать датасеты под каждый запрос, или задачу. В этом случае у них можно и в дизайнере создать поля. Ну и вообще уменьшить геморрой. Сколько лет базами занимаюсь, у меня ни разу подобной проблемы не было. Потому что она полностью решается вычислимыми и лукап полями. Даже если руками писать onGetText, т. е. фактически перенести код расчета вычислимого поля в замену текста другого поля, что м/б будет чутка компактнее, то принципа это не отменяет.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,612
12.12.2023, 02:01
Цитата Сообщение от krapotkin Посмотреть сообщение
TxxxField создается датасетом. что там к чему надо подключать?
Вот блин склероз!
0
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 193
17.12.2023, 14:17  [ТС]
Цитата Сообщение от Beltar Посмотреть сообщение
Делается таблица статусов. А за текстовые ключи надо руки отрывать и давать розгами по месту из которого они растут.
Помогите порассуждать и определится с методами хранения данных. Ключ цифра или сразу значение.

Со статусами мы определились, слова статусов большие, дак еще можно эти статусы и переименовать поэтому храним в БД цифровой ключ и отдельную таблицу со статусами.

1. Посмотрите на картинку. "Система крепления".
(А) Я считаю если бы пользователя устроило бы описание в виде одной буквы. То имеет смысл хранить напрямую эту букву С,D,M ... и посик осуществлять siskrep = "C".

(Б) Если нужно расширенное описание то лучше хранить не буквы а цифры, а именно ItemIndex комбобокса.

Таким образом для вывода информации в таблицы-DbGrid или в мемо мы запрашиваем полное описание. А когда нам нужно установить комбобокс в нужное значение из БД при редактировании например, мы используем непосредственно ключ-цифру-ItemIndex из БД без запроса описания.

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

Ваше мнение какое?

2. "Тип державки". Тут тоже самое если удовлетворены описанием в виде одной букву то можно и вариант (А) если нет то цифровые ключи ItemIndex из комбобокс и таблицу с описанием "B (75)"
Миниатюры
DBGrid вывести в место цифры слово  
0
 Аватар для Beltar
830 / 444 / 39
Регистрация: 05.05.2022
Сообщений: 3,067
17.12.2023, 16:54
Во-1, есть DBLookupcombobox и листбокс. А для поиска есть метод датасета Locate. Можно так же применять фильтры, как SQL-ые, так и быстрые локальные, там, правда, нюанс, нужно поле, по которому фильтр, всегда брать в квадратные скобки.

Вообще, когда имеешь дело с такими вот системами учета комплектухи, то это головная боль, там уже может быть сложившаяся система маркировки, которую придется переносить, отказываясь от числовых Id. Возможно надо применять несколько ключей сразу.
0
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 193
20.12.2023, 10:49  [ТС]
Я почитал рассуждения на тему первичный ключ строка или число. И мне кажется что даже в той теме люди путаются. Я полагаю если речь идет действительно о ключе то 100% надо юзать ID. Он работает гораздо быстрее в чем я убедился на практике в выборке в 1млн строк (105Мбайт). Так если если ключ и вторая таблица обязательно нужны то ключ должен быть ID а не строка. Даже не понимаю какой смысл в строке в таком случае.

Но я говорю немного о другом а нужен ли он вообще ключ и вторая таблица. Вот если не нужен и без него можно обойтись то я бы подумал. И тут я согласен с Тони Эндрюс который говорит что вы обрастете JOIN соединениями, а потом задолбаитесь с ними рабоать.
https://stackoverflow.com/ques... iness-keys

Так как я человек не опытный то я пробую. И попробовал сделать через JOIN в итоге у меня дополнительных таблиц стало больше чем основных. Основной запрос привратился из 4х JOIN в 10 JOIN ради чего?

Ради того чтобы указать сторону оброботки резцом например: Наруж. / Внутр. / Торец - возможно 4 вариант эти 3 или пользователь не указал. Или направление обработки R / L / RL еще одна таблица.....

В общем из своего практического опыта я сделал вывод что по возможности лучше так не делать. Не создать дополнительные таблицы на значения пусть даже строковые которые с вероятностью 95% не изменят своего значения. Врятли Наруж. - я когда нибуть переименную в "С наружи".

Еще я провел некоторые тесты по поиску по самой базе данных по текстовым полям и по числовым и поиск по строкам на равенство происходит довольно быстро, он даже равн поиску по числу, если это поле не является индексированным. И составляет в среднем 0,5с для выборки в 1млн для всех типов при длине строки не более 32 символа. Так же не важно где это число находиться в начале БД или в конце время одинаковое что говорит о том что идет просмотр всех записей.

Для себя я сделал вывод что конкретно в моем случае проще хранить непосредственное значение из комбобокс "Лево" "Право" "A (73)" чем обрастать 10-15 LEFT JOIN. Потеря 0,5с на "рабочем" компе который и так у меня тупой это ни что, незаметно для пользователя. А домашний сделает это в 4 раза быстрее за 0,1с.

Гораздо большие потери мы будем иметь на непосредственной передачи данных по сети результатов самого запроса. Чем вычисления - 0,5с на сервере.
Миниатюры
DBGrid вывести в место цифры слово   DBGrid вывести в место цифры слово   DBGrid вывести в место цифры слово  

DBGrid вывести в место цифры слово   DBGrid вывести в место цифры слово   DBGrid вывести в место цифры слово  

DBGrid вывести в место цифры слово   DBGrid вывести в место цифры слово  
0
 Аватар для Beltar
830 / 444 / 39
Регистрация: 05.05.2022
Сообщений: 3,067
20.12.2023, 11:40
Вообще-то если прога делается на Delphi, то и структура выбирается с учетом этого, а главные таблицы Join иметь не будут, скорее всего, там все собирается через lookup-поля. Хотя может у тебя на сервере делаются представления какие-то. прога, как я понимаю, от таблиц их не отличает (не использую представления). А чьи в представлении поля само представление знает.

Использовать таблицы без ключей может быть не всегда разрешено, например, в Access. Оно, вроде бы, можно, но есть засады. Тогда в качестве ключа можно использовать строки. Просто чтобы был.

Бывает и такое:

SQL
1
2
3
4
5
6
7
8
9
CREATE TABLE [dbo].[Цвета](
    [Код] [NCHAR](1) NOT NULL,
    [Цвет] [INT] NOT NULL,
    [Сортировка] [INT] NULL,
 CONSTRAINT [PK_Цвета] PRIMARY KEY CLUSTERED 
(
    [Код] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Просто несколько цветов с первой буквой названия в качестве ключа. И эта буква используется.

Делать какие-то короткие строковые поля с фикс. значениями без связей можно.

Так же не важно где это число находиться в начале БД или в конце время одинаковое что говорит о том что идет просмотр всех записей.
Сделай индексы. По всем полям по которым может быть поиск в больших таблицах. Это вопрос жизни и смерти вообще-то. Первичный ключ является автоматическим индексом, остальное руками. Размер таблицы может сильно вырасти.
0
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 193
20.12.2023, 13:30  [ТС]
lookup поля как я понял действительно могут избавить от JOIN, но думаю не в моем проекте, может быть когда нибудь я к ним прийду. Создавать их динамически тоже еще тот гемор. А у меня все запросы динамические. Иногда есть те поля что нужны для работы с локап полем иногда нет.

***
Оин из выводов моего эксперимента (скрин 2 и 5 причем число всего 4-х значное) говорит, что поиск по числовому значению или по строке в 32 символа идет одинаково 0,5с на 1млн записей.

В моем случае БД имеет Toolid, Tipid, ...еще 50 полей описывающих различные параметры инструментов. Все это и есть поля-критерии поиска. Все их сделать ключами не возможно.

И получается вывод зачем мне искать левый, правый, или нейтральный это резец через число, а потом подстовлять слово через локап-поле или JOIN StorId=2
Если я сразу могу искать Stor="RL" или Stor = "Лев".

Время на поиск будет одинаковым. Я думал что числа ищутся быстрее но как оказалось это не так.

Зачем мне искать Форм резца через запрос DerF=5 Если можно сразу Der="J (93)" время будет одинаковым только в первом случае еще колхозить с локап полем или JOIN.

В общем верну все в зад JOIN оставлю только для основных вещей, а всю эту мелочевку (являющеюся не изменяемым набором) буду непосредственно из комбобокса подставлять. Попробую по этому пути пройти.
0
 Аватар для Beltar
830 / 444 / 39
Регистрация: 05.05.2022
Сообщений: 3,067
20.12.2023, 15:08
Цитата Сообщение от S0563506 Посмотреть сообщение
Я думал что числа ищутся быстрее но как оказалось это не так.
Это из-за диска, съедающего всю разницу в работе CPU. Но в целом за строки в критических местах я буду сразу отрывать руки, т. к. 1 строка превращается в другую на раз, и одно и то же может быть записано массой способов. Т. е. агрегирование ломается. Неизбежно, т. к. если есть возможность натупить со строками, то рано или поздно натупят. Я на это насмотрелся, я с этим задолбался. Какой-нибудь справочник продукции - это только числа, иначе будет такой бардак, что его невозможно вычистить кроме приковыванием народа к компам и просмотром всего с правкой ручками.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.12.2023, 15:08
Помогаю со студенческими работами здесь

Место формируется автоматически если на определенную дату место занято то вывести ошибку. Все это дело считывается с б
Всем привет, помогите организовать алгоритм распределений мест в самолете: место формируется автоматически если на определенную дату место...

Элементами слов могут быть как буквы, так и цифры. Вывести на экран слово, содержащее наибольшее количество чётных цифр
Элементами слов могут быть как буквы, так и цифры. Вывести на экран слово, содержащее наибольшее количество чётных цифр. (указание:...

Дана квадратная матрица A[N,N]. Записать на место отрицательных элементов матрицы нули ,а на место положительных единицу. Вывести на на печать нижнюю
Дана квадратная матрица A. Записать на место отрицательных элементов матрицы нули ,а на место положительных единицу. Вывести на на печать...

Посчитать разницу столбцов DBGrid и вывести в другой столбец другого DBGrid?
Я знаю как посчитать разницу в одном и том же DBGrid. Но, дело в том, что мне нужно вывести это в другой DBGrid. Я сделала вот так,...

Как вывести в DBGrid информацию только по выбранной строке в другой таблице DBGrid?
У меня есть 3 таблицы - Компании, Адреса и Квартиры. Компании содержит поля - Код компании и название Адреса содержит поля - Код...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru