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

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

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

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

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

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

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

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

16
5580 / 4430 / 1080
Регистрация: 29.08.2013
Сообщений: 27,712
Записей в блоге: 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
5580 / 4430 / 1080
Регистрация: 29.08.2013
Сообщений: 27,712
Записей в блоге: 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
5580 / 4430 / 1080
Регистрация: 29.08.2013
Сообщений: 27,712
Записей в блоге: 3
30.01.2018, 09:14 6
а откуда данные загружаете в DataSet?
0
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 218
30.01.2018, 09:18  [ТС] 7
из БД
0
5580 / 4430 / 1080
Регистрация: 29.08.2013
Сообщений: 27,712
Записей в блоге: 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
5580 / 4430 / 1080
Регистрация: 29.08.2013
Сообщений: 27,712
Записей в блоге: 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
Сообщений: 738
30.01.2018, 09:50 13
Цитата Сообщение от tsareva Посмотреть сообщение
"Простая сортировка не справится, пришлось обходится такой процедурой"
Простите, это как так? SQL прекрасно справляется с сортировками выбранных данных самостоятельно по одному или нескольким полям. Так что разработчик что-то видать перед этим покурил серьезное... Используйте SQl- запрос и Order by, как писал qwertehok в ответе №2 и никаких больше процедур не нужно изобретать.
0
5580 / 4430 / 1080
Регистрация: 29.08.2013
Сообщений: 27,712
Записей в блоге: 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
5580 / 4430 / 1080
Регистрация: 29.08.2013
Сообщений: 27,712
Записей в блоге: 3
30.01.2018, 10:16 16
Цитата Сообщение от tsareva Посмотреть сообщение
такой запрос не сортирует в программе, но в бд сортирует
вы сами поняли что написали?

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Блоги программистов
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
Полезные поделки на Arduino, которые можно сделать самому
raxper 06.01.2025
Arduino как платформа для творчества Arduino представляет собой удивительную платформу для технического творчества, которая открывает безграничные возможности для создания уникальных проектов. Эта. . .
Подборка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов. . . .
С чего начать программировать микроконтроллер­­ы
raxper 06.01.2025
Введение в мир микроконтроллеров Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного сумматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­­­­­­­­­­­­­хро­н­н­ы­й счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru