Hi,
actually error is on this line :
send_wait(0, grp_leader, "checkout", obj_chg);
but you haven't error message log after this send_wait,
error caused by group_leader logic, here is a great doc SPEL group_leader by Gutis where you can find all about group_leader's logic.
Modified code could look like:
wf::z_wf_chgstatuschange(...) {
int debug_mode, msg_i;
debug_mode = 1; //mude para 0 para cancelar o debug mode
if (debug_mode == 1) {
logf(SIGNIFICANT, "z_wf_chgstatuschange.spl -- Starting Spell ");
}
string spl_new_chgstatus;
if (task == "INITWKFW" && status == "COMP") {
spl_new_chgstatus = "APP";
if (debug_mode == 1) {
logf(SIGNIFICANT, "z_wf_chgstatuschange.spl -- Comp Status...");
}
} else if (task == "ULAAPP" && status == "APP") {
spl_new_chgstatus = "ULA";
if (debug_mode == 1) {
logf(SIGNIFICANT, "z_wf_chgstatuschange.spl -- ULA Status...");
}
} else {
if (debug_mode == 1) {
logf(SIGNIFICANT, "z_wf_chgstatuschange.spl -- No options for this status...");
}
return;
}
send_wait(0, this, "get_gl");
if (msg_error()) {
logf(ERROR, "z_wf_chgstatuschange.spl -- unable to get gl : %s", msg[0]);
return;
}
grp_leader = msg[0];
object obj_chg;
send_wait(0, top_object(), "call_attr", "chg", "dob_by_persid", 0, chg.persistent_id);
if (msg_error()) {
for(msg_i=0;msg_i<msg_length();msg_i++) { logf(ERROR, "z_wf_chgstatuschange.spl -- msg[%d]: %s", msg_i, msg[msg_i]); }
return;
}
obj_chg = msg[0];
send_wait(0, grp_leader, "checkout", obj_chg);
if (msg_error()) {
for(msg_i=0;msg_i<msg_length();msg_i++) { logf(ERROR, "z_wf_chgstatuschange.spl -- msg[%d]: %s", msg_i, msg[msg_i]); }
return;
}
send_wait(0, obj_chg, "call_attr", "status", "set_val", spl_new_chgstatus, "SURE_SET");
if (msg_error()) {
logf(ERROR, "z_wf_chgstatuschange.spl -- Erro saving : %s", msg[0]);
return;
}
if (debug_mode == 1) {
logf(SIGNIFICANT, "z_wf_chgstatuschange.spl -- Changing the status : %s.", obj_chg.chg_ref_num);
}
}
Here I tried to get current group_leader session and checkout chg via it.
We have implemented chg logic similiar to this, but we are using attached events (because it feels slightly safer )
mod file:
MODIFY wf POST_VALIDATE z_status_sync(status) 1300 FILTER(status{});
spl file:
wf::z_status_sync(...) {
string status_prev, status_new;
status_prev = argv[2];
status_new = argv[3];
if ( (status_prev == 'WAIT') && (status_new == 'PEND') ) {
if (task.code == 'TSK_RE') {
evt::z_new_evt((string)"CHG2RE", format("chg:%d", chg.id), 15);
} else if (task.code == 'TSK_APP') {
evt::z_new_evt((string)"CHG2APP", format("chg:%d", chg.id), 15);
} else if (task.code == 'TSK_AKN') {
evt::z_new_evt((string)"CHG2AKN", format("chg:%d", chg.id), 15);
}
<...etc...>
}
}
z_new_evt is my own function, but it's based on antoher great doc SPEL EVENT methods by Gutis
Each Attached event have single action macro on other side with simple code, with new chg status appropriate to event name:
send_wait(0, this, "call_attr", "status", "set_val", "RE", "SURE_SET");
Regards,
Timur