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

Процедура сортировки для двух разных таблиц

29.01.2018, 16:41. Показов 1515. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня возник такой неординарный вопрос, наверно, даже странный! на форме у меня есть 2 таблицы, данные в них отображаются из БД одни и те же. для одной таблицы у меня есть процедура сортировки, а для другой - нет, но для нее в принципе должна быть такая же сортировка, как и для первой. как-то можно объединить процедуру сортировки для обеих таблиц или нужно новую процедуру писать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.01.2018, 16:41
Ответы с готовыми решениями:

Где прописать запрос для соединения двух таблиц из разных баз?
Здравствуйте. Вопрос такой. Даны две базы SQL(база1, база2). В них по одной таблички. И эти таблички нужно соединить с помощью оператора...

Разница двух столбцов разных таблиц
Помогите пожалуйста Есть две таблицы, которые подключаются через ADO, отражаются в DBGrid1 и 2 соответственно, ADOQuery создает запросы. ...

Как сделать в DBGrid вычисляемое поле из двух разных таблиц?
Делаю программу для БД в Access. В одной из таблиц должна быть конечная цена всех деталей. Кол-во берется из первой, а цена из прайс листа...

16
5975 / 4550 / 1095
Регистрация: 29.08.2013
Сообщений: 28,170
Записей в блоге: 3
29.01.2018, 16:58
что такое "процедура сортировки"?

так как вы в ветке по БД и пишите про таблицы, то таблицы сортируются SQL запросом конструкцией "order by ***"
никаких процедур не нужно
0
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 218
30.01.2018, 08:46  [ТС]
том-то и дело, что сортировка происходит не sql запросом, а именно процедурой сортировки. Значит, мне в другую ветку надо
0
5975 / 4550 / 1095
Регистрация: 29.08.2013
Сообщений: 28,170
Записей в блоге: 3
30.01.2018, 09:02
ты тогда уточни что у тебя за таблицы

Цитата Сообщение от tsareva Посмотреть сообщение
для одной таблицы у меня есть процедура сортировки, а для другой - нет
по идее ты сортируешь не таблицы, а данные. значит можно написать процедуру в которую передавать имя таблицы и имя колонки и сортировать
0
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 218
30.01.2018, 09:06  [ТС]
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
procedure TMainForm.SortData;
type
     TSortItem = record
      Key: String;
      Values: Array of Variant;
     end;
     TSortItems = Array of TSortItem;
 
var
     I,J: Integer;
     DataSet: TClientDataSet;
     List: TStringList;
     BookMark: Integer;
     TmpStr,ProductName: String;
     FCount: Integer;
     FItems: TSortItems;
     FMaxParamCount: Integer;
     IndexFields: String;
     IsFloat: Boolean;
     F: Double;
     Prd: integer;
     Sort: string;
 
     function GetItemPos(Key: String): Integer;
     begin
          DataSet.First;
          For Result:= 0 to DataSet.RecordCount-1 do begin
           If DataSet.FieldByName('Key').AsString=Key
            then Exit;
           DataSet.Next;
          end;
          Inc(Result);
     end;
 
