Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Dip-Othet-verst2.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
2.48 Mб
Скачать

2.6.3.2 Описание методов экземпляра 1с

После того, как мы создали и проинициализировали OLE-объект, работать с ним можно следующим образом:

  • Метод EvalExpr вычисляет выражение, записанное параметре <СтрокаВыражения> на встроенном языке 1С:Предприятие и возвращает результат вычисления. Результатом выражения может быть число, строка, дата или значение любого агрегатного типа данных.

  • С помощью метода CreateObject(<ИмяАгрегатногоТипа>). Метод CreateObject создает объект агрегатного типа данных системы 1С:Предприятие и возвращает ссылку на него. Данная функция обычно используется одновременно с явным определением переменной типа OLEVariant и присвоением ей ссылки на объект агрегатного типа данных.

  • С помощью метода ExecuteBatch(<СтрокаОператоров>). Метод ExecuteBatch выполняет последовательность операторов, записанную в параметре <СтрокаОператоров> на встроенном языке 1С:Предприятие. Метод возвращает -1, если последовательность операторов выполнена успешно, или 0 в противном случае.

Детали реализации импорта

Т.к. модуль импорта не предусматривает проверку накладных после их импортирования, т.е. снятие накладных с проведения или изменение из содержимого. То следует сперва удостоверится в неизменности данных перед импортом. В связи с этим была составлена схема бизнес процесса, в котором четко видно, когда можно производить импорт. Он полезна как разработчику, так и пользователю системы.

Рисунок 2.6 - Бизнес процесс импорта из 1С в Oracle

В реализации импорта задействованы следующие технологии и языки:

  • Pascal (язык описания процедуры главной импорта);

  • Встроенный в 1С язык запросов (используется для формирования необходимых данных);

  • ANSI SQL (используется для вставки строки с накладной);

  • PL/SQL (используется для вставки многострочной части накладной);

  • Технология OLE (для связи Delphi и 1C).

Общую схему потоков данных можно изобразить так:

Рисунок 2.7 - Общую схему потоков данных

Алгоритм импорта расходных накладных из 1С:

Рисунок 2.8 - Алгоритм импорта

2.6.5 Код процедуры импорта

/********************* Процедура импорта расх. накладных из 1С********************/

procedure TfClient.bt1cNaklExportClick(Sender: TObject);

var

counter: integer; //Счетчик импортированных записей

V77: Olevariant; //OLE-объект программы 1С:Предприятие

query: olevariant; //Агрегатные объекты

sql_command, query_command : string;

FChangeInterval: TFChangeInterval;

AFromDate, AToDate: TDate;

i: integer;

first: boolean;

kod_1c :string;

SumSoSkid,kolvo : double;

begin

sql_command := '';

FChangeInterval:=TFChangeInterval.Create(self);

AFromDate:=Today-5;

AToDate:=Today;

if (FChangeInterval.DoChangeInterval(AFromDate,AToDate)<>mrOk) then // интервал датт

exit;

try

V77 := create1CApplication;

query := V77.createobject('Запрос');

if VarType(V77) <> varDispatch then

DatabaseError('Не могу создать Запрос');

