Помощь с SQL сценарием - PullRequest
       19

Помощь с SQL сценарием

0 голосов
/ 24 января 2020

В настоящее время я разрабатываю отчет SQL, который будет запускаться изнутри ERP system. Идея этого кода заключается в том, чтобы собрать все AR открытых позиций со всеми этими полями в SELECT statement и иметь возможность выбрать, для чего будет запускаться отчет, с помощью различные варианты предложений WHERE, которые я описываю.

Я также прилагаю таблицу внутри ERP system с именами «параметров», и пользователю параметров придется запускать отчет как .. .

Я не могу заставить работать все эти операторы CASE AND, OR или предоставить конкретные c данные на основе критерии поиска.

Я даже не уверен, что правильно отображаю параметры в коде предложения WHERE (с "< >" , или по имени поля, или с помощью ' ', ...)

Пример данных

Параметры отчета

SELECT DISTINCT
e1.rel_value AS Cust_Rep_Grp, 
o1.description AS Cust_Rep_Grp_Name, 
r.main_apar_id AS Head_Office, 
o2.description AS Head_Office_Name, 
s.apar_id AS CustID, 
o3.description AS Cust_ID_Name, 
s.voucher_no, 
s.dim_2 AS BookingNo, 
h.ext_ord_ref AS YourRef,  
n.booking_day_fx AS Booking_date, 
n.check_in_date_fx AS Check_in_date, 
n.check_out_date_fx AS Check_out_date, 
s.voucher_date AS Invoice_date,
s.due_date, 
i.art_descr AS Hotel_name, 
o.description AS Destination,
e2.rel_value AS City,
o.description AS City_name,
e.rel_value AS Country_code,
o4.description AS Country_name, 
n.guest_fx AS Client_name,
n.pax_fx, 
s.currency,
i.disc_percent AS Comm_percentage, 
s.cur_amount AS Net_amt, 
s.rest_curr AS Due_now,
s.voucher_type,
s.order_id 
FROM acutrans s
LEFT OUTER JOIN acuheader r
ON r.client = s.client
AND s.apar_id = r.apar_id
LEFT OUTER JOIN asoheader h
ON h.client = s.client
AND h.order_id = s.order_id
LEFT OUTER JOIN asodetail i
ON i.client = s.client
AND i.order_id = s.order_id
INNER JOIN algvirelvalue e2 
ON e2.client= s.client 
AND e2.rel_attr_id='ZZ06'
AND e2.related_attr = 'CITY' 
AND i.article = e2.article
LEFT OUTER JOIN aglrelvalue e 
ON e.client= s.client 
AND e.attribute_id = 'ZZ06'
AND e.rel_attr_id = 'C9'
AND e.att_value = e2.rel_value
LEFT OUTER JOIN aglrelvalue e1
ON e1.client = s.client
AND e1.attribute_id = 'A4'
AND e1.rel_attr_id = 'ZG06'
AND e1.att_value = s.apar_id
LEFT OUTER JOIN agldescription o 
ON o.client= s.client 
AND o.attribute_id='ZZ06' 
AND o.dim_value = e2.rel_value
LEFT OUTER JOIN agldescription o1 
ON o1.client= s.client 
AND o1.attribute_id='ZG06' 
AND o1.dim_value = e1.rel_value
LEFT OUTER JOIN agldescription o2 
ON o2.client= s.client 
AND o2.attribute_id='A4' 
AND o2.dim_value = r.main_apar_id
LEFT OUTER JOIN agldescription o3 
ON o3.client= s.client 
AND o3.attribute_id='A4' 
AND o3.dim_value = s.apar_id 
LEFT OUTER JOIN agldescription o4 
ON o4.client= s.client 
AND o4.attribute_id='C9' 
AND o4.dim_value = e.rel_value
LEFT OUTER JOIN afxbooking_gen n 
ON s.dim_2 = n.dim_value 
AND s.client = n.client 
AND n.attribute_id = 'ZZ01'

WHERE  
      CASE WHEN '<checkin_from>' IN (' ','') THEN '*' ELSE '<checkin_from>' END LIKE n.check_in_date_fx
      AND  
      CASE WHEN n.check_in_date_fx IN (' ','') THEN '*' ELSE n.check_in_date_fx END LIKE n.check_in_date_fx
      OR
      CASE WHEN s.voucher_date IN (' ','') THEN '*' ELSE s.voucher_date END LIKE s.voucher_Date
      AND 
      CASE WHEN s.voucher_date IN (' ','') THEN '*' ELSE s.voucher_date END LIKE s.voucher_Date
      OR 
      CASE WHEN n.booking_day_fx IN (' ','') THEN '*' ELSE n.booking_day_fx END LIKE n.booking_day_fx
      AND
      CASE WHEN n.booking_day_fx IN (' ','') THEN '*' ELSE n.booking_day_fx END LIKE n.booking_day_fx
      OR 
      CASE WHEN n.check_out_date_fx IN (' ','') THEN '*' ELSE n.check_out_date_fx END LIKE n.check_out_date_fx
      AND 
      CASE WHEN n.check_out_date_fx IN (' ','') THEN '*' ELSE n.check_out_date_fx END LIKE n.check_out_date_fx  
      OR 
      CASE WHEN s.apar_id  IN (' ','') THEN '*' ELSE s.apar_id  END LIKE s.apar_id 
      AND
      CASE WHEN s.apar_id  IN (' ','') THEN '*' ELSE s.apar_id  END LIKE s.apar_id 
      OR 
      CASE WHEN o3.description IN (' ','') THEN '*' ELSE o3.description END LIKE o3.description
      OR 
      CASE WHEN e1.rel_value IN (' ','') THEN '*' ELSE e1.rel_value END LIKE e1.rel_value
      AND
      CASE WHEN e1.rel_value IN (' ','') THEN '*' ELSE e1.rel_value END LIKE e1.rel_value
      OR 
      CASE WHEN o1.description IN (' ','') THEN '*' ELSE o1.description END LIKE o1.description 
      OR 
      CASE WHEN r.main_apar_id IN (' ','') THEN '*' ELSE r.main_apar_id END LIKE r.main_apar_id
      AND
      CASE WHEN r.main_apar_idIN (' ','') THEN '*' ELSE r.main_apar_id END LIKE r.main_apar_id
      OR 
      CASE WHEN o2.description IN (' ','') THEN '*' ELSE o2.description END LIKE o2.description  
      OR 
      CASE WHEN s.dim_2 IN (' ','') THEN '*' ELSE s.dim_2 END LIKE s.dim_2
      AND
      CASE WHEN s.dim_2 IN (' ','') THEN '*' ELSE s.dim_2 END LIKE s.dim_2
      OR 
      CASE WHEN e.rel_value IN (' ','') THEN '*' ELSE e.rel_value END LIKE e.rel_value  
      OR 
      CASE WHEN s.currency  IN (' ','') THEN '*' ELSE s.currency  END LIKE s.currency  
      OR 
      CASE WHEN n.guest_fx IN (' ','') THEN '*' ELSE n.guest_fx END LIKE n.guest_fx 
      OR 
      CASE WHEN s.voucher_no IN (' ','') THEN '*' ELSE s.voucher_no END LIKE s.voucher_no
      AND
      CASE WHEN s.voucher_no IN (' ','') THEN '*' ELSE s.voucher_no END LIKE s.voucher_no
      OR 
      CASE WHEN h.ext_ord_ref IN (' ','') THEN '*' ELSE h.ext_ord_ref END LIKE h.ext_ord_ref
      OR 
      CASE WHEN s.order_id IN (' ','') THEN '*' ELSE s.order_id END LIKE s.order_id
      AND
      CASE WHEN s.order_id IN (' ','') THEN '*' ELSE s.order_id END LIKE s.order_id

1 Ответ

0 голосов
/ 24 января 2020

С чего начать?

Позволяет немного упростить это.

  1. Возвращает ли оператор SELECT без предложения WHERE правильную структуру. Так что, если все это большой запрос для отладки на таком форуме, как этот, мы должны нацелить ответ, а в остальной части этого решения мы будем предполагать, что ваш синтаксис и связи SELECT FROM и JOIN верны.

  2. Ваши WHERE критерии вообще не верны, они вообще не сравниваются с входными параметрами.
    Похоже, что ваши критерии фильтра можно суммировать как объединение между некоторые фильтры с датой и цифрой c и некоторые фильтры с точным соответствием для текста и цифры c. Каждый из фильтров является необязательным, но возвращаемые данные должны удовлетворять всем непустым параметрам.

    Я не знаком с синтаксисом параметров в Unit4 Business World, Report Engine , Ниже приведен чистый пример MS SQL. Параметры будут иметь префикс @, возможно, Unit4 имеет пользовательскую реализацию параметров, вам придется проверить документацию.

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

Я могу определить следующие концептуальные критерии фильтра:

  1. (дата регистрации) n.check_in_date_fx должно быть больше или равно @checkin_from
  2. n.check_in_date_fx должно быть меньше или равно @checkin_to
  3. s.voucher_date должно быть> = @invdate_from
  4. s.voucher_date должно быть <= <code>@invdate_to
  5. n.booking_day_fx должно быть> = @bookdate_fro
  6. n.booking_day_fx должно быть <= <code>@bookdate_to
  7. n.check_out_date_fx должно быть> = @checkout_fro
  8. n.check_out_date_fx должно быть <= <code>@checkout_to
  9. (CustID) s.apar_id должно быть> = @custid_from
  10. s.apar_id должно быть <= <code>@custid_to* 1 084 *
  11. (CustomerName) o3.description LIKE @custname ...

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

WHERE
( параметр1 равен пусто ИЛИ критерии фильтра для параметр1 совпадений) И ( параметр2 равен пусто ИЛИ критерии фильтра для параметров2 совпадений) И ( параметр3 равен пусто ИЛИ критериев фильтра для параметр3 соответствует)

Таким образом, для тех первых фильтров, которые мы определили, предложение WHERE выглядит следующим образом:

Это предполагает, что дата поля на самом деле хранятся как DATE совместимый тип данных, следующее не будет работать, если они хранятся как текст ... Также при условии, что параметры p Если они указаны как строки, то если они передаются как тип даты, IN (' ','') не будет работать, вместо этого вам придется использовать null сравнения дат.

WHERE  
    ( @checkin_from IN (' ','') OR n.check_in_date_fx >= @checkin_from )
AND ( @checkin_to IN (' ','') OR n.check_in_date_fx <= @checkin_to )      
AND ( @invdate_from IN (' ','') OR s.voucher_date >= @invdate_from )
AND ( @invdate_to IN (' ','') OR s.voucher_date <= @invdate_to )
AND ( @bookdate_fro IN (' ','') OR n.booking_day_fx >= @bookdate_fro )
AND ( @bookdate_to IN (' ','') OR n.booking_day_fx <= @bookdate_to )
AND ( @checkout_fro IN (' ','') OR n.check_out_date_fx >= @checkout_fro )
AND ( @checkout_to IN (' ','') OR n.check_out_date_fx <= @checkout_to )
AND ( @custid_from IN (' ','') OR s.apar_id >= @custid_from )
AND ( @custid_to IN (' ','') OR s.apar_id <= @custid_to )
AND ( @custname IN (' ','') OR o3.description LIKE @custname )
...

Вы просто продолжаете добавлять новый критерий с AND, обеспечивающий соответствие внутри _and критериев для пустого значения параметра OR параметр соответствует строке.

Если параметры даты передаются в виде строк, а поля БД хранятся как дата пропущенных типов данных, тогда приведенный выше синтаксис должен работать. Если параметры даты фактически передаются как правильные DATE типизированные значения, тогда сравнение строк может не работать, пустая дата может быть передана как NULL, если это так, то вам может потребоваться изменить параметр logi c примерно так:

AND ( @checkin_to IS NULL OR ... )

Если поля даты не сохраняются как даты, вам придется привести их к дате, чтобы разрешить сравнение на основе даты, на основе строки больше или меньше сравнения работает только в том случае, если даты хранятся последовательно в формате ISO

Я надеюсь, что это обсуждение направит вас в правильном направлении.

...