<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBS: Нужен совет по оптимизации копирования данных с IB в mysql]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=5525</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=5525&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBS: Нужен совет по оптимизации копирования данных с IB в mysql».]]></description>
		<lastBuildDate>Thu, 17 Feb 2011 10:32:43 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[VBS: Нужен совет по оптимизации копирования данных с IB в mysql]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=45195#p45195</link>
			<description><![CDATA[<p>Добрый день!<br />Прошу помочь оптимизировать скрипт по скорости работы и удобочитаемости исходного кода, так как у самого опыта нет(((. Основной параметр - это время выполнения, сейчас его работа составляет около 80 - 90 секунд. Заранее благодарю.<br /></p><div class="codebox"><pre><code>&#039; === Script Information Header ===

&#039; ================================================================ Определяем переменные =========================================================================================
                                            log(&quot; &quot;)
                                            log(now() &amp;&quot;  1. Запускаем скрипт...&quot;)
&#039;On Error Resume Next
x=timer
                                            
                                            log(now() &amp;&quot;  2. Объявляем переменные...&quot;)
Dim connA, connS
Dim rsA1, rsA2, rsA3                                                            &#039; Источник
Dim rsS1, rsS2, rsS3, rsS4, rsS5                                                    &#039; Клиент
Dim i, id
Dim DataNowVariable
Dim FirstArray(190)

Set dicGlobal = ParseAllINI(&quot;global.ini&quot;)                                                &#039; Задаем путь к файлу настроек
DataNowVariable = now()
&#039;---------------------------------------------------------- Устанавливаем соединение с базой - mysql -----------------------------------------------------------------------------
                                            log(now() &amp;&quot;  3. Устанавливаем соединение с базой - mysql...&quot;)
Set connS = CreateObject(&quot;ADODB.Connection&quot;)
connS.Open (&quot;Data Source = sphinx&quot;)                                                     &#039; Источник соединения с базой данных - Клиентом
set rsS2 = connS.Execute(&quot;SELECT personal.ID, personal.TYPE, personal.NAME FROM personal WHERE ((personal.TYPE)=&#039;DEP&#039;)&quot;)
                                            log(now() &amp;&quot;  4. Соединение установлено!&quot;)

&#039;---------------------------------------------------------------- Удаление данных из таблиц - Клиента ----------------------------------------------------------------------------
connS.Execute(&quot;TRUNCATE TABLE PERSONAL&quot;)
                                            log(now() &amp;&quot;  5. В таблице PERSONAL удалены все записи...&quot;)
connS.Execute(&quot;TRUNCATE TABLE PHOTO&quot;)
                                            log(now() &amp;&quot;  6. В таблице PHOTO удалены все записи...&quot;)
connS.Execute(&quot;TRUNCATE TABLE RULEBINDINGS&quot;)
                                            log(now() &amp;&quot;  7. В таблице RULEBINDINGS удалены все записи...&quot;)
connS.Execute(&quot;TRUNCATE TABLE DEVBINDINGS&quot;)
                                            log(now() &amp;&quot;  8. В таблице DEVBINDINGS удалены все записи...&quot;)
connS.Execute(&quot;TRUNCATE TABLE DEVRULEBINDINGS&quot;)
                                            log(now() &amp;&quot;  9. В таблице DEVRULEBINDINGS удалены все записи...&quot;)


&#039;---------------------------------------------------- Загружаем привязки режимов к устройствам DEVRULEBINDINGS --------------------------------------------------------------------
set rsS5 = CreateObject(&quot;ADODB.Recordset&quot;)
rsS5.CursorType = 3
rsS5.LockType = 3
rsS5.Open &quot;DEVRULEBINDINGS&quot;, connS
For Each aKey In dicGlobal.Item(&quot;POINTS&quot;)                                                    &#039; Берем режим с конфигурационного файла
        rsS5.AddNew
        rsS5.Fields(&quot;DEV_ID&quot;).Value = aKey
        rsS5.Fields(&quot;RULE_ID&quot;).Value = dicGlobal.Item(&quot;POINTS&quot;).Item(aKey)                                &#039; Загружаем переменную режима в базу клиент
        rsS5.Update
                rsS5.MoveNext
Next
                                            log(now() &amp;&quot; 10. В таблице DEVRULEBINDINGS созданы привязки.&quot;)
rsS5.Close

&#039;------------------------------------------------------------ Устанавливаем соединение с базой - IB -----------------------------------------------------------------------------
                                            log(now() &amp;&quot; 11. Устанавливаем соединение с базой - IB...&quot;)
Set connA = CreateObject(&quot;ADODB.Connection&quot;)
connA.Open (&quot;Data Source=Апакс25&quot;) &#039; Здесь необходимо указать источник соединения с базой данных
set rsA1 = connA.Execute(&quot;SELECT TCARDISSUE.FID, TCARDHOLDERS.FLAST, TCARDHOLDERS.FFIRST, TCARDHOLDERS.FMIDDLE, TCARDISSUE.FACTIVE, TCARDISSUE.FDATETO, TCARDISSUE.FCARDNUM, TCARDISSUE.FCREATEDATE, TCARDHOLDERS.FTITLE, TCARDHOLDERS.FDEPT, TCARDIMAGES.FIMG, TOTHERVALUE.FOTHER11, TOTHERVALUE.FOTHER12, TOTHERVALUE.FOTHER13, TOTHERVALUE.FOTHER14, TOTHERVALUE.FOTHER15, TOTHERVALUE.FOTHER16 FROM (TCARDIMAGES INNER JOIN (TCARDHOLDERS INNER JOIN TCARDISSUE ON TCARDHOLDERS.FID = TCARDISSUE.FCHID) ON TCARDIMAGES.FID = TCARDHOLDERS.FPHOTO) INNER JOIN TOTHERVALUE ON TCARDISSUE.FCHID = TOTHERVALUE.FCHID ORDER BY TCARDISSUE.FID&quot;)
set rsA2 = connA.Execute(&quot;SELECT TCARDHOLDERS.FDEPT FROM TCARDHOLDERS GROUP BY TCARDHOLDERS.FDEPT ORDER BY TCARDHOLDERS.FDEPT&quot;)
set rsA3 = connA.Execute(&quot;SELECT TCARDAL.FCARDISSUE, TCARDAL.FAL FROM TCARDAL&quot;)
                                            log(now() &amp;&quot; 12. Соединение установлено!&quot;)

&#039;----------------------------------------------------------------------Создание разделов-----------------------------------------------------------------------------------------
                                            log(now() &amp;&quot; 13. Создаем разделы...&quot;)
set rsS1 = CreateObject(&quot;ADODB.Recordset&quot;)
rsS1.CursorType = 3
rsS1.LockType = 3
rsS1.Open &quot;PERSONAL&quot;, connS
rsA2.MoveFirst
id=4
do while not rsA2.eof
        id = id+1
        FirstArray(id) = rsA2(0)
    With rsS1
        .AddNew
        .Fields(&quot;ID&quot;).Value = id
        .Fields(&quot;PARENT_ID&quot;).Value = &quot;0&quot;
        .Fields(&quot;TYPE&quot;) = &quot;DEP&quot;
        .Fields(&quot;NAME&quot;).Value = FirstArray(id)
        .Fields(&quot;STATUS&quot;).Value = &quot;AVAILABLE&quot;
        .Fields(&quot;CREATEDTIME&quot;).Value = DataNowVariable
        .Fields(&quot;CODEKEYTIME&quot;).Value = DataNowVariable
        .Update
    End With
rsA2.MoveNext
loop
                                            log(now() &amp;&quot; 14. В таблице PERSONAL созданы разделы...Общим количеством - &quot;&amp; id &amp;&quot; раздела.&quot;)
rsA2.Close

&#039;------------------------------------------------------------- Создание персонала, загрузка фотографий --------------------------------------------------------------------------
                                            log(now() &amp;&quot; 15. Создаем пользователей, загружаем фотографии и помещяем пользователей в разделы ...&quot;)
rsA1.MoveFirst
i=0
do while not rsA1.eof
i=i+1
    rsS1.AddNew
        rsS1.Fields(&quot;ID&quot;).Value = rsA1(0)
        For id = 5 to 190
                if FirstArray(id) = rsA1(9) then
                rsS1.Fields(&quot;PARENT_ID&quot;).Value = id
                    exit For
                end if
        Next                                                             &#039; Определяем отдел
        rsS1.Fields(&quot;NAME&quot;).Value = trim(&quot;&quot;&amp;rsA1(1)&amp;&quot; &quot;&amp;rsA1(2)&amp;&quot; &quot;&amp;rsA1(3))                                            &#039; Складываем фамилию, имя, отчество 
        rsS1.Fields(&quot;POS&quot;).Value = rsA1(8)                                            &#039; Должность
        rsS1.Fields(&quot;TABID&quot;).Value = rsA1(11)                                            &#039; Табельный номер
        rsS1.Fields(&quot;TYPE&quot;) = &quot;EMP&quot;                                                &#039; Присваиваем идентификатор персонала
        rsS1.Fields(&quot;EXPTIME&quot;).Value = rsA1(5)                                            &#039; Окончание срока действия карты
        rsS1.Fields(&quot;CREATEDTIME&quot;).Value = rsA1(7)                                        &#039; Дата создания
        rsS1.Fields(&quot;DESCRIPTION&quot;).Value = trim(&quot;Номер приказа:&quot;&amp;rsA1(12)&amp;vbCrLf&amp;&quot;Примечание:&quot;&amp;rsA1(13)&amp;vbCrLf&amp;&quot;№ АК:&quot;&amp;rsA1(14)&amp;vbCrLf&amp;&quot;Страна:&quot;&amp;rsA1(15)&amp;vbCrLf&amp;&quot;Срок действия АК:&quot;&amp;rsA1(16))        &#039; Складываем недостающие дополнительные поля
        rsS1.Fields(&quot;CODEKEY&quot;).Value = ConverterCodeKeyCart(rsA1(6))                                &#039; Преобразуем код карты
        Select Case rsA1(4)
            Case 1
            rsS1.Fields(&quot;STATUS&quot;).Value = &quot;AVAILABLE&quot;
            Case Else
            rsS1.Fields(&quot;STATUS&quot;).Value = &quot;FIRED&quot;
            rsS1.Fields(&quot;FIREDTIME&quot;).Value = rsA1(5)
        End Select
        rsS1.Fields(&quot;CODEKEYTIME&quot;).Value = DataNowVariable
        rsS1.Update
    
        data = rsA1(10)
Set objCommand = CreateObject(&quot;ADODB.Command&quot;)          
objCommand.ActiveConnection = connS                                
objCommand.CommandText = &quot;INSERT INTO PHOTO (ID,PREVIEW_WIDTH,PREVIEW_HEIGHT,PREVIEW_RASTER,HIRES_WIDTH,HIRES_HEIGHT,HIRES_RASTER) VALUES (&quot;&amp;rsA1(0)&amp;&quot;,256,307,?,256,307,?)&quot;  &#039; Копируем фото из одной базы в другую
objCommand.CommandType = 1
objCommand.Parameters.Append( objCommand.CreateParameter(&quot;x&quot;,128,1,-1,data) )                                &#039; Создаем параметр 1
objCommand.Parameters.Append( objCommand.CreateParameter(&quot;y&quot;,128,1,-1,data) )                                &#039; Создаем параметр 2
objCommand.Execute()
rsA1.MoveNext
loop
                                            log(now() &amp;&quot; 16. Пользователи созданы...Общее количество - &quot;&amp; i &amp;&quot; пользователей.&quot;)

&#039;------------------------------------------------------------------------- Добавляем режимы --------------------------------------------------------------------------------
&#039;                                            log(now() &amp;&quot; 17. Добавляем исключения и режим по умолчанию в таблицу RULEBINDINGS&quot;)
&#039;set rsS3 = CreateObject(&quot;ADODB.Recordset&quot;)
&#039;rsS3.CursorType = 3
&#039;rsS3.LockType = 3
&#039;rsS3.Open &quot;RULEBINDINGS&quot;, connS
&#039;rsA3.MoveFirst
&#039;do while not rsA3.eof
&#039;       rsS3.AddNew 
&#039;       rsS3.Fields(&quot;PERSONAL_ID&quot;).Value = rsA3(0)
&#039;       rsS3.Fields(&quot;RULE_ID&quot;).Value = &quot;1&quot;
&#039;       rsS3.Update
&#039;       rsA3.MoveNext
&#039;loop        
&#039;
&#039;do while not rsA3.eof
&#039;       rsS3.AddNew 
&#039;       rsS3.Fields(&quot;PERSONAL_ID&quot;).Value = rsA3(0)
&#039;       rsS3.Fields(&quot;RULE_ID&quot;).Value = dicGlobal.Item(&quot;LEVELS&quot;).Item(trim(rsA3(1)))
&#039;       rsS3.Update
&#039;       rsA3.MoveNext
&#039;loop        
&#039;rsA3.Close                    
&#039;                                            log(now() &amp;&quot; 18. В таблице RULEBINDINGS добавлены исключения.&quot;)

&#039;--------------------------------------------------------------------------- Завершение работы ---------------------------------------------------------------------------------
                                            log(now() &amp;&quot; 19. Закрываем все соединения...&quot;)
connA.Close
connS.Close
                                            log(now() &amp;&quot; 20. Работа скрипта завершена.&quot;)
                                            log(&quot;время выполнения скрипта - &quot; &amp; (timer-x))

&#039; ========================================================================= Функции и процедуры ================================================================================


&#039; ------------------------------------------------------------------------------- Конвертер кода карты ------------------------------------------------------------------------- 
Function ConverterCodeKeyCart(CodeKey)
ConverterCodeKeyCart = trim(&quot;18&quot; &amp; String((6-Len(hex(CodeKey))), &quot;0&quot;)&amp; hex(CodeKey) &amp; &quot;00000000&quot;)
End Function

&#039;------------------------------------------------------------------------------- Введение журнала событий ----------------------------------------------------------------------
Sub log(sData)
    Dim ts, ForAppending, fso
    Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
    ForAppending = 8
    Set ts = fso.OpenTextFile(&quot;log.txt&quot;, ForAppending, True)
    ts.Write sData &amp; chr(13) &amp; chr(10)
    ts.Close
    Set fso = nothing
End Sub

&#039;---------------------------------------------------------------------------- Чтение настроек из файла --------------------------------------------------------------------------
Function ParseAllINI(strIniFileName)
&#039;On Error Resume Next
Dim ParseAINI, blnFoundSection, strSection
Dim intEquals, sKey, sVal, i, sLine, tsIni
Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)

blnFoundSection = False
Err.Clear
If FSO.FileExists(strIniFileName) Then

    Set tsIni = FSO.OpenTextFile(strIniFileName)
    Set ParseAllINI = WScript.CreateObject(&quot;Scripting.Dictionary&quot;)
    
    Do While Not tsIni.AtEndOfStream
        sLine = &quot;&quot;
        sLine = Trim(tsIni.ReadLine)
        If sLine &lt;&gt; &quot;&quot; Then                                                              &#039; проверяем не пустая строка
            If Left(sLine,1) &lt;&gt; &quot;;&quot; Then                                                 &#039; проверяем не комментарий ли это
                If Left(sLine,1) = &quot;[&quot; Then                                              &#039; проверяем не является ли строка наименованием секции
                    blnFoundSection = True                                               &#039; и если является устанавливаем параметр в &quot;истинна&quot;
                    &#039;Msgbox sLine &amp; &quot; section found&quot;
                    strSection = Left(sLine, Len(sLine) - 1)
                    strSection = Right(strSection, Len(strSection) - 1)
                    Set ParseAINI = Wscript.CreateObject(&quot;Scripting.Dictionary&quot;)
                    ParseAllINI.Add UCase(strSection), ParseAINI
                Else
                    &#039;key and value logic
                    intEquals = InStr(1, sLine, &quot;=&quot;)
                    If (intEquals &lt;= 1) Then
                        &#039;msgbox &quot;error: the following line is invalid &quot; &amp; sLine
                    Else
                        &#039;weve found a valid line
                        sKey = Left(sLine, intEquals - 1)
                        sVal = Right(sLine, Len(sLine) - intEquals)
                        
                        
                        Err.Clear
                        ParseAINI.Add Trim(LCase(sKey)), Trim(sVal)
                        If Err.Number &lt;&gt; 0 Then
                            &#039;msgbox &quot;unable to add to dictionary object&quot;
                        End If
                        &#039;msgbox strSection &amp; &quot; &quot; &amp; sKey &amp; &quot;;;;;&quot; &amp; sVal
                        
                    
                    &#039;key and value logic end if
                    End If
                End If
            End If
        End If
    Loop
    
    tsIni.Close
    Set tsIni = Nothing
    
    If blnFoundSection = False Then
        Set ParseAllINI = Wscript.CreateObject(&quot;Scripting.Dictionary&quot;)
    End If

Else
    Set ParseAllINI = Wscript.CreateObject(&quot;Scripting.Dictionary&quot;)
End If

End Function</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (pavlikspb)]]></author>
			<pubDate>Thu, 17 Feb 2011 10:32:43 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=45195#p45195</guid>
		</item>
	</channel>
</rss>
