__CREATE_QUERY("SELECT row_number, spreadsheet_id FROM co_%s_spreadsheet_row WHERE id=%d", par_area, par_id)
__SQL_GET_RESULT

if (ok)
{
row_num = atoi(cor_GetValue(cnx,corec,0,0));
id_spreadsheet = atoi(cor_GetValue(cnx,corec,0,1));
__CLEAR_RESULT
__CREATE_QUERY("DELETE FROM co_%s_spreadsheet_row WHERE id=%d", par_area, par_id)
__SQL_EXEC
__CREATE_QUERY("UPDATE co_%s_spreadsheet_row SET row_number=row_number-1
         WHERE row_number>%d AND spreadsheet_id=%d", par_area, row_num, id_spreadsheet)
__SQL_EXEC
__CREATE_QUERY("DELETE FROM co_%s_spreadsheet_cell WHERE row_id=%d", par_area, par_id);
__SQL_EXEC
__SQL_GET_INTEGER(new_row_id,
"SELECT id FROM co_%s_spreadsheet_row WHERE spreadsheet_id=%d AND row_number=%d",
par_area, id_spreadsheet, row_num);
if (!ok) {
__SQL_GET_INTEGER(new_row_id,
"SELECT id FROM co_%s_spreadsheet_row WHERE spreadsheet_id=%d AND row_number=%d",
par_area, id_spreadsheet, row_num-1);
}

/* remove expressions from this row */
@co_call(par_area,'"expression"',"purgeExpressionsInRow",par_area=>par_area,par_class=>'"expression"',par_id=>id_spreadsheet,id_row=>par_id);
/* update references to point to the new row_num row */
@co_call(par_area,'"expression_range"',"resetReferencedRow",par_area=>par_area,par_class=>'"expression_range"',par_id=>id_spreadsheet,id_row=>par_id,num_row=>row_num);
/* eval everything that depends on cells from removed row */
@co_call(par_area,'"expression"',"evalRectangle", par_area=>par_area,par_class=>'"expression"',par_id=>id_spreadsheet,id_row=>new_row_id,id_last_row=>new_row_id);


cou_logError(cnx,CO_LOG_DEBUG,"BEFORE");
puta_ids[0] = id_spreadsheet; puta_ids[2] = par_id;
cou_queueActionX( cnx, "spreadsheet_row", puta_classes, puta_ids, CO_OP_DELETE, NULL);
cou_logError(cnx,CO_LOG_DEBUG,"AFTER");
}
else
{
__CLEAR_RESULT
}