Ошибка при запуске "полнота наполнения данными" вручную процесса. В академии написано что необходимо запустить бизнес-процесс “Обновить полноту профиля”, но это приводит в ошибке. Подскажите как правильно произвести пересчет этого показателя?
Нравится
Если бы тут привели текст выводимого на экран или в логи при запуске БП сообщения, гадать о причинах было бы намного легче: фаза Луны, погода на Марсе...![]()
А так можно только посоветовать воспользоваться инструментами Visual Studio и Management Studio: отладить функцию RecalculateAll в схеме BaseCompletenessService, которую запускает этот БП и запустить с теми же параметрами хранимку tsp_CompletenessRenew в базе, которую функция запускает.
Зверев Александр,
если запускать "Обновить полноту профиля"
Oracle.DataAccess.Client.OracleException ORA-00936: missing expression
ORA-06512: at "BPM.tspkg_Completeness", line 113
ORA-06512: at line 2 at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck)
at Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()
at Polly.Policy.<>c__DisplayClass119_0`1.<Execute>b__0(Context ctx, CancellationToken ct)
at Polly.Policy.<>c__DisplayClass129_0`1.<ExecuteInternal>b__0(Context ctx, CancellationToken ct)
at Polly.Policy.<>c__DisplayClass103_0.<NoOp>b__1(Context ctx, CancellationToken ct)
at Polly.NoOp.NoOpEngine.Implementation[TResult](Func`3 action, Context context, CancellationToken cancellationToken)
at Polly.Policy.<>c.<NoOp>b__103_0(Action`2 action, Context context, CancellationToken cancellationToken)
at Polly.Policy.ExecuteInternal[TResult](Func`3 action, Context context, CancellationToken cancellationToken)
at Polly.Policy.Execute[TResult](Func`3 action, Context context, CancellationToken cancellationToken)
at Polly.Policy.Execute[TResult](Func`1 action)
at Terrasoft.DB.Oracle.OracleExecutor.FailoverExecute[TResult](DbCommand command, Func`1 func)
at Terrasoft.Core.DB.DBExecutor.ExecuteCommand[TResult](Func`2 commandExecutionCallback, String sqlText, QueryParameterCollection queryParameters, CancellationToken cancellationToken)
at Terrasoft.Core.DB.DBExecutor.Execute(String sqlText, QueryParameterCollection queryParameters)
at Terrasoft.Core.DB.StoredProcedure.Execute()
at Terrasoft.Configuration.BaseCompletenessService.RecalculateAll()
at Terrasoft.Core.Process.CompletenessRenew.ScriptTask1Execute(ProcessExecutingContext context)
at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)Если запускать "Запустить обновление полноты профиля"
System.NullReferenceException: Object reference not set to an instance of an object.
at Terrasoft.Configuration.BaseCompletenessService.get_AppConnection()
at Terrasoft.Configuration.BaseCompletenessService.RecalculateAllByCompleteness(Guid completenessId)
at Terrasoft.Configuration.BaseCompletenessService.RecalculateAll()
at Terrasoft.Core.Process.CompletenessRenew.ScriptTask1Execute(ProcessExecutingContext context)
at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
Значит ещё и используется Oracle... Нужно смотреть, что находится в пакете spkg_Completeness во второй строке и во входящей в него хранимке tsp_CompletenessRenew в 113 строке и рядом. Были ли в них доработки?
Есть ли замещения схемы BaseCompletenessService? Если есть, попробуйте удалить, скомпилироваться, повторить запуск процесса.
Изменений и замещений нет. Содержание хранимой процедуры
create or replace PACKAGE BODY "tspkg_Completeness"
AS
FUNCTION "fn_Is_Number" (stringValue IN VARCHAR2)
RETURN INT
IS
new_Number NUMBER;
BEGIN
new_Number := TO_NUMBER(stringValue);
RETURN 1;
EXCEPTION
WHEN VALUE_ERROR THEN
RETURN 0;
END;
PROCEDURE "tsp_CompletenessRenew" (CompletenessId VARCHAR2)
IS
BEGIN
DECLARE
EntitySchemaName VARCHAR2(50);
TypeColumn VARCHAR2(50);
TypeValue VARCHAR2(38);
ResultColumn VARCHAR2(50);
sqlcmd VARCHAR2(30000);
createTableSql VARCHAR2(30000);
whereSql VARCHAR2(30000);
updateSql VARCHAR2(30000);
fromSelectSql VARCHAR2(30000);
c_id VARCHAR2(38);
c_column_name VARCHAR2(500);
c_detail_name VARCHAR2(500);
c_detail_column VARCHAR2(500);
c_master_column VARCHAR2(500);
c_is_column VARCHAR2(1);
c_is_detail VARCHAR2(1);
c_percentage INT;
c_type_column VARCHAR2(50);
c_type_value VARCHAR2(38);
typed_detail_name VARCHAR2(500);
attributes_count INT;
CURSOR attributes_cursor IS
SELECT
cp."Id",
cp."ColumnName",
cp."DetailEntityName",
cp."DetailColumn",
cp."MasterColumn",
cp."IsColumn",
cp."IsDetail",
cp."Percentage",
cp."TypeColumn",
cp."TypeValue"
FROM "CompletenessParameter" cp
WHERE cp."CompletenessId" = (
SELECT "Id" FROM "Completeness" c WHERE c."Id" = CompletenessId);
BEGIN
attributes_count := 0;
SELECT "EntitySchemaName", "TypeColumnName", "TypeColumnValue", "ResultColumnName"
INTO EntitySchemaName, TypeColumn, TypeValue, ResultColumn
FROM "Completeness" WHERE "Id" = CompletenessId;
createTableSql := 'CREATE TABLE "CalcCompleteness" AS SELECT "Id", "'||ResultColumn||'", SUM(';
fromSelectSql := 'FROM "' || entitySchemaName || '" a ';
whereSql := ' WHERE ';
OPEN attributes_cursor;
LOOP
FETCH attributes_cursor into
c_id,
c_column_name,
c_detail_name,
c_detail_column,
c_master_column,
c_is_column,
c_is_detail,
c_percentage,
c_type_column,
c_type_value;
EXIT WHEN attributes_cursor%notfound;
attributes_count := attributes_count + 1;
IF c_is_column = '1' THEN
createTableSql := createTableSql || ' CASE WHEN ("' || c_column_name || '" IS NULL) OR (LENGTH("' || c_column_name || '") = 0)';
createTableSql := createTableSql || ' OR ("tspkg_Completeness"."fn_Is_Number"("' || c_column_name || '") = 1 AND TO_NUMBER("' || c_column_name || '") = 0) THEN 0 ELSE ' || c_percentage || ' END +';
ELSE
typed_detail_name := c_detail_name;
IF (c_type_column IS NOT NULL OR c_type_column <> '') AND (c_type_value IS NOT NULL OR c_type_value <> '') THEN
typed_detail_name := c_detail_name || TO_CHAR(attributes_count);
END IF;
createTableSql := createTableSql || ' CASE WHEN NVL(' || typed_detail_name || '."' || c_detail_name || '", 0) = 0 THEN 0 ELSE ' || c_percentage || ' END +';
fromSelectSql := fromSelectSql || ', (SELECT COUNT("'|| c_detail_name ||'"."'||c_detail_column||'") "'|| c_detail_name ||'", "'||c_detail_column||'" FROM "'||c_detail_name||'"';
IF (c_type_column IS NOT NULL OR c_type_column <> '') AND (c_type_value IS NOT NULL OR c_type_value <> '') THEN
fromSelectSql := fromSelectSql || ' WHERE "' || c_detail_name ||'"."'||c_type_column||'" = '''||c_type_value||'''';
END IF;
fromSelectSql := fromSelectSql ||' GROUP BY "'||c_detail_column||'") ' || typed_detail_name;
whereSql := whereSql || 'a."Id" = '||typed_detail_name||'."'||c_detail_column||'"(+) AND ';
END IF;
END LOOP;
CLOSE attributes_cursor;
IF attributes_count <> 0 THEN
createTableSql := SUBSTR(createTableSql, 0, LENGTH(createTableSql) - 2);
createTableSql := createTableSql || ') AS "NewCompleteness"';
whereSql := SUBSTR(whereSql, 0, LENGTH(whereSql) - 6);
IF (TypeColumn IS NOT NULL OR TypeColumn <> '')
AND (TypeValue IS NOT NULL OR TypeValue <> '') THEN
whereSql := whereSql || ' AND a."' || TypeColumn || '" = '''||TypeValue||'''';
END IF;
createTableSql := createTableSql || fromSelectSql || whereSql;
createTableSql := createTableSql || ' GROUP BY a."Id", a."'||ResultColumn||'"';
EXECUTE IMMEDIATE createTableSql;
sqlcmd := 'CREATE UNIQUE INDEX calcCompleteness_id_ix ON "CalcCompleteness" ("Id")';
EXECUTE IMMEDIATE sqlcmd;
updateSql := 'UPDATE
(SELECT
t1."Id",
t2."Id",
t1."'||ResultColumn||'" "Completeness1",
t2."NewCompleteness" "NewCompleteness"
FROM
"'||EntitySchemaName||'" t1,
"CalcCompleteness" t2 WHERE t1."Id" = t2."Id" AND t1."'||ResultColumn||'" <> t2."NewCompleteness") SET "Completeness1" = "NewCompleteness"';
EXECUTE IMMEDIATE updateSql;
sqlcmd := 'DROP TABLE "CalcCompleteness"';
EXECUTE IMMEDIATE sqlcmd;
ELSE
sqlcmd := 'UPDATE "'||EntitySchemaName||'" SET "'||ResultColumn||'" = 0';
EXECUTE IMMEDIATE sqlcmd;
END IF;
END;
END;
END "tspkg_Completeness";
Попробуйте для отладки запускать функцию с тем же параметром, которым его запускает система,чтобы увидеть, где именно падает выполнение хранимки. Возможно, в разделе настраивали детали и у одной из них что-то настроено некорректно.
Зверев Александр,
если имеете введу вносил ли я изменения - нет. Настройки производил по инструкции
Речь о самодельных деталях в этом разделе, если они есть.
Зверев Александр,
Детали есть, но не совсем понимаю на что они могут повлиять в процессе. Возможно я чего не знаю, можете подсказать для примера?
В хранимке идёт в цикле перебор деталей раздела. Возможно, с одной из деталей что-то не то.