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:59   #5  
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:05   #6  
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:53   #7  
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, 16:53   #8  
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, 17:04   #9  
Emka is offline
Emka
Участник
 
40 / 12 (1) ++
Регистрация: 06.05.2015
я знаю что можно прописать это все средствами аксапты, но в данном случае я хотела бы использовать SQL. Так как он для меня более привычен.
И как прописать весь этот селект в аксапте не представляю (хотела оставить этот вариант на крайний случай)
Старый 26.05.2015, 17:59   #10  
Napalm is offline
Napalm
Участник
 
80 / 88 (3) ++++
Регистрация: 23.05.2012
Цитата:
Сообщение от Emka Посмотреть сообщение
я знаю что можно прописать это все средствами аксапты, но в данном случае я хотела бы использовать SQL. Так как он для меня более привычен.
И как прописать весь этот селект в аксапте не представляю (хотела оставить этот вариант на крайний случай)
Ну хоть не на ассемблере.
Старый 26.05.2015, 19:19   #11  
Emka is offline
Emka
Участник
 
40 / 12 (1) ++
Регистрация: 06.05.2015
Цитата:
Сообщение от Napalm Посмотреть сообщение
Ну хоть не на ассемблере.
это весьма радует
Старый 26.05.2015, 17:50   #12  
lvan is offline
lvan
Участник
Аватар для lvan
Лучший по профессии 2014
 
858 / 82 (4) ++++
Регистрация: 15.04.2011
Записей в блоге: 1
ваш проект обречен
За это сообщение автора поблагодарили: macklakov (0).
Старый 28.05.2015, 09:08   #13  
Emka is offline
Emka
Участник
 
40 / 12 (1) ++
Регистрация: 06.05.2015
Люди Добрые, работаю я с X++ всего 5 месяцев. Без знания Java. До этого работала с АВАР и Oracle везде только SQL. В общей сумме опыта у меня всего 15 месяцев.
Да я понимаю, что код отвратителен и не респектабельный, но надо же и мне на чем то учиться.
С каждым разом узнавая, что-нибудь новое, я оптимизирую и старые коды.
Хотя могу сознаться, книги мне даются очень сложно, понимаю только на практике

P.S.: Было предложение отдать проект более опытному программисту, но я девочка жадная и не хочу свои проектики отдавать другому
Старый 28.05.2015, 09:26   #14  
makbeth is offline
makbeth
Участник
Аватар для makbeth
КОРУС Консалтинг
 
43 / 52 (2) ++++
Регистрация: 15.05.2007
Адрес: Санкт-Петербург
Цитата:
Сообщение от Emka Посмотреть сообщение
Да я понимаю, что код отвратителен и не респектабельный, но надо же и мне на чем то учиться.
Учатся обычно не на срочных проектах, а на чем нибудь попроще. Например на учебной базе, где такие вот "учебные" выверты никого не удивят и никому не навредят.

Цитата:
Сообщение от Emka Посмотреть сообщение
я девочка жадная и не хочу свои проектики отдавать другому
Ваша... гм-гм... жадность может дорого стоить вашему заказчику (или работодателю).
Я бы на вашем месте все же отдал эти "проектики" кому-нибудь более опытному, а потом бы подсмотрел и разобрался, что же он там сделал.

PS: за пять месяцев обычно уже приходит понимание, что в аксапте прямые sql-запросы при работе с ее же БД использовать неправильно ни в каком виде - своих собственных средств хватает на все возможные задачи (ну почти )
Старый 28.05.2015, 10:07   #15  
Emka is offline
Emka
Участник
 
40 / 12 (1) ++
Регистрация: 06.05.2015
Цитата:
Сообщение от makbeth Посмотреть сообщение
Учатся обычно не на срочных проектах, а на чем нибудь попроще. Например на учебной базе, где такие вот "учебные" выверты никого не удивят и никому не навредят.
Как по мне то именно на таких проектах лучше, интереснее и увлекательнее учится. Не сидишь в развалочку потягивая кофеек в раздумьях о вечном.

Цитата:
Сообщение от makbeth Посмотреть сообщение
PS: за пять месяцев обычно уже приходит понимание, что в аксапте прямые sql-запросы при работе с ее же БД использовать неправильно ни в каком виде - своих собственных средств хватает на все возможные задачи (ну почти )
В программах которые уже были написаны на моей фирме, я часто наталкивалась на вставки sql-запросов(правда только для отчетов), поэтому и приноровилась к этому.

В ближайшем будущем возможно переведу это все на select аксапты, правда не знаю как это отразится на времени открытии формы. Так как это очень важный критерий для заказчика
Думала сперва провернуть это все с помощью QueryBuildDataSource, но честно говоря не представляю пока что, как можно было бы прописать все эти условия.
Буду думать над этим в свободное время
Старый 28.05.2015, 10:21   #16  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,731 / 406 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от Emka Посмотреть сообщение
В ближайшем будущем возможно переведу это все на select аксапты, правда не знаю как это отразится на времени открытии формы. Так как это очень важный критерий для заказчика
Думала сперва провернуть это все с помощью QueryBuildDataSource, но честно говоря не представляю пока что, как можно было бы прописать все эти условия.
Буду думать над этим в свободное время
не нужно все условия пытаться выполнить одним запросом. расчет данных необходимо перенести с формы на сервер, тогда формы будут быстрее открываться
За это сообщение автора поблагодарили: Emka (1).
Старый 28.05.2015, 10:45   #17  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,232 / 975 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от Emka Посмотреть сообщение
Как по мне то именно на таких проектах лучше, интереснее и увлекательнее учится. Не сидишь в развалочку потягивая кофеек в раздумьях о вечном.
Не раздумьями надо заниматься, а букварь читать. Или на курсы ходить. Или даже видео-уроки на youtube поискать.
5 месяцев возраст солидный. А прогресса не заметно.
__________________
Isn't it nice when things just work?
За это сообщение автора поблагодарили: Emka (1).
Старый 28.05.2015, 10:57   #18  
Emka is offline
Emka
Участник
 
40 / 12 (1) ++
Регистрация: 06.05.2015
Цитата:
Сообщение от macklakov Посмотреть сообщение
5 месяцев возраст солидный. А прогресса не заметно.
Ооо! Видели бы вы меня в первый месяц, вы бы так не говорили
Знаю что гордится нечем

А вот насчет видео курсов, как то не подумала, похожу по просторам youtube пошукаю
Старый 28.05.2015, 09:31   #19  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
А причем тут Java ?
Вот придет на ваше место кто-то понимающий что он делает и ... жалко мне его короче.
Свой проектик это вечером на кухне, а тут небось еще есть люди которые это используют явно не в целях развлечений. Но вы то девочка жадная...
Хотя судя по всему все кто что-то знал с вашего заводика уже уволились

Последний раз редактировалось skuull; 28.05.2015 в 09:38.
Старый 28.05.2015, 10:16   #20  
Emka is offline
Emka
Участник
 
40 / 12 (1) ++
Регистрация: 06.05.2015
Цитата:
Сообщение от skuull Посмотреть сообщение
А причем тут Java ?
По синтаксису язык несколько похож на язык Java.

Цитата:
Сообщение от skuull Посмотреть сообщение
Свой проектик это вечером на кухне
как девушка, так сразу на кухню!? Да вы у нас батюшка сексист!

Цитата:
Сообщение от skuull Посмотреть сообщение
Хотя судя по всему все кто что-то знал с вашего заводика уже уволились
Можете не волноваться за наш "заводик"
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Отмена использования временной таблицы в 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, время: 23:03.