vbs массив

  1. 9 г. назад

    есть такой код:

    Set v8 = CreateObject("V83.COMConnector")
    ConnectString  =  "srvr='" + ServerName + ":1541'; ref='" + BaseName +  "'; Usr='" + UserName +  "'; pwd='" + Pass +  "'; UC='" + CodeBlock +  "';"
    Set  Connect = V8.Connect(ConnectString)
    ConnectionsItem = Connect.[ПолучитьСоединенияИнформационнойБазы]()
    For Each Connections In ConnectionsItem
    WScript.Echo Eval("Connections.[ИмяПриложения]")
    Next

    все работает, кроме вывода значения элемента массива.
    ПолучитьСоединенияИнформационнойБазы() - возвращает массив( в 1С), но как его разобрать в vbs?

    выдает ошибку object doesn't support this property or method на строку WScript.Echo Eval("Connections.[ИмяПриложения]")

  2. Connect.[ПолучитьСоединенияИнформационнойБазы]() - а почему так хитро? в бэйсике нельзя обратиться напрямую к методу объекта? типа, так: Connect.ПолучитьСоединенияИнформационнойБазы() ?

    Ответы: (2)
  3. (1) можно, но в моем скрипте так не катит, скорее всего из-за русских шрифтов. лень разбираться с кодировкой, так работает и ладно

    Ответы: (3)
  4. (2) ну, выведи дамп переменной Connections , глянь, чё там

    Ответы: (5)
  5. ConnectionsItem = Connect.GetInfoBaseConnections()
    и

    WScript.Echo Eval("Connections.ApplicationName")

    выдают ту же ошибку

  6. (3) как?

  7. для начала - выведи VarType(Connections) и TypeName(Connections)

  8. ох, и тупорылый этот твой бэйсик. ни var_dump(), ни print_r() нету.

  9. а ты уверен, что одинэсовский Массив автоматом конвертится в enum?

    Ответы: (10)
  10. Connections = Connect.[ПолучитьСоединенияИнформационнойБазы]()
    WScript.Echo Eval("Connections.[Количество]()")

    что выведет?

    Ответы: (11) (12)
  11. (8)нет конешн. если бы он конвертился, ошибки бы никакой не было)

    Ответы: (11)
  12. (10) так чего же нам мозг ешь тогда? :) попробуй (9) - если катит, значит, юзай методы одинэсовского класса Массив

  13. (9) работает:

    ConnectionsItem = Connect.[ПолучитьСоединенияИнформационнойБазы]().[Количество]()
    WScript.Echo Eval("ConnectionsItem")
    

    не работает:

    ConnectionsItem = Connect.[ПолучитьСоединенияИнформационнойБазы]()
    ConnectionsItem2 = ConnectionsItem.[Количество]()
    WScript.Echo Eval("ConnectionsItem2")

    выдает аналогичную сабжа ошибку о недоступности методов

    и вообще на
    ConnectionsItem = Connect.[ПолучитьСоединенияИнформационнойБазы]() ругается

    Ответы: (13) (15)
  14. Stim и вообще на
    ConnectionsItem = Connect.[ПолучитьСоединенияИнформационнойБазы]() ругается

    т.е. раньше не ругалось, а теперь ругается?

  15. Вообще-та надо массив обьявить, и потом пономерам его обнюхивать
    на русском:
    http://www.askit.ru/custom/progr_admin/m02/02_05_vbscript_arrays.htm

  16. Stim WScript.Echo Eval("ConnectionsItem2")

    Eval-то нафига?

  17. я так думаю, тебе, всё-таки, надо разобраться с кодировками, чтобы вызывать методы по-человечьи, через точку.
    или используй англоязычные синонимы

    Ответы: (17)
  18. (16) см 4

    Ответы: (18)
  19. (17) ещё раз: у тебя после ConnectionsItem = Connect.GetInfoBaseConnections() в ConnectionsItem - одинэсовский массив. используй его методы

    Ответы: (19)
  20. (18) какие методы, мне нужно обойти массив и узнать какого типа соединения в нем

    Ответы: (20)
  21. Stim какие методы

    Методы:

    ВГраница (UBound)
    Вставить (Insert)
    Добавить (Add)
    Количество (Count)
    Найти (Find)
    Очистить (Clear)
    Получить (Get)
    Удалить (Delete)
    Установить (Set)

    © СП

  22. ну вот как-то так пока получилось. вроде работает

    ConnectionsItemCount = Connect.GetInfoBaseConnections().Count()
    ConnectionsItemCountStart = 0
    
    do while  ConnectionsItemCountStart<=ConnectionsItemCount-1 
    ConnectionsItem = Connect.GetInfoBaseConnections().get(ConnectionsItemCountStart).ApplicationName
    
    WScript.Echo ConnectionsItem
    
    ConnectionsItemCountStart = ConnectionsItemCountStart + 1
    
    Loop
    Ответы: (22)
  23. (21) ну, вот, наконец вижу человеческий код

    Ответы: (23)
  24. (22) сразу видно - не одинесник) для одинесника человеческий код - на русском языке

    Ответы: (24)
  25. (23) [тут холивар на тыщу постов]

  26. а как досрочно выйти из цикла do while ?

  27. + потом запилю свою выгонялку сюда в БЗ

    Ответы: (28)
  28. 02.10.2014 17:18:42 отредактировано Stim

    а хотя пох.

    вот кусок, который проверяет активные пользовательские сеансы(каждые 30 сек в течении 5 минут и возвращает по истечении результат)

    ReturnItem = 1
    
    
    do while Rez = 0 
    
    'пауза в 30сек
    WScript.Sleep 30000 
    
    'соединенийПользователей = 0
    ConnectionsUsers = 0
    
    'всего соединений
    ConnectionsItemCount = Connect.GetInfoBaseConnections().Count()
    'счетчик соединений
    ConnectionsItemCountStart = 0
    
    ' перебираем все соединения
    do while  ConnectionsItemCountStart<=ConnectionsItemCount-1 
    
    ' получаем имя соединения
    ConnectionApplicationName = Connect.GetInfoBaseConnections().get(ConnectionsItemCountStart).ApplicationName
    
    if ConnectionApplicationName = "1CV8C" then
    
    ConnectionsUsers = ConnectionsUsers + 1
    
    end if
    
    ConnectionsItemCountStart = ConnectionsItemCountStart + 1
    
    Loop
    
    
    if ConnectionsUsers = 0 then
    	txtStreamOut.WriteLine Now() & " > Соединения с базой разорваны: сервер " & ServerName & ", база " & BaseName & " Соединений:"& ConnectionsItemCount
    Rez = 1
    End If
    
    
    
    if ReturnItem = 6 then
    	txtStreamOut.WriteLine Now() & " > Соединения с базой не разорваны: сервер " & ServerName & ", база " & BaseName & " Соединений:"& ConnectionsItem-1
    rez = 2
    End if
    
    ReturnItem = ReturnItem + 1
    Loop
  29. (26) Зашел бы на инфостарт, как белый человек скачал бы выгонялку. там их вагон

    Ответы: (30) (31)
  30. http://infostart.ru/public/175494/

  31. (28) у нас была похожая выгонялка, которая отрубала соединения, подключаясь к консоли. но с новыми пратформами это перестало работать - там соединения стали более устойчивые и при разрыве они тут же подключаются обратно. в результате - ни выгрузить базу, ни обновить.
    да и в процессе обновления(в пользовательском режиме) пользователи могут зайти. да и негоже резко обрывать соединения, оставляя некрасивую ошибку "соедиение разорвано администратором"

    сейчас у нас- на базу ставится блокировка соединений и вот каждые 30 сек проверяется кол пользователей. как только штатная выгонялка всех выкинула - начинается обновление

  32. (28) каждый уважающий себя одинэсник должен построить дом, посадить дерево и воспитать сына написать собственную выгонялку и запилить собственную нетленку

    Ответы: (32)
  33. (31) у нас в одном скрипте ставится блокировка с ожиданием, выгрузка+обновление+ запись результата. сами скрипты формируются из спец базы с базами, в которых их 10050 штук на десятке серверов. на каждые ~10 баз формируется отдельный скрипт. скрипты потом запускаем потоком по 3-4 за раз, в зависимости от сервера.

    врядли где-то есть такое готовое решение

или зарегистрируйтесь чтобы ответить!