Привет! Есть код на с++ Builder и 1Cv77. Код bcb это переделанный код 1Cv77 с использованием OLE. Вопрос вот в чем, когда я пытаюсь вызвать ф-цию с необяз. параметрами, например | Код | ole1C.Exec(Function("глВернутьЦену") << sprGoods.Exec(Function("ТекущийЭлемент")) << sprPrice.Exec(Function("ТекущийЭлемент")) << Unassigned << &price);
//глВернутьЦену(СпрНоменк.ТекущийЭлемент(), СпрТипЦен.ТекущийЭлемент(), ,ценаТовара, , , , );
|
то непонятно как передавать эти параметры, как ни пробовал ф-ция возвращает либо ошибку либо 0 (параметр &price) Пробовал Variant::Empty(), 0, Unassigned - не помогает! *а вот когда передаешь все параметры своего типа то ф-ция работает возвращает нужный результат Как быть? Код bcb, переделка 1сv77 через OLE | Код | Variant ole1C;
ole1C = CreateOleObject("V1CEnterprise.Application");
if(!ole1C.IsEmpty()) { ole1C.OleProcedure("Initialize", ole1C.OlePropertyGet("RMTrade"), "/DC:\\1 /NФедоров /P", "NO_SPLASH_SHOW");
Variant sprGoods, sprPrice; Variant curGroup; Variant groupCode((char *)"00001985"); Variant priceCode((char *)"00004"); Variant storeCode((char *)"00001");
Variant quantity((double)-1); Variant price((double)0); Variant date ((TDateTime) Now());
sprGoods = ole1C.Exec(Function("EvalExpr") <<"СоздатьОбъект(\"Справочник.Номенклатура\")"); sprPrice = ole1C.Exec(Function("EvalExpr") <<"СоздатьОбъект(\"Справочник.ТипыЦен\")");
if(sprGoods.Exec(Function("НайтиПоКоду") << groupCode << Variant((int) 0)) == Variant((int) 1)) //найдем и выберем нужную группу { curGroup = sprGoods.Exec(Function("ТекущийЭлемент")); if(curGroup.Exec(Function("ЭтоГруппа")) == Variant((int) 1))//есть группа { sprGoods.Exec(Function("ИспользоватьРодителя") << curGroup); sprGoods.Exec(Function("ВыбратьЭлементы"));
while (sprGoods.Exec(Function("ПолучитьЭлемент") << Variant((int) 0)).operator int() == 1) { if(sprGoods.Exec(Function("ТекущийЭлемент")).Exec(Function("ЭтоГруппа")).operator int() == 0)//список товаров группы { if(sprPrice.Exec(Function("НайтиПоКоду") << priceCode << Variant((int) 0)) == Variant((int) 1)) { //ole1C.Exec(Function("РабочаяДата")); ole1C.Exec(Function("глВернутьЦену") << sprGoods.Exec(Function("ТекущийЭлемент")) << sprPrice.Exec(Function("ТекущийЭлемент")) << Unassigned << &price); }
Variant sprStore = ole1C.Exec(Function("EvalExpr") <<"СоздатьОбъект(\"Справочник.Склады\")"); Variant sprReg = ole1C.Exec(Function("EvalExpr") <<"СоздатьОбъект(\"Регистр.ОстаткиТМЦ\")");
sprStore.Exec(Function("НайтиПоКоду") << storeCode);
quantity = sprReg.Exec(Function("СводныйОстаток") << Variant((int) 0) << sprGoods.Exec(Function("ТекущийЭлемент")) << sprStore.Exec(Function("ТекущийЭлемент")) << date << Variant((char *) "Количество"));
//Ост = Регр.СводныйОстаток(,ном.ТекущийЭлемент(), Склд.ТекущийЭлемент(),,"Количество");
}
ListBox1->Items->Add(sprGoods.OlePropertyGet("Код") + sprGoods.OlePropertyGet("Наименование") + AnsiString("Цена") + FloatToStr(price.operator double() ) + AnsiString("Остаток") + FloatToStr(quantity.operator double() )); Application->ProcessMessages(); } } }
sprGoods = Unassigned; sprPrice = Unassigned; }
ole1C = Unassigned; //close 1C app.
|
исходный код 1сv77 | Код | //Возвращает все товары указанной группы (артикул, наим., цена, остаток) Функция УВП_ВыбратьТоварыПоКодуГруппы(кодГруппы, кодТипаЦен, кодСклада) Перем ВыбранныеТовары; Перем СпрНоменк, СпрТипЦен, ВыбрГруппа, ценаТовара; ВыбранныеТовары = СоздатьОбъект("ТаблицаЗначений"); ВыбранныеТовары.НоваяКолонка("КодТовара"); ВыбранныеТовары.НоваяКолонка("НаимТовара"); ВыбранныеТовары.НоваяКолонка("ЦенаТовара"); ВыбранныеТовары.НоваяКолонка("ОстатокТовара"); СпрНоменк = СоздатьОбъект("Справочник.Номенклатура"); СпрТипЦен = СоздатьОбъект("Справочник.ТипыЦен"); Если СпрНоменк.НайтиПоКоду(кодГруппы,0) = 1 Тогда //найдем и выберем нужную группу ВыбрГруппа = СпрНоменк.ТекущийЭлемент(); Если ВыбрГруппа.ЭтоГруппа() = 1 Тогда //есть группа СпрНоменк.ИспользоватьРодителя(ВыбрГруппа); СпрНоменк.ВыбратьЭлементы();
Пока СпрНоменк.ПолучитьЭлемент(0)=1 Цикл Если СпрНоменк.ТекущийЭлемент().ЭтоГруппа() = 0 Тогда //список товаров группы ВыбранныеТовары.НоваяСтрока(); ВыбранныеТовары.КодТовара = СпрНоменк.Код; ВыбранныеТовары.НаимТовара = СпрНоменк.Наименование; ценаТовара = -1;// по умолч. цена = 0 Если СпрТипЦен.НайтиПоКоду(кодТипаЦен,0) = 1 Тогда глВернутьЦену(СпрНоменк.ТекущийЭлемент(), СпрТипЦен.ТекущийЭлемент(), ,ценаТовара, , , , ); КонецЕсли; ВыбранныеТовары.ЦенаТовара = ценаТовара; ВыбранныеТовары.ОстатокТовара = УВП_ОстаткиТовара(СпрНоменк.Код, кодСклада); КонецЕсли; КонецЦикла; КонецЕсли КонецЕсли; Возврат ВыбранныеТовары; КонецФункции //ВыбратьТоварыПоКодуГруппы(кодГруппы, кодТипаЦен, кодСклада)
|
Это сообщение отредактировал(а) sergey_85 - 1.3.2009, 19:20
--------------------
A good design always pays off.
|