query_command:= 'Период с '''+ DateToStr(AFromDate) + ''' по '''+ DateToStr(AToDate) + ''';' +

'РасхНаклНомерДок = Документ.РасходнаяНакладная.ТекущийДокумент.НомерДок;' +

'НомерДок = Документ.РасходнаяНакладная.НомерДок;' +

'КлиетнКод = Документ.РасходнаяНакладная.Клиент.Код;' +

'СуммаСоСкидкой = Документ.РасходнаяНакладная.СуммаСоСкидкой;'+

'ДатаДок = Документ.РасходнаяНакладная.ДатаДок;'+

'Товар = Документ.РасходнаяНакладная.Товар.Наименование;'+

'ТоварКод = Документ.РасходнаяНакладная.Товар.Код;'+

'ЦенаПриобретения = Документ.РасходнаяНакладная.Товар.ЦенаПриобретения;'+

'Количество = Документ.РасходнаяНакладная.Количество;'+

'СумСоСкид = Документ.РасходнаяНакладная.СумСоСкид;'+

'Группировка РасхНаклНомерДок;'+

'Группировка СтрокаДокумента;';

query.Execute(query_command);

while query.Group('РасхНаклНомерДок') > 0 do

begin

kod_1c := query.РасхНаклНомерДок;

OQnakl_rasxod.SetVariable('sum',query.СуммаСоСкидкой);

OQnakl_rasxod.SetVariable('kod_1c',kod_1c);

OQnakl_rasxod.SetVariable('date_create',query.ДатаДок);

OQnakl_rasxod.SetVariable('partner_1c',query.КлиетнКод);

try

OQnakl_rasxod.Execute;

OQnakl_rasxod_CURRVAL.Execute;

OQnakl_rasxod_t.SetVariable('P_ID_NAKL_RASXOD',

OQnakl_rasxod_CURRVAL.FieldAsInteger(0));

while query.Group('СтрокаДокумента') > 0 do

begin

SumSoSkid := query.СумСоСкид;

kolvo := query.СумСоСкид;

OQnakl_rasxod_t.SetVariable('P_ID_GOOD',query.ТоварКод);

OQnakl_rasxod_t.SetVariable('P_GOOD_NAME',query.Товар);

OQnakl_rasxod_t.SetVariable('P_COUNT',query.Количество);

OQnakl_rasxod_t.SetVariable('P_BUY_COST',query.ЦенаПриобретения);

OQnakl_rasxod_t.SetVariable('P_GOODS_SUM',query.СумСоСкид);

OQnakl_rasxod_t.Execute;

end;

except

;//подавляем ошибки

end;

end;

finally

fMain.OracleSession.Commit;

V77 := UnAssigned;

ARefresh.Execute;

end;

end;

//Код вставки накладной

/****************************** OQnakl_rasxod.SQL ****************************/

‘INSERT INTO crm.nakl_rasxod

(SUM, kod_1c, date_create, partner_1c)

VALUES (:SUM, :kod_1c, :date_create, :partner_1c)’;

//Код вставки строки накладной

/****************************** OQnakl_rasxod_t.SQL ****************************/

‘begin

CRM.NAKL_RASXOD_T_INSERT(:p_id_good,:p_good_name,:p_id_nakl_rasxod,:p_count,:p_buy_cost,:p_goods_sum);

end;’;

/****************************** NAKL_RASXOD_T_INSERT ***********************/

CREATE OR REPLACE PROCEDURE NAKL_RASXOD_T_INSERT (

p_id_good IN crm.good.id_good%TYPE,

p_good_name IN crm.good.NAME%TYPE,

p_id_nakl_rasxod IN crm.nakl_rasxod_t.ID_NAKL_RASXOD%TYPE,

p_count IN crm.nakl_rasxod_t.COUNT%TYPE,

p_buy_cost IN crm.nakl_rasxod_t.buy_cost%TYPE,

p_goods_sum IN crm.nakl_rasxod_t.goods_sum%TYPE

)

/*

Процедура вставки строки расходной накладной, проверяем есть ли товар в

таблице good, если нет вставляем его в таблицу good и затем вставляем в nakl_rasxod_t

*/

IS

v_id_good crm.nakl_rasxod_t.id_good%TYPE;

BEGIN

BEGIN

SELECT id_good

INTO v_id_good

FROM good g

WHERE g.id_good = p_id_good;

EXCEPTION

WHEN NO_DATA_FOUND

THEN

INSERT INTO good

VALUES (p_id_good, p_good_name);

END;

INSERT INTO nakl_rasxod_t

(ID_NAKL_RASXOD, id_good, COUNT, sale_cost, buy_cost,

goods_sum)

VALUES (p_ID_NAKL_RASXOD, p_id_good, p_count, p_goods_sum/p_count, p_buy_cost, p_goods_sum);

END; -- nakl_rasxod_t_insert

/

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]