B4J=true Group=Default Group ModulesStructureVersion=1 Type=StaticCode Version=10.3 @EndOfDesignText@ ' Archivo: ParameterValidationUtils.bas ' Módulo de utilidad: ParameterValidationUtils ' Centraliza la lógica de validación y ajuste de parámetros SQL. ' Ahora soporta recorte de parámetros excesivos. Sub Process_Globals ' El Type ParameterValidationResult está declarado en Main.bas, no se declara aquí. End Sub ' Valida y ajusta la lista de parámetros para la ejecución SQL, aplicando la lógica de tolerancia. ' Retorna un ParameterValidationResult indicando éxito/error y los parámetros a usar. Public Sub ValidateAndAdjustParameters (CommandName As String, DBKey As String, sqlCommand As String, receivedParams As List, IsToleranceEnabled As Boolean) As ParameterValidationResult Dim res As ParameterValidationResult res.Initialize res.Success = True ' Asumimos éxito inicialmente Log(">>>> IsToleranceEnabled: " & IsToleranceEnabled) ' Aseguramos que receivedParams esté inicializada, incluso si está vacía o Null If receivedParams = Null Or receivedParams.IsInitialized = False Then receivedParams.Initialize ' Inicializa una lista vacía si es Null o no inicializada. End If ' Contar cuántos '?' hay en la sentencia SQL para saber cuántos parámetros se esperan. Dim expectedParams As Int = sqlCommand.Length - sqlCommand.Replace("?", "").Length Dim receivedParamsSize As Int = receivedParams.Size If receivedParamsSize < expectedParams Then ' Caso 1: Se recibieron MENOS parámetros de los esperados. Esto es un error. res.Success = False res.ErrorMessage = $"ERROR: Número de parámetros insuficiente para "${CommandName}" (DB: ${DBKey}). Se esperaban ${expectedParams} y se recibieron ${receivedParamsSize}."$ Log(res.ErrorMessage) Main.LogServerError("ERROR", "ParameterValidationUtils.ValidateAndAdjustParameters", res.ErrorMessage, DBKey, CommandName, Null) ' <-- Nuevo Log Return res Else If receivedParamsSize > expectedParams Then ' Caso 2: Se recibieron MÁS parámetros de los esperados. If IsToleranceEnabled Then ' Solo recortamos si la tolerancia está habilitada Dim adjustedParams As List adjustedParams.Initialize For i = 0 To expectedParams - 1 adjustedParams.Add(receivedParams.Get(i)) Next res.ParamsToExecute = adjustedParams res.Success = True Dim WarningMsg As String = $"ADVERTENCIA: Se recibieron más parámetros de los esperados para "${CommandName}" (DB: ${DBKey}). Se esperaban ${expectedParams} y se recibieron ${receivedParamsSize}. Se ajustó la lista de parámetros a ${expectedParams} elementos."$ Log(WarningMsg) Main.LogServerError("ADVERTENCIA", "ParameterValidationUtils.ValidateAndAdjustParameters", WarningMsg, DBKey, CommandName, Null) ' <-- Nuevo Log [6] Else ' Si la tolerancia NO está habilitada, esto es un error crítico. res.Success = False res.ErrorMessage = $"ERROR: Número de parámetros excesivo para "${CommandName}" (DB: ${DBKey}). Se esperaban ${expectedParams} y se recibieron ${receivedParamsSize}. La tolerancia a parámetros de más está DESHABILITADA."$ Log(res.ErrorMessage) Main.LogServerError("ERROR", "ParameterValidationUtils.ValidateAndAdjustParameters", res.ErrorMessage, DBKey, CommandName, Null) Return res End If Else ' Caso 3: Se recibieron el número EXACTO de parámetros. Todo bien. res.ParamsToExecute = receivedParams ' Usamos la lista original tal cual. res.Success = True ' Confirmamos éxito. End If Return res End Sub