Пара вопросов по связке SQL и VB

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
mmt
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 25.12.2003 (Чт) 11:56
Откуда: Москва

Пара вопросов по связке SQL и VB

Сообщение mmt » 10.09.2004 (Пт) 11:39

Суть в следующем-
1. Ввводится две даты в диалоге VB, причем несмотря на установленный в свойствах формат yyyy-mm-dd эта зараза принимает произв. значения :( Сам дурак, знаю, но слишком давно не программировал, а на VB вообще никогда
2. Data Enviroment - command и текст запроса типа select * from table where date between перем1 and перем2 (см пункт1)
Иог - либо дата конвертится на dd-mm-gg и запрос пустой, либо при использовании string перменной и составлении запроса типа
{sql_string} где sql_string= select * from table where date between перем1 and перем2 выдает ошибку ...

ЗЫ Есть еще задача - вводится две даты и надо рассчитать кол-во раб. дней между ними. Календаря я не нашел, а с API не очень дружен пока. Мой удел SQL :(

Заранее спасибо за помощь и извинения за уровень вопросов.
Все страньше и страньше

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Re: Пара вопросов по связке SQL и VB

Сообщение gaidar » 10.09.2004 (Пт) 12:06

mmt писал(а):1. Ввводится две даты в диалоге VB, причем несмотря на установленный в свойствах формат yyyy-mm-dd эта зараза принимает произв. значения :( Сам дурак, знаю, но слишком давно не программировал, а на VB вообще никогда


Если дата не в нужном формате (это легко проверить с помощью строковых функций), то выводишь сообщение пользователю, пусть введет правильно (либо пишешь алгоритм преобразования, но это не лучший выход).


Data Enviroment - command и текст запроса типа select * from table where date between перем1 and перем2 (см пункт1)
Иог - либо дата конвертится на dd-mm-gg и запрос пустой, либо при использовании string перменной и составлении запроса типа
{sql_string} где sql_string= select * from table where date between перем1 and перем2 выдает ошибку ...



Можно и вот так. Допустим дата в формате yyyy-mm-dd, то:

Код: Выделить всё
select * from myTable where date >= "2004-01-01" and date <= "2004-02-01"


Я обычно так работаю с датами в MySQL.

Выбирает все, где поля даты от 1 января, до 1 февраля включительно.

Учти, что некоторые СУБД не поддерживают имя поля date, т.к. это ключевое слово, а в некоторых надо писать [date] или "date", чтобы оно как ключевое слово не рассматривалось.

Есть и извращенные системы, где надо обращаться к таблице обязательно указывая юзера (под которым соединение):

"Username"."myTable"."SomeField"

Ты ничего про СУБД не сказал, поэтому определенно ничего сказать не могу.
Последний раз редактировалось gaidar 10.09.2004 (Пт) 12:07, всего редактировалось 1 раз.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 10.09.2004 (Пт) 12:13

И мои 10 копеек

В случае с MSDE или SQL Server наверное
правильней будет сделать cast

Код: Выделить всё
cast(   ......   as datetime)

mmt
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 25.12.2003 (Чт) 11:56
Откуда: Москва

Сообщение mmt » 10.09.2004 (Пт) 12:14

select * from myTable where date >= "2004-01-01" and date <= "2004-02-01"
Это не совсем ответ. SQL я знаю, но.....
Как мне передать переменную в запрос?

Пробовал собирать запрос в строковую переменную и передавать - результат - ошибки али пустой ответ, при том, что синт. SQL все ок!

На форуме не нашел ничего(первым делом искал) подходящего
Все страньше и страньше

Olga
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 08.09.2004 (Ср) 8:49
Откуда: Москва

Сообщение Olga » 10.09.2004 (Пт) 13:01

Посмотри формат даты в базе и передавай в SQL в этом формате, можно воспользоваться простым преобразованием
strDay=Day(дата)
strMonth=Month(дата)
strYear=Year(дата),
а потом склеить нужным образом, если уж никак по другому не получается.

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 10.09.2004 (Пт) 13:19

mmt писал(а):
select * from myTable where date >= "2004-01-01" and date <= "2004-02-01"
Это не совсем ответ. SQL я знаю, но.....
передавать - результат - ошибки али пустой ответ, при том, что синт. SQL все ок!


Применительно к Access ( СУБД ты так ничего и не написал)

1. Для выборки интервала надо пользовать BETWEEN
2. Дату приведи к ам. формату #dd/mm/yyyy#

для MSDE см. выше

mmt
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 25.12.2003 (Чт) 11:56
Откуда: Москва

Сообщение mmt » 10.09.2004 (Пт) 13:34

Посмотри формат даты в базе и передавай в SQL в этом формате, можно воспользоваться простым преобразованием

Я так и делаю. Переменная data - тип string , значение '2001-01-01'
запрос след. select * from table where data>={data}
либо пустой ответ, либо ошибка - немогу преобразовать в формат даты.
Далее. производил на свет след. переменную data1 (string) cj значением запроса и пытался передать в sql запрос {data1} - опять не то :( Скорее всего где-то ошибка в синтаксисе передачи :(
Делается все через command и его свойства
Для выборки интервала надо пользовать BETWEEN

Одно и тоже.
Дату приведи к ам. формату #dd/mm/yyyy#

И что это даст?

ЗЫ MS SQL 2000 - вот с чем я работаю. Раньше спокойно обходился stored процедурами и Crystal Reports, а вот сейчас приспичило воспользоваться VB
Последний раз редактировалось mmt 10.09.2004 (Пт) 13:40, всего редактировалось 1 раз.
Все страньше и страньше

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 10.09.2004 (Пт) 13:38

mmt писал(а):Одно и тоже.
Дату приведи к ам. формату #dd/mm/yyyy#

И что это даст?



Давай всетаки для начала определимся с типом СУБД

Как я понял ты хочешь выполнить Command и на выходе
получить Recordset с данныи?

mmt
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 25.12.2003 (Чт) 11:56
Откуда: Москва

Сообщение mmt » 10.09.2004 (Пт) 13:49

Давай всетаки для начала определимся с типом СУБД

Как я понял ты хочешь выполнить Command и на выходе
получить Recordset с данныи?

Еще проще - по сути 2 агрегата count c разными условиями отбора.
Если еще точнее - есть огромная база на MS SQL со встроенным табличным календарем, в котором пробиты все праздники и т.д.
Нужно - ввести две даты и просчитать - сколько дней всего и сколько рабочих.
Можно конечно и как нить по другому, но бакорп. и календарь там здорово настроен и адаптирован под наши нужды + они далее определятся, что из базы им нужно еще и как обрабатывать.
Все страньше и страньше

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 10.09.2004 (Пт) 14:02

по выборке

Код: Выделить всё

SELECT  твои_поля1, твои_поля2,.....  FROM твоя_бд  WHERE  твое_полe  BETWEEN 
cast('2001.12.07' as datetime)
AND 
cast('2001.12.31' as datetime)


подойдет ? но думается лучше написать SP

BONUS!!!
см.http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_ca-co_2f3o.asp

mmt
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 25.12.2003 (Чт) 11:56
Откуда: Москва

Сообщение mmt » 10.09.2004 (Пт) 14:27

подойдет ? но думается лучше написать SP
Нет. Syntax error. Вопрос в том, что в этот запрос надо запихнуть не значения даты, а именно ПЕРЕМЕННУЮ типа date, али string получаемую из textbox.
То есть нечто вроде

SELECT твои_поля1, твои_поля2,..... FROM твоя_бд WHERE твое_полe BETWEEN
cast(data1 as datetime)
AND
cast(data2 as datetime)
где data1 и data2 вводятся пользователем из текстбокса
Может я неправильно использую подстановки типа {} ?
MSDN а у меня нет :(
Все страньше и страньше

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 10.09.2004 (Пт) 14:50

mmt писал(а):

SELECT твои_поля1, твои_поля2,..... FROM твоя_бд WHERE твое_полe BETWEEN
cast(data1 as datetime)
AND
cast(data2 as datetime)
где data1 и data2 вводятся пользователем из текстбокса


Мда....
ну ладно
собираем SQL запрос

чтото типа этого для Date

Код: Выделить всё
Public Function pCastDateToSQLDate(ByVal dDate As Date) As String
    pCastDateToSQLDate = " cast('" & Format$(dDate, "yyyy-mm-dd") & "' as datetime)"
End Function


ну и далее

Код: Выделить всё

....... твое поле  BETWEEN "   & pCastDateToSQLDate(dStart ) & " AND " & pCastDateToSQLDate(dEnd )





mmt писал(а):
MSDN а у меня нет :(

Теперь есть!
http://msdn.microsoft.com

P.S. В зависисммости от тип поля иногда надо учитывать минуты, сек...

mmt
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 25.12.2003 (Чт) 11:56
Откуда: Москва

Сообщение mmt » 10.09.2004 (Пт) 15:12

Похоже я сего то все таки не понимаю, чего очень простого :(

твое поле BETWEEN " & pCastDateToSQLDate(dStart ) & " AND " & pCastDateToSQLDate(dEnd )


Допустим, а что с этим дальше делать? Поднимаю connection - создаю command, дальше? В свойства command этот запрос не пройдет.
call тоже брыкается.

Я уже пытался в поля запроса command подставить текст запроса целиком через строковую переменную - хрен.

Спасибо огромное за попытку помочь - видно зелен совсем еще.
В VF проще, но там мешается создание dbf перед считкой из SQL.
Пойду лит-ру штудировать и описания читать
Все страньше и страньше

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 10.09.2004 (Пт) 15:23

mmt писал(а):Похоже я сего то все таки не понимаю, чего очень простого :(


Все должно работать

например для Command ( почему правда ты выбрал Command? ) примерно так

Код: Выделить всё
.......

Set cmd = New ADODB.Command

  With cmd
        Set .ActiveConnection = Conn
        .CommandText = твой SQl
        .CommandType  =adCmdText
     End With
.......
set   RS  =  cmd.Execute( ...... )



Метода отладки в твоем случае будет примерно такая :

Для начала поставь Бряк в том месте программы где сформируется строка
твоего SQL запроса

Затем Query Analyser проверь выполнение SQL строки твого запроса


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList