Тихая просьба о помощи

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Novichok$
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 04.11.2005 (Пт) 16:53

Сообщение Novichok$ » 16.11.2005 (Ср) 13:15

Rainbow писал(а):Dim bDoAction as Boolean
Код: Выделить всё
Select case Typ
     Case 1:
        bDoAction = НадоСейчасЗапускать1(reader)

     Case 2:
        bDoAction = НадоСейчасЗапускать2(reader)


     и так далее перечисляешь все свои типы и делаешь нужные вызовы.
End select
If (bDoAction) then
    делаешь опрос сервера   
end if



Вот присер моей функции НадоСейчасЗапускать6(reader)
Код: Выделить всё
Public Sub НадоСейчасЗапускать6()
    Dim Typ6connStr As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Parametrierungs DB.mdb;"
    Dim Typ6Connection As New OleDbConnection(Typ6connStr)
    Dim Typ6SelectQuery As String = "SELECT Abfr_Zeit.ServIndex,Abfr_Zeit.Typ,  Abfr_Zeit.Einmalig, Abfr_Zeit.Zeit  FROM Abfr_Zeit WHERE (((Abfr_Zeit.Typ)=6) AND ((Abfr_Zeit.Einmalig)=(SELECT MIN(Einmalig) FROM Abfr_Zeit WHERE [Einmalig] + [Zeit]  > Now )))"
    Dim Typ6Command As New OleDbCommand(Typ6SelectQuery, Typ6Connection)
    Dim Typ6Date As Date
        Typ6Connection.Open()
            Dim Typ6Reader As OleDbDataReader
            Dim StartParametr As OleDbDataReader

        Typ6Reader = Typ6Command.ExecuteReader()
            While Typ6Reader.Read()
                Typ6Date = (Typ6Reader.GetDateTime(2) + ", " + Typ6Reader.GetDateTime(3))
                StartParametr = Typ6Reader.GetDateTime(0)
            End While
                If Format(Date.Now, "dd.MM.yyyy hh:mm") = Format(Typ6Date, "dd.MM.yyyy hh:mm") Then
                        Start FTPlogin.exe with Parametr = StartParametr 'Eto Tolko primer
                End If
        Typ6Reader.Close()
        Typ6Connection.Close()
End Sub


Только мне не совсем понятно, нужно ли здесь:
Код: Выделить всё
If Format(Date.Now, "dd.MM.yyyy hh:mm") = Format(Typ6Date, "dd.MM.yyyy hh:mm") Then
                        Start FTPlogin.exe with Parametr = StartParametr 'Eto Tolko primer
                End If

И где вообще (в каком месте кода) должно происходить сравнение даты и времени или одного времени с текущим?
Внутри этой функуии или за ее пределами?

Novichok$
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 04.11.2005 (Пт) 16:53

б) на основании информации о расписании

Сообщение Novichok$ » 16.11.2005 (Ср) 13:24

Мы стобой отправляли сообщения одновременно : ))

отвечу коротко:
б) на основании информации о расписании
Те.е я думал сначала запрос на Тип сеанса,
а потом запрос на сремя следующего сенса.В Typ - 6 это выглядит так:
SELECT Abfr_Zeit.ServIndex,Abfr_Zeit.Typ, Abfr_Zeit.Einmalig, Abfr_Zeit.Zeit FROM Abfr_Zeit WHERE (((Abfr_Zeit.Typ)=6) AND ((Abfr_Zeit.Einmalig)=(SELECT MIN(Einmalig) FROM Abfr_Zeit WHERE [Einmalig] + [Zeit] > Now )))

Einmalig - однократно
Zeit - время

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 16.11.2005 (Ср) 14:47

Я чуть попозже посмотрю на код

Не надо делать разные запросы по разным типам. Надо сразу все вытащить. Это только увеличит производительность а на смысл не повлияет (все равно делаем Select Case и вызываем нужные процедуры для каждого из типов)

И еще поясни: вот этим запросом "SELECT MIN(Einmalig) FROM Abfr_Zeit WHERE [Einmalig] + [Zeit] > Now ))" ты что получаешь? - минимальное стартовое время? В принципе, проверку на то, что стартовое время находится в прошлом - это быстро и можно включить в "НадоСейчасЗапускать"
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 16.11.2005 (Ср) 14:49

ой, не дочитала. Einmalig -однократно.
Тогда я совсем ничего не понимаю....
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Novichok$
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 04.11.2005 (Пт) 16:53

Сообщение Novichok$ » 16.11.2005 (Ср) 15:48

Rainbow писал(а):И еще поясни: вот этим запросом "SELECT MIN(Einmalig) FROM Abfr_Zeit WHERE [Einmalig] + [Zeit] > Now ))" ты что получаешь? - минимальное стартовое время? В принципе, проверку на то, что стартовое время находится в прошлом - это быстро и можно включить в "НадоСейчасЗапускать"


Тип 6 - однократно, это когда тебе надо опросить сервер например 2 раза в году(или 5 раз или 7), допустим 17.05.2005 и 26.12.2005. Выборочная дата, этот тип не подходит под другие. Эту колонку можно назвать еще допустим "День" или "ЛюбойДень".

Этот тип опроса, наряду с "Ежедневно" самый простой, вернее ежедневно еще проще.

Теперь про SQL запрос. Этот выдается тебе время и дату следующего сеанса. Допустим из таблицы видно. что есть 26 серверов с опросом типа "6". Из них сегодня должны быть опрошены три. Этот запрос выбирает ближайший к Date.Now сеанс. Т.е. если сегодня 16.11.2005 13:30:00 и у меня есть три сервера с типом "6":
16.11.2005 15:30:00
16.11.2005 17:30:00
16.11.2005 20:30:00
то выбрано будет ближайшее к сейчас:
16.11.2005 15:30:00

В случае с типом "3" дата не нужна там ведь ежедневно, это означает что сравнивать у всех заптсей с типом "3" надо только время поэтому запрос будет выглядеть немного проще и в конце вместо Now будет стоять Time().


Мне тоже кажется, что можно делать только один запрос и выбирать все, тем более, там не так уж много. А потом работать с полями.

Тогда получается надо работать не с одномерным а с многомерным массивом. А я в них, как и во многом другом как говорится "плаваю".

Мой алгоритм выполнения этой задачи получается "Присметри". А ноовго не выдумаю. Каждый раз узнаю, что есть какие то новые способы и методы, о которых я даже не подозревал, или о которых у меня только смутно-интуитивное представление.

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 16.11.2005 (Ср) 16:12

Я пришла посмотреть код и написать пару замечаний. А ты пока попробуй осознать следующее:
Тогда получается надо работать не с одномерным а с многомерным массивом. А я в них, как и во многом другом как говорится "плаваю".

Представь, что начальник дал тебе на бумажке табличку с расписанием запусков проверок и тебе надо выяснить, надо ли сейчас запуска и для кого. Ну, и запустить, понятное дело! Что ты будешь делать?
1) Ты останавливаешь свой указательный палец на первой строке и начинаешь анализировать, что в ней написано, ползая пальцем по столбцам.
2) Первое, куда движется твой палец - это колонка с типом. Ты видишь, что там стоит тип 6.
3) "Так", - думаешь ты. "Это однократный запуск - надо посмотреть в колонку даты и в колонку времени, чтобы выяснить, не сейчас ли тот самый момент, когда надо запускать."
4) Допустим, дата совпала. Тогда твой палец обращается к самой первой колонке. Вытащив оттуда значение, ты запускаешь процесс проверки для указанного сервера.

Первая итерация закончена.
Далее ты переезжаешь пальцем на следующую строку.
2) Колонка с типом. Какой тип? 3? Ежедневно.
3) Надо выяснить в колонке времени, не свопадает ли время с сейчасю
4) Нет, не совпадает. Едем дальше.

Переходим на следующую строку и т.д.

Улавливаешь аналогию?
reader.Read() - это передвижения твоего пальца по строкам. А для reader - по твоей таблице, которую ты вытащил простым запросом Select * from Tabell2. Read() - это сдвинуться на строку ниже. В самом начале reader стоит перед первой строкой так что Read() продвигает его на первую.

reader.GetDateTime(2) - это считывание значения из колонки. В какой строке? Да из той, на которой у тебя "палец", то есть reader стоит.

IsTimeToDo6(reader) - это пукт 3 для типа 6. reader здесь нужен для того, чтобы вытаскивать значения из колонок в текущей строке.

Уффф! Ну как?
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Novichok$
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 04.11.2005 (Пт) 16:53

Сообщение Novichok$ » 16.11.2005 (Ср) 16:29

понятнее не бывает.

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 16.11.2005 (Ср) 17:28

Отвечаю по поводу Public Sub НадоСейчасЗапускать6().
1) Это функция, которая по строчке (она же reader для нас) скажет, надо запускать проверку для сервера, указанного в этой строчке в первой колонке или нет. Поскольку это функция, то и описывать ее надо соответственно:
Public Function IsTimeToDo(reader as OLEDBDataReader) As Boolean

2) никаких запросов в базу делать не надо - у нас и так все данные для этой строки есть в объекте reader.

3) Основная сложность, как я понимаю - это сравнить даты:
Код: Выделить всё
Dim dNow as DateTime
Dim dFromDB as DateTime
Dim diff as TimeSpan

<инициализируем перменные- dNow, dFromDB - из reader>

diff = dNow.Subtract(dFromDB)
return  System.Math.Abs(diff.TotalSeconds) < 30

End function

То есть я проверила, что даты отличаются не больше, чем на 30 секунд.

Теперь сможешь написать?
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Novichok$
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 04.11.2005 (Пт) 16:53

Сообщение Novichok$ » 16.11.2005 (Ср) 17:52

Вот блин, пока ты писала я уже по другому начал.
Покажу уже, раз написал.
Я сделал только для типов "6" и "3" (пока, для примера, остальные можно будет потом добавить).
Только я все равно не пойму, как сделать так что бы он мне проверил строчку за строчкой.
В моем варианте все происходит только в первой строке таблицы

Код: Выделить всё
Dim connStr As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Parametrierungs DB.mdb;"
        Dim myConnection As New OleDbConnection(connStr)
        Dim mySelectQuery As String = "SELECT * FROM Tabelle2"
        Dim myCommand As New OleDbCommand(mySelectQuery, myConnection)
        Dim Typ As Integer 'переменая для тип
        Dim Typ1Vergleich As Date 'переменая для типа 1
        Dim Typ2Vergleich As Date 'переменая для типа 2
        Dim Typ3Vergleich As Date
        Dim Typ4Vergleich As Date
        Dim Typ5Vergleich As Date
        Dim Typ6Vergleich As Date
        Dim Parametr As Integer 'переменая для параметра старта FTPlogin.exe (вторая ехе)
        myConnection.Open()
        Dim myReader As OleDbDataReader
        myReader = myCommand.ExecuteReader()
        While myReader.Read() ' читает только первую строчку таблицы???
            Typ = myReader.GetInt16(1).ToString() ' читает тип
            Typ6Vergleich = (myReader.GetDateTime(2) + ", " + myReader.GetDateTime(3)) 'получает значение из колонок Время и Дата
            Typ3Vergleich = myReader.GetDateTime(2) 'получает значение из колонок Время и Дата
            Parametr = myReader.GetInt16(0).ToString() 'получает значение из колонки ServerIndex
        End While
            If Typ = 6 Then
                If Format(Date.Now, "dd.MM.yyyy hh:mm") = Format(Typ6Vergleich, "dd.MM.yyyy hh:mm") Then
                    Start(FTPlogin.exe)s Parametr  'Это я показываю, что должно происходить действие
                End If
            ElseIf Typ = 3 Then
                If Format(Date.Now, "hh:mm") = Format(Typ3Vergleich, "hh:mm") Then
                    Start(FTPlogin.exe)s Parametr 'Это я показываю, что должно происходить действие                End If
            End If
        myReader.Close()
        myConnection.Close()
    End Sub

    Public Shared Sub Main()
        AddHandler Timer1.Tick, AddressOf TimerEventProcessor
        Timer1.Interval = 10000
        Timer1.Start()
        While exitFlag = False
            Application.DoEvents()
        End While

    End Sub

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 16.11.2005 (Ср) 18:08

