?мпорт начальных данных в подсистему Отдел Кадров
Импорт осуществляется на основе стандартной процедуры импорта из 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