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

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

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

Author24 — интернет-сервис помощи студентам
У меня возник такой неординарный вопрос, наверно, даже странный! на форме у меня есть 2 таблицы, данные в них отображаются из БД одни и те же. для одной таблицы у меня есть процедура сортировки, а для другой - нет, но для нее в принципе должна быть такая же сортировка, как и для первой. как-то можно объединить процедуру сортировки для обеих таблиц или нужно новую процедуру писать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.01.2018, 16:41
Ответы с готовыми решениями:

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

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

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

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

16
5489 / 4404 / 1076
Регистрация: 29.08.2013
Сообщений: 27,597
Записей в блоге: 3
29.01.2018, 16:58 2
что такое "процедура сортировки"?

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

Цитата Сообщение от tsareva Посмотреть сообщение
для одной таблицы у меня есть процедура сортировки, а для другой - нет
по идее ты сортируешь не таблицы, а данные. значит можно написать процедуру в которую передавать имя таблицы и имя колонки и сортировать
0
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 218
30.01.2018, 09:06  [ТС] 5
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
5489 / 4404 / 1076
Регистрация: 29.08.2013
Сообщений: 27,597
Записей в блоге: 3
30.01.2018, 09:14 6
а откуда данные загружаете в DataSet?
0
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 218
30.01.2018, 09:18  [ТС] 7
из БД
0
5489 / 4404 / 1076
Регистрация: 29.08.2013
Сообщений: 27,597
Записей в блоге: 3
30.01.2018, 09:30 8
а почему не query и SQL?
0
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 218
30.01.2018, 09:34  [ТС] 9
Sorry, вопроса не поняла, из
Цитата Сообщение от qwertehok Посмотреть сообщение
query
конечно.

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

зачем оббегать циклами датасеты?
0
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 218
30.01.2018, 09:43  [ТС] 11
программу не я писала, поэтому исходник сейчас изучаю и дорабатываю его. разработчик программы оставил коммент типа: "Простая сортировка не справится, пришлось обходится такой процедурой". но возникла необходимость отсортировать данные по такому же принципу и в другом dataset.
0
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 218
30.01.2018, 09:48  [ТС] 12
данные должны сортироваться по такому признаку
Миниатюры
Процедура сортировки для двух разных таблиц  
0
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 736
30.01.2018, 09:50 13
Цитата Сообщение от tsareva Посмотреть сообщение
"Простая сортировка не справится, пришлось обходится такой процедурой"
Простите, это как так? SQL прекрасно справляется с сортировками выбранных данных самостоятельно по одному или нескольким полям. Так что разработчик что-то видать перед этим покурил серьезное... Используйте SQl- запрос и Order by, как писал qwertehok в ответе №2 и никаких больше процедур не нужно изобретать.
0
5489 / 4404 / 1076
Регистрация: 29.08.2013
Сообщений: 27,597
Записей в блоге: 3
30.01.2018, 10:01 14
Цитата Сообщение от tsareva Посмотреть сообщение
мне нужно повторить ту же самую процедуру для DATASET StandDS?
надо смотреть код, у вас там много чего - нужно проверять
0
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 218
30.01.2018, 10:08  [ТС] 15
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
5489 / 4404 / 1076
Регистрация: 29.08.2013
Сообщений: 27,597
Записей в блоге: 3
30.01.2018, 10:16 16
Цитата Сообщение от tsareva Посмотреть сообщение
такой запрос не сортирует в программе, но в бд сортирует
вы сами поняли что написали?

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

ЗЫ и запрос ваш надо переписать через JOIN
0
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 736
30.01.2018, 10:28 17
Все правильно. Вы подключаетесь к БД через query или FireDAC, в квери пишите свой запрос и квери же соединяете с гридом через датасоурс и получаете в программе свои отсортированные записи.
0
30.01.2018, 10:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.01.2018, 10:28
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru