Advertisement
DataCCIW

Sync Spouse Attributes

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