29.06.2017 18:28
АндрейСупермаг
 
Существует "пользовательский" отчет - "Оперативная сверка остатков" производящий сверку между СО и удаленными базами магазинов. И естественно возникла необходимость добавить в описание отчета новые магазины, добавляю данные в таблицу 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=&quot; 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 &quot;;
string qDBLinkTitle=&quot;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 &quot;;
string qDBLinkName=&quot;SELECT '@'||name FROM supermag.dblink$names dn INNER JOIN supermag.smpostlocations pl ON dn.id_postloc=pl.id WHERE pl.title='[TITLE]' &quot;;
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=&quot;&quot;;
string POSITIVE_GOODS=&quot;&quot;;

RepHost host;

private void _StartReport(object sender, EventArgs e)
{

// Хост отчёта
host = new RepHost(Report);
host.TableDataSourcePreInit(&quot;DBLinkTitle&quot;, qDBLinkTitle);
}

private void btnOk_Click(object sender, EventArgs e)
{
base2=(string)secondDbCombo.SelectedItem;
BASE2= RepOracleRunner.ExecuteScalar&lt;string&gt;(host.Connection, Replace(qDBLinkName,&quot;[TITLE]&quot;,base2));

//Параметризация главного запроса
prepareMainSQL();
// подзаголовок отчета: места хранения
sLocName = RepOracleRunner.ExecuteScalar&lt;string&gt;(host.Connection, &quot;select supermag.RepTools.LocString(10) from dual&quot;);
// подзаголовок отчета: группы товаров
sGroupName = RepOracleRunner.ExecuteScalar&lt;string&gt;(host.Connection, &quot;select supermag.RepTools.ClassString(10) from dual&quot;);

host.TableDataSourcePreInit(&quot;MainSQL&quot;, qMainSQL);

}

private void prepareMainSQL(){
if (ToInt32(Report.GetParameterValue(&quot;P_FLAG1&quot;))==1){
POSITIVE_GOODS=&quot; AND (NVL(b1.quant,0) &gt; 0 OR NVL(b2.quant,0) &gt; 0) &quot;;
}

if (ToInt32(Report.GetParameterValue(&quot;P_FLAG2&quot;))==1){
DIFFERENT_GOODS=&quot; AND (NVL(b1.quant,0) != NVL(b2.quant,0)) &quot;;
}

// фильтр по местам хранения
RepOracleRunner.ExecuteProcedure(host.Connection,&quot;Supermag.RepTools.LoadLoc&quot;,
Report.GetParameterValue(&quot;P_STORED_ALL&quot;),
Report.GetParameterValue(&quot;P_STORED_NAME&quot;),
null,
null);

// фильтр по группам товаров
RepOracleRunner.ExecuteProcedure(host.Connection,&quot;Supermag.RepTools.LoadClass&quot;,
Report.GetParameterValue(&quot;P_GROUP_ALL&quot;),
Report.GetParameterValue(&quot;P_BGROUP&quot;),
Report.GetParameterValue(&quot;P_GROUP_TREE&quot;));

/*
//Не нашел способа выполнить процедуры наполнения временных таблиц в удаленной базе
// фильтр по местам хранения
RepOracleRunner.ExecuteProcedure(host.Connection,&quot;Supermag.RepTools.LoadLoc&quot;+BASE2,
Report.GetParameterValue(&quot;P_STORED_ALL&quot;),
Report.GetParameterValue(&quot;P_STORED_NAME&quot;),
null,
null);

// фильтр по группам товаров
RepOracleRunner.ExecuteProcedure(host.Connection,&quot;Supermag.RepTools.LoadClass&quot;+BASE2,
Report.GetParameterValue(&quot;P_GROUP_ALL&quot;),
Report.GetParameterValue(&quot;P_BGROUP&quot;),
Report.GetParameterValue(&quot;P_GROUP_TREE&quot;));
*/

FILTER_LOC=RepOracleRunner.ExecuteScalar&lt;string&gt;(host.Connection, &quot;SELECT supermag.reptools.locstring (0, 'g.storeloc') FROM dual&quot;);
FILTER_CLASS=RepOracleRunner.ExecuteScalar&lt;string&gt;(host.Connection, &quot;SELECT supermag.reptools.classstring (4, 'crd') FROM dual&quot;);
//FILTER_LOC_BASE2=RepOracleRunner.ExecuteScalar&lt;string&gt;(host.Connection, &quot;SELECT supermag.reptools.locstring&quot;+BASE2+&quot; (0, 'g.storeloc') FROM dual&quot;);
//FILTER_CLASS_BASE2=RepOracleRunner.ExecuteScalar&lt;string&gt;(host.Connection, &quot;SELECT supermag.reptools.classstring&quot;+BASE2+&quot; (4, 'crd') FROM dual&quot;);

qMainSQL=Replace(qMainSQL,&quot;[FILTER_LOC]&quot;,FILTER_LOC);
qMainSQL=Replace(qMainSQL,&quot;[FILTER_CLASS]&quot;,FILTER_CLASS);
qMainSQL=Replace(qMainSQL,&quot;[FILTER_LOC_BASE2]&quot;,FILTER_LOC);
qMainSQL=Replace(qMainSQL,&quot;[FILTER_CLASS_BASE2]&quot;,FILTER_CLASS);
qMainSQL=Replace(qMainSQL,&quot;[POSITIVE_GOODS]&quot;,POSITIVE_GOODS);
qMainSQL=Replace(qMainSQL,&quot;[DIFFERENT_GOODS]&quot;,DIFFERENT_GOODS);
qMainSQL=Replace(qMainSQL,&quot;[BASE2]&quot;,BASE2);
}
}

}
29.06.2017 18:41
vdm
 
Цитата:
АндрейСупермаг добавляю данные в таблицу dblink$names и получаю сообщение:
ORA-02019: описание соединения для удаленной БД не найдено.
А собственно объекты dblink в БД отчета на удаленные базы были созданы, или их отчет сам создает?
Не из отчета, из sqlplus например, эти базы через dblink доступны?
30.06.2017 06:35
Mtirt
 
Ага, и любой простой select по этому dblink что дает?
30.06.2017 07:52
АндрейСупермаг
 
протестировал запрос к двум базам, 1- старая откликнулась,
2- новая дала вот такой ответ.
ORA-02019: описание соединения для удаленной БД не найдено
Объекты dblink прописаны в таблице dblink$names т.е. отчет к ним обращается (если я правильно вопрос понял).
30.06.2017 07:54
АндрейСупермаг
 
такой ответ при запросе из Navicat ORA-02019: описание соединения для удаленной БД не найдено
30.06.2017 07:57
OlegON
 
Сами линки есть или нет?
30.06.2017 08:07
Mtirt
 
Как создается dblink к новой базе?

Полный синтаксис create database link можете привести?
30.06.2017 12:12
dragonEr
 
а в tnsnames на сервере откуда линк запускаете новая база прописана?
03.07.2017 04:37
АндрейСупермаг
 
Нашел (спасибо за вопросы). нужно было еще задать описание в Publik database link:

Создаём линк (link) на другую базу:
create public database link mylink connect to user identified by password using 'db01';
Где:

mylink - имя линка, которое мы хотим использовать;
user - пользователь, под которым можно осуществить соединение с внешней базой данных;
password - пароль этого пользователя;
'db01' - строка подключения, которая должна быть обязательно(!) в одинарных кавычках. Так же обязательно присутствие этой строки в tnsnames.ora.

Кстати в tnsnames было описание только головной базы, хотя как я понял там должны быть все базы описаны.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.