Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
25 / 0 / 0
Регистрация: 11.12.2019
Сообщений: 232
RAD XE3+

Фильтр в Query и поиск совпадений

06.12.2022, 12:20. Показов 2370. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
добрый день, есть таблица


делаю фильтр по id_main, потом ищу в поле id_dsp - если есть значение 1 и 41 тотогда в строке з значением 41 в поле forma_ поставить другое значение, например букву "Б"

вот что я написал, понимаю что примитивно, но не знаю как иначе

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
begin
      begin
        Close;
        SQL.Clear;   // фильтр по id_main и id_dsp
        SQL.add('select * from Main_soc_posl where id_main like' + hsp2 +
          ' and id_dsp like 1' + ' and id_dsp like 41');
        Open;
      end; 
 
      if DataModule1.FDQueryVSP.RecordCount <> 0 then
        ksp := (DataModule1.FDQueryVSP.RecordCount);
      if ksp > 1 then //не знаю как сделать поиск по 2-м значениям 
 
      begin              // тоесть если в таблице есть 1 и 41 тогда следующее действие
        begin
          Close;
          SQL.Clear;
          SQL.add('select * from Main_soc_posl where id_main like' + hsp2 +
            ' and id_dsp like 41');
          Open;
        end;
                 //я просто прописал если есть 2 строки, тогда сделать замену текста
        DataModule1.FDQueryVSP.Edit;
        DataModule1.FDQueryVSP.FieldByName('forma_oplati').AsString :=
          'Безоплатна';
        DataModule1.FDQueryVSP.Post;
      end
    end;
не работает
Миниатюры
Фильтр в Query и поиск совпадений  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.12.2022, 12:20
Ответы с готовыми решениями:

Поиск совпадений и действия в зависимости от наличия совпадений
Попытаюсь вкратце описать суть. Приходит список позиций с ценами. Необходимо проверить артикул на наличие совпадений с базой и 1) Если...

ixsso.Query, поис частичных совпадений.
Как настроить этот компонент чтобы он искал не точное совпаление слова а по его части. Например: Запрос: 'отд' Результат должен...

Фильтр через query params
Прошу поделится какой-нибудь статьёй, или решением как можно сделать фильтр фильмов или вообще любой фильтр, чтобы в строке браузера...

40
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
11.12.2022, 14:03
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от D1973 Посмотреть сообщение
чувак, запустивший в свое время в сеть эту порцию говна, будет гореть в аду на двух сковородках одновременно!
Это не говно, а очень хороший маркер скачанного кода. Позволяет легко понять, писал код сам автор или писали за него.
0
11.12.2022, 14:28

Не по теме:

Цитата Сообщение от Пытливый Посмотреть сообщение
а очень хороший маркер скачанного кода.
А, ну если с такой точки зрения это рассматривать...

0
 Аватар для Beltar
1048 / 489 / 41
Регистрация: 05.05.2022
Сообщений: 3,439
11.12.2022, 15:10
Кем-то такие куски кода были названы заклинаниями.

Код все качают, особенно если он решает какую-то частную задачу, проблема, когда предметную область не учат.
0
25 / 0 / 0
Регистрация: 11.12.2019
Сообщений: 232
11.12.2022, 21:06  [ТС]
D1973, уже несколько раз читаю упреки на счет этого кода, а аналогии поиска не предлагаешь
0
 Аватар для Beltar
1048 / 489 / 41
Регистрация: 05.05.2022
Сообщений: 3,439
11.12.2022, 21:53
Потому что никто до сих пор не понял, что именно ты хочешь сделать. Менять запись в базе для вручную выбранного id?

Ну а криво выбранная структура данных - это самый главный источник всех последующих проблем.
0
Модератор
 Аватар для D1973
9946 / 6481 / 2460
Регистрация: 21.01.2014
Сообщений: 27,465
Записей в блоге: 3
12.12.2022, 04:19
MaryoLunga83,
1. Эти строки просто не нужны. Вообще!
2.
Цитата Сообщение от MaryoLunga83 Посмотреть сообщение
DataModule1.FDQueryVSP.SQL.Clear;
    DataModule1.FDQueryVSP.SQL.add
Чистить и добавлять... А почему не сразу заместить?
3. Так-то давным давно параметрические запросы придуманы...

Это я про претензии к тому, кем-то придуманному коду. Логику же Вашего кода я понять совсем не могу...
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,681
Записей в блоге: 21
12.12.2022, 11:32
Цитата Сообщение от MaryoLunga83 Посмотреть сообщение
покажите пример
я в предыдущем посте ссылку давал
осталась непрочитанной?
добавим вычисляемое поле forma_oplaty_txt и в OnCalcFields
я правда, так и не понял окончательно глубинный смысл ТЗ, так что творчески домысливал:
если id_dsp=1 или id_dsp=41 то в новом поле значения XXXX или YYYY
иначе там копия поля forma_oplati
Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm1.CalcFields(DataSet: TDataSet);
begin
  if dataSet.FieldByName('id_dsp') = 1 then
    dataset.FieldByName('forma_oplaty_txt').AsString := 'XXXX'
  else
  if dataSet.FieldByName('id_dsp') = 41 then
    dataset.FieldByName('forma_oplaty_txt').AsString := 'YYYY'
  else
   dataset.FieldByName('forma_oplaty_txt').AsString := dataset.FieldByName('forma_oplati').AsString;
end;
что там происходит с Select from Main_soc_posl нам никто не объяснял, хотя предположу что это попытка сделать
Master-Detail
тогда нужно в обработчик OnAfterScroll мастер-датасета положить код, который переоткрывает дочерний датасет с параметрами
но так как этого в вопросе не было, и это чисто мое вангование по предмету, то это совсем другая тема, которую лучше разбирать в другом треде

Добавлено через 7 минут
на всякий случай, читать
https://www.cyberforum.ru/blog... g5254.html
1
408 / 242 / 88
Регистрация: 28.04.2022
Сообщений: 1,207
12.12.2022, 11:53
Цитата Сообщение от MaryoLunga83 Посмотреть сообщение
несколько раз читаю упреки на счет этого кода
Обозначьте, наконец, какая у вас БД/СУБД? Потому что на данный момент вы уже неделю занимаетесь ерундой.
Если задача в том, чтобы подменять значения некоего поля, сравнивая по условию со значением в соседнем поле, то это наверняка можно сделать банальным SELECT запросом. И код на Дельфи вообще становится не нужен.
1
 Аватар для Beltar
1048 / 489 / 41
Регистрация: 05.05.2022
Сообщений: 3,439
12.12.2022, 14:09
Вот я бы на этот Select посмотрел, ибо ничего, кроме Left Join таблицы с самой собой на ум не приходит, и я точно не напишу такой сразу. Ну так поэтому я бы и структуру БД другой делал, чтобы такие ужасы не писать, тем более что этих самых услуг там может оказаться даже не два десятка, так что даже выделение под каждую битового поля может стать не самой плохой идеей.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,681
Записей в блоге: 21
12.12.2022, 15:16
любой список услуг изменяется со временем
поэтому сколько бы битов не отводилось на решение, оно будет неверным
справочники придумали совсем не случайно
0
408 / 242 / 88
Регистрация: 28.04.2022
Сообщений: 1,207
12.12.2022, 18:03
Цитата Сообщение от Beltar Посмотреть сообщение
я бы на этот Select посмотрел
Чтобы ТС было чем заняться, можно сделать два запроса - первым получить список идентификаторов (список, соответственно, может меняться в зависимости от условий в WHERE и справочников), а потом этот список подать на вход второго запроса в раздел с условиями. Всё равно это прозрачнее и понятнее, чем та неведомая фигня, которую ваяет автор. Проблему вижу только если у автора Access, там с условными операторами не очень (было, по крайней мере).
С селф-джойном не совсем понял, зачем он тут, но автор никакого внятного объяснения задачи не дал (ни структуры БД, ничего), по начальным вводным таблица у него одна, т.е. просто одного запроса с селектом достаточно в примитивном варианте.
0
 Аватар для Beltar
1048 / 489 / 41
Регистрация: 05.05.2022
Сообщений: 3,439
12.12.2022, 18:45
Цитата Сообщение от krapotkin Посмотреть сообщение
поэтому сколько бы битов не отводилось на решение, оно будет неверным
Можно просто список Id хоть в текстовом формате. Но только чтобы уйти от зависимости записей в одной таблице друг от друга.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,681
Записей в блоге: 21
13.12.2022, 00:29
древовидные структуры почти всегда основываются на ссылках записей друг на друга в одной таблице.
заказы, производные от исходных заказов, например на комплектацию, на транспортировку и т.д. тоже часто лежат в одной таблице, поэтому в целом нельзя сказать, что зависимость одной записи от другой в одной и той же таблице - что-то необычное
в Oracle и Postgres есть даже специальные синтаксисы, позволяющие делать рекурсивные запросы

про self-join что-то я пропустил? у автора вроде нет такого в запросе? или о чем-то другом речь?
0
 Аватар для Beltar
1048 / 489 / 41
Регистрация: 05.05.2022
Сообщений: 3,439
13.12.2022, 00:44
Заказ имеет такую особенность, что он формируется разово и потом фиксируется. Т. е. если я хочу сделать сложное условие, что при покупке товаров на 50000 р. покупатель может приобрести еще 1 товар ценой до 2000, а к некоторым товарам можно купить 3 и получить 4-ый бесплатно, я его сделаю до записи в БД, куда потом пойдет итоговая цена. И от того, что через месяц условия и цены поменяются, запись о заказе не изменится. Автору же, похоже, надо для конкретных User_Id высчитывать условия, получая их из БД.

Мои знания по основам реляционных БД включают в себя первичные и внешние ключи для связи с др. таблицами, но таблица рассматривается, как набор взаимно независимых кортежей. Может быть в конкретных БД есть механизмы для обхода этого, но это уже конкретная тема. Если механизмов нет, или не знаешь, как обойти, то может стоит подумать о др. структуре.
0
25 / 0 / 0
Регистрация: 11.12.2019
Сообщений: 232
13.12.2022, 20:11  [ТС]
Beltar, я сделал, вы немного помогли, но всеже доработал свой же код

Добавлено через 9 минут
D1973, логика в том, что я не программист, а по образованию финансист, но так сложилась судьба, что 17 лет работаю с базой на PervasiveSQL, готовая программа, в которой ограниченные возможности, а у начальства требований хоть отбавляй. со временем я из возможных списков которые выгружала программа в TXT и с помощью Фокспро делал то что от меня требовали... и тут судьба свела меня с одним человеком который предложил попробовать писать на Delphi, показав мне некие примеры.... и с помощью форума я коечто для себя и не только сделал, _ да Криво, да Не ГРАМОТНО, но до этого мои коллеги просто работали в Excele и не пойму как делились этими файлами и плодили их столько, что никто потом понять не мог, что и к чему

пототму не судите строго, когда я задаю вопрос и не всегда понимаю о чем вы пишете и осуждаете мой код (потому что он не мой) , я просто леплю конструктор ЛЕГО из того что ктото выкинул когдато сюда.. собираю по деталькам
0
25 / 0 / 0
Регистрация: 11.12.2019
Сообщений: 232
13.12.2022, 20:26  [ТС]
krapotkin,
опишу, что же я пишу
за основу взята база ACCESS. есть гос программа по обслуживанию пристарелых людей или людей без ОМЖ.
они собирают комплект доков, и обращаються с заявлением... (вся процедура которую проводят спецы после, делаеться вручную) потому я решил чтото наваять, когда я только начинал, не думал что все нкастолько сложно, и столько всяких нюансов.... потому у меня и стоьлько вопросов к форумчанам

краткое описание функций программы:

1 - заносят основные данные по человеку
2 - выбор категории (пенсионер, инвалид ...)
3 - выбор услуг за какими обращаеться заявитель
4 - указываеться перечень документов
5 - добавляеться члены семьи, если таковы есть
6 - заносяться доходы (и здесь вот интересная штука, запросы делаю я ручками из тех списков что они мне дают, конвертирую в xml, отправляю в соответствующие органы и ответы потоми печатаю ) - это мне еще предстоит сделать в программе, выгрузку из базы в xml определенного формата)
7 - расчет услуг (в зависимости от дохода 1 - безплатно, 2 - платно, 3 - смешанно) и здесь как раз этот нюанс по которому я обратился... есть 2 услуги (домашний уход за ... и транспортные услуги), так вот, - если они одновременно назначены, то транспортные не зависимо не от чего - безплатное, если по отдельности, то тогда в зависимости от дохода
8 - выгрузка решений в печатные формы в WORD, почему именно сюда? не знаю

ВОТ ТАКАЯ ВОТ БЕДА

ниже скриншот формы
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,681
Записей в блоге: 21
14.12.2022, 12:57
ну, как ни крути, но если вы даже чуть чуть собираетесь разрабатывать, вам нужно знать базовые вещи
например, шаблоны проектирования БД
если прямо совсем кратко -
1)таблица - это список неких примерно или точно однородных (обладающих схожими свойствами) сущностей
2)каждая сущность соответственно - запись таблицы
3)у каждой записи каждой таблицы должно быть УНИКАЛЬНОЕ поле - КЛЮЧ, по которому ОДНОЗНАЧНО можно найти эту запись
в зависимости от используемой БД обычно такое поле имеет тип счетчик, автоинкремент, serial, или GUID.
если автоматический тип, то БД сама заполняет его, если например GUID, то нужно написать немного кода, чтобы генерировать его, если значение не задано.
4)если какое-то свойство сущности может принимать несколько значений из списка, то эти значения скорее всего есть отдельная сущность, и требует своей таблицы - обычно ее называют справочник
5) если в какой-то таблице есть значение из справочника, то вместо самого значения в поле хранят ключ записи из справочника, ведь по ключу можно вытянуть всю нужную запись. Т.е. одной записи подходит только одна строка справочника.
6) Но если у вас есть таблица документов и таблица людей, то у каждого человека может быть несколько документов, и один документ может быть у нескольких людей. В этом случае вам нужна таблица связей - в каждой записи - код человека и код документа. поэтому по коду человека можно найти все документы и взять их уже из документов, и наоборот.
7) прочтите краткое введение в SQL любого автора. Оно хоть и краткое, но не на пару абзацев.

Теперь на примерах
- Если у вас есть категории пенсионер, инвалид - то это справочник категорий (пенсионер, инвалид, боярин и т.д.)
- Если у вас есть услуги - то (см. пункт 6) нужен справочник услуг и таблица люди-услуги где перечисляется каждая пара человек+услуга
при вставке записи в эту таблицу мы назначаем услугу конкретному человеку,
в момент назначения нужно проверять, сколько у него теперь услуг и какие, и соответственно заполнять запись в таблице начислений+оплат нужной суммой
все это должно происходить на сервере БД, не на клиенте
- Если у вас есть члены семьи, то они лежат в той же таблице но существует таблица связей, где обе ссылки - на одну и ту же таблицу люди.
и совет - скорее переносите все на другую БД.
Access - это база для одного человека. Вашей информацией должны располагать много людей просто по характеру информации. Это может быть Firebird, Postgres или тот же MS SQL server
но не Access точно.
Когда вы уже сделаете слишком много, переезд будет все сложнее.
1
 Аватар для Beltar
1048 / 489 / 41
Регистрация: 05.05.2022
Сообщений: 3,439
14.12.2022, 17:02
- Если у вас есть услуги - то (см. пункт 6) нужен справочник услуг и таблица люди-услуги где перечисляется каждая пара человек+услуга
при вставке записи в эту таблицу мы назначаем услугу конкретному человеку,
в момент назначения нужно проверять, сколько у него теперь услуг и какие, и соответственно заполнять запись в таблице начислений+оплат нужной суммой
все это должно происходить на сервере БД, не на клиенте
А он так и сделал. Фигово будет, если правила изменятся, и всю таблицу надо будет пересчитать.
Проблема с вычислениями на сервере БД в том, что какой-то сложный код там реализовать сложнее. В случае Access как-то и смысла говорить о сервере нет. Ну и если подумать, то дельфовый TDataSet - это имитация SQL, например, лукап-поля, - это замена Left Join, а сам по себе факт вычислений чего-то там перед записью в БД означает лишь то, что какие-то данные вы хотите пересчитать 1 раз сразу, а не каждый раз при загрузке. Типовой пример, моя первая софтина, которая пошла в эксплуатацию, для ведения паспортов средств измерения, там были дата поверки и период поверки, дату след. поверки можно посчитать при сохранении, можно каждый раз при загрузке, а можно сразу. Где будет этот расчет, в принципе, неважно, если угроза того, что кто-то будет править данные напрямую в БД несущественна. Но, в принципе, можно пойти до конца, сделать трехзвенную архитектуру и работать с хранимыми процедурами. И гордиться тем, что все правильно.

А в остальном программирование мне очень сильно напоминает древний номер команды КВН из Татарстана:
- Как будет по-татарски "вперед"?
- Алга.
- А как "назад"?
- У нас понятия "назад", мы разворачиваемся и алга!

Какие-то чувачки, у которых Delphi и TDataSet не было, или они не хотели о них знать, т. к. писали только на Ц-плас-плас, в Вижуал Студио, не имели ничего, кроме SQL в базе, и потому делали так, как могли. У них такое "алга". По-другому, неправильно. До момента, когда MS скажет, что правильно, тогда разворачиваемся и "алга".
0
25 / 0 / 0
Регистрация: 11.12.2019
Сообщений: 232
14.12.2022, 20:36  [ТС]
0
25 / 0 / 0
Регистрация: 11.12.2019
Сообщений: 232
14.12.2022, 20:38  [ТС]
только вот я из справочников не записываю в основную базу идентификаторы данных, а сами данные
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.12.2022, 20:38

Фильтр запроса Query по данным из ListBox
Здравствуйте! Вот такая проблема: Имеется база данных BDE Paradox. В форме размещены 2 ListBox (см. скрин), в которых из одного строки...

Фильтр DirectShow. Query Interface выдает E_NOINTERFACE
В общем, ситуация следующая: есть самописный transfer-фильтр DirectShow, который успешно регистрируется в системе и с помощью которого...

Error answering callback query: [400] Bad Request: query is too old and response timeout expired or query ID is invalid
Я понимаю, что это бывает тогда, когда бот не запущен, а кто то нажимает на инлайн кнопку. АнсверКолбэкКверри не успевает прийти...

Фильтр таблицы Power Query обычным выпадающим списком
Здравствуйте. Мне требуется создать автоматизированный файл обновления таблицы Power Query (далее - PQ) для коллег, которые, ну...

Поиск совпадений
Добрый день может кто сможет подсказать Задача в следующем происходит добавление строки в dgv и при enter надо проверять если такое...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
Текстовый слайдер с нумерацией страниц и кроссбраузерность.
russiannick 18.07.2026
Один мой друг написал текстовый слайдер с нумерацией страниц. Сегодня я расскажу как он умудрился подружить его с кроссбраузерностью. Очевидно сложно угодить с шириной каждому браузеру. Один крадет. . .
Грибы - это мемы, дерево - это человек. Применение микоризной модели к теории меметики Докинза.
anaschu 18.07.2026
Меметический изоморфизм теории «всего»: Грибная сукцессия как модель эволюции идей Докинза Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а универсальную. . .
Грибы - это корпорации, деревья - это государства. Механизм массонского захвата власти
anaschu 18.07.2026
Макроэкономический изоморфизм теории «всего»: Грибная сукцессия как модель транснационального капитализма Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а. . .
Расчёт периметра прямоугольника по координатам вершин
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Вычислить периметр прямоугольника, заданного координатами своих вершин на плоскости. Решение: Создан документ со следующими. . .
Подсчёт частоты трёхбуквенных слов в тексте
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Выясните, сколько раз в предложенном тексте встречается каждое трехбуквенное слово. Решение: Создан документ с единственным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru