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: schedaMObjectDetails.ascx(GlobalWeb, shell CASSANDRA). Backend OracleINFOCAD_TEST38, accesso via stored procedureRPS_ADDMOBJECTchiamata daDAO_MObjectesposto 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
1320o super-admin) — path interattivo schedaMObjectDetails.ascx. - Import massivo —
BulkLoaderManager.MObjectBulkLoader(InfocadServer) chiama in-process lo stessoDAO_MObject.Insert(stessa stored procedure). - Servizio Windows InfocadServer — host .NET Remoting del DAO (
Business/Start.vb). - Oracle
INFOCAD_TEST38— procedureRPS_ADDMOBJECT,RPS_UPDATEMOBJECTSSTATUS,RPS_SETMOBJECTTENANTS; trigger suGLOBAL_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) eObjects_Functional.aspx(:208), più la finestraUserControls/MObject/MObjectEdit.aspx(:110). - Control vista:
GlobalWeb/UserControls/MObject/MObjectView.ascx(tab scheda/posizioni/storia, registraMObjectDetailsa riga:3,86). - Control scheda:
GlobalWeb/UserControls/MObject/MObjectDetails.ascx(code-behindMObjectDetails.ascx.vb, ereditaDescor.GlobalWeb.Extensions.DetailBase). - Gate di accesso: pulsante Salva visibile solo con
HasUserGrant("1320")oWS.SessionProfile.SuperAdmin(MObjectDetails.ascx.vb:396per update,:403per new).
Sequenza principale (main sequence)
- Operatore apre l'albero oggetti (
Objects_Tree.aspx), seleziona/crea un oggetto: la vistaMObjectViewimpostaMObjectDetails1.ID_DTO = FilterID(MObjectView.ascx.vb:335);ID_DTO = 0⇒ creazione. - Compila nome, descrizione, stato, posizione e preme Salva:
btnUpdate_Click(:131) →UpdateOI()(:139). UpdateOIverifica 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, warningMObjectAlreadyExistMessage(:178) e nessuna scrittura.- Costruisce il DTO
MObjectviaInstantiateDto()(:206-220: Name, Description,ID_Category=_idCat,ID_Father=_idfather,ID_Tenancy = WS.CurrentTenant.ID_DTO, posizioni dalMObjectPosition) e lo valida:oi.Validate()(:153) — se invalido, mostraoi.Errored esce. - Ramo create:
ID_DTO = ctrl.Insert(WS.SessionLogin.UserName, oi)(:161) suMObjectController(campoctrl,:10). (Ramo update:ctrl.Update:164+ctrl.SetMObjectStatus:168se lo stato è cambiato.) MObjectController.Insert(GlobalControllers/MObjectController.vb:21-23) inoltra aMe.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).- Lato server, il servizio Windows InfocadServer espone il DAO:
RemotingConfiguration.RegisterWellKnownServiceType(DAO_MObject, "DAO_Objects.rem", SingleCall)(Business/Start.vb:342). DAO_MObject.Insert(GlobalManager/DAO/DAO_MObject.vb:73-126): validaID_Category > 0(:77), apreDataLayer(My.Settings.ConnectionName)(:75), aggiunge gliOracleParameter(PUSERNAME,PIDFATHER,PIDCATEGORY,PNAME,PDESCRIPTION,PWORKINGSTATUS,PPROPAGATEWS, posizioniPIDPOS*,PFORCEDPOSITION,PISCAT, OUTPIDOBJ;:79-113) ed esegueRPS_ADDMOBJECT(ExecuteNonQueryStoredProcedure,:115); legge il nuovo id daPIDOBJ(:116).- Oracle
RPS_ADDMOBJECT(INFOCAD_TEST38, PROCEDURE VALID; sorgente daUSER_SOURCE):- default
WORKING_STATUS = 1se nullo/0; normalizza le posizioni; - se
PIDFATHERè nullo/0 risolve il padre di categoria viaRPS_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 aggiornaGLOBAL_OBJECTS.WORKING_STATUS, chiude la riga aperta e inserisce la nuova riga inGLOBAL_OM_WS_HISTORY(joinGLOBAL_CATEGORIES), poiMNT_ARCHIVEWORKORDER_BY_OIWS.
- default
- Trigger di INSERT su
GLOBAL_OBJECTS(daUSER_TRIGGERS, tutti ENABLED):CNT_GLOBAL_OBJECTS(BEFORE): assegnaID_OBJ = SEQ_GLOBAL_OBJECTS.NEXTVALse NULL;GLOBAL_OBJECTS_INSERT(BEFORE): seNAMEvuoto genera il codiceTRIM(SUBSTR(prefix,0,3)) || '-' || progressivo || '-' || max_id+1dal prefissoGLOBAL_CATEGORIES.ID_LINK/NAME;ADD_GLOBAL_OBJECT_DATA(AFTER):INSERT INTO GLOBAL_OBJECTS_DATA (ID_O, ID_F).
- Rientrati nel DAO: se
om.ID_Tenancy > 0,SetMObjectTenancies(idMo, {ID_Tenancy})(DAO_MObject.vb:118-119→:2250-2270) esegueRPS_SETMOBJECTTENANTS(array PL/SQLPTENANTIDS), che naviga gli antenati (CONNECT BY PRIOR ID_FATHER = ID_OBJ), faDELETEdei binding correnti dell'oggetto eINSERT INTO GLOBAL_TENANCY_OBJECTS (ID_OBJ, ID_TENANCY, CODICE)per oggetto e antenati non ancora assegnati. - Il nuovo id risale via remoting al controller e alla scheda (
ID_DTO = ...,:161);Action = "EDIT"eRaiseEditDone(Me, oi)(:173-174) notificanoMObjectView(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) — istanziaDAO_MObjectin-process nel tier server e chiama lo stessoInsert(stessaRPS_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 suIDAO_MObject. - Fabbrica proxy:
Ctrl_Base.DaoActivate→DAOFactory.CreateDAO(serv/DAOFactory.vb) —Activator.GetObjectverso 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-knownDAO_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 OUTPIDOBJ(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 BYantenati inRPS_SETMOBJECTTENANTS),GLOBAL_CATEGORIES(prefisso codice nel trigger; nome categoria nella storia stato),GLOBAL_TENANCY_OBJECTS(esistenza binding), sequenceSEQ_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 conRETURNING ID_OBJ; poi UPDATE diWORKING_STATUSdaRPS_UPDATEMOBJECTSSTATUS— VERIFIED suUSER_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 triggerADD_GLOBAL_OBJECT_DATA— VERIFIED su trigger body).- Effetto indiretto:
MNT_ARCHIVEWORKORDER_BY_OIWS(chiamata in coda aRPS_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 DTOoi.Validate()con messaggiooi.Error(:153-158); visibilità Salva solo con grant1320/super-admin (:396,403). - Lato DAO:
ID_Category <= 0⇒DAOException("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 seNAMEvuoto (triggerGLOBAL_OBJECTS_INSERT);CNT_GLOBAL_OBJECTSimpedisce il cambio diID_OBJin UPDATE (raise_application_error(-20000)).
Side effects
- Assegnazione
ID_OBJdaSEQ_GLOBAL_OBJECTSe auto-generazione del codice oggetto (trigger BEFORE INSERT). - Riga di storia stato in
GLOBAL_OM_WS_HISTORYconUSERNAME/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 > 0⇒ctrl.Update(:164) →RPS_UPDATEMOBJECT(DAO_MObject.vb:244); se lo stato è cambiato ancheSetMObjectStatus(:166-169) →RPS_UPDATEMOBJECTSSTATUS(DAO_MObject.vb:305). - Import massivo:
MObjectBulkLoader(InfocadServer) →DAO_MObject.Insertin-process (MObjectBulkLoader.vb:375) — stessaRPS_ADDMOBJECT, username "System" (overloadInsert(dto),DAO_MObject.vb:69-71). - Nome duplicato nel tenant → nessuna scrittura, warning (
:178). - DTO invalido →
oi.ErrorindivError, nessuna chiamata al controller (:153-158). - Eccezione DB/remoting → il DAO logga (
ExceptionLogger.LogException,:128) e rilancia; la scheda mostraex.Message(:181-185). - Cancellazione (controprova non distruttiva):
RPS_DELETEOBJECT/ restoreRPS_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_Click → UpdateOI → ctrl.Insert |
MObjectDetails.ascx.vb:131,139,141,153,161 |
| Controller | MObjectController.Insert → Me.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.Insert → RPS_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_DEPENDENCIES → GLOBAL_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_ADDMOBJECTha 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 daBulkLoaderManager.MObjectBulkLoader(MObjectBulkLoader.vb:201,375, overloadInsert(dto)con username "System").MObjectController.Insertin InfocadWeb è chiamato dalla sola schedaMObjectDetails.ascx.vb:161(gli altri ~30 file web che usanoMObjectControllerfanno letture o update/stati, non insert).- Forward e reverse concordano (scheda → controller → remoting →
DAO_MObject.Insert→RPS_ADDMOBJECT→GLOBAL_OBJECTS) → NO CONFLICTING.
Regole correlate (related rules)
- Multi-tenant per-oggetto: il binding non usa
GLOBAL_TENANCY_BINDINGS(che è il binding generico delle entità Property) ma la tabella dedicataGLOBAL_TENANCY_OBJECTS, con propagazione verso gli antenati dell'albero oggetti. - Identity da trigger:
ID_OBJè assegnato daCNT_GLOBAL_OBJECTSviaSEQ_GLOBAL_OBJECTS(colonna non-identity,USER_TAB_COLUMNS), pattern contatore comune alle tabelle Infocad. - Codice auto-generato: se
NAMEè vuoto il triggerGLOBAL_OBJECTS_INSERTgeneraPREFIX-progressivo-iddal prefisso categoria (GLOBAL_CATEGORIES.ID_LINK). - Storia stato obbligatoria: ogni insert/cambio stato passa da
RPS_UPDATEMOBJECTSSTATUS(riga sempre presente inGLOBAL_OM_WS_HISTORY, chiusura della precedente conENDDATE). - 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 inStart.vb:342) →DAO_MObject.Insert→RPS_ADDMOBJECT→GLOBAL_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/_idfatherper 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/_idfatherper la creazione (il set avviene via ControlState,MObjectDetails.ascx.vb:114-115). - Comportamento runtime di
MNT_ARCHIVEWORKORDER_BY_OIWSsugli stati di dismissione (qualiWORKING_STATUSla attivano). - Ruolo del quinto trigger
GLOBAL_OBJECTS_DELETE(BEFORE UPDATE) nel ciclo di vita (cancellazione logica viaRPS_DELETEOBJECT). - Canale remoting effettivo (
SettingsManager.CHANNEL/SERVERADDRESSsono in una DLLDescor.Commonreferenziata come assembly; valori runtime da config di deploy). - Comportamento in configurazioni PROD (osservato solo ambiente TEST38).