# Message Catalog Usages

LLMS index: [llms.txt](/llms.txt)

---

<div id="pslens-context-panel" class="card border-info mb-4 d-none">
  <div class="card-header bg-light text-info py-2 fw-bold d-flex align-items-center border-bottom border-info-subtle">
    <i class="bi bi-info-circle-fill me-2"></i>
    <span>Tailored Operational Context</span>
  </div>
  <div class="card-body p-0">
    <ul class="list-group list-group-flush">
      <li id="row-db" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Target Database:</strong>
        <span id="ctx-db" class="badge bg-secondary font-monospace">&mdash;</span>
      </li>
      <li id="row-type" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Context Type:</strong>
        <span id="ctx-type" class="badge bg-light text-dark border font-monospace text-uppercase">&mdash;</span>
      </li>
      <li id="row-severity" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Alert Severity:</strong>
        <span id="ctx-severity" class="badge">&mdash;</span>
      </li>
      <li id="row-time" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Triggered Time:</strong>
        <span id="ctx-time" class="text-muted small">&mdash;</span>
      </li>
      <li id="row-details" class="list-group-item py-2 d-none">
        <strong id="label-details" class="d-block mb-1">Firing Context:</strong>
        <code id="ctx-details" class="d-block p-2 bg-light border rounded small" style="white-space: pre-wrap; word-break: break-all;">&mdash;</code>
      </li>
    </ul>
  </div>
</div>

<script>
  (function() {
    const params = new URLSearchParams(window.location.search);
    const metadata = params.get('metadata');
    if (!metadata) return;

    try {
      
      const base64 = metadata.replace(/-/g, '+').replace(/_/g, '/');
      const jsonStr = decodeURIComponent(escape(window.atob(base64)));
      const data = JSON.parse(jsonStr);

      if (data) {
        let hasData = false;

        if (data.db) {
          document.getElementById('ctx-db').textContent = data.db;
          document.getElementById('row-db').classList.remove('d-none');
          hasData = true;
        }

        if (data.type) {
          document.getElementById('ctx-type').textContent = data.type;
          document.getElementById('row-type').classList.remove('d-none');
          hasData = true;
        }

        if (data.severity) {
          const severityBadge = document.getElementById('ctx-severity');
          const severity = data.severity.toLowerCase();
          severityBadge.textContent = severity.toUpperCase();
          if (severity === 'critical') {
            severityBadge.className = 'badge bg-danger';
          } else if (severity === 'warning') {
            severityBadge.className = 'badge bg-warning text-dark';
          } else {
            severityBadge.className = 'badge bg-info';
          }
          document.getElementById('row-severity').classList.remove('d-none');
          hasData = true;
        }

        if (data.t) {
          const date = new Date(data.t * 1000);
          document.getElementById('ctx-time').textContent = date.toLocaleString();
          document.getElementById('row-time').classList.remove('d-none');
          hasData = true;
        }

        if (data.details) {
          document.getElementById('ctx-details').textContent = data.details;

          
          const labelDetails = document.getElementById('label-details');
          if (data.type === 'object') {
            labelDetails.textContent = 'Object Metadata Details:';
          } else if (data.type === 'report') {
            labelDetails.textContent = 'Report Description:';
          } else {
            labelDetails.textContent = 'Firing Context:';
          }

          document.getElementById('row-details').classList.remove('d-none');
          hasData = true;
        }

        if (hasData) {
          document.getElementById('pslens-context-panel').classList.remove('d-none');
        }
      }
    } catch (e) {
      console.error('Failed to parse operational context metadata:', e);
    }
  })();
</script>


## Message Catalog Usages Report

**Report ID:** `msgcat-usages`
**Category:** Objects / Development

## Purpose

This report searches the entire PeopleSoft database and codebase to locate every usage of a specific Message Catalog entry. It answers the question: "If I modify or delete this message set or number, what fields, pages, or PeopleCode programs will be affected?"

Use this when someone hands you a `(10, 12)` error code, or when you want to know if anything still references a message before you delete it.

---

## What Gets Searched

The report dynamically discovers and queries all tables that store message reference columns (`MESSAGE_SET_NBR` and `MESSAGE_NBR`), as well as the PeopleCode codebase.

1. **Whitelisted Tables:**
   The report automatically queries all whitelisted database tables containing both message columns. The most common UI placement searched is:
   - **`PSPNLFIELD` (Page Fields):** Finds where message catalogs are assigned as static labels or tooltips on page controls.

2. **PeopleCode Source (`PSPCMTXT`):**
   Searches the actual text of all compiled PeopleCode programs for function calls that fetch catalog messages. This includes:
   - `MsgGet(...)`
   - `MsgGetText(...)`
   - `MsgGetExplainText(...)`

3. **Non-Whitelisted Tables:**
   Discovers any other database tables in the system that match the column criteria but are not currently in the SWS whitelisting table. The report generates a custom SQL snippet for each of these so developers can query them manually.

---

## Report Output

The generated markdown report contains:

- **Summary Table:** A overview of the tables searched, indicating which ones are whitelisted/accessible and the count of matches found in each.
- **Detailed Findings:** Individual tables showing the key identifiers of matching objects, accompanied by deep links back to their respective psLens detail pages.
- **PeopleCode References:** A detailed table listing the PeopleCode program type, record/package name, event, and field where the `MsgGet` call was found.
- **Manual Query Snippets:** Ready-to-copy SQL queries for non-whitelisted tables.

---

## Parameters

|     Parameter     | Required |  Type   |                                                         Description                                                         |
| ----------------- | -------- | ------- | --------------------------------------------------------------------------------------------------------------------------- |
| `message_set_nbr` | Yes      | Integer | The Message Set number to search for (e.g., `10` or `20000`).                                                               |
| `message_nbr`     | No       | Integer | The specific Message number. If omitted, the report returns *all* usages across every message in the specified Message Set. |

---

## Use Cases

1. **Impact Analysis:** Before updating a delivered or custom message text, run this report to ensure the change is appropriate for all context areas where it is displayed.
2. **Error Debugging:** If an application log or user screenshot displays an error message ID (e.g., `(10, 12)`), run the report with `message_set_nbr = 10` and `message_nbr = 12` to instantly locate the exact line of PeopleCode emitting the error.
3. **Audit and Cleanup:** Scan custom message sets (e.g., set numbers > 20000) to find orphan messages that are no longer referenced anywhere in code or page labels.
