Пример скриптов CommerceML

207 views
Skip to first unread message

Vladimir

unread,
Apr 21, 2012, 12:17:57 PM4/21/12
to qbalance
Выкладываю пример скриптов для загрузки документа CommerceML.
Демонстрирует использование событий формы документа, объектов и
функций приложения в скриптах. Написано с использованием
QtScriptGenerator'а (похоже в нем есть некоторые проблемы при работе
QMessageBox).


--------Начало
кода------------------------------------------------------------------------------------------------------------------------------------

function EventInitForm(form)
{ // Событие происходит сразу после создания формы документа
form.getButtonLoad().show(); // Включим кнопку "Загрузить документ"
на форме
}


function EventImport(form)
{ // Событие происходит при нажатии кнопки <Загрузить документ>
var fileName = QFileDialog.getOpenFileName(form, "Откройте документ
с приходом товара", QDir.currentPath(), "Документ XML(*.XML)");
if (fileName != "")
{
var file = new QFile(fileName);
if (file.open(QIODevice.OpenMode(QIODevice.ReadOnly,
QIODevice.Text)))
{
var doc = new QDomDocument();
if (doc.setContent(file))
{
if
(doc.elementsByTagName("ХозОперация").at(0).toElement().text() ==
"Отпуск товара") // Если это документ на отгрузку товара
{
var docNumber =
doc.elementsByTagName("Номер").at(0).toElement().text();
var docDate =
doc.elementsByTagName("Дата").at(0).toElement().text();
var agentName = "";
var agentFullName = "";
var agentAddress = "";
// Найдем в документе реквизиты контрагента-продавца
var agents = doc.elementsByTagName("Контрагент");
for (var i = 0; i < agents.count(); i++)
{
if (agents.at(i).firstChildElement("Роль").text() ==
"Продавец")
{
agentName =
agents.at(i).firstChildElement("Наименование").text();
agentFullName =
agents.at(i).firstChildElement("ОфициальноеНаименование").text();
agentAddress =
agents.at(i).namedItem("ЮридическийАдрес").namedItem("Представление").toElement().text();
break;
}
}
if (agentName != "") // Если указан контрагент-продавец
{
if (agentFullName == "")
agentFullName = agentName;
document.setNumber(docNumber);
document.setDate(docDate, Qt.ISODate);
var agentDict = getDictionary("vw_контрагенты"); // Найдем
такого контрагента в нашей БД
agentDict.query("имя = '" + agentFullName + "'");
var agentId = agentDict.getId(0);
if (agentId == 0) // Если такого контрагента не
существует в справочнике
{
var agentMsg = new QMessageBox(QMessageBox.Question,
"Внимание!", "Не найден такой контрагент. Создать?", QMessageBox.Yes,
form);
if (agentMsg.exec() == QMessageBox.Yes)
{
db.exec("INSERT INTO контрагенты (имя, адрес) VALUES
('" + agentFullName + "', '" + agentAddress + "')");
agentDict.query("имя = '" + agentFullName + "'");
agentId = agentDict.getId(0);
}
}
// Сделаем наименование контрагента-продавца видимым на
форме документа
agentDict.setId(agentId);
document.showParameterText("vw_контрагенты");
EventParametersChanged();
documents.setValue("Комментарий",
getDictionary("vw_контрагенты").getValue("имя"));
var firmId = agentDict.getValue("код_фирмы"); // Получим
код фирмы отгрузки контрагента
if (firmId == 0)
{
var firmMsg = new QMessageBox(QMessageBox.Question,
"Внимание!", "У контрагента не указана фирма отгрузки. Создать?",
QMessageBox.Yes, form);
if (firmMsg.exec() == QMessageBox.Yes)
{
// По умолчанию создается фирма отгрузки с
наименованием как у контрагента
var firmDict = getDictionary("фирмы");
// Сначала поищем уже существующую фирму с таким
наименованием
firmDict.query("имя = '" + agentName + "'");
firmId = firmDict.getId(0);
if (firmId == 0)
{
// Фирмы с таким наименованием нет, поэтому
создаем новую запись
db.exec("INSERT INTO фирмы (имя) VALUES ('" +
agentName + "')");
firmDict.query("имя = '" + agentName + "'");
firmtId = firmtDict.getId(0);
}
// Сохраняем ссылку на фирму отгрузки в записи
контрагента
db.exec("UPDATE контрагенты SET код_фирмы = " +
firmId + " WHERE код = " + agentId);
}
}
// Переберем все позиции в накладной
var tovar = doc.elementsByTagName("Товар");
for (var i = 0; i < tovar.count(); i++)
{
var tovarId = tovar.at(i).firstChildElement("Ид").text();
var tovarName =
tovar.at(i).firstChildElement("Наименование").text();
var tovarArticul =
tovar.at(i).firstChildElement("Артикул").text();
var tovarUnit =
tovar.at(i).firstChildElement("Единица").text();
var tovarQuan =
tovar.at(i).firstChildElement("Количество").text();
var tovarPrice =
tovar.at(i).firstChildElement("ЦенаЗаЕдиницу").text();
var tovarSum = tovar.at(i).firstChildElement("Сумма").text();
WriteTovar(firmId, tovarId, tovarName, tovarArticul, tovarUnit,
tovarQuan, tovarPrice, tovarSum)
}
document.query();
document.calcItog();
}
else
QMessageBox.warning(form, "Документ CommerceML", "Не
найден контрагент - продавец");
}
else
QMessageBox.warning(form, "Документ CommerceML", "Это не
документ на отгрузку товара");
}
else
QMessageBox.warning(form, "Документ CommerceML", "Не удалось
разобрать документ");
file.close();
}
else
QMessageBox.warning(form, "Документ CommerceML", QString("Не
могу открыть файл %1:\n%2.") .arg(fileName) .arg(file.errorString()));
}
}


function WriteTovar(firmId, id, name, articul, unit, quan, price, sum)
// Запишем позицию в документ, предварительно выяснив соответствие в
таблице прайсов
{
var nomId = 0;
var nomDict = getDictionary("номенклатура");
// Поищем в прайсе поставщика запись о позиции, которая поступила
var priceRec = db.execQuery("SELECT код, имя, цена,
код_номенклатура, кол_номенклатура, кол_прайс FROM прайсы WHERE
код_фирмы = " + firmId + " AND кодвпрайсе = '" + id + "'");
if (priceRec.size() != 0) // Если в прайсе есть записи о такой
позиции
{
if (priceRec.first())
nomId = priceRec.record().value("код_номенклатура"); //
Посмотрим, какой нашей позиции соответствует это название в прайсе
}
if (nomId == 0) // Если мы не знаем, какой нашей позиции
соотстветствует это наименование
{ // тогда спросим это у пользователя
var formTitle = nomDict.getFormTitle();
nomDict.setFormTitle("Укажите позицию аналогичную: " + name + " ("
+ articul + ")"); // Установим в заголовке окна подсказку для
пользователя
nomDict.exec()
nomDict.setFormTitle(formTitle);
if (nomDict.isFormSelected()) // если пользователь нажал кнопку Ok
{
nomId = nomDict.getId();
}
}
else
nomDict.setId(nomId);
if (nomId != 0) // Если пользователь выбрал какую-либо позицию в
своей номенклатуре или позиция была выбрана автоматически на основании
соответствия
{
if (priceRec.size() == 0) // Если в прайсе раньше такой позиции
не было
db.exec("INSERT INTO прайсы (кодвпрайсе, имя, артикул, едизм,
цена, наличие, код_фирмы, код_номенклатура) VALUES ('" + id + "','" +
name + "','" + articul + "','" + unit + "'," + price + ", '+'," +
firmId + "," + nomId + ")");
else
db.exec("UPDATE прайсы SET код_номенклатура=" + nomId + ",имя='"
+ name + "',артикул='" + articul + "',едизм='" + unit + "',цена=" +
price + ",наличие='+' WHERE код_фирмы=" + firmId + " AND кодвпрайсе='"
+ id + "'");
// Запишем кол-во, цену, сумму в проводку
document.setPrvValue("p1__кол", quan);
document.setPrvValue("p1__цена", price);
document.setPrvValue("p1__сумма", sum);
// Сохраним проводку на сервере
document.appendDocString();
}
}


function EventParametersChanged()
{
// Запишем наименование фирмы-поставщика в комментарии к документу
documents.setValue("Комментарий",
getDictionary("vw_контрагенты").getValue("имя"));
}

//
*********************************************************************************************************/
// Эта часть скрипта относится к вычислениям табличной части документа

кол = getValue("p1__кол");
цена = getValue("p1__цена");
сумма = getValue("p1__сумма");

if (getCurrentFieldName() == "p1__сумма" && кол != 0)
{
цена = сумма / кол;
}
else
{
сумма = кол * цена;
}

setValue("p1__кол", кол);
setValue("p1__цена", цена);
setValue("p1__сумма", сумма);

--------Конец
кода------------------------------------------------------------------------------------------------------------------------------------

Vladimir

unread,
Apr 21, 2012, 12:20:25 PM4/21/12
to qbalance
Здесь смотрится не презентабельно. Лучше скопипастить в какой-нибудь
редактор с подсветкой синтаксиса явы.

Drake

unread,
Apr 24, 2012, 12:54:17 AM4/24/12
to qbal...@googlegroups.com
В глаза сразу бросается динамический SQL.
Используй уж параметризованные запросы.

суббота, 21 апреля 2012 г., 20:20:25 UTC+4 пользователь Vladimir написал:
Reply all
Reply to author
Forward
0 new messages