DataCCIW

Sync Attribute To Spouse

Sep 10th, 2020 (edited)
1,241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 7.23 KB | None | 0 0
  1. USE [ArenaDB]
  2. GO
  3.  
  4. SET ANSI_NULLS ON
  5. GO
  6.  
  7. SET QUOTED_IDENTIFIER ON
  8. GO
  9.  
  10. CREATE PROCEDURE [dbo].[cust_CCIW_sync_attributes_to_spouse]
  11.   @AttributeIDList VARCHAR(1000)
  12. AS
  13.  
  14. IF OBJECT_ID('tempdb..#temptable') IS NOT NULL
  15. BEGIN
  16.   DROP TABLE #temptable;
  17. END;
  18.  
  19. IF OBJECT_ID('tempdb..#update_table') IS NOT NULL
  20. BEGIN
  21.   DROP TABLE #update_table;
  22. END;
  23.    
  24. DECLARE
  25.   @AdultRole INT = 29;
  26.  
  27. DECLARE
  28.   @UpdateDateTime DATETIME = GETDATE();
  29.  
  30. DECLARE
  31.   @OrganizationID INT = 1;
  32.  
  33. DECLARE
  34.   @HistoryTypeLUID INT = 9457; -- Person Attribute Updates
  35.  
  36. SELECT CPA.person_id,
  37.        person2 = CPA2.person_id,
  38.        spouce_id = CFM2.person_id,
  39.        CFM.family_id,
  40.        CPA.attribute_id,
  41.        Attb_Mod_Date = CPA.date_modified,
  42.        CFM2.person_id AS Spouce_per_id,
  43.        Attb_val_1 = CPA.attribute_value,
  44.        Attb_val_2 = CPA2.attribute_value,
  45.        Update_Person_ID = CASE WHEN CPA2.date_modified IS NULL
  46.                                     OR CPA.date_modified > CPA2.date_modified THEN CPA2.person_id
  47.                                ELSE CPA.person_id
  48.                           END,
  49.        Insert_Person_ID = CASE WHEN CPA2.date_modified IS NULL THEN CFM2.person_id
  50.                                ELSE NULL
  51.                           END,
  52.        new_int_value = CASE WHEN CPA2.date_modified IS NULL
  53.                                  OR CPA.date_modified > CPA2.date_modified THEN CPA.int_value
  54.                             ELSE CPA2.int_value
  55.                        END,
  56.        new_decimal_value = CASE WHEN CPA2.date_modified IS NULL
  57.                                      OR CPA.date_modified > CPA2.date_modified THEN CPA.decimal_value
  58.                                 ELSE CPA2.decimal_value
  59.                            END,
  60.        new_varchar_value = CASE WHEN CPA2.date_modified IS NULL
  61.                                      OR CPA.date_modified > CPA2.date_modified THEN CPA.varchar_value
  62.                                 ELSE CPA2.varchar_value
  63.                            END,
  64.        new_datetime_value = CASE WHEN CPA2.date_modified IS NULL
  65.                                       OR CPA.date_modified > CPA2.date_modified THEN CPA.datetime_value
  66.                                  ELSE CPA2.datetime_value
  67.                             END,
  68.        new_attribute_value = CASE WHEN CPA2.date_modified IS NULL
  69.                                        OR CPA.date_modified > CPA2.date_modified THEN CPA.attribute_value
  70.                                   ELSE CPA2.attribute_value
  71.                              END,
  72.        CPA.attribute_type,
  73.        attb_type_2 = CPA2.attribute_type,
  74.        CPA.attribute_name
  75. INTO #temptable
  76. FROM   cust_CCIW_v_person_attribute CPA
  77.        JOIN core_family_member CFM ON CFM.person_id = CPA.person_id
  78.        JOIN core_family_member CFM2 ON CFM.family_id = CFM2.family_id
  79.        LEFT JOIN cust_CCIW_v_person_attribute CPA2 ON CPA2.person_id = CFM2.person_id
  80.                                                       AND CPA2.attribute_id = CPA.attribute_id
  81. WHERE  CPA.attribute_id IN
  82. (
  83.     SELECT *
  84.     FROM   dbo.fnSplit(@AttributeIDList)
  85. )
  86.        AND CFM2.role_luid = @AdultRole
  87.        AND CFM.role_luid = @AdultRole
  88.        AND CFM.person_id != CFM2.person_id
  89.        AND -- Do update where the values are null, != comparison will fail for null values
  90.        ( CPA.attribute_value != CPA2.attribute_value
  91.          OR CPA.attribute_value IS NULL
  92.          OR CPA2.attribute_value IS NULL
  93.                                         )
  94.        AND -- Don't update attributes where both values are null
  95.        ( CPA.attribute_value IS NOT NULL
  96.          OR CPA2.attribute_value IS NOT NULL
  97.                                             )
  98.        AND CFM.family_id NOT IN -- Don't include families that have 3+ Adults, this can lead to a scenario where the script tries to insert duplicate primary keys
  99. (
  100.     SELECT f.family_id
  101.     FROM   core_family_member fm
  102.            JOIN core_family f ON f.family_id = fm.family_id
  103.     GROUP BY f.family_id,
  104.              role_luid,
  105.              f.family_name
  106.     HAVING role_luid = @AdultRole
  107.            AND COUNT(*) > 2
  108. );
  109.  
  110.  
  111. SELECT *
  112. FROM   #temptable t
  113. ORDER BY person_id;
  114.  
  115. SELECT DISTINCT
  116.        Update_Person_ID,
  117.        Insert_Person_ID,
  118.        attribute_id,
  119.        new_int_value,
  120.        new_decimal_value,
  121.        new_varchar_value,
  122.        new_datetime_value,
  123.        new_attribute_value,
  124.        attribute_type,
  125.        attribute_name
  126. INTO #update_table
  127. FROM   #temptable;
  128.  
  129. BEGIN TRAN Spouse_Attb_Update;
  130. -- Do Updates
  131.  
  132. IF
  133. (
  134.     SELECT COUNT(*)
  135.     FROM   #update_table
  136.     WHERE  Update_Person_ID IS NOT NULL
  137. ) > 0
  138. BEGIN
  139.   UPDATE CPA
  140.     SET  int_value = CASE WHEN T.attribute_type IN(0, 3, 4, 9) THEN T.new_int_value
  141.                           ELSE int_value
  142.                      END, varchar_value = CASE WHEN T.attribute_type IN(1, 7, 8) THEN T.new_varchar_value
  143.                                                ELSE varchar_value
  144.                                           END, datetime_value = CASE WHEN T.attribute_type IN(2) THEN T.new_datetime_value
  145.                                                                      ELSE datetime_value
  146.                                                                 END, decimal_value = CASE WHEN T.attribute_type IN(5, 6) THEN T.new_decimal_value
  147.                                                                                           ELSE decimal_value
  148.                                                                                      END, date_modified = @UpdateDateTime
  149.   FROM   core_person_attribute CPA
  150.          JOIN #update_table T ON CPA.person_id = T.Update_Person_ID
  151.                                  AND CPA.attribute_id = T.attribute_id;
  152. END;
  153. --
  154.  
  155. SELECT
  156.        Change_Type = CASE WHEN Update_Person_ID IS NULL THEN 'Add New Attribute Value' ELSE 'Change Existing Attribute Value' END,
  157.        P.person_id,
  158.        [Person to Update] =P.first_name + ' ' + P.last_name,
  159.        U.attribute_name,
  160.        U.new_attribute_value
  161. FROM   #update_table U
  162.        JOIN core_person P ON P.person_id = COALESCE(Update_Person_ID, Insert_Person_ID)
  163. ORDER BY Update_Person_ID DESC;
  164.  
  165. -- Do Inserts
  166.  
  167. IF
  168. (
  169.     SELECT COUNT(*)
  170.     FROM   #update_table
  171.     WHERE  Insert_Person_ID IS NOT NULL
  172. ) > 0
  173.  
  174. BEGIN
  175.   INSERT INTO                      core_person_attribute(person_id,
  176.                                                          attribute_id,
  177.                                                          int_value,
  178.                                                          varchar_value,
  179.                                                          datetime_value,
  180.                                                          decimal_value,
  181.                                                          date_created,
  182.                                                          date_modified,
  183.                                                          created_by,
  184.                                                          modified_by,
  185.                                                          organization_id)
  186.          SELECT U.Insert_Person_ID,
  187.                 U.attribute_id,
  188.                 CASE WHEN U.attribute_type IN(0, 3, 4, 9) THEN U.new_int_value
  189.                      ELSE NULL
  190.                 END,
  191.                 CASE WHEN U.attribute_type IN(1, 7, 8) THEN U.new_varchar_value
  192.                      ELSE NULL
  193.                 END,
  194.                 CASE WHEN U.attribute_type IN(2) THEN U.new_datetime_value
  195.                      ELSE NULL
  196.                 END,
  197.                 CASE WHEN U.attribute_type IN(5, 6) THEN U.new_decimal_value
  198.                      ELSE NULL
  199.                 END,
  200.                 @UpdateDateTime,
  201.                 @UpdateDateTime,
  202.                 'Attribute Sync Script',
  203.                 'Attribute Sync Script',
  204.                 @OrganizationID
  205.          FROM   #update_table U
  206.          WHERE  U.Insert_Person_ID IS NOT NULL;
  207. END;
  208.  
  209.  
  210. --Add history
  211.  
  212. IF
  213. (
  214.     SELECT COUNT(*)
  215.     FROM   #update_table
  216. ) > 0
  217. BEGIN
  218.   INSERT INTO                    core_person_history(date_created,
  219.                                                      date_modified,
  220.                                                      created_by,
  221.                                                      modified_by,
  222.                                                      person_id,
  223.                                                      history_type_luid,
  224.                                                      history_qualifier_id,
  225.                                                      system_history,
  226.                                                      history,
  227.                                                      organization_id,
  228.                                                      display_flag,
  229.                                                      display_expiration,
  230.                                                      private_flag)
  231.          SELECT @UpdateDateTime,
  232.                 @UpdateDateTime,
  233.                 'Attribute Sync Script',
  234.                 'Attribute Sync Script',
  235.                 COALESCE(U.Update_Person_ID, U.Insert_Person_ID),
  236.                 @HistoryTypeLUID,
  237.                 U.attribute_id,
  238.                 'True',
  239.                 CASE WHEN U.Update_Person_ID IS NOT NULL THEN 'Updated ' + attribute_name + ' via Attribute Sync Script to ' + new_attribute_value
  240.                      ELSE 'Attribute ' + attribute_name + ' created via Attribute Sync Script'
  241.                 END,
  242.                 @OrganizationID,
  243.                 'false',
  244.                 0,
  245.                 'False'
  246.          FROM   #update_table U;
  247. END;
  248. --
  249.  
  250. COMMIT TRAN Spouse_Attb_Update;
  251. GO
  252.  
  253.  
  254.  
Add Comment
Please, Sign In to add comment