begin
     try
      //Временная сортировка (почему-то нужно сначала очистить, а потом определить ключ)
      SP.IndexFieldNames:= '';
      SP.IndexFieldNames:= 'ТипДетали;Обозначение;НаимИзделия;Документ';
 
      //Создать объекты
      DataSet:= TClientDataSet.Create(Application);
      List:= TStringList.Create;
      FItems:= nil;
      FCount:= 0;
      FMaxParamCount:= 0;
 
      SP.First;
      While not SP.Eof do begin
       // 1.Запомнить положение маркера
       BookMark:= SP.FieldByName('Nomer').AsInteger;
 
       // 2.По каким параметрам будет отбор для сортировки
       TmpStr:= SP.FieldByName('Документ').AsString;            //ГОСТ,ТУ
       ProductName:= SP.FieldByName('НаимИзделия').AsString;    //резистор,конденсатор
 
       // 3.Очистить хранилище: индексы,данные,наборы полей
       DataSet.IndexFieldNames:= '';
       If DataSet.Active then begin
        DataSet.EmptyDataSet;
        DataSet.FieldDefs.Clear;
        DataSet.Fields.Clear;
        DataSet.Close;
       end;
       FItems:= nil;
       FCount:= 0;
       FMaxParamCount:= 0;
 
       // 4.Ищем изделия в пределах одного документа, параметры для сортировки передаем в массив сортировки
       While (SP.FieldByName('Документ').AsString=TmpStr) and (SP.FieldByName('НаимИзделия').AsString=ProductName) and
       (not SP.Eof) do begin
        //увеличить массив
        SetLength(FItems, FCount+1);
        //поле "Наименование" в массив
        FItems[FCount].Key:= SP.FieldByName('Наименование').AsString;
        Sort:=SP.FieldByName('Документ').AsString;
        //разделить поле "ДляСортировки" на составляющие и записать в массив
        List.Text:= SP.FieldByName('ДляСортировки').AsString;
        //определить поле "Prd" для сортировки
        begin
        If List.Count>0 then begin
         //макс.кол-во параметров для сортировки
         If List.Count>FMaxParamCount
          then FMaxParamCount:= List.Count;
         SetLength(FItems[FCount].Values, List.Count);
         For I:= 0 to List.Count-1 do
          FItems[FCount].Values[I]:= List.Strings[I];
        end;
        end;
 
        //увеличить счетчик массива для сортировки
        Inc(FCount);
        //следующая запись
        SP.Next;
       end;
 
       // 5.Сортируем однотипные объекты (с одинаковым набором полей, т.е.принадлежащие одному документу)
       //   и возвращает порядок для каждого объекта:
       // 5.1.Подготовить DataSet
       DataSet.FieldDefs.Add('Key', ftString, 100);
       IndexFields:= '';
       IsFloat:= False;
       For I:= 0 to FMaxParamCount-1 do begin
        //проверяем, является ли текущий столбец числовым
        For J:= 0 to FCount-1 do
         If FItems[J].Values<>nil then
          If Length(FItems[J].Values)>=I then begin
           try  {--- это для правильной проверки ---}
            IsFloat:= TryStrToFloat(FItems[J].Values[I], F);
           except
            IsFloat:= False;
           end; {---}
           If not IsFloat
            then Break;
          end;
        //добавляем поле (числовое, или строковое)
        If IsFloat
         then DataSet.FieldDefs.Add('Field'+IntToStr(I), ftFloat)
         else DataSet.FieldDefs.Add('Field'+IntToStr(I), ftString, 20);
        IndexFields:= IndexFields+'Field'+IntToStr(I)+';';
       end;
 
       // 5.2.Датасет с нужной структурой создан, заносим данные
       DataSet.CreateDataSet;
       DataSet.IndexFieldNames:= '';
       DataSet.Active:= True;
       For I:= 0 to FCount-1 do begin
        DataSet.Append;
        DataSet.FieldByName('Key').AsString:= FItems[I].Key;
        For J:= 0 to FMaxParamCount-1 do
         If J<=Length(FItems[I].Values)-1
          then DataSet.FieldByName('Field'+IntToStr(J)).Value:= FItems[I].Values[J]
          else DataSet.FieldByName('Field'+IntToStr(J)).Value:= MaxDouble;
        DataSet.Post;
       end;
 
       DataSet.IndexFieldNames:= IndexFields+'Key';
       SP.Locate('Nomer',BookMark,[]);
       //ищем и записываем результат
       For I:= 0 to DataSet.RecordCount-1 do begin
        SP.Edit;
        SP.FieldByName('ПорядокПоПараметрам').AsInteger:= GetItemPos(SP.FieldByName('Наименование').AsString);
        SP.Post;
        SP.Next;
       end;
      end;
 
     finally
      DataSet.Free;
      List.Free;
      FItems:= nil;
     end;
 
     // 8.Включаем индексацию
     SP.IndexFieldNames:= 'ТипДетали;Обозначение;PozName;НаимИзделия;Документ;ПорядокПоПараметрам';
end;
процедура сортировки для DATASET SP, мне нужно повторить ту же самую процедуру для DATASET StandDS? или можно объединить эту процедуру для двух DATASET ?
0
5975 / 4550 / 1095
Регистрация: 29.08.2013
Сообщений: 28,170
Записей в блоге: 3
30.01.2018, 09:14
а откуда данные загружаете в DataSet?
0
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 218
30.01.2018, 09:18  [ТС]
из БД
0
5975 / 4550 / 1095
Регистрация: 29.08.2013
Сообщений: 28,170
Записей в блоге: 3
30.01.2018, 09:30
а почему не query и SQL?
0
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 218
30.01.2018, 09:34  [ТС]
Sorry, вопроса не поняла, из
Цитата Сообщение от qwertehok Посмотреть сообщение
query
конечно.

Добавлено через 1 минуту
хотела бы узнать, можно ли адаптировать эту процедуру под 2 dataseta? и если да, то как?
0
5975 / 4550 / 1095
Регистрация: 29.08.2013
Сообщений: 28,170
Записей в блоге: 3
30.01.2018, 09:36
почему вы не используете квери и SQL запросы?
в запросе сортировка это 1 строка

зачем оббегать циклами датасеты?
0
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 218
30.01.2018, 09:43  [ТС]
программу не я писала, поэтому исходник сейчас изучаю и дорабатываю его. разработчик программы оставил коммент типа: "Простая сортировка не справится, пришлось обходится такой процедурой". но возникла необходимость отсортировать данные по такому же принципу и в другом dataset.
0
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 218
30.01.2018, 09:48  [ТС]
данные должны сортироваться по такому признаку
Миниатюры
Процедура сортировки для двух разных таблиц  
0
 Аватар для drvolodko
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 752
30.01.2018, 09:50
Цитата Сообщение от tsareva Посмотреть сообщение
"Простая сортировка не справится, пришлось обходится такой процедурой"
Простите, это как так? SQL прекрасно справляется с сортировками выбранных данных самостоятельно по одному или нескольким полям. Так что разработчик что-то видать перед этим покурил серьезное... Используйте SQl- запрос и Order by, как писал qwertehok в ответе №2 и никаких больше процедур не нужно изобретать.
0
5975 / 4550 / 1095
Регистрация: 29.08.2013
Сообщений: 28,170
Записей в блоге: 3
30.01.2018, 10:01
Цитата Сообщение от tsareva Посмотреть сообщение
мне нужно повторить ту же самую процедуру для DATASET StandDS?
надо смотреть код, у вас там много чего - нужно проверять
0
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 218
30.01.2018, 10:08  [ТС]
drvolodko,
SQL
1
2
3
4
5
6
7
8
SELECT Stand.*,
       Gost.Gost_ID AS GostID, Gost.Name AS GostName,
       Okp.Okp_ID AS OkpID,Okp.Klass,Okp.Naim 
FROM standart.dbo.Stand,
     standart.dbo.Gost,
     standart.dbo.Okp
WHERE Stand.Gost_Id=Gost.Gost_Id AND Stand.Okp_Id=Okp.Okp_Id
ORDER BY Mark ASC
. такой запрос не сортирует в программе, но в бд сортирует
0
5975 / 4550 / 1095
Регистрация: 29.08.2013
Сообщений: 28,170
Записей в блоге: 3
30.01.2018, 10:16
Цитата Сообщение от tsareva Посмотреть сообщение
такой запрос не сортирует в программе, но в бд сортирует
вы сами поняли что написали?

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

ЗЫ и запрос ваш надо переписать через JOIN
0
 Аватар для drvolodko
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 752
30.01.2018, 10:28
Все правильно. Вы подключаетесь к БД через query или FireDAC, в квери пишите свой запрос и квери же соединяете с гридом через датасоурс и получаете в программе свои отсортированные записи.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.01.2018, 10:28
Помогаю со студенческими работами здесь

Арифметические операции над значениями двух разных таблиц и запись итога в одну из них
Добрый день. Табл.1 Табл.1 ID X 1 X1 Табл.2

Триггер для вставки id в с двух разных таблиц
Здравствуйте, у меня есть таблица clients и там есть поле client_id (primary key , AI) и таблица movies есть поле movie_id (primary key...

Нужен триггер или хранимая процедура для вычислений данных из двух таблиц
Подскажите триггер или хранимую процедуры для вычисления данных. К примеру поле STARSH_KLASS из таблицы &quot;PLATA_CHAS&quot; ...

Хранимая процедура сортировки числового поля для сортировки по алфавиту
В таблице есть поле Name , в котором, собственно, и хранятся типы товаров, и есть поле Ordinal c уникальными значениями типа int Name ...

Процедура сортировки массива из двух элементов
Не получается, выдает ошибку


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
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-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru