Форум OlegON > Программы и оборудование для автоматизации торговли > Системы автоматизации торговли > Супермаг Плюс (Супермаг 2000)

Помогите советом по работе с отчетами : Супермаг Плюс (Супермаг 2000)

25.04.2024 17:13


21.05.2021 09:06
redesupar
 
1. Посоветуйте нормальную документацию, то что у разработчиков она более свежая и честно мало чего дало. У нас то что идет в комплекте с СМ, версия 1.9.2 довольно старая) или может есть курсы или специалист что за плату покажет основы работы

2. И помогите пожалуйста с отчетом, стоит очень срочная задача, не могу сделать очень простую вещь.
Отчет выводит артикули и наименование товара, хотел сделать чтобы можно было группировать по категориям, но все рушится. Не видит NormTree как я понял это прямо в запросе надо писать, а как и что непонятно. Делал по аналогии с другими отчетами которые выводят нормально.

Ошибка

Цитата:
2021.05.21 (Friday) 15:05:38 1.43.1.0 sp4 Sm.Main ( NREPOR )
----- Прерывание работы программы -----
сообщение: "ORA-00904: "T_CLASS"."NORMTREE": недопустимый идентификатор"
исключение: Oracle.ManagedDataAccess.Client.OracleException
источник: Oracle Data Provider for .NET, Managed Driver
данные: соединено с: База данных=CO; Пользователь=Павлов
текст команды: SELECT c.article, c.name ,t_class.Tree||' '||t_class.ClassName NormTree,t_class.NormTree GroupName FROM supermag.smcard c, (select ost.article, sum(ost.quantity) qty from supermag.smgoods ost group by ost.article ) ost, (select distinct logi.article from supermag.smcardsecuritylog logi where logi.actioncode=1 and logi.eventtime>=current_date-180 ) clog, (select distinct s.article from supermag.smdocuments d, supermag.smspec s where d.doctype in ('OR', 'WI', 'WO', 'IW', 'CS', 'CR', 'PO', 'PN', 'PE') and s.doctype=d.doctype and s.docid=d.id and d.createdat>=current_date-180 and d.docstate>=2 ) docs WHERE c.accepted=1 AND c.datatype<>5 AND ost.article(+)=c.article AND clog.article(+)=c.article AND docs.article(+)=c.article AND NVL(ost.qty, 0)=0 AND clog.article is null AND docs.article is null ORDER BY NormTree
тип команды: Text
метод: Boolean ReadBuffer(System.Collections.ObjectModel.ReadOnlyCollection`1[TRecord] ByRef)
в Sm.BusinessServer.BackgroundReaderBase`1.ReadBuffer(ReadOnlyCollection`1& result)
в Sm.FastReports.Server.FastReportBO.Sm.FastReports.Link.IFastReportBO.FillTableDataNext(BusinessOperation businessOperation, ReadOnlyCollection`1& dataTable)
в Sm.FastReports.SupermagFastReportConnection.<>c__DisplayClass8.<FillTableData>b__5(IFastReportBO bo)
в Sm.BusinessServer.LocalServer.LocalClient`1.Do(Action`1 action)
в Sm.FastReports.SupermagFastReportConnection.TransactedBusinessObject.Do(Action`1 action)
в Sm.FastReports.SupermagFastReportConnection.FillTableData(DataTable table, String selectCommand, CommandParameterCollection parameters)
в FastReport.Data.DataConnectionBase.FillTable(TableDataSource source)
в FastReport.Data.TableDataSource.LoadData(ArrayList rows)
в FastReport.Data.DataSourceBase.Init(Relation relation, String filter, SortCollection sort, Boolean useAllParentRows)
в FastReport.Data.DataSourceBase.Init(DataSourceBase parentData, String filter, SortCollection sort, Boolean useAllParentRows)
в FastReport.DataBand.InitDataSource()
в FastReport.GroupHeaderBand.InitDataSource()
в FastReport.Engine.ReportEngine.RunGroup(GroupHeaderBand groupBand)
в FastReport.Engine.ReportEngine.RunBands(BandCollection bands)
в FastReport.Engine.ReportEngine.RunReportPage(ReportPage page)
в FastReport.Engine.ReportEngine.RunReportPages()
в FastReport.Engine.ReportEngine.RunReportPages(ReportPage page)
в FastReport.Engine.ReportEngine.Run(Boolean runDialogs, Boolean append, ReportPage page)
в FastReport.Report.Prepare(Boolean append)
в Sm.FastReports.Domain.FastReportDomainModel.ExecuteReport(Report report, String reportFile, ReportParametersList commonParameters, ReportParametersList objectParameters, Int32 moduleRole, Int32 functionRole)
в Sm.FastReports.Domain.FastReportDomainPanel.Report_DoWork(Object sender, TaskWorkEventArgs`3 e)
в Sm.Core.TaskWorker`3.OnDoWork(DoWorkEventArgs e)
в Sm.Core.TaskWorkerBase.InternalBackgroundWorker.OnDoWork(DoWorkEventArgs e)
в System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)
Сам код.

SQL код:
<?xml version="1.0" encoding="utf-8"?>
<Report ScriptLanguage="CSharp" ReferencedAssemblies="System.dll System.Drawing.dll System.Windows.Forms.dll System.Data.dll System.Xml.dll System.Data.OracleClient.dll Sm.Objects.dll Sm.Interfaces.dll Sm.Core.dll Sm.Forms.dll Sm.AppServer.Interfaces.dll Sm.AppServer.Link.dll Sm.FastReports.dll Sm.FastReports.Link.dll" ConvertNulls="false" StartReportEvent="_StartReport" ReportInfo.Created="06/22/2010 10:01:00" ReportInfo.Modified="04/20/2017 21:51:26" ReportInfo.CreatorVersion="1.9.2.0">
  <ScriptText>
  using System;
  using System.Collections;
  using System.Collections.Generic;
  using System.Collections.ObjectModel;
  using System.ComponentModel;
  using System.Windows.Forms;
  using System.Drawing;
  using System.Data;
  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
  {
    RepHost host;
  
  // название отчета
    private string sRepName = &quot;Какой то отчет&quot;;
    // подзаголовок отчета: места хранения
    private string sLocName;
    // подзаголовок отчета: группы товаров
    private string sGroupName;
    // подзаголовок отчета: период отчета
    private string sDateName;
    // контрагент &quot;От имени&quot;
    private string sUserName;

    
    private void _StartReport(object sender, EventArgs e)
      {
        // Хост отчёта даёт доступ к полезным сервисам
        host = new RepHost(Report);
        // Стартуем транзакцию
        RepTransaction transaction = new RepTransaction(host.Connection);
        
        // контрагент &quot;От имени&quot;
      sUserName = RepClientInfo.GetClientName(host.Connection, Report.GetParameterValue(&quot;P_USER_ID&quot;));
      // заголовок отчета
      sRepName = &quot;Остатки по состоянию на &quot; + ToString(Report.GetParameterValue(&quot;P_DATE&quot;));

       // фильтр по местам хранения
      RepOracleRunner.ExecuteProcedure(host.Connection,&quot;Supermag.RepTools.LoadLoc&quot;, 
        Report.GetParameterValue(&quot;P_STORED_ALL&quot;),
        Report.GetParameterValue(&quot;P_STORED_NAME&quot;),
        Report.GetParameterValue(&quot;P_PARTNER&quot;),
        null); 
      // подзаголовок отчета: места хранения
      sLocName = RepOracleRunner.ExecuteScalar&lt;string&gt;(host.Connection, &quot;select supermag.RepTools.LocString(10) from dual&quot;);
             
      // фильтр по группам товаров
      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;));                               
      // подзаголовок отчета: группы товаров
      sGroupName = RepOracleRunner.ExecuteScalar&lt;string&gt;(host.Connection, &quot;select supermag.RepTools.ClassString(10) from dual&quot;);
     
      // группировка по группам товаров
      if ( ReportGroupClassOption.No == ToInt32(Report.GetParameterValue(&quot;P_GROUP_ALL&quot;)) )
      {
        GroupHeaderClass.Visible = false;
        GroupFooterClass.Visible = false;
      }
      // подзаголовок отчета: группы товаров
      sGroupName = RepOracleRunner.ExecuteScalar&lt;string&gt;(host.Connection, &quot;select supermag.RepTools.ClassString(10) from dual&quot;);
      
      // подзаголовок отчета: период отчета
      string sFirstDate = ToString(Report.GetParameterValue(&quot;P_FIRSTDATE&quot;));
      string sLastDate = ToString(Report.GetParameterValue(&quot;P_LASTDATE&quot;));
      int iCountDay = (RepConvert.ToSmDate(sLastDate)-RepConvert.ToSmDate(sFirstDate)).Days;
      string sCountDay = Safe.ToSqlNumber( iCountDay );
      sDateName = &quot;с &quot;+sFirstDate+&quot; по &quot;+sLastDate+&quot; ( &quot;+sCountDay+&quot; дн. )&quot;;
   
 // данные отчета
    string sSQL = 
    SqlFormat(&quot; SELECT c.article, c.name  &quot;+
            &quot;,{0:U} NormTree&quot;+
            &quot;,{1:U} GroupName&quot;+
&quot;  FROM supermag.smcard c, &quot;+
&quot;       (select ost.article, sum(ost.quantity) qty &quot;+
&quot;          from supermag.smgoods ost &quot;+
&quot;         group by ost.article &quot;+
&quot;       ) ost,  &quot;+
&quot;       (select distinct logi.article &quot;+
&quot;          from supermag.smcardsecuritylog logi &quot;+
&quot;         where logi.actioncode=1 &quot;+
&quot;           and logi.eventtime>=current_date-180 &quot;+
&quot;       ) clog, &quot;+
&quot;       (select distinct s.article &quot;+
&quot;          from supermag.smdocuments d, supermag.smspec s  &quot;+
&quot;         where d.doctype in ('OR', 'WI', 'WO', 'IW', 'CS', 'CR', 'PO', 'PN', 'PE') &quot;+
&quot;           and s.doctype=d.doctype and s.docid=d.id &quot;+
&quot;           and d.createdat>=current_date-180 &quot;+
&quot;           and d.docstate>=2 &quot;+
&quot;       ) docs &quot;+
&quot; WHERE c.accepted=1 AND c.datatype&lt;&gt;5 &quot;+
&quot;    AND ost.article(+)=c.article &quot;+
&quot;    AND clog.article(+)=c.article &quot;+
&quot;    AND docs.article(+)=c.article &quot;+
&quot;    AND NVL(ost.qty, 0)=0  &quot;+
&quot;    AND clog.article is null &quot;+
&quot;    AND docs.article is null &quot;+
 &quot; ORDER BY NormTree &quot;
      // выражения для группировки по группам товаров
      , RepOracleRunner.ExecuteScalar&lt;string&gt;(host.Connection,&quot;Select supermag.RepTools.ClassString(14) from dual&quot;)
      , RepOracleRunner.ExecuteScalar&lt;string&gt;(host.Connection,&quot;Select supermag.RepTools.ClassString(0) from dual&quot;)
      ); 



      host.TableDataSourcePreInit(&quot;RepData&quot;, sSQL);      
      }
  } 
}  
  
</ScriptText>
  <Dictionary>
    <SupermagFastReportConnection Name="Connection" LoginPrompt="true">
      <TableDataSource Name="Table2" Alias="RepData" DataType="System.Int32" Enabled="true" SelectCommand="SELECT   NormTree ,'' GroupName  ,'' ARTICLE  '' NAME ''">
        <Column Name="NORMTREE" DataType="System.String"/>
        <Column Name="GROUPNAME" DataType="System.String"/>       
       <Column Name="ARTICLE" DataType="System.String"/>
        <Column Name="NAME" DataType="System.String"/>
      </TableDataSource>
    </SupermagFastReportConnection>
    <Relation Name="DocSpec_DocSpecScale" ParentDataSource="Table2" ChildDataSource="null" ParentColumns="SPECITEM" ChildColumns="SPECITEM" Enabled="true"/>
    <Parameter Name="P_STORED_ALL" DataType="System.Int32"/>
    <Parameter Name="P_STORED_NAME" DataType="System.String"/>
    <Parameter Name="P_PARTNER" DataType="System.Int32"/>
    <Parameter Name="P_BGROUP" DataType="System.Int32"/>
    <Parameter Name="P_GROUP_ALL" DataType="System.Int32"/>
    <Parameter Name="P_GROUP_TREE" DataType="System.String"/>
    <Parameter Name="P_FIRSTDATE" DataType="System.String"/>
    <Parameter Name="P_LASTDATE" DataType="System.String"/>
    <Parameter Name="P_SURNAME" DataType="System.String"/>
    <Parameter Name="P_USER_ID" DataType="System.Int32"/>
    <Parameter Name="P_DATE" DataType="System.String"/>
  </Dictionary>
<ReportPage Name="Page1" RawPaperSize="9" FirstPageSource="15" OtherPagesSource="15" Fill.Color="White" TitleBeforeHeader="false"  PaperWidth="280">
    <PageHeaderBand Name="PageHeader" Width="800.06" Height="40.12" CanGrow="true">
     
      
     
    </PageHeaderBand>
    

      <GroupHeaderBand Name="GroupHeaderClass" Top="199.51" Width="718.2" Height="22.68" CanGrow="true" KeepWithData="true" Condition="[RepData.NORMTREE]" SortOrder="None">
        <TextObject Name="Text140" Top="3.78" Width="710.64" Height="18.9" CanGrow="true" CanBreak="false" Text="[RepData.GROUPNAME]" VertAlign="Center" Font="Arial, 10pt, style=Bold"/>
    <DataBand Name="DataSpec" Top="167.1" Width="718.2"  CanGrow="true" DataSource="Table2" PrintIfDetailEmpty="true" PrintIfDatasourceEmpty="true" >
      <TextObject Name="txtArticle" VertAlign="Center"  Width="100" Height="29.00" CanGrow="true" CanBreak="false" Text="[RepData.ARTICLE]" HorzAlign="Left" Font="Arial, 8pt" Border.Lines="Right, Bottom, left,top" Border.Width="0.3" />
      <TextObject Name="txtNAME"  VertAlign="Center" Left="100" Width="700" Height="29.00" CanGrow="true" CanBreak="false" Text="[RepData.NAME]" Font="Arial, 8pt" Border.Lines=" Bottom, left, right,top" Border.Width="0.3"/>
    </DataBand>
        <GroupFooterBand Name="GroupFooterClass" Top="246.8" Width="718.2" Height="18.9" CanGrow="true">

        </GroupFooterBand>
      </GroupHeaderBand>
    
    
</ReportPage>
</Report>
21.05.2021 11:02
redesupar
 
Добавил с бд

Цитата:
// данные отчета
string sSQL =
SqlFormat(&quot; SELECT c.article, c.name, gru.normtree NORMTREE, gru.name GROUPNAME&quot;+
&quot; FROM supermag.smcard c, supermag.SACARDCLASS gru,&quot;+
&quot; (select ost.article, sum(ost.quantity) qty &quot;+
&quot; from supermag.smgoods ost &quot;+
&quot; group by ost.article &quot;+
&quot; ) ost, &quot;+
&quot; (select distinct logi.article &quot;+
&quot; from supermag.smcardsecuritylog logi &quot;+
&quot; where logi.actioncode=1 &quot;+
&quot; and logi.eventtime>=current_date-180 &quot;+
&quot; ) clog, &quot;+
&quot; (select distinct s.article &quot;+
&quot; from supermag.smdocuments d, supermag.smspec s &quot;+
&quot; where d.doctype in ('OR', 'WI', 'WO', 'IW', 'CS', 'CR', 'PO', 'PN', 'PE') &quot;+
&quot; and s.doctype=d.doctype and s.docid=d.id &quot;+
&quot; and d.createdat>=current_date-180 &quot;+
&quot; and d.docstate>=2 &quot;+
&quot; ) docs &quot;+
&quot; WHERE c.accepted=1 AND c.datatype<>5 &quot;+
&quot; AND ost.article(+)=c.article &quot;+
&quot; AND clog.article(+)=c.article &quot;+
&quot; AND docs.article(+)=c.article &quot;+
&quot; AND c.idclass=gru.id &quot;+
&quot; AND NVL(ost.qty, 0)=0 &quot;+
&quot; AND clog.article is null &quot;+
&quot; AND docs.article is null &quot;+
&quot; ORDER BY NORMTREE &quot;
нормально встал, только вот как сделать по главной группе сортировку? а то у меня до 4 подкатегории идёт
21.05.2021 11:03
redesupar
 
Точнее не сортировка, а Сверху типо написать FOOD и дальше идут уже подкатегории этого FOOD и далее?
21.05.2021 23:06
vdm
 
Цитата:
redesupar Точнее не сортировка, а Сверху типо написать FOOD и дальше идут уже подкатегории этого FOOD и далее?
Показали бы скриншотом, как сейчас и как хотите. Я например туплю и не понимаю, что нужно.
В документации что ищете? В доках по fastreport супермаговских фишек работы с ораклом (типа RepOracleRunner.ExecuteScalar) нет, там в основном про рисование блоков отчета по готовым данным.

Еще, по вашим вопросам складывается впечатление, что:
  1. Отчет редактируете прямо руками в xml? Если хотите чтобы количество желающих разобраться в вашей проблеме не стремилось к нулю - не выкладывайте куски сырого xml. Невозможно же продираться через все эти &quot; ! Показывайте текст из редактора отчетов - FastReport.Designer.exe.
  2. Запросы пишете тоже прямо в отчете? В sql среде а-ля SQL Developer/Toad и иже с ними надо отлаживать и готовое в отчет переносить, вопросов типа "почему не видит NormTree" меньше будет.
22.05.2021 11:33
Mtirt
 
Как вариант, можно прикладывать к сообщению файл отчета целиком.
22.05.2021 16:10
Cifer4th
 
Как по мне, бизнес-анализ куда более гибок в плане быстрой корректировки формата отображения и перечня данных, да и банально более прост в разработке. Достаточно выбрать подходящую искомую модель и добавить при необходимости нужную функцию в БД.
22.05.2021 19:23
svtl
 
У вас в принципе неверно запрос построен. Вы посмотрите - там нет таблицы с алиасом t_class в сообщении об ошибке.

вот этот код - , RepOracleRunner.ExecuteScalar&lt;string&gt;(host.Connection,&quot;Select supermag.RepTools.ClassString(14) from dual&quot;)
, RepOracleRunner.ExecuteScalar&lt;string&gt;(host.Connection,&quot;Select supermag.RepTools.ClassString(0) from dual&quot;)
при необходимости дает ссылку на ttidgroup с алиасом t_class - если в форме запуска выбор групп классификатора с какой-то
группировкой (все группы с группировкой по старшим группам либо перечень групп с любой группировкой).
Но это неявно, нельзя в запросе явно прописывать ссылку на поля t_class.
Если выбрать группы все с группировкой по всем группам, либо группы/ассортименты без группировки - t_class в запросе не появится,
соответственно, и ссылки на поля таблицы будут пустые.
Чтобы помочь, нужно (ИМХО)
- версия СМ
- файл отчета frx (frx как есть, не в xml)
- скан формы запуска отчета
Часовой пояс GMT +3, время: 17:13.

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