Как правильно выполнять запросы к базе данных из скриптов

Автор: | 8 апреля 2011

Под катом кусок исход­но­го кода.

Как правильно выполнять запросы к базе данных из скриптов: 14 комментариев

  1. Внедренец Автор записи

    Если у Вас в отчё­те име­ет­ся GroupHeaderBand, а под ним DataBand — то ито­го­вое поле с сум­мой {Sum (GroupHeaderBand1,Title.mdp_qu)} нуж­но раз­ме­щать НЕ на DataBand, а на допол­ни­тель­ном GroupFooterBand, раз­ме­щён­ном под ним! Т.е. под DataBand’ом добавь­те GroupFooterBand, и уже на нём отоб­ра­жай­те тек­сто­вые поля с ито­га­ми.

  2. Кирилл

    ПРОБЛЕМА РЕШЕНА

    Теперь тре­бу­ет­ся понять, поче­му она реши­лась)

    Что я сде­лал:
    в отчет доба­вил пустой дата­бенд с источ­ком Title, таб­ли­цей из кото­рой все берет­ся. Рас­по­ло­жил его над ДатаБенд1

    ДатаБенд1 оста­вил без источ­ни­ка.

    Теперь струк­ту­ра тако­ва:

    -ReportTitleBand1
    ‑GroupHeaderBand1
    ‑DataBand2 (Data Source = Title)
    ‑DataBand1 (Not Assigned)
    ‑Table1

    Поче­му сра­бо­та­ло? Пере­во­жусь на гум­фак после таких мета­мор­фоз)

  3. Кирилл

    К тому же посту:

    сде­лал отчет, в кото­ром тести­рую как да что с коли­че­ством изде­лий.
    В нем:
    ‑ReportTitleBand
    ‑GroupHeadrBand (Condition = Title.idmanufactdoc)
    ‑DataBand

    Заго­ло­вок пустой.
    В дата­бен­де тек­сто­вое поле: Number of positions: {Sum(GroupHeaderBand1,Title.mdp_qu)}
    То есть, поле долж­но пока­зы­вать то самое коли­че­ство изде­лий в ПЗ.

    Наблю­даю инте­рес­ную вещь:

    1)Если в дата­бен­де ука­зать источ­ник таб­ли­цу Title, то в отче­те пока­зы­ват коли­че­ство изде­лий пра­виль­но, но в 4 стро­ки (отку­да??), то есть вижу в отче­те:

    Number of positions: 15
    Number of positions: 15
    Number of positions: 15
    Number of positions: 15

    2) Если в дата­бен­де убрать источ­ник (Not Assigned), то отчет пока­зы­ва­ет непра­виль­ное коли­че­ство изде­лий (1), но в 1 стро­ку:

    Number of positions: 1

    По сек­ре­ту, это коли­че­ство изде­лий послед­не­го наиме­но­ва­ния.

    3) Если вме­сто источ­ни­ка дан­ных в дата бен­де ука­зать Count Data, к при­ме­ру 1, то резуль­тат такой же, как во 2 пунк­те.

    Лажа. Не имею ни малей­ше­го пред­став­ле­ния поче­му так. Хочет­ся, что­бы было пра­виль­но коли­че­ство изде­лий, как в пунк­те 1, но в 1 стро­ку, как в пунк­те 2.

    Поче­му так про­ис­хо­дит? Как испра­вить?

  4. Кирилл

    Резуль­тат такой же, как и без исполь­зо­ва­ния групп хидер бэнд, если чест­но

  5. Кирилл

    К преды­ду­ще­му еще 1 допол­не­ние:

    про­бо­вал груп­пи­ро­вать (Писать в Group header band) по дру­го­му атри­бу­ту: по внут­рен­не­му номер (id) зака­за. Это непра­виль­но с точ­ки зре­ния биз­нес логи­ки, но не видел, что­бы ПЗ фор­ми­ро­ва­лись на осно­ве несколь­ких зака­зов, да и попро­бо­вать сто­и­ло. Резуль­тат тот же: счи­та­ет толь­ко коли­че­ство изде­лий по пер­во­му наиме­но­ва­нию(

  6. Кирилл

    К преды­ду­ще­му посту:

    отчет счи­та­ет коли­че­ство изде­лий пер­во­го наиме­но­ва­ния, а дол­жен коли­че­ство изде­лий во всем ПЗ, то есть по всем наиме­но­ва­ни­ям.

  7. Кирилл

    Здрав­ствуй­те!

    Я опять с отче­та­ми)

    Есть отчет Тех кар­та, в тайтл бен­де кото­ро­го 1 из полей — коли­че­ство изде­лий. Долж­но счи­тать, как это ни стран­но, колич­ство изде­лий во всем ПЗ))

    С ним и про­бле­ма. Счи­та­ет толь­ко коли­че­ство изде­лий пер­во­го наиме­но­ва­ния.
    Допу­стим, в ПЗ 5 окон (пер­вый пункт) и 10 две­рей (вто­рой пункт). Отчет пока­жет коли­че­ство изде­лий = 5, что, оче­вид­но, невер­но: долж­но быть 15.
    Если в зака­зе все­го 1 наиме­но­ва­ние, к при­ме­ру, 15 окон, то счи­та­ет вер­но.
    То есть в учет идет толь­ко 1 наиме­но­ва­ние.

    Опять же, делал все, как в отче­те, в кото­ром это коли­че­ство счи­та­ет­ся пра­виль­но:
    запрос, вывод в отчет, GroupHeaderBand.

    Про груп хидер бенд (GroupHeaderBand1).

    Усло­вие (Condition) в нем атри­бут idmanufactdoc, отоб­ра­жа­ю­щий внут­рен­ний уни­каль­ный номер ПЗ.
    Выби­ра­ет­ся в том же запро­се, что и коли­че­ство изде­лий.
    Коли­че­ство изде­лий счи­та­ет­ся по груп­пе с оди­на­ко­вым номе­ром ПЗ idmanufactdoc:

    Sum(GroupHeaderBand1,Title.mdp_qu)

    Из таб­ли­цы Title mdp_qu — коли­че­ство изде­лий
    GroupHeaderBand1 — груп­пи­ру­ю­щий бэнд с атри­бу­том груп­пи­ров­ки idmanufactdoc

    Где я мог нако­ся­чить? Что мож­но испра­вить?
    Зара­нее спа­си­бо!

  8. Кирилл

    Спа­си­бо огром­ное!
    Боль­ше меся­ца голо­ву ломал над ста­ры­ми отче­та­ми, а теперь еще и новый соста­вить нуж­но, Вы мне очень помог­ли

  9. Внедренец Автор записи

    » Как мож­но доба­вить пара­метр в запрос, так что­бы он был ини­ци­а­ли­зи­ро­ван?
    » Для при­ме­ра, пара­метр idorder в усло­вии
    » where mc.idorder = {idorder} дол­жен быть ини­ци­а­ли­зи­ро­ван номе­ром зака­за типа int.

    Для того что­бы доба­вить пара­метр в отчёт на ста­дии про­ек­ти­ро­ва­ния нуж­но во вклад­ке “Сло­варь” (если она скры­та — вклю­чи­те галоч­ку в меню ‘Вид’ постро­и­те­ля отчё­тов) най­ти пункт “Пере­мен­ные” (он нахо­дит­ся чуть ниже пунк­та “Источ­ни­ки дан­ных”, в кото­ром опи­сы­ва­ют­ся сами sql-запро­сы). Щёлк­ни­те пра­вой кла­ви­шей мыши по пунк­ту “Пере­мен­ные” и в открыв­шем­ся кон­текст­ном меню выбе­ри­те под­пункт “Новая пере­мен­ная …”. Появит­ся диа­ло­го­вое окно, в кото­ром и ука­зы­ва­ют­ся: наиме­но­ва­ние пере­мен­ной (напри­мер, idorder), её тип (стро­ка, чис­ло и т.п.), зна­че­ние по умол­ча­нию (напри­мер, 12345, имен­но это зна­че­ние под­ста­вит­ся в sql-запрос в стро­ке вида: ” where mc.idorder = {idorder} ”). Гене­ра­тор отчё­тов сам сфор­ми­ру­ет необ­хо­ди­мый код и на вклад­ке Code будет сге­не­ри­ро­ва­на стро­ка типа: “public int idorder;” Ниче­го допи­сы­вать, изме­нять, уда­лять на вклад­ке с кодом не нуж­но, всё дела­ет­ся вруч­ную визу­аль­но через интер­фейс само­го постро­и­те­ля отчё­тов. Когда любой отчёт вызы­ва­ет­ся из про­грам­мы winDraw, то в соот­вет­ству­ю­щих пере­мен­ных кор­рек­ти­ру­ет­ся зна­че­ние на теку­щее (напри­мер idorder ста­нет рав­ным клю­чу имен­но того зака­за, для кото­ро­го мы вызва­ли этот отчёт).

  10. Кирилл

    У меня еще 1 вопрос из той же темы.

    Как мож­но доба­вить пара­метр в запрос, так что­бы он был ини­ци­а­ли­зи­ро­ван?

    Для при­ме­ра, пара­метр idorder в усло­вии
    where mc.idorder = {idorder} дол­жен быть ини­ци­а­ли­зи­ро­ван номе­ром зака­за типа int. В рабо­чих запро­сах он при­сут­ству­ет в коде вот так:

    public int idorder;

    public override void SaveState(System.String stateName)
    {
    base.SaveState(stateName);
    this.States.PushInt(stateName, this, “idorder”, this.idorder);
    this.States.Push(stateName, this, “PeopleFio”, this.PeopleFio);
    this.States.Push(stateName, this, “filt”, this.filt);
    }

    public override void RestoreState(System.String stateName)
    {
    base.RestoreState(stateName);
    this.idorder = this.States.PopInt(stateName, this, “idorder”);
    this.PeopleFio = ((string)(this.States.Pop(stateName, this, “PeopleFio”)));
    this.filt = ((string)(this.States.Pop(stateName, this, “filt”)));
    }

    private void InitializeComponent()
    {
    this.Dictionary.Variables.Add(new Stimulsoft.Report.Dictionary.StiVariable(“basic”, “idorder”, “idorder”, “”, typeof(int), “1257”, false, Stimulsoft.Report.Dictionary.StiVariableInitBy.Value, false));
    this.idorder = 1257;
    this.header.Columns.AddRange(new Stimulsoft.Report.Dictionary.StiDataColumn[] {
    new Stimulsoft.Report.Dictionary.StiDataColumn(“idorder”, “idorder”, “idorder”, typeof(int)), // дру­гие кор­те­жи таб­ли­цы..))
    }

    public class headerDataSource : Stimulsoft.Report.Dictionary.StiSqlSource
    {
    public virtual int idorder
    {
    get
    {
    return ((int)(StiReport.ChangeType(this[“idorder”], typeof(int), true)));
    }
    }
    }

    В про­шлом ком­мен­та­рии я напи­сал, что код не полу­ча­ет­ся редак­ти­ро­вать.
    Если есть спо­соб обой­тись без пря­мой редак­ции кода так, что­бы он все рав­но был сге­не­ри­ро­ван для пара­мет­ров запро­са (к прим. {idorder}), озна­комь­те меня с ним, пожа­луй­ста.

  11. Кирилл

    Внед­ре­нец, спа­си­бо за ответ.
    Я все же хочу замо­ро­чить­ся с суб­ре­пор­та­ми)
    Есть ряд отче­тов с ними, кото­рые рабо­та­ют, хочу изме­нить тот, кото­рый рабо­та­ет, но непра­виль­но. Вот.

    Одна из оши­бок воз­ни­ка­ет с запро­са­ми с пара­мет­ра­ми . То есть в запро­се все норм, про­сто беру и копи­рую из дру­го­го рабо­че­го запро­са, не все­гда даже изме­няю. Один из пара­мет­ров пере­да­ет­ся нажа­ти­ем кноп­ки, фор­ми­ро­ва­ние дру­го­го про­ис­хо­дит на эта­пе постро­е­ния запро­са, опи­сы­ва­ют­ся пара­мет­ры в коде (в коде рабо­та­ю­щих отче­тов), каза­лось бы все норм.

    Делаю ана­ло­гич­ные запро­сы, такие же пара­мет­ры, делаю кноп­ку, добав­ляю на нее собы­тие (2 раза нажи­маю, пишу туда усло­вие, зада­ю­щее пара­метр), но в коде они авто­ма­ти­че­ски не гене­рят­ся и выда­ет­ся ошиб­ка “The error of compilation is found in the ‘Report’ report: Имя ‘idorder’ отсут­ству­ет в теку­щем кон­тек­сте”.
    (в запро­се пара­метр пере­да­ет­ся так: where mc.idorder = {idorder})

    Код на c# (не знаю, быва­ют ли вид­роу с дру­ги­ми). Нуж­но ини­ци­а­ли­зи­ро­вать там эти пара­мет­ры. Впи­сы­ваю туда стро­ки, но они не сохра­ня­ют­ся. То есть пишу стро­ку, пере­хо­жу во вклад­ку Page, потом обрат­но в код и вне­сен­ные изме­не­ния исче­за­ют. Либо во вклад­ке код вно­шу изме­не­ния, все сохра­няю, как обыч­но, выхо­жу из отче­та, при­ме­няю изме­не­ния, сно­ва захо­жу в редак­ти­ро­ва­ние это­го отче­та и опять в коде нет вне­сен­ных изме­не­ний!

    Преды­ду­щая про­грам­мист­ка ска­за­ла, что так код не редак­ти­ру­ет­ся, это дела­ет­ся в каком-то отдель­ном окне. Окно по-чест­но­му искал, не нашел.

    В свя­зи с этим вопрос, как вруч­ную мож­но редак­ти­ро­вать код отче­та?

    (уж очень наки­пе­ла эта тема с отче­та­ми. Опы­та рабо­ты мало, я все­го на 2 кур­се сей­час, полу­ча­ет­ся делать все кро­ме отче­та. То есть отче­ты уже редак­ти­ро­вал, но до это­го все упи­ра­лось в подви­нуть текст­бенд, поме­нять свой­ства, 1 раз при­шлось пере­де­лать запрос, все рабо­та­ло. Но отоб­ра­же­ние суб­ре­пор­тов хоть убей, не такое, каким долж­но быть)

    Зара­нее спа­си­бо!

  12. Внедренец Автор записи

    Сабре­порт пред­став­ля­ет собой кон­трол, на кото­ром мож­но отоб­ра­зить дру­гой неза­ви­си­мый отчёт. Бла­го­да­ря ему мож­но визу­аль­но поме­стить один отчёт в дру­гой (внут­ри стра­ни­цы в любом месте). Но в целом сабре­порт реко­мен­ду­ет­ся при­ме­нять лишь когда 2 отчё­та доста­точ­но неза­ви­си­мы друг от дру­га или меж­ду ними очень труд­но уста­но­вить связь. Во всех осталь­ных слу­ча­ях про­ще и пра­виль­нее исполь­зо­вать дру­гие мето­ды: свя­зан­ные источ­ни­ки дан­ных (дата­б­эн­ды), груп­пи­ров­ки и кон­тей­не­ры. Исхо­дя из опи­са­ния про­бле­мы в ком­мен­та­рии, воз­ни­ка­ет пред­по­ло­же­ние, что Вам нуж­но как раз вто­рое — т.е. отоб­ра­зить на стра­ни­це отчё­та свя­зан­ные под­чи­нён­ные дан­ные для основ­ных дан­ных. Напри­мер, есть основ­ной спи­сок пози­ций зака­за, в кото­ром пере­чис­ле­ны все изде­лия (их рисун­ки, инфор­ма­ция по ним и т.п.), и нам тре­бу­ет­ся под каж­дым таким изде­ли­ем (рисун­ком) отоб­ра­зить спе­ци­фи­ка­цию по кон­крет­но это­му изде­лию (т.е. пере­чень мате­ри­а­лов). Для это­го меж­ду дву­мя источ­ни­ка­ми дан­ных (sql-запро­са­ми) “изде­лия” и “спе­ци­фи­ка­ция” настра­и­ва­ет­ся связь (в самом отчё­те, relation). Под databand’ом изде­лий встав­ля­ет­ся новый databand, завя­зан­ный на спе­ци­фи­ка­цию. У это­го вто­ро­го databand’а про­став­ля­ет­ся ссыл­ка на пер­вый master databand и даёт­ся ссыл­ка на связь relation. И всё, теперь под каж­дым рисун­ком изде­лия будет кор­рект­но отоб­ра­жать­ся спе­ци­фи­ка­ция имен­но это­го изде­лия. А что­бы более деталь­но разо­брать­ся в про­бле­ме, нам нуж­но взгля­нуть на сам отчёт и понять, что мы вооб­ще хотим видеть бла­го­да­ря это­му отчё­ту (т.е. нужен доступ к mrt-фай­лу отчё­та и его опи­са­нию), посколь­ку суще­ству­ет мас­са все­воз­мож­ных реше­ний, поз­во­ля­ю­щих обой­ти воз­ник­шие про­бле­мы и решить их дру­гим спо­со­бом.

  13. Кирилл

    Здрав­ствуй­те!
    Никак не могу настро­ить отче­ты с суб­ре­пор­та­ми. Есть 2 отче­та, в обо­их по 1 или 2 суб­ре­пор­там. В каж­дом отче­те 1 суб­ре­порт некор­рект­но отоб­ра­жа­те­ся, то есть неко­то­рые ячей­ки отче­та, фор­ми­ру­е­мые этим суб­ре­пор­том, оста­ют­ся пусты­ми.
    Пере­рыл весь интер­нет, не нашел ниче­го, что мог­ло бы хоть как-то при­бли­зить меня к реше­нию про­бле­мы.
    Про­бо­вал сам сде­лать отчет с 0: выла­зи­ли все­воз­мож­ные ошиб­ки, при устра­не­нии кото­рых появ­ля­ют­ся новые или WinDraw пада­ет и при­хо­дит­ся запус­кать зано­во.
    Кто-нибудь уже стал­ки­вал­ся с подоб­ной про­бле­мой?
    Буду рад любой помо­щи: ссыл­ки, вари­ан­ты реше­ний и тп

    Мои кон­так­ты:
    icq 642231632
    поч­та: cheremisin_k@mail.ru

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*