powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Макрос на проверку полей
15 сообщений из 15, страница 1 из 1
Макрос на проверку полей
    #39238895
Kassia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите плиз!! Уже измучилась. уверена решение какое то прсотое но не приходит в голову. вобщем есть форма на ней поля. при нажатии кнопки надо чтоб данные с них заносились в базу скл. Я хотела через vba сделать но не получается. в итоге сделала макрсоом. все прекрасно заносит. НО! Мне также нужна проверка на этой форме. я ее делала на vba/(ниже прилагается)
и как теперь совместить я не понимаю((( Либо ставить процедуру либо макрос. а через процедуру не получается сделать добавление в базу. через макрос не могу сделать проверку((((
Код: 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.
Private Sub Кнопка50_Click()
    Dim xCon As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim strNewRecord As String
    constring = "Provider=SQLOLEDB.1;Password=psw;Persist Security Info=True;User ID=psw;Initial Catalog=Gurnal_kontr;Data Source=server1\omich"
    xCon.Open (constring)

If IsNull(Me.kontr.Value) Or IsNull(Me.pred.Value) Or IsNull(Me.datN.Value) Or IsNull(Me.datK.Value) Then
    MsgBox "Вы заполнили не все поля!"
  Else: GoTo 1
  
1
If Me.ПолеСоСписком42.Value = "Не подписан" Then
 

  MsgBox "Данные внесены!"
    Else: GoTo 2
2
If IsNull(Me.regNom.Value) Or IsNull(Me.dataP.Value) Or IsNull(Me.nam_otd_vbiv.Value) And Me.ПолеСоСписком42.Value = "Подписан" Then
    MsgBox "Заполните раздел подписано!"
    Else: GoTo 1

End If
End If
End If

  If Me.ПолеСоСписком42.Value = "Подписан" Then
        Me.Command32.Enabled = True
        Me.Кнопка49.Enabled = True
    Else
        Me.Command32.Enabled = False
        Me.Кнопка49.Enabled = False
    End If

    
End Sub
...
Рейтинг: 0 / 0
Макрос на проверку полей
    #39238932
Kassiaнадо чтоб данные с них заносились в базу скл. Я хотела через vba сделать но не получается. И что не получается? Вы же создали ADODB.Recordset, так откройте его на нужной таблице и добавьте запись.
Kassiaв итоге сделала макрсоом... и как теперь совместить я не понимаю
Можно выполнить DoCmd.RunMacro, но это извращение.
...
Рейтинг: 0 / 0
Макрос на проверку полей
    #39238943
Kassia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев ),
я уже пробовала. не получается добавить запись. может я не так прописываю код добавления конечно. но вроде все верно.
и так пробовала:
'rs.Open "insert into s_kontr (kontr,pred,summa,stat) values ('" & Me.kontr & "','" & Me.pred & "','" & Me.Summa & "','" & Me.stat & "')", xCon, adOpenForwardOnly

и апдейтом. ничего не выходит. ошибка. вот только макрсоом получилось норм. но теперь не проверить ошибки(
...
Рейтинг: 0 / 0
Макрос на проверку полей
    #39239028
Kassiars.Open "insert into ... Ну это вы замутили...
Попробуйте так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
rs.Open "SELECT * FROM s_kontr WHERE 1=0", xCon, adOpenKeyset
rs.AddNew
rs!kontr = Me!kontr
rs!pred = Me!pred
rs!summa = Me!Summa
rs!stat = Me!stat
rs.Update


Можно выполнить и запрос:
xCon.Execute "insert into..."

Но в случае с "insert into...values..." убедительно не советую. Такой запрос очень капризен.
В вашем случае он выполняется только потому, что у вас в Me.Summa целое число или десятичный разделитель - "." (точка).
...
Рейтинг: 0 / 0
Макрос на проверку полей
    #39239046
Kassia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не получается( Выдает ошибку
может как то еще можно записать)?
...
Рейтинг: 0 / 0
Макрос на проверку полей
    #39239059
Kassia,

подсказка на будущее - когда ты видишь вот такое или подобное окошко, практически всегда можно сделать Ctrl+C и получить в буфер его содержимое. И показать его людям в человеческом виде. Это сильно облегчит жизнь и тебе самой и твоим визави...

Щаз-то оно ни к чему, а вот если ошибка будет более экзотическая...
.
...
Рейтинг: 0 / 0
Макрос на проверку полей
    #39239112
rs.Open "SELECT * FROM s_kontr WHERE 1=0", xCon, adOpenKeyset, adLockOptimistic
Забыл, что по умолчанию - ReadOnly.
Если и это не поможет, надо ждать помощи от спецов по SQL Server.
...
Рейтинг: 0 / 0
Макрос на проверку полей
    #39239551
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почищено
...
Рейтинг: 0 / 0
Макрос на проверку полей
    #39239643
Kassia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий, спасибо огромное получилось. только у меня пришлось делать обнволением. но благодаря вам нашла эту функцию.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
rs.Find "nom = '" & Me.nom & "'"
rs!datN = Me!datN
rs!datR = Me!datR
rs!datK = Me!datK
rs!kontr = Me!kontr
rs!pred = Me!pred
rs!Summa = Me!Summa
rs!stat = Me!stat
rs.Update



ТОлько теперь возник еще вопрос( У меня при входе открывается окно и там выводиться порядковый номер. вот его я обновляю и вставляю данные. но чтоб добавить еще один контракт я нажимаю кнопку добавить. вот как запросом вывести последний номер по порядку? Или лучше так не делать. потому что с базой работает несколько пользователей, не будут ли они затирать друг друга.
...
Рейтинг: 0 / 0
Макрос на проверку полей
    #39239823
[quot Kassia]
Код: vbnet
1.
2.
3.
4.
rs.Find "nom = '" & Me.nom & "'"
rs!datN = Me!datN
...
rs.Update

1. "nom = '" & Me.nom & "'" - это поиск по текстовому полю. У вас что, порядковый номер не числовой?
2. После выполнения Find нужно убедиться, что запись найдена. В ADODB.Recordset это проверка св-ва EOF при поиске вперед (в DAO.Recordset св-во NoMatch).
3. Видимо вы открываете всю таблицу и ищете одну запись. Проще и быстрее использовать запрос с "...WHERE nom = '" & Me.nom & "'"
Kassiaкак запросом вывести последний номер по порядку? Или лучше так не делать. потому что с базой работает несколько пользователей, не будут ли они затирать друг друга. Опять же здесь важно какого типа ваш номер, числовой или текстовый. А также важно -
получение номера и добавление записи разделены во времени или это одна операция.
Ответите - продолжим.
...
Рейтинг: 0 / 0
Макрос на проверку полей
    #39253279
Kassia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все сделала разобралась наконец то. все данные добавляет и условия выполянет.

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

пыталась так:
cn.Open "Select nom from s_kontr where kontr = '" & Me.kontr.Value & "' and summa = '" & Me.summa.Value & "' and pred = '" & Me.pred.Value & "' and stat = '" & Me.stat.Value & "'", cn, adOpenStatic, adLockReadOnly

Me.Поле64.Value = cn
четсно вобще не знаю как это сделать. поэтому не ругайтесь если бред полный(
...
Рейтинг: 0 / 0
Макрос на проверку полей
    #39253323
Kassia cn .Open "Select nom from s_kontr where kontr = '" & Me.kontr.Value & "' and summa = '" & Me.summa.Value & "' and pred = '" & Me.pred.Value & "' and stat = '" & Me.stat.Value & "'", cn , adOpenStatic, adLockReadOnly

Me.Поле64.Value = cn
не ругайтесь если бред полный( Не ругаюсь, но бред полный.
cn, это, видимо, Connection, поэтому вместо cn.Open нужно rs .Open, т.е.:
Код: vbnet
1.
rs.Open "Select nom from s_kontr where kontr = '" & Me.kontr & "' and summa = '" & Me.summa & "' and pred = '" & Me.pred & "'  and stat = '" & Me.stat & "'", cn, adOpenStatic, adLockReadOnly

Св-во Value можно не указывать - оно по умолчанию.
Присвоение значения:
Код: vbnet
1.
Me.Поле64 = rs![nom]


Но запись может быть и не найдена, поэтому лучше так:
Код: vbnet
1.
2.
3.
4.
5.
If Not rs.BOF Then
  Me.Поле64 = rs![nom]
Else
  Me.Поле64 = Null
End If



Теперь ...and summa = '" & Me.summa & "'...
У вас что, поле "summa" текстовое? Если числовое, то зачем апострофы? К тому же не в том месте.
...
Рейтинг: 0 / 0
Макрос на проверку полей
    #39253463
Kassia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев ), спасибо все получилось)

Правда еще есть вопрос. Я это сделла с порядковым номером чтобы у меня заработал запрос на формирование в ексель. ОН до этого работал. Но потом я переделала и перестал. то есть у меня была связь порядковый номер контракта - и я его присваивала соглашению. чтобы потом этот запрос в ексель формирвоать. сейчас я снова вернула обратно и все равно не работает. пишет ошибку: 3265 не удается найти объект в семейсте соответвующий порядковому номеру.

я конечно не знаю в чем причина но думала из-за того что соглашение ссылается не на порядковый номер контракта. потому что у меня есть база до исправлени и там все работает(

Может подсказать как исправить эту ошибку?)))


Ругается на эту строку:
Код: vbnet
1.
2.
      querySogl = "SELECT tabl_soglash.nomsp, tabl_soglash.datars, tabl_soglash.regNom_s, tabl_soglash.dataps, tabl_soglash.otdel_s, tabl_soglash.dataNs, tabl_soglash.dataKs, tabl_soglash.preds, tabl_soglash.summa_s FROM tabl_soglash where tabl_soglash.nomer_kontr = " & rs(0)
            rsSogl.Open querySogl, cn, adOpenStatic, adLockReadOnly




весь код формирования выгрузки в ексель:


Код: 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.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
Private Sub Êíîïêà1_Click()
    Dim ExcelApp 'As New Excel.Application
    Dim pathTemplate As String
    Dim queryContract, querySogl As String
    Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim rsSogl As New ADODB.Recordset
    Dim i, nr As Integer
    Dim constring As String
    
    nr = 9
    
    queryContract = "SELECT s_kontr.nom, s_kontr.datR, s_kontr.regNom, s_kontr.dataP, s_kontr.nam_otd_vbiv, s_kontr.datN, s_kontr.datK, s_kontr.pred, s_kontr.summa, s_kontr.kontr FROM s_kontr WHERE " & IIf(IsAdmin, "", "s_kontr.nam_otdel = '" & Me.ÏîëåÑîÑïèñêîì13.Value & "' and") & " s_kontr.god_s = " & Me.ÏîëåÑîÑïèñêîì11.Value & " ORDER BY s_kontr.nom"
      constring = "Provider=SQLOLEDB.1;Password=psw;Persist Security Info=True;User ID=psw;Initial Catalog=Gurnal_kontr;Data Source=server1\omich"
    
    cn.Open (constring)
   ' cn.Open "DSN=gurnal_contr;Uid=sa;Pwd=1;"
    rs.Open queryContract, cn, adOpenStatic, adLockReadOnly
    
    If rs.RecordCount < 1 Then
        MsgBox "&#196;&#235;&#255; &#226;&#251;&#225;&#240;&#224;&#237;&#237;&#238;&#227;&#238; &#238;&#242;&#228;&#229;&#235;&#224; &#232; &#242;&#229;&#234;&#243;&#249;&#229;&#227;&#238; &#227;&#238;&#228;&#224; &#237;&#229;&#242; &#228;&#224;&#237;&#237;&#251;&#245; &#228;&#235;&#255; &#238;&#242;&#247;&#229;&#242;&#224;!"
        GoTo 1
    End If
    
    Set ExcelApp = CreateObject("Excel.Application")
    
    pathTemplate = CurrentProject.Path & "\template_one.xltx"
    ExcelApp.Workbooks.Open pathTemplate
    
    ExcelApp.Application.Cells(3, 3) = "&#231;&#224;&#240;&#229;&#227;&#232;&#241;&#242;&#240;&#232;&#240;&#238;&#226;&#224;&#237;&#237;&#251;&#245; &#238;&#242;&#228;&#229;&#235;&#238;&#236;: " & Me.&#207;&#238;&#235;&#229;&#209;&#238;&#209;&#239;&#232;&#241;&#234;&#238;&#236;13.Value
    ExcelApp.Application.Cells(4, 3) = "&#226; &#193;&#196; &#198;&#243;&#240;&#237;&#224;&#235; &#243;&#247;&#229;&#242;&#224; &#234;&#238;&#237;&#242;&#240;&#224;&#234;&#242;&#238;&#226; &#226; " & Me.&#207;&#238;&#235;&#229;&#209;&#238;&#209;&#239;&#232;&#241;&#234;&#238;&#236;11.Value & " &#227;&#238;&#228;&#243;"
     
    For i = 0 To rs.RecordCount - 1
        With ExcelApp.Application
            If i > 0 Then
                Call Copy(.Cells(9, 1), .Cells(nr, 1))
                Call Copy(.Cells(9, 2), .Cells(nr, 2))
                Call Copy(.Cells(9, 3), .Cells(nr, 3))
                Call Copy(.Cells(9, 4), .Cells(nr, 4))
                Call Copy(.Cells(9, 5), .Cells(nr, 5))
                Call Copy(.Cells(9, 6), .Cells(nr, 6))
                Call Copy(.Cells(9, 7), .Cells(nr, 7))
                Call Copy(.Cells(9, 8), .Cells(nr, 8))
                Call Copy(.Cells(9, 9), .Cells(nr, 9))
                Call Copy(.Cells(9, 10), .Cells(nr, 10))
                Call Copy(.Cells(9, 11), .Cells(nr, 11))
                Call Copy(.Cells(9, 12), .Cells(nr, 12))
                .CutCopyMode = False
                
                .DisplayAlerts = False
                .Range(.Cells(nr, 8), .Cells(nr, 10)).Merge
                .DisplayAlerts = True
            End If
            
            .Cells(nr, 1) = rs(0)
            .Cells(nr, 2) = rs(1)
            .Cells(nr, 3) = rs(2)
            .Cells(nr, 4) = rs(3)
            .Cells(nr, 5) = rs(4)
            .Cells(nr, 6) = rs(5)
            .Cells(nr, 7) = rs(6)
            .Cells(nr, 8) = rs(7)
            .Cells(nr, 11) = rs(8)
            .Cells(nr, 12) = rs(9)
            
            'cn.Close
            querySogl = "SELECT tabl_soglash.nomsp, tabl_soglash.datars, tabl_soglash.regNom_s, tabl_soglash.dataps, tabl_soglash.otdel_s, tabl_soglash.dataNs, tabl_soglash.dataKs, tabl_soglash.preds, tabl_soglash.summa_s FROM tabl_soglash where tabl_soglash.nomer_kontr = " & rs(0)
            rsSogl.Open querySogl, cn, adOpenStatic, adLockReadOnly
            
            If rsSogl.RecordCount > 0 Then
                Dim j As Integer

                For j = 0 To rsSogl.RecordCount - 1
                    nr = nr + 1
                    .DisplayAlerts = False
                    .Range(.Cells(nr, 1), .Cells(nr, 12)).Merge
                    .DisplayAlerts = True
                    .Cells(nr, 1) = "&#196;&#238;&#239;&#238;&#235;&#237;&#232;&#242;&#229;&#235;&#252;&#237;&#238;&#229; &#241;&#238;&#227;&#235;&#224;&#248;&#229;&#237;&#232;&#229; &#185; " & j + 1
                    
                    nr = nr + 1
                    
                    Call Copy(.Cells(9, 1), .Cells(nr, 1))
                    Call Copy(.Cells(9, 2), .Cells(nr, 2))
                    Call Copy(.Cells(9, 3), .Cells(nr, 3))
                    Call Copy(.Cells(9, 4), .Cells(nr, 4))
                    Call Copy(.Cells(9, 5), .Cells(nr, 5))
                    Call Copy(.Cells(9, 6), .Cells(nr, 6))
                    Call Copy(.Cells(9, 7), .Cells(nr, 7))
                    Call Copy(.Cells(9, 8), .Cells(nr, 8))
                    Call Copy(.Cells(9, 9), .Cells(nr, 9))
                    Call Copy(.Cells(9, 10), .Cells(nr, 10))
                    Call Copy(.Cells(9, 11), .Cells(nr, 11))
                    Call Copy(.Cells(9, 12), .Cells(nr, 12))
                    
                    .DisplayAlerts = False
                    .Range(.Cells(nr, 8), .Cells(nr, 10)).Merge
                    .DisplayAlerts = True
                    .CutCopyMode = False
                    
                    .Cells(nr, 1) = rsSogl(0)
                    .Cells(nr, 2) = rsSogl(1)
                    .Cells(nr, 3) = rsSogl(2)
                    .Cells(nr, 4) = rsSogl(3)
                    .Cells(nr, 5) = rsSogl(4)
                    .Cells(nr, 6) = rsSogl(5)
                    .Cells(nr, 7) = rsSogl(6)
                    .Cells(nr, 8) = rsSogl(7)
                    .Cells(nr, 11) = rsSogl(8)

                    rsSogl.MoveNext
                Next
                
                rsSogl.Close
            End If
        End With
        nr = nr + 1
        rs.MoveNext
    Next
    
    ExcelApp.Application.Visible = True
    
1:  rs.Close
    cn.Close

    Set ExcelApp = Nothing
    Set rsSogl = Nothing
    Set rs = Nothing
    Set cn = Nothing
End Sub

...
Рейтинг: 0 / 0
Макрос на проверку полей
    #39253758
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kassia.... НО! Мне также нужна проверка на этой форме.....Это всё из HELPA (его Вы должны читать) Событие До обновления часто используется для проверки соответствия данных условиям на значение
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Sub Form_BeforeUpdate(Cancel As Integer)
	Select Case Me!Страна
		Case "Франция", "Италия", "Испания"
			If Len(Me!Индекс) <> 5 Then
				MsgBox "Индекс должен содержать 5 символов."
				Cancel = True
			End If
		Case "Австралия", "Сингапур"
			If Len(Me!Индекс) <> 4 Then
				MsgBox "Индекс должен содержать 4 символа."
				Cancel = True
			End If
	End Select
End Sub
...
Рейтинг: 0 / 0
Макрос на проверку полей
    #39253984
Kassia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
все уже разобралась))))))))
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Макрос на проверку полей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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