Wiki source code of RAN Overview — Excel to SharePoint List
Last modified by Dimitri Rupp on 2026/06/11 09:30
Show last authors
| author | version | line-number | content |
|---|---|---|---|
| 1 | {{box cssClass="floatinginfobox" title="**On this page**"}} | ||
| 2 | {{toc/}} | ||
| 3 | {{/box}} | ||
| 4 | |||
| 5 | = RAN Overview — Excel to SharePoint List = | ||
| 6 | |||
| 7 | {{info}} | ||
| 8 | **Objective:** Import / update the **RAN Overview SharePoint list** from (% style="font-family:monospace" %)NLG_CUBE_aktuell.xlsx(%%) based on master/slave NESO-project clauses. | ||
| 9 | **Stages:** Power BI (delta dataflow + helper report + Excel export) → Power Automate (SharePoint list update). | ||
| 10 | {{/info}} | ||
| 11 | |||
| 12 | == Objective == | ||
| 13 | |||
| 14 | To **import** into or **update** data in the **RAN Overview SharePoint list** from (% style="font-family:monospace" %)NLG_CUBE_aktuell.xlsx(%%) based on certain conditions. | ||
| 15 | |||
| 16 | == Requirements from the requestor == | ||
| 17 | |||
| 18 | === Introduction === | ||
| 19 | |||
| 20 | Each row in the SharePoint list **RAN_Overview** is the representation of a **NESO-Project** ((% style="font-family:monospace" %)7xxxxxxxx(%%)) in **Telefonica's Netsite**. NESO-Projects can be **related to each other** in Netsite by the **Verknuepfungsgruppe** (relationship group). This ID is the (% style="font-family:monospace" %)vkn_Gruppe_ID(%%). | ||
| 21 | |||
| 22 | The Verknuepfungsgruppe consists usually of a **main project**, which is relevant for the acceptance, and a number of **slave projects** which are not relevant for acceptance but need to be administered too. | ||
| 23 | |||
| 24 | In the **NRG program**, NESO-Projects are usually additionally related to a **Netsite Standortprojekt** (site project (% style="font-family:monospace" %)9xxxxxxxx(%%)). | ||
| 25 | |||
| 26 | The terms **row / dataset / project** might be used interchangeably. The terms **column / field** might be used interchangeably. | ||
| 27 | |||
| 28 | === Unique Identifier === | ||
| 29 | |||
| 30 | The **unique identifier** in the SharePoint list **RAN_Overview** is the field (% style="font-family:monospace" %)**„Projekt-ID"**(%%) — the **project ID** of a **NESO-Project** in Netsite. | ||
| 31 | |||
| 32 | === Logic for adding new rows to the list === | ||
| 33 | |||
| 34 | A row from (% style="font-family:monospace" %)NLG_Cube_aktuell.xlsb(%%) shall be added to **RAN_Overview SP** when **either one of the following clauses** evaluates to **true**: | ||
| 35 | |||
| 36 | **First Clause — Identifying the master project:** | ||
| 37 | |||
| 38 | {{code}} | ||
| 39 | A = (GU_Projekt ∈ {*SPL*} | ||
| 40 | ∧ NE_Typ ∈ {30, 31, 32, 33} | ||
| 41 | ∧ Projekt_Art ∈ {Aufbau, Swap-Out, Kapazitaetsanpassung, Datenkorrektur, Umbau, Umschaltung} | ||
| 42 | ∧ Ist_92 ∈ Ø | ||
| 43 | ∧ Ist_56a ∉ Ø) | ||
| 44 | {{/code}} | ||
| 45 | |||
| 46 | **Second Clause — Identifying the slave projects:** | ||
| 47 | |||
| 48 | A project for which Condition 1 evaluates to true can be a **member of a Verknuepfungsgruppe**. **All other members** of this Verknuepfungsgruppe shall be added to the list, too. | ||
| 49 | |||
| 50 | {{info}} | ||
| 51 | **Notes:** | ||
| 52 | * (% style="font-family:monospace" %)*SPL*(%%) means "String contains SPL" — written as a regular expression. | ||
| 53 | * The **first clause** identifies all **master projects** of a Verknuepfungsgruppe. | ||
| 54 | * The **second clause** identifies all **slave projects** in the same Verknuepfungsgruppe. | ||
| 55 | {{/info}} | ||
| 56 | |||
| 57 | == Data Architecture == | ||
| 58 | |||
| 59 | Two stages: **Power BI** for transformations, **Power Automate** for SharePoint updates. | ||
| 60 | |||
| 61 | {{mermaid}} | ||
| 62 | flowchart LR | ||
| 63 | NLG[NLG_CUBE_aktuell.xlsx<br/>Dataflow] | ||
| 64 | NLG -->|Master-Filter:<br/>NE_Typ + Projekt_Art + ...| MASTERS[Master vkn_Gruppe_IDs] | ||
| 65 | MASTERS -->|Inner Join| FULL[Master + Slave<br/>NLG_Table] | ||
| 66 | FULL -->|Inner Join SP-list<br/>+ Binary-Key-Vergleich| UPD[to_update] | ||
| 67 | FULL -->|Left Anti Join SP-list| IMP[to_import] | ||
| 68 | SP[(SharePoint list<br/>RAN_Overview)] --> UPD | ||
| 69 | SP --> IMP | ||
| 70 | UPD --> RPT[Helper PBI Report:<br/>RAN_Overview_list_delta_report] | ||
| 71 | IMP --> RPT | ||
| 72 | RPT --> XLS[Excel via Office Script] | ||
| 73 | XLS --> PA[Power Automate flow] | ||
| 74 | PA --> SP | ||
| 75 | |||
| 76 | classDef src fill:#e3f2fd,stroke:#1976d2,stroke-width:1px | ||
| 77 | classDef pbi fill:#fff3cd,stroke:#b85c00,stroke-width:1px | ||
| 78 | classDef sp fill:#c8e6c9,stroke:#2e7d32,stroke-width:1px | ||
| 79 | class NLG src | ||
| 80 | class MASTERS,FULL,UPD,IMP,RPT pbi | ||
| 81 | class XLS,PA pbi | ||
| 82 | class SP sp | ||
| 83 | {{/mermaid}} | ||
| 84 | |||
| 85 | === Power BI architecture === | ||
| 86 | |||
| 87 | A new dataflow (% style="font-family:monospace" %)RAN_Overview_list_delta(%%) is created in the **MN DE Backoffice** workspace, comparing **NLG_CUBE** with the SharePoint list: | ||
| 88 | |||
| 89 | 1. First step: apply filter conditions to (% style="font-family:monospace" %)NLG_CUBE(%%) → list of **master (% style="font-family:monospace" %)vkn_Gruppe_IDs(%%)**. | ||
| 90 | 2. Use this list to filter the original (% style="font-family:monospace" %)NLG_CUBE(%%) (Inner Join with unfiltered NLG_CUBE) → list of **master + slave IDs**. | ||
| 91 | 3. The resulting table — (% style="font-family:monospace" %)NLG_Table(%%) — is processed two ways: | ||
| 92 | |||
| 93 | ==== to_update ==== | ||
| 94 | |||
| 95 | * **Projekt-IDs** from SharePoint list compared with Projekt-IDs in (% style="font-family:monospace" %)NLG_Table(%%) using **Inner Join** → only Projekt-IDs **already existing** in the SharePoint list. | ||
| 96 | * **Unpivot all date columns** in both tables. | ||
| 97 | * All **date columns** in both (% style="font-family:monospace" %)NLG_Table(%%) and (% style="font-family:monospace" %)RAN_Overview_list(%%) **dynamically converted to whole numbers**. | ||
| 98 | * All columns in both tables converted to **text format** and merged with **(% style="font-family:monospace" %)$(%%)** as separator. | ||
| 99 | * Merged column converted into a **Binary Key** in a custom column. | ||
| 100 | * Compare binary keys for every Projekt-ID: | ||
| 101 | ** (% style="font-family:monospace" %)NLG_table[PID] = List[PID] AND NLG_Table[Key] <> List[Key](%%) | ||
| 102 | * Result: list of Projekt-IDs from NLG_CUBE with **different data** vs RAN Overview list. | ||
| 103 | * Another **Inner Join** with the original NLG_Table → retrieve full rows. | ||
| 104 | |||
| 105 | ==== to_import ==== | ||
| 106 | |||
| 107 | * Projekt-IDs from NLG_Table and RAN Overview list compared using **Left Anti Join** → only rows present in NLG_Table **without a match** in RAN Overview list. | ||
| 108 | |||
| 109 | {{warning}} | ||
| 110 | **Limitation in Power Automate:** Power Automate parses **blank dates as a string**. **Workaround:** replace all blank dates in (% style="font-family:monospace" %)NLG_Table(%%) with a **dummy date** — **(% style="font-family:monospace" %)01.01.1990(%%)** is used. | ||
| 111 | {{/warning}} | ||
| 112 | |||
| 113 | === Workbook structure === | ||
| 114 | |||
| 115 | Same pattern as UTS: two Excel files (one update, one import), **only one sheet per workbook**, table name **(% style="font-family:monospace" %)Table_external1(%%)**. Office Script saved in BI Community → Admin channel → OfficeScripts: | ||
| 116 | |||
| 117 | {{code language="javascript"}} | ||
| 118 | function main(workbook: ExcelScript.Workbook) { | ||
| 119 | const sheet = workbook.getFirstWorksheet(); | ||
| 120 | workbook.refreshAllDataConnections(); | ||
| 121 | } | ||
| 122 | {{/code}} | ||
| 123 | |||
| 124 | == Operations and Maintenance == | ||
| 125 | |||
| 126 | Any major change in the automation process requires a **4-step procedure**: | ||
| 127 | |||
| 128 | === 1. Make changes in the delta dataflow === | ||
| 129 | |||
| 130 | If the change request is to **include a new column** in the list: | ||
| 131 | |||
| 132 | * Create the item in the SharePoint list. | ||
| 133 | * Edit the delta dataflow → go to the (% style="font-family:monospace" %)RAN_Overview_list(%%) table. | ||
| 134 | * Include the new column in the **Choose columns** step. | ||
| 135 | * If new column is of **date type**: **convert** in the //Calculated date// step (use //Date only// option from **Transform → Date**, NOT change of data type to date). | ||
| 136 | * In (% style="font-family:monospace" %)NLG_table(%%): include the new column in **Choose columns**. If date type — blank rows will be dynamically replaced with the dummy date in **Replaced value** step (no extra action needed). | ||
| 137 | * If new column **is** of date type → can skip the next steps. | ||
| 138 | * Save, close, refresh the dataflow → go to **Step 2**. | ||
| 139 | |||
| 140 | If new column is **NOT date** type: | ||
| 141 | |||
| 142 | * Go to (% style="font-family:monospace" %)delta_list(%%) table → include the column name (from (% style="font-family:monospace" %)RAN_Overview_list(%%)) in the **Unpivoted other columns** step expression window. | ||
| 143 | * In **Inserted merged column** step: merge all non-date columns with (% style="font-family:monospace" %)$(%%) separator. **Add new column name in the expression window**, just before **Attribute**. | ||
| 144 | |||
| 145 | {{warning}} | ||
| 146 | **Column-order critical:** The order of columns in the **Merge** expression is crucial. Keep the **same order** in (% style="font-family:monospace" %)to_update(%%) table merge step too. | ||
| 147 | {{/warning}} | ||
| 148 | |||
| 149 | * In (% style="font-family:monospace" %)to_update(%%) table: add the column name (from (% style="font-family:monospace" %)NLG_Table(%%)) in **Unpivoted other columns** + in **Inserted merged column** step (same order). | ||
| 150 | * Save, close, refresh. | ||
| 151 | |||
| 152 | === 2. Change the Power BI dataset (re-publish) === | ||
| 153 | |||
| 154 | * **Download the pbix** of the helper PBI report. | ||
| 155 | * Open it, **refresh the tables**, **publish** again. | ||
| 156 | |||
| 157 | === 3. Delete and re-create the sheet in helper Excel workbooks === | ||
| 158 | |||
| 159 | * Go to **BI Admin SharePoint → Files → powerbi_export_automate_list**. | ||
| 160 | * Open (% style="font-family:monospace" %)RAN_Overview_list_update.xlsx(%%) and (% style="font-family:monospace" %)RAN_Overview_list_import.xlsx(%%) separately. | ||
| 161 | * Delete the sheet (% style="font-family:monospace" %)„RANOverviewlistdeltarepor"(%%). | ||
| 162 | * Click **Data → Get Data → Power Platform → From Power BI (SPL TELE)**. | ||
| 163 | * In the panel on the right, search for **RAN_Overview**. | ||
| 164 | * Choose **to_import** or **to_update** by clicking on **Insert Table**. Select all columns. | ||
| 165 | * New sheet (% style="font-family:monospace" %)„RANOverviewlistdeltarepor"(%%) appears. **Keep only this sheet** — delete any other worksheet. | ||
| 166 | * Save and close. | ||
| 167 | |||
| 168 | === 4. Change the Power Automate flow === | ||
| 169 | |||
| 170 | Three places to make changes: | ||
| 171 | |||
| 172 | 1. **„List rows present in a table — copy"** step → select the **Table name** from the list. | ||
| 173 | 2. **„Update item"** step → choose the **new column** to be mapped (via **Advanced parameters**). Map the new field to the corresponding column from Excel. | ||
| 174 | 3. **„List rows present in a table"** step → select Table from dropdown. **„Create item"** step → do the mapping. | ||
| 175 | |||
| 176 | {{info}} | ||
| 177 | The same procedure applies **for removing a column** too. **Always keep a backup copy** of the flow before making changes. | ||
| 178 | {{/info}} | ||
| 179 | |||
| 180 | === Additional requirements === | ||
| 181 | |||
| 182 | * **Folders** to be created in the **Documents** folder in **ABISoIP SharePoint** for **every combination of Projekt-ID_SiteID** from the list. | ||
| 183 | * Each folder should contain **4 subfolders** as specified. | ||
| 184 | * **(% style="font-family:monospace" %)SP_Documentation(%%) field** to be updated with the **link to the master folder**. | ||
| 185 | * **Import-Logik-Section** has been modified accordingly. | ||
| 186 | |||
| 187 | == Change log == | ||
| 188 | |||
| 189 | |=Date|=Description | ||
| 190 | |**20 Feb 2024**|A new step added in the Power Automate flow to have a **failure notification email** | ||
| 191 | |**29 Mar 2024**|Flow modified to include the steps to have **folders and subfolders created** in SharePoint based on (% style="font-family:monospace" %)Projekt-ID_SiteID(%%) | ||
| 192 | |**04 Apr 2024**|Flow modified to **update the links** in (% style="font-family:monospace" %)SP_Documentation(%%) field with the folder link | ||
| 193 | |**19 Jun 2024**|**Site Summary Update** and **Health Check Report** flows changed — added the column //Prog// | ||
| 194 | |||
| 195 | == Related pages == | ||
| 196 | |||
| 197 | * [[Power Automate Flows (Hub)>>doc:IT-Wiki.01-Data.Exchange-und-Movement.Schnittstellen.WebHome]] | ||
| 198 | * [[UTS Integration Rejection — Excel to SharePoint List>>doc:IT-Wiki.01-Data.Exchange-und-Movement.Schnittstellen.UTS_Integration_Rejection_ExceltoSharePointList.WebHome]] — same Pattern fuer UTS-Rejections | ||
| 199 | |||
| 200 | ---- | ||
| 201 | |||
| 202 | == Verwandte Themen == | ||
| 203 | |||
| 204 | //Kuratiert — kann direkt im Editor ergänzt werden:// | ||
| 205 | |||
| 206 | * [[UTS Integration Rejection — Excel to SharePoint List>>doc:IT-Wiki.01-Data.Exchange-und-Movement.Schnittstellen.UTS_Integration_Rejection_ExceltoSharePointList.WebHome]] | ||
| 207 | |||
| 208 | {{include reference="IT-Wiki.Makros.Verwandte-Themen.WebHome"/}} | ||
| 209 | |||
| 210 | ---- | ||
| 211 | **Status:** Migriert — Team-Review ausstehend · **Owner:** //(festlegen)// · **Letzter Review:** 2026-06-11 |