Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 117

/ вопрос решён /

Здравствуйте, эксперты!
я пытаюсь сформировать запросик на обновление.... но на форме присутствуют MaskEdit(6 шт) для даты. и при отсутствии вводимой информации на MaskEdit у меня появляеться ошибка 'несоответствие типов при отборе данных' как сформировать блоки проверки так чтобы условия проверялись все .при этом по ходу проверки выполнялось исключение из запроса той информации которой пользователь не ввел в MaskEdiT?
пробовала вот так:

Приложение:
  1.  
  2. if TryStrToDateTime(MaskEdit11.Text, d) then begin
  3. if TryStrToDateTime(MaskEdit12.Text, d) then begin
  4. if TryStrToDateTime(MaskEdit13.Text, d) then begin
  5. if TryStrToDateTime(MaskEdit14.Text, d) then begin
  6. if TryStrToDateTime(MaskEdit15.Text, d) then begin
  7. if TryStrToDateTime(MaskEdit16.Text, d) then begin
  8. tex:= 'update Zurnal set DataPost='+ QuotedStr(MaskEdit11.text)+',StatusKol='+ QuotedStr(Edit36.text)+',KemPereslano='+ QuotedStr(Edit38.text)+',Adress='+ QuotedStr(Edit40.text)+',Soderganie='+ QuotedStr(Edit41.text)+',Ispolnitel='+ QuotedStr(Edit42.text)+',Status='+ QuotedStr(ComboBox6.text)+',DataIspolnen='+ QuotedStr(MaskEdit15.text)+',Ident='+ QuotedStr(ComboBox10.text)+' where PorNomer='+QuotedStr(Edit37.Text)+'';
  9. tex1:='update RegistraKartochka set DataPovtOb ='+ QuotedStr(MaskEdit12.text)+',IndexPovtObr='+ QuotedStr(Edit44.text)+',Korrespondent='+ QuotedStr(LabeledEdit2.text)+', ';
  10. tex1:=tex1+'DataP='+ QuotedStr(MaskEdit13.text)+',IndexP='+ QuotedStr(Edit45.text)+',VidObr='+ QuotedStr(ComboBox7.text)+', ';
  11. tex1:=tex1+'FormulZayav='+ QuotedStr(Edit55.text)+',SocGruppa='+ QuotedStr(Edit46.text)+',Tematika='+ QuotedStr(ComboBox8.text)+', ';
  12. tex1:=tex1+'Rezol='+QuotedStr(Edit47.Text)+',Ispolnitel='+QuotedStr(Edit42.Text)+',DataN='+QuotedStr(MaskEdit11.Text)+',DataS='+QuotedStr(MaskEdit14.Text)+', ';
  13. tex1:=tex1+'DataI='+QuotedStr(MaskEdit15.Text)+',HodRassmotr='+QuotedStr(Edit49.Text)+',KontrMetka='+QuotedStr(Edit50.Text)+',DataOt='+QuotedStr(MaskEdit16.Text)+',RezRassmObras='+QuotedStr(ComboBox9.Text)+',OtmetkaOsnatii='+QuotedStr(Edit51.Text)+', ';
  14. tex1:=tex1+'DokumentPodsit='+QuotedStr(Edit52.Text)+',kolListov='+QuotedStr(Edit43.Text)+',naIspolnen='+QuotedStr(Edit48.Text)+'';
  15. tex1:=tex1+' where PorNomer='+QuotedStr(Edit37.Text)+'';
  16. end else begin
  17.  
  18. end;
  19. end else begin
  20.  
  21. end;
  22. end else begin
  23.  
  24. end;
  25. end else begin
  26.  
  27. end;
  28. end else begin
  29.  
  30. end;
  31. end else begin
  32.  
  33. end;


Танюшка Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задала: Танюшка (статус: Посетитель)
Вопрос отправлен: 25 ноября 2008, 12:47
Состояние вопроса: решён, ответов: 4.

Ответ #1. Отвечает эксперт: Шичко Игорь

Здравствуйте, Танюшка!
Я бы сделал немного по-другому.
Введ массив к примеру
m: array[1..10] of string;

На каждый MaskEdit прописал бы конструкцию типа: (пример)
if TryStrToDateTime(MaskEdit11.Text, d) then
m[1]:= ', DataOt= '+QuotedStr(MaskEdit16.Text);
else
m[1]:= '';

