Существует "пользовательский" отчет - "Оперативная сверка остатков" производящий сверку между СО и удаленными базами магазинов. И естественно возникла необходимость добавить в описание отчета новые магазины, добавляю данные в таблицу dblink$names и получаю сообщение:
ORA-02019: описание соединения для удаленной БД не найдено.
Проверил данные smpostlocations = данным dblink$name, информация в dblink$name соответствует данным баз,
по старым базам/магазинам отчет работает.
Вопрос: куда копать дальше?
Текст отчета ниже:
<ScriptText>using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using System.Drawing;
using System.Data;
using System.Reflection;
using FastReport;
using FastReport.Data;
using FastReport.Dialog;
using FastReport.Table;
using FastReport.Utils;
using FastReport.Format;
using Sm.FastReports;
using Sm.FastReports.Link;
using Sm.Interfaces;
using Sm.Objects;
using Sm.Core;
namespace FastReport
{
public class ReportScript
{
string qMainSQL=" SELECT CASE WHEN b1.article IS NULL THEN (SELECT title FROM supermag.smpostlocations pl INNER JOIN supermag.dblink$names dn ON pl.id = dn.id_postloc WHERE dn.name =SUBSTR('[BASE2]',-(LENGTH('[BASE2]')-1))) WHEN b2.article IS NULL THEN 'ЦО' END db_only, NVL(b1.article,b2.article) article, NVL(b1.tree,b2.tree) tree, NVL(b1.grp,b2.grp) grp, NVL(b1.name,b2.name) name, b1.quant b1_quant, b2.quant b2_quant FROM ( SELECT crd.article, cls.tree||' '||cls.name grp, supermag.Classifier.NORMALIZECLASSIF(cls.tree) tree, crd.name, SUM(NVL(g.quantity,0)) quant FROM supermag.smcard crd INNER JOIN supermag.sacardclass cls ON cls.id=crd.idclass LEFT OUTER JOIN supermag.smgoods g ON g.article=crd.article [FILTER_LOC] WHERE 1=1 [FILTER_CLASS] GROUP BY crd.article, cls.tree||' '||cls.name, supermag.Classifier.NORMALIZECLASSIF(cls.tree), crd.name) b1 FULL JOIN ( SELECT crd.article, cls.tree||' '||cls.name grp, supermag.Classifier.NORMALIZECLASSIF(cls.tree) tree, crd.name, SUM(NVL(g.quantity,0)) quant FROM supermag.smcard[BASE2] crd INNER JOIN supermag.sacardclass cls ON cls.id=crd.idclass LEFT OUTER JOIN supermag.smgoods[BASE2] g ON g.article=crd.article [FILTER_LOC_BASE2] WHERE 1=1 [FILTER_CLASS_BASE2] GROUP BY crd.article, cls.tree||' '||cls.name, supermag.Classifier.NORMALIZECLASSIF(cls.tree), crd.name) b2 ON b1.article=b2.article WHERE 1=1 [POSITIVE_GOODS] [DIFFERENT_GOODS] ORDER BY tree ASC, article ASC ";
string qDBLinkTitle="SELECT pl.title FROM supermag.dblink$names dn INNER JOIN supermag.smpostlocations pl ON dn.id_postloc=pl.id WHERE dn.status=1 ORDER BY title ASC ";
string qDBLinkName="SELECT '@'||name FROM supermag.dblink$names dn INNER JOIN supermag.smpostlocations pl ON dn.id_postloc=pl.id WHERE pl.title='[TITLE]' ";
string sLocName;
string sGroupName;
string BASE2;
string base2;
string FILTER_CLASS;
string FILTER_LOC;
string FILTER_CLASS_BASE2;
string FILTER_LOC_BASE2;
string DIFFERENT_GOODS="";
string POSITIVE_GOODS="";
RepHost host;
private void _StartReport(object sender, EventArgs e)
{
// Хост отчёта
host = new RepHost(Report);
host.TableDataSourcePreInit("DBLinkTitle", qDBLinkTitle);
}
private void btnOk_Click(object sender, EventArgs e)
{
base2=(string)secondDbCombo.SelectedItem;
BASE2= RepOracleRunner.ExecuteScalar<string>(host.Connection, Replace(qDBLinkName,"[TITLE]",base2));
//Параметризация главного запроса
prepareMainSQL();
// подзаголовок отчета: места хранения
sLocName = RepOracleRunner.ExecuteScalar<string>(host.Connection, "select supermag.RepTools.LocString(10) from dual");
// подзаголовок отчета: группы товаров
sGroupName = RepOracleRunner.ExecuteScalar<string>(host.Connection, "select supermag.RepTools.ClassString(10) from dual");
host.TableDataSourcePreInit("MainSQL", qMainSQL);
}
private void prepareMainSQL(){
if (ToInt32(Report.GetParameterValue("P_FLAG1"))==1){
POSITIVE_GOODS=" AND (NVL(b1.quant,0) > 0 OR NVL(b2.quant,0) > 0) ";
}
if (ToInt32(Report.GetParameterValue("P_FLAG2"))==1){
DIFFERENT_GOODS=" AND (NVL(b1.quant,0) != NVL(b2.quant,0)) ";
}
// фильтр по местам хранения
RepOracleRunner.ExecuteProcedure(host.Connection,"Supermag.RepTools.LoadLoc",
Report.GetParameterValue("P_STORED_ALL"),
Report.GetParameterValue("P_STORED_NAME"),
null,
null);
// фильтр по группам товаров
RepOracleRunner.ExecuteProcedure(host.Connection,"Supermag.RepTools.LoadClass",
Report.GetParameterValue("P_GROUP_ALL"),
Report.GetParameterValue("P_BGROUP"),
Report.GetParameterValue("P_GROUP_TREE"));
/*
//Не нашел способа выполнить процедуры наполнения временных таблиц в удаленной базе
// фильтр по местам хранения
RepOracleRunner.ExecuteProcedure(host.Connection,"Supermag.RepTools.LoadLoc"+BASE2,
Report.GetParameterValue("P_STORED_ALL"),
Report.GetParameterValue("P_STORED_NAME"),
null,
null);
// фильтр по группам товаров
RepOracleRunner.ExecuteProcedure(host.Connection,"Supermag.RepTools.LoadClass"+BASE2,
Report.GetParameterValue("P_GROUP_ALL"),
Report.GetParameterValue("P_BGROUP"),
Report.GetParameterValue("P_GROUP_TREE"));
*/
FILTER_LOC=RepOracleRunner.ExecuteScalar<string>(host.Connection, "SELECT supermag.reptools.locstring (0, 'g.storeloc') FROM dual");
FILTER_CLASS=RepOracleRunner.ExecuteScalar<string>(host.Connection, "SELECT supermag.reptools.classstring (4, 'crd') FROM dual");
//FILTER_LOC_BASE2=RepOracleRunner.ExecuteScalar<string>(host.Connection, "SELECT supermag.reptools.locstring"+BASE2+" (0, 'g.storeloc') FROM dual");
//FILTER_CLASS_BASE2=RepOracleRunner.ExecuteScalar<string>(host.Connection, "SELECT supermag.reptools.classstring"+BASE2+" (4, 'crd') FROM dual");
qMainSQL=Replace(qMainSQL,"[FILTER_LOC]",FILTER_LOC);
qMainSQL=Replace(qMainSQL,"[FILTER_CLASS]",FILTER_CLASS);
qMainSQL=Replace(qMainSQL,"[FILTER_LOC_BASE2]",FILTER_LOC);
qMainSQL=Replace(qMainSQL,"[FILTER_CLASS_BASE2]",FILTER_CLASS);
qMainSQL=Replace(qMainSQL,"[POSITIVE_GOODS]",POSITIVE_GOODS);
qMainSQL=Replace(qMainSQL,"[DIFFERENT_GOODS]",DIFFERENT_GOODS);
qMainSQL=Replace(qMainSQL,"[BASE2]",BASE2);
}
}
}