?мпорт начальных данных в подсистему Отдел Кадров
Roberto (обсуждение | вклад) (→Структура файла) |
Roberto (обсуждение | вклад) (→Макрос импорта) |
||
| Строка 144: | Строка 144: | ||
'#include TCREATOR | '#include TCREATOR | ||
| − | ' | + | Option Explicit |
| − | ' | + | |
| + | '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' | ||
| + | '' На вход передается строка с датой в формате дд.мм.гггг | ||
| + | '' Сконвертированная дата помещается в переменную D | ||
| + | '' Функция возвращает True если конвертация прошла успешно | ||
| + | Function I2W_Str2Date(S, ByRef D) | ||
| + | S = Trim(S) | ||
| + | If S = "" Then | ||
| + | D = Null | ||
| + | I2W_Str2Date = True | ||
| + | Else | ||
| + | I2W_Str2Date = False | ||
| + | |||
| + | Dim A | ||
| + | A = Split(S, ".") | ||
| + | |||
| + | If UBound(A) = 2 Then | ||
| + | If IsNumeric(A(0)) And IsNumeric(A(1)) And IsNumeric(A(2)) Then | ||
| + | If ((A(0) >= 1) And (A(0) <= 31)) And _ | ||
| + | ((A(1) >= 1) And (A(1) <= 12)) And _ | ||
| + | ((A(2) >= 1900) And (A(2) <= 2999)) Then | ||
| + | D = DateSerial(A(2), A(1), A(0)) | ||
| + | I2W_Str2Date = True | ||
| + | End If | ||
| + | End If | ||
| + | End If | ||
| + | End If | ||
| + | End Function | ||
| + | |||
| + | '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' | ||
| + | '' На вход передается строка с вещественным числом | ||
| + | '' В качестве десятичного разделителя используется точка. | ||
| + | '' Сконвертированное значение помещается в переменную N. | ||
| + | '' Функция возвращает True если конвертация прошла успешно | ||
| + | Function I2W_Str2Num(S, ByRef N) | ||
| + | S = Trim(S) | ||
| + | If S = "" Then | ||
| + | N = Null | ||
| + | I2W_Str2Num = True | ||
| + | Else | ||
| + | Dim P | ||
| + | If InStr(S, ".") > 0 Then | ||
| + | P = Len(S) - InStr(S, ".") | ||
| + | S = Left(S, Len(S) - P - 1) & Right(S, P) | ||
| + | Else | ||
| + | P = 0 | ||
| + | End If | ||
| + | |||
| + | If IsNumeric(S) Then | ||
| + | N = CDbl(S) / (10 ^ P) | ||
| + | I2W_Str2Num = True | ||
| + | Else | ||
| + | I2W_Str2Num = False | ||
| + | End If | ||
| + | End If | ||
| + | End Function | ||
| + | |||
| + | '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' | ||
| + | '' На вход передается строка с числом | ||
| + | '' В качестве десятичного разделителя используется точка. | ||
| + | '' Сконвертированное значение приводится к типу Currency и | ||
| + | '' помещается в переменную N. | ||
| + | '' Функция возвращает True если конвертация прошла успешно | ||
| + | Function I2W_Str2Cur(S, ByRef N) | ||
| + | If I2W_Str2Num(S, N) Then | ||
| + | if not IsNull(N) then | ||
| + | N = CCur(N) | ||
| + | end if | ||
| + | I2W_Str2Cur = True | ||
| + | Else | ||
| + | I2W_Str2Cur = False | ||
| + | End If | ||
| + | End Function | ||
| + | |||
| + | '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' | ||
| + | '' На вход передается строка с целым числом | ||
| + | '' Сконвертированное значение помещается в переменную I. | ||
| + | '' Функция возвращает True если конвертация прошла успешно | ||
| + | Function I2W_Str2Int(S, ByRef I) | ||
| + | S = Trim(S) | ||
| + | If S = "" Then | ||
| + | I = Null | ||
| + | I2W_Str2Int = True | ||
| + | Else | ||
| + | I2W_Str2Int = False | ||
| + | |||
| + | If IsNumeric(S) Then | ||
| + | If Int(S) = CDbl(S) Then | ||
| + | I = CLng(S) | ||
| + | I2W_Str2Int = True | ||
| + | End If | ||
| + | End If | ||
| + | End If | ||
| + | End Function | ||
| + | |||
| + | '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' | ||
| + | '' На вход передается строка в CSV формате и символ разделитель. | ||
| + | '' На выходе -- массив значений | ||
| + | Function I2W_Split(S, DelimChar) | ||
| + | Const QuoteChar = """" | ||
| + | |||
| + | ReDim Result(0) | ||
| + | Dim I, B, E, CurrChar, InQuotes | ||
| + | |||
| + | I = 0 | ||
| + | B = 1 | ||
| + | E = 1 | ||
| + | InQuotes = False | ||
| + | Result(0) = "" | ||
| + | S = Trim(S) | ||
| + | |||
| + | While E <= Len(S) | ||
| + | CurrChar = Mid(S, E, 1) | ||
| + | |||
| + | If CurrChar = QuoteChar Then | ||
| + | If Mid(S, E + 1, 1) = QuoteChar Then | ||
| + | E = E + 1 | ||
| + | ElseIf Mid(S, E + 1, 1) = DelimChar Then | ||
| + | If InQuotes Then | ||
| + | CurrChar = "" | ||
| + | InQuotes = False | ||
| + | End If | ||
| + | ElseIf E = B Then | ||
| + | InQuotes = True | ||
| + | CurrChar = "" | ||
| + | End If | ||
| + | ElseIf (CurrChar = DelimChar) And (Not InQuotes) Then | ||
| + | I = I + 1 | ||
| + | ReDim Preserve Result(I) | ||
| + | Result(I) = "" | ||
| + | B = E + 1 | ||
| + | CurrChar = "" | ||
| + | End If | ||
| + | |||
| + | Result(I) = Result(I) & CurrChar | ||
| + | E = E + 1 | ||
| + | WEnd | ||
| + | |||
| + | If (UBound(Result) > 0) And (Result(UBound(Result)) = "") Then | ||
| + | ReDim Preserve Result(UBound(Result) - 1) | ||
| + | End If | ||
| + | |||
| + | I2W_Split = Result | ||
| + | End Function | ||
| + | |||
| + | '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' | ||
| + | '' На вход передается строка в CSV формате и массив FieldDef | ||
| + | '' с описанием полей. Каждый элемент массива -- это массив | ||
| + | '' из4-х элементов: | ||
| + | '' 1 -- имя поля (справочно, в самой функции не используется) | ||
| + | '' 2 -- тип поля, "S" -- строка, "D" -- дата, | ||
| + | '' "F" -- вещественное число, "C" -- денежный тип, | ||
| + | '' "I" -- целое число. | ||
| + | '' 3 -- максимальная длина строки. Для остальных типов | ||
| + | '' не используется. | ||
| + | '' 4 -- булевский признак обязательного поля. | ||
| + | '' Функция возвращает значения: | ||
| + | '' -99 -- если строка разобрана успешно и значения помещены в | ||
| + | '' массив ArrOutput | ||
| + | '' -1 -- количество значений в строке не совпадает с количеством | ||
| + | '' элементов в массиве ArrOutput | ||
| + | '' положительное число -- номер поля для которого выявлено | ||
| + | '' несоответствие типов данных, или длина для строковых значений | ||
| + | '' превышает максимальную заданную длину, или указан признак | ||
| + | '' обязательного поля а в исходной CSV строке для этого поля | ||
| + | '' передана пустая строка. | ||
| + | Function I2W_Parse(S, ByRef FieldDef, ByRef ArrOutput) | ||
| + | |||
| + | Dim I2W_Parse_Success, I2W_Parse_InvalidFieldCount | ||
| + | I2W_Parse_Success = -99 | ||
| + | I2W_Parse_InvalidFieldCount = -1 | ||
| + | |||
| + | Dim ArrInput, I, V, F | ||
| + | ArrInput = I2W_Split(S, ";") | ||
| + | |||
| + | If UBound(ArrInput) <> UBound(FieldDef) Then | ||
| + | MsgBox UBound(ArrInput) | ||
| + | I2W_Parse = I2W_Parse_InvalidFieldCount | ||
| + | Exit Function | ||
| + | End If | ||
| + | |||
| + | ReDim ArrOutput(UBound(FieldDef)) | ||
| + | |||
| + | For I = 0 To UBound(ArrInput) | ||
| + | F = False | ||
| + | Select Case FieldDef(I)(1) | ||
| + | Case "S" | ||
| + | V = Trim(ArrInput(I)) | ||
| + | If Len(V) > FieldDef(I)(2) Then | ||
| + | V = Left(V, FieldDef(I)(2)) | ||
| + | End If | ||
| + | F = Not (FieldDef(I)(3) And (V = "")) | ||
| + | |||
| + | Case "I" | ||
| + | F = I2W_Str2Int(ArrInput(I), V) | ||
| + | |||
| + | Case "F" | ||
| + | F = I2W_Str2Num(ArrInput(I), V) | ||
| + | |||
| + | Case "C" | ||
| + | F = I2W_Str2Cur(ArrInput(I), V) | ||
| + | |||
| + | Case "D" | ||
| + | F = I2W_Str2Date(ArrInput(I), V) | ||
| + | End Select | ||
| + | |||
| + | If F Then | ||
| + | ArrOutput(I) = V | ||
| + | Else | ||
| + | I2W_Parse = I | ||
| + | Exit Function | ||
| + | End If | ||
| + | Next | ||
| + | |||
| + | I2W_Parse = I2W_Parse_Success | ||
| + | End Function | ||
| + | |||
| + | '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' | ||
| + | '' Функция возвращает значение поля. | ||
| + | '' На вход передается имя поля, массив массивов со спецификациями | ||
| + | '' полей и массив со значениями полей. | ||
| + | '' Если поле с указанным именем не найдено возвращается Empty. | ||
| + | Function I2W_FieldByName(AName, ByRef AnArray, ByRef AValues) | ||
| + | Dim I | ||
| + | For I = 0 To UBound(AnArray) | ||
| + | If AnArray(I)(0) = AName Then | ||
| + | I2W_FieldByName = AValues(I) | ||
| + | Exit Function | ||
| + | End If | ||
| + | Next | ||
| + | I2W_FieldByName = Empty | ||
| + | End Function | ||
| + | |||
| + | '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' | ||
| + | '' Процедура записывает информацию в лог платформы Гедымин. | ||
| + | '' Запись осуществляется на переданной транзакции. | ||
| + | Sub I2W_Log(ByRef ATransaction, AClassName, AnID, AData) | ||
| + | Dim Creator, q, Tr | ||
| + | Set Creator = New TCreator | ||
| + | Set q = Creator.GetObject(nil, "TIBSQL", "") | ||
| + | |||
| + | If Assigned(ATransaction) Then | ||
| + | q.Transaction = ATransaction | ||
| + | Else | ||
| + | Set Tr = Creator.GetObject(nil, "TIBTransaction", "") | ||
| + | Tr.DefaultDatabase = IBLogin.Database | ||
| + | Tr.StartTransaction | ||
| + | q.Transaction = Tr | ||
| + | End If | ||
| + | |||
| + | q.SQL.Text = "INSERT INTO gd_journal (source, objectid, data) " &_ | ||
| + | "VALUES (:s, :id, :d)" | ||
| + | q.ParamByName("s").AsString = AClassName | ||
| + | q.ParamByName("id").AsInteger = AnID | ||
| + | q.ParamByName("d").AsString = AData | ||
| + | q.ExecQuery | ||
| + | |||
| + | If Not Assigned(ATransaction) Then | ||
| + | Tr.Commit | ||
| + | End If | ||
| + | End Sub | ||
| + | |||
| + | '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' | ||
| + | '' Функция ищет объект в базе данных по заданному значению поля. | ||
| + | '' Если объект не найден, то он создается. | ||
| + | '' На вход передается транзакция, имя класса и подтип объекта, | ||
| + | '' имя поля для поиска и значение для поиска. | ||
| + | '' Два массива (AFields и AValues) содержат имена полей и значения | ||
| + | '' полей, которые будут использованы при создании нового объекта. | ||
| + | '' Функция возвращает ИД найденного или созданного объекта. | ||
| + | '' Через параметр Found возвращается булевский признак: | ||
| + | '' True -- объект был найден | ||
| + | '' False -- объект был создан | ||
| + | Function I2W_GetID(ByRef ATransaction, AClassName, ASubType, ASearchField, _ | ||
| + | ASearchValue, AFields, AValues, NeedUpdate, ByRef AFound) | ||
| + | |||
| + | I2W_GetID = Null | ||
| + | AFound = False | ||
| + | |||
| + | If IsNull(ASearchValue) Then Exit Function | ||
| + | If ASearchValue = "" Then Exit Function | ||
| + | |||
| + | Dim Creator, Obj, I | ||
| + | |||
| + | Set Creator = New TCreator | ||
| + | Set Obj = Creator.GetObject(nil, AClassName, "") | ||
| + | Set Obj.ReadTransaction = ATransaction | ||
| + | Set Obj.Transaction = ATransaction | ||
| + | Obj.SubType = ASubType | ||
| + | If IsDate(ASearchValue) Then | ||
| + | Obj.ExtraConditions.Add(ASearchField & "=:SearchValue") | ||
| + | Obj.ParamByName("SearchValue").AsDateTime = ASearchValue | ||
| + | ElseIf IsNumeric(ASearchValue) Then | ||
| + | Obj.ExtraConditions.Add(ASearchField & "=:SearchValue") | ||
| + | Obj.ParamByName("SearchValue").Value = ASearchValue | ||
| + | Else | ||
| + | If UCase(ASearchField) = "NAME" Then | ||
| + | ASearchField = "z." & ASearchField | ||
| + | End If | ||
| + | If UCase(ASearchField) = "USR$NAME" Then | ||
| + | ASearchField = "z." & ASearchField | ||
| + | End If | ||
| + | Obj.ExtraConditions.Add("UPPER(" & ASearchField & ")=:SearchValue") | ||
| + | Obj.ParamByName("SearchValue").AsString = UCase(ASearchValue) | ||
| + | End If | ||
| + | |||
| + | Obj.Open | ||
| + | |||
| + | If Obj.EOF Then | ||
| + | Obj.Insert | ||
| + | For I = 0 To UBound(AFields) | ||
| + | If Err.Number <> 0 Then Exit For | ||
| + | Obj.FieldByName(AFields(I)).Value = AValues(I) | ||
| + | Next | ||
| + | If Err.Number = 0 Then | ||
| + | Obj.Post | ||
| + | I2W_GetID = Obj.ID | ||
| + | I2W_Log ATransaction, AClassName, Obj.ID, "Импорт: Создан объект." | ||
| + | Else | ||
| + | Obj.Cancel | ||
| + | End If | ||
| + | Else | ||
| + | I2W_GetID = Obj.ID | ||
| + | if NeedUpdate then | ||
| + | Obj.Edit | ||
| + | For I = 0 To UBound(AFields) | ||
| + | If Err.Number <> 0 Then Exit For | ||
| + | Obj.FieldByName(AFields(I)).Value = AValues(I) | ||
| + | Next | ||
| + | If Err.Number = 0 Then | ||
| + | Obj.Post | ||
| + | I2W_GetID = Obj.ID | ||
| + | I2W_Log ATransaction, AClassName, Obj.ID, "Импорт: Изменен объект." | ||
| + | Else | ||
| + | Obj.Cancel | ||
| + | End If | ||
| + | else | ||
| + | I2W_Log ATransaction, AClassName, Obj.ID, "Импорт: Найден объект." | ||
| + | end if | ||
| + | AFound = True | ||
| + | |||
| + | End If | ||
| + | End Function | ||
Sub I2W_ImportData | Sub I2W_ImportData | ||
| Строка 156: | Строка 498: | ||
Dim fso, f | Dim fso, f | ||
| − | ReDim FieldValues( | + | ReDim FieldValues(45) |
| − | ReDim FieldDefs( | + | ReDim FieldDefs(45) |
| − | FieldDefs(0) = Array("surname", | + | FieldDefs(0) = Array("surname", "S", 20, True) |
| − | FieldDefs(1) = Array("firstname", | + | FieldDefs(1) = Array("firstname", "S", 20, True) |
| − | FieldDefs(2) = Array("middlename", | + | FieldDefs(2) = Array("middlename", "S", 20, False) |
| − | FieldDefs(3) = Array(" | + | FieldDefs(3) = Array("birthday", "D", 0, True) |
| − | FieldDefs(4) = Array("usr$wg_bcity", | + | FieldDefs(4) = Array("usr$wg_bcity", "S", 32, False) |
| − | FieldDefs(5) = Array("usr$wg_bdistrict", | + | FieldDefs(5) = Array("usr$wg_bdistrict", "S", 32, False) |
| − | FieldDefs(6) = Array("usr$wg_bregion", | + | FieldDefs(6) = Array("usr$wg_bregion", "S", 20, False) |
| − | FieldDefs(7) = Array("usr$wg_bcountry", | + | FieldDefs(7) = Array("usr$wg_bcountry", "S", 32, False) |
| − | FieldDefs(8) = Array("passportnumber", | + | FieldDefs(8) = Array("passportnumber", "S", 40, False) |
| − | FieldDefs(9) = Array("passportissdate", | + | FieldDefs(9) = Array("passportissdate", "D", 0, False) |
| − | FieldDefs(10) = Array("passportissuer", | + | FieldDefs(10) = Array("passportissuer", "S", 40, False) |
| − | FieldDefs(11) = Array("passportexpdate", | + | FieldDefs(11) = Array("passportexpdate", "D", 0, False) |
| − | FieldDefs(12) = Array("personalnumber", | + | FieldDefs(12) = Array("personalnumber", "S", 40, True) |
| − | FieldDefs(13) = Array("usr$insurancenumber", "S", 40, True) | + | FieldDefs(13) = Array("usr$insurancenumber", "S", 40, True) |
| − | FieldDefs(14) = Array("hzip", | + | FieldDefs(14) = Array("hzip", "S", 20, False) |
| − | FieldDefs(15) = Array("hcountry", | + | FieldDefs(15) = Array("hcountry", "S", 20, False) |
| − | FieldDefs(16) = Array("hsity", | + | FieldDefs(16) = Array("hsity", "S", 20, False) |
| − | FieldDefs(17) = Array("haddress", | + | FieldDefs(17) = Array("haddress", "S", 60, False) |
| − | FieldDefs(18) = Array("hphone", | + | FieldDefs(18) = Array("hphone", "S", 20, False) |
| − | FieldDefs(19) = Array("sex", | + | FieldDefs(19) = Array("sex", "S", 1, False) |
| − | FieldDefs(20) = Array("usr$education", | + | FieldDefs(20) = Array("usr$education", "S", 40, False) |
| − | FieldDefs(21) = Array("usr$maritalstatus", | + | FieldDefs(21) = Array("usr$maritalstatus", "S", 20, False) |
| − | FieldDefs(22) = Array("usr$nationalilty", | + | FieldDefs(22) = Array("usr$nationalilty", "S", 40, False) |
| − | FieldDefs(23) = Array("usr$mr_fitness", | + | FieldDefs(23) = Array("usr$mr_fitness", "S", 20, False) |
| − | FieldDefs(24) = Array("usr$mr_rank", | + | FieldDefs(24) = Array("usr$mr_rank", "S", 60, False) |
| − | FieldDefs(25) = Array("usr$mr_regoffice", | + | FieldDefs(25) = Array("usr$mr_regoffice", "S", 60, False) |
| − | FieldDefs(26) = Array("usr$mr_prof", | + | FieldDefs(26) = Array("usr$mr_prof", "I", 0, False) |
| − | FieldDefs(27) = Array("usr$listnumber", | + | FieldDefs(27) = Array("usr$listnumber", "S", 10, False) |
| − | FieldDefs(28) = Array("datebegin", | + | FieldDefs(28) = Array("datebegin", "D", 0, True) |
| − | FieldDefs(29) = Array("begin_number", | + | FieldDefs(29) = Array("begin_number", "S", 20, False) |
| − | FieldDefs(30) = Array("last_date", | + | FieldDefs(30) = Array("last_date", "D", 0, False) |
| − | FieldDefs(31) = Array("last_number", | + | FieldDefs(31) = Array("last_number", "S", 20, False) |
| − | FieldDefs(32) = Array("position", | + | FieldDefs(32) = Array("position", "S", 60, False) |
| − | FieldDefs(33) = Array("department", | + | FieldDefs(33) = Array("department", "S", 60, False) |
| − | FieldDefs(34) = Array("usr$wg_payform", | + | FieldDefs(34) = Array("usr$wg_payform", "S", 20, False) |
| − | FieldDefs(35) = Array("usr$wg_kindofwork", | + | FieldDefs(35) = Array("usr$wg_kindofwork", "S", 20, False) |
| − | FieldDefs(36) = Array("usr$wg_workcharacter","S", 20, False) | + | FieldDefs(36) = Array("usr$wg_workcharacter", "S", 20, False) |
| − | FieldDefs(37) = Array("usr$pastcat", | + | FieldDefs(37) = Array("usr$pastcat", "I", 0, False) |
| − | FieldDefs(38) = Array("usr$msalary", | + | FieldDefs(38) = Array("usr$msalary", "C", 0, False) |
| − | + | ||
| + | FieldDefs(39) = Array("edu_USR$ACADEMYKEY", "S", 60, False) | ||
| + | FieldDefs(40) = Array("edu_USR$OKSO", "S", 60, False) | ||
| + | FieldDefs(41) = Array("edu_USR$SPECKEY", "S", 60, False) | ||
| + | FieldDefs(42) = Array("edu_USR$OKPDTR", "S", 20, False) | ||
| + | FieldDefs(43) = Array("edu_USR$PROFESSIONKEY", "S", 60, False) | ||
| + | FieldDefs(44) = Array("edu_USR$DIPLOMA", "S", 20, False) | ||
| + | FieldDefs(45) = Array("USR$SENIORITY", "D", 0, False) | ||
| + | |||
Set fso = CreateObject("Scripting.FileSystemObject") | Set fso = CreateObject("Scripting.FileSystemObject") | ||
Set f = fso.OpenTextFile(Dlg.FileName, 1) | Set f = fso.OpenTextFile(Dlg.FileName, 1) | ||
| Строка 206: | Строка 556: | ||
Set Tr.DefaultDatabase = IBLogin.Database | Set Tr.DefaultDatabase = IBLogin.Database | ||
Tr.StartTransaction | Tr.StartTransaction | ||
| + | |||
| + | dim OrderDate, qOrder, qOrderMove | ||
| + | set qOrder = Creator.GetObject(nil, "TIBSQL", "") | ||
| + | qOrder.Transaction = Tr | ||
| + | qOrder.SQL.Text = _ | ||
| + | "SELECT " & _ | ||
| + | " ml.DOCUMENTKEY " & _ | ||
| + | "FROM USR$WG_MOVEMENTLINE ml " & _ | ||
| + | "WHERE ml.USR$EMPLKEY = :EmplKey " & _ | ||
| + | " AND ml.USR$KINDOFWORKKEY = :KOW " & _ | ||
| + | " AND ml.USR$MOVEMENTTYPE = 1 " | ||
| + | |||
| + | set qOrderMove = Creator.GetObject(nil, "TIBSQL", "") | ||
| + | qOrderMove.Transaction = Tr | ||
| + | qOrderMove.SQL.Text = _ | ||
| + | "SELECT " & _ | ||
| + | " ml.DOCUMENTKEY " & _ | ||
| + | "FROM USR$WG_MOVEMENTLINE ml " & _ | ||
| + | "WHERE ml.USR$EMPLKEY = :EmplKey " & _ | ||
| + | " AND ml.USR$KINDOFWORKKEY = :KOW " & _ | ||
| + | " AND ml.USR$DATEBEGIN = :DB " & _ | ||
| + | " AND ml.USR$MOVEMENTTYPE = 2 " | ||
| + | |||
Dim AFolderKey, AImportDeptKey, Found | Dim AFolderKey, AImportDeptKey, Found | ||
AFolderKey = I2W_GetID(Tr, "TgdcFolder", "", _ | AFolderKey = I2W_GetID(Tr, "TgdcFolder", "", _ | ||
"name", "Импорт данных", _ | "name", "Импорт данных", _ | ||
| − | Array("name"), Array("Импорт данных"), Found) | + | Array("name"), Array("Импорт данных"), False, Found) |
AImportDeptKey = I2W_GetID(Tr, "TgdcDepartment", "", _ | AImportDeptKey = I2W_GetID(Tr, "TgdcDepartment", "", _ | ||
"name", "Импорт данных", _ | "name", "Импорт данных", _ | ||
| − | Array("parent", "name"), Array(IBLogin.CompanyKey, "Импорт данных"), Found) | + | Array("parent", "name"), Array(IBLogin.CompanyKey, "Импорт данных"), False, Found) |
Dim FirstOrder, FirstOrderLine, FirstOrderDS | Dim FirstOrder, FirstOrderLine, FirstOrderDS | ||
| Строка 236: | Строка 609: | ||
FirstOrder.FieldByName("number").AsString = "импорт 1" | FirstOrder.FieldByName("number").AsString = "импорт 1" | ||
FirstOrder.Post | FirstOrder.Post | ||
| − | + | ||
I2W_Log Tr, "TgdcUserDocument", FirstOrder.ID, "Импорт: Создан приказ о приеме." | I2W_Log Tr, "TgdcUserDocument", FirstOrder.ID, "Импорт: Создан приказ о приеме." | ||
| Строка 262: | Строка 635: | ||
I2W_Log Tr, "TgdcUserDocument", LastOrder.ID, "Импорт: Создан приказ о переводе." | I2W_Log Tr, "TgdcUserDocument", LastOrder.ID, "Импорт: Создан приказ о переводе." | ||
| − | + | ||
J = 1 | J = 1 | ||
ErrMsg = "" | ErrMsg = "" | ||
Do While Not f.AtEndOfStream | Do While Not f.AtEndOfStream | ||
Res = I2W_Parse(f.ReadLine, FieldDefs, FieldValues) | Res = I2W_Parse(f.ReadLine, FieldDefs, FieldValues) | ||
| + | |||
Select Case Res | Select Case Res | ||
| Строка 273: | Строка 647: | ||
Dim EducationTypeKey, FamStatusKey, NationKey, MartFitnessKey, MilRankKey, EmployeeKey | Dim EducationTypeKey, FamStatusKey, NationKey, MartFitnessKey, MilRankKey, EmployeeKey | ||
Dim PersonalCardKey, KindOfWorkTemp | Dim PersonalCardKey, KindOfWorkTemp | ||
| + | Dim EducationKey, SpecGroupKey, ProfKey, AcademyKey, SenKey | ||
EducationTypeKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_EDUCTIONTYPE", _ | EducationTypeKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_EDUCTIONTYPE", _ | ||
"usr$name", I2W_FieldByName("usr$education", FieldDefs, FieldValues), _ | "usr$name", I2W_FieldByName("usr$education", FieldDefs, FieldValues), _ | ||
| − | Array("usr$name"), Array(I2W_FieldByName("usr$education", FieldDefs, FieldValues)), Found) | + | Array("usr$name"), Array(I2W_FieldByName("usr$education", FieldDefs, FieldValues)), False, Found) |
FamStatusKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_FAMSTATUS", _ | FamStatusKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_FAMSTATUS", _ | ||
"usr$name", I2W_FieldByName("usr$maritalstatus", FieldDefs, FieldValues), _ | "usr$name", I2W_FieldByName("usr$maritalstatus", FieldDefs, FieldValues), _ | ||
| − | Array("usr$name"), Array(I2W_FieldByName("usr$maritalstatus", FieldDefs, FieldValues)), Found) | + | Array("usr$name"), Array(I2W_FieldByName("usr$maritalstatus", FieldDefs, FieldValues)), False, Found) |
NationKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_NATION", _ | NationKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_NATION", _ | ||
"usr$name", I2W_FieldByName("usr$nationalilty", FieldDefs, FieldValues), _ | "usr$name", I2W_FieldByName("usr$nationalilty", FieldDefs, FieldValues), _ | ||
| − | Array("usr$name"), Array(I2W_FieldByName("usr$nationalilty", FieldDefs, FieldValues)), Found) | + | Array("usr$name"), Array(I2W_FieldByName("usr$nationalilty", FieldDefs, FieldValues)), False, Found) |
MartFitnessKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_MARTFITNESS", _ | MartFitnessKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_MARTFITNESS", _ | ||
"usr$name", I2W_FieldByName("usr$mr_fitness", FieldDefs, FieldValues), _ | "usr$name", I2W_FieldByName("usr$mr_fitness", FieldDefs, FieldValues), _ | ||
| − | Array("usr$name"), Array(I2W_FieldByName("usr$mr_fitness", FieldDefs, FieldValues)), Found) | + | Array("usr$name"), Array(I2W_FieldByName("usr$mr_fitness", FieldDefs, FieldValues)), False, Found) |
MilRankKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_MILRATE", _ | MilRankKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_MILRATE", _ | ||
"usr$name", I2W_FieldByName("usr$mr_rank", FieldDefs, FieldValues), _ | "usr$name", I2W_FieldByName("usr$mr_rank", FieldDefs, FieldValues), _ | ||
| − | Array("usr$name"), Array(I2W_FieldByName("usr$mr_rank", FieldDefs, FieldValues)), Found) | + | Array("usr$name"), Array(I2W_FieldByName("usr$mr_rank", FieldDefs, FieldValues)), False, Found) |
MilOfficeKey = I2W_GetID(Tr, "TgdcCompany", "", _ | MilOfficeKey = I2W_GetID(Tr, "TgdcCompany", "", _ | ||
"name", I2W_FieldByName("usr$mr_regoffice", FieldDefs, FieldValues), _ | "name", I2W_FieldByName("usr$mr_regoffice", FieldDefs, FieldValues), _ | ||
| − | Array("parent", "name"), Array(AFolderKey, I2W_FieldByName("usr$mr_regoffice", FieldDefs, FieldValues)), Found) | + | Array("parent", "name"), Array(AFolderKey, I2W_FieldByName("usr$mr_regoffice", FieldDefs, FieldValues)), False, Found) |
MRSKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_MRS", _ | MRSKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_MRS", _ | ||
"usr$number", I2W_FieldByName("usr$mr_prof", FieldDefs, FieldValues), _ | "usr$number", I2W_FieldByName("usr$mr_prof", FieldDefs, FieldValues), _ | ||
| − | Array("usr$number"), Array(I2W_FieldByName("usr$mr_prof", FieldDefs, FieldValues)), Found) | + | Array("usr$number"), Array(I2W_FieldByName("usr$mr_prof", FieldDefs, FieldValues)), False, Found) |
PositionKey = I2W_GetID(Tr, "TgdcWgPosition", "", _ | PositionKey = I2W_GetID(Tr, "TgdcWgPosition", "", _ | ||
"name", I2W_FieldByName("position", FieldDefs, FieldValues), _ | "name", I2W_FieldByName("position", FieldDefs, FieldValues), _ | ||
| − | Array("name"), Array(I2W_FieldByName("position", FieldDefs, FieldValues)), Found) | + | Array("name"), Array(I2W_FieldByName("position", FieldDefs, FieldValues)), False, Found) |
PayFormKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_PAYFORM", _ | PayFormKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_PAYFORM", _ | ||
"usr$name", I2W_FieldByName("usr$wg_payform", FieldDefs, FieldValues), _ | "usr$name", I2W_FieldByName("usr$wg_payform", FieldDefs, FieldValues), _ | ||
| − | Array("usr$name"), Array(I2W_FieldByName("usr$wg_payform", FieldDefs, FieldValues)), Found) | + | Array("usr$name"), Array(I2W_FieldByName("usr$wg_payform", FieldDefs, FieldValues)), False, Found) |
| + | |||
| + | If IsNull(I2W_FieldByName("usr$wg_kindofwork", FieldDefs, FieldValues)) Then | ||
| + | KindOfWorkTemp = "01" | ||
| + | Else | ||
| + | KindOfWorkTemp = Trim(I2W_FieldByName("usr$wg_kindofwork", FieldDefs, FieldValues)) | ||
| + | |||
| + | If Not IsNumeric(KindOfWorkTemp) Then | ||
| + | Select Case UCase(KindOfWorkTemp) | ||
| + | Case "ОСНОВНОЙ" | ||
| + | KindOfWorkTemp = "01" | ||
| + | Case "КОНТРАКТ" | ||
| + | KindOfWorkTemp = "01" | ||
| + | Case "СОВМЕСТИТЕЛЬ" | ||
| + | KindOfWorkTemp = "02" | ||
| + | Case Else | ||
| + | If InStr(1, KindOfWorkTemp, "СОВМЕСТИТЕЛЬ ПО КОНТ", vbTextCompare) = 1 Then ' СОВМЕСТИТЕЛЬ ПО КОНТРАКТУ | ||
| + | KindOfWorkTemp = "02" | ||
| + | ElseIf InStr(1, KindOfWorkTemp, "СОВМЕСТИТЕЛЬ СО СТОР", vbTextCompare) = 1 Then ' СОВМЕСТИТЕЛЬ СО СТОРОНЫ | ||
| + | KindOfWorkTemp = "03" | ||
| + | ElseIf InStr(1, KindOfWorkTemp, "СОВМЕСТИТ.ПО КОНТР.С", vbTextCompare) = 1 Then ' СОВМЕСТИТ.ПО КОНТР.СО СТОРОНЫ | ||
| + | KindOfWorkTemp = "03" | ||
| + | Else | ||
| + | KindOfWorkTemp = "01" | ||
| + | End If | ||
| + | End Select | ||
| + | End If | ||
| + | End If | ||
| + | |||
| + | If IsNumeric(KindOfWorkTemp) Then | ||
| + | KindOfWorkKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_KINDOFWORK", _ | ||
| + | "usr$code", KindOfWorkTemp, _ | ||
| + | Array("usr$code", "usr$name"), Array(KindOfWorkTemp, KindOfWorkTemp), False, Found) | ||
| + | Else | ||
| + | KindOfWorkKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_KINDOFWORK", _ | ||
| + | "usr$name", KindOfWorkTemp, _ | ||
| + | Array("usr$name"), Array(KindOfWorkTemp), False, Found) | ||
| + | End If | ||
CharacterKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_WORKCHARACTER", _ | CharacterKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_WORKCHARACTER", _ | ||
"usr$name", I2W_FieldByName("usr$wg_workcharacter", FieldDefs, FieldValues), _ | "usr$name", I2W_FieldByName("usr$wg_workcharacter", FieldDefs, FieldValues), _ | ||
| − | Array("usr$name"), Array(I2W_FieldByName("usr$wg_workcharacter", FieldDefs, FieldValues)), Found) | + | Array("usr$name"), Array(I2W_FieldByName("usr$wg_workcharacter", FieldDefs, FieldValues)), False, Found) |
DeptKey = I2W_GetID(Tr, "TgdcDepartment", "", _ | DeptKey = I2W_GetID(Tr, "TgdcDepartment", "", _ | ||
"name", I2W_FieldByName("department", FieldDefs, FieldValues), _ | "name", I2W_FieldByName("department", FieldDefs, FieldValues), _ | ||
| − | Array("parent", "name"), Array(AImportDeptKey, I2W_FieldByName("department", FieldDefs, FieldValues)), Found) | + | Array("parent", "name"), Array(AImportDeptKey, I2W_FieldByName("department", FieldDefs, FieldValues)), False, Found) |
If IsNull(DeptKey) Then | If IsNull(DeptKey) Then | ||
DeptKey = AImportDeptKey | DeptKey = AImportDeptKey | ||
End If | End If | ||
| + | |||
| + | ProfKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_PROFESSIONS", _ | ||
| + | "usr$name", I2W_FieldByName("edu_USR$PROFESSIONKEY", FieldDefs, FieldValues), _ | ||
| + | Array("usr$name", "USR$OKPDTR"), _ | ||
| + | Array(I2W_FieldByName("edu_USR$PROFESSIONKEY", FieldDefs, FieldValues), _ | ||
| + | I2W_FieldByName("edu_USR$OKPDTR", FieldDefs, FieldValues)), _ | ||
| + | False, Found) | ||
| + | |||
| + | SpecGroupKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_SPECGROUP_NEW", _ | ||
| + | "USR$OKSO", I2W_FieldByName("edu_USR$OKSO", FieldDefs, FieldValues), _ | ||
| + | Array("usr$name", "USR$OKSO"), _ | ||
| + | Array(I2W_FieldByName("edu_USR$SPECKEY", FieldDefs, FieldValues), _ | ||
| + | I2W_FieldByName("edu_USR$OKSO", FieldDefs, FieldValues)), _ | ||
| + | False, Found) | ||
| + | |||
| + | AcademyKey = I2W_GetID(Tr, "TgdcCompany", "", _ | ||
| + | "name", I2W_FieldByName("edu_USR$ACADEMYKEY", FieldDefs, FieldValues), _ | ||
| + | Array("parent", "name"), Array(AFolderKey, I2W_FieldByName("edu_USR$ACADEMYKEY", FieldDefs, FieldValues)), False, Found) | ||
| + | |||
| + | |||
Dim EmployeeName | Dim EmployeeName | ||
| Строка 373: | Строка 805: | ||
I2W_FieldByName("hphone", FieldDefs, FieldValues), _ | I2W_FieldByName("hphone", FieldDefs, FieldValues), _ | ||
I2W_FieldByName("sex", FieldDefs, FieldValues) _ | I2W_FieldByName("sex", FieldDefs, FieldValues) _ | ||
| − | ), Found) | + | ), True, Found) |
| − | + | EducationKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_EDUCATION", "usr$emplkey", _ | |
| − | + | EmployeeKey, _ | |
| − | + | Array("USR$EMPLKEY", "USR$ACADEMYKEY", "USR$PROFESSIONKEY", "USR$SPECKEY", "USR$DIPLOMA"), _ | |
| − | + | Array(EmployeeKey, AcademyKey, ProfKey, SpecGroupKey, _ | |
| + | I2W_FieldByName("edu_USR$DIPLOMA", FieldDefs, FieldValues)), _ | ||
| + | False, Found) | ||
| − | + | SenKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_SENIORITY", "usr$emplkey", _ | |
| − | + | EmployeeKey, _ | |
| − | + | Array("USR$EMPLKEY", "USR$SENTYPE", "USR$DATEBEGIN"), _ | |
| − | + | Array(EmployeeKey, 1, _ | |
| − | + | I2W_FieldByName("USR$SENIORITY", FieldDefs, FieldValues)), _ | |
| − | + | False, Found) | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
PersonalCardKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_PERSONALCARD", "usr$emplkey", _ | PersonalCardKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_PERSONALCARD", "usr$emplkey", _ | ||
| Строка 473: | Строка 877: | ||
MilOfficeKey, _ | MilOfficeKey, _ | ||
MRSKey, _ | MRSKey, _ | ||
| − | I2W_FieldByName("usr$listnumber", FieldDefs, FieldValues)), Found) | + | I2W_FieldByName("usr$listnumber", FieldDefs, FieldValues)), True, Found) |
On Error Resume Next | On Error Resume Next | ||
| − | + | OrderDate = I2W_FieldByName("datebegin", FieldDefs, FieldValues) | |
| − | FirstOrderLine.Insert | + | qOrder.Close |
| − | + | qOrder.ParamByName("EmplKey").AsInteger = EmployeeKey | |
| − | + | qOrder.ParamByName("KOW").AsInteger = KindOfWorkKey | |
| − | + | qOrder.ExecQuery | |
| − | + | if qOrder.EoF then | |
| − | + | FirstOrderLine.Insert | |
| − | + | FirstOrderLine.FieldByName("usr$movementtype").AsInteger = 1 | |
| − | + | FirstOrderLine.FieldByName("usr$emplkey").AsInteger = EmployeeKey | |
| − | + | FirstOrderLine.FieldByName("usr$listnumber").AsString = I2W_FieldByName("usr$listnumber", FieldDefs, FieldValues) | |
| − | + | FirstOrderLine.FieldByName("usr$datebegin").AsDateTime = OrderDate | |
| − | + | FirstOrderLine.FieldByName("usr$deptkey").Value = DeptKey | |
| − | + | FirstOrderLine.FieldByName("usr$positionkey").Value = PositionKey | |
| − | + | FirstOrderLine.FieldByName("usr$payformkey").Value = PayFormKey | |
| + | FirstOrderLine.FieldByName("usr$kindofworkkey").Value = KindOfWorkKey | ||
| + | FirstOrderLine.FieldByName("usr$workcharacterkey").Value = CharacterKey | ||
| + | FirstOrderLine.FieldByName("usr$pastcat").Value = I2W_FieldByName("pastcat", FieldDefs, FieldValues) | ||
| + | FirstOrderLine.FieldByName("usr$msalary").Value = I2W_FieldByName("msalary", FieldDefs, FieldValues) | ||
| + | FirstOrderLine.Post | ||
| + | end if | ||
If (Err.Number <> 0) Or (Err.Description > "") Then | If (Err.Number <> 0) Or (Err.Description > "") Then | ||
| Строка 495: | Строка 905: | ||
Else | Else | ||
If (Not IsNull(I2W_FieldByName("last_date", FieldDefs, FieldValues))) And _ | If (Not IsNull(I2W_FieldByName("last_date", FieldDefs, FieldValues))) And _ | ||
| − | (I2W_FieldByName("last_date", FieldDefs, FieldValues) > | + | (I2W_FieldByName("last_date", FieldDefs, FieldValues) > OrderDate) Then |
| − | + | OrderDate = I2W_FieldByName("last_date", FieldDefs, FieldValues) | |
| − | + | qOrderMove.Close | |
| − | + | qOrderMove.ParamByName("EmplKey").AsInteger = EmployeeKey | |
| − | + | qOrderMove.ParamByName("KOW").AsInteger = KindOfWorkKey | |
| − | + | qOrderMove.ParamByName("DB").AsDateTime = OrderDate | |
| − | + | qOrderMove.ExecQuery | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| + | if qOrderMove.EoF then | ||
| + | LastOrderLine.Insert | ||
| + | LastOrderLine.FieldByName("usr$movementtype").AsInteger = 2 | ||
| + | LastOrderLine.FieldByName("usr$emplkey").AsInteger = EmployeeKey | ||
| + | LastOrderLine.FieldByName("usr$listnumber").AsString = I2W_FieldByName("usr$listnumber", FieldDefs, FieldValues) | ||
| + | LastOrderLine.FieldByName("usr$datebegin").AsDateTime = OrderDate | ||
| + | LastOrderLine.FieldByName("usr$deptkey").Value = DeptKey | ||
| + | LastOrderLine.FieldByName("usr$positionkey").Value = PositionKey | ||
| + | LastOrderLine.FieldByName("usr$payformkey").Value = PayFormKey | ||
| + | LastOrderLine.FieldByName("usr$kindofworkkey").Value = KindOfWorkKey | ||
| + | LastOrderLine.FieldByName("usr$workcharacterkey").Value = CharacterKey | ||
| + | LastOrderLine.FieldByName("usr$pastcat").Value = I2W_FieldByName("pastcat", FieldDefs, FieldValues) | ||
| + | LastOrderLine.FieldByName("usr$msalary").Value = I2W_FieldByName("msalary", FieldDefs, FieldValues) | ||
| + | LastOrderLine.Post | ||
| + | end if | ||
If (Err.Number <> 0) Or (Err.Description > "") Then | If (Err.Number <> 0) Or (Err.Description > "") Then | ||
ErrMsg = ErrMsg & "Приказ о переводе: " & Err.Description & " Сотрудник: " & EmployeeName & ". Тип: " & KindOfWorkTemp & vbCrLf | ErrMsg = ErrMsg & "Приказ о переводе: " & Err.Description & " Сотрудник: " & EmployeeName & ". Тип: " & KindOfWorkTemp & vbCrLf | ||
| Строка 516: | Строка 934: | ||
End If | End If | ||
End If | End If | ||
| − | + | ||
On Error GoTo 0 | On Error GoTo 0 | ||
Версия 23:17, 22 апреля 2011
Импорт осуществляется на основе стандартной процедуры импорта из CSV файла. В процессе — создаются два приказа на текущую дату:
- Приказ о приеме на работу с номером "Импорт 1". РУИД типа документа "147017326_119619099".
- Приказ о внутреннем переводе с номером "Импорт 2". РУИД типа документа "147017335_119619099".
Позиции указанных приказов заполняются следующим образом:
| Кадровое движение | Исходные данные | Создаваемые записи |
|---|---|---|
| Сотрудник принят на основное место работы. Внутренних перемещений не было. | В исходном файле присутствует только одна запись для сотрудника. Поле Дата последнего приказа о переводе не заполнено. | Добавляется позиция только в первый приказ. |
| Сотрудник принят на основное место работы. Были внутренние перемещения. | В исходном файле присутствует только одна запись для сотрудника. Поле Дата последнего приказа о переводе содержит значение большее, чем Дата приказа о приеме. | Добавляется позиция в оба приказа. |
| Сотрудник числится на предприятии по основному месту работы и как внутренний совместитель. | В исходном файле присутствуют две записи. У первой — поле Вид работы должно содержать "01", у второй -- "02". Порядок записей в данном случае принципиален! Дата приказа о совмещении должна быть больше или равна дате приказа о приеме на работу. | Как минимум, добавятся две записи в первый приказ. Одна на основное место работы, вторая — на совмещение. Если были перемещения, т.е. поле Дата последнего приказа о переводе содержит значение большее, чем Дата приказа о приеме, то добавятся соответствующие записи во второй приказ. |
| Сотрудник сначала был принят как внешний совместитель, а позже — как основной работник. | Данные не должны попасть в исходный файл импорта. | Кадровое движение по такому сотруднику должно быть создано вручную. |
Если поле Вид работы содержит не числовой код, а наименование, то в процессе импорта записи типа "КОНТРАКТ" превращаются в "ОСНОВНОЙ", "СОВМЕСТИТЕЛЬ ПО КОНТРАКТУ" в "ВНУТРЕННИЙ СОВМЕСТИТЕЛЬ" и т.п. Оригинальный вид работ из исходного файла сохраняется в логе системы и может быть использован для дальнейшей ручной корректировки данных.
Для текущей рабочей организации создается подразделение "Импорт данных", куда помещаются все подразделения и записи контактов, создаваемые в процессе импорта. В дальнейшем, необходимо в ручном режиме объединить эти подразделения с существующими на базе данных.
Структура файла
Поля, отмеченные звездочкой, обязательны для заполнения.
| # поля | Наименование и допустимые значения | Тип данных | Поле в БД |
|---|---|---|---|
| 1 | Фамилия * | VARCHAR(20) | GD_PEOPLE.SURNAME |
| 2 | Имя * | VARCHAR(20) | GD_PEOPLE.FIRSTNAME |
| 3 | Отчество | VARCHAR(20) | GD_PEOPLE.MIDDLENAME |
| 4 | Дата рождения * | DATE | GD_PEOPLE.BIRTHDAY |
| 5 | Место рождения, город | VARCHAR(32) | GD_PEOPLE.USR$WG_BCITY |
| 6 | Место рождения, район | VARCHAR(32) | GD_PEOPLE.USR$WG_BDISTRICT |
| 7 | Место рождения, область | VARCHAR(20) | GD_PEOPLE.USR$WG_BREGION |
| 8 | Место рождения, страна | VARCHAR(32) | GD_PEOPLE.USR$WG_BCOUNTRY |
| 9 | Серия и номер паспорта | VARCHAR(40) | GD_PEOPLE.PASSPORTNUMBER |
| 10 | Дата выдачи паспорта | DATE | GD_PEOPLE.PASSPORTISSDATE |
| 11 | Орган, выдавший паспорт | VARCHAR(40) | GD_PEOPLE.PASSPORTISSUER |
| 12 | Дата действия паспорта | DATE | GD_PEOPLE.PASSPORTEXPDATE |
| 13 | Личный номер * | VARCHAR(40) | GD_PEOPLE.PERSONALNUMBER |
| 14 | Страховой номер * | VARCHAR(40) | GD_PEOPLE.USR$INSURANCENUMBER |
| 15 | Адрес: индекс | VARCHAR(20) | GD_PEOPLE.HZIP |
| 16 | Адрес: страна | VARCHAR(20) | GD_PEOPLE.HCOUNTRY |
| 17 | Адрес: населенный пункт | VARCHAR(20) | GD_PEOPLE.HCITY |
| 18 | Адрес: улица, дом, корпус, квартира | VARCHAR(60) | GD_PEOPLE.HADDRESS |
| 19 | Телефон | VARCHAR(20) | GD_PEOPLE.HPHONE |
| 20 | Пол (M -- мужской, F -- женский) | CHAR(1) | GD_PEOPLE.SEX |
| 21 | Образование (Высшее, незаконченное высшее, общее среднее, среднее специальное, неполное среднее, начальное общее, базовое профессионально-техническое) | VARCHAR(40) | USR$WG_PERSONALCARD.USR$EDUCATIONTYPEKEY - > USR$WG_EDUCTIONTYPE.USR$NAME |
| 22 | Семейное положение (Женат, замужем, вдовец, вдова, холост, не замужем, разведена, разведен) | VARCHAR(20) | USR$WG_PERSONALCARD.USR$FAMSTATUSKEY -> USR$WG_FAMSTATUS.USR$NAME |
| 23 | Национальность | VARCHAR(24) | USR$WG_PERSONALCARD.USR$NATIONALITY -> USR$WG_NATION.USR$NAME |
| 24 | Годность к воинской службе | VARCHAR(180) | USR$WG_PERSONALCARD.USR$MR_FITNESS - > USR$WG_MARTFITNESS.USR$NAME |
| 25 | Звание | VARCHAR(60) | USR$WG_PERSONALCARD.USR$MR_RANKKEY - > USR$WG_MILRATE.USR$NAME |
| 26 | Военкомат | VARCHAR(60) | USR$WG_PERSONALCARD.USR$MR_REGOFFICEKEY - > GD_CONTACT.NAME |
| 27 | Военно-учетная специальность (ВУС) | INTEGER | USR$WG_PERSONALCARD.USR$MR_PROFKEY -> USR$WG_MRS.USR$NUMBER |
| 28 | Табельный номер | VARCHAR(10) | USR$WG_MOVEMENTLINE.USR$LISTNUMBER |
| 29 | Дата приказа о приеме * | DATE | USR$WG_MOVEMENTLINE.USR$DATEBEGIN |
| 30 | Номер приказа о приеме (Это поле необязательно для заполнения. При импорте, все люди попадают в один приказ с номером Импорт 1) | VARCHAR(20) | GD_DOCUMENT.NUMBER |
| 31 | Дата последнего приказа о переводе | DATE | USR$WG_MOVEMENTLINE.USR$DATEBEGIN |
| 32 | Номер последнего приказа о переводе (Это поле необязательно, обычно людей при импорте сбрасывают в один приказ) | VARCHAR(20) | GD_DOCUMENT.NUMBER |
| 33 | Текущая должность | VARCHAR(60) | USR$WG_MOVEMENTLINE.USR$POSITIONKEY - > WG_POSITION.NAME |
| 34 | Текущее подразделение | VARCHAR(60) | USR$WG_MOVEMENTLINE.USR$DEPTKEY - > GD_CONTACT.NAME |
| 35 | Форма оплаты труда (Оклад, Сдельно, Повременно, Не ниже среднего. Могут быть свои типы, но первые четыре должны называться так) | VARCHAR(20) | USR$WG_MOVEMENTLINE.USR$PAYFORMKEY - > USR$WG_PAYFORM.USR$NAME |
| 36 | Вид работы (указывается код: "01" -- основная; "02" -- внутренний совместитель; "03" -- внешний совместитель. Кавычки не являются частью кода. Присутствие нуля -- обязательно) | VARCHAR(20) | USR$WG_MOVEMENTLINE.USR$KINDOFWORKKEY -> USR$WG_KINDOFWORK.USR$NAME |
| 37 | Характер работы (Постоянно, Временно, Сезонно, С оплатой по ср., Не ниже ср. Могут быть и свои типы) | VARCHAR(20) | USR$WG_MOVEMENTLINE.WORKCHARACTERKEY - > USR$WG_WORKCHARACTER.USR$NAME |
| 38 | Разряд | INTEGER | USR$WG_MOVEMENTLINE.USR$PASTCAT |
| 39 | Оклад | NUMERIC(16, 4) | USR$WG_MOVEMENTLINE.USR$MSALARY |
| 40 | Наименование учебного заведения | VARCHAR(60) | USR$WG_EDUCATION. USR$ACADEMYKEY - > GD_CONTACT.NAME |
| 41 | Код специальности | VARCHAR(60) | USR$WG_SPECGROUP_NEW. USR$OKSO |
| 42 | Специальность | VARCHAR(60) | USR$WG_EDUCATION. USR$SPECKEY |
| 43 | Код квалификации | VARCHAR(20) | USR$WG_PROFESSIONS. USR$OKPDTR |
| 44 | Квалификации | VARCHAR(60) | USR$WG_EDUCATION.USR$PROFESSIONKEY |
| 45 | Серия диплома,номер диплома, дата выдачи диплома | VARCHAR(20) | USR$WG_EDUCATION.USR$DIPLOMA |
| 46 | Стаж сотрудника | DATE |
Повторный ввод начальных данных
Повторный импорт возможен. При повторном запуске макроса новый сотрудник не создается, он проверяется по личному номеру. Обновляется сотрудник и записи в личной карточке. В отдельных случаях может понадобиться чистка справочников. В логе платформы можно найти информацию о записях, которые были добавлены в процессе импорта.
Макрос импорта
'#include TCREATOR Option Explicit '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' На вход передается строка с датой в формате дд.мм.гггг '' Сконвертированная дата помещается в переменную D '' Функция возвращает True если конвертация прошла успешно Function I2W_Str2Date(S, ByRef D) S = Trim(S) If S = "" Then D = Null I2W_Str2Date = True Else I2W_Str2Date = False Dim A A = Split(S, ".") If UBound(A) = 2 Then If IsNumeric(A(0)) And IsNumeric(A(1)) And IsNumeric(A(2)) Then If ((A(0) >= 1) And (A(0) <= 31)) And _ ((A(1) >= 1) And (A(1) <= 12)) And _ ((A(2) >= 1900) And (A(2) <= 2999)) Then D = DateSerial(A(2), A(1), A(0)) I2W_Str2Date = True End If End If End If End If End Function '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' На вход передается строка с вещественным числом '' В качестве десятичного разделителя используется точка. '' Сконвертированное значение помещается в переменную N. '' Функция возвращает True если конвертация прошла успешно Function I2W_Str2Num(S, ByRef N) S = Trim(S) If S = "" Then N = Null I2W_Str2Num = True Else Dim P If InStr(S, ".") > 0 Then P = Len(S) - InStr(S, ".") S = Left(S, Len(S) - P - 1) & Right(S, P) Else P = 0 End If If IsNumeric(S) Then N = CDbl(S) / (10 ^ P) I2W_Str2Num = True Else I2W_Str2Num = False End If End If End Function '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' На вход передается строка с числом '' В качестве десятичного разделителя используется точка. '' Сконвертированное значение приводится к типу Currency и '' помещается в переменную N. '' Функция возвращает True если конвертация прошла успешно Function I2W_Str2Cur(S, ByRef N) If I2W_Str2Num(S, N) Then if not IsNull(N) then N = CCur(N) end if I2W_Str2Cur = True Else I2W_Str2Cur = False End If End Function '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' На вход передается строка с целым числом '' Сконвертированное значение помещается в переменную I. '' Функция возвращает True если конвертация прошла успешно Function I2W_Str2Int(S, ByRef I) S = Trim(S) If S = "" Then I = Null I2W_Str2Int = True Else I2W_Str2Int = False If IsNumeric(S) Then If Int(S) = CDbl(S) Then I = CLng(S) I2W_Str2Int = True End If End If End If End Function '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' На вход передается строка в CSV формате и символ разделитель. '' На выходе -- массив значений Function I2W_Split(S, DelimChar) Const QuoteChar = """" ReDim Result(0) Dim I, B, E, CurrChar, InQuotes I = 0 B = 1 E = 1 InQuotes = False Result(0) = "" S = Trim(S) While E <= Len(S) CurrChar = Mid(S, E, 1) If CurrChar = QuoteChar Then If Mid(S, E + 1, 1) = QuoteChar Then E = E + 1 ElseIf Mid(S, E + 1, 1) = DelimChar Then If InQuotes Then CurrChar = "" InQuotes = False End If ElseIf E = B Then InQuotes = True CurrChar = "" End If ElseIf (CurrChar = DelimChar) And (Not InQuotes) Then I = I + 1 ReDim Preserve Result(I) Result(I) = "" B = E + 1 CurrChar = "" End If Result(I) = Result(I) & CurrChar E = E + 1 WEnd If (UBound(Result) > 0) And (Result(UBound(Result)) = "") Then ReDim Preserve Result(UBound(Result) - 1) End If I2W_Split = Result End Function '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' На вход передается строка в CSV формате и массив FieldDef '' с описанием полей. Каждый элемент массива -- это массив '' из4-х элементов: '' 1 -- имя поля (справочно, в самой функции не используется) '' 2 -- тип поля, "S" -- строка, "D" -- дата, '' "F" -- вещественное число, "C" -- денежный тип, '' "I" -- целое число. '' 3 -- максимальная длина строки. Для остальных типов '' не используется. '' 4 -- булевский признак обязательного поля. '' Функция возвращает значения: '' -99 -- если строка разобрана успешно и значения помещены в '' массив ArrOutput '' -1 -- количество значений в строке не совпадает с количеством '' элементов в массиве ArrOutput '' положительное число -- номер поля для которого выявлено '' несоответствие типов данных, или длина для строковых значений '' превышает максимальную заданную длину, или указан признак '' обязательного поля а в исходной CSV строке для этого поля '' передана пустая строка. Function I2W_Parse(S, ByRef FieldDef, ByRef ArrOutput) Dim I2W_Parse_Success, I2W_Parse_InvalidFieldCount I2W_Parse_Success = -99 I2W_Parse_InvalidFieldCount = -1 Dim ArrInput, I, V, F ArrInput = I2W_Split(S, ";") If UBound(ArrInput) <> UBound(FieldDef) Then MsgBox UBound(ArrInput) I2W_Parse = I2W_Parse_InvalidFieldCount Exit Function End If ReDim ArrOutput(UBound(FieldDef)) For I = 0 To UBound(ArrInput) F = False Select Case FieldDef(I)(1) Case "S" V = Trim(ArrInput(I)) If Len(V) > FieldDef(I)(2) Then V = Left(V, FieldDef(I)(2)) End If F = Not (FieldDef(I)(3) And (V = "")) Case "I" F = I2W_Str2Int(ArrInput(I), V) Case "F" F = I2W_Str2Num(ArrInput(I), V) Case "C" F = I2W_Str2Cur(ArrInput(I), V) Case "D" F = I2W_Str2Date(ArrInput(I), V) End Select If F Then ArrOutput(I) = V Else I2W_Parse = I Exit Function End If Next I2W_Parse = I2W_Parse_Success End Function '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' Функция возвращает значение поля. '' На вход передается имя поля, массив массивов со спецификациями '' полей и массив со значениями полей. '' Если поле с указанным именем не найдено возвращается Empty. Function I2W_FieldByName(AName, ByRef AnArray, ByRef AValues) Dim I For I = 0 To UBound(AnArray) If AnArray(I)(0) = AName Then I2W_FieldByName = AValues(I) Exit Function End If Next I2W_FieldByName = Empty End Function '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' Процедура записывает информацию в лог платформы Гедымин. '' Запись осуществляется на переданной транзакции. Sub I2W_Log(ByRef ATransaction, AClassName, AnID, AData) Dim Creator, q, Tr Set Creator = New TCreator Set q = Creator.GetObject(nil, "TIBSQL", "") If Assigned(ATransaction) Then q.Transaction = ATransaction Else Set Tr = Creator.GetObject(nil, "TIBTransaction", "") Tr.DefaultDatabase = IBLogin.Database Tr.StartTransaction q.Transaction = Tr End If q.SQL.Text = "INSERT INTO gd_journal (source, objectid, data) " &_ "VALUES (:s, :id, :d)" q.ParamByName("s").AsString = AClassName q.ParamByName("id").AsInteger = AnID q.ParamByName("d").AsString = AData q.ExecQuery If Not Assigned(ATransaction) Then Tr.Commit End If End Sub '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' Функция ищет объект в базе данных по заданному значению поля. '' Если объект не найден, то он создается. '' На вход передается транзакция, имя класса и подтип объекта, '' имя поля для поиска и значение для поиска. '' Два массива (AFields и AValues) содержат имена полей и значения '' полей, которые будут использованы при создании нового объекта. '' Функция возвращает ИД найденного или созданного объекта. '' Через параметр Found возвращается булевский признак: '' True -- объект был найден '' False -- объект был создан Function I2W_GetID(ByRef ATransaction, AClassName, ASubType, ASearchField, _ ASearchValue, AFields, AValues, NeedUpdate, ByRef AFound) I2W_GetID = Null AFound = False If IsNull(ASearchValue) Then Exit Function If ASearchValue = "" Then Exit Function Dim Creator, Obj, I Set Creator = New TCreator Set Obj = Creator.GetObject(nil, AClassName, "") Set Obj.ReadTransaction = ATransaction Set Obj.Transaction = ATransaction Obj.SubType = ASubType If IsDate(ASearchValue) Then Obj.ExtraConditions.Add(ASearchField & "=:SearchValue") Obj.ParamByName("SearchValue").AsDateTime = ASearchValue ElseIf IsNumeric(ASearchValue) Then Obj.ExtraConditions.Add(ASearchField & "=:SearchValue") Obj.ParamByName("SearchValue").Value = ASearchValue Else If UCase(ASearchField) = "NAME" Then ASearchField = "z." & ASearchField End If If UCase(ASearchField) = "USR$NAME" Then ASearchField = "z." & ASearchField End If Obj.ExtraConditions.Add("UPPER(" & ASearchField & ")=:SearchValue") Obj.ParamByName("SearchValue").AsString = UCase(ASearchValue) End If Obj.Open If Obj.EOF Then Obj.Insert For I = 0 To UBound(AFields) If Err.Number <> 0 Then Exit For Obj.FieldByName(AFields(I)).Value = AValues(I) Next If Err.Number = 0 Then Obj.Post I2W_GetID = Obj.ID I2W_Log ATransaction, AClassName, Obj.ID, "Импорт: Создан объект." Else Obj.Cancel End If Else I2W_GetID = Obj.ID if NeedUpdate then Obj.Edit For I = 0 To UBound(AFields) If Err.Number <> 0 Then Exit For Obj.FieldByName(AFields(I)).Value = AValues(I) Next If Err.Number = 0 Then Obj.Post I2W_GetID = Obj.ID I2W_Log ATransaction, AClassName, Obj.ID, "Импорт: Изменен объект." Else Obj.Cancel End If else I2W_Log ATransaction, AClassName, Obj.ID, "Импорт: Найден объект." end if AFound = True End If End Function Sub I2W_ImportData Dim Creator, Dlg Set Creator = New TCreator Set Dlg = Creator.GetObject(nil, "TOpenDialog", "") If Not Dlg.Execute Then Exit Sub Dim fso, f ReDim FieldValues(45) ReDim FieldDefs(45) FieldDefs(0) = Array("surname", "S", 20, True) FieldDefs(1) = Array("firstname", "S", 20, True) FieldDefs(2) = Array("middlename", "S", 20, False) FieldDefs(3) = Array("birthday", "D", 0, True) FieldDefs(4) = Array("usr$wg_bcity", "S", 32, False) FieldDefs(5) = Array("usr$wg_bdistrict", "S", 32, False) FieldDefs(6) = Array("usr$wg_bregion", "S", 20, False) FieldDefs(7) = Array("usr$wg_bcountry", "S", 32, False) FieldDefs(8) = Array("passportnumber", "S", 40, False) FieldDefs(9) = Array("passportissdate", "D", 0, False) FieldDefs(10) = Array("passportissuer", "S", 40, False) FieldDefs(11) = Array("passportexpdate", "D", 0, False) FieldDefs(12) = Array("personalnumber", "S", 40, True) FieldDefs(13) = Array("usr$insurancenumber", "S", 40, True) FieldDefs(14) = Array("hzip", "S", 20, False) FieldDefs(15) = Array("hcountry", "S", 20, False) FieldDefs(16) = Array("hsity", "S", 20, False) FieldDefs(17) = Array("haddress", "S", 60, False) FieldDefs(18) = Array("hphone", "S", 20, False) FieldDefs(19) = Array("sex", "S", 1, False) FieldDefs(20) = Array("usr$education", "S", 40, False) FieldDefs(21) = Array("usr$maritalstatus", "S", 20, False) FieldDefs(22) = Array("usr$nationalilty", "S", 40, False) FieldDefs(23) = Array("usr$mr_fitness", "S", 20, False) FieldDefs(24) = Array("usr$mr_rank", "S", 60, False) FieldDefs(25) = Array("usr$mr_regoffice", "S", 60, False) FieldDefs(26) = Array("usr$mr_prof", "I", 0, False) FieldDefs(27) = Array("usr$listnumber", "S", 10, False) FieldDefs(28) = Array("datebegin", "D", 0, True) FieldDefs(29) = Array("begin_number", "S", 20, False) FieldDefs(30) = Array("last_date", "D", 0, False) FieldDefs(31) = Array("last_number", "S", 20, False) FieldDefs(32) = Array("position", "S", 60, False) FieldDefs(33) = Array("department", "S", 60, False) FieldDefs(34) = Array("usr$wg_payform", "S", 20, False) FieldDefs(35) = Array("usr$wg_kindofwork", "S", 20, False) FieldDefs(36) = Array("usr$wg_workcharacter", "S", 20, False) FieldDefs(37) = Array("usr$pastcat", "I", 0, False) FieldDefs(38) = Array("usr$msalary", "C", 0, False) FieldDefs(39) = Array("edu_USR$ACADEMYKEY", "S", 60, False) FieldDefs(40) = Array("edu_USR$OKSO", "S", 60, False) FieldDefs(41) = Array("edu_USR$SPECKEY", "S", 60, False) FieldDefs(42) = Array("edu_USR$OKPDTR", "S", 20, False) FieldDefs(43) = Array("edu_USR$PROFESSIONKEY", "S", 60, False) FieldDefs(44) = Array("edu_USR$DIPLOMA", "S", 20, False) FieldDefs(45) = Array("USR$SENIORITY", "D", 0, False) Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile(Dlg.FileName, 1) Dim ErrMsg, J, Res, Tr Set Tr = Creator.GetObject(nil, "TIBTransaction", "") Set Tr.DefaultDatabase = IBLogin.Database Tr.StartTransaction dim OrderDate, qOrder, qOrderMove set qOrder = Creator.GetObject(nil, "TIBSQL", "") qOrder.Transaction = Tr qOrder.SQL.Text = _ "SELECT " & _ " ml.DOCUMENTKEY " & _ "FROM USR$WG_MOVEMENTLINE ml " & _ "WHERE ml.USR$EMPLKEY = :EmplKey " & _ " AND ml.USR$KINDOFWORKKEY = :KOW " & _ " AND ml.USR$MOVEMENTTYPE = 1 " set qOrderMove = Creator.GetObject(nil, "TIBSQL", "") qOrderMove.Transaction = Tr qOrderMove.SQL.Text = _ "SELECT " & _ " ml.DOCUMENTKEY " & _ "FROM USR$WG_MOVEMENTLINE ml " & _ "WHERE ml.USR$EMPLKEY = :EmplKey " & _ " AND ml.USR$KINDOFWORKKEY = :KOW " & _ " AND ml.USR$DATEBEGIN = :DB " & _ " AND ml.USR$MOVEMENTTYPE = 2 " Dim AFolderKey, AImportDeptKey, Found AFolderKey = I2W_GetID(Tr, "TgdcFolder", "", _ "name", "Импорт данных", _ Array("name"), Array("Импорт данных"), False, Found) AImportDeptKey = I2W_GetID(Tr, "TgdcDepartment", "", _ "name", "Импорт данных", _ Array("parent", "name"), Array(IBLogin.CompanyKey, "Импорт данных"), False, Found) Dim FirstOrder, FirstOrderLine, FirstOrderDS Set FirstOrder = Creator.GetObject(nil, "TgdcUserDocument", "") FirstOrder.Transaction = Tr FirstOrder.SubType = "147017326_119619099" FirstOrder.Open Set FirstOrderDS = Creator.GetObject(nil, "TDataSource", "") FirstOrderDS.DataSet = FirstOrder Set FirstOrderLine = Creator.GetObject(nil, "TgdcUserDocumentLine", "") FirstOrderLine.SubType = FirstOrder.SubType FirstOrderLine.SubSet = "ByParent" FirstOrderLine.MasterSource = FirstOrderDS FirstOrderLine.MasterField = "documentkey" FirstOrderLine.DetailField = "parent" FirstOrderLine.Open FirstOrder.Insert FirstOrder.FieldByName("documentdate").AsDateTime = Date FirstOrder.FieldByName("number").AsString = "импорт 1" FirstOrder.Post I2W_Log Tr, "TgdcUserDocument", FirstOrder.ID, "Импорт: Создан приказ о приеме." Dim LastOrder, LastOrderLine, LastOrderDS Set LastOrder = Creator.GetObject(nil, "TgdcUserDocument", "") LastOrder.Transaction = Tr LastOrder.SubType = "147017335_119619099" LastOrder.Open Set LastOrderDS = Creator.GetObject(nil, "TDataSource", "") LastOrderDS.DataSet = LastOrder Set LastOrderLine = Creator.GetObject(nil, "TgdcUserDocumentLine", "") LastOrderLine.SubType = LastOrder.SubType LastOrderLine.SubSet = "ByParent" LastOrderLine.MasterSource = LastOrderDS LastOrderLine.MasterField = "documentkey" LastOrderLine.DetailField = "parent" LastOrderLine.Open LastOrder.Insert LastOrder.FieldByName("documentdate").AsDateTime = Date LastOrder.FieldByName("number").AsString = "импорт 2" LastOrder.Post I2W_Log Tr, "TgdcUserDocument", LastOrder.ID, "Импорт: Создан приказ о переводе." J = 1 ErrMsg = "" Do While Not f.AtEndOfStream Res = I2W_Parse(f.ReadLine, FieldDefs, FieldValues) Select Case Res Case -99 Dim MRSKey, PositionKey, PayFormKey, KindOfWorkKey, CharacterKey, DeptKey, MilOfficeKey Dim EducationTypeKey, FamStatusKey, NationKey, MartFitnessKey, MilRankKey, EmployeeKey Dim PersonalCardKey, KindOfWorkTemp Dim EducationKey, SpecGroupKey, ProfKey, AcademyKey, SenKey EducationTypeKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_EDUCTIONTYPE", _ "usr$name", I2W_FieldByName("usr$education", FieldDefs, FieldValues), _ Array("usr$name"), Array(I2W_FieldByName("usr$education", FieldDefs, FieldValues)), False, Found) FamStatusKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_FAMSTATUS", _ "usr$name", I2W_FieldByName("usr$maritalstatus", FieldDefs, FieldValues), _ Array("usr$name"), Array(I2W_FieldByName("usr$maritalstatus", FieldDefs, FieldValues)), False, Found) NationKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_NATION", _ "usr$name", I2W_FieldByName("usr$nationalilty", FieldDefs, FieldValues), _ Array("usr$name"), Array(I2W_FieldByName("usr$nationalilty", FieldDefs, FieldValues)), False, Found) MartFitnessKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_MARTFITNESS", _ "usr$name", I2W_FieldByName("usr$mr_fitness", FieldDefs, FieldValues), _ Array("usr$name"), Array(I2W_FieldByName("usr$mr_fitness", FieldDefs, FieldValues)), False, Found) MilRankKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_MILRATE", _ "usr$name", I2W_FieldByName("usr$mr_rank", FieldDefs, FieldValues), _ Array("usr$name"), Array(I2W_FieldByName("usr$mr_rank", FieldDefs, FieldValues)), False, Found) MilOfficeKey = I2W_GetID(Tr, "TgdcCompany", "", _ "name", I2W_FieldByName("usr$mr_regoffice", FieldDefs, FieldValues), _ Array("parent", "name"), Array(AFolderKey, I2W_FieldByName("usr$mr_regoffice", FieldDefs, FieldValues)), False, Found) MRSKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_MRS", _ "usr$number", I2W_FieldByName("usr$mr_prof", FieldDefs, FieldValues), _ Array("usr$number"), Array(I2W_FieldByName("usr$mr_prof", FieldDefs, FieldValues)), False, Found) PositionKey = I2W_GetID(Tr, "TgdcWgPosition", "", _ "name", I2W_FieldByName("position", FieldDefs, FieldValues), _ Array("name"), Array(I2W_FieldByName("position", FieldDefs, FieldValues)), False, Found) PayFormKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_PAYFORM", _ "usr$name", I2W_FieldByName("usr$wg_payform", FieldDefs, FieldValues), _ Array("usr$name"), Array(I2W_FieldByName("usr$wg_payform", FieldDefs, FieldValues)), False, Found) If IsNull(I2W_FieldByName("usr$wg_kindofwork", FieldDefs, FieldValues)) Then KindOfWorkTemp = "01" Else KindOfWorkTemp = Trim(I2W_FieldByName("usr$wg_kindofwork", FieldDefs, FieldValues)) If Not IsNumeric(KindOfWorkTemp) Then Select Case UCase(KindOfWorkTemp) Case "ОСНОВНОЙ" KindOfWorkTemp = "01" Case "КОНТРАКТ" KindOfWorkTemp = "01" Case "СОВМЕСТИТЕЛЬ" KindOfWorkTemp = "02" Case Else If InStr(1, KindOfWorkTemp, "СОВМЕСТИТЕЛЬ ПО КОНТ", vbTextCompare) = 1 Then ' СОВМЕСТИТЕЛЬ ПО КОНТРАКТУ KindOfWorkTemp = "02" ElseIf InStr(1, KindOfWorkTemp, "СОВМЕСТИТЕЛЬ СО СТОР", vbTextCompare) = 1 Then ' СОВМЕСТИТЕЛЬ СО СТОРОНЫ KindOfWorkTemp = "03" ElseIf InStr(1, KindOfWorkTemp, "СОВМЕСТИТ.ПО КОНТР.С", vbTextCompare) = 1 Then ' СОВМЕСТИТ.ПО КОНТР.СО СТОРОНЫ KindOfWorkTemp = "03" Else KindOfWorkTemp = "01" End If End Select End If End If If IsNumeric(KindOfWorkTemp) Then KindOfWorkKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_KINDOFWORK", _ "usr$code", KindOfWorkTemp, _ Array("usr$code", "usr$name"), Array(KindOfWorkTemp, KindOfWorkTemp), False, Found) Else KindOfWorkKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_KINDOFWORK", _ "usr$name", KindOfWorkTemp, _ Array("usr$name"), Array(KindOfWorkTemp), False, Found) End If CharacterKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_WORKCHARACTER", _ "usr$name", I2W_FieldByName("usr$wg_workcharacter", FieldDefs, FieldValues), _ Array("usr$name"), Array(I2W_FieldByName("usr$wg_workcharacter", FieldDefs, FieldValues)), False, Found) DeptKey = I2W_GetID(Tr, "TgdcDepartment", "", _ "name", I2W_FieldByName("department", FieldDefs, FieldValues), _ Array("parent", "name"), Array(AImportDeptKey, I2W_FieldByName("department", FieldDefs, FieldValues)), False, Found) If IsNull(DeptKey) Then DeptKey = AImportDeptKey End If ProfKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_PROFESSIONS", _ "usr$name", I2W_FieldByName("edu_USR$PROFESSIONKEY", FieldDefs, FieldValues), _ Array("usr$name", "USR$OKPDTR"), _ Array(I2W_FieldByName("edu_USR$PROFESSIONKEY", FieldDefs, FieldValues), _ I2W_FieldByName("edu_USR$OKPDTR", FieldDefs, FieldValues)), _ False, Found) SpecGroupKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_SPECGROUP_NEW", _ "USR$OKSO", I2W_FieldByName("edu_USR$OKSO", FieldDefs, FieldValues), _ Array("usr$name", "USR$OKSO"), _ Array(I2W_FieldByName("edu_USR$SPECKEY", FieldDefs, FieldValues), _ I2W_FieldByName("edu_USR$OKSO", FieldDefs, FieldValues)), _ False, Found) AcademyKey = I2W_GetID(Tr, "TgdcCompany", "", _ "name", I2W_FieldByName("edu_USR$ACADEMYKEY", FieldDefs, FieldValues), _ Array("parent", "name"), Array(AFolderKey, I2W_FieldByName("edu_USR$ACADEMYKEY", FieldDefs, FieldValues)), False, Found) Dim EmployeeName EmployeeName = I2W_FieldByName("surname", FieldDefs, FieldValues) & " " & _ I2W_FieldByName("firstname", FieldDefs, FieldValues) EmployeeKey = I2W_GetID(Tr, "TgdcContact", "", "personalnumber", _ I2W_FieldByName("personalnumber", FieldDefs, FieldValues), _ Array("parent", _ "name", _ "surname", _ "firstname", _ "middlename", _ "birthday", _ "usr$wg_bcity", _ "usr$wg_bdistrict", _ "usr$wg_bregion", _ "usr$wg_bcountry", _ "passportnumber", _ "passportissdate", _ "passportissuer", _ "passportexpdate", _ "personalnumber", _ "usr$insurancenumber", _ "hzip", _ "hcountry", _ "hcity", _ "haddress", _ "hphone", _ "sex"), _ Array(_ DeptKey, _ EmployeeName, _ I2W_FieldByName("surname", FieldDefs, FieldValues), _ I2W_FieldByName("firstname", FieldDefs, FieldValues), _ I2W_FieldByName("middlename", FieldDefs, FieldValues), _ I2W_FieldByName("birthday", FieldDefs, FieldValues), _ I2W_FieldByName("usr$wg_bcity", FieldDefs, FieldValues), _ I2W_FieldByName("usr$wg_bdistrict", FieldDefs, FieldValues), _ I2W_FieldByName("usr$wg_bregion", FieldDefs, FieldValues), _ I2W_FieldByName("usr$wg_bcountry", FieldDefs, FieldValues), _ I2W_FieldByName("passportnumber", FieldDefs, FieldValues), _ I2W_FieldByName("passportissdate", FieldDefs, FieldValues), _ I2W_FieldByName("passportissuer", FieldDefs, FieldValues), _ I2W_FieldByName("passportexpdate", FieldDefs, FieldValues), _ I2W_FieldByName("personalnumber", FieldDefs, FieldValues), _ I2W_FieldByName("usr$insurancenumber", FieldDefs, FieldValues), _ I2W_FieldByName("hzip", FieldDefs, FieldValues), _ I2W_FieldByName("hcountry", FieldDefs, FieldValues), _ I2W_FieldByName("hcity", FieldDefs, FieldValues), _ I2W_FieldByName("haddress", FieldDefs, FieldValues), _ I2W_FieldByName("hphone", FieldDefs, FieldValues), _ I2W_FieldByName("sex", FieldDefs, FieldValues) _ ), True, Found) EducationKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_EDUCATION", "usr$emplkey", _ EmployeeKey, _ Array("USR$EMPLKEY", "USR$ACADEMYKEY", "USR$PROFESSIONKEY", "USR$SPECKEY", "USR$DIPLOMA"), _ Array(EmployeeKey, AcademyKey, ProfKey, SpecGroupKey, _ I2W_FieldByName("edu_USR$DIPLOMA", FieldDefs, FieldValues)), _ False, Found) SenKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_SENIORITY", "usr$emplkey", _ EmployeeKey, _ Array("USR$EMPLKEY", "USR$SENTYPE", "USR$DATEBEGIN"), _ Array(EmployeeKey, 1, _ I2W_FieldByName("USR$SENIORITY", FieldDefs, FieldValues)), _ False, Found) PersonalCardKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_PERSONALCARD", "usr$emplkey", _ EmployeeKey, _ Array("usr$emplkey", _ "usr$surname", _ "usr$firstname", _ "usr$middlename", _ "usr$passportnumber", _ "usr$passportissdate", _ "usr$passportissuer", _ "usr$passportexpdate", _ "usr$personalnumber", _ "usr$insurancenumber", _ "usr$hzip", _ "usr$hcountry", _ "usr$hcity", _ "usr$haddress", _ "usr$pzip", _ "usr$pcountry", _ "usr$pcity", _ "usr$paddress", _ "usr$sex", _ "usr$educationtypekey", _ "usr$famstatuskey", _ "usr$nationality", _ "usr$mr_fitness", _ "usr$mr_rankkey", _ "usr$mr_regofficekey", _ "usr$mr_profkey", _ "usr$number"), _ Array(_ EmployeeKey, _ I2W_FieldByName("surname", FieldDefs, FieldValues), _ I2W_FieldByName("firstname", FieldDefs, FieldValues), _ I2W_FieldByName("middlename", FieldDefs, FieldValues), _ I2W_FieldByName("passportnumber", FieldDefs, FieldValues), _ I2W_FieldByName("passportissdate", FieldDefs, FieldValues), _ I2W_FieldByName("passportissuer", FieldDefs, FieldValues), _ I2W_FieldByName("passportexpdate", FieldDefs, FieldValues), _ I2W_FieldByName("personalnumber", FieldDefs, FieldValues), _ I2W_FieldByName("usr$insurancenumber", FieldDefs, FieldValues), _ I2W_FieldByName("hzip", FieldDefs, FieldValues), _ I2W_FieldByName("hcountry", FieldDefs, FieldValues), _ I2W_FieldByName("hcity", FieldDefs, FieldValues), _ I2W_FieldByName("haddress", FieldDefs, FieldValues), _ I2W_FieldByName("hzip", FieldDefs, FieldValues), _ I2W_FieldByName("hcountry", FieldDefs, FieldValues), _ I2W_FieldByName("hcity", FieldDefs, FieldValues), _ I2W_FieldByName("haddress", FieldDefs, FieldValues), _ I2W_FieldByName("sex", FieldDefs, FieldValues), _ EducationTypeKey, _ FamStatusKey, _ NationKey, _ MartFitnessKey, _ MilRankKey, _ MilOfficeKey, _ MRSKey, _ I2W_FieldByName("usr$listnumber", FieldDefs, FieldValues)), True, Found) On Error Resume Next OrderDate = I2W_FieldByName("datebegin", FieldDefs, FieldValues) qOrder.Close qOrder.ParamByName("EmplKey").AsInteger = EmployeeKey qOrder.ParamByName("KOW").AsInteger = KindOfWorkKey qOrder.ExecQuery if qOrder.EoF then FirstOrderLine.Insert FirstOrderLine.FieldByName("usr$movementtype").AsInteger = 1 FirstOrderLine.FieldByName("usr$emplkey").AsInteger = EmployeeKey FirstOrderLine.FieldByName("usr$listnumber").AsString = I2W_FieldByName("usr$listnumber", FieldDefs, FieldValues) FirstOrderLine.FieldByName("usr$datebegin").AsDateTime = OrderDate FirstOrderLine.FieldByName("usr$deptkey").Value = DeptKey FirstOrderLine.FieldByName("usr$positionkey").Value = PositionKey FirstOrderLine.FieldByName("usr$payformkey").Value = PayFormKey FirstOrderLine.FieldByName("usr$kindofworkkey").Value = KindOfWorkKey FirstOrderLine.FieldByName("usr$workcharacterkey").Value = CharacterKey FirstOrderLine.FieldByName("usr$pastcat").Value = I2W_FieldByName("pastcat", FieldDefs, FieldValues) FirstOrderLine.FieldByName("usr$msalary").Value = I2W_FieldByName("msalary", FieldDefs, FieldValues) FirstOrderLine.Post end if If (Err.Number <> 0) Or (Err.Description > "") Then ErrMsg = ErrMsg & "Приказ о приеме: " & Err.Description & " Сотрудник: " & EmployeeName & ". Тип: " & KindOfWorkTemp & vbCrLf Else If (Not IsNull(I2W_FieldByName("last_date", FieldDefs, FieldValues))) And _ (I2W_FieldByName("last_date", FieldDefs, FieldValues) > OrderDate) Then OrderDate = I2W_FieldByName("last_date", FieldDefs, FieldValues) qOrderMove.Close qOrderMove.ParamByName("EmplKey").AsInteger = EmployeeKey qOrderMove.ParamByName("KOW").AsInteger = KindOfWorkKey qOrderMove.ParamByName("DB").AsDateTime = OrderDate qOrderMove.ExecQuery if qOrderMove.EoF then LastOrderLine.Insert LastOrderLine.FieldByName("usr$movementtype").AsInteger = 2 LastOrderLine.FieldByName("usr$emplkey").AsInteger = EmployeeKey LastOrderLine.FieldByName("usr$listnumber").AsString = I2W_FieldByName("usr$listnumber", FieldDefs, FieldValues) LastOrderLine.FieldByName("usr$datebegin").AsDateTime = OrderDate LastOrderLine.FieldByName("usr$deptkey").Value = DeptKey LastOrderLine.FieldByName("usr$positionkey").Value = PositionKey LastOrderLine.FieldByName("usr$payformkey").Value = PayFormKey LastOrderLine.FieldByName("usr$kindofworkkey").Value = KindOfWorkKey LastOrderLine.FieldByName("usr$workcharacterkey").Value = CharacterKey LastOrderLine.FieldByName("usr$pastcat").Value = I2W_FieldByName("pastcat", FieldDefs, FieldValues) LastOrderLine.FieldByName("usr$msalary").Value = I2W_FieldByName("msalary", FieldDefs, FieldValues) LastOrderLine.Post end if If (Err.Number <> 0) Or (Err.Description > "") Then ErrMsg = ErrMsg & "Приказ о переводе: " & Err.Description & " Сотрудник: " & EmployeeName & ". Тип: " & KindOfWorkTemp & vbCrLf End If End If End If On Error GoTo 0 Case -1 ErrMsg = ErrMsg & "Строка " & J & ": Неверное количество полей!" & vbCrLf Case Else ErrMsg = ErrMsg & "Строка " & J & ": Ошибка в поле " & FieldDefs(Res)(0) & vbCrLf End Select J = J + 1 Loop If ErrMsg > "" Then MsgBox "Ошибка в процессе импорта. Дополнительная информация занесена в лог системы." I2W_Log Null, "", -1, ErrMsg Tr.Rollback Else If MsgBox("Успешно импортировано " & J - 1 & " записей. Сохранить?", vbYesNo) = vbYes Then Tr.Commit Else Tr.Rollback End If End If End Sub