serg525 писал(а):P.S. Правильно ли я понимаю, что поле в таблице номенклатуры получается из поля LABEL таблицы расширением
добавлением суффикса "X_F"?
Расширения номенклатуры хранятся в таблице CL_NMK. Связь с основной таблицей номенклатуры MTR_CL_NMK производиться через поле FMAINWID, т.е. CL_NMK.FMAINWID=MTR_CL_NMK.FWID. Названия полей в этой таблице образуются добавлением символа F к метке расширения. Суффикс X_ прибавляется в настройке импорта для распознавания расширений, чтобы не спутать их с основными переменными.
Что касается алгоритма, то есть способ добавления расширений программно. Для этого нужно написать небольшой скрипт. Чтобы этот скрипт выполнялся при запуске импорта нужно его поместить в папку, где лежит рабочий XML-файл с настройкой, и переименовать его в соответствии с этим XML-файлом.
Например если для импорта номенклатуры используется файл /base/org1/import/nmk.xml, будет выполнятся скрипт /base/org1/import/nmk.js.
В скрипте для импорта номенклатуры должна быть описана функция importTbl.
Для создания расширений используется объект DpExtentionBuilder ("Objects/DpExtentionBuilder.js").
В принципе ничего сложного. . .
Рассмотрим на примере как работает функция импорта при добавлении новых строк.
function importTbl(sTblName, tblSource, oImporter)
{
//sTblName- название таблицы-приемника (для номенклатуры MTR_CL_NMK);
//tblSource – таблица с импортируемыми строками;
//oImporter – объект DbImporter (JDebet/scripts/Objects/DbImporter.js)
//цикл прохождения по импортируемым строкам
for(; !tblSource.isEOF(); tblSource.MoveNext())
{
var sFld = ""; //поля для вставки в таблицу-приемник
var sVal = ""; //значения переменных
var fcod = ""; //код номенклатуры
var fwid = 0; //идентификатор
var groupCod = ""; //код группы, можно поставить "0001." или другой
var arrExt = new Array(); //массив расширений
//проходим по всем переменным из настройки импорта
for(sFldTo in oImporter.varMap)
{
var fld = oImporter.varMap[sFldTo]; //название поля таблицы с импортируемыми строками
if(!fld || !sFldTo)
continue;
var sType = oImporter.getVarType(sFldTo); //тип переменной
var oVal = oImporter.getValue(fld, tblSource, sType, sFldTo); //значение переменной из источника
if(oVal==null || oVal=="undefined")
continue;
//делаем проверку является ли переменная расширением
//название расширения начинается с X_
if(oImporter.isExt(sFldTo))
{
arrExt[sFldTo] = oVal; //пока заносим значение расширения в массив
continue;
}
//создаем объекты, например для единиц измерения
if(oImporter.isObject(sType))
oVal = oImporter.createObject(sType, oVal, sFldTo);
if(sFldTo=="FCOD")
{
if(groupCod)
oVal = groupCod + oVal;
fcod = oVal;
}
//собираем все поля и значения в одну строку для SQL-запроса
sFld += sFldTo +",";
sVal += sqlTo(oVal) +",";
}
//добавляем идентификатор
fwid = GetUID();
sFld += "FWID";
sVal += fwid;
//для номенклатуры предусмотрен ряд обязательных полей
if(sTblName.indexOf("MTR_CL_NMK")!=-1)
{
if(sFld.toUpperCase().indexOf("FCOD")==-1)
{
sFld += ",FCOD";
sVal += ","+ sqlTo(nextNmkCod(groupCod));
}
if(sFld.toUpperCase().indexOf("FCEDIB")==-1)
{
sFld += ",FCEDIB";
sVal += ","+ sqlTo(1);
}
if(sFld.toUpperCase().indexOf("FEDI_SPR")==-1)
{
sFld += ",FEDI_SPR";
sVal += ","+ sqlTo(1);
}
if(sFld.toUpperCase().indexOf("FEDI1")==-1)
{
sFld += ",FEDI1";
sVal += ","+ sqlTo(1);
}
if(sFld.toUpperCase().indexOf("FFAS1")==-1)
{
sFld += ",FFAS1";
sVal += ","+ sqlTo(0);
sFld += ",FFAS2";
sVal += ","+ sqlTo(0);
sFld += ",FFAS3";
sVal += ","+ sqlTo(0);
sFld += ",FFAS4";
sVal += ","+ sqlTo(0);
sFld += ",FFAS5";
sVal += ","+ sqlTo(0);
}
if(sFld.toUpperCase().indexOf("FGRPID")==-1)
{
sFld += ",FGRPID";
sVal += ","+ createNmkGroup(groupCod);
sFld += ",FISGRP";
sVal += ","+ sqlTo(false);
}
if(!oImporter.checkCod(fcod, 0, "nmk"))
return false;
}
//формируем SQL-запрос для добавления импортируемой строки
var sSql = "insert into "+ sTblName +" ("+ sFld +") values ("+ sVal +")";
var bRet = ExecuteSQL(sSql);
if(!bRet && stopMassage(sTblName))
return;
var sTbl = sTblName;
if(sTblName.indexOf(".")!=-1)
sTbl = sTblName.substring(sTblName.indexOf(".")+1);
//добавляем недостающие расширения
if(sTblName.indexOf("MTR_CL_NMK")!=-1)
{
for(sVar in arrExt)
{
if(arrExt[sVar]==null)
continue;
var sLabel = sVar.substring(3);
addNmkExt(sLabel, sType, null);
}
}
//сохраняем значения расширений
oImporter.saveExt(sTbl, arrExt, fwid);
}
if(sTblName.indexOf("MTR_CL_NMK")!=-1)
{
//выстраиваем дерево номенклатуры
buildNmkGroups(true);
}
}
//функция для добавления расширений номенклатуры
function addNmkExt(sLabel, sType, sTxt)
{
include("Objects/DpExtentionBuilder.js");
sLabel = sLabel.toUpperCase().trim();
var oSnap = getSnap("select FWID, FTXT from ^CL_EXT where UPPER(FCLASS)='CL_NMK' and UPPER(FLABEL)="+ sqlTo(sLabel));
if(oSnap && oSnap[0])
return;
var num = 1;
oSnap = getSnap("select max(FPOS) from ^CL_EXT where UPPER(FCLASS)='CL_NMK'");
if(oSnap && oSnap[0])
num = Number(oSnap[0])+1;
var extBuilder = new DpExtentionBuilder("CL_NMK");
extBuilder.load();
var mCl = new Object();
mCl.FWID = GetUID();
mCl.Flabel = sLabel;
if(sTxt)
mCl.Ftxt = sTxt;
else
mCl.Ftxt = sLabel;
mCl.Fcomment = sTxt;
mCl.Fwidth = 10;
mCl.Fpos = num;
mCl.Fused = true;
mCl.FISCHECK = false;
mCl.Ftype = extType(sType);
mCl.Fformat = "";
mCl.Fisculc = false;
mCl.FCLASS = extBuilder.FCLASS;
if (extBuilder.FSUBCLASS)
mCl.FSUBCLASS = extBuilder.FSUBCLASS;
UpdateTable(extBuilder.getInfoTableName(), mCl, true);
extBuilder.commitStructure();
mCl.Fdefault = "";
extBuilder.save(mCl);
}
function extType(sType)
{
sType = String(sType).toLowerCase();
if(sType.indexOf("text")!=-1)
return "TEXT";
switch(sType)
{
case "bit":
case "5":
return "BOOL";
case "double":
case "4":
return "FLOAT";
case "long":
case "2":
return "INT";
case "1":
return "TEXT";
}
return sType.toUpperCase();
}
Такой скрипт создаст в базе недостающие расширения, которые описаны в настройке импорта.