Table of Contents

FLOW-GLB-001 — Creazione di un oggetto censito (MObject) — Global

Flusso end-to-end di creazione di un MObject (oggetto censito/manutentivo, riga di GLOBAL_OBJECTS) del dominio Global — i servizi/manager trasversali di Infocad. Path pilota: scheda MObjectDetails.ascx (GlobalWeb, shell CASSANDRA). Backend Oracle INFOCAD_TEST38, accesso via stored procedure RPS_ADDMOBJECT chiamata da DAO_MObject esposto in .NET Remoting dal servizio Windows InfocadServer (nessun ORM).

  • Flow ID: FLOW-GLB-001
  • Repository: InfocadWeb (ASP.NET Web Forms, VB.NET, WebMachine/CASSANDRA/GlobalWeb) + InfocadServer (GlobalControllers/GlobalManager, VB.NET, servizio Windows + .NET Remoting)
  • Confidence complessiva: VERIFIED (catena UI → code-behind → controller → proxy remoting → DAO → stored procedure → tabelle, confermata su codice E su sorgente/dizionario DB) · SUPPORTED (path alternativi bulk-loader e trigger secondari)

Nota di dominio (trasversalità)

Il dominio Global è in gran parte infrastruttura trasversale (tenancy, login settings, code-configuration, spooler, colonne griglia, audit): molte tabelle GLOBAL_* sono scritte da altri domini tramite manager condivisi (es. GLOBAL_TENANCY_BINDINGS è scritta da PRP_MANAGEENTITY nel flusso Property — vedi FLOW-PROP-001) e non hanno un unico entry-point UI. Esiste però un'entità di dominio con path di scrittura autonomo e completo: l'MObject (oggetto censito in GLOBAL_OBJECTS), con scheda dedicata in GlobalWeb — è l'operazione rappresentativa documentata qui (has_standalone_write = true).

Obiettivo di business

Consentire a un operatore di censire un nuovo oggetto (asset manutentivo/censito: impianto, componente, attrezzatura…) nell'albero degli oggetti, con categoria (GLOBAL_CATEGORIES), padre gerarchico, posizione spaziale (comprensorio/edificio/piano/vano), stato di lavoro iniziale e assegnazione al tenant corrente. Al termine l'oggetto esiste in GLOBAL_OBJECTS, ha una riga di storia stato in GLOBAL_OM_WS_HISTORY, il binding tenant in GLOBAL_TENANCY_OBJECTS e la riga gemella in GLOBAL_OBJECTS_DATA (trigger).

Attori

  • Operatore censimento/manutenzione (utente autenticato con grant 1320 o super-admin) — path interattivo scheda MObjectDetails.ascx.
  • Import massivoBulkLoaderManager.MObjectBulkLoader (InfocadServer) chiama in-process lo stesso DAO_MObject.Insert (stessa stored procedure).
  • Servizio Windows InfocadServer — host .NET Remoting del DAO (Business/Start.vb).
  • Oracle INFOCAD_TEST38 — procedure RPS_ADDMOBJECT, RPS_UPDATEMOBJECTSSTATUS, RPS_SETMOBJECTTENANTS; trigger su GLOBAL_OBJECTS.

Trigger

Click sul pulsante Salva/Aggiorna della scheda oggetto: evento btnUpdate.Click gestito da btnUpdate_Click in MObjectDetails.ascx.vb:131 (o btnConfirmUpdate_Click:135), che invoca UpdateOI() (:139).

Frontend entry point

  • Pagine: GlobalWeb/Objects_Tree.aspx (albero oggetti, :233) e Objects_Functional.aspx (:208), più la finestra UserControls/MObject/MObjectEdit.aspx (:110).
  • Control vista: GlobalWeb/UserControls/MObject/MObjectView.ascx (tab scheda/posizioni/storia, registra MObjectDetails a riga :3,86).
  • Control scheda: GlobalWeb/UserControls/MObject/MObjectDetails.ascx (code-behind MObjectDetails.ascx.vb, eredita Descor.GlobalWeb.Extensions.DetailBase).
  • Gate di accesso: pulsante Salva visibile solo con HasUserGrant("1320") o WS.SessionProfile.SuperAdmin (MObjectDetails.ascx.vb:396 per update, :403 per new).

