Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2013, 20:53   #21
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ид можно держать в массиве, индекс которого соответствует индексу строк стринггрида
Цитата:
а ADOQurty нет?
В общем-то не ADOQuery, а провайдер. Там еще есть фишки, которые не катят через ADO

PS

По моему разделитель должен соответствовать установкам винды. У меня получилось #25.07.2013# средствами ADO. Но лучше через параметры
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 18.08.2013 в 21:01.
Аватар вне форума Ответить с цитированием
Старый 18.08.2013, 21:06   #22
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
#25.07.2013#
БД это не проглотит. Потому я меняю глобальный DateDelimiter, чего не рекомендую делать.
Человек_Борща вне форума Ответить с цитированием
Старый 18.08.2013, 22:26   #23
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Да, на счет #25.07.2013# точно напутал, перемкнуло
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.08.2013, 22:31   #24
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

А вот такой багз:
Код:
const
  Req = 'UPDATE Calendar SET Calendar.State = 1 WHERE (Calendar.ID = ":MyID") AND (Calendar.Day = :CellDate)';
...
    DBQuerty.Parameters.ParamByName('MyID').Value := Grid.Cells[0, Grid.Row];
    DBQuerty.Parameters.ParamByName('CellDate').Value := FormatDateTime('dd/mm/yyyy', d);
где
Код:
    DBQuerty.Parameters.ParamByName('MyID').Value := Grid.Cells[0, Grid.Row];
явл. строковым параметром, но ADOQuerty не проглатывает т.к. не может найти параметр MyID.
Человек_Борща вне форума Ответить с цитированием
Старый 18.08.2013, 22:42   #25
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А ID какое? Если числовое, то не прокатит. Если символьное, то это не баг, кавычки не надо, ADO само их проставит
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.08.2013, 08:47   #26
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

насчёт "багэ" Аватар уже высказался (я полностью с ним согласен, на 146%)

но ещё хочу добавить:
Цитата:
Сообщение от Человек_Борща
Код:
DBQuerty.Parameters.ParamByName('CellDate').Value := FormatDateTime('dd/mm/yyyy', d);
Вы извращаете идею использования параметров.
Суть в том, что Вы записываете параметер нужного Вам типа. Например, DateTime. И Вам уже НЕ НУЖНО применять конвертацию параметра в строку, рискуя получить баг несоответствия региональных установок (где число, где месяц, где год, чем они разделены и т.д. и т.п.
т.е. в вашем случае должно быть примерно так:
Код:
const
  Req = 'UPDATE Calendar SET Calendar.State = 1 WHERE (Calendar.ID = :MyID) AND (Calendar.Day = :CellDate)';
...
    DBQuerty.Close;
    DBQuerty.Parameters.ParamByName('MyID').Value := Grid.Cells[0, Grid.Row]; 
                        {если Cells возвращает строку, то, возможно, понадобится даже ... .Value := StrToInt(Grid.Cells[0, Grid.Row])}

    DBQuerty.Parameters.ParamByName('CellDate').Value := d;
...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.08.2013, 20:16   #27
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Serge_Bliznykov, в запросе вместо ID теперь FIO, т.е. это строка.
Цитирую себя:
Цитата:
Но все же как быть, если не Grid.Row?
Сделал по имени.

в таблице Workers поле FIO ключевое, без совпадений и пустот
в таблице Calendar, поле FIO ключевое, с совпадениями, без пустых строк
Связка: 1-ко-многим
Вопрос был про вставку даты, как параметра.
Ну и новый код:
Код:
const
  ReqU = 'UPDATE Calendar SET Calendar.State = 1 WHERE (Calendar.FIO = :MyID) AND (Calendar.Day = :CellDate)';
  ReqA = 'INSERT INTO Calendar ( FIO, [Day], State) VALUES (:MyID, :CellDate, 1)';
var
  sText, sID: string;
  d: TDate;
  Day: Word;
  iCol, iRow: Integer;
begin
  iCol := Grid.Col;
  iRow := Grid.Row;
  sText := Grid.Cells[iCol, iRow];
  sID := Grid.Cells[0, iRow];
  Day := StrToInt(Grid.Cells[iCol, 0]);
  D := RecodeDay(fDate, Day);
  if (sText <> EmptyStr) and ((sText = 'Íå áûë') or (sText = 'Íå èçâåñòíî')) then
  begin
    DateSeparator := '/';
    DBQuerty.SQL.Clear;
    DBQuerty.SQL.Text := ReqU;
    DBQuerty.Parameters.ParamByName('MyID').Value := sID;
    DBQuerty.Parameters.ParamByName('CellDate').Value :=d; //FormatDateTime('dd/mm/yyyy', d);

    DBQuerty.ExecSQL;
    DateSeparator := '.';
    if (DBQuerty.ExecSQL <> 0) then
      BuildGrid;
Возникает ошибка: Несоответствие типов данных в условии отбора.
кроме форматирования, другого решения я не нашел.
Может есть какие-то настройки, чтобы параметры правильно подставляло.
Человек_Борща вне форума Ответить с цитированием
Старый 19.08.2013, 20:36   #28
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

покажите, пожалуйста, структуру таблицы Calendar (тип поля Day интересует)...


p.s.
Цитата:
Код:
    DBQuerty.ExecSQL;
    DateSeparator := '.';
    if (DBQuerty.ExecSQL <> 0)
обратите внимание, вы выполнение запроса вызываете ДВАЖДЫ. И, если для данного update это не столь важно, то для Insert Вы рискуете дважды вставить одну и ту же запись...

Последний раз редактировалось Serge_Bliznykov; 19.08.2013 в 20:38.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.08.2013, 20:40   #29
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Структура таблицы календаря
Цитата:
обратите внимание, вы выполнение запроса вызываете ДВАЖДЫ. И, если для данного update это не столь важно, то для Insert Вы рискуете дважды вставить одну и ту же запись...
О это глюк. Спасибо.
Человек_Борща вне форума Ответить с цитированием
Старый 19.08.2013, 20:53   #30
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
d: TDate;
Не нравится мне этот тип данных и не пользуюсь им. Попробуйте TDateTime. И с fDate повнимательней - чтобы в нем время нулевое было
Кстати Calendar.Day - не помню насчет Day - возможно нужно Calendar.[Day] (а может и нет)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 19.08.2013 в 21:04.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Календарь sid1868 Общие вопросы Delphi 1 04.05.2011 19:55
Календарь sid1868 Помощь студентам 1 04.05.2011 19:16
БД и календарь torrtik БД в Delphi 2 10.04.2011 19:14
Календарь krikaved Общие вопросы Delphi 2 25.03.2010 22:58
Календарь ruavia3 Microsoft Office Excel 6 16.04.2009 15:32