В результирующий запрос вставляем вместо ... + ', DataOt= ' + QuotedStr(MaskEdit16.Text) + ...
элемент ... + m[1] + ...

Удачи.

Ответ отправил: Шичко Игорь (статус: 9-ый класс)
Время отправки: 25 ноября 2008, 13:20

Ответ #2. Отвечает эксперт: Вадим К

Здравствуйте, Танюшка!
Страшный код. Не думали?
Я бы сделал так.
вначале бы завел нужное кол-во буленовским переменных, в которых хранил состояние проверки каждой даты

var c2:boolean;
begin
c2 := TryStrToDateTime(MaskEdit12.Text, d);
и так для всех дат.
теперь запрос. основная часть будет выглядеть где то так
tex:= 'update Zurnal set DataPost='+ /*врезано цензурой*/ set
'+MakePole(с2,'СDataPovtOb',MaskEdit12.text)+....+MakePole(.....);
/*врезано цензурой*/
то есть у нас есть маленькая функция, которая проверяет буленовскую пременную и если все хорошо, формирует строку.
function MakePole(ins:boolean; polename, poledata:string):string;
begin
  if ins then 
    result := polename + '+'+QuotedStr(poledata) + ', '
  else result := '';
end;
теперь замечание. Так как функция автоматически добавляет запятую в конец, то надо в конец запроса добавить ещё хотя бы одну запись ручками либо просто удалить лишнюю запятую.
Где то так...

З.Ы. три десятка Edit - это круто. Зачем?

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 25 ноября 2008, 13:27
Оценка за ответ: 5

Ответ #3. Отвечает эксперт: DNK

Здравствуйте, Танюшка!
Я думаю, проще по условиям сформировать части строк, а затем сложить полученные части. Перед началом проверок в части нужно занести пустые строки.

Приложение:
  1. if TryStrToDateTime(MaskEdit11.Text, d) and TryStrToDateTime(MaskEdit15.Text, d) then
  2. tex:= 'update Zurnal set DataPost='+ QuotedStr(MaskEdit11.text)+',StatusKol='+ QuotedStr(Edit36.text)+',KemPereslano='+ QuotedStr(Edit38.text)+',Adress='+ QuotedStr(Edit40.text)+',Soderganie='+ QuotedStr(Edit41.text)+',Ispolnitel='+ QuotedStr(Edit42.text)+',Status='+ QuotedStr(ComboBox6.text)+',DataIspolnen='+ QuotedStr(MaskEdit15.text)+',Ident='+ QuotedStr(ComboBox10.text)+' where PorNomer='+QuotedStr(Edit37.Text)+'';
  3. tex11 := '';
  4. tex12 := '';
  5. tex13 := '';
  6. tex14 := '';
  7. tex15 := '';
  8. tex16 := '';
  9. if TryStrToDateTime(MaskEdit11.Text, d) then
  10. tex11:='..........................';
  11. if TryStrToDateTime(MaskEdit12.Text, d) then
  12. tex12:='...........................';
  13.  
  14. //...................
  15.  
  16. if TryStrToDateTime(MaskEdit16.Text, d) then
  17. tex16:='...................................';
  18. tex1 := tex11+tex12+tex13+tex14+tex15+tex16;


Ответ отправил: DNK (статус: Студент)
Время отправки: 25 ноября 2008, 13:37

Ответ #4. Отвечает эксперт: Nasgool

Здравствуйте, Танюшка!
С такими запросами не работал и, пока не возникнет необходимости, разбираться в их сути не буду. Но общую проблему в алгоритме понял. У вас слишком громоздкая и трудная в понимании конструкция получилась.
К вашему приложению пример неверняка имеет мало отношения, но алгоритм должен быть понятен.
Учпехов.
С уважением, Nasgool.

Приложение:
  1. var
  2. text: String;
  3. begin
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10. end;


Ответ отправил: Nasgool (статус: 2-ой класс)
Время отправки: 25 ноября 2008, 16:58
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 25 ноября 2008, 17:51; участников в обсуждении: 3.
Танюшка

Танюшка (статус: Посетитель), 25 ноября 2008, 16:05 [#1]:

вопрос к Вадиму К:
а почему в базу если удалить дату с эдита у меня сохраняет вот такое число:29.12.1899
я делала вот так:

tex:= 'update Zurnal set DataPost='+MakePole(c,MaskEdit11.text)+' DataIspolnen='+MakePole(y,MaskEdit15.text);
tex:=tex+' StatusKol='+ QuotedStr(Edit36.text)+',KemPereslano='+ QuotedStr(Edit38.text)+',Adress='+ QuotedStr(Edit40.text)+',Soderganie='+ QuotedStr(Edit41.text)+',Ispolnitel='+ QuotedStr(Edit42.text)+',Status='+ QuotedStr(ComboBox6.text)+',Ident='+ QuotedStr(ComboBox10.text)+' where PorNomer='+QuotedStr(Edit37.Text)+'';


изменила немного функцию:
function TForm7.MakePole(ins:boolean; poledata:string):string;
begin
if ins then
result := QuotedStr(poledata) + ', '
else result :='';
end;

c := TryStrToDateTime(MaskEdit11.Text, d);
y := TryStrToDateTime(MaskEdit15.Text, d);

так почему такое странное число заносит?
Вадим К

Вадим К (статус: Академик), 25 ноября 2008, 16:13 [#2]:

а потому что это число - это как раз есть дата, соответствующая числу 0. Так как скорее всего такой даты не может быть, то простонадо прорверять на равенство 0. Ну где то так
c := TryStrToDateTime(MaskEdit11.Text, d) and d > 0;
Галочка "подтверждения прочтения" - вселенское зло.
Танюшка

Танюшка (статус: Посетитель), 25 ноября 2008, 16:25 [#3]:

я тут еше решила проверить что выводит запрос , если переменная Y возращает false так вот что получается:
update Zurnal set DataPost='01.10.2008', DataIspolnen= StatusKol='1',KemPereslano='',Adress='',Soderganie='',Ispolnitel='',Status='Жалоба(предложение) требует дальнейшего рассмотрен',Ident='Ж ' where PorNomer='5'

и как оно работает я не понимаю т.к. DataIspolnen= всему что ниже!!! О_о
Вадим К

Вадим К (статус: Академик), 25 ноября 2008, 16:34 [#4]:

не совсем понял, что у Вас там происходит, но посмотрите на функцию, которую вы модифицировали.
Если данные есть, то в результате в запрос попадает две запятые. Сравните исправленную функцию
изменила немного функцию:
function TForm7.MakePole(ins:boolean; poledata:string):string;
begin
if ins then
result := QuotedStr(poledata)
else result :='';
end;
Галочка "подтверждения прочтения" - вселенское зло.
Танюшка

Танюшка (статус: Посетитель), 25 ноября 2008, 16:48 [#5]:

можно я вам последний вопрос задам!
где у ва в вашей функции 2 запятые?
я убрала просто с вашей функции название поля... и все !
т.е. как я разобралась в ней запятая ставится (у вас) если значение ins=true
иначе функция возращает else result :='';
так где 2 запятые?
Вадим К

Вадим К (статус: Академик), 25 ноября 2008, 16:53 [#6]:

Одна запятая ставиться если ins=true, вторая запятая появляется в Вашем запросе.
Рекомендую делать по простому - поставьте на форму Memo де нибудь и выводите туда результирующий запрос либо где то в лог.
Галочка "подтверждения прочтения" - вселенское зло.
Nasgool

Nasgool (статус: 2-ой класс), 25 ноября 2008, 17:18 [#7]:

В ответе №3 я допустил ошибку:
if TryStrToDateTime(MaskEdit11.Text, d) then text := 'какой либо текст' + QuotedStr(MaskEdit1.text);
if TryStrToDateTime(MaskEdit12.Text, d) then text := text + 'какой либо текст' + QuotedStr(MaskEdit2.text);
if TryStrToDateTime(MaskEdit13.Text, d) then text := text + 'какой либо текст' + QuotedStr(MaskEdit3.text);
if TryStrToDateTime(MaskEdit14.Text, d) then text := text + 'какой либо текст' + QuotedStr(MaskEdit4.text);
if TryStrToDateTime(MaskEdit15.Text, d) then text := text + 'какой либо текст' + QuotedStr(MaskEdit5.text);
if TryStrToDateTime(MaskEdit16.Text, d) then text := text + 'какой либо текст' + QuotedStr(MaskEdit6.text);
Вот так примерно
Танюшка

Танюшка (статус: Посетитель), 25 ноября 2008, 17:51 [#8]:

для Nasgool :
спасибо за ответ... хотя есть тут свои минусы .... но надеюсь пользователь дату стирать не будет!

31 января 2011, 20:03: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:56
Выполнено за 0.03 сек.