powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Логирование
13 сообщений из 13, страница 1 из 1
Логирование
    #39196303
noobs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, пытаюсь сделать некое логирование ошибок при экспорте данных чтобы в итоге получить файл с неправильными значениями, но что не совсем получается. Загрузку делаю в отдельную таблицу. Помогите распутаться с условиями.

Код: 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.
For i = 1 To rs.RecordCount

s1 = "_" & rs.Fields(6) & "_"
s2 = "_" & rs.Fields(3) & "_"

If InStr(s1214, s1) > 0 Then  'точка
    If InStr(s18, s2) > 0 Then 'штрих
        With rs2
            .AddNew
            .Fields("kod_kurator") = rs.Fields(0)
            .Fields("kod_manager") = rs.Fields(1)
            .Fields("type_activ") = rs.Fields(2)
            .Fields("kod_18") = rs.Fields(3)
            .Fields("kod_25") = rs.Fields(4)
            .Fields("nameUslugi") = rs.Fields(5)
            .Fields("kod_upr") = rs.Fields(6)
            .Fields("kod_12") = rs.Fields(7)
            .Fields("kod_52") = rs.Fields(8)
            .Fields("kod_33") = rs.Fields(9)
            .Fields("kod_39") = rs.Fields(10)
            .Fields("kod_47") = rs.Fields(11)
            .Fields("kod_13") = rs.Fields(12)
            .Fields("kod_103") = rs.Fields(13)
            .Fields("kod_24") = rs.Fields(14)
            .Fields("kod_AFE") = rs.Fields(15)
            .Fields("recoverable") = rs.Fields(16)
            .Fields("kod_Cdelka") = rs.Fields(17)
            .Fields("kod_StatBud") = rs.Fields(18)
            .Fields("numberLot") = rs.Fields(19)
            .Fields("ZKprotocol") = rs.Fields(20)
            .Fields("kod_edizm") = rs.Fields(21)
            .Fields("kod_urovuslug") = rs.Fields(22)
            .Fields("cost") = rs.Fields(23)
            .Fields("valuta") = rs.Fields(24)
            .Fields("procNDS") = rs.Fields(25)
            .Fields("coefficient") = rs.Fields(26)
            .Fields("volume01") = rs.Fields(27)
            .Fields("sum01") = rs.Fields(28)
            .Fields("volume02") = rs.Fields(29)
            .Fields("sum02") = rs.Fields(30)
            .Fields("volume03") = rs.Fields(31)
            .Fields("sum03") = rs.Fields(32)
            .Fields("volume04") = rs.Fields(33)
            .Fields("sum04") = rs.Fields(34)
            .Fields("volume05") = rs.Fields(35)
            .Fields("sum05") = rs.Fields(36)
            .Fields("volume06") = rs.Fields(37)
            .Fields("sum06") = rs.Fields(38)
            .Fields("volume07") = rs.Fields(39)
            .Fields("sum07") = rs.Fields(40)
            .Fields("volume08") = rs.Fields(41)
            .Fields("sum08") = rs.Fields(42)
            .Fields("volume09") = rs.Fields(43)
            .Fields("sum09") = rs.Fields(44)
            .Fields("volume10") = rs.Fields(45)
            .Fields("sum10") = rs.Fields(46)
            .Fields("volume11") = rs.Fields(47)
            .Fields("sum11") = rs.Fields(48)
            .Fields("volume12") = rs.Fields(49)
            .Fields("sum12") = rs.Fields(50)
            .Fields("totalVolume") = rs.Fields(51)
            .Fields("totalSum") = rs.Fields(52)
            .Fields("NumDogKurator") = rs.Fields(53)
            .Update
        End With
    j = j + 1
    isum = isum + rs2.Fields("totalSum")
    End If
    If i < rs.RecordCount Then rs.MoveNext 'если переменная цикла не добралась до конца то двигаем рекордсет eXcel на следующую запись
  [SIZE=2]  Next i[/SIZE] ' Выходит next without for. Переношу if над Next появляется Else without if
    End If

