Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Логирование / 13 сообщений из 13, страница 1 из 1
20.03.2016, 08:01
    #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
20.03.2016, 12:37
    #39196383
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Логирование
noobs,

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

Общую логику не смотрел...
...
Рейтинг: 0 / 0
20.03.2016, 12:38
    #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
20.03.2016, 13:28
    #39196405
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Логирование
noobs,

Код: vbnet
1.
DoCmd.RimSQL Adds



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

нужно сделать чтобы пользователь мог посмотреть какие записи не добавились и почему, вот на что хватило моей фантазии.
Я постараюсь разобраться с if)
...
Рейтинг: 0 / 0
21.03.2016, 08:30
    #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
21.03.2016, 08:50
    #39196733
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Логирование
noobs,

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


нету End If
...
Рейтинг: 0 / 0
21.03.2016, 08:59
    #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
21.03.2016, 09:03
    #39196744
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Логирование
По поводу последнего предложения
Код: vbnet
1.
2.
.Fields("year") = rs3.Fields(0)'по порядку
' можно использовать недокументированный rs3.Collect(0) - работает быстрее

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

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

Я думал над этим но так и не смог реализовать.
...
Рейтинг: 0 / 0
21.03.2016, 10:38
    #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
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Логирование / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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