powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите пожалуйста разобраться с датами
8 сообщений из 33, страница 2 из 2
Помогите пожалуйста разобраться с датами
    #40062521
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
infinitidolla
komrad,
тоесть в марке блок dog работал нормально а в апреле сломался.

он может сломаться и в мае/июне/июле/итд, если в поле Comment после номера договора не будет пробела, который вы ищете
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с датами
    #40062526
infinitidolla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
komrad, в общем дошло что изз а left запрос возвращает неправильную длинну изза этого ошибка тперь не понимаю как ее посчитать
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с датами
    #40062530
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
infinitidolla,

ооо я прям как чуял что по алиасу "dt" будет диасофтик :)

первое: искать тип комиссии из назначения платежа - огонь. вы разве не можете выйти на связи документа с карточным договором?
второе: убирайте нафиг стандартные хинты диасофта вида option (force order, loop join, keepfixed plan) и жесткую привязку к индексам
три: не используйте sync-таблицы, обращайтесь напрямую к прародителям
четыре: брать код с формы документов такое себе решение, он сильно перегружен.
пять: почему вы не хотите параметризировать запрос что бы пользователь указывал интервал дат сам а не извращаться с EOMONTH?
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с датами
    #40062536
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff

второе: убирайте нафиг стандартные хинты диасофта вида option (force order, loop join, keepfixed plan) и жесткую привязку к индексам

выйдите из зоны комфорта, положитесь на сервер - он знает лучше ;)
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с датами
    #40062628
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
infinitidolla,

Задам Вам небольшой вектор:
src
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

DROP TABLE IF EXISTS #tmp_Docs;

CREATE TABLE #tmp_Docs (
      [DealTransactID] NUMERIC(15, 0),
      [ResDebtID] NUMERIC(15, 0),
      [ResCredID] NUMERIC(15, 0),
      [Date] DATETIME,
      [Qty] MONEY,
      [Comment] VARCHAR(255),
      [ContractID] NUMERIC(15, 0)
);

DECLARE
       @DS DATETIME,
       @DE DATETIME,
       @BatchID NUMERIC(15, 0);

SET @DS = '20200401';
SET @DE = '20200501';
SET @BatchID = 10000003353;

INSERT INTO #tmp_Docs ([DealTransactID], [ResDebtID], [ResCredID], [Date], [Qty], [Comment])
  SELECT
        dt.[DealTransactID],
        dt.[ResourceID],
        dt.[ResourcePsvID],
        dt.[Date],
        dt.[Qty],
        dt.[Comment]
  FROM [dbo].[tDealTransact] dt WITH(FORCESEEK)
  WHERE dt.[TransactType] = 5
    AND dt.[Date] BETWEEN @DS AND @DE
    AND dt.[BatchID] = @BatchID
    AND dt.[Confirmed] = 1 --условия в вашем запросе нет, но наверняка плановые документы вам не нужны
    --AND dt.[InstrumentID] = 1558. --очень желательное условие: завязаться дополнительно на ФО в которой создается комиссия
    AND EXISTS (SELECT 1 FROM [dbo].[tResource] r WHERE r.[Brief] LIKE '70601%' AND r.[BalanceID] = 2140. AND r.[ResourceID] IN (dt.[ResourceID], dt.[ResourcePsvID]))
  OPTION (RECOMPILE);

UPDATE t
   SET [ContractID] = x.[ObjectID]
  FROM #tmp_Docs t
      CROSS APPLY (SELECT TOP(1)
                         cal.[ObjectID]
                   FROM [dbo].[tCrdAccountLink] cal
                       JOIN [dbo].[tTypeAccLink] tal ON tal.[TypeAccLinkID] = cal.[RuleID] AND tal.[Brief] = 'РАСЧЕТН' --тип связи уточнить
                   WHERE cal.[AccountID] = t.[ResDebtID]
                     AND cal.[Flags] = 2
                     AND cal.[ObjectID] IN (10000002061., 10000002062., 10000002063., 10000002370., 10000002372.)
                   ORDER BY cal.[OnDate] DESC
                  ) x;

UPDATE t
   SET [ContractID] = x.[ObjectID]
  FROM #tmp_Docs t
      CROSS APPLY (SELECT TOP(1)
                         cal.[ObjectID]
                   FROM [dbo].[tCrdAccountLink] cal
                       JOIN [dbo].[tTypeAccLink] tal ON tal.[TypeAccLinkID] = cal.[RuleID] AND tal.[Brief] = 'РАСЧЕТН' --тип связи уточнить
                   WHERE cal.[AccountID] = t.[ResCredID]
                     AND cal.[Flags] = 2
                     AND cal.[ObjectID] IN (10000002061., 10000002062., 10000002063., 10000002370., 10000002372.)
                   ORDER BY cal.[OnDate] DESC
                  ) x
 WHERE t.[ContractID] IS NULL;

WITH X AS (
    SELECT
          d.[DealTransactID],
          d.[ResDebtID],
          d.[ResCredID],
          FORMAT(d.[Date], 'yyyy.MM') AS [Period],
          d.[Qty],
          d.[Comment],
          c.[Number] AS [DealNumber]
    FROM #tmp_Docs d
        JOIN [dbo].[tResource] rd ON rd.[ResourceID] = d.[ResDebtID]
        JOIN [dbo].[tResource] rc ON rc.[ResourceID] = d.[ResCredID]
        JOIN [dbo].[tContract] c ON c.[ContractID] = d.[ContractID]
)
SELECT
     [Period],
     [ContractID],
     MAX([DealNumber]) AS [Dog],
     SUM([Qty]) AS [SumQty]
     --BLABLABLA CASE по поиску типа комиссии
     --BLABLABLA CASE по поиску текста по сути тоже можно предрасчетом подготовить что бы не писать безумных CASE
FROM X
GROUP BY [Period], [ContractID];




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

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

у вас обычно документы комиссии будут вида дт: 40[5-8] кт: 70601
ну или в обратку что очень редко если это не какой нибудь межфил или исправительные проводки.
поэтому зная это вы можете предполагать что найдя документ 40702 -> 70601 счет по дебету будет расчетным счетом клиента с которого списывается комиссия, если он подвязан под договором какой либо статической связью вы с него сможете выйти на сам договор, поэтому уже вам не нужно будет стараться выцепить номер договора из назначения платежа.

если таких связей нет или у вас какие то специфичные условия что вы там какой то абстрактный договор эквайринга ищете, ну тогда да, парсить назначение, но он все равно обычно соответствует какому то заранее заданному шаблону, может вам стоит расмотреть вариант разбивая строку на слова по разделителю в виде пробела и искать вхождение определенных паттернов, зависит от ситуации. но это точно будет лучше чем искать по части строки с помощью charindex/patindex.

не применяйте по крайней мере фильтров поиска подстроки сразу, пока не нашли все нужные вам документы, потому что оптимизатор запросов иногда бывает что может построить план который будет рассчитывать ваши скалярные объекты до применения необходимой фильтрации которая отсеивает ненужные документы. из-за этого можете получить ситуацию когда под расчет скаляра попадет документ назначение платежа которого никак не нацелено на ваши алгоритмы поиска.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с датами
    #40062690
infinitidolla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff,
спасибо большое!
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с датами
    #40062818
infinitidolla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
komrad,
Спасибо большое за ответы для меня как для новичка этот код дался не легко учитывая что я только два месяца как этим всем занимаюсь.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с датами
    #40063919
RuCosinus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
infinitidolla,felix_ff
полностью согласен с тем, что написал felix_ff, особенно про хинты и ноулоки по индексам. Но совет - внимательнее смотрите структуру таблиц, которая учувствует в запросе. Зачем смотреть написал под спойлером.

Не по SQL, а по конкретикеХотел бы обратить внимание, что если в используемых таблицах есть столбцы вида BeginDate,StartDate и EndDate (они могут по разному называться но смысл у них един - это даты начала и окончания действия и\или связи) , особенно таблицы связи со счетами, то обязательно проставляйте там условие на то, что связь рабочая на дату или период дат, по которой строится отчет. Например в последнем запросе от уважаемого felix_ff - сразу бросается в глаза таблица tCrdAccountLink. Живой пример из карт. Счет карты для резидента 40817, а для нерезидента 40820 и если клиент сначала был нерезидентом и карту получал, как нерез, а потом получил вид на жительство, то банк обязан открыть новый счет в новом балансе 40817 и перепривязать его к карте (по сути к договору, но не об этом). Таким образом у клиента вместо 40820, теперь появится 40817 и по вот этому запросу за прошлую дату
Код: sql
1.
2.
FROM [dbo].[tCrdAccountLink] cal
JOIN [dbo].[tTypeAccLink] tal ON tal.[TypeAccLinkID] = cal.[RuleID] AND tal.[Brief] = 'РАСЧЕТН' --Типа СКС или КАРТОЧНЫЙ


мы получим 2 записи, вместо одной. В блоке where есть , правда, условие про flag=2, мне сейчас неохота проверять, но возможно - это признак того, что эта связь - действующая. Это условие неверно отработает за прошлые периоды, которые были до смены гражданства. Лучше все таки на даты действия закладываться.

P.S. Но felix_ff честно написал, что только указывает верное направление, дальше сами :)
...
Рейтинг: 0 / 0
8 сообщений из 33, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите пожалуйста разобраться с датами
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]