Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

ACCESS SQL UPDATE в зависимости от даты   Найти похожие ветки 

 
pr20122012   (2012-05-03 20:29) [0]

Здравсвуйте!
Вот такой вопрос: есть БДAccess  и я к ней обращаюсь через SQL. Все столбцы в таблице у меня имеют тип данных String. (возможно, это важно???) Мне необходимо обновить данные в одном из столбцов в зависимости от даты в другом. Я пишу SQL запрос:
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add("Update Mytable set C= "+Chr(39)
  +"Поздно"+Chr(39)+" Where D<25/04/2012");
  ADOQuery1.ExecSQL;

Не  работает! Т.е. значение в столбце C не обновляет!  Перерыл инет – так и не понял, как же его сравнить чтоб корректно работало все????


 
Медвежонок Пятачок ©   (2012-05-03 20:33) [1]

Не обновляет - не значит что не работает.
Здесь скорее наоборот - если бы обновлял - был бы повод сказать что не работает.


 
Медвежонок Пятачок ©   (2012-05-03 20:38) [2]

кстати, сколько будет 25 разделить на 4, а затем еще на 2012?


 
Inovet ©   (2012-05-03 21:02) [3]

Используй параметры.


 
Anatoly Podgoretsky ©   (2012-05-04 07:05) [4]

> pr20122012  (03.05.2012 20:29:00)  [0]

> Все столбцы в таблице у меня имеют тип данных String.

Нет у тебя поля даты
А сам запрос тоже безграмотный


 
pr20122012   (2012-05-04 11:30) [5]

Переписал через параметр вот так:

 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add("Update Orders set C= "+Chr(39)
 +"22222"+Chr(39)+" Where D<:Data1");
 ADOQuery1.Parameters.ParamValues["Data1"]:=Now;
ADOQuery1.ExecSQL;

Все равно не работает!
:((((


 
pr20122012   (2012-05-04 11:36) [6]

Да, если я меняю тип столбца на дата/время в Access то вроде как все работает! Но у меня тип - текстовый.... Можно ли в рамках запроса преобразовывать значения из В в дату????


 
Anatoly Podgoretsky ©   (2012-05-04 12:02) [7]

> pr20122012  (04.05.2012 11:30:05)  [5]

А у тебя в базе есть записи с датами, которые еще не наступили, и с
точностью до миллисекунды как минимум


 
Anatoly Podgoretsky ©   (2012-05-04 12:03) [8]

> pr20122012  (04.05.2012 11:36:06)  [6]

Раз тип текстовый тогда не приходится говорить об датах и использовать их
как дату


 
Медвежонок Пятачок ©   (2012-05-04 12:29) [9]

Все равно не работает!

да неужели?

select * from orders where d < :dte

тоже "не работает"? ничего не возвращает?

а может все таки работает и то и другое?
просто апдейтить и возвращать нечего?


 
pr20122012   (2012-05-04 14:22) [10]

Спасибо всем за ответы!
Вот в таком варианте оно работает:


...
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add("Update Orders set C= "+Chr(39)
 +"22222"+Chr(39)+" Where  Cdate(D)< Cdate(:Data1)");
 ADOQuery1.Parameters.ParamValues["data1"]:=DateToSQLStr;
 ADOQuery1.ExecSQL;
...

function DateToSQLStr: String ;
  var
     d, m, y : word ;
begin
  DecodeDate(Now-1, y, m, d) ;
  Result := IntToStr(d)+"/"+IntToStr(m)+"/"+IntToStr(y) ;
end;


Но при этом возникла новая проблема! Если какое-либо значение отсутствие (NULL или "") то Cdate() не выполняется и возвращает ошибку.

Вопрос: есть ли конструкция IF или что-то подобное, чтобы иметь дело только с датами без пустот


 
Медвежонок Пятачок ©   (2012-05-04 14:36) [11]

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

where <условие на дату>
 and <поле не нулл>
 and <поле не пустая строка>

но это все равно не спасет от неизбежных ошибок конвертации строки в дату (в поле таблицы)


 
pr20122012   (2012-05-04 14:38) [12]

Пытаюсь вот такое но не работает
ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add("Update Orders set C= "+Chr(39)
 +"22222"+Chr(39)+" Where  IsNull(Cdate([D]),0)< Cdate(:Data1)");
 ADOQuery1.Parameters.ParamValues["data1"]:=DateToSQLStr;
 ADOQuery1.ExecSQL;


 
Медвежонок Пятачок ©   (2012-05-04 14:42) [13]

не работает - значит у него выходной.

зы а почему в параметре строка, а в изнулле по дефолту число?


 
MsGuns ©   (2012-05-04 14:45) [14]

Вашу "задачку" можно режить "чистым" SQL преобразуя (CAST/CONVERT - читаем внимательно Jetsql40.chm) в числа дату-образец и строковую дату-поле  и сравнивая уже их (числа).
Но в целом будет задница ибо [11]


 
pr20122012   (2012-05-04 14:51) [15]

Медвежонок Пятачок

Ну это я так :))))
правда про другому тоже ничего не меняется

ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add("Update Orders set C= "+Chr(39)
 +"11"+Chr(39)+" Where  IsNull(Cdate([d]),"+Chr(39)+"0"+Chr(39)+")< Cdate(:Data1)");
 ADOQuery1.Parameters.ParamValues["data1"]:=DateToSQLStr;
 ADOQuery1.ExecSQL;


 
MsGuns ©   (2012-05-04 14:52) [16]

Проблему "пустышек" решать с использованием where и, если нужно, UNION с запросом выборки "пустышек" и замены их на некоторую фикс.дату:

SELECT F1,F2,F3,MAYINVALIDDATE,F4
 where MAYINVALIDDATE is not null and MAYINVALIDDATE<>""
UNION
SELECT F1,F2,F3,"31/12/2012" as MAYINVALIDDATE,F4
 where MAYINVALIDDATE is null or MAYINVALIDDATE=""

Результирующий запрос:
SELECT A.* from
  (SELECT F1,F2,F3,MAYINVALIDDATE,F4
    where MAYINVALIDDATE is not null and MAYINVALIDDATE<>""
  UNION
  SELECT F1,F2,F3,"31/12/2012" as MAYINVALIDDATE,F4
    where MAYINVALIDDATE is null or MAYINVALIDDATE="") A
WHERE <вот тут выражение сравнения дат>



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.09 c
6-1259931784
Kanaris
2009-12-04 16:03
2013.03.22
Как реализовать "ретранслятор" запросов через сокеты?


15-1343378205
Phoenix_
2012-07-27 12:36
2013.03.22
Delphi -> Java/Android


3-1280927465
Наталья
2010-08-04 17:11
2013.03.22
Работа с NavigatorButtons в cxGrid


2-1339658598
Lamer6666
2012-06-14 11:23
2013.03.22
DragAndDrop из браузера в приложение


15-1351492587
Olga.Duplenko
2012-10-29 10:36
2013.03.22
Работа для классных профессионалов-разработчиков





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский