powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / вернуть значение из Function
25 сообщений из 28, страница 1 из 2
вернуть значение из Function
    #40042073
Tishh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 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
вернуть значение из Function
    #40042080
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tishh,

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

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

После того, как в эти свободные поля будут вводиться значения, то после проверки поле date_in должно принять соответсвующее значение.
Уточните:
-что такое "соответствующее"(чему) значение
-если поле типа дата/время зачем его проверять-оно не "проглотит" не правильную дату
(а дату,за крайне редким исключением,надо хранить в типе дата\время)
...
Рейтинг: 0 / 0
вернуть значение из Function
    #40042086
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот набор процедур, которые вам уже с самого начала не дадут ввести в поле (какой либо текстбокс на форме к примеру) ничего кроме даты, с умным автозавершением,доводкой и анализом вводимого значения. К примеру поле на форме называется 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
вернуть значение из Function
    #40042142
Tishh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Свободные поля для того были введены, чтобы по умолчанию, в поле year_in_date ставился бы текущий год по умолчанию при создании новой записи и если этот год надо будет поменять, то пользователь поменяет его. И фактически только в 2 поля (день и месяц) вводит пользователь данные.
У меня раньше в поле даты в маске ввода находилось: 00.00.2021;0;_
Но проблема появилась тогда, когда понадобилось ввести дату 2020 года и эта маска не давала возможности ввести дату другого года.
Поэтому было решено ввести эти свободные поля.
...
Рейтинг: 0 / 0
вернуть значение из Function
    #40042157
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tishh
Свободные поля для того были введены, чтобы по умолчанию, в поле year_in_date ставился бы текущий год по умолчанию при создании новой записи и если этот год надо будет поменять, то пользователь поменяет его. И фактически только в 2 поля (день и месяц) вводит пользователь данные.


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



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

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


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

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


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

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

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

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

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

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

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

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

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



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

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

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


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

Я не понимаю , а зачем нужны 3 поля ? а в одном нельзя дату ввести ?
...
Рейтинг: 0 / 0
вернуть значение из Function
    #40043666
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
вернуть значение из Function
    #40043753
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
вернуть значение из Function
    #40043804
Tishh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Единственная цель, ввести только 4 цифры (день и месяц) без всяких знаков и чтобы автоматически ставился текущий год и лишь по мере необходимости иметь возможность менять сам год.
А иметь дополнительно 3 поля наряду с датой не было целью, так как в самой дате мне не удалось сделать то, что хотелось.
Пример с тремя полями уже есть (просто длинный код получился - таких дат 3 штуки на форме), но я пока что ищу вариант получше.
Сейчас пересмотрю выше примеры и потом решу что делать.
...
Рейтинг: 0 / 0
вернуть значение из Function
    #40043817
Eugene-LS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
25 сообщений из 28, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / вернуть значение из Function
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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