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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.05.2010, 13:59   #1  
hated8 is offline
hated8
Участник
Аватар для hated8
Злыдни
 
133 / 18 (1) ++
Регистрация: 27.06.2008
Angry Форма накладных
Помогите пожалуйста разобраться...
Мне необходимо программно получить накладную для нескольких заказов на продажу, делаю:

X++:
select * from salesTable
       where salesTable.SalesId like '.....*';
       args = new Args();
       args.record(salesTable);
       args.parmEnum(DocumentStatus::Invoice);
       args.caller(args);
       SalesFormLetter::main(args);
Но в форме разноски накладной открывается только первый заказ... Почему так происходит?...
__________________
Что сломалось не знаем, но уже немного подчинили...
Старый 24.05.2010, 14:08   #2  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Select-ом Вы вытянули первую запись, попадающую под заданное условие и именно ее (эту одну запись) передали как аргумент в класс Args.
Старый 24.05.2010, 14:17   #3  
hated8 is offline
hated8
Участник
Аватар для hated8
Злыдни
 
133 / 18 (1) ++
Регистрация: 27.06.2008
Select-ом то я вытянул несколько записей! А вот передал быть может и неверно, подскажите как можно в эту форму передать набор?
__________________
Что сломалось не знаем, но уже немного подчинили...
Старый 24.05.2010, 14:34   #4  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Вставка строк происходит вот здесь:

Цитата:
(S) \Classes\SalesFormLetter\chooseLines
(S) \Classes\SalesFormLetter\initLinesQuery
В методе (S) \Classes\SalesFormLetter\updateQueryBuild происходит инициализация набора данных. Обратите внимание на код:

X++:
        mapSalesRecord = map::create(Formletter::getFormRecord(callerFormDataSource));
        mapSalesRecordEnumerator = mapSalesRecord.getEnumerator();

        while (mapSalesRecordEnumerator.moveNext())
        {
            localSalesTable = mapSalesRecordEnumerator.currentValue();
            // ...
А сам callerFormDatasource создается так:

X++:
     callerFormDataSource = salesTable.dataSource();
     salesFormLetter.callerFormDataSource(callerFormDataSource);
Я бы попробовал из кода (то есть, программно) выделить несколько записей на SalesTable, попадающих под заданные вами условия:

X++:
// Select all lines of the grid
salesTabToSelect = SalesTable_ds.getFirst();
while (salesTabToSelect) {
    SalesTable_ds.markRecord(salesTabToSelect, true);
    salesTabToSelect = SalesTable_ds.getNext();
}

Последний раз редактировалось Андре; 24.05.2010 в 14:56.
За это сообщение автора поблагодарили: hated8 (1).
Старый 24.05.2010, 15:00   #5  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
не совсем понял что вы имеете ввиду...
Прошу прощения - я уже успел предыдущее сообщение поправить, добавив пример кода

Я имел в виду метод markRecord(). Ведь для разноски накладной по нескольким заказам Вы предварительно выделяете их.
Старый 24.05.2010, 15:01   #6  
hated8 is offline
hated8
Участник
Аватар для hated8
Злыдни
 
133 / 18 (1) ++
Регистрация: 27.06.2008
Цитата:
Я бы попробовал из кода (то есть, программно) выделить несколько записей на SalesTable
Цитата:
// Select all lines of the grid
salesTabToSelect = SalesTable_ds.getFirst();
while (salesTabToSelect) {
SalesTable_ds.markRecord(salesTabToSelect, true);
salesTabToSelect = SalesTable_ds.getNext();
}
Должно быть я не корректно объяснился, я пытаюсь вызвать её из класса... Там нет _ds... Есть просто список заказов, по которым необходимо формировать накладную...


Я пробовал таким образом:
X++:
       SalesFormLetter = SalesFormLetter::construct(DocumentStatus::Invoice);
       SalesFormLetter.salesTable(SalesTable);
       salesFormLetter.parmSalesPurchCycleAction(salesPurchCycle::salesPurchCycleAction(DocumentStatus::Invoice));
       salesFormLetter.callerFormDataSource(SalesTable.dataSource());
       SalesFormLetter.prompt();
Но результат абсолютно тот же...
__________________
Что сломалось не знаем, но уже немного подчинили...

Последний раз редактировалось hated8; 24.05.2010 в 15:14.
Старый 24.05.2010, 15:46   #7  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
Как вариант: из вашего класса программно поднять форму SalesTable, скрыть ее тут же, получить датасорс. Далее - см. выше.

Но это - изврат, ИМХО
__________________
Best Regards,
Roman
Старый 24.05.2010, 15:48   #8  
hated8 is offline
hated8
Участник
Аватар для hated8
Злыдни
 
133 / 18 (1) ++
Регистрация: 27.06.2008
Изврат не то слово)) Одна из самых тяжелых форм в AX.... )
__________________
Что сломалось не знаем, но уже немного подчинили...
Старый 24.05.2010, 15:52   #9  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
То есть, Вам нужно программно вызвать механизм совместной обработки? Придется вручную формировать параметрические таблицы, ориентируясь на то место, которое подсказал Андре.
В приведенном ниже коде как раз производится что-то подобное. Единственное, этот код сразу разносит без открытия диалога, переделать с диалогом, думаю несложно.
Ну и несколько параметров лишние, они чисто наши, можно не обращать внимание:
X++:
// ААК: МФД40_08_01_0008_003 24.04.2009 [Заявки на отгрузку] -->
public static CustInvoiceJour multiSalesPost_OVK(
                                                    container                   _conSales,                                                  // Контейнер с SalesId нужных заказов
                                                    container                   _conLines,                                                  // Контейнер с RecId строк заказов
                                                    TransDate                   _invoiceDate        = systemDateGet(),                      // Дата накладной
                                                    TransDate                   _documentDate       = systemDateGet(),                      // Дата документа
                                                    SalesUpdate                 _specQty            = SalesUpdate::DeliverNow,              // SpecQty
                                                    AccountOrder                _sumBy              = AccountOrder::None,                   // Суммарная обработка
                                                    PostInvoiceAdvData_OVK      _postAdvData        = null,
                                                    BOLData_OVK                 _bolData            = null                                  // Данные для ТТН
                                                )
// ААК: МФД40_08_01_0008_003 24.04.2009 [Заявки на отгрузку] <--
{
    SalesTable              salesTable;
    SalesLine               salesLine;
    SalesParmTable          salesParmTable;
    salesParmUpdate         salesParmUpdate;
    SalesFormLetter_Invoice salesFormLetter;
    SalesParmLine           parmLine;
    SalesId                 salesId;
    Counter                 iSales, iLines;
    RecId                   recId;
    ;

    salesFormLetter = SalesFormLetter::construct(DocumentStatus::Invoice);

    ttsBegin;

    salesFormLetter.createParmUpdate(false, conNull());

    salesParmUpdate                 = salesParmUpdate::find(salesFormLetter.parmId(), true);
    salesParmUpdate.SumBy           = _sumBy;

    if (_postAdvData)
    {
        salesParmUpdate.storno          = _postAdvData.storno();
        salesParmUpdate.CreditRemaining = _postAdvData.creditRemaining();
    }

    if (_bolData)
    {
        salesParmUpdate.BOLCarrierName          = _bolData.carrierName();
        salesParmUpdate.BOLFreightChargeTerms   = _bolData.freightChargeTerms();
        salesParmUpdate.BOLFreightCounted       = _bolData.freightCounted();
        salesParmUpdate.BOLTrailerLoaded        = _bolData.trailerLoaded();
        salesParmUpdate.BOLFreightedBy          = _bolData.freightedBy();
    }

    salesParmUpdate.update();

    salesFormLetter.salesParmUpdate(salesParmUpdate);

    salesFormLetter.initParameters(salesFormLetter.salesParmUpdate(), PrintOut::Current, _postAdvData ? _postAdvData.printInvoice() : NoYes::No);

    salesFormLetter.transDate(_invoiceDate);
    salesFormLetter.multiForm(true);
    salesFormLetter.specQty(_specQty);

    if (_postAdvData)
    {
        salesFormLetter.parmStornoStatus            (_postAdvData.stornoStatus());
        salesFormLetter.printFormLetter             (_postAdvData.printInvoice());
        salesFormLetter.printInMST_OVK              (_postAdvData.printInMST());
        salesFormLetter.printBillOfLading_OVK       (_postAdvData.printBOL());
        salesFormLetter.parmReservReturn            (_postAdvData.remainReserv());
        salesFormLetter.parmRefDocumentStorno       (_postAdvData.correctedInvoiceRecId());
        salesFormLetter.parmFixedDueDate_OVK        (_postAdvData.fixedDueDate());
        salesFormLetter.parmPayment_OVK             (_postAdvData.payment());
        salesFormLetter.parmShipBatchId_OVK         (_postAdvData.shipBatchId());
        salesFormLetter.parmReservTransId_OVK       (_postAdvData.reservTransId());

        if (_postAdvData.corrected())
        {
            salesFormLetter.parmCorrect                 (_postAdvData.corrected());
            salesFormLetter.parmCorrectedInvoiceId      (_postAdvData.correctedInvoiceId());
            salesFormLetter.parmCorrectedInvoiceDate    (_postAdvData.correctedInvoiceDate());
        }

        if (_postAdvData.printStamp())
        {
            salesFormLetter.parmPrintStamp_OVK(UnknownNoYes::Yes);
        }
        else
        {
            salesFormLetter.parmPrintStamp_OVK(UnknownNoYes::No);
        }
    }

    for (iSales = 1; iSales <= conLen(_conSales); iSales ++)
    {
        salesId     = conpeek(_conSales, iSales);

        salesTable  = SalesTable::find(salesId);

        salesParmTable.clear();

        salesFormLetter.createParmTable(salesParmTable, salesTable);

        salesParmTable.TableRefId               = FormLetter::getTableRef();

        salesParmTable.DocumentDate             = _documentDate;
        salesParmTable.TransDate                = _invoiceDate;
        salesParmTable.SalesId                  = salesTable.SalesId;
        salesParmTable.Invoice4PaymId_OVK       = CustInvoice4PaymSalesLink_RU::oneInvoice4PaymId_OVK(salesTable.SalesId);

        if (_postAdvData)
        {
            if (_postAdvData.corrected())
            {
                salesParmTable.Correct_RU               = _postAdvData.corrected();
                salesParmTable.CorrectedInvoiceId_RU    = _postAdvData.correctedInvoiceId();
                salesParmTable.CorrectedInvoiceDate_RU  = _postAdvData.correctedInvoiceDate();
            }

            salesParmTable.RefForStorno_OVK         = _postAdvData.correctedInvoiceRecId();
            salesParmTable.AverageExchRate_OVK      = _postAdvData.fixedExchRate();
            salesParmTable.ShipBatchId_OVK          = _postAdvData.shipBatchId();

            if (_postAdvData.fixedDueDate())
            {
                salesParmTable.FixedDueDate = _postAdvData.fixedDueDate();
            }
        }

        if (_bolData)
        {
            salesParmTable.BOLDeliveryDate_RU       = _bolData.deliveryDate();
            salesParmTable.BOLVehicleModel_RU       = _bolData.vehicleModel();
            salesParmTable.BOLVehiclePlateNum_RU    = _bolData.vehiclePlateNum();
            salesParmTable.BOLWaybillNum_RU         = _bolData.waybillNum();
            salesParmTable.BOLDriverName_RU         = _bolData.driverName();
            salesParmTable.BOLDrivingLicenseNum_RU  = _bolData.drivingLicenseNum();
            salesParmTable.BOLLicenseCardType_RU    = _bolData.licenseCardType();
            salesParmTable.BOLLicenseCardRegNum_RU  = _bolData.licenseCardRegNum();
            salesParmTable.BOLLicenseCardSeries_RU  = _bolData.licenseCardSeries();
            salesParmTable.BOLLicenseCardNum_RU     = _bolData.licenseCardNum();
            salesParmTable.BOLTransportationType_RU = _bolData.transportationType();
            salesParmTable.BOLCarrierType_RU        = _bolData.carrierType();
            salesParmTable.BOLCarrierCode_RU        = _bolData.carrierCode();
        }

        salesParmTable.insert();

        if (_bolData)
        {
            if (_bolData.addressTransTableId() && _bolData.addressTransRecId())
            {
                AddressTrans_RU::copy(salesParmTable.TableId, salesParmTable.RecId, _bolData.addressTransTableId(), _bolData.addressTransRecId(), AddressType::Lading_W);
                AddressTrans_RU::copy(salesParmTable.TableId, salesParmTable.RecId, _bolData.addressTransTableId(), _bolData.addressTransRecId(), AddressType::Unlading_W);
            }
        }

        for (iLines = 1; iLines <= conlen(_conLines); iLines ++)
        {
            recId       = conpeek(_conLines, iLines);

            salesLine   = SalesLine::findRecId(recId);

            if (salesLine.SalesId == salesId)
            {
                salesFormLetter.createParmLine(salesLine, salesParmTable.TableRefId);
            }
        }

    }

    salesFormLetter.run();

    ttscommit;

    return salesFormLetter.journal();
}
За это сообщение автора поблагодарили: hated8 (1).
Старый 24.05.2010, 16:17   #10  
hated8 is offline
hated8
Участник
Аватар для hated8
Злыдни
 
133 / 18 (1) ++
Регистрация: 27.06.2008
Нда.....
Против лома нет приёма..... )

Конечно надеялся найти способ попроще но увы и ах....... )
Всем спасибо!
__________________
Что сломалось не знаем, но уже немного подчинили...
Старый 24.05.2010, 17:08   #11  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
а может попробовать посмотреть, как работает кнопка Выбор на форме SalesEditLines?

Последний раз редактировалось Wamr; 24.05.2010 в 17:12.
Старый 25.05.2010, 07:58   #12  
hated8 is offline
hated8
Участник
Аватар для hated8
Злыдни
 
133 / 18 (1) ++
Регистрация: 27.06.2008
кнопка Выбрать просто делает выборку из salesParmTable_ds а в моём случае её еще заполнить надо... Да и _ds нет!....
__________________
Что сломалось не знаем, но уже немного подчинили...
Старый 25.05.2010, 10:15   #13  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
кнопка Выбрать обычно даёт возможность изменить qeuryRun.query(), по которому потом делается выборка. Как раз туда и можно засунуть Ваш SalesId '.....*'.. попробуйте.
X++:
static void JobSFL(Args _args)
{
    SalesFormLetter sfl = SalesFormLetter::construct(DocumentStatus::Invoice);
    
    sfl.createParmUpdate(true);
    if(sfl.prompt())
        sfl.run();
}

Последний раз редактировалось Wamr; 25.05.2010 в 10:24.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ввод накладных расходов на основании документов gl00mie DAX: Функционал 2 10.11.2006 01:10
Расхождение функционала журнала одобрения накладных. PavelM DAX: Функционал 4 22.12.2005 19:03
Одобрение накладных Swetik DAX: Функционал 1 24.11.2003 14:53
Счёт-фактуры из накладных LCh DAX: Программирование 17 20.08.2003 18:26
Произвольная Lookup форма Maxim Gorbunov DAX: База знаний и проекты 0 30.11.2001 21:59

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

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

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