Ну вот! :( А где все то, о чем мы с тобой говорили? - Select Case, вызовы отдельных процедур для разных типов? А где осознание схемы программы, которую я тебе писала?
Код: Выделить всё
MyReader = TypCommand.ExecuteReader()
while MyReader.Read()
     typ = MyReader.GetDecimal(0)
     select case type
         case 1:
            bDoAction = IsTimeToDo1(reader)

         case 2:
         .....
     end select
     if bDoAction then 
          Start(FTPlogin.exe)s Parametr
     end if
end while


While myReader.Read() ' читает только первую строчку таблицы???

Первый раз - да. Но это же цикл! myReader.Read() возвращает false, когда стоит на последней строчке и больше строчек, куда переходить нет. Так что вот этот оператор надо читать так:
while myReader.Read() 'Пока есть строчки в myReader
.... 'делать действия с текущей строчкой
end while 'конец цикла - читать следующую (то есть в этом месте программа перескакивает на начало цикла и снова выполняет myReader.Read())
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Novichok$
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 04.11.2005 (Пт) 16:53

Сообщение Novichok$ » 16.11.2005 (Ср) 18:34

Уж не гневайтесь госпожа Rainbow.

У меня второй сын родился, вторую ночь не сплю, голова не соображает.

Я поменял код только Select case Typ еще не подставил.
Буду ночью дальше воевать.

Вот так я поменял:
Код: Выделить всё
While myReader.Read()
            Typ = myReader.GetDecimal(1)
            Typ6Vergleich = (myReader.GetDateTime(2) + ", " + myReader.GetDateTime(3))
            Typ3Vergleich = myReader.GetDateTime(2)
            Parametr = myReader.GetInt16(0).ToString()
            If Typ = 6 Then
                If Format(Date.Now, "dd.MM.yyyy hh:mm") = Format(Typ6Vergleich, "dd.MM.yyyy hh:mm") Then
                    MessageBox.Show("Typ6")
                End If
            ElseIf Typ = 3 Then
                If Format(Date.Now, "hh:mm") = Format(Typ3Vergleich, "hh:mm") Then
                    MessageBox.Show("Typ3")
                End If
            End If
        End While

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 16.11.2005 (Ср) 18:41

У меня второй сын родился, вторую ночь не сплю, голова не соображает.

Ух ты!!!! ПОЗДРАВЛЯЮ!!!!! :D
Хотя, понимаю, что сечас жутко тяжело, наверное. А первому сколько?

Буду ночью дальше воевать.

Может, ночью лучше поспать?... Хоть как-то?

Вот так я поменял:

ДА!
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Novichok$
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 04.11.2005 (Пт) 16:53

Сообщение Novichok$ » 17.11.2005 (Чт) 10:08

Младшему ТРИ будет через три недели.
Поспать удалось на слабую троечку.
С кодом не воевал, в борьбе со сном победил сон. Сейчас начну. Попробую через Catch ex что нубудь поймать.

Novichok$
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 04.11.2005 (Пт) 16:53

Сообщение Novichok$ » 17.11.2005 (Чт) 12:36

Нашел ошибки:
Тип переменных, неправильные методы после myReader.
Typ6Vergleich и Typ3Vergleich уже работают, а вот в
Typ4Vergleich, Typ5Vergleich - ошибка. Знаю почему, но пока не знаю как.
Тип данных Дата,
Typ4Vergleich = (myReader.GetDateTime(2) + ", " + myReader.GetValue(3)))
GetValue(3) - здесь достается цифра дня недели, а такое значение наверное нельзя присвоить переменной с типом дата. Надо наверное или отконвертировать или другой Get.
А потом вот такое сравнение:
Код: Выделить всё
If Format(Date.Now, "hh:mm ddd") = Format(Typ4Vergleich, "hh:mm ddd") Then


Я пока без Select case сделал, но мне главное, принцип понять и чтоб работало, красоту потом наведем
Код: Выделить всё
While myReader.Read()
            Typ = myReader.GetValue(1)
            Parametr = myReader.GetValue(0)
            If Typ = 6 Then
                Typ6Vergleich = (myReader.GetDateTime(5) + ", " + myReader.GetDateTime(2))
               If Format(Date.Now, "dd.MM.yyyy hh:mm") = Format(Typ6Vergleich, "dd.MM.yyyy hh:mm") Then
                    MessageBox.Show("Typ6")
                End If
            ElseIf Typ = 3 Then
                Typ3Vergleich = myReader.GetDateTime(2)
                If Format(Date.Now, "hh:mm") = Format(Typ3Vergleich, "hh:mm") Then
                    MessageBox.Show("Typ3")
                End If
            ElseIf Typ = 4 Then
                Typ4Vergleich = (myReader.GetDateTime(2) + ", " + myReader.G)
                If Format(Date.Now, "hh:mm ddd") = Format(Typ4Vergleich, "hh:mm ddd") Then
                    MessageBox.Show("Typ4")
                End If
            ElseIf Typ = 5 Then
                Typ5Vergleich = (myReader.GetDateTime(2) + ", " + myReader.GetValue(4))
                If Format(Date.Now.DayOfWeek, "hh:mm dd") = Format(Typ5Vergleich, "hh:mm dd") Then
                    MessageBox.Show("Typ5")
                End If
            End If
        End While

Novichok$
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 04.11.2005 (Пт) 16:53

Сообщение Novichok$ » 17.11.2005 (Чт) 13:36

Я просто добавил еще одно условие If и проверил сначала день недели а потом время
Код: Выделить всё
ElseIf Typ = 4 Then
                Typ4aVergleich = myReader.GetValue(3)
                If Date.Today.DayOfWeek = Typ4aVergleich Then
                    Typ4bVergleich = myReader.GetDateTime(2)
                        If Format(Date.Now, "hh:mm") = Format(Typ4bVergleich, "hh:mm") Then
                            MessageBox.Show(Date.Now)
                        End If
                End If

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 17.11.2005 (Чт) 13:57

GetValue(3) - здесь достается цифра дня недели, а такое значение наверное нельзя присвоить переменной с типом дата. Надо наверное или отконвертировать или другой Get.

Совершенно верно. Несовпадение типов - ошибка. Надо использовать другой Get. GetValue подходит для всего, но рекомендуется использовать конкретные. Попробуй GetInt32 или GetDecimal. Правда, придется тогда завести отдельную переменную. Да я и не совсем уверена, что вот это ("Date.Today.DayOfWeek = Typ4aVergleich ") сработает правильно. Ведь номер дня недели присвоился в дату - боюсь, ничего хорошего из этого не получилось.

Я пока без Select case сделал, но мне главное, принцип понять и чтоб работало, красоту потом наведем

Принцип - это да. Мне очень не нравится, что ты сравниваешь строки (Format(...)), а не с датами работаешь...
Помнишь, я тебе показывала, как сравнить даты для самого простого случая?
Код: Выделить всё
Dim dNow as DateTime
Dim dFromDB as DateTime
Dim diff as TimeSpan

<инициализируем перменные- dNow, dFromDB - из reader>

diff = dNow.Subtract(dFromDB)
return  System.Math.Abs(diff.TotalSeconds) < 30

End function
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Novichok$
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 04.11.2005 (Пт) 16:53

Сообщение Novichok$ » 17.11.2005 (Чт) 14:07

А вот как теперь с поминунутно и почасово быть ?
Допустим, надо опрашивать с интервалом 7 минут.
Нодо наверно время начала отсчета иметь?

Код: Выделить всё
ServIndex   Typ   Время       ДеньНед   ДеньМес     Однократно      Инттервал(минуты)
1           6    17:30:00          NULL      NULL               28.11.2005      NULL
1           3         22:00:00         NULL            NULL                NULL         NULL
2                 4           02:00:00      1               NULL                NULL        NULL
2                 4           02:00:00      3               NULL                NULL        NULL
2                 4           02:00:00      7               NULL                NULL        NULL
3                 5           05:00:00      NULL             1                  NULL        NULL
3                 5           05:00:00      NULL             15                 NULL          NULL
3                 5           05:00:00      NULL             28                 NULL       
4                 2           00:00:00      NULL             NULL              NULL             180
4                 1           00:00:00      NULL             NULL              NULL             7

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 17.11.2005 (Чт) 14:08

Да, еще одна мысль "в копилку" - ты там куда-нибудь это записывай, чтобы потом вспомнить...

Чтобы не путаться в номерах столбцов, обычно сознают такую вещь как Enum. Эта штука позволит к номерам столбцов обращаться по имени.
Код: Выделить всё
    Public Enum TableColumns
        clmServer = 0
        clmType = 1
        clmTime = 2
    End Enum


Тогда вместо того, чтобы писать GetDateTime(2) можно будет писать GetDateTime(clmTime). Это удобно и тебе и тем, кто читает код.
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 17.11.2005 (Чт) 14:10

А вот как теперь с поминунутно и почасово быть ?
Допустим, надо опрашивать с интервалом 7 минут.
Нодо наверно время начала отсчета иметь?

Думаю, да. Ведь ты же и для ежедневного запуска тогда сможешь задать, что стартовать надо со следующего понедельника.

А если использовать колонку "Время"?
Последний раз редактировалось Rainbow 17.11.2005 (Чт) 14:12, всего редактировалось 1 раз.
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Novichok$
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 04.11.2005 (Пт) 16:53

Сообщение Novichok$ » 17.11.2005 (Чт) 14:10

Читаю про DateTime.Subtract -метод

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 17.11.2005 (Чт) 14:14

Это просто вычитание. Subtract (англ) - вычесть.
Так что я просто нахожу разницу между двумя датами.

По поводу времени начала - мы не можем использовать колонку Время для этого?
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Novichok$
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 04.11.2005 (Пт) 16:53

Сообщение Novichok$ » 17.11.2005 (Чт) 14:22

Rainbow писал(а):Это просто вычитание. Subtract (англ) - вычесть.
Так что я просто нахожу разницу между двумя датами.

По поводу времени начала - мы не можем использовать колонку Время для этого?

Думаю что можно, нужно только в всвойствах таблицы соответствующий комментарий написать
Rainbow писал(а):Да, еще одна мысль "в копилку" - ты там куда-нибудь это записывай, чтобы потом вспомнить...

: )
нЭ бЭспокойся, сохраняю целые страницы с форума

Novichok$
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 04.11.2005 (Пт) 16:53

Сообщение Novichok$ » 17.11.2005 (Чт) 15:39

Rainbow писал(а):
Код: Выделить всё
diff = dNow.Subtract(dFromDB)
return  System.Math.Abs(diff.TotalSeconds) < 30
End function

Мне не совсем понятно это без комментариев или без конкретного примера.
Здесь понятно, я сравниваю два значения:
Код: Выделить всё
If Format(Date.Now, "dd.MM.yyyy hh:mm") = Format(Typ6Vergleich, "dd.MM.yyyy hh:mm") Then

Пытаюсь понять это:
Код: Выделить всё
diff = dNow.Subtract(dFromDB) ' Из сегодняшней даты вычесть дату из БД
return  System.Math.Abs(diff.TotalSeconds) < 30  'Прервать если разница < 30

?
Если тебе не трудно, покажи на небольшом примере.
Возьми, допустим мою первую ветку с If Typ = 6

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 17.11.2005 (Чт) 16:22

Ok, сейчас покажу.

return - это не "прервать", а "вернуть результат". Это то же самое, что в vb6 MyFunction = (a > b)
(a > b) = true или false.
Поэтому "return (a > b)" = if (a > b) return true else return false

Для начала, иллюстрация:
Код: Выделить всё
        Dim dt As DateTime = New DateTime(2005, 11, 17, 16, 25, 30) '17.11.2005 16:25:30
        Dim dt2 As DateTime = New DateTime(2005, 11, 17, 16, 26, 35) '17.11.2005 16:26:35

        Dim diff As TimeSpan
        diff = dt.Subtract(dt2) 'разница: 1 минута 5 секунд = 65 секунд

        MsgBox(diff.TotalSeconds)
        If (diff.TotalSeconds < 30) Then
            MsgBox("close dates!") 'близкие даты - отличаются не больше, чем на 30 секунд!
        End If


Теперь, как будет выглядеть функция для типа 6.
Код: Выделить всё
    Public Function IsTimeToDo6(ByVal reader As OleDbDataReader) As Boolean
        Dim dtNow As DateTime = DateTime.Now
        Dim dtFromDB As DateTime
        dtFromDB = reader.GetDateTime(5) + reader.GetDateTime(2)

        Dim diff As TimeSpan
        diff = dtNow.Subtract(dtFromDB)

        Return System.Math.Abs(diff.TotalSeconds) < 30
    End Function
[/code]
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Novichok$
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 04.11.2005 (Пт) 16:53

Сообщение Novichok$ » 17.11.2005 (Чт) 18:35

Вот для минут я такое состряпал.
Интервал может быть только 5, 10, 15, 20 и 30 мин
И даже когда вот это DateNow = Format(Date.Now, "mm") = не кратно 5, все равно получаю MessageBox.Show("Interval 5 Minuten").
Что то под вечер совсем туго

Код: Выделить всё
ElseIf Typ = 1 Then
                Typ1Vergleich = (myReader.GetDateTime(5) + ", " + myReader.GetDateTime(2))
                    If Format(Date.Now, "dd.MM.yyyy hh:mm") >= Format(Typ1Vergleich, "dd.MM.yyyy hh:mm") Then
                    Interval = myReader.GetValue(6)
                        If Interval = 5 Then
                            DateNow = Format(Date.Now, "mm")
                            MessageBox.Show(DateNow)
                            If DateNow = 0 Or 5 Or 10 Or 15 Or 20 Or 25 Or 30 Or 35 Or 40 Or 45 Or 50 Or 55 Then
                                MessageBox.Show("Interval 5 Minuten")
                            End If
                        ElseIf Interval = 10 Then
                            If DateNow = 0 Or 10 Or 20 Or 30 Or 40 Or 50 Then
                                MessageBox.Show("Interval 10 Minuten")
                            End If
                        ElseIf Interval = 15 Then
                            If DateNow = 0 Or 15 Or 30 Or 45 Then
                                MessageBox.Show("Interval 15 Minuten")
                            End If
                        ElseIf Interval = 20 Then
                            If DateNow = 0 Or 20 Or 40 Then
                                MessageBox.Show("Interval 20 Minuten")
                            End If
                        ElseIf Interval = 30 Then
                            If DateNow = 0 Or 30 Then
                                MessageBox.Show("Interval 30 Minuten")
                            End If

                        End If
                    End If

            End If

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 17.11.2005 (Чт) 18:51

Первое, что бросается в глаза - это
If DateNow = 0 Or 5 Or 10 ...

На месте VB.NET я бы никогда не показывала сообщение. :)
По крайней мере, должно было быть написано
If (DateNow = 0) Or (DateNow = 5) Or (DateNow = 10) ...

Я сейчас убегаю Завтра подумаю, как правильно.
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Novichok$
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 04.11.2005 (Пт) 16:53

Сообщение Novichok$ » 17.11.2005 (Чт) 18:54

Rainbow писал(а): :)


М дааа
Долго ль сироту забидеть

Novichok$
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 04.11.2005 (Пт) 16:53

Сообщение Novichok$ » 18.11.2005 (Пт) 10:07

ДА,так работает

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 18.11.2005 (Пт) 11:45

М дааа
Долго ль сироту забидеть

Да не обижаю я :) Просто не понятно, почему работало.
Ведь когда выполняется OR над целыми числами - выполняется побитовое сложение.
Пример:
65 OR 29 = 93
1000001
OR
0011101
=1011101

Этим пользуются, когда хотят, чтобы одна переменная содержала информацию о каких-нибудь признаках "в одном флаконе". Например, я хочу показать, что человек (ну, объект у меня такой в программе) владеет русским, немецким и английским языком.
Тогда я заведу enum, в котором сопоставлю русскому 1, английскому 2 (10), французскому 4(100), немецкому 8 (1000). А в свойстве язык у моего объекта я поставлю 1 OR 2 OR 8 = 11 (=1011).

А через операцию AND можно проверять, владеет ли он, например английским языком: (язык AND 2) <> 0 - тогда влядеет. Если 0, то нет...

Уф, написала теорию, тебе сейчас, вроде как не нужную. Ну, ладно. Может, когда-нибудь тебе понадобится (а надобится это довольно часто) - вспомнишь.


Теперь по поводу посекундного запуска.
Алгоритм должен быть примерно такой - сейчас не могу точно написать - есть дела.

1) Надо проверить, что дата + время < Now (мы находимся в области запуска)
2) Пусть нам надо запускать через каждые 6 минут. Тогда надо взять diff = Now - (дата + время), взять у него TotalMinutes (кажется, он с дробной частью возвращает). Если с дробной, то округлить или обрезать (лучше округлить, наверное). И потом проверить, что этот округленный TotalMinutes делится нацело на 6. Потому что замаешься ты проверять, что минуты = 5 или 10 и т.д... А если стартовое время будет 22:03?
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Novichok$
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 04.11.2005 (Пт) 16:53

Сообщение Novichok$ » 18.11.2005 (Пт) 12:20

Разобрались мы с поминутно и почасово.
Договорились, что поминутно может быть только:
- 5, 10, 15, 20, 30 мин
- и что время запуска в этом случае должно быть кратным Интервалу.

В этом случае легко проверить через OR. Правда немного громоздко вышло.
С "почасово" - аналогично.

Ты не знаешь, что есть ограничения в VB .NET по колличеству знаков в одной строке?


Уже час маюсь с синтаксисом.
Вот такой эллементарный перенос он у сеня почему то не воспринимает:
Код: Выделить всё
ElseIf Interval = 2 Then
                            If (DateNowStund = DateStartStund) Or (DateNowStund = DateStartStund + Interval), _
                            Or (DateNowStund = DateStartStund + Interval * 2) Then

Подчеркивает все синим и говорит "Ожидается end of- Указание"
Может If и Then должны быть в одной строке?

Пред.След.

Вернуться в Visual Basic .NET

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

Сейчас этот форум просматривают: Mail.ru [бот] и гости: 40

    TopList