Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/34: Рейтинг темы: голосов - 34, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 25

Редактирование записи в БД (с процедурой изменения в SQL Server)

10.12.2015, 00:53. Показов 7238. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.Пытаюсь написать клиент-серверное приложение на Delphi + База данных (SQL Server). Раньше подобного не разрабатывала, параллельно изучаю и просматриваю свои старые разработки на Delphi с Access.

В программе будет справочник, который можно пополнять. Уже сделала удаление и добавление записей (с проверками на ввод), запросы хранятся в SQL Server, информация берется из одной таблицы. Использую также доп.библиотеку EhLib (т.к. разрабатывать начинала по учебнику).

Помогите, пожалуйста, сделать кнопку Изменить.
Удалось пока сделать: Запускаем справочник, отображаются данные (из таблицы БД в SQL Server): Код товара, наименование, ставка пошлины. Выбираю нужную позицию в таблице, нажимаю кнопку Изменить, появляется форма. На ней расположила EditEh (3шт.), в которых отображаются соответствующие значения выбранной строчки из таблицы. На этой же форме Есть кнопки Сохранить и Отмена.
Здесь и возникла проблема..
1.Кнопка Отмена. Здесь сначала просто прописала закрытие формы. Попробовала изменить значение, перешла на другую ячейку, потом нажала Отмену, но изменения сохранились. Не знаю как правильно нужно было решать проблему, сделала так:прописала все тоже закрытие формы редактирования, потом загрузила повторно таблицу(т.е. на экране появляется то, что было и до попытки что-то изменить). Вроде как работает, но, думаю, что это неверное решение проблемы. Что посоветуете?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TRedactorVED.SpeedButton2Click(Sender: TObject);
begin
RedactorVED.Close;
with DModuleSTZ.ControlQueryVED do
    begin
      Close;
      SQL.Clear;
      SQL.Add('select TNVED.id_TNVED, TNVED.kod_TNVED, TNVED.name_TNVED, TNVED.stavka_TNVED FROM TNVED');
      SQL.Add('ORDER BY name_TNVED, kod_TNVED');
      Open;
    end; 
end;
2.Кнопка Изменить. Здесь я уже не знала как делать. Смотрела на форуме, там предлагалось использовать Modified, Post. Сделала под себя, вышло так:
Delphi
1
2
3
4
5
6
7
8
9
procedure TRedactorVED.SpeedButton1Click(Sender: TObject);
begin
 if DModuleSTZ.ControlQueryVED.Modified then
 begin
 DModuleSTZ.ControlQueryVED.Post;
 RedactorVED.Close;
 ShowMessage('Изменения сохранены');
 end;
end;
Пробовала менять данные, кнопка Сохранить реагирует только после перехода на другую ячейку (только после этого фиксируется изменение в таблице). Так же должно быть или я что-то не так поняла? Проверки (на ввод одинаковых значений, недопустимые символы и т.д. как в кнопке Добавить) еще не делала, т.к. возник другой вопрос.
Я же делаю клиент-серверное приложение, процедуры добавления и удаления создавала в SQL Server, может нужно тоже создавать там процедуру для изменения записей (UPDATE) или можно продолжать такой способ, который делаю сейчас?
Если нужно делать через SQL Server, то хочу попросить помощи, т.к. пробовала изначально там и возникли проблемы. Очень надеюсь, что кто-нибудь поможет.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.12.2015, 00:53
Ответы с готовыми решениями:

При сохранению записи с формы процедурой SQL Server, срабатывает триггер, но без показа сообщеня
Здравствуйте! Имеется пустая форма, на которую я ввожу данные и клацаю по кнопке "Сохранить" Так вот, на эту кнопку повешена...

Запись данных в таблицу из текстбоксов формы процедурой MS SQL Server
Здравствуйте! Каким образом можно записать значения в таблицу (база MS SQL Server) из текстбоксов на форме? Имеется хранимая процедура MS...

MS SQL Server Manager Объект изменения БД
Народ, подскажите как сделать или литературу или терминологию по которой можно найти ответ на следующий вопрос: Занимаюсь разработкой...

6
12 / 12 / 7
Регистрация: 09.12.2015
Сообщений: 191
10.12.2015, 01:01
какие ошибки, почитайте Осипова, там все понятно написано
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
10.12.2015, 07:53
Цитата Сообщение от AloneWolf Посмотреть сообщение
DModuleSTZ.ControlQueryVED
как догадаться, что это за компонент?
как узнать версию Delphi ?

по хорошему, проблема у всех чаще всего одна -
непонимание, какое волшебство связывает программу с SQL сервером

а там - простые SQL команды
хотите выбрать данные - пишете SELECT ...
хотите изменить - UPDATE ...
и т.д.
некоторые компоненты типа xxxTable сами формируют эти команды, но самым примитивным и тупым способом - читать-писать все подряд. поэтому в реальной жизни не должны использоваться.

вот select вы написали, а кто напишет update?
все, повторюсь, очень зависит от используемых компонентов
0
0 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 25
10.12.2015, 19:36  [ТС]
для krapotkin
1.Работаю в Delphi 7. Дополнительно устанавливала EhLib (в примере использовались компоненты этой доп. библиотеки: DBGridEh, DBEditEh и т.д.) и FastReport 4 (для создания экспорта отчета в excel и pdf).

2.Table нигде не использую.

3.Выше были коды для кнопок Отмена и Сохранить.
Первый вопрос по Отмене(выше в теме описано подробнее): в форме для редактирования меняю данные. далее, если перехожу по ячейкам, то изменение фиксируется в таблице. Когда для кнопки Отмена был прописан код с закрытием формы редактирования, то форма закрывалась, но записи все также оставались измененными. Выше писала код, которым пыталась решить проблему (чтобы вышло так: жму отмену - форма закрывается, таблица без изменений).
Код для Отмены + комментарии по компонентам
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TRedactorVED.SpeedButton2Click(Sender: TObject);
begin
RedactorVED.Close; //закрываю форму редактирования
with DModuleSTZ.ControlQueryVED do  // на DataModule (у меня DModuleSTZ) расположены ADOConnection и                                      
    begin                                          
      Close;          //все Query и Source. т.е. ControlQueryVED - это Query, расположенный на DataModule.    
      SQL.Clear;    //в нем запрос на вывод нужной информации из БД в DBGrid(вот Select)
      SQL.Add('select TNVED.id_TNVED, TNVED.kod_TNVED, TNVED.name_TNVED, TNVED.stavka_TNVED FROM TNVED');
      SQL.Add('ORDER BY name_TNVED, kod_TNVED');
      Open;
    end; 
end;
Получается ,что я просто после закрытия формы прописала загрузку информации из БД (т.е. изменения не зафиксированы).
Так ли я решаю проблему или нужно по другому?
Второй вопрос про кнопку Сохранить распишу потом,чтобы не путать.
0
0 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 25
11.12.2015, 18:19  [ТС]
Т.к. никто не отвечает, решила продолжить добивать кнопку Сохранить способом, который в другой теме использовали (через Modified и Post). В код выше добавила проверки (как в своей кнопке Добавить).

Возникла проблема с полем "ставка" на форме Редактирование записи. С кодом товара и наименованием все нормально, НО не получается изменить ставку на дробное число, если было целое (пока получилось менять с целого на целое, с дробного на целое).
Как и для Edit в окне добавления ставила здесь на поле ограничение по вводу символов (
Delphi
1
if not(Key in ['0'..'9', '.',#8]) then Key:=#0;
). Но когда пытаюсь ввести "." - ничего не вводится, цифры вводятся без проблем. КАК решить проблему?
Хотела как и в Edit для добавления поставить маску ###.#, там получилось и ограничение сделать, и дробные числа вводить и проверку (ставка не должна быть больше 100.0), а здесь не получается. При вводе чисел выбивает ошибку is not a valid floating point value.
В БД SQL Server для ставки товара стоит тип float.

Код кнопки "Сохранить" изменения с добавленными проверками.
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
 if DModuleSTZ.ControlQueryVED.Modified then
  begin
   if (RedactorVED.DBEditEh1.Text='') or (Trim(RedactorVED.DBEditEh2.Text)='') or (RedactorVED.DBEditEh3.Text='') or (RedactorVED.DBEditEh3.Text='   . ') then
   ShowMessage('Все поля должны быть заполнены!')
   else
   begin
    if (Length(RedactorVED.DBEditEh1.Text)<>10) then
    ShowMessage('Поле код ТН ВЭД должно содержать 10 символов!')
    else
    begin
      if (StrToFloat(RedactorVED.DBEditEh3.Text)>100.0) then
      ShowMessage('Ставка не должна превышать 100%!')
      else
      begin
   try
      DModuleSTZ.ControlQueryVED.Post;
      RedactorVED.Close;
      ShowMessage('Изменения сохранены');
   except
   ShowMessage('Это наименование товара уже есть в справочнике!');
   end;
 
      end;
    end;
   end;
  end;
end;
Миниатюры
Редактирование записи в БД (с процедурой изменения в SQL Server)  
0
0 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 25
11.12.2015, 20:02  [ТС]
Поменяла в "региональных настройках винды ->настройка формата->разделитель целой и дробной части " запятую на точку, после этого удалось ввести в поле Ставка дробное число

Осталось решить вопрос с ограничением знаков после запятой. Можно ли в SQL Server установить для float 1 знак после запятой (для decimal у меня получалось, есть ли такая возможность для float)?
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
11.12.2015, 20:27
интересно, все остальные тоже должны будут поменять настройки системы для функционирования вашей программы?
вам нужно создать глобальную переменную fs:TFormatSettings;
GetLocalFormatSettings(0,fs);
fs.decimalSeparator:='.';
и далее везде самостоятельно конвертировать float в строки для SQL, используя нужный формат
s:=FloatToStr(D, fs);
или
s:=format('update t1 set f1=%f where aaa=%d',[fltValue,intValue],fs);

хоть ответа и не было, предположу, что используются разные там ADO

приведенная простыня почти совсем не относится к заявленной теме. разделите все это на логические части
обычно нужно
1. показать таблицу с данными, отражающими ваш текущий запрос. для этого пусть например будет DbGridEh подключенный
2. выбрать одну строку, показать детали в отдельной форме, в которой
всякие Edit'ы ComboBox'ы и все такое
2.0. f:=CreateInputForm();
2.1. процедура LoadUserInterfaceFromDB
поля БД загружаются в контролы созданной формы f
2.2. процедура Validate
определяем, все ли нормально введено. и если все ок и нажата кнопка ок
то запускается
2.3. процедура SaveUserInputToDB
вот тут я должен сформировать текстовую строку
'Update myTable set f1=xxx, f2=yyy......'
и выполнить ее на сервере
после чего вернуться в свой грид да еще обновить его, чтоб сохраненная информация появилась в вашей таблице
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.12.2015, 20:27
Помогаю со студенческими работами здесь

Редактирование таблиц в БД MS SQL Server из Visual Studio
Уважаемые форумчане. Прошу помощи в решении следующей проблемы: в MS SQL Server есть БД, где имеются связанные в цепочку таблицы ...

Как использовать каскадные drop down list, которые после изменения записи запрещают редактирование?
Всем привет!! Я новичок в asp.net, прошу помощи. Моя проблема состоит в следующем: есть приложение, которое позволяет регистрировать...

[Microsoft][ODBC SQL Server Driver][SQL Server]Login failed- User: Reason: Not defined as a valid user of a trusted SQL Server connection
Login failed- User: Reason: Not defined as a valid user of a trusted SQL Server connection Вот такую ошибку выдает. В DSN...

Проблемы с редактирование Базы данных на SQL SERVER 2008
Если пытаешься что то изменить, всегда выдает такую ошибку:

Заполнение и редактирование формы Microsoft Access из SQL Server
Коллеги, доброго времени суток! Вопрос в следующем. Создал форму в Microsoft Access, добавил различные поля для заполнения и заполнил...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru