Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.12.2015, 18:20
ЧайниКсНосикоМ ЧайниКсНосикоМ вне форума
Прохожий
 
Регистрация: 11.12.2015
Сообщения: 23
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Как сложить числа из двух столбцов БД?

Код:
begin
 qry1.Close; //Деактивируем запрос в качестве одной из мер предосторожности
 qry1.SQL.Clear; // Стираем любой предыдущий запрос
 qry1.SQL.Add('SELECT [Поле1], [Поле2], [Поле3]+[Поле4] AS summa FROM [таблица1] WHERE [Поле1]=:p1 AND [Поле2]=:p2'); //Назначаем свойству SQL текст "SELECT [Поле1], [Поле2], [Поле3]+[Поле4] AS summa FROM [таблица1] WHERE [Поле1]=:p1 AND [Поле2]=:p2"
 qry1.Parameters.ParamByName('p1').Value := edt1.text;
 qry1.Parameters.ParamByName('p2').Value := edt2.text;
 qry1.Open; //Выполняем запрос и открываем набор данных
end;
вот такой код у меня пока получился, но мне нужно чуть чуть другое. Мне бы хотелось чтобы по нажатию кнопки в базе данных происходил поиск строк в которых поле1 соответствовало бы едит1, а поле2 = едит2(это сделать получилось) и затем производилось вычетание из поля 3 поле4(поле3-поле4) в каждой строке отдельно и результату каждой строки присвоивалась бы буква, там a, b, c и так далее. я не прошу написать мне готовый код(хотя не отказался бы), хотелось бы хотя бы узнать какие запросы или какие компоненты для этого мне использовать, я бы может почитал и разобрался в этом вопросе.
Вложения
Тип файла: rar 111щ0.rar (759.9 Кбайт, 2 просмотров)
Ответить с цитированием
  #2  
Старый 12.12.2015, 19:00
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,502
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

Нифига не понял что надо. Вот это что-ли:
Код:
select
  case
    when field3-field4 = 1 then 'a'
    when field3-field4 = 2 then 'b'
    when field3-field4 = 3 then 'c'
    else 'x'
  end as some_new_field_name
from Table
where
  field1=:f1 and field2 = :f2
Ответить с цитированием
  #3  
Старый 12.12.2015, 20:38
ЧайниКсНосикоМ ЧайниКсНосикоМ вне форума
Прохожий
 
Регистрация: 11.12.2015
Сообщения: 23
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

lmikle, у меня есть база данных, я вроде слепил для нее программу в которой есть кнопка. По нажатии этой кнопки программа должна сначала найти строки, где поле1 = edt1.text, а поле2=edt2.text. Затем в найденных строках программа должна из поля3 вычесть поле4 и присвоить буквы, поле3-поле4:=a (это в первой строке), затем сделать то же самое во второй строке и поле3-поле4:=b и так далее. Делается всё это через ADOQuery.

Последний раз редактировалось ЧайниКсНосикоМ, 12.12.2015 в 20:40.
Ответить с цитированием
  #4  
Старый 13.12.2015, 08:07
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,502
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

непонятно вот это:
Цитата:
из поля3 вычесть поле4 и присвоить буквы, поле3-поле4:=a (это в первой строке), затем сделать то же самое во второй строке и поле3-поле4:=b и так далее
Если из одного поля вычесть другое, то получится какой-то результат, и это не обязательно буква 'a' (кстати, вычитать строки нельзя, вычитать можно только цифры). Ну пусть в поле 3 у тебя 10, а в поле 4 - 7 (это, типа, в первой строке). Ну получил ты в результате вычитания некоторое значение (3 в данном примере). И каким образом программа должна понять, что это значение надо сконвертировать именно в 'a'?

ЗЫ. По поводу фильтрации - за нее отвечает секция запроса WHERE, написанная через параметры, ну это и в твоем первоначальном коде есть...

ЗЗЫ. Код "свиснул" где-то и теперь хочешь, что бы тебе его под твою задачу переделали?..
Ответить с цитированием
  #5  
Старый 13.12.2015, 08:42
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,714
Репутация: 52347
По умолчанию

Кажется я понял, что хочет автор. Похоже это просто ряд уравнений типа:
a := 1 + 1
b := 2 + 2
но тут есть одна сложность - для генерации буковок нужен порядковый номер записи в выборке. К тому-же в английском алфавите 26 букв, что тоже надо учесть в запросе. Для многих SQL серверов получить порядковый номер не проблема, но у каждого свой метод. А вот если сервера нет, тогда надо делать хитрый запрос генерирующий номер.
Итак, правильно ля я понял задачу?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 13.12.2015, 15:04
ЧайниКсНосикоМ ЧайниКсНосикоМ вне форума
Прохожий
 
Регистрация: 11.12.2015
Сообщения: 23
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Кажется я понял, что хочет автор. Похоже это просто ряд уравнений типа:
a := 1 + 1
b := 2 + 2
но тут есть одна сложность - для генерации буковок нужен порядковый номер записи в выборке. К тому-же в английском алфавите 26 букв, что тоже надо учесть в запросе. Для многих SQL серверов получить порядковый номер не проблема, но у каждого свой метод. А вот если сервера нет, тогда надо делать хитрый запрос генерирующий номер.
Итак, правильно ля я понял задачу?

Ну тут я уже не уверен правильно ли я Вас понял ))))
Ну вообщем да, опустим действие с поиском строк и получим
для строки один а=поле3-поле4
для строки два b=поле3-поле4
и так далее.
Ну соответственно цифры для первого примера беруться из строки 1 для второго из строки 2 из одних и тех же полей.
Ответить с цитированием
  #7  
Старый 13.12.2015, 15:08
ЧайниКсНосикоМ ЧайниКсНосикоМ вне форума
Прохожий
 
Регистрация: 11.12.2015
Сообщения: 23
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
ЗЗЫ. Код "свиснул" где-то и теперь хочешь, что бы тебе его под твою задачу переделали?..
код я не свистнул, в этом коде только поиск нужных строк реализован, а функция сложения почему то не работает, он вместо 2+2=4 считает 2 и 2 будет 22.
Ответить с цитированием
  #8  
Старый 13.12.2015, 21:09
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,502
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

Цитата:
Сообщение от ЧайниКсНосикоМ
код я не свистнул, в этом коде только поиск нужных строк реализован, а функция сложения почему то не работает, он вместо 2+2=4 считает 2 и 2 будет 22.

Дык, небось поля текстовые, а для нормального сложения они должны быть цифрами. А складывает так потому, что это, явно, Access. Для нормального сложения надо либо менять тип полей, либо в запросе делать конвертацию типов.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
  #9  
Старый 14.12.2015, 17:26
ЧайниКсНосикоМ ЧайниКсНосикоМ вне форума
Прохожий
 
Регистрация: 11.12.2015
Сообщения: 23
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Дык, небось поля текстовые, а для нормального сложения они должны быть цифрами. А складывает так потому, что это, явно, Access. Для нормального сложения надо либо менять тип полей, либо в запросе делать конвертацию типов.
Спасибо за пояснения, сделал поля числовыми складывает теперь, а можно ли теперь присвоить каждому ответу в каждой строке свою букву, первая строка скажем а, вторая b, третья c и так далее?
Ответить с цитированием
  #10  
Старый 14.12.2015, 18:43
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,502
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

База Access?
На нормальной СУБД точно можно, а как в этом Access'е такое сделать - надо доку курить...
Ответить с цитированием
  #11  
Старый 14.12.2015, 20:28
ЧайниКсНосикоМ ЧайниКсНосикоМ вне форума
Прохожий
 
Регистрация: 11.12.2015
Сообщения: 23
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
База Access?
На нормальной СУБД точно можно, а как в этом Access'е такое сделать - надо доку курить...
База Access, я так понимаю мне нужно через другую прогу бд создать или что?
Ответить с цитированием
  #12  
Старый 14.12.2015, 21:00
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,714
Репутация: 52347
По умолчанию

Можно и на акцесе, только как я сказал чуть ранее:
Цитата:
для генерации буковок нужен порядковый номер записи в выборке
В Акцесе такого встроенного метода нет, потому есть нестандартное решение:
Код:
select Chr(count(1)+64) as rn,
t1.val1,
t1.val2,
t1.val1 + t1.val2 as Res
from Таблица1 as t1
inner join Таблица1 as t2
on t1.id >= t2.id
group by t1.val1, t1.val2
переименуйте поля для своей таблицы и должно работать.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #13  
Старый 14.12.2015, 22:22
ЧайниКсНосикоМ ЧайниКсНосикоМ вне форума
Прохожий
 
Регистрация: 11.12.2015
Сообщения: 23
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Можно и на акцесе, только как я сказал чуть ранее:

В Акцесе такого встроенного метода нет, потому есть нестандартное решение:
Код:
select Chr(count(1)+64) as rn,
t1.val1,
t1.val2,
t1.val1 + t1.val2 as Res
from Таблица1 as t1
inner join Таблица1 as t2
on t1.id >= t2.id
group by t1.val1, t1.val2
переименуйте поля для своей таблицы и должно работать.
я так понимаю t1 t2 это как раз и есть поля? а val1 val2 это типа строки? просто мои знания sql ограничиваются одной книгой (((
Ответить с цитированием
  #14  
Старый 15.12.2015, 00:07
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,502
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

не, t1 и t2 - алиасы для таблиц. Как раз valX - это поля.

PS. В интернете что-то говорят о функции DCount, которая позволяет такое делать (получать последовательный номер записи). Поищи.
Ответить с цитированием
  #15  
Старый 15.12.2015, 18:06
ЧайниКсНосикоМ ЧайниКсНосикоМ вне форума
Прохожий
 
Регистрация: 11.12.2015
Сообщения: 23
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

PS. В интернете что-то говорят о функции DCount, которая позволяет такое делать (получать последовательный номер записи). Поищи.[/quote]

DCOUNT возвращает общее число строк (записей) базы данных, соответствующих указанным критериям поиска и содержащих числовые значения. не подходит данная функция (((
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:59.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2019

ВКонтакте   Facebook   Twitter