Evidenza FLOW-QC-001 (estratti file:riga)
1. Service entry WCF — QualityCheckReaderWCF.svc.vb:254-282
Public Function DoCheck(ByVal loginkey As String, ByVal idCheck As Integer, ByVal idsDetail As List(Of Integer), ByVal responses As List(Of String)) As MobileResult(Of Integer) Implements IQualityCheckReaderWCF.DoCheck
Dim result As New MobileResult(Of Integer)
If ValidateLoginKey(loginkey) Then
Dim qcheck As QualityCheckCheck = ctrl.GetCheckByID(idCheck) '259
If qcheck.Suspenddate.HasValue Then '260 controllo sospeso
result.setAsERROR(... "SuspendCheckLbl" ...)
ElseIf qcheck.ExecutionDate.HasValue Then '262 gia chiuso
result.setAsERROR(... "CheckStringStatusClosed" ...)
ElseIf qcheck.CancelDate.HasValue Then '264 annullato
result.setAsNoDataFound()
Else
Dim nrow As Integer = ctrl.DoCheck(_validCSession.SessionLogin.UserName, idCheck, idsDetail, responses) '267
If nrow <> 0 Then
result.Data = nrow : result.setAsOK() '269-270
Else
result.setAsERROR(... "ErrorString" ...) '272
End If
End If
Else
result.setAsAccessDenied() '278
End If
Return result
End Function
Campo controller: Private ReadOnly ctrl As New QualityCheckController (svc.vb:18).
Contratto: IQualityCheckReaderWCF.vb:26 Function DoCheck(...) As MobileResult(Of Integer).
2. Controller — QualityCheckController.cs:264-267
public int DoCheck(string username, int idCheck, List<Int32> idDetails, List<string> resValues)
{
return ((IQualityCheck)this.DAO).DoCheck(username, idCheck, idDetails, resValues);
}
Interfaccia server: IQualityCheck.cs:105 int DoCheck(string username, int idCheck, List<Int32> idDetails, List<string> resValues);
3. DAL — QualityCheck_DAL.cs:1397-1445
public int DoCheck(string username, int idCheck, List<Int32> idDetails, List<string> resValues)
{
DataLayer dl = new DataLayer(ConnectionName);
try {
OracleParameter pUsername = new OracleParameter("PUSERNAME", OracleDbType.Varchar2, username, ...); //1407
OracleParameter pIdCheck = new OracleParameter("PIDCHECK", OracleDbType.Int32, idCheck, ...); //1408
OracleParameter idsParam = new OracleParameter("PIDDETAILS", OracleDbType.Int32, ...); //1410
idsParam.Value = DataLayer.GetIntegerArray(idDetails);
idsParam.CollectionType = OracleCollectionType.PLSQLAssociativeArray; //1412
OracleParameter resValuesParam = new OracleParameter("PRESPONSEVALUES", OracleDbType.Varchar2, ...); //1414
resValuesParam.Value = DataLayer.GetStringArray(resValues, false);
resValuesParam.CollectionType = OracleCollectionType.PLSQLAssociativeArray; //1416
OracleParameter precords = new OracleParameter("POUT", OracleDbType.Int32, ParameterDirection.Output);//1418
dl.Parameters.Add(pUsername); ... dl.Parameters.Add(precords); //1421-1425
dl.ExecuteNonQueryStoredProcedure("QCK_DOCHECK"); //1428
return ((OracleDecimal)precords.Value).ToInt32(); //1430
}
catch (Exception ex) { Descor.Infrastructure.LogManager.ExceptionLogger.LogException(ex); throw; } //1434-1438
finally { dl.Kill(); }
}
4. Oracle — QCK_DOCHECK (user_source, owner INFOCAD_TEST38)
PROCEDURE QCK_DOCHECK(PUSERNAME IN VARCHAR, PIDCHECK IN NUMBER,
PIDDETAILS IN HELPERS.numberlist,
PRESPONSEVALUES IN HELPERS.stringlist4000, POUT OUT NUMBER)
AS
BEGIN
QCK_SAVERESPONSES(PIDDETAILS, PRESPONSEVALUES, PIDCHECK, POUT); -- line 12
UPDATE QCHECK_CHECK
SET EXECUTIONDATE = SYSDATE, EXECUTIONUSER = PUSERNAME -- line 15
WHERE IDCHECK = PIDCHECK; -- line 16
END;
(Nessun COMMIT nella versione INFOCAD_TEST38 — vedi Open questions.)
5. Oracle — QCK_SAVERESPONSES (user_source, owner INFOCAD_TEST38)
PROCEDURE "QCK_SAVERESPONSES"(PIDDETAILS IN HELPERS.numberlist,
PRESPONSEVALUES IN HELPERS.stringlist4000,
PIDCHECK IN NUMBER, POUT OUT NUMBER)
AS tmpRowsAffected NUMBER := 0;
BEGIN
FOR I IN PIDDETAILS.FIRST .. PIDDETAILS.LAST LOOP
UPDATE QCHECK_CHECK_DETAILS
SET RESPONSEVALUE = PRESPONSEVALUES(I) -- line 17
WHERE IDDETAILS = PIDDETAILS(I) AND CHECKID = PIDCHECK; -- line 18-19
tmpRowsAffected := tmpRowsAffected + SQL % ROWCOUNT; -- line 21
END LOOP;
POUT := tmpRowsAffected; -- line 25
END QCK_SAVERESPONSES;
6. Oracle — user_dependencies (VERIFIED write targets)
QCK_DOCHECK -> INFOCAD_TEST38.QCHECK_CHECK (TABLE), QCK_SAVERESPONSES (PROCEDURE), HELPERS (PACKAGE)
QCK_SAVERESPONSES -> INFOCAD_TEST38.QCHECK_CHECK_DETAILS (TABLE), HELPERS (PACKAGE)
7. Oracle — user_tab_columns (colonne bersaglio confermate)
QCHECK_CHECK: IDCHECK(NN), ..., EXECUTIONDATE(DATE), EXECUTIONUSER(VARCHAR2),
SUSPENDDATE(DATE), CANCELDATE(DATE), IGC(NUMBER), SURVEYID, ENTITYTABLE, ENTITYID
QCHECK_CHECK_DETAILS: IDDETAILS(NN), CHECKID, QUESTIONID, RESPONSEVALUE(VARCHAR2), RESPONSEWEIGHT
8. Oracle — trigger side effect (user_triggers: QCHECK_CHECK_SCHEDULE, INSERT OR UPDATE su QCHECK_CHECK)
-- se il check e legato a ENTITYTABLE='SCHEDULE' e ENTITYID>0:
ELSIF UPDATING THEN
IF oldExecDate IS NULL AND newExecDate IS NOT NULL THEN
UPDATE MAINT_ODL SET COUNT_QCHECKS = COUNT_QCHECKS - 1 WHERE ID_ODL = newEntityId;
...
=> l'UPDATE di chiusura del check decrementa il contatore controlli aperti dell'ODL.
9. Path web alternativo — CheckSurveyControl.ascx.vb
Protected Sub btnExecuted_Click(...) '999
If CheckAllWithAnswer() Then ExecutedSurvey()
Private Sub ExecutedSurvey() '1201
Dim insOK As Int32 = SaveUserResponses() '1203
CurrentCheck.Igc = CDbl(txtIgc.Value) '1206 (IGC calcolato lato UI)
CurrentCheck.ExecutionDate = DateTime.Now '1207
CurrentCheck.ExecutionUser = WS.SessionLogin.UserName '1208
insOK = qcheckCtrl.UpdateCheck(CurrentCheck, False) '1211 -> QCK_UPDATECHECK (DAL:1600)
Private Function SaveUserResponses() As Integer '1283
...
insOK = qcheckCtrl.SaveResponses(iddetailslist, respvaluelist, CInt(CurrentCheck.IdCheck)) '1291
-> DAL SaveResponses (:3009) -> ExecuteNonQueryStoredProcedure("QCK_SAVERESPONSES") (:3036)
Gate grant UI: btnSaveTelerik.Visible = (HasUserGrant("22540") Or WS.SessionProfile.SuperAdmin) And IsCompile (:244,279).
Tipi di evidenza indipendenti usati
- Codice applicativo VB.NET (WCF svc + code-behind web) e C# (controller, DAL, interfaccia).
- Sorgente stored procedure Oracle (
user_source: QCK_DOCHECK, QCK_SAVERESPONSES) + corpo trigger (user_triggers). - Catalogo Oracle statico (
user_dependencies,user_tab_columns) a conferma di tabelle e colonne scritte.