На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

Наиболее часто задаваемые вопросы:
Базы даных для начинающих. Первые шаги. Понятие о BDE.
Переход на клиент-сервер и начала ADO
Приёмы работы с BLOB (OLE/Memo) полями
Запросы и параметры или как избавиться от многих проблем. Проблемы с датами в запросах.
Нужели мне нужно устанавливать BDE? (или почему не работает программа на другом компьютере)
Модераторы: Bas, Rouse_
  
> Запрос по дате , Создание запроса по дате
    Уважаемые господа!
    Подскажите где у меня ошибка?
    База в файле Access через ADO.
    Создаю запрос с использованием DateEdit:
    ...
    SQL.Add('(Date='''+DateEdit.EditText+''')');
    ...
    компилируется нормально, но при обращении выдает ошибку "Несоответствие типов данных в выражении условия отбора".
      Используй параметры:
      ExpandedWrap disabled
        ...
        SQL.Add('(Date=:P_DATE)');
        SQL.ParamByName('P_DATE').Value = DateEdit.Date;
        ...
        Спасибо за такой быстрый ответ, но к сожалению не компилируется.
        Пишет, что не понимает "Parameters".
          Цитата nikvicfc, 8.10.04, 15:48
          SQL.Add('(Date='''+DateEdit.EditText+''')');

          ExpandedWrap disabled
             
            '(Date=#'+DateEdit.EditText+'#)'
            Уважаемый Master!
            При таком коде появляется ошибка: 'Дата содержит синтаксическую ошибку в выражении запроса '(Date=##)''.
              Цитата nikvicfc, 8.10.04, 15:48
              SQL.Add('(Date='''+DateEdit.EditText+''')');
              тут кажется ошибки нет, но дату нужно вводить соответствующим форматом. точно не помню но кажется YYYY-MM-DD.
              или как писал Chow через параметр.
                Если выдается именно (дословно) такая ошибка:
                Цитата
                'Дата содержит синтаксическую ошибку в выражении запроса '(Date=##)''

                то это значит, что DateEdit.EditText имеет пустое значение. Иначе было бы:
                'Дата содержит синтаксическую ошибку в выражении запроса '(Date=#чего-то там#)''
                  Цитата nikvicfc, 11.10.04, 09:04
                  'Дата содержит синтаксическую ошибку в выражении запроса '(Date=##)''.

                  В Accesse дату принято заключать в #.
                  Слово 'Date' - являеться зарезервированным во многих язаках, и если оно являеться именем поля то обычно надо брать в кавычки.
                    Уважаемые господа!
                    Отвечаю по-порядку.
                    И в таблице и в запросе формат dd.mm.yyyy, в таблице Access - краткий формат даты.
                    Первоначально сообщение об ошибке так и было написоно:'Дата содержит синтаксическую ошибку в выражении запроса '(Date=#11.10.2004#)''.
                    Название поля(Date) на самом деле иное.
                    Сообщение отредактировано: nikvicfc -
                      Цитата nikvicfc, 11.10.04, 13:01
                      '(Date=#11.10.2004#)''.

                      А так (Date=#11/10/2004#)

                      ExpandedWrap disabled
                        WHERE (((Заказы.ДатаРазмещения)=#7/26/1996#));
                        слово DATE зарезервировано стандартом ANSI/iso sql92.
                        Оно не допустимо к исползованию как имя поля.
                          Уважаемый Master!
                          Попробывал заменить везде, в том числе в системе разделители даты.
                          Кроме изменения разделителей ничего не изменилось. Ошибка та же:'Дата содержит синтаксическую ошибку в выражении запроса '(S_Date=#11/10/2004#)''.
                          Уважаемый Pigas, как я уже писал название поля на самом деле не Date, так написал на форуме для простоты.
                            Я работаю на Delphi 7 с использованием DBExpress Компонет.
                            И у меня тоже возникла ошибка при работе с датой, точнее передачей ее запросом.
                            Цитата

                            SQLQuery1.Close;
                            SQLQuery1.SQL.Text:='insert into history (now_date) values (:date)';
                            SQLQuery1.ParamByName('date').asDateTime:=date;
                            SQLQuery1.ExecSQL();

                            Он ругается : "dbExpress Error: Invalid Field Type"
                            В таблице поле типа: datetime
                            Также пытался Задавать параметр asDate. Все равно нивкакую.
                            Сообщение отредактировано: Mamont -
                              Какой текст запроса полностью?
                              (И все-же стоит использовать параметры - не надо ломать голову о формате представления того или иного типа. Тем более, что на другом компьютере могут быть другие настройки и ваша программа не будет работать)

                              Добавлено
                              Цитата Mamont, 12.10.04, 09:07
                              'insert into (now_date) values (:date)'

                              Где здесь указано имя таблицы?
                                Забыл сказать, что тоже компилирует он нормально, ошибка возникает воремя обращения.

                                Добавлено
                                Sorry
                                Цитата

                                SQLQuery1.SQL.Text:='insert into history (now_date) values (:date)';


                                Это я когда пост писал, забыл написать. В проге название таблицы присутствует.
                                  попробуи вместо asDateTime - Value. пусть сам с типом разберется
                                    Use a number (as date value) in SQL text.

                                    Example:

                                    'SELECT * FROM Country WHERE Date1=36736'

                                    Actually, a date value is a number.

                                    So, #07.29.2000# = 36736.

                                    If you find a date value as a number then can use FormatFloat function:

                                    str1=FormatFloat('#', Date) //str1='36736'

                                    Finally,

                                    Query1.SQL.Text= 'SELECT * FROM Country WHERE Date1=' + FormatFloat('#', Date);

                                    Note: This solution is properly work BDE, VB, MS-Access, MS-SQL.
                                      При следующем коде:
                                      Close;
                                      SQL.Clear;
                                      SQL.Add('SELECT *');
                                      SQL.Add('FROM TDAT');
                                      SQL.Add('WHERE S_DDT=#'+DE.EditText+'#');
                                      SQL.Add('ORDER BY sss');
                                      Open;
                                      ошибок синтаксиса программа не выдает, но странно себя ведет. Т.е. на некоторые даты реагирует как положено(10.20.2004, 20.10.2004), а все остальные просто не видит. Что за чертовщина?
                                      Кстати проблемма в синтаксисе была в том, что было не соответствие в маске ввода в Accesse и в компонентах Delphi. Везде в delphi подставил английскую маску даты и ошибка исчезла.
                                      Сообщение отредактировано: nikvicfc -
                                        Kobra, Пробовал и Value, результат тот же.
                                          Цитата nikvicfc, 12.10.04, 12:00
                                          (10.20.2004, 20.10.2004),

                                          Какой формат даты (DD.MM.YYYY or MM.DD.YYYY)? Да и что лежит в DE.EditText
                                            select * from mytable where mydate = ' + FormatFloat('#', DE.Date)
                                              Огромное всем спасибо!
                                              Решение моего вопроса следующее:
                                              SQL.Clear;
                                              SQL.Add('SELECT *');
                                              SQL.Add('FROM Table');
                                              SQL.Add('WHERE S_Date=dateValue("'+DateEdit.EditText+'")');

                                              Фильтрация выполняется как положено. " - двойные кавычки.
                                              Но видимо прав Show работать с параметрами надежнее, не нужно бутет подстраиваться на каждой машине. ;)
                                              Сообщение отредактировано: nikvicfc -
                                                Vmesto ispol'zovaniia AsDateTime ili AsDate neobhodimo ispol'zovat' AsSQLTimeStamp. Dlia preobrazovaniia peremennoj tipa TDateTime v TimeStamp ispol'zujte funkciiu DateTimeToSQLTimeStamp iz modulia SqlTimSt (neobhodimo vstavit' ssylku na etot modul' v sekciiu uses).
                                                A voobshche otvet na etot vopros nahoditsia na
                                                http://bdn.borland.com/article/0%2C1410%2C30078%2C00.html.
                                                Nadeius' u Vas s inglish vs? OK.
                                                IA prosto perev?l vkratce :)

                                                Добавлено
                                                У меня тоже возникает ошибка "dbExpress Error: Invalid Field Type"
                                                в режиме исполнения программы. Но не с полем Дата-Время, а даже и в таком коде:

                                                var FloatParam1, FloatParam2: Float;
                                                ...
                                                SQLDataSet1.Close;
                                                SQLDataSet1.ParamByName('FloatParam1').AsFloat := FloatParam1;
                                                SQLDataSet1.ParamByName('FloatParam2').AsFloat := FloatParam2;
                                                SQLDataSet1.Open;// <-----error :(

                                                Использую связку Delphi - Oracle
                                                  попробуи вместо AsFloat - Value. пусть сам с типом разберется
                                                    ExpandedWrap disabled
                                                      Close;
                                                      SQL.Clear;
                                                      SQL.Add('SELECT *');
                                                      SQL.Add('FROM TDAT');
                                                      SQL.Add('WHERE S_DDT=:d');
                                                      SQL.Add('ORDER BY sss');
                                                      parameters.ParseSQL(SQL.Text, true);
                                                      parameters.parambyname('d').value:=DE.EditText;
                                                      Open;
                                                      Я сталкивасля с проблемой использования Даты в SQL запросах:
                                                      Вот что накопал:

                                                      1) Для каждой БД (MySQL, MSSQL, Access, BDE) в запросе должен использоваться свой формат даты: MM.DD.YYYY, DD.MM.YYYY, MM/DD/YYYY и т.д. какой формат конкретно у какой БД я вычислял эксперементально
                                                      2) В запросе я всегда дату ставлю в одиночные кавычки: "SELECT * FROM tablename WHERE date='24.11.2004'"
                                                      "INSERT INTO tablename (id,date) VALUES(1,'24.11.2004')"
                                                      3) В программе на Delphi есть очень полезная функция: FormatDateTime
                                                      Рабочий пример:

                                                      dt:TDateTime;
                                                      Query_SQL:String;

                                                      dt := DateTimePicker1.DateTime;
                                                      Query_SQL := 'INSERT INTO ClientCatalog (Name, Id_Group, Address, Description, DateCreate) VALUES('+
                                                      ''''+Edit2.Text+''''+
                                                      ','+Edit4.Text+
                                                      ','''+Edit3.Text+''''+
                                                      ','''+Memo1.Text+''''+
                                                      ','''+FormatDateTime('MM.DD.YYYY',dt)+''')';
                                                      DataModule1.ADOQuery1.Active := False;
                                                      DataModule1.ADOQuery1.SQL.Clear;
                                                      DataModule1.ADOQuery1.SQL.Add(Query_SQL);
                                                      DataModule1.ADOQuery1.ExecSQL;

                                                      Проблемы исчезали...
                                                        Meverik, угу, спасибо тебе за наблюдения, только оформляй пожалуйста текст программы тегом code. Как - написано вверху в красной рамке.
                                                        M
                                                        Сообщения были разделены в тему "две проблемы при конвертации"
                                                        M
                                                        Сообщения были разделены в тему "две проблемы при конвертации"
                                                        Сообщение отредактировано: Song_Bot -
                                                        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                        0 пользователей:


                                                        Рейтинг@Mail.ru
                                                        [ Script execution time: 0,0592 ]   [ 15 queries used ]   [ Generated: 6.08.25, 10:20 GMT ]