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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.04.2014, 14:00
Аватар для spawn-1212
spawn-1212 spawn-1212 вне форума
Прохожий
 
Регистрация: 03.12.2012
Сообщения: 25
Репутация: 10
Восклицание Что использовать? подскажи пжл

В программировании новичок.
Попросили написать программу для облегчения другим.
Подключаюсь к БД Oracle через ADOConnection, в DBGrid вывожу список лиц, получивших карточки (ну там организовал поиск). При двойном клике в DBGride по "Человеку", в ListBox подтягивается список, полученных карточек, типо
ААА001-009
БББ010-013
и т.п.
При щелчке по нужной строке, например 1 она раскладывается в Edit1=ААА001 и Edit2=ААА009
Вопрос как организовать или что использовать, чтобы при нажатии на Кнопку1, выполнялся запрос перебрать значения всего диапозона ААА001-009(т.е. ААА001, ААА002, ААА003, ..., ААА009) с колонкой Number, таблицы Lugi.
Я могу проверить только значение Edit1 и Edit2, а как промежуток между ними не знаю, подскажите пожалуйста.
Код:
ADOQuery2.Sql.Text:='Select Number From Lugi Where Number = '+QuotedStr(Edit1.Text)+'';
Ответить с цитированием
  #2  
Старый 29.04.2014, 14:02
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Есть такая штука, как параметры запроса.
Код:
TParam
В запросе
Код:
select * from table where field = :value

Жмём F1, вводим TParam.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 29.04.2014, 14:06
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от spawn-1212
При щелчке по нужной строке, например 1 она раскладывается в Edit1=ААА001 и Edit2=ААА009
Вопрос как организовать или что использовать, чтобы при нажатии на Кнопку1, выполнялся запрос перебрать значения всего диапозона ААА001-009(т.е. ААА001, ААА002, ААА003, ..., ААА009) с колонкой Number, таблицы Lugi.
Я могу проверить только значение Edit1 и Edit2, а как промежуток между ними не знаю, подскажите пожалуйста.
Код:
ADOQuery2.Sql.Text:='Select Number From Lugi Where Number = '+QuotedStr(Edit1.Text)+'';
Примерно как-то так:
Код:
ADOQuery2.Sql.Text := 'Select Number From Lugi Where Number >= ' + QuotedStr(Edit1.Text) + ' and Number <= ' + QuotedStr(Edit2.Text);
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
spawn-1212 (30.04.2014)
  #4  
Старый 30.04.2014, 09:09
Аватар для spawn-1212
spawn-1212 spawn-1212 вне форума
Прохожий
 
Регистрация: 03.12.2012
Сообщения: 25
Репутация: 10
Восклицание

А можете подсказать как реализовать проверку по количеству символов, т.е. в LisTBox1 меня есть номера ААА001-002 и ААА0001-0002 (6 и 7 значные). При щелчке на один из диапозонов, они должны заносится в Edit1 и Edit2, как сделать проще чем у меня?
У меня так :
Код:
procedure TForm1.ListBox2Click(Sender: TObject);
begin
Edit3.Text:=ListBox2.Items[ListBox2.ItemIndex]; 
  {6-знаков}
  //серия
Edit3.SelStart:=0;   //устанавливаю курсор перед нулевым символом
Edit3.SelLength:=3;  //выделяем 3 символа
Edit3.CopyToClipboard; //копируем выделенное
Edit4.Clear;
Edit4.PasteFromClipboard; //втавляем в Edit4 
  //начало номеров
Edit3.SelStart:=4;   //устанавливаю курсор перед 4 символом
Edit3.SelLength:=3;  //выделяем 3 символа
Edit3.CopyToClipboard; //копируем выделенное
Edit5.Clear;
Edit5.PasteFromClipboard; //втавляем в Edit5
  //конец номеров
Edit3.SelStart:=8;   //устанавливаю курсор перед 8 символом
Edit3.SelLength:=3;  //выделяем 3 символа
Edit3.CopyToClipboard; //копируем выделенное
Edit6.Clear;
Edit6.PasteFromClipboard; //втавляем в Edit6
Edit7.Text:=Edit4.Text+Edit5.Text; // собираем в одно
Edit8.Text:=Edit4.Text+Edit6.Text; // собираем в одно

{7-знаков}
  //серия
Edit3.SelStart:=0;   //устанавливаю курсор перед нулевым символом
Edit3.SelLength:=3;  //выделяем 3 символа
Edit3.CopyToClipboard; //копируем выделенное
Edit9.Clear;
Edit9.PasteFromClipboard; //втавляем в Edit4
 //начало номеров
Edit3.SelStart:=4;   //устанавливаю курсор перед 4 символом
Edit3.SelLength:=4;  //выделяем 4 символа
Edit3.CopyToClipboard; //копируем выделенное
Edit10.Clear;
Edit10.PasteFromClipboard; //втавляем в Edit10
  //конец номеров
Edit3.SelStart:=9;   //устанавливаю курсор перед 9 символом
Edit3.SelLength:=4;  //выделяем 4символа
Edit3.CopyToClipboard; //копируем выделенное
Edit11.Clear;
Edit11.PasteFromClipboard; //втавляем в Edit11
Edit12.Text:=Edit9.Text+Edit10.Text;// собираем в одно
Edit13.Text:=Edit9.Text+Edit11.Text;// собираем в одно
end;
Минусы моего кода:
1. Много полей: 6знаков в Edit1 и Edit2, 7знаков в Edit3 и Edit4
2. Приходится делать две кнопки для 6знаков и 7 знаков
а хотелось чтобы одна кнопка
3. В Editы постоянно вставляются символы, т.е. потом кто будет пользоваться программой нужно смотреть куда тыкать.

Спасибо разобрался

Цитата:
Сообщение от poli-smen
Примерно как-то так:
Код:
ADOQuery2.Sql.Text := 'Select Number From Lugi Where Number >= ' + QuotedStr(Edit1.Text) + ' and Number <= ' + QuotedStr(Edit2.Text);
А если необходим список которые не найдены?

Последний раз редактировалось M.A.D.M.A.N., 30.04.2014 в 11:50.
Ответить с цитированием
  #5  
Старый 30.04.2014, 11:39
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от spawn-1212
А если необходим список которые не найдены?
Это точно законченное предложение?
Ответить с цитированием
  #6  
Старый 30.04.2014, 11:55
Аватар для spawn-1212
spawn-1212 spawn-1212 вне форума
Прохожий
 
Регистрация: 03.12.2012
Сообщения: 25
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Это точно законченное предложение?
Т.е. в Edit1 ААА001, а в Edit2 ААА050 - это диапозон, полученных карточек неким лицом, при нажатии на конпку выполняется код:
Код:
ADOQuery2.Sql.Text := 'Select Number From Lugi Where Number >= ' + QuotedStr(Edit1.Text) + ' and Number <= ' + QuotedStr(Edit2.Text);
Результат: DBGrid отображает список карточек, которые уже сдали. А необходимо увидеть список которые не сдали. Как это сделать подскажи пжл?
Тяжело в полученном результате искать отсутствующую карточку, например выдано карточек 50, а найдено 49, какая отсутствует? сидеть перебирать? не вариант

Последний раз редактировалось spawn-1212, 30.04.2014 в 12:00.
Ответить с цитированием
  #7  
Старый 30.04.2014, 12:49
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от spawn-1212
Т.е. в Edit1 ААА001, а в Edit2 ААА050 - это диапозон, полученных карточек неким лицом, при нажатии на конпку выполняется код:
Код:
ADOQuery2.Sql.Text := 'Select Number From Lugi Where Number >= ' + QuotedStr(Edit1.Text) + ' and Number <= ' + QuotedStr(Edit2.Text);
Результат: DBGrid отображает список карточек, которые уже сдали. А необходимо увидеть список которые не сдали. Как это сделать подскажи пжл?
Тяжело в полученном результате искать отсутствующую карточку, например выдано карточек 50, а найдено 49, какая отсутствует? сидеть перебирать? не вариант
Просто нужно инвертировать условие вот так:
Код:
ADOQuery2.Sql.Text := 'Select Number From Lugi Where NOT (Number >= ' + QuotedStr(Edit1.Text) + ' and Number <= ' + QuotedStr(Edit2.Text) + ')';
Или так:
Код:
ADOQuery2.Sql.Text := 'Select Number From Lugi Where Number < ' + QuotedStr(Edit1.Text) + ' OR Number > ' + QuotedStr(Edit2.Text);
И ещё - пользуйся, как советовал M.A.D.M.A.N., параметрами запроса - с ними удобнее работать.
Ответить с цитированием
  #8  
Старый 30.04.2014, 12:53
Аватар для spawn-1212
spawn-1212 spawn-1212 вне форума
Прохожий
 
Регистрация: 03.12.2012
Сообщения: 25
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Просто нужно инвертировать условие вот так:
Код:
ADOQuery2.Sql.Text := 'Select Number From Lugi Where NOT (Number >= ' + QuotedStr(Edit1.Text) + ' and Number <= ' + QuotedStr(Edit2.Text) + ')';
Или так:
Код:
ADOQuery2.Sql.Text := 'Select Number From Lugi Where Number < ' + QuotedStr(Edit1.Text) + ' OR Number > ' + QuotedStr(Edit2.Text);
И ещё - пользуйся, как советовал M.A.D.M.A.N., параметрами запроса - с ними удобнее работать.
Если делать как ты пишешь в 1 и 2 случае выйдут все карточки, не те которые в диапозоне, а все которые в БД/
Объясню: В БД забиты карточки ААА001-ААА999, на конкретном лицеА у меня выходит диапазон ААА001-ААА050(карточки которые выдали ему), мне нужны карточки которые не входят в этот диапазон.

Последний раз редактировалось spawn-1212, 30.04.2014 в 13:07.
Ответить с цитированием
  #9  
Старый 30.04.2014, 13:04
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от spawn-1212
Если делать как ты пишешь в 1 и 2 случае выйдут все карточки, не те которые в диапозоне, а все которые в БД
Нет, выйдут не все которые в БД, а все кроме тех которые в диапозоне, что и требовалось.
Ответить с цитированием
  #10  
Старый 30.04.2014, 13:41
Аватар для spawn-1212
spawn-1212 spawn-1212 вне форума
Прохожий
 
Регистрация: 03.12.2012
Сообщения: 25
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Нет, выйдут не все которые в БД, а все кроме тех которые в диапозоне, что и требовалось.
неа ты сам разберись
Select Number выбрать столбец 'Number'
From Lugi из таблицы 'Lugi'
Where NOT (Number >= ' + QuotedStr(Edit1.Text) + ' and Number <= ' + QuotedStr(Edit2.Text) + ')'; когда нет диапазона с номера из Edit1 до номера из Edit2.
Причём когда я пробую в программе она подвисает, оно и понятно большое количество записей, а через SQL Navigator 6.2.0 = выбираются 250 , потом ещё и ещё.. чего-то не так надо делать
Ответить с цитированием
  #11  
Старый 30.04.2014, 14:27
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от spawn-1212
неа ты сам разберись
Select Number выбрать столбец 'Number'
From Lugi из таблицы 'Lugi'
Where NOT (Number >= ' + QuotedStr(Edit1.Text) + ' and Number <= ' + QuotedStr(Edit2.Text) + ')'; когда нет диапазона с номера из Edit1 до номера из Edit2.
Причём когда я пробую в программе она подвисает, оно и понятно большое количество записей, а через SQL Navigator 6.2.0 = выбираются 250 , потом ещё и ещё.. чего-то не так надо делать
Похоже что ты не точно описал задание. Карточки они могут быть либо "выданы", либо "невыданы" (третьего не дано). Таким образом если этот запрос возвращает "выданные" карточки, тогда его инверсия должна выдать "невыданные" карточки.

Если же речь идёт о том что есть некий логический диапазон, а в нём имеется поддиапазон выданных карточек и остальные карточки в этом диапазоне не выданы (которые и нужно получить), то делать нужно чуть посложнее (здесь я организовал запрос через параметры):
Код:
ADOQuery2.SQL.Text := 'SELECT Number FROM Lugi WHERE Number >= :n1 AND Number <= :n2 AND Number < :n3 AND Number > :n4';
ADOQuery2.Parameters.ParamByName('n1').Value := 'ААА001'; // Начало диапазона
ADOQuery2.Parameters.ParamByName('n2').Value := 'ААА999'; // Конец диапазона
ADOQuery2.Parameters.ParamByName('n3').Value := 'ААА001'; // Начало поддиапазона
ADOQuery2.Parameters.ParamByName('n4').Value := 'ААА050'; // Конец поддиапазона
Ответить с цитированием
  #12  
