AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.05.2015, 16:13   #1  
Emka is offline
Emka
Участник
 
40 / 12 (1) ++
Регистрация: 06.05.2015
? Заполнение временной таблицы
Добрый вечер!

Есть форма. на ней в гриде должна выводиться временная таблица. Заполнение временной таблицы выполняется в методе init данной таблицы в Data Sources

PHP код:
public void init()
{
str                      sqlStr;
ResultSet                       myResult;
Statement                stmt;
 
Connection               con;
container contcont2;
Map map = new Map (Types::StringTypes::Container);

str getSQLCommand1()
{
    
DataAreaId               dataAreaId;
    
QueryBuildDataSource qbds;
    ;
       
breakpoint;

     
dataAreaId  CompanyInfo::find().DataAreaId;
    
sqlStr=@"
DECLARE @da NVARCHAR(MAX) = '"
+dataAreaId+@"'
DECLARE @STYPE INT = "
+int2str(enum2int(SalesType::Sales))+@"
DECLARE @JTYPE INT = "
+int2str(enum2int(InventJournalType::Transfer))+@"
DECLARE @Transformers INT = "
+int2str(enum2int(TypeOfLinesales_ZTR::Transformers))+@"
DECLARE @TransformersEquipment INT = "
+int2str(enum2int(TypeOfLinesales_ZTR::TransformersEquipment))+@"
DECLARE @RepairTransformers INT = "
+int2str(enum2int(TypeOfLinesales_ZTR::RepairTransformers))+@"
DECLARE @SparePartsServiceCenter INT = "
+int2str(enum2int(TypeOfLinesales_ZTR::SparePartsServiceCenter))+@"
DECLARE @DeliveryClaims INT = "
+int2str(enum2int(TypeOfLinesales_ZTR::DeliveryClaims))+@"
DECLARE @ComplexProjects INT = "
+int2str(enum2int(TypeOfLinesales_ZTR::ComplexProjects))+@"
DECLARE @SpareParts INT = "
+int2str(enum2int(TypeOfLinesales_ZTR::SpareParts))+@"

IF OBJECT_ID('tempdb..#ijtrans') IS NOT NULL
DROP TABLE #ijtrans -- Дропнуть, если есть...
IF OBJECT_ID('tempdb..#ijtrans2') IS NOT NULL
DROP TABLE #ijtrans2 -- Дропнуть, если есть...
IF OBJECT_ID('tempdb..#sqline') IS NOT NULL
DROP TABLE #sqline -- Дропнуть, если есть...


;WITH ijtrans
AS (select distinct ijt.BUDGETCODE_ZTR, Sales.SalesId, ijt.ProdNum_ZTR, ijt.JournalId from dbo.INVENTJOURNALTRANS ijt
left join INVENTDIM id on ijt.DATAAREAID = id.DATAAREAID
    and id.INVENTDIMID = ijt.TOINVENTDIMID
    and id.INVENTLOCATIONID like 'C00647%'
join INVENTDIM id2 on ijt.DATAAREAID = id2.DATAAREAID
    and id2.INVENTDIMID = ijt.INVENTDIMID
    and id2.INVENTLOCATIONID not like 'C00647%'
left join (select SL.SalesId,SL.DataAreaId,SL.BUDGETCODE_ZTR,SL.PRODNUM_ZTR from salesline SL
            join salestable ST on sl.SalesId = ST.SalesId
             and ST.SalesType = @STYPE
            join INVENTTRANS itt on SL.DATAAREAID = itt.DATAAREAID
            and itt.INVENTTRANSID = SL.INVENTTRANSID
            and itt.STORNO_ZTR = 0) Sales on ijt.DATAAREAID = Sales.DATAAREAID
--    and ijt.JOURNALID = sl.JOURNALID_ZTR
    and ijt.BUDGETCODE_ZTR = Sales.BUDGETCODE_ZTR
    and ijt.PRODNUM_ZTR = Sales.PRODNUM_ZTR
 join INVENTTRANS it on ijt.DATAAREAID = it.DATAAREAID
    and it.INVENTTRANSID = ijt.INVENTTRANSID
    and it.STORNO_ZTR = 0
where ijt.DATAAREAID = 'ztr'--@da
    and ijt.JournalType = @JTYPE
    and ijt.BUDGETCODE_ZTR != ''
 union
/*)
SELECT ijtrans.*
INTO #ijtrans
from ijtrans order by budgetcode_ZTR

SELECT * from #ijtrans


;WITH ijtrans2
AS (*/
select distinct sqln.BUDGETCODE_ZTR, sales.SALESID, ijt.ProdNum_ZTR, ijt.JournalId from dbo.INVENTJOURNALTRANS ijt
join INVENTDIM id on ijt.DATAAREAID = id.DATAAREAID
and id.INVENTDIMID = ijt.TOINVENTDIMID
and id.INVENTLOCATIONID like 'C00647%'
join INVENTDIM id2 on ijt.DATAAREAID = id2.DATAAREAID
and id2.INVENTDIMID = ijt.INVENTDIMID
and id2.INVENTLOCATIONID not like 'C00647%'
join PRODNUMTABLE_ZTR pn on pn.DATAAREAID = ijt.DATAAREAID
and pn.PRODNUM = ijt.PRODNUM_ZTR
and pn.BUDGET_CODE_ZTR != ''
join SALESQUOTATIONLINE sqln on sqln.DATAAREAID = ijt.DATAAREAID
and sqln.BUDGETCODE_ZTR = pn.BUDGET_CODE_ZTR
left join (select SL.SalesId,SL.DataAreaId,SL.BUDGETCODE_ZTR,SL.PRODNUM_ZTR from salesline SL
            join salestable ST on sl.SalesId = ST.SalesId
             and ST.SalesType = 3 --@STYPE
            join INVENTTRANS itt on SL.DATAAREAID = itt.DATAAREAID
            and itt.INVENTTRANSID = SL.INVENTTRANSID
            and itt.STORNO_ZTR = 0) Sales on ijt.DATAAREAID = Sales.DATAAREAID
--    and ijt.BUDGETCODE_ZTR = Sales.BUDGETCODE_ZTR
    and ijt.PRODNUM_ZTR = Sales.PRODNUM_ZTR
where ijt.DATAAREAID = 'ztr'--@da
and ijt.JournalType = @JTYPE
and ijt.BUDGETCODE_ZTR = '')
SELECT ijtrans.*
INTO #ijtrans
from ijtrans



;WITH sqline
AS (select
sqln.BudgetCode_ZTR,
sqln.ProductionDateActual_ZTR,
sqln.ShipmentDateActual_ZTR,
sqln.ProductName_ZTR,
#ijtrans.ProdNum_ZTR,
#ijtrans.JOURNALID,
#ijtrans.SALESID,
sqln.SalesQty,
sqln.ProductsCapacity_ZTR,
mst.NAME
 from  salesquotationline sqln
join #ijtrans on #ijtrans.BUDGETCODE_ZTR = sqln.BUDGETCODE_ZTR
join MultiLevelSegmentData_ZTR msd on msd.DATAAREAID = @da
and msd.RefRecId = sqln.RECID and msd.RefTableId = 1967
and msd.SegmentId = 'География'
join MultilevelSegmentTree_ZTR mst on mst.DATAAREAID = @da
and mst.TreeNodeId = msd.TreeNodeId
where (sqln.TYPEOFLINESALES_ZTR = @Transformers
 or sqln.TYPEOFLINESALES_ZTR = @TransformersEquipment
 or sqln.TYPEOFLINESALES_ZTR = @RepairTransformers
 or sqln.TYPEOFLINESALES_ZTR = @SparePartsServiceCenter
 or sqln.TYPEOFLINESALES_ZTR = @DeliveryClaims
 or sqln.TYPEOFLINESALES_ZTR = @ComplexProjects
 or sqln.TYPEOFLINESALES_ZTR = @SpareParts))
SELECT sqline.*
INTO #sqline
from sqline

--SELECT count(distinct budgetcode_ZTR) from #sqline
SELECT * from #sqline order by BudgetCode_ZTR
"
;
return 
sqlStr;


}
     
con         = new Connection();
    
stmt        con.createStatement();

         
super();

 
sqlStr =  getSQLCommand1();

     
myResult callSqlOnServer_ZTR(stmtsqlStrfalse);
                    while (
myResult.next())
                    {

                    
Tmp_DeliverShipProducts_ZTR.SALESID myResult.getString(1);
                    
Tmp_DeliverShipProducts_ZTR.ProductionDateActual_ZTR myResult.getDate(2);
                    
Tmp_DeliverShipProducts_ZTR.ShipmentDateActual_ZTR myResult.getDate(3);
                    
Tmp_DeliverShipProducts_ZTR.ProductName_ZTR myResult.getString(4);
                    
Tmp_DeliverShipProducts_ZTR.ProdNum_ZTR myResult.getString(5);
                    
Tmp_DeliverShipProducts_ZTR.JOURNALID myResult.getString(6);
                    
Tmp_DeliverShipProducts_ZTR.SALESID myResult.getString(7);
                    
Tmp_DeliverShipProducts_ZTR.SalesQty myResult.getReal(8);
                    
Tmp_DeliverShipProducts_ZTR.ProductsCapacity_ZTR myResult.getReal(9);
                    
Tmp_DeliverShipProducts_ZTR.Name myResult.getString(10);
                  
                    }
                    

Необходимо данные выбранные в SQL коде занести во временную таблицу Tmp_DeliverShipProducts_ZTR
В этом для меня и загвоздка, не могу понять как занести данные в таблицу
Я новичок, так что пожалуйста не судите строго
Старый 26.05.2015, 16:20   #2  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,731 / 406 (17) +++++++
Регистрация: 23.03.2006
прежде всего необходимо начать с чтения книжки по программированию в X++. после многие вопросы отпадут и код у вас будет гораздо короче и появится вопрос отображения на форме данных из временной таблицы
За это сообщение автора поблагодарили: axotnik88 (1).
Старый 26.05.2015, 16:27   #3  
Emka is offline
Emka
Участник
 
40 / 12 (1) ++
Регистрация: 06.05.2015
если честно времени на чтение книги нет. Проект срочный . доработки для упрощения кода, будут делаться позже. Есть ли какая то определенная книга, глава, а лучше даже пример, что бы простой junior понял?
Старый 26.05.2015, 16:51   #4  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Данный пример будет работать при условии, что у вас Tmp_DeliverShipProducts_ZTR - название таблицы, привязанной к одноименному источнику данных на вашей форме.

В начале метода объявите новую переменную с типом вашей временной таблицы:
X++:
public void init() 
{
     Tmp_DeliverShipProducts_ZTR      tmp;
     //Дальше идет ваш код
     ....................
Внутри цикла while (myResult.next()) сделайте следующее:
1) в самом начале добавьте строку
X++:
tmp.clear();
2) все упоминания переменной Tmp_DeliverShipProducts_ZTR замените на переменную tmp
3) в конце добавьте строку
X++:
tmp.insert();
После выхода из цикла while (myResult.next()) в конце метода init() добавьте код:
X++:
Tmp_DeliverShipProducts_ZTR.setTmpData(tmp);
Tmp_DeliverShipProducts_ZTR_DS.executeQuery(); //это внутри init() необязательно, но на всякий случай
Обратите внимание, что в последней строке к слову Tmp_DeliverShipProducts_ZTR в самом конце добавлено окончание "_DS" - это обращение к источнику данных таблицы.

Последний раз редактировалось Ace of Database; 26.05.2015 в 17:08.
Старый 26.05.2015, 16:53   #5  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,731 / 406 (17) +++++++
Регистрация: 23.03.2006
пример:
X++:
while select mytable
         join myTable2
             where myTable2.id == mytable.Id
{
    myTmpTable.clear();
    myTmpTable.Value = mytable.Value;
    myTmpTable.Value2 = mytable2.Value2;
    myTmpTable.insert();
}
Старый 26.05.2015, 16:59   #6  
Emka is offline
Emka
Участник
 
40 / 12 (1) ++
Регистрация: 06.05.2015
выдает ошибку "[Microsoft][SQL Native Client]Invalid cursor state" когда пытается выполнить while (myResult.next())
а так же ругается на
X++:
Tmp_DeliverShipProducts_ZTR_DS.setTmpData(tmp);
Старый 26.05.2015, 17:04   #7  
Emka is offline
Emka
Участник
 
40 / 12 (1) ++
Регистрация: 06.05.2015
я знаю что можно прописать это все средствами аксапты, но в данном случае я хотела бы использовать SQL. Так как он для меня более привычен.
И как прописать весь этот селект в аксапте не представляю (хотела оставить этот вариант на крайний случай)
Старый 26.05.2015, 17:05   #8  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Перепутал, надо написать
X++:
Tmp_DeliverShipProducts_ZTR.setTmpData(tmp);
Tmp_DeliverShipProducts_ZTR_DS.executeQuery();
То есть в первом случае надо без окончания _DS.
Старый 26.05.2015, 17:12   #9  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Самый тупой вариант в вашем случае, это сделать временную таблицу в Аксапте постоянной.
Свойство SaveDataPerCompany выставить в No.
Написать на SQL хранимую процедуру, которая ее очищает и заполняет заново. А потом из Аксапты просто открыть форму, и она безо всякого кода вам отобразит данные.
При этом надо позаботиться заполнением поля RecId уникальными значениями из хранимой процедуры.
За это сообщение автора поблагодарили: Emka (1).
Старый 26.05.2015, 17:16   #10  
Emka is offline
Emka
Участник
 
40 / 12 (1) ++
Регистрация: 06.05.2015
теперь на функцию не ругается)

Думала о таком варианте, но такое у нас под запретом))
Старый 26.05.2015, 17:50   #11  
lvan is offline
lvan
Участник
Аватар для lvan
Лучший по профессии 2014
 
858 / 82 (4) ++++
Регистрация: 15.04.2011
Записей в блоге: 1
ваш проект обречен
За это сообщение автора поблагодарили: macklakov (0).
Старый 26.05.2015, 17:53   #12  
Napalm is offline
Napalm
Участник
 
80 / 88 (3) ++++
Регистрация: 23.05.2012
Цитата:
Сообщение от Emka Посмотреть сообщение
выдает ошибку "[Microsoft][SQL Native Client]Invalid cursor state" когда пытается выполнить while (myResult.next())
С временной таблицей вроде бы не связано. А где код метода "callSqlOnServer_ZTR"? Возможно проблема в нем.

PS: Код можно смело перенести в тему "The daily Axapta WTF".
Старый 26.05.2015, 17:59   #13  
Napalm is offline
Napalm
Участник
 
80 / 88 (3) ++++
Регистрация: 23.05.2012
Цитата:
Сообщение от Emka Посмотреть сообщение
я знаю что можно прописать это все средствами аксапты, но в данном случае я хотела бы использовать SQL. Так как он для меня более привычен.
И как прописать весь этот селект в аксапте не представляю (хотела оставить этот вариант на крайний случай)
Ну хоть не на ассемблере.
Старый 26.05.2015, 19:18   #14  
Emka is offline
Emka
Участник
 
40 / 12 (1) ++
Регистрация: 06.05.2015
Цитата:
Сообщение от Napalm Посмотреть сообщение
С временной таблицей вроде бы не связано. А где код метода "callSqlOnServer_ZTR"? Возможно проблема в нем.
X++:
server static ResultSet callSqlOnServer_ZTR(Statement _stmt, str _sql, boolean _update = true)
{
    ResultSet   rs = null;
    ;
    new SqlStatementExecutePermission(_sql).assert();

    if (_update)
        _stmt.executeUpdate(_sql);
    else
        rs = _stmt.executeQuery(_sql);

    CodeAccessPermission::revertAssert();
    return rs;
}
Старый 26.05.2015, 19:19   #15  
Emka is offline
Emka
Участник
 
40 / 12 (1) ++
Регистрация: 06.05.2015
Цитата:
Сообщение от Napalm Посмотреть сообщение
Ну хоть не на ассемблере.
это весьма радует
Старый 27.05.2015, 09:18   #16  
makbeth is offline
makbeth
Участник
Аватар для makbeth
КОРУС Консалтинг
 
43 / 52 (2) ++++
Регистрация: 15.05.2007
Адрес: Санкт-Петербург
callSqlOnServer_ZTR прекрасен. Особенно если учесть, что _stmt создан на форме.
Старый 27.05.2015, 10:13   #17  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,232 / 975 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
Самый тупой вариант в вашем случае, это сделать временную таблицу в Аксапте постоянной.
Свойство SaveDataPerCompany выставить в No.
Написать на SQL хранимую процедуру, которая ее очищает и заполняет заново. А потом из Аксапты просто открыть форму, и она безо всякого кода вам отобразит данные.
При этом надо позаботиться заполнением поля RecId уникальными значениями из хранимой процедуры.
Страшный ты человек! А что если в это время другой пользователь форму открыть попробует? Или кто-то попытается права доступа настроить?
__________________
Isn't it nice when things just work?
Старый 27.05.2015, 11:38   #18  
Emka is offline
Emka
Участник
 
40 / 12 (1) ++
Регистрация: 06.05.2015
Цитата:
Сообщение от Napalm Посмотреть сообщение
С временной таблицей вроде бы не связано. А где код метода "callSqlOnServer_ZTR"? Возможно проблема в нем.
Ошибка оказалась в самом SQL - клиенту возвращалось несколько результатов
Решила по средствам SET NOCOUNT
За это сообщение автора поблагодарили: Ace of Database (2).
Старый 27.05.2015, 16:18   #19  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от macklakov Посмотреть сообщение
Страшный ты человек! А что если в это время другой пользователь форму открыть попробует? Или кто-то попытается права доступа настроить?
Если в хранимой процедуре все сделать внутри транзакции, то оба пользователя увидят одни и те же данные.
А права доступа - это конечно да. Хранимая процедура вернет данные независимо от прав. Но я в этой ветке занял сторону конкретного человека. Как бы адвокат. Что делать девушке: отказываться от задания или выполнить любой ценой? Жизнь сложная штука.

PS. И в то же время я понимаю, что наличие таких специалистов снижает стоимость позиции "специалист по Аксапте". Жизнь сложная штука. Так как девушка худо-бедно решит проблему подручными средствами, то проект не получит профессионал. Зритель поневоле встает на сторону главного героя фильма. Девушка - главный герой этой темы. А если бы тему начал другой человек, с вопросом: "допускать ли таких специалистов к этому заданию"? То я бы встал на его сторону, так как он был бы главным героем. И я бы не стал тогда защищать девушку. Это вопрос психологии.

Последний раз редактировалось Ace of Database; 27.05.2015 в 16:28.
Старый 27.05.2015, 16:27   #20  
Oz is offline
Oz
Участник
Аватар для Oz
 
293 / 51 (2) ++++
Регистрация: 22.08.2002
Адрес: Москва
"Жизнь сложная штука" (с)
Возможно не все проекты достойны профессионала?
__________________
Здесь могла быть Ваша реклама!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Отмена использования временной таблицы в FormDatasource A_BAS DAX: Программирование 4 02.03.2013 21:11
передача временной таблицы с клиента на сервер Eldar9x DAX: Программирование 30 27.07.2012 12:05
Join временной таблицы в запросе yahenz DAX: Программирование 12 24.04.2012 14:59
Display метод временной таблицы выполняется в компании DAT S.Kuskov DAX: Программирование 4 15.04.2011 20:11
Динамическое связывание временной таблицы Paul_ST DAX: Программирование 8 25.09.2007 16:17

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:00.