Проформа SalesInvoice не отображает данные из всех таблиц

В отчете ssrs salesInvoice я добавил таблицу под названием carTableEquipTmp, которой по умолчанию нет, и которую я вставляю вместе с другими таблицами (SalesinvoiceTmp и SalesinvoiceHeaderFooterTmp) в SalesInvoiceDP.InsertIntoSalesInvoiceTmp().

Несмотря на то, что моя таблица carTableEquipTmp успешно вставляется, данные не отображаются в отчете, если я распечатываю предварительный отчет.

Если я добавлю тестовые значения в таблицу carTableEquipTmp в SalesInvoiceDP.processReport(), они появятся в счете-проформе, но на этом этапе у меня нет возможности получить какие-либо параметры, необходимые для установки правильных данных в таблицу. Если я остановлюсь на этом этапе в отладчике, никакие данные не будут присутствовать, потому что processreport() вызывается из более низкого уровня кода.

Я думаю, что это может быть проблема с упаковкой / распаковкой или с тем, что код проформы запускается с экземпляра сервера, поскольку код, запускаемый, когда он является проформой, совсем другой.

Я вижу, что SalesInvoiceJournalPostBase.CreateReportData() создает экземпляр salesInvoiceDP

salesInvoiceDP = new SalesInvoiceDP();
salesInvoiceDP.parmDataContract(salesInvoiceContract);
salesInvoiceDP.parmUserConnection(new UserConnection(true));

salesInvoiceDP.createData();

И это может иметь какое-то отношение к этому ... но я все еще не могу получить данные, которые мне нужны, в таблице carTableEquipTmp.

Итак, любая идея о том, как заставить Axe 2012 принять эту новую таблицу, которую я добавил, поскольку она вставляется так же, как и другие таблицы, и, похоже, нет проблем ...

Надеюсь, вы можете помочь.


person Heygar    schedule 17.03.2016    source источник
comment
Вы вставили свои данные в качестве нового источника данных в rdp / ssrs или вставляете их в salesInvoiceTmp?   -  person Spencer Kershaw    schedule 24.03.2016
comment
Это новая таблица под названием CarTableEquipTmp, которая возвращается из RDP и добавляется в дизайн ssrs / отчета. Он отлично работает, когда счет-фактура не является проформой. Есть ли место, где я должен добавить ссылку на таблицу, чтобы она отображалась в отчете?   -  person Heygar    schedule 26.03.2016
comment
Пару дней назад я столкнулся с подобной ситуацией, и моя проблема заключалась в том, что я неправильно настроил код предварительной обработки. можете ли вы сказать мне следующее: - Вы изменили SalesInvoiceDP.useExistingReportData ()? - Тип вашей временной таблицы обычный? Я отправлю ответ, если оба из них нет, поскольку вам, вероятно, потребуется создать код для обработки этого случая (useExistingReportData вызывается в сценарии проформы)   -  person Spencer Kershaw    schedule 30.03.2016
comment
Привет. Спасибо за ответы. Я не изменял SalesInvoiceDP.useExistingReportData (), и моя временная таблица имеет стандартный тип tableType   -  person Heygar    schedule 19.04.2016


Ответы (1)


В отчете SalesInvoice есть два класса данных, на которые необходимо обратить внимание для поставщика данных: SalesInvoiceDP и SalesInvoiceDPBase. SalesInvoiceDPBase расширяет SrsReportDataProvider PreProcess, поэтому необходимо выполнить несколько дополнительных шагов, чтобы добавить новые источники данных в отчет.

В классе salesInvoiceDP есть метод под названием useExistingReportData (), который повторно вставляет данные временной таблицы проформы под пользовательское соединение, поэтому инфраструктура SrsReportDataProviderPreProcess подберет их в вашем отчете. Когда предварительный процесс создает данные отчета, они не вставляются с подключением пользователя, поэтому они не добавляются в отчет. Этот метод вызывается только тогда, когда отчет создается для проформы.

Вам нужно будет добавить свою временную таблицу к этому методу и следовать шаблону для других таблиц, поэтому ваш код будет выглядеть примерно так:

//this is different from the buffer you insert your data with
CarTableEquipTmp localCarTableEquipTmp;

...

recordList = new RecordSortedList(tableNum(carTableEquipTmp));
recordList.sortOrder(fieldNum(carTableEquipTmp, RecId));

//You will need to add a field to relate your temp table 
//to the current invoice journal, and insert it in 
//InsertIntoSalesInvoiceTmp() if thats where you're inserting your table.
while select localCarTableEquipTmp
    where localCarTableEquipTmp.JournalRecId == jourRecId 
{
    recordList.ins(localCarTableEquipTmp);
}

delete_from localCarTableEquipTmp
    where localCarTableEquipTmp.JournalRecId == jourRecId;

recordList.insertDatabase(this.parmUserConnection());

Этот метод повторно вставляет ваши данные в структуру и удаляет исходные данные. Затем данные, которые были повторно вставлены, будут приняты структурой и отобразятся в вашем отчете. Если вы откроете CarTableEquipTmp в браузере таблиц, вы, скорее всего, увидите, что там все еще есть данные с тех пор, когда вы пытались запустить отчет. Вот почему у нас есть операция delete_from после повторной вставки данных. Когда данные вставляются в userConnection, они автоматически удаляются по завершении отчета.

Другой метод, который вы захотите изменить, - это SalesInvoiceDP.setTableConnections (), и вам просто нужно будет добавить следующую строку:

CarTableEquipTmp.setConnection(this.parmUserConnection());

Это установит пользовательское соединение для вашей таблицы при обычном запуске (не для проформы). Вы, вероятно, захотите удалить данные, которые в настоящее время хранятся в вашей временной таблице, используя alt + F9 в браузере таблиц.

В остальном это все стандартные вещи RDP, но похоже, что у вас эта часть работает нормально. Чтобы это работало, ваша временная таблица должна иметь тип «Обычная».

person Spencer Kershaw    schedule 20.04.2016
comment
Это было именно то, что я искал. Большое спасибо за помощь, работает как шарм! - person Heygar; 04.05.2016