Sequenza principale (main sequence)

  1. Operatore apre l'albero oggetti (Objects_Tree.aspx), seleziona/crea un oggetto: la vista MObjectView imposta MObjectDetails1.ID_DTO = FilterID (MObjectView.ascx.vb:335); ID_DTO = 0creazione.
  2. Compila nome, descrizione, stato, posizione e preme Salva: btnUpdate_Click (:131) → UpdateOI() (:139).
  3. UpdateOI verifica l'unicità del codice/nome nel tenant corrente: ctrl.GetMObjectByCodeAndTnt(TxtName.Text, WS.CurrentTenant.ID_DTO) (:141) — se esiste già un oggetto diverso con quel nome, warning MObjectAlreadyExistMessage (:178) e nessuna scrittura.
  4. Costruisce il DTO MObject via InstantiateDto() (:206-220: Name, Description, ID_Category = _idCat, ID_Father = _idfather, ID_Tenancy = WS.CurrentTenant.ID_DTO, posizioni dal MObjectPosition) e lo valida: oi.Validate() (:153) — se invalido, mostra oi.Error ed esce.
  5. Ramo create: ID_DTO = ctrl.Insert(WS.SessionLogin.UserName, oi) (:161) su MObjectController (campo ctrl, :10). (Ramo update: ctrl.Update :164 + ctrl.SetMObjectStatus :168 se lo stato è cambiato.)
  6. MObjectController.Insert (GlobalControllers/MObjectController.vb:21-23) inoltra a Me.DAO, che è un proxy .NET Remoting: Ctrl_Base.DaoActivate (serv/Ctrl_Base.vb:16-18) → DAOFactory.CreateDAO(Ctrl_MObject) (serv/DAOFactory.vb:34-35) → Activator.GetObject(IDAO_MObject, CHANNEL://SERVERADDRESS/DAO_Objects.rem) (ServicesDictionary.resx: Service_Objects = DAO_Objects.rem).
  7. Lato server, il servizio Windows InfocadServer espone il DAO: RemotingConfiguration.RegisterWellKnownServiceType(DAO_MObject, "DAO_Objects.rem", SingleCall) (Business/Start.vb:342).
  8. DAO_MObject.Insert (GlobalManager/DAO/DAO_MObject.vb:73-126): valida ID_Category > 0 (:77), apre DataLayer(My.Settings.ConnectionName) (:75), aggiunge gli OracleParameter (PUSERNAME, PIDFATHER, PIDCATEGORY, PNAME, PDESCRIPTION, PWORKINGSTATUS, PPROPAGATEWS, posizioni PIDPOS*, PFORCEDPOSITION, PISCAT, OUT PIDOBJ; :79-113) ed esegue RPS_ADDMOBJECT (ExecuteNonQueryStoredProcedure, :115); legge il nuovo id da PIDOBJ (:116).
  9. Oracle RPS_ADDMOBJECT (INFOCAD_TEST38, PROCEDURE VALID; sorgente da USER_SOURCE):
    • default WORKING_STATUS = 1 se nullo/0; normalizza le posizioni;
    • se PIDFATHER è nullo/0 risolve il padre di categoria via RPS_GETMOBJECTFATHER;
    • INSERT INTO GLOBAL_OBJECTS (ID_FATHER, ID_CATEGORY, NAME, DESCRIPTION, WORKING_STATUS, PROPAGATE_WS, ID_POS_C, ID_POS_E, ID_POS_P, ID_POS_V, FORCED_POSITION, ISCAT) VALUES (...) RETURNING ID_OBJ INTO PIDOBJ;
    • chiama RPS_UPDATEMOBJECTSSTATUS(PUSERNAME, {PIDOBJ}, tmpWS, '-----'), che aggiorna GLOBAL_OBJECTS.WORKING_STATUS, chiude la riga aperta e inserisce la nuova riga in GLOBAL_OM_WS_HISTORY (join GLOBAL_CATEGORIES), poi MNT_ARCHIVEWORKORDER_BY_OIWS.
  10. Trigger di INSERT su GLOBAL_OBJECTS (da USER_TRIGGERS, tutti ENABLED):
    • CNT_GLOBAL_OBJECTS (BEFORE): assegna ID_OBJ = SEQ_GLOBAL_OBJECTS.NEXTVAL se NULL;
    • GLOBAL_OBJECTS_INSERT (BEFORE): se NAME vuoto genera il codice TRIM(SUBSTR(prefix,0,3)) || '-' || progressivo || '-' || max_id+1 dal prefisso GLOBAL_CATEGORIES.ID_LINK/NAME;
    • ADD_GLOBAL_OBJECT_DATA (AFTER): INSERT INTO GLOBAL_OBJECTS_DATA (ID_O, ID_F).
  11. Rientrati nel DAO: se om.ID_Tenancy > 0, SetMObjectTenancies(idMo, {ID_Tenancy}) (DAO_MObject.vb:118-119:2250-2270) esegue RPS_SETMOBJECTTENANTS (array PL/SQL PTENANTIDS), che naviga gli antenati (CONNECT BY PRIOR ID_FATHER = ID_OBJ), fa DELETE dei binding correnti dell'oggetto e INSERT INTO GLOBAL_TENANCY_OBJECTS (ID_OBJ, ID_TENANCY, CODICE) per oggetto e antenati non ancora assegnati.
  12. Il nuovo id risale via remoting al controller e alla scheda (ID_DTO = ..., :161); Action = "EDIT" e RaiseEditDone(Me, oi) (:173-174) notificano MObjectView (MObjectView.ascx.vb:343) che rinfresca vista e albero.

API / service

  • Path interattivo: nessun servizio SOAP/WCF — postback ASP.NET Web Forms sulla scheda; la distribuzione web↔server avviene via .NET Remoting (DAO_Objects.rem, well-known SingleCall).
  • Path programmatico: import massivo BulkLoaderManager.MObjectBulkLoader (MObjectBulkLoader.vb:201,375) — istanzia DAO_MObject in-process nel tier server e chiama lo stesso Insert (stessa RPS_ADDMOBJECT).

Backend

  • UI/Code-behind: MObjectDetails.ascx.vb (scheda), MObjectView.ascx.vb (vista/tab), Objects_Tree.aspx.vb (pagina albero).
  • Controller client: Descor.Global.GlobalControllers.MObjectController (InfocadServer/GlobalControllers/MObjectController.vb) — wrapper 1:1 su IDAO_MObject.
  • Fabbrica proxy: Ctrl_Base.DaoActivateDAOFactory.CreateDAO (serv/DAOFactory.vb) — Activator.GetObject verso il servizio remoto (nessuna BL intermedia per questo dominio: il Controller inoltra direttamente al DAO remoto).
  • Host: servizio Windows InfocadServer, Business/Start.vb:342 (well-known DAO_Objects.rem).
  • DAO: GlobalManager.DAO.DAO_MObject (InfocadServer/GlobalManager/DAO/DAO_MObject.vb).
  • Pattern DAL: Using dl As New DataLayer(My.Settings.ConnectionName)dl.Parameters.Add(OracleParameter...)dl.ExecuteNonQueryStoredProcedure("RPS_ADDMOBJECT"); identity di ritorno via parametro OUT PIDOBJ (OracleDecimal); array PL/SQL associativo per i tenant (OracleCollectionType.PLSQLAssociativeArray, :2255).

Query / stored procedure

Passo Stored procedure (Oracle) Chiamata da (DAL)
Insert oggetto (GLOBAL_OBJECTS, RETURNING ID_OBJ) INFOCAD_TEST38.RPS_ADDMOBJECT (OUT PIDOBJ) DAO_MObject.vb:115
Risoluzione padre di categoria (se PIDFATHER nullo) INFOCAD_TEST38.RPS_GETMOBJECTFATHER RPS_ADDMOBJECT (src + USER_DEPENDENCIES)
Stato iniziale + storia stato INFOCAD_TEST38.RPS_UPDATEMOBJECTSSTATUS RPS_ADDMOBJECT (src)
Binding tenant oggetto+antenati INFOCAD_TEST38.RPS_SETMOBJECTTENANTS DAO_MObject.vb:2264 (via :118-119)
Check duplicato nome/tenant (READ-ONLY, pre-save) INFOCAD_TEST38.RPS_GETMOBJECTBYCODEANDTNT DAO_MObject.vb:2283 (UI :141)
Update oggetto (ramo alternativo della stessa scheda) INFOCAD_TEST38.RPS_UPDATEMOBJECT DAO_MObject.vb:244 (UI :164)

Tabelle lette (read)

  • INFOCAD_TEST38: GLOBAL_OBJECTS (check duplicato + CONNECT BY antenati in RPS_SETMOBJECTTENANTS), GLOBAL_CATEGORIES (prefisso codice nel trigger; nome categoria nella storia stato), GLOBAL_TENANCY_OBJECTS (esistenza binding), sequence SEQ_GLOBAL_OBJECTS.

(da USER_DEPENDENCIES di RPS_ADDMOBJECT/RPS_SETMOBJECTTENANTS/RPS_UPDATEMOBJECTSSTATUS e dai sorgenti USER_SOURCE/USER_TRIGGERS)

Tabelle modificate (write)

  • INFOCAD_TEST38: GLOBAL_OBJECTS (INSERT con RETURNING ID_OBJ; poi UPDATE di WORKING_STATUS da RPS_UPDATEMOBJECTSSTATUS — VERIFIED su USER_SOURCE + USER_DEPENDENCIES), GLOBAL_OM_WS_HISTORY (UPDATE chiusura riga + INSERT nuova riga di storia stato — VERIFIED), GLOBAL_TENANCY_OBJECTS (DELETE + INSERT binding tenant per oggetto e antenati — VERIFIED), GLOBAL_OBJECTS_DATA (INSERT dal trigger ADD_GLOBAL_OBJECT_DATA — VERIFIED su trigger body).
  • Effetto indiretto: MNT_ARCHIVEWORKORDER_BY_OIWS (chiamata in coda a RPS_UPDATEMOBJECTSSTATUS) può archiviare ODL se lo stato applicato è di dismissione — SUPPORTED (non ispezionata riga per riga).

Validazione

  • Lato UI: unicità nome nel tenant (GetMObjectByCodeAndTnt, MObjectDetails.ascx.vb:141-147; warning :178); validazione DTO oi.Validate() con messaggio oi.Error (:153-158); visibilità Salva solo con grant 1320/super-admin (:396,403).
  • Lato DAO: ID_Category <= 0DAOException("Object Category can't be null") (DAO_MObject.vb:77; sul ramo update anche nome vuoto, :204-205).
  • Lato DB: default stato (tmpWS := 1), risoluzione padre, generazione codice se NAME vuoto (trigger GLOBAL_OBJECTS_INSERT); CNT_GLOBAL_OBJECTS impedisce il cambio di ID_OBJ in UPDATE (raise_application_error(-20000)).

Side effects

  • Assegnazione ID_OBJ da SEQ_GLOBAL_OBJECTS e auto-generazione del codice oggetto (trigger BEFORE INSERT).
  • Riga di storia stato in GLOBAL_OM_WS_HISTORY con USERNAME/NOTE='-----'/STARTDATE=SYSDATE.
  • Propagazione del binding tenant anche agli antenati dell'oggetto (RPS_SETMOBJECTTENANTS, CONNECT BY NOCYCLE).
  • Riga gemella in GLOBAL_OBJECTS_DATA (trigger AFTER INSERT).
  • Possibile archiviazione ODL collegati (MNT_ARCHIVEWORKORDER_BY_OIWS) se stato di dismissione.
  • Evento UI RaiseEditDone → refresh vista/albero (MObjectView.ascx.vb:343).

Percorsi alternativi / di errore

  • Update della stessa scheda: ID_DTO > 0ctrl.Update (:164) → RPS_UPDATEMOBJECT (DAO_MObject.vb:244); se lo stato è cambiato anche SetMObjectStatus (:166-169) → RPS_UPDATEMOBJECTSSTATUS (DAO_MObject.vb:305).
  • Import massivo: MObjectBulkLoader (InfocadServer) → DAO_MObject.Insert in-process (MObjectBulkLoader.vb:375) — stessa RPS_ADDMOBJECT, username "System" (overload Insert(dto), DAO_MObject.vb:69-71).
  • Nome duplicato nel tenant → nessuna scrittura, warning (:178).
  • DTO invalidooi.Error in divError, nessuna chiamata al controller (:153-158).
  • Eccezione DB/remoting → il DAO logga (ExceptionLogger.LogException, :128) e rilancia; la scheda mostra ex.Message (:181-185).
  • Cancellazione (controprova non distruttiva): RPS_DELETEOBJECT / restore RPS_RESTOREOBJECT (DAO_MObject.vb:318,2015).

Diagramma di sequenza

sequenceDiagram
    actor Op as Operatore censimento
    participant UI as Objects_Tree.aspx > MObjectView.ascx
    participant CB as MObjectDetails.ascx.vb (UpdateOI)
    participant MC as MObjectController (GlobalControllers)
    participant RP as Proxy .NET Remoting (DAO_Objects.rem)
    participant DAO as DAO_MObject (servizio InfocadServer)
    participant DB as Oracle INFOCAD_TEST38

    Op->>UI: compila scheda + click Salva
    UI->>CB: btnUpdate_Click -> UpdateOI()
    CB->>MC: GetMObjectByCodeAndTnt (check duplicato)
    CB->>CB: InstantiateDto + oi.Validate()
    CB->>MC: Insert(username, MObject)   [ID_DTO = 0]
    MC->>RP: IDAO_MObject.Insert (Activator.GetObject)
    RP->>DAO: Insert(username, om)
    DAO->>DB: RPS_ADDMOBJECT(PUSERNAME, PIDCATEGORY, ..., OUT PIDOBJ)
    DB->>DB: trigger CNT_GLOBAL_OBJECTS (SEQ_GLOBAL_OBJECTS)
    DB->>DB: INSERT GLOBAL_OBJECTS RETURNING ID_OBJ
    DB->>DB: trigger ADD_GLOBAL_OBJECT_DATA -> GLOBAL_OBJECTS_DATA
    DB->>DB: RPS_UPDATEMOBJECTSSTATUS -> GLOBAL_OM_WS_HISTORY
    DAO->>DB: RPS_SETMOBJECTTENANTS(PIDOBJ, {ID_Tenancy})
    DB->>DB: DELETE+INSERT GLOBAL_TENANCY_OBJECTS (oggetto+antenati)
    DAO-->>MC: nuovo ID_OBJ
    MC-->>CB: ID_DTO = id
    CB-->>UI: RaiseEditDone -> refresh vista/albero

Matrice di tracciabilità

Layer Artefatto Evidenza (file:riga)
UI (pagine) Objects_Tree.aspx / Objects_Functional.aspx / MObjectEdit.aspx Objects_Tree.aspx:6,233; Objects_Functional.aspx:6,208; MObjectEdit.aspx:4,110
UI (vista) MObjectView.ascx registra/collega la scheda MObjectView.ascx:3,86; MObjectView.ascx.vb:335,343
Code-behind btnUpdate_ClickUpdateOIctrl.Insert MObjectDetails.ascx.vb:131,139,141,153,161
Controller MObjectController.InsertMe.DAO GlobalControllers/MObjectController.vb:18,21-23
Proxy remoting DAOFactory.CreateDAO(Ctrl_MObject)DAO_Objects.rem GlobalControllers/serv/DAOFactory.vb:34-35; serv/Ctrl_Base.vb:16-18; serv/ServicesDictionary.resx (Service_Objects)
Host remoting RegisterWellKnownServiceType(DAO_MObject, "DAO_Objects.rem") InfocadServer/Business/Start.vb:342
DAO DAO_MObject.InsertRPS_ADDMOBJECT + SetMObjectTenancies GlobalManager/DAO/DAO_MObject.vb:73,77,115-119,2250-2264
DB (SP) RPS_ADDMOBJECT: INSERT GLOBAL_OBJECTS RETURNING USER_SOURCE RPS_ADDMOBJECT; USER_DEPENDENCIESGLOBAL_OBJECTS, RPS_GETMOBJECTFATHER, RPS_UPDATEMOBJECTSSTATUS
DB (SP) RPS_UPDATEMOBJECTSSTATUS: UPDATE GLOBAL_OBJECTS + GLOBAL_OM_WS_HISTORY USER_SOURCE; deps → GLOBAL_OM_WS_HISTORY, GLOBAL_CATEGORIES, MNT_ARCHIVEWORKORDER_BY_OIWS
DB (SP) RPS_SETMOBJECTTENANTS: DELETE+INSERT GLOBAL_TENANCY_OBJECTS USER_SOURCE; deps → GLOBAL_OBJECTS, GLOBAL_TENANCY_OBJECTS
DB (trigger) CNT_GLOBAL_OBJECTS, GLOBAL_OBJECTS_INSERT, ADD_GLOBAL_OBJECT_DATA USER_TRIGGERS su GLOBAL_OBJECTS (tutti ENABLED, body letti)

Reverse trace (dal DB ai chiamanti)

  • RPS_ADDMOBJECT ha un solo call-site in entrambi i repo: DAO_MObject.vb:115 (grep su InfocadServer+InfocadWeb, esclusi bin/obj).
  • DAO_MObject.Insert è raggiunto da: MObjectController.Insert (via remoting, unico wrapper controller, MObjectController.vb:23) e in-process da BulkLoaderManager.MObjectBulkLoader (MObjectBulkLoader.vb:201,375, overload Insert(dto) con username "System").
  • MObjectController.Insert in InfocadWeb è chiamato dalla sola scheda MObjectDetails.ascx.vb:161 (gli altri ~30 file web che usano MObjectController fanno letture o update/stati, non insert).
  • Forward e reverse concordano (scheda → controller → remoting → DAO_MObject.InsertRPS_ADDMOBJECTGLOBAL_OBJECTS) → NO CONFLICTING.
  • Multi-tenant per-oggetto: il binding non usa GLOBAL_TENANCY_BINDINGS (che è il binding generico delle entità Property) ma la tabella dedicata GLOBAL_TENANCY_OBJECTS, con propagazione verso gli antenati dell'albero oggetti.
  • Identity da trigger: ID_OBJ è assegnato da CNT_GLOBAL_OBJECTS via SEQ_GLOBAL_OBJECTS (colonna non-identity, USER_TAB_COLUMNS), pattern contatore comune alle tabelle Infocad.
  • Codice auto-generato: se NAME è vuoto il trigger GLOBAL_OBJECTS_INSERT genera PREFIX-progressivo-id dal prefisso categoria (GLOBAL_CATEGORIES.ID_LINK).
  • Storia stato obbligatoria: ogni insert/cambio stato passa da RPS_UPDATEMOBJECTSSTATUS (riga sempre presente in GLOBAL_OM_WS_HISTORY, chiusura della precedente con ENDDATE).
  • Nessuna BL dedicata: nel dominio Global il Controller inoltra direttamente al DAO remoto (pattern Ctrl_EntityBase/DAOFactory), a differenza dei domini con <Domain>BL.

Evidenza (file:line)

Punti chiave (codice): MObjectDetails.ascx.vb:10,131,135,139,141,147,153,161,164,168,173-174,178,206-220,396,403; MObjectView.ascx:3,86; MObjectView.ascx.vb:335,343; Objects_Tree.aspx:6,233; MObjectController.vb:18,21-23; serv/Ctrl_Base.vb:16-18; serv/DAOFactory.vb:34-35; serv/ServicesDictionary.resx (Service_Objects=DAO_Objects.rem); Business/Start.vb:342; DAO_MObject.vb:69-71,73,75,77,79-113,115-119,2250-2264,2283; MObjectBulkLoader.vb:201,375.

Punti chiave (DB, INFOCAD_TEST38, sola lettura via USER_OBJECTS/USER_SOURCE/ USER_DEPENDENCIES/USER_TRIGGERS/USER_TAB_COLUMNS): RPS_ADDMOBJECT PROCEDURE VALID, deps → GLOBAL_OBJECTS (TABLE), RPS_GETMOBJECTFATHER, RPS_UPDATEMOBJECTSSTATUS; sorgente con INSERT INTO GLOBAL_OBJECTS ... RETURNING ID_OBJ INTO PIDOBJ. RPS_SETMOBJECTTENANTS deps → GLOBAL_OBJECTS, GLOBAL_TENANCY_OBJECTS; sorgente con DELETE+INSERT su GLOBAL_TENANCY_OBJECTS. RPS_UPDATEMOBJECTSSTATUS deps → GLOBAL_OBJECTS, GLOBAL_OM_WS_HISTORY, GLOBAL_CATEGORIES, MNT_ARCHIVEWORKORDER_BY_OIWS. Trigger su GLOBAL_OBJECTS: CNT_GLOBAL_OBJECTS, GLOBAL_OBJECTS_INSERT, ADD_GLOBAL_OBJECT_DATA (INSERT, ENABLED) + DOCS_GLOBAL_OBJECTS_UPD/GLOBAL_OBJECTS_DELETE (UPDATE). ID_OBJ non è identity column (assegnato dal trigger).

Confidence

  • VERIFIED: catena completa UI → code-behind → controller → proxy remoting (DAO_Objects.rem, registrazione server in Start.vb:342) → DAO_MObject.InsertRPS_ADDMOBJECTGLOBAL_OBJECTS (+ GLOBAL_OM_WS_HISTORY, GLOBAL_TENANCY_OBJECTS, GLOBAL_OBJECTS_DATA), confermata sia sui sorgenti dei due repo sia sul dizionario Oracle (sorgenti SP e trigger letti).
  • SUPPORTED: path bulk-loader (MObjectBulkLoader) e archiviazione ODL (MNT_ARCHIVEWORKORDER_BY_OIWS) — confermati su codice/deps ma non ispezionati riga per riga.
  • INFERRED: il meccanismo con cui la scheda riceve _idCat/_idfather per un oggetto nuovo (ControlState valorizzato dal contesto albero/categoria selezionata) — coerente con il codice ma non tracciato fino al singolo evento dell'albero.

Open questions

  • Da quale evento esatto dell'albero (Objects_Tree) vengono valorizzati _idCat/_idfather per la creazione (il set avviene via ControlState, MObjectDetails.ascx.vb:114-115).
  • Comportamento runtime di MNT_ARCHIVEWORKORDER_BY_OIWS sugli stati di dismissione (quali WORKING_STATUS la attivano).
  • Ruolo del quinto trigger GLOBAL_OBJECTS_DELETE (BEFORE UPDATE) nel ciclo di vita (cancellazione logica via RPS_DELETEOBJECT).
  • Canale remoting effettivo (SettingsManager.CHANNEL/SERVERADDRESS sono in una DLL Descor.Common referenziata come assembly; valori runtime da config di deploy).
  • Comportamento in configurazioni PROD (osservato solo ambiente TEST38).