Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
product:linq:new [13.09.2023 07:22] – [WebAPI] Белугин Александрproduct:linq:new [01.11.2025 06:43] (текущий) – [Пересоздание контекста] ekaterina.menkhuzina
Строка 3: Строка 3:
 Первый шаг -- **пересоздать контекст**. Первый шаг -- **пересоздать контекст**.
  
-Операция должна выполняется для обновления внутреннего словаря объектов и их свойствдля использования в запросах изменений в настройках объектной модели системы. В противном случае новые объекты, реквизиты и изменение ранее созданных не будут доступны для запросов. +Данная операция должна выполняться для обновления внутреннего словаря объектов и их свойств -- для использования в запросах изменений в настройках объектной модели системы. В противном случае новые объекты, реквизиты и изменение ранее созданных не будут доступны для запросов. 
  
 Если контекст еще никогда не создавался, то необходимо его пересоздать обязательно, иначе во внутреннем словаре данные об объектах системы будут полностью отсутствовать. \\  Если контекст еще никогда не создавался, то необходимо его пересоздать обязательно, иначе во внутреннем словаре данные об объектах системы будут полностью отсутствовать. \\ 
Строка 9: Строка 9:
 По окончании перестроения, снимается блокировка недоступности окна, а справа вверху отображается дата и время последнего перестроения, равная текущему времени завершения операции. По окончании перестроения, снимается блокировка недоступности окна, а справа вверху отображается дата и время последнего перестроения, равная текущему времени завершения операции.
  
 +В колонке «Есть ошибки» отображается для ранее не содержавших ошибки запросов индикатор процесса компиляции.
 +\\
 +<image shape="thumbnail">{{ :product:linq:11.png |}}</image>
 +\\
 +Запускается компиляция по одному всех запросов, с обновлением статуса «Есть ошибки». После окончания компиляции запросов в колонке «Есть ошибки» отображается значение «Да» только для запросов с ошибками, если запрос успешно компилируется, то отображается пустое значение.
 +\\
 +<image shape="thumbnail">{{ :product:linq:12.png |}}</image>
 +\\
 Далее вы можете создать новые запросы и/или импортировать уже существующие. Далее вы можете создать новые запросы и/или импортировать уже существующие.
-<image shape="thumbnail">{{ :product:linq:linq_1.png |}}</image>+<image shape="thumbnail">{{ :product:linq:linq_1.png?800 |}}</image>
  
 ==== Создание нового запроса ==== ==== Создание нового запроса ====
Строка 60: Строка 68:
   * Documents - документы с их реквизитами и версиями;   * Documents - документы с их реквизитами и версиями;
   * ProjectMembers - участники приглашенные в объекты.   * ProjectMembers - участники приглашенные в объекты.
 +
 +<callout type="info" icon="true">''Начиная с версии системы 3.29'' в объект Projects добавлено новое поле, отображающее значение плановых трудозатрат (''PlannedCost'') объекта иерархии.</callout>
  
 Для действий с реквизитами, в частности типа ''DateTime'' можно использовать библиотеку ''DbFunctions''. Для действий с реквизитами, в частности типа ''DateTime'' можно использовать библиотеку ''DbFunctions''.
Строка 119: Строка 129:
   * ''QueryParameters.SpreadsheetReport.EndDate''  -- параметр равный окончанию периода в табличном отчете.   * ''QueryParameters.SpreadsheetReport.EndDate''  -- параметр равный окончанию периода в табличном отчете.
   * ''QueryParameters.SpreadsheetReport.ProjectId'' -- параметр равный идентификатору объекта, из которого вызывается отчет. Пример его использования: <code csharp>parameters.GetValueOrDefault<Guid?>(QueryParameters.SpreadsheetReport.ProjectId, new Guid("ac04eda3-6940-46ae-8c8b-5c43c67a43a8"));</code>   * ''QueryParameters.SpreadsheetReport.ProjectId'' -- параметр равный идентификатору объекта, из которого вызывается отчет. Пример его использования: <code csharp>parameters.GetValueOrDefault<Guid?>(QueryParameters.SpreadsheetReport.ProjectId, new Guid("ac04eda3-6940-46ae-8c8b-5c43c67a43a8"));</code>
 +
 +Готовый пример, как вписать параметры в LINQ-запрос:
 +<code csharp>
 +var objectID = parameters.GetValueOrDefault<Guid>("RootProjectId", new Guid("27b97e72-5ffb-48bf-a405-bad7625eecc7"));
 + 
 +var strParam = parameters.GetValueOrDefault<string>("request", "");
 +
 +var projectID = parameters.GetValueOrDefault<Guid?>(QueryParameters.SpreadsheetReport.ProjectId, new Guid("27b97e72-5ffb-48bf-a405-bad7625eecc7"));  
 +  
 +var dStart = parameters.GetValueOrDefault<DateTime>(QueryParameters.SpreadsheetReport.StartDate, DateTime.Now.AddMonths(-1));
 +</code>
 +
 +Также можно посмотреть, какие параметры были переданы (для отладки):
 +<code csharp>
 +var paramsAsString = string.Join(", ", parameters.Select(kv => $"{kv.Key}:{kv.Value}"));
 +</code>
 =====WebAPI===== =====WebAPI=====
 Получение Linq-запросов может выполняться от имени любого пользователя с учетом его прав. Нужно использовать CookieContainer для сохранения cookies и уже с ним делать последующие запросы к API. Получение Linq-запросов может выполняться от имени любого пользователя с учетом его прав. Нужно использовать CookieContainer для сохранения cookies и уже с ним делать последующие запросы к API.
Строка 127: Строка 153:
  
 <code php> <code php>
-POST http://localhost/Master/api/auth/login+POST http://localhost/api/auth/login
  
 { {
Строка 138: Строка 164:
  
 <code php> <code php>
-POST http://localhost/Master/api/auth/login+POST http://localhost/api/auth/login
  
 { {
Строка 145: Строка 171:
 </code>  </code> 
  
-<callout type="primary">Здесь и далее ''localhost'' - адрес системы, а ''Master'' - приложение системы (может не указываться, если является единственным приложением на домене).</callout>  +<callout type="primary">Здесь и далее ''localhost'' - адрес системы.</callout>  
-После авторизации отправляется запрос непосредственно к Linq, используя ключ источника (DataSourceKey) или Id LINQ-запроса (DataSourceId).\\ + 
 +После авторизации отправляется запрос непосредственно к Linq, используя ключ источника (''DataSourceKey'') \\ 
  
 <code php> <code php>
-POST http://localhost/Master/api/queries/get+POST http://localhost/api/queries/get
  
     DataSourceKey: "Key_of_Query",     DataSourceKey: "Key_of_Query",
Строка 156: Строка 183:
 } }
 </code> </code>
 +или Id LINQ-запроса (''DataSourceId'')
 <code php> <code php>
-POST http://localhost/Master/api/queries/get+POST http://localhost/api/queries/get
  
     DataSourceId: "54d198c3-bbd9-4812-9143-76c632a80e44",     DataSourceId: "54d198c3-bbd9-4812-9143-76c632a80e44",
Строка 167: Строка 194:
 <callout type="primary">Здесь ''Parameters'' - передаваемые в LINQ-запрос параметры (необязательное), а ''PageSize'' - максимальное количество первых по порядку возвращаемых из запроса записей (необязательное, но если не указано - всегда возвращаются только первые 10 записей из результатов выполнения запроса).</callout>  <callout type="primary">Здесь ''Parameters'' - передаваемые в LINQ-запрос параметры (необязательное), а ''PageSize'' - максимальное количество первых по порядку возвращаемых из запроса записей (необязательное, но если не указано - всегда возвращаются только первые 10 записей из результатов выполнения запроса).</callout> 
  
-Обращение к данным системы с текстом LINQ-запроса непосредственно в вызове метода+Обращение к данным системы с текстом LINQ-запроса (''Text''непосредственно в вызове метода
 <code php> <code php>
-POST http://localhost/Master/api/queries/get+POST http://localhost/api/queries/get
  
     Text: 'var a = (long)parameters["A"];     Text: 'var a = (long)parameters["A"];
Строка 219: Строка 246:
  
 <code python> <code python>
 +
 import requests import requests
  
Строка 224: Строка 252:
 LOGIN = 'xxxxx' LOGIN = 'xxxxx'
 PASSWORD = 'xxxxx' PASSWORD = 'xxxxx'
-DOMAIN = 'http://xxxxx' # при необходимости, указывайте протокол https в строке с реальным адресом домена системы+# используйте либо логин-пароль, либо токен 
 +# TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' 
 + 
 +# при необходимости, указывайте протокол https в строке с реальным адресом домена системы.  
 +# после адреса домена может быть указан еще и каталог размещения системы на домене (например, https://domain.example.ru/Master ) 
 +DOMAIN = 'http://xxxxx' 
  
 session = requests.Session() session = requests.Session()
  
 # авторизация # авторизация
-response = session.post(url=DOMAIN+'/api/auth/login', json={'Login': LOGIN, 'Password': PASSWORD})+response = session.post( 
 +    url = DOMAIN + '/api/auth/login',  
 +    json = { 
 +        'Login': LOGIN,  
 +        'Password': PASSWORD
 +    }
 +)
  
-# сохранение полученных после авторизации cookies    +# либо авторизуйтесь, используя токен доступа 
 +# response = session.post( 
 +#     url = DOMAIN + '/api/auth/login',  
 +#     json = { 
 +#         'tokenValue': TOKEN,  
 +#     }, 
 +# ) 
 + 
 +# сохранение полученных после авторизации cookies для последующих запросов  
 cookies = session.cookies.get_dict() cookies = session.cookies.get_dict()
  
Строка 237: Строка 284:
 LINQ = { LINQ = {
     'DataSourceId': "6b7c0388-a249-4d39-9cb6-xxxxxxxxxxx", # id LINQ-запроса в системе ADVANTA     'DataSourceId': "6b7c0388-a249-4d39-9cb6-xxxxxxxxxxx", # id LINQ-запроса в системе ADVANTA
 +    'PageSize': 100, # максимальное количество возвращаемых записей
 } }
  
 # получение данных из LINQ-запроса # получение данных из LINQ-запроса
-response = session.post(url=DOMAIN+'/api/queries/get', cookies=cookies, json=LINQ)+response = session.post( 
 +    url = DOMAIN + '/api/queries/get',  
 +    cookies = cookies,  
 +    json = LINQ
 +) 
 data = response.json() data = response.json()