?мпорт начальных данных в подсистему Отдел Кадров

Материал из GedeminWiki
Перейти к: навигация, поиск

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

См. также

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты