Многострочный GET массив или как VBA общаться с Bitrix API, Делюсь как интегрировать Bitrix с VBA через вебхуки, и ищу ответ как использовать еще одно поле.
nilske, почитайте правила подробнее, да и тему в целом сейчас вы нарушаете пункт 4.8, "многократного поднятия нет", вы не модератор для оценки действий пользователей и рекомендаций в стиле "когда появятся идеи по вашей проблеме, вам напишут, не нужно навязываться.", - желательно оставить при себе, т.к. подобных вопросов в теме не задавали.
Просьба модераторов почистить тему от оффтопа, и обратить внимание на данного пользователя.
По теме: 1) Про платную "техподдержку" ни слова от себя не увидел, а ваши фантазии не имеют ничего общего с реальностью. 2) Про объекты и характеристики - данная часть диалога не имеет отношения к теме, это лишь уточнение, что не туда смотрим т.к. мы не рассматриваем другие json методы (т.к. они не нужны), доберман предположил что мы ошиблись с методом, но нет - не ошиблись.
К участникам для которых сообщения не ради сообщения, а для развития темы и решения задач: Как посмотреть какой выглядит полный запрос если через переменную и дебаг монитор он режется. Как гипотеза что функция pvToByteArray искажает entityTypeId если не режет его, в целом метод рабочий до определенного количества символов.
Многострочный GET массив или как VBA общаться с Bitrix API, Делюсь как интегрировать Bitrix с VBA через вебхуки, и ищу ответ как использовать еще одно поле.
nilske, я предоставил полную информацию которой располагаю, если вы считаете, что какую то часть я не указал - просьба уточнить. Про "Никому не интересно", я напомню что это сообщество раскрывающее возможности экселя, вы как и я практикуем свои навыки, делимся и получаем - это не форум работа где дали ТЗ и участники должны сделать, тут мы осваиваем определенные связки. Поэтому если у вас есть опыт и мысли по поводу почему может не работать - буду благодарен, если ваш опыт ограничен постами типо "мало описал, а выяснять остальное я не буду" - то спасибо за уделенное время вам в другой раздел. Спасибо за понимание.
невозможное делаем сразу, чудо - требует небольшой подготовки.
Многострочный GET массив или как VBA общаться с Bitrix API, Делюсь как интегрировать Bitrix с VBA через вебхуки, и ищу ответ как использовать еще одно поле.
Тему вверх, возможно кто то сможет подсказать еще. Пока гипотеза что не влезает запрос или почему еще он может терять параметр entityTypeId. Смотрю через дебагер переменную, она тоже как то подрезается, в debiug.print тоже запрос не входит.
невозможное делаем сразу, чудо - требует небольшой подготовки.
Многострочный GET массив или как VBA общаться с Bitrix API, Делюсь как интегрировать Bitrix с VBA через вебхуки, и ищу ответ как использовать еще одно поле.
Этот метод для работы с объектом Продукт, но данный объект содержит не все нужны характеристики, а имеет ряд лишних. Поэтому мы используем собственный объект построенный на Item. Поэтому все методы по работе с item.
невозможное делаем сразу, чудо - требует небольшой подготовки.
Многострочный GET массив или как VBA общаться с Bitrix API, Делюсь как интегрировать Bitrix с VBA через вебхуки, и ищу ответ как использовать еще одно поле.
Не могу победить, как только вставляю файл B64, выдает ошибку что параметр entityTypeId не найден. как будто идет переполнение и начало запроса перетирается.
невозможное делаем сразу, чудо - требует небольшой подготовки.
Многострочный GET массив или как VBA общаться с Bitrix API, Делюсь как интегрировать Bitrix с VBA через вебхуки, и ищу ответ как использовать еще одно поле.
Многострочный GET массив или как VBA общаться с Bitrix API, Делюсь как интегрировать Bitrix с VBA через вебхуки, и ищу ответ как использовать еще одно поле.
Sub Send()
Dim PostData As String, Content_Type As String, sUrl As String
sUrl = "https://bitrix.site.ru/rest/632/key/crm.item.update"
base64_encoded_file = EncodeFile("C:\tov174908.jpg")
PostData = "{ entityTypeId: 148, id: 1537, ""fields"":{""UFCRM_34_FOTO"":[""1.jpg""," & _
Chr(34) & base64_encoded_file & Chr(34) & " ]}}"
Content_Type = "application/json"
res = pvPostFile(sUrl, PostData, Content_Type)
Debug.Print (res)
End Sub
Function pvPostFile(sUrl As String, PostData As String, Content_Type) As String
With CreateObject("MSXML2.XMLHTTP.6.0")
.Open "POST", sUrl, False
.setRequestHeader "Content-Type", Content_Type
.Send pvToByteArray(PostData) 'Здесь надо попробовать оба варианта
' .Send PostData
pvPostFile = .responseText
End With
End Function
Private Function pvToByteArray(sText As String) As Byte()
pvToByteArray = StrConv(sText, vbFromUnicode)
End Function
Получил ошибку: {"error":100,"error_description":"Could not find value for parameter {entityTypeId}"}
Но это говорит о том что сам запрос работает. Второй вариант: .Send PostData - ошибка такая же.
Не понимаю как обернуть запрос...
невозможное делаем сразу, чудо - требует небольшой подготовки.
Многострочный GET массив или как VBA общаться с Bitrix API, Делюсь как интегрировать Bitrix с VBA через вебхуки, и ищу ответ как использовать еще одно поле.
doober, пока не очень понял, а если есть еще параметры. Т.е. даже для добавления файла важно передавать параметры, например entityTypeId где значение цифра, например 147. Для операции update нужен еще параметр id, например 1437
Многострочный GET массив или как VBA общаться с Bitrix API, Делюсь как интегрировать Bitrix с VBA через вебхуки, и ищу ответ как использовать еще одно поле.
Многострочный GET массив или как VBA общаться с Bitrix API, Делюсь как интегрировать Bitrix с VBA через вебхуки, и ищу ответ как использовать еще одно поле.
Function httpSend(url As String) As String Set httpRequest = CreateObject("MSXML2.XMLHTTP") 'Msxml2.XMLHTTP.6.0
Debug.Print ("POST send: " & url)
httpRequest.Open "POST", url, False
httpRequest.Send
httpSend = httpRequest.responseText
End Function
и в url использую файл. Реакции тоже нет.
невозможное делаем сразу, чудо - требует небольшой подготовки.
Многострочный GET массив или как VBA общаться с Bitrix API, Делюсь как интегрировать Bitrix с VBA через вебхуки, и ищу ответ как использовать еще одно поле.
Многострочный GET массив или как VBA общаться с Bitrix API, Делюсь как интегрировать Bitrix с VBA через вебхуки, и ищу ответ как использовать еще одно поле.
Друзья, приветствую. Уже не знаю где искать ответ, но тут всегда совместно получалось решить задачу. Использую VBA для работы с REST API Битрикс. Простые запросы с легкостью отправляю таким макросом https://bitrix.site.ru/rest/632/key/crm.item.update?id=1537&fields[UFCRM_34_FOTO]=123 И с большим количеством полей проблем нет. Использую простую функцию для отправки.
Код
Function httpSend(url As String) As String
Set httpRequest = CreateObject("MSXML2.XMLHTTP") 'Msxml2.XMLHTTP.6.0
Debug.Print ("GET send: " & url)
httpRequest.Open "GET", url, False
httpRequest.Send
httpSend = httpRequest.responseText
End Function
и все прекрасно срабатывает, для длинных текстов использую конвертер в URL формат
Код
Public Function RStURL(ByVal txt As String) As String
For i = 1 To Len(txt)
l = Mid(txt, i, 1)
Select Case AscW(l)
Case Is > 4095: T = "%" & Hex(AscW(l) \ 64 \ 64 + 224) & "%" & Hex(AscW(l) \ 64) & "%" & Hex(8 * 16 + AscW(l) Mod 64)
Case Is > 127: T = "%" & Hex(AscW(l) \ 64 + 192) & "%" & Hex(8 * 16 + AscW(l) Mod 64)
Case 32: T = "%20"
Case 43: T = "%2b"
Case 47: T = "%2F"
Case Else: T = l
End Select
RStURL = RStURL & T
Next
End Function
Теперь захотел прикладывать еще файлы, а они принимаются только в формате Base64, но и это не проблема есть готовая функция для конвертации
Код
Public Function EncodeFile(strPicPath As String) As String
Const adTypeBinary = 1 ' Binary file is encoded
' Variables for encoding
Dim objXML
Dim objDocElem
' Variable for reading binary picture
Dim objStream
' Open data stream from picture
Set objStream = CreateObject("ADODB.Stream")
objStream.Type = adTypeBinary
objStream.Open
objStream.LoadFromFile (strPicPath)
' Create XML Document object and root node
' that will contain the data
Set objXML = CreateObject("MSXml2.DOMDocument")
Set objDocElem = objXML.createElement("Base64Data")
objDocElem.DataType = "bin.base64"
' Set binary value
objDocElem.nodeTypedValue = objStream.Read()
' Get base64 value
EncodeFile = objDocElem.Text
' Clean all
Set objXML = Nothing
Set objDocElem = Nothing
Set objStream = Nothing
End Function
А вот дальше передать необходимо двумя параметрами одного поля (документация) выглядит этот get вот так (это к вопросу 2)
Но в результате получаю ошибку "Сбой скачивания указанного ресурса" Run-time error '-2146697208 (800c0008)': Если заменить реальную строчку base64_encoded_file_content на "ххх" например, все отрабатывает, но файл понятно не открывается и весит 2б
Длинна символьного URL запроса составляет: 161 527 символов - и есть ощущение, что эта ошибка связана с каким то ограничением MSXML2.XMLHTTP. Уважаемые эксперты, знаете ли вы: 1) Есть ли ограничения по количеству символов GET запроса? 2) Как в экселе можно передать запрос как GET запрос выше из VBA? - не понимаю как его оформить в VBA.
Заранее благодарен за помощь. Андрей VG, Doober, Msi2102, Дмитрий(The_Prist) Щербаков, очень надеюсь на вашш опыт и помощь
невозможное делаем сразу, чудо - требует небольшой подготовки.
Друзья, привет, впервые столкнулся с таким странным поведением эксель, может кто подскажет куда копать. Хронология: 1) Был файл, работал обновлял по вебхукам таблицы, макрос обновлял все связи собирал таблички и отправлял новый файл по почте, все работало стабильно 2) Неожиданно стал выдавать ошибку "нет такого макроса или макросы отключены" 3) Открываю файл, пытаюсь запустить руками, но все окна с кодом белые, не кликаются, не меняется масштаб. Вся рабочая область как зависла. 4) Из раздела разработчик если нажать "Макросы" Excel вылетает 5) При попытке пересохранить файл "Сохранить как" Excel вылетает 6) Проверял на разных ПК - картина идентична, с другими файлами работает стабильно. Табличная часть (листы и PQ) работают тоже стабильно, именно VBA часть отлетела. Яндекс ничего внятного не дал, пакеты VBA включены, макросы разрешены. Не понимаю куда копать. Вопрос: Почему это могло случиться и что с этим делать? Файл приложить не могу т.к. содержит ключи доступа к базе.
Пытаюсь реализовать функцию получения списка из интернета по json. Есть проблемка что полный код дать не могу т.к. тестовой машины нет, но может наведете меня на ошибку. Постараюсь рассказать по шагам.
Код
let
Url = "https://сайт.ru/rest/доступ/ключ/tasks.task.list.json?filter[STATUS]=-1&start=",
RecordsPerPage = 50,
Source = Json.Document(Web.Contents(Url & "1")),
TotalCount = Source[total],
PagesCount = Number.RoundUp(TotalCount / RecordsPerPage),
GetRecords = (start) =>
let
PageJson = Json.Document(Web.Contents(Url & Text.From(start))),
PageList = PageJson[result][tasks],
ToTable = Table.FromRecords(PageList),
DownloadedTable = Table.ExpandRecordColumn(ToTable, "responsible", {"name"}, {"name"}),
ExpandedTable = Table.SelectColumns(DownloadedTable,{"id", "name"})
in
ExpandedTable,
Pages = List.Skip(List.Generate(() => 1, each _ <= PagesCount, each _ + 1), 1),
Records = List.Generate(() => GetRecords(1), each List.Count(_) > 0, each GetRecords(List.Last(List.LastN(Pages, 1)) * RecordsPerPage + 1)),
Result = Table.Combine(Records)
in
Result
Запрос выполняется до пункта Records, на нем выпадает ошибка
Цитата
Expression.Error: Не удается преобразовать значение типа Table в тип List. Сведения: Value=Table Type=Type
Причем отдельно часть GetRecords выполняется прекрасно.А когда начинаю их собирать через цикл улетает с ошибкой, структуру приложил в скриншотах. Уже голову сломал что не так и где я Table в тип List преобразую. Прошу помощи у экспертов. Заранее благодарен. Если что то важное не предоставил, просьба уточнить.
невозможное делаем сразу, чудо - требует небольшой подготовки.
Эффективный перебор всех координат в таблице1 по всем полигонам таблицы2, Есть набор точек координат, необходимо распределить их по городам исходя из полигонов на карте
Итак, друзья. Наконец дошли руки все свести, провел тест всех кодов на 11 тысячах точках и 49 полигонах.
Итого результаты: Автор (название скрипта) / Время выполнения мс Msi2102: 50,92578 doober: 69,62109 PinPol: Завис совсем pt_in_polygon: 71,59375 chekPoly: 71,85156
Что касается точности, то только макрос от Msi2102 корректно распределил все точки.
Файл со всеми кодами прикладываю. Тему можно закрывать.
Код
Const myPi As Double = 3.14159265358979
Sub Макрос1()
Dim rn1 As Range, rn2 As Range, rn3 As Range, arr1, arr2, arr3, arr4, arr5, a As Double, zn As Double, arc As Double
Dim n As Integer, m As Integer, i As Integer
arr1 = Worksheets("data").Range("B2:C" & Worksheets("data").Cells(Rows.Count, 2).End(xlUp).Row).Value 'диапазон точек
ReDim arr5(1 To UBound(arr1), 1 To 1)
arr2 = Worksheets("POLY").Range("A2:B" & Worksheets("POLY").Cells(Rows.Count, 1).End(xlUp).Row).Value 'диапазон полигонов
For n = 1 To UBound(arr1)
For m = 1 To UBound(arr2)
a = 0
arr3 = Split(Replace(Replace(arr2(m, 2), ",", "|"), ".", ","), " ")
ReDim arr4(1 To UBound(arr3) + 1, 1 To 2)
For i = 0 To UBound(arr3)
arr4(i + 1, 1) = CDbl(Split(arr3(i), "|")(0)) - CDbl(Replace(arr1(n, 2), ".", ","))
arr4(i + 1, 2) = CDbl(Split(arr3(i), "|")(1)) - CDbl(Replace(arr1(n, 1), ".", ","))
Next
For i = 1 To UBound(arr4) - 1
zn = Sgn(arr4(i, 1) * arr4(i + 1, 2) - arr4(i + 1, 1) * arr4(i, 2))
If zn = 0 Then
a = 360: Exit For
Else
arc = (arr4(i, 1) * arr4(i + 1, 1) + arr4(i, 2) * arr4(i + 1, 2)) / (((arr4(i, 1) ^ 2 + arr4(i, 2) ^ 2) ^ 0.5) * ((arr4(i + 1, 1) ^ 2 + arr4(i + 1, 2) ^ 2) ^ 0.5))
a = a + (ArcCos(arc)) * 180 / myPi * zn
End If
Next
If Format(Abs(a), "0") = 360 Then
arr5(n, 1) = arr2(m, 1)
Exit For
ElseIf Format(Abs(a), "0") = 180 Then
arr5(n, 1) = "На границе" & arr2(m, 1)
Exit For
End If
arr5(n, 1) = "Вне территории"
Next
Next
Worksheets("data").Range("D2").Resize(UBound(arr5), 1) = arr5
End Sub
Public Function ArcCos(ar As Double) As Double
On Error Resume Next
If ar = 1 Then
ArcCos = 0
Exit Function
End If
ArcCos = Atn(-ar / Sqr(-ar * ar + 1)) + 2 * Atn(1)
On Error GoTo 0
End Function
невозможное делаем сразу, чудо - требует небольшой подготовки.
Эффективный перебор всех координат в таблице1 по всем полигонам таблицы2, Есть набор точек координат, необходимо распределить их по городам исходя из полигонов на карте
Эффективный перебор всех координат в таблице1 по всем полигонам таблицы2, Есть набор точек координат, необходимо распределить их по городам исходя из полигонов на карте
Msi2102, он спотыкается об определенную точку, когда arc = 1. Приложил версию с набором случайных точек (у меня для теста есть база 15к точек, но форум не пропускает размер) и какую то базу по районам Урала.
Эффективный перебор всех координат в таблице1 по всем полигонам таблицы2, Есть набор точек координат, необходимо распределить их по городам исходя из полигонов на карте
Эффективный перебор всех координат в таблице1 по всем полигонам таблицы2, Есть набор точек координат, необходимо распределить их по городам исходя из полигонов на карте
Msi2102, спасибо. Вроде работает, перепишу под фиксированное определение диапазонов и проверю скорость и точность всех предложений. Тему не хороним, вернусь с обратной связью.
невозможное делаем сразу, чудо - требует небольшой подготовки.
Эффективный перебор всех координат в таблице1 по всем полигонам таблицы2, Есть набор точек координат, необходимо распределить их по городам исходя из полигонов на карте
Друзья, привет. Дошли руки протестировать. Все предложенные варианты выдают ошибку, понять не могу откуда берется "Более двух полигонов". Может кто свежим взглядом посмотрит и подскажет где ошибся?
невозможное делаем сразу, чудо - требует небольшой подготовки.
Эффективный перебор всех координат в таблице1 по всем полигонам таблицы2, Есть набор точек координат, необходимо распределить их по городам исходя из полигонов на карте
doober, отличное решение, на малой выборке работает отлично!
Не могу сообразить последний момент. По результату работы у меня есть массив, из этого массива нужно вставить только обработанный результат. Как вставить только один столбец с результатом в таблицу. Идти циклом вставлять мне кажется будет долго, вставить через .Range("a2").Resize(UBound(Arr, 1), UBound(Arr, 2)).Value = Arr вставит все столбцы.
Крайний результат содержащий разные логики проверки во вложении, чем они отличаются не очень понял.
Эффективный перебор всех координат в таблице1 по всем полигонам таблицы2, Есть набор точек координат, необходимо распределить их по городам исходя из полигонов на карте
Итак, вроде дописал. Включил 3 вроде разных метода перебора для определения вхождения в полигон PinPol - как я понял он считает по крайним точкам pt_in_polygon - как я понял он считает последовательные отрезки chekPoly - тоже по крайним отрезкам. Только я не понимаю, а с учетом что земля круглая этим методы учитывают искажение?
Пока не рабочая версия во вложении (говорит больше одного полигона). В конце сделаю сравнение точности на большой базе.
невозможное делаем сразу, чудо - требует небольшой подготовки.
Эффективный перебор всех координат в таблице1 по всем полигонам таблицы2, Есть набор точек координат, необходимо распределить их по городам исходя из полигонов на карте
написал: по тому что точность ограничена 15тью знаками.
Вроде формат Double это 8 байт и Положительные числа: от 4,94065645841247Е-324 до 1,79769313486232Е+308 согласно справке.
Цитата
написал: Ну без вложенных циклов все равно не обойтись, а уж как они будут выглядеть - это другой вопрос.
Наверно иначе спрошу, меня даже больше смущают не вложенные циклы, а что я не знаю сколько будет полигонов, и для каждого сравнения точки с новым полигон, нужно или обрабатывать его заного (сроку в массив) или куда то сохранить получившийся массив (что предпочтительнее), а вот как сохранить массив чтобы к нему потом обратиться мыслей нет.
невозможное делаем сразу, чудо - требует небольшой подготовки.
Эффективный перебор всех координат в таблице1 по всем полигонам таблицы2, Есть набор точек координат, необходимо распределить их по городам исходя из полигонов на карте
Немного переделал код, добавил замену мест X и Y. Доделал функцию разбора на массив строки с координатами полигона (кстати это из формата kml такой получается).
невозможное делаем сразу, чудо - требует небольшой подготовки.
Эффективный перебор всех координат в таблице1 по всем полигонам таблицы2, Есть набор точек координат, необходимо распределить их по городам исходя из полигонов на карте
написал: phelex, Кроме как выяснить , принадлежит ли фигуре точка, других вариантов нет, ну разве что можно оптимизировать , отбрасывать не глядя области который однозначно не подходят, то есть имеют крайние границы, которые не содержат точку искомую, тем самым сокращая область поиска более детального. Питон или нет - это только язык и наличие готовых библиотек.
Я немного про другое. У нас тройная вложимость циклов (Все точки, все полигоны, все точки в полигоне), может есть какое решение чтобы мы создали коллекцию полигонов (массивов координат). Если не обрабатывать ошибку "входит в 2 и более полигона", то можно решить выходом из массива.
Еще интересно, почему то при конвертации текста в Double теряется один знак после запятой 0о
невозможное делаем сразу, чудо - требует небольшой подготовки.
Эффективный перебор всех координат в таблице1 по всем полигонам таблицы2, Есть набор точек координат, необходимо распределить их по городам исходя из полигонов на карте
Всем привет. Возникла потребность рассортировать точки по разным локациям (локация это список координат точек формирующих фигуру на карте), коллеги утверждают что сделают это на питоне, а на эксель это будет проблематично. Но я абсолютно верю в эксель и начал решать задачу. Уже написал разбор координат в массив, реализовал функцию сравнения входит ли точка в полигон (спасибо этой теме). На этапе реализации основного блока я не придумал как проводить сравнение максимально быстро и эффективно. Базовая логика перебирать в массиве точек массив полигонов (которые каждый раз при обращении пересобирать из строки не хочется). Точек может быть много, да и областей огромное количество, хочется поделиться универсальным решением для всех (т.к. сам не нашел).
Пример файла (с набросками кода) во вложении, там есть 4 точки и 3 полиогна, если точка не входит ни в один полигон - указываем "Нет полигона", если входит в 2 и более "Ошибка" (но такой пример не зашил). В данный момент сам дописываю через нерациональный способ (но чтобы работало), но вдруг кто то придумает вариант интереснее.
Спасибо за внимание.
невозможное делаем сразу, чудо - требует небольшой подготовки.
,может вообще удалить if? Сейчас выглядит странно: Если ячейка пустая и Не пустая. Тут должно быть "или", ну или вообще не должно быть условия т.к. вы охватываете все варианты и пусто и НЕпусто.
невозможное делаем сразу, чудо - требует небольшой подготовки.