Else

Adds = "update logtable set schifrKA='" & s2 & "', commentKA='неверное значение' "
DoCmd.RimSQL Adds
End If

If i < rs.RecordCount Then rs.MoveNext 'если переменная цикла не добралась до конца то двигаем рекордсет eXcel на следующую запись
Next i
Else

Adds = "update logtable set UPR='" & s1 & "', commentUPR='неверное значение' "
DoCmd.RimSQL Adds

If InStr(s18, s2) > 0 Then 'штрих

If i < rs.RecordCount Then rs.MoveNext 'если переменная цикла не добралась до конца то двигаем рекордсет eXcel на следующую запись
Next i
    Else
Adds = "update logtable set schifrKA='" & s2 & "', commentKA='неверное значение' "
DoCmd.RimSQL Adds
End If

If i < rs.RecordCount Then rs.MoveNext 'если переменная цикла не добралась до конца то двигаем рекордсет eXcel на следующую запись
Next i
End If

rs.Close
idone = 1
MsgBox "Загрузка в план прошла успешно." & vbNewLine & "Добавлено строк :" & j & vbNewLine & "Общая сумма добавленных записей :" & isum


...
Рейтинг: 0 / 0
Логирование
    #39196383
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noobs,

мне (на вскидку) не понравилось:
1. rs.RecordCount встречающееся бесконечно...
- может глючить (правильнее его один раз вычислить и присвоить переменной типа Long)
- это будет дольше в обработке чем обращение к значению переменной...
2. Next i встречающийся бесконечно, по идее для каждого For i = 1 To должен быть только один Next i

Общую логику не смотрел...
...
Рейтинг: 0 / 0
Логирование
    #39196384
noobs Выходит next without for. Переношу if над Next появляется Else without if
(1)
пишите ваш код "лесенкой" - каждый If или For с новым отступом - так, чтобы
конечный оператор конструкции всегда находился строго под его начальным оператором.
такой вид поможет вам соблюдать логическую структуру вашего кода,
и в частности, не допускать ошибок типа нижеследующей

(2)
Не надо делать пересечение конструкций вида
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
For i = ...
If ... Then
...
Next i
End if

'если бы вы соблюдали пункт (1), то пришлось бы написать
For i = ...
    If ... Then
        ...
    Next i
End if

и сразу было бы видно к чему относится приведенная вами ошибка

(3)
Вместо корявого For i = 1 To rs.RecordCount
а внутри цикла не пойми как и где каждый раз делать If i < rs.RecordCount Then rs.MoveNext
лучше использовать вот такую простую констркцию
Код: vbnet
1.
2.
3.
4.
5.
6.
Do While Not rs.EOF
    '------------------------------------------------------
    '...вот тут делать все что надо для ТЕКУЩЕЙ записи rs
    '------------------------------------------------------
    rs.MoveNext
Loop


Попробуйте переписать ваш код с учетом вышеказанного, глядишь - все у вас и получится.
...
Рейтинг: 0 / 0
Логирование
    #39196405
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noobs,

Код: vbnet
1.
DoCmd.RimSQL Adds



что за команда, знаю только
Код: vbnet
1.
DoCmd.RunSQL Adds
...
Рейтинг: 0 / 0
Логирование
    #39196500
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noobs....пытаюсь сделать некое логирование ошибок при экспорте данных чтобы в итоге получить файл с неправильными значениями...Стесняюсь спросить-а Вы экспортируете заведомо неправильные значения (или они в ACCESS "правильные" а в EXCEL "неправильные")
Обычно проверку осуществляют еще при вводе, "до обновления" и в БД незачем хранить "неправильные" значения
...
Рейтинг: 0 / 0
Логирование
    #39196526
noobs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,

нужно сделать чтобы пользователь мог посмотреть какие записи не добавились и почему, вот на что хватило моей фантазии.
Я постараюсь разобраться с if)
...
Рейтинг: 0 / 0
Логирование
    #39196727
noobs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите пожалуйста, не могу понять где If остался открытым.
В notepad++ все выглядит вроде бы нормально

Код: 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.
 If idone = 2 Then
	MsgBox "Загружаем в факт"
    
    Set objConnectionEx = CreateObject("ADODB.Connection")
    Set objConnectionSer = CreateObject("ADODB.Connection")
    Set rs3 = CreateObject("ADODB.Recordset")
    Set rs4 = CreateObject("ADODB.Recordset")
    objConnectionEx.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = " & Me.Form.l1.Value & "; Extended Properties=""Excel 12.0 xml;HDR=Yes"""
    strSQL = "select [Год],[месяц],[Номер акта выполненых работ],[Номер счета фактуры],[Код Кураторов],[Код Менеджера],[Вид деятельности ОД/ИД/Прибыль/Возмещаемые],[Код Контрагента (18 справочник)],[№ договора САП (25 справочник)], " _
    & " [Наименование услуги],[Код управления],[Код Центров затрат (12 справочник)],[Код Вида услуг (52 справочник)], [Код Целевой программы (33 справочник)],[Код Месторождения (39 справочник)],[Код элементов затрат (47 справочник)], " _
    & " [Код прочих доходов и расходов (кроме прочих р-ций,13 справочник)],[Код Вида производств (103 справочник)],[Код Вида деятельности (24 справочник)],[Код AFE (справочник АФЕ)],[Возмещаемые (если агентский договор прописывать № договора )],[Код типа сделки (справочник сделок)],[Код статьи бюджета (справочник Статей бюджета)],[Номер лота],[Протокол ЗК], " _
    & " [Единица измерения],[Уровень обслуживания(Эконом/Стандарт/Премиум)],[Тариф за единицу в месяц (без НДС, руб)],[Валюта договора],[Процент НДС],[Целевой коэффициент],[Объем обслуживаемых единиц],[Сумма в месяц, рублей, без НДС]  from  [Лист1$]"
    rs3.Open strSQL, objConnectionEx, 3, 3 ' открываем рекордсет excel
         If rs3.BOF And rs3.EOF Then
            MsgBox "Файл пуст"
         Else
            'objConnectionSer.Open "Provider=SQLOLEDB.1;Password=Skid2016;Persist Security Info=True;User ID=UserSkid;Initial Catalog=SKID;Data Source=rni-32" 'строка подключения к skid
            objConnectionSer.Open "Provider=SQLOLEDB.1;Password=SKID;Persist Security Info=True;User ID=SKID;Initial Catalog=tstSKID;Data Source=rni-06" 'строка подключения к skid
            
            rs3.MoveLast: rs3.MoveFirst 'прогон рекордсета на последнюю запись и назад к первой для правильного подсчета количества записей
            rs4.Open "dbo.DogovorFact", objConnectionSer, 3, 3  'открываем рекордсет  таблицы Skid
            
            '********************управления*********************
            s1 = "select [kod_upr] from [NCI_UPR_1214]"
            Set rs1214 = CurrentDb.OpenRecordset(s1)
            
            Do While rs1214.EOF = False
            s1214 = s1214 & "_" & rs1214.Fields(0) & "_"
            'строка с управлениями
            rs1214.MoveNext
            Loop
            rs1214.Close
            Set rs1214 = Nothing
            '*****************************************
    
            '********************контрагенты*********************
            s2 = "select [nStrEd] from [NCI_StrEd_18]"
            Set rs18 = CurrentDb.OpenRecordset(s2)
    
            Do While rs18.EOF = False
            s18 = s18 & "_" & rs18.Fields(0) & "_"
            'строка контрагентов
            rs18.MoveNext
            Loop
            rs18.Close
            Set rs18 = Nothing
            '*****************************************
    
            For i = 1 To rs3.RecordCount 'цикл по записям рекордсета из excel
                s1 = "_" & rs3.Fields(10) & "_"
				s2 = "_" & rs3.Fields(7) & "_"
					If InStr(s1214, s1) > 0 And InStr(s18, s2) > 0 Then
								'If DCount("[kod_upr]", "[UPR_1214]", "[UPR_1214].[kod_upr]='" & rs3.Fields(10) & "'") > 0 And DCount("[nStrEd]", "[StrEd]", "[StrEd].[nStrEd]=" & rs3.Fields(7)) > 0 Then
						With rs4
						.AddNew
						.Fields("year") = rs3.Fields("Год")
						.Fields("month") = rs3.Fields("месяц")
						.Fields("actNumber") = rs3.Fields("Номер акта выполненых работ")
						.Fields("invoiceNumber") = rs3.Fields("Номер счета фактуры")
						.Fields("kod_Kurator") = rs3.Fields("Код Кураторов")
						.Fields("kod_manager") = rs3.Fields("Код Менеджера")
						.Fields("type_activ") = rs3.Fields("Вид деятельности ОД/ИД/Прибыль/Возмещаемые")
						.Fields("kod_18") = rs3.Fields("Код Контрагента (18 справочник)")
						.Fields("kod25") = rs3.Fields("№ договора САП (25 справочник)")
						.Fields("nameUslugi") = rs3.Fields("Наименование услуги")
						.Fields("kod_upr") = rs3.Fields("Код управления")
						.Fields("kod_12") = rs3.Fields("Код Центров затрат (12 справочник)")
						.Fields("kod_52") = rs3.Fields("Код Вида услуг (52 справочник)")
						.Fields("kod_33") = rs3.Fields("Код Целевой программы (33 справочник)")
						.Fields("kod_39") = rs3.Fields("Код Месторождения (39 справочник)")
						.Fields("kod_47") = rs3.Fields("Код элементов затрат (47 справочник)")
						.Fields("kod_13") = rs3.Fields("Код прочих доходов и расходов (кроме прочих р-ций,13 справочник)")
						.Fields("kod_103") = rs3.Fields("Код Вида производств (103 справочник)")
						.Fields("kod_24") = rs3.Fields("Код Вида деятельности (24 справочник)")
						.Fields("kod_AFE") = rs3.Fields("Код AFE (справочник АФЕ)")
						.Fields("recoverable") = rs3.Fields("Возмещаемые (если агентский договор прописывать № договора )")
						.Fields("kod_Cdelka") = rs3.Fields("Код типа сделки (справочник сделок)")
						.Fields("kod_StatBud") = rs3.Fields("Код статьи бюджета (справочник Статей бюджета)")
						.Fields("numberLot") = rs3.Fields("Номер лота")
						.Fields("ZKprotocol") = rs3.Fields("Протокол ЗК")
						.Fields("kod_edizm") = rs3.Fields("Единица измерения")
						.Fields("kod_urovuslug") = rs3.Fields("Уровень обслуживания(Эконом/Стандарт/Премиум)")
						.Fields("cost") = rs3.Fields("Тариф за единицу в месяц (без НДС, руб)")
						.Fields("valuta") = rs3.Fields("Валюта договора")
						.Fields("procNDS") = rs3.Fields("Процент НДС")
						.Fields("coefficient") = rs3.Fields("Целевой коэффициент")
						.Fields("volume") = rs3.Fields("Объем обслуживаемых единиц")
						.Fields("sum") = rs3.Fields("Сумма в месяц, рублей, без НДС")
						.Update
						End With
					End If
 						If i < rs3.RecordCount Then
							 rs3.MoveNext 'если переменная цикла не добралась до конца то двигаем рекордсет eXcel на следующую запись
						End If
    Next i
 End if
idone = 2
    MsgBox "Загрузка прошла успешно"
    DoCmd.OpenQuery "tstSKID_DogovorFact"
    DoCmd.Close acForm, "I?iaa?ea caa?ocee"


...
Рейтинг: 0 / 0
Логирование
    #39196733
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noobs,

If rs3.BOF And rs3.EOF Then
MsgBox "Файл пуст"
Else


нету End If
...
Рейтинг: 0 / 0
Логирование
    #39196740
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noobs, самый первый закрой
Код: vbnet
1.
 If idone = 2 Then


замечания
для ADO излишне - убрать
Код: vbnet
1.
rs3.MoveLast: rs3.MoveFirst 'прогон рекордсета на последнюю запись и назад к первой для правильного подсчета количества записей


Не мешай DAO и ADO (ИМХО) - измени оба
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
          '********************управления*********************
 '           s1 = "select [kod_upr] from [NCI_UPR_1214]"
 '           Set rs1214 = CurrentDb.OpenRecordset(s1)
            
 '           Do While rs1214.EOF = False
 '           s1214 = s1214 & "_" & rs1214.Fields(0) & "_"
'            'строка с управлениями
 '           rs1214.MoveNext
'            Loop
'            rs1214.Close
'            Set rs1214 = Nothing
With CurrentProject.Connection.Execute("select [kod_upr] from [NCI_UPR_1214]")
        If not .EOF then s1214 = .GetString(RowDelimeter:="_")
    .Close
End With
            '*****************************************


Я бы заменил
Код: vbnet
1.
2.
3.
4.
5.
6.
For i = 1 To rs3.RecordCount 'цикл по записям рекордсета из excel
....
 						If i < rs3.RecordCount Then
							 rs3.MoveNext 'если переменная цикла не добралась до конца то двигаем рекордсет eXcel на следующую запись
						End If
    Next i

на
Код: vbnet
1.
2.
3.
4.
 Do Until rs3.EOF
    ...
    rs3.MoveNext
Loop


Упростить
Код: vbnet
1.
2.
.Fields("year") = rs3.Fields(0)'по порядку
' можно использовать недокументированный rs3.Collect(0) - работает быстрее



Вроде как на вскидку усё... Хотя...
...
Рейтинг: 0 / 0
Логирование
    #39196744
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу последнего предложения
Код: vbnet
1.
2.
.Fields("year") = rs3.Fields(0)'по порядку
' можно использовать недокументированный rs3.Collect(0) - работает быстрее

Если поставить поля по порядку (в запросе), то можно "портянку" с присвоением значений заменить на цикл.
...
Рейтинг: 0 / 0
Логирование
    #39196767
noobs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо большое что уделили время моей теме, все исправил работает.
Отдельное спасибо непоймучка, буду стараться писать красивый код.
...
Рейтинг: 0 / 0
Логирование
    #39196773
noobs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПанургПо поводу последнего предложения
Код: vbnet
1.
2.
.Fields("year") = rs3.Fields(0)'по порядку
' можно использовать недокументированный rs3.Collect(0) - работает быстрее

Если поставить поля по порядку (в запросе), то можно "портянку" с присвоением значений заменить на цикл.

Я думал над этим но так и не смог реализовать.
...
Рейтинг: 0 / 0
Логирование
    #39196820
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noobsПанургПо поводу последнего предложения
...
Если поставить поля по порядку (в запросе), то можно "портянку" с присвоением значений заменить на цикл.Я думал над этим но так и не смог реализовать.Тут несложно это сделать, при условии, что поля стоят в нужной последовательности.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
...
    .AddNew
        For i=0 to .Fields.Count-1
            .Fields(i) = rs3.Fields(i)
        Next i
    .Update
...

Если поля в источниках (запрос/таблица) стоят не в нужном порядке, можно создать запрос на требуемом источнике и расставить поля в нужной последовательности в это запросе.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Логирование
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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