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

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
(Структура файла)
(Макрос импорта)
Строка 144: Строка 144:
 
'#include TCREATOR
 
'#include TCREATOR
  
' Здесь должны быть подключены процедуры
+
Option Explicit
' стандартного импорта из CSV.
+
 
 +
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
 +
'' На вход передается строка с датой в формате дд.мм.гггг
 +
'' Сконвертированная дата помещается в переменную 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(38)
+
   ReDim FieldValues(45)
   ReDim FieldDefs(38)
+
   ReDim FieldDefs(45)
   FieldDefs(0)  = Array("surname",             "S", 20, True)
+
   FieldDefs(0)  = Array("surname",               "S", 20, True)
   FieldDefs(1)  = Array("firstname",           "S", 20, True)
+
   FieldDefs(1)  = Array("firstname",             "S", 20, True)
   FieldDefs(2)  = Array("middlename",         "S", 20, False)
+
   FieldDefs(2)  = Array("middlename",           "S", 20, False)
   FieldDefs(3)  = Array("birthdate",           "D",  0, True)
+
   FieldDefs(3)  = Array("birthday",             "D",  0, True)
   FieldDefs(4)  = Array("usr$wg_bcity",       "S", 32, False)
+
   FieldDefs(4)  = Array("usr$wg_bcity",         "S", 32, False)
   FieldDefs(5)  = Array("usr$wg_bdistrict",   "S", 32, False)
+
   FieldDefs(5)  = Array("usr$wg_bdistrict",     "S", 32, False)
   FieldDefs(6)  = Array("usr$wg_bregion",     "S", 20, False)
+
   FieldDefs(6)  = Array("usr$wg_bregion",       "S", 20, False)
   FieldDefs(7)  = Array("usr$wg_bcountry",     "S", 32, False)
+
   FieldDefs(7)  = Array("usr$wg_bcountry",       "S", 32, False)
   FieldDefs(8)  = Array("passportnumber",     "S", 40, False)
+
   FieldDefs(8)  = Array("passportnumber",       "S", 40, False)
   FieldDefs(9)  = Array("passportissdate",     "D",  0, False)
+
   FieldDefs(9)  = Array("passportissdate",       "D",  0, False)
   FieldDefs(10) = Array("passportissuer",     "S", 40, False)
+
   FieldDefs(10) = Array("passportissuer",       "S", 40, False)
   FieldDefs(11) = Array("passportexpdate",     "D",  0, False)
+
   FieldDefs(11) = Array("passportexpdate",       "D",  0, False)
   FieldDefs(12) = Array("personalnumber",     "S", 40, True)
+
   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",               "S", 20, False)
+
   FieldDefs(14) = Array("hzip",                 "S", 20, False)
   FieldDefs(15) = Array("hcountry",           "S", 20, False)
+
   FieldDefs(15) = Array("hcountry",             "S", 20, False)
   FieldDefs(16) = Array("hsity",               "S", 20, False)
+
   FieldDefs(16) = Array("hsity",                 "S", 20, False)
   FieldDefs(17) = Array("haddress",           "S", 60, False)
+
   FieldDefs(17) = Array("haddress",             "S", 60, False)
   FieldDefs(18) = Array("hphone",             "S", 20, False)
+
   FieldDefs(18) = Array("hphone",               "S", 20, False)
   FieldDefs(19) = Array("sex",                 "S",  1, False)
+
   FieldDefs(19) = Array("sex",                   "S",  1, False)
   FieldDefs(20) = Array("usr$education",       "S", 40, False)
+
   FieldDefs(20) = Array("usr$education",         "S", 40, False)
   FieldDefs(21) = Array("usr$maritalstatus",   "S", 20, False)
+
   FieldDefs(21) = Array("usr$maritalstatus",     "S", 20, False)
   FieldDefs(22) = Array("usr$nationalilty",   "S", 40, False)
+
   FieldDefs(22) = Array("usr$nationalilty",     "S", 40, False)
   FieldDefs(23) = Array("usr$mr_fitness",     "S", 20, False)
+
   FieldDefs(23) = Array("usr$mr_fitness",       "S", 20, False)
   FieldDefs(24) = Array("usr$mr_rank",         "S", 60, False)
+
   FieldDefs(24) = Array("usr$mr_rank",           "S", 60, False)
   FieldDefs(25) = Array("usr$mr_regoffice",   "S", 60, False)
+
   FieldDefs(25) = Array("usr$mr_regoffice",     "S", 60, False)
   FieldDefs(26) = Array("usr$mr_prof",         "I", 0, False)
+
   FieldDefs(26) = Array("usr$mr_prof",           "I", 0, False)
   FieldDefs(27) = Array("usr$listnumber",     "S", 10, False)
+
   FieldDefs(27) = Array("usr$listnumber",       "S", 10, False)
   FieldDefs(28) = Array("datebegin",           "D",  0, True)
+
   FieldDefs(28) = Array("datebegin",             "D",  0, True)
   FieldDefs(29) = Array("begin_number",       "S", 20, False)
+
   FieldDefs(29) = Array("begin_number",         "S", 20, False)
   FieldDefs(30) = Array("last_date",           "D", 0, False)
+
   FieldDefs(30) = Array("last_date",             "D", 0, False)
   FieldDefs(31) = Array("last_number",         "S", 20, False)
+
   FieldDefs(31) = Array("last_number",           "S", 20, False)
   FieldDefs(32) = Array("position",           "S", 60, False)
+
   FieldDefs(32) = Array("position",             "S", 60, False)
   FieldDefs(33) = Array("department",         "S", 60, False)
+
   FieldDefs(33) = Array("department",           "S", 60, False)
   FieldDefs(34) = Array("usr$wg_payform",     "S", 20, False)
+
   FieldDefs(34) = Array("usr$wg_payform",       "S", 20, False)
   FieldDefs(35) = Array("usr$wg_kindofwork",   "S", 20, False)
+
   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",         "I", 0, False)
+
   FieldDefs(37) = Array("usr$pastcat",           "I", 0, False)
   FieldDefs(38) = Array("usr$msalary",         "C", 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 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)
 
            
 
            
         If IsNull(I2W_FieldByName("usr$wg_kindofwork", FieldDefs, FieldValues)) Then
+
         EducationKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_EDUCATION", "usr$emplkey", _
           KindOfWorkTemp = "01" ' по умолчанию -- основное место работы
+
          EmployeeKey, _
        Else
+
           Array("USR$EMPLKEY", "USR$ACADEMYKEY", "USR$PROFESSIONKEY", "USR$SPECKEY", "USR$DIPLOMA"), _
           KindOfWorkTemp = Trim(I2W_FieldByName("usr$wg_kindofwork", FieldDefs, FieldValues))
+
           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"), _
          I2W_Log Tr, "TgdcContact", EmployeeKey, KindOfWorkTemp
+
          Array(EmployeeKey, 1, _
 
+
                I2W_FieldByName("USR$SENIORITY", FieldDefs, FieldValues)), _
          If Not IsNumeric(KindOfWorkTemp) Then
+
          False, Found)
            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), Found)
+
        Else
+
          KindOfWorkKey = I2W_GetID(Tr, "TgdcAttrUserDefined", "USR$WG_KINDOFWORK", _
+
            "usr$name", KindOfWorkTemp, _
+
            Array("usr$name"), Array(KindOfWorkTemp), Found)
+
        End If
+
  
 
         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
        FirstOrderLine.FieldByName("usr$movementtype").AsInteger = 1
+
        qOrder.ParamByName("EmplKey").AsInteger = EmployeeKey
        FirstOrderLine.FieldByName("usr$emplkey").AsInteger = EmployeeKey
+
        qOrder.ParamByName("KOW").AsInteger = KindOfWorkKey
        FirstOrderLine.FieldByName("usr$listnumber").AsString = I2W_FieldByName("usr$listnumber", FieldDefs, FieldValues)
+
        qOrder.ExecQuery
        FirstOrderLine.FieldByName("usr$datebegin").AsDateTime = I2W_FieldByName("datebegin", FieldDefs, FieldValues)
+
        if qOrder.EoF then
        FirstOrderLine.FieldByName("usr$deptkey").Value = DeptKey
+
          FirstOrderLine.Insert
        FirstOrderLine.FieldByName("usr$positionkey").Value = PositionKey
+
          FirstOrderLine.FieldByName("usr$movementtype").AsInteger = 1
        FirstOrderLine.FieldByName("usr$payformkey").Value = PayFormKey
+
          FirstOrderLine.FieldByName("usr$emplkey").AsInteger = EmployeeKey
        FirstOrderLine.FieldByName("usr$kindofworkkey").Value = KindOfWorkKey
+
          FirstOrderLine.FieldByName("usr$listnumber").AsString = I2W_FieldByName("usr$listnumber", FieldDefs, FieldValues)
        FirstOrderLine.FieldByName("usr$workcharacterkey").Value = CharacterKey
+
          FirstOrderLine.FieldByName("usr$datebegin").AsDateTime = OrderDate
        FirstOrderLine.FieldByName("usr$pastcat").Value = I2W_FieldByName("pastcat", FieldDefs, FieldValues)
+
          FirstOrderLine.FieldByName("usr$deptkey").Value = DeptKey
        FirstOrderLine.FieldByName("usr$msalary").Value = I2W_FieldByName("msalary", FieldDefs, FieldValues)
+
          FirstOrderLine.FieldByName("usr$positionkey").Value = PositionKey
        FirstOrderLine.Post
+
          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("datebegin", FieldDefs, FieldValues)) Then
+
             (I2W_FieldByName("last_date", FieldDefs, FieldValues) > OrderDate) Then
  
             LastOrderLine.Insert
+
             OrderDate = I2W_FieldByName("last_date", FieldDefs, FieldValues)
            LastOrderLine.FieldByName("usr$movementtype").AsInteger = 2
+
             qOrderMove.Close
            LastOrderLine.FieldByName("usr$emplkey").AsInteger = EmployeeKey
+
             qOrderMove.ParamByName("EmplKey").AsInteger = EmployeeKey
            LastOrderLine.FieldByName("usr$listnumber").AsString = I2W_FieldByName("usr$listnumber", FieldDefs, FieldValues)
+
             qOrderMove.ParamByName("KOW").AsInteger = KindOfWorkKey
            LastOrderLine.FieldByName("usr$datebegin").AsDateTime = I2W_FieldByName("last_date", FieldDefs, FieldValues)
+
             qOrderMove.ParamByName("DB").AsDateTime = OrderDate
             LastOrderLine.FieldByName("usr$deptkey").Value = DeptKey
+
             qOrderMove.ExecQuery
             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
+
  
 +
            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

См. также

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

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