Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / вернуть значение из Function / 25 сообщений из 28, страница 1 из 2
05.02.2021, 12:57
    #40042073
Tishh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Есть 4 поля на форме
date_in - поле с датой
day_in_date - поле для ввода дня (свободное поле)
month_in_date - поле для ввода месяца (свободное поле)
year_in_date - поле для ввода года (свободное поле)

После того, как в эти свободные поля будут вводиться значения, то после проверки поле date_in должно принять соответсвующее значение.

Проверка осуществляется, но как вернуть значение из datedat в date_in ?

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
Function DATECHANGE(ByVal datedat As String, ByVal DD As String, ByVal MM As String, ByVal YY As String)
Dim d1 As String
Dim d2 As String
Dim d3 As String
Dim dat As String
'DAY ........................
    If IsNull(DD) Then
         Exit Function
    Else
        If DD <= 0 Then
           DD = ""
           Exit Function
        End If
        d1 = DD
    End If
    
'MONTH ......................
    If IsNull(MM) Or MM < 1 Or MM > 12 Then
         MM = ""
         datedat = ""
            Exit Function
    Else
        d2 = MM
    End If
    
'YEAR .........................
    If IsNull(YY) Then
        datedat = Null
        Exit Function
    Else
        d3 = YY
    End If
'..............................
 dat = DateSerial(d3, d2, d1)
    If (Day(dat) <> d1) Then
        d1 = Null
        datedat = Null
    Else
        datedat = dat
    End If
End Function

Private Sub day_in_date_AfterUpdate()
    Call DATECHANGE(date_in, day_in_date, month_in_date, year_in_date)
    Me.Recalc
End Sub

Private Sub month_in_date_AfterUpdate()
    Call DATECHANGE(date_in, day_in_date, month_in_date, year_in_date)
    Me.Recalc
End Sub

Private Sub year_in_date_AfterUpdate()
    Call DATECHANGE(date_in, day_in_date, month_in_date, year_in_date)
    Me.Recalc
End Sub
...
Рейтинг: 0 / 0
05.02.2021, 13:16
    #40042080
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Tishh,

У вас функция вообще ничего не возвращает, и работает как обычная процедура с выполнением действия внутри , типа void.
Что вы хотите в конечном итоге, чтобы функция проверяла вводимое значение,является ли оно датой?
(ну типа количество дней в месяце не больше 31, количество месяцев не больше 12ти,все ли части даты заполнены итд итп?)

Если да, то все можно заменить одной функцией vba - IsDate(вашаПеременная)
...
Рейтинг: 0 / 0
05.02.2021, 13:26
    #40042085
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Tishh

После того, как в эти свободные поля будут вводиться значения, то после проверки поле date_in должно принять соответсвующее значение.
Уточните:
-что такое "соответствующее"(чему) значение
-если поле типа дата/время зачем его проверять-оно не "проглотит" не правильную дату
(а дату,за крайне редким исключением,надо хранить в типе дата\время)
...
Рейтинг: 0 / 0
05.02.2021, 13:28
    #40042086
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Вот набор процедур, которые вам уже с самого начала не дадут ввести в поле (какой либо текстбокс на форме к примеру) ничего кроме даты, с умным автозавершением,доводкой и анализом вводимого значения. К примеру поле на форме называется fld_date
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
Private Sub fld_date_Change()
    Dim DatBox As Object
    Set DatBox = Me.ActiveControl
    If Len(DatBox) = 2 And Right$(DatBox, 1) = "." Then DatBox = "0" & DatBox
    If Len(DatBox) = 5 And Right$(DatBox, 1) = "." Then _
       DatBox = Left$(DatBox, 3) & "0" & Right$(DatBox, 2)
    If (Len(DatBox) = 3 Or Len(DatBox) = 6) And Right$(DatBox, 1) <> "." Then
        DatBox = Left$(DatBox, Len(DatBox) - 1) & "." & Right$(DatBox, 1)
    End If
    Set DatBox = Nothing
End Sub

Private Sub fld_date_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        fld_date.MaxLength = 10
        KeyAscii = DatBox_KeyPress(KeyAscii)
End Sub
Function DatBox_KeyPress(ByVal KeyAsci As Integer)
    Select Case KeyAsci
    Case 48 To 57: DatBox_KeyPress = KeyAsci
    Case 44 To 47, 58: DatBox_KeyPress = 46
    Case Else: DatBox_KeyPress = 0
    End Select
End Function

Private Sub fld_date_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim Cancl As Boolean, datText$
    Dim fUsFr As Object: Set fUsFr = Me
    Dim DatBox As Object: Set DatBox = Me.ActiveControl
    If Len(DatBox) Then Else GoTo Cancel_
    datText = Left$(DatBox.Text, 5)
    If Len(datText) = 4 Then datText = Left$(datText, 3) & "0" & Right$(datText, 1)
    If Len(DatBox) = 6 Then DatBox = datText
    If IsDate(DatBox) Then
        If datText <> Format(DatBox, "DD.MM") Then GoTo err_
        DatBox = Format(DatBox, "DD.MM.YYYY"): GoTo Cancel_
    End If
err_:
    MsgBox "Ошибка ввода даты!", vbExclamation, "ПРОВЕРКА ДАТЫ"
    With fUsFr.Controls(DatBox.Name)
        .SelStart = 0: .SelLength = Len(DatBox.Text)
    End With
    Cancl = True
Cancel_:
    Set DatBox = Nothing: Set fUsFr = Nothing

    Cancel = Cancl
End Sub



А вообще можно в свойствах обычного поля на форме,в свойствах поля указать тип редактирования и форматирования как даты, и вообще вопрос отпадет. Все будет работать как надо без единой строчки кода.
...
Рейтинг: 0 / 0
05.02.2021, 14:43
    #40042142
Tishh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Свободные поля для того были введены, чтобы по умолчанию, в поле year_in_date ставился бы текущий год по умолчанию при создании новой записи и если этот год надо будет поменять, то пользователь поменяет его. И фактически только в 2 поля (день и месяц) вводит пользователь данные.
У меня раньше в поле даты в маске ввода находилось: 00.00.2021;0;_
Но проблема появилась тогда, когда понадобилось ввести дату 2020 года и эта маска не давала возможности ввести дату другого года.
Поэтому было решено ввести эти свободные поля.
...
Рейтинг: 0 / 0
05.02.2021, 15:03
    #40042157
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Tishh
Свободные поля для того были введены, чтобы по умолчанию, в поле year_in_date ставился бы текущий год по умолчанию при создании новой записи и если этот год надо будет поменять, то пользователь поменяет его. И фактически только в 2 поля (день и месяц) вводит пользователь данные.


У меня это реализовано в примере , в предыдущем письме от меня.



Можете просто скопировать весь код в модуль формы где ваше поле, и поменять везде во вставленом коде имя поля с моего fld_date на ваше имя поля в вашей базе в вашей форме. Работы на 16 секунд:)

И все будет проставлятся в том ракурсе,именно как вам и нужно)
...
Рейтинг: 0 / 0
05.02.2021, 15:05
    #40042160
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Можете выслать кусок базы с этим полем , я вам напилю по быстрому)
...
Рейтинг: 0 / 0
05.02.2021, 15:18
    #40042173
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Tishh,
Не понятно,однако,зачем в поле дата/время маска(как не вводите дату,например так 1,1,1-она сохранится:01.01.2001)а значением по умолчанию пойдет Date,которую при вводе правьте как угодно-если же поле не трогать в тбл. запишется Date.
"Все уже украдено (придумано) до нас"-к\ф Бриллиантовая рука
...
Рейтинг: 0 / 0
05.02.2021, 15:37
    #40042187
Tishh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
sdku
Tishh,
Не понятно,однако,зачем в поле дата/время маска(как не вводите дату,например так 1,1,1-она сохранится:01.01.2001)а значением по умолчанию пойдет Date,которую при вводе правьте как угодно-если же поле не трогать в тбл. запишется Date.
"Все уже украдено (придумано) до нас"-к\ф Бриллиантовая рука


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

Маска, похоже, совсем не подходит для данного случая.
...
Рейтинг: 0 / 0
05.02.2021, 15:55
    #40042203
Tishh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Пример в файле
...
Рейтинг: 0 / 0
05.02.2021, 16:05
    #40042213
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Tishh,
-наличие в записях пустого поля "дата" может породить проблемы(впрочем утверждать это можно видя БД и зная для чего она создается)
- что проще:установить курсор перед второй точкой в поле с датой,нажать кнопку мыша и подвинуть его влево(выделить месяц и день в дате по умолчанию)и вбить новые значения или заполнить 2(никому не нужных,кроме Вас,поля)
(ради чего и для кого,в очередной раз, "изобретается" велосипед)
...
Рейтинг: 0 / 0
05.02.2021, 18:21
    #40042286
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Tishh
Пример в файле


Ловите решение, я понял в чем у вас проблема была основная, вы тестируете на одиночной форме, и когда пытаетесь зафиксировать введенную дату ,к примеру при нажатии на Enter , курсор переходит на новую строку и вы не можете посмотреть ,что вы там вбили.
Отмена Enter дело неблагодарное, поэтому с использованием небольшого костыля, удалось решить проблему вашу.

Вбивайте в ваше поле (поле date_in) дату (можете 12/07 , можете так 12,04, можете так 1205 , как угодно в общем) и нажимаете на Enter , поле остается на месте, а дата автоматом по вашей логике собирается и остается в этом поле, причем в фокусе. И никаких дополнительных полей не нужно создавать.
...
Рейтинг: 0 / 0
05.02.2021, 18:43
    #40042304
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Лучше эту версию берите, не зависит от того, на какой записи находится курсор.
...
Рейтинг: 0 / 0
05.02.2021, 22:47
    #40042398
Tishh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Сергей Лалов,

Интересное решение, большое спасибо.
Немного странное решение, неожиданное, и к сожалению мне не очень понятно по какому принципу работает и откуда 2021 записывается.

Вот только при вводе даты, у меня работает только такой вариант 12/07 и 12,04 или же 12.04 в зависимости от системы и не работает как 1205 .

И всё же хотелось бы знать, как же вернуть значение datedat из функции и присвоить ее date_in .
...
Рейтинг: 0 / 0
05.02.2021, 23:55
    #40042426
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Tishh,

Ну вот так вот и работает странно, в две строки, но работает. Там идёт снятие нажатия клавиши, если клавиша энтер то курсор переходит на следующую запись, но я его возвращаю назад при помощи метода рекордсета текущей формы. А автодоводка поля типа дата осуществляется аксессом самостоятельно, мы просто возвращаемся назад и смотрим как довелось.
Просто чуть побольше узнайте, как работает аксесс.

Какая у вас реально задача? Функция должна собрать дату из трех полей, проверить, и если ок-вставить в текстовое поле?
...
Рейтинг: 0 / 0
06.02.2021, 00:05
    #40042433
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Чувствую что изобретаете дичь, может мне лучше вам дописать, чтобы и 1205 по умолчанию вставлял ось как 12.05.2021?)
...
Рейтинг: 0 / 0
06.02.2021, 11:08
    #40042508
Tishh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
В рабочем варианте этот вариант не подойдет, так как при вводе любой даты появляется дата 30.12.1899.
...
Рейтинг: 0 / 0
08.02.2021, 09:11
    #40043147
Beliar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Tishh

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

Если у поля типа данных "дата/время", то можно вводить любой из вариантов: "12,05","12.05","12/05" или "12-05" и при нажатии "ентера" автоматически подставляется текущий год. И не нужен никакой код, разве что для автозамены "1205"
...
Рейтинг: 0 / 0
08.02.2021, 15:31
    #40043327
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Tishh
В рабочем варианте этот вариант не подойдет, так как при вводе любой даты появляется дата 30.12.1899.



А почему у вас в рабочем проекте при вводе любой даты вставляется неправильная дата? Я думаю в этом корень проблемы.
Даже если вы вашим методом собираете из трех полей дату и вставляете её в нужное поле и на выходе получается к примеру 30.12.1899 , то это говорить о том что у вас на уровне таблицы стоит некорректный тип данных поля. Либо формат даты отличный от формата РФ, либо стоит некорректная маска , которую кто то неправильно сделал.
В тестовом примере работает, если бы выслали кусочек не тестовой базы, то стало бы все ясно сразу.
...
Рейтинг: 0 / 0
08.02.2021, 19:39
    #40043464
Tishh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Beliar
Tishh

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

Если у поля типа данных "дата/время", то можно вводить любой из вариантов: "12,05","12.05","12/05" или "12-05" и при нажатии "ентера" автоматически подставляется текущий год. И не нужен никакой код, разве что для автозамены "1205"


Тип поля данных "дата/время" и если вводить без маски "12,05","12.05","12/05" или "12-05", то тогда действительно подставляется текущий год, в этом и была причина не появления года.
Практически мне нужен код для автозамены "1205", только как это сделать, к сожалению не знаю, с чего начать.
...
Рейтинг: 0 / 0
08.02.2021, 21:23
    #40043476
DarkMan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Tishh
Практически мне нужен код для автозамены "1205", только как это сделать, к сожалению не знаю, с чего начать.

Я не понимаю , а зачем нужны 3 поля ? а в одном нельзя дату ввести ?
...
Рейтинг: 0 / 0
09.02.2021, 14:03
    #40043666
Beliar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Tishh


Тип поля данных "дата/время" и если вводить без маски "12,05","12.05","12/05" или "12-05", то тогда действительно подставляется текущий год, в этом и была причина не появления года.
Практически мне нужен код для автозамены "1205", только как это сделать, к сожалению не знаю, с чего начать.


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Public Function DATACHANGE (MyDate as string) as date
'для формата даты "dd.mm.yyyy"
dim s1$, s2$, s3$
dim d1 as date
s1=MyDate
If Len(s1)=4 and IsNumeric(Right(s1,2))=true and IsNumeric(Left(s1,2))=true then 'будет работать, только если исходный стринг ввиде четырехзначного числа
  s3=Year(Date()) 'берем год от текущей даты
  'склеиваем:
  s2=Left(s1,2) & "." & Right(s1,2) & "." & s3
  'проверяем, является ли полученное датой:
   if IsDate(s2)=true then
      d1=CDate(s2)
   else:
      msgbox "вводи правильно дату, рукожоп!", vbCritical + vbOkOnly
      exit function
   end if
else:
   msgbox "вводи правильно дату, рукожоп!", vbCritical + vbOkOnly
   exit function
end if
DATACHANGE=d1
end function


написано на скорую руку, поэтому весьма корявенько. При применении функции CDate() может сменится формат даты. В этом случае нужно применить еще и Format()
...
Рейтинг: 0 / 0
09.02.2021, 16:20
    #40043753
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Tishh

Вот только при вводе даты, у меня работает только такой вариант 12/07 и 12,04 или же 12.04 в зависимости от системы и не работает как 1205 .
Код: vbnet
1.
Me.date_in = DateSerial(Year(Date), Right(Me.dateAndMonth, 2), Left(me.dateAndMonth, 2))

никак не "вкурю" о какой такой (пользовательской) функции идет речь и зачем такие заморочки?
создайте программный продукт которым сможет пользоваться даже дурак - только он и будет им пользоваться
или Вы очень туманно все объясняете
...
Рейтинг: 0 / 0
09.02.2021, 20:29
    #40043804
Tishh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Единственная цель, ввести только 4 цифры (день и месяц) без всяких знаков и чтобы автоматически ставился текущий год и лишь по мере необходимости иметь возможность менять сам год.
А иметь дополнительно 3 поля наряду с датой не было целью, так как в самой дате мне не удалось сделать то, что хотелось.
Пример с тремя полями уже есть (просто длинный код получился - таких дат 3 штуки на форме), но я пока что ищу вариант получше.
Сейчас пересмотрю выше примеры и потом решу что делать.
...
Рейтинг: 0 / 0
09.02.2021, 21:55
    #40043817
Eugene-LS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вернуть значение из Function
Tishh
Единственная цель, ввести только 4 цифры (день и месяц) без всяких знаков и чтобы автоматически ставился текущий год

Ну так правильно вам тут подсказывали уже.
Что то такое:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private Sub txtДата_Change()
'Событие TextBox. Change (Access)
'https://docs.microsoft.com/ru-ru/office/vba/api/access.textbox.change
Dim dDate As Date
Dim sText$, iYear%, iMonth%, iDay%
    sText = Me!txtДата.Text
    If Len(sText) = 4 Then
        iDay = CInt(Left(sText, 2))
        iMonth = CInt(Mid(sText, 3))
        iYear = Year(Date)
        dDate = DateSerial(iYear, iMonth, iDay)
        Me!txtДата.Text = CStr(dDate)
        Me!txtДата.SelStart = 6
        Me!txtДата.SelLength = 4
    End If
End Sub
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / вернуть значение из Function / 25 сообщений из 28, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]