Показать сообщение отдельно
Старый 09.10.2003, 10:46   #7  
Valia is offline
Valia
Участник
 
139 / 23 (1) +++
Регистрация: 09.07.2003
Адрес: там
ну так вот
Версия Axapt'ы - 2.5
теперь про разноски
Сначала приведу листинги методов

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


// назначение этого метода лежит в формировании строк исходной таблицы а, он работает и поэтому останавливаться на нем нет никакого смысла
void zagruzkaAll()
{
OdbcConnection C;
Statement S;
ResultSet R;
a TableA;
LoginProperty LP = new LoginProperty();

;


LP.setDSN("a");
C = new OdbcConnection(LP);
S = C.createStatement();
R = S.executeQuery ('SELECT * FROM b');

while (R.next())
{
TableA.inventJournalId = R.getString(1);
TableA.inventLineId = R.getString(2);
TableA.weight = R.getReal(3);
TableA.date_ = R.getDate(4);
// TableA.time = R.getInt(5);
TableA.vesId = R.getInt(6);
TableA.inventLocationIssue = R.getString(7);
TableA.wmsLocationIssue = R.getString(8);
TableA.inventLocationReceipt = R.getString(9);
TableA.wmsLocationReceipt = R.getString(10);
TableA.wmsPalletId = R.getString(11);
TableA.MOLIssue = R.getString(12);
TableA.MOLReceipt = R.getString(13);
TableA.controllerId = R.getString(14);
TableA.passwordId = R.getString(15);
TableA.inventBatchId = R.getString(16);
TableA.prodDate = R.getDate(17);
TableA.godnost = R.getDate(19);
TableA.inventGTDID_RU = R.getString(20);
TableA.posted = R.getBoolean(21);

TableA.insert();
}

}

// основное назначение этого метода - формирование по каждой строке исходной таблицы соответстующих строк складского журнала
void raznoska()
{
a TableA;
;

while select forUpdate TableA
where TableA.posted == 0
{
this.createJournalLine( TableA.inventJournalId,
TableA.inventLineId,
TableA.weight,
TableA.date_,
TableA.time,
TableA.vesId,
TableA.inventLocationIssue,
TableA.wmsLocationIssue,
TableA.inventLocationReceipt,
TableA.wmsLocationReceipt,
TableA.wmsPalletId,
TableA.MOLIssue,
TableA.MOLReceipt,
TableA.controllerId,
TableA.passwordId,
TableA.inventBatchId,
TableA.prodDate,
TableA.prodTime,
TableA.godnost,
TableA.inventGTDID_RU);
TableA.posted = 1;
TableA.update();
}

}


// в этом методе иедт непосредственное формирование строки сладского журнала
boolean createJournalLine(InventJournalId inventJournalId, str 20 inventLineId,
Weight weight, JournalTransDate _date, JournalTransTime time,
VesId vesId, InventLocationId inventLocationIssue,
wmsLocationId wmsLocationIssue, InventLocationId inventLocationReceipt,
wmsLocationId wmsLocationReceipt, wmsPalletId wmsPalletId,EmplId MOLIssue,
EmplId MOLReceipt, EmplId controllerId, str passwordId, InventBatchId inventBatchId,
SchedToDate ProdDate, SchedToTime ProdTime, godnostDate godnost, inventGTDId_RU inventGTDId_RU)
{

InventJournalTrans journalLine;
InventDim _inventDim;
InventDim inventDimIssue;
InventDim inventDimReceipt;

InventMovement _movement;

InventJournalCheckPost journalCheckPost;

;

inventJournalTable = InventJournalTable::find(inventJournalId);

// здесь на основании исходных данных таблицы а ищется необходимый журнал, если он не найден, тогда от создается новым, как формируется его inventJournalId - не принципиально, главное, что это работает и ошибки здесь нет
if(!inventJournalTable)
{
this.createJournalTable(inventJournalId);
inventJournalTable = InventJournalTable::find(inventJournalId);
}

journalLine.initFromInventJournalTable(inventJournalTable);
journalLine.journalType= InventJournalType::Transfer;


_movement = InventMovement::construct(journalLine);

// ниже производится заполнение полей строки журнала, за учета этой информации в таблицу InventJournalTrans добавлены некоторые поля
journalLine.ItemId = inventLineId;

journalLine.Qty = weight;

journalLine.date_ = _date;
journalLine.time_ = time;
journalLine.vesId = vesId;
journalLine.ProdDate = ProdDate;
journalLine.ProdTime = ProdTIme;
journalLine.godnost = godnost;

//-----------------------------------------------------------------------------------
// что делается этой строкой - до конца непонятно и очень хотелось бы знать вообще нужна она или нет
InventMovement::setAutoReserving(journalLine);

// далее для каждойсроки журнала ищутся или заводятся строки складской аналитики, для заноса информации о складе
journalLine.inventDimId = InventDim::findOrCreate(inventDimIssue).inventDimId;
journalLine.toInventDimId = InventDim::findOrCreate(inventDimReceipt).inventDimId;
journalLine.initValue();

journalLine.write();

inventDimIssue.InventLocationId = 'Zakup';//inventLocationIssue;
// для примера вводится название склада, которое в конечном счете почему то не отображается на форме - тоже еще один интересный вопрос
// inventDimIssue.inventDimId = journalLine.InventDimId;
inventDimIssue.write();


if (journalLine.inventDimId != inventDimIssue.inventDimId)
{
inventDimIssue.data(InventDim::find(journalLine.inventDimId));
inventDimIssue.write();
}

if (journalLine.toInventDimId != inventDimReceipt.inventDimId)
{
inventDimReceipt.data(InventDim::find(journalLine.toInventDimId));
inventDimReceipt.write();
}


inventDimIssue.update();
inventDimReceipt.update(true);
// здесь поисходит вызов метода, который и осуществляет разноску
this.sendToRaznoska();

return true;
}

// данный метод разносит сформированную строку, он работает нормально - это подтверждают проведенные тесты этого метода - если сформировать в ручную строку, а потом вызвать данный метод, то он нормально все разнесет, но если это попытаться сделать автоматически, то разноски не произойдет даже в том злучае, если это сделать вручную
void sendToRaznoska()
{
InventJournalCheckPost journalCheckPost;

;


journalCheckPost = InventJournalCheckPost::construct();
journalCheckPost.getLast();
journalCheckPost.parmPost(NoYes::Yes); //yes
journalCheckPost.parmJournalNum(inventJournalTable.JournalId); //journalId
journalCheckPost.parmVoucher(''); //''
journalCheckPost.parmComplete(NoYes::Yes); //yes

journalCheckPost.parmJournalCheckPostType(JournalCheckPostType::Post);
journalCheckPost.parmJournalCheckPostDialog(JournalCheckPostDialog::Invent);


journalCheckPost.run();
journalCheckPost.jobStatistics();


}


Таким образом можно подвести итог:

разноска производится автоматически правильно сформированного журнала (т.е. строк сформированных не этим классом), при формировании строки журнала не выполняются какие-то действия, который по всему видимому должны выполняться внешними классами (предположительно классом InventMovement)? по мимо того что не происходит формирования строк журнала, информация о складской аналитике также не заносится.

Как это сделать правильно и что как использовать другие классы, - вот на эти вопросы очень бы хотелось получить советы.

Подскажите пожалуйста.

Заранее огромное спасибо