Старый 30.04.2014, 16:02
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

poli-smen делает выводы на основании того что вы сказали ранее. Если вы не предоставили полной информации, то и ответ будет неверен.
Первое с чего надо было начать, но тут не прозвучал это вопрос, а собственно структурку данных ваших для лица и карточек нарисуйте. После прочтения этого опуса, у меня возникло стойкое асчусчение, что у вас структура данных неверная.
Далее, так как у вас несколько нестандартный кодификатор, то давайте определимся еще по следующим вопросам:
1. Значение Number генерируются строго по возрастанию?
2. В каком собственно диапазоне эти значения. Всегда в 6-значном формате, или это частный случай.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #13  
Старый 06.05.2014, 13:40
Аватар для spawn-1212
spawn-1212 spawn-1212 вне форума
Прохожий
 
Регистрация: 03.12.2012
Сообщения: 25
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
poli-smen делает выводы на основании того что вы сказали ранее. Если вы не предоставили полной информации, то и ответ будет неверен.
Первое с чего надо было начать, но тут не прозвучал это вопрос, а собственно структурку данных ваших для лица и карточек нарисуйте. После прочтения этого опуса, у меня возникло стойкое асчусчение, что у вас структура данных неверная.
Далее, так как у вас несколько нестандартный кодификатор, то давайте определимся еще по следующим вопросам:
1. Значение Number генерируются строго по возрастанию?
2. В каком собственно диапазоне эти значения. Всегда в 6-значном формате, или это частный случай.
1. Да, значение Number генерируются по возрастанию
2. Диапазон значений либо 6 знаков: ААА001, либо 7 знаков БББ0001
Ответить с цитированием
  #14  
Старый 06.05.2014, 13:48
Аватар для spawn-1212
spawn-1212 spawn-1212 вне форума
Прохожий
 
Регистрация: 03.12.2012
Сообщения: 25
Репутация: 10
Смущение

Цитата:
Сообщение от poli-smen
Похоже что ты не точно описал задание. Карточки они могут быть либо "выданы", либо "невыданы" (третьего не дано). Таким образом если этот запрос возвращает "выданные" карточки, тогда его инверсия должна выдать "невыданные" карточки.

Если же речь идёт о том что есть некий логический диапазон, а в нём имеется поддиапазон выданных карточек и остальные карточки в этом диапазоне не выданы (которые и нужно получить), то делать нужно чуть посложнее (здесь я организовал запрос через параметры):
Код:
ADOQuery2.SQL.Text := 'SELECT Number FROM Lugi WHERE Number >= :n1 AND Number <= :n2 AND Number < :n3 AND Number > :n4';
ADOQuery2.Parameters.ParamByName('n1').Value := 'ААА001'; // Начало диапазона
ADOQuery2.Parameters.ParamByName('n2').Value := 'ААА999'; // Конец диапазона
ADOQuery2.Parameters.ParamByName('n3').Value := 'ААА001'; // Начало поддиапазона
ADOQuery2.Parameters.ParamByName('n4').Value := 'ААА050'; // Конец поддиапазона
Может мы друг друга не поняли.
Попытаюсь объяснить: например, Иванову А.А. выдали на руки карточки с диапазоном ААА050-ААА100 и забили их в БД таблица"Карточки". Этот диапазон выводится с помощью запроса в Edit1.Text:=ААА050 и Edit2.Text:=ААА100. Допустим за сегодня Иванов заполнил свои 12 карточек и сдал, тогда их забивают в БД таблица "Учёт".
Так вот если я выполняю запрос
Код:
ADOQuery2.Sql.Text := 'Select Number From Lugi Where Number >= ' + QuotedStr(Edit1.Text) + ' and Number <= ' + QuotedStr(Edit2.Text);
то выводятся те карточки, которые он уже сдал, а нужно чтобы выпадал список из тех карточек которые у него на руках.
Ответить с цитированием
  #15  
Старый 06.05.2014, 13:49
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от spawn-1212
2. Диапазон значений либо 6 знаков: ААА001, либо 7 знаков БББ0001
А от чего зависит число знаков? Почему нельзя сделать чтобы все были, например, 7-значные? Вот например это ААА001 и это ААА0001 будет считаться как одно и то же?
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter