Необходимо чтобы остатки из СМ2000 (у нас 1.028.2) выгружались на кассу (УКМ4 47 sp5). В магазинах по одной кассе. Как это можно реализовать?
В СП говорят, что СМ2000 не выгружает остатки, хотя возможность работы с ними есть в УКМ. Есть возможность реализации этого через Web компонету СМ2000 (установив IIS и настроив так, чтобы УКМ при запросе кассира обращалась к нему и брала остатки сразу из СМ2000.) Кто пользуется данными возможностями?
P.S. Поднимаю новую тему, т.к. поиск выдает старые данные, думаю, что за эти годы могло появиться что то нужное нам.
Заранее спасибо за дельные советы.
сомневаюсь, чтобы много народу этим всерьез занималось.
по-моему, эта функция появилась в укм48sp2. так что первое, что вас ждет - это апдейт укм4. потом развлекуха с IIS, который еще и лицензировать надо.
дело вкуса, но лично я бы, наверное, сначала проверил, можно ли где-то в укм4 увидеть остаток, если вгрузить его через addnum1. в проверке цены, к примеру.
если можно - тогда после выгрузки (проверить наличие файлов-флагов) внешним скриптом пробежать по plu и заполнить addnum1, а потом уже только отдать все это укм-у. если обмен настроить текстовый, то всех дел на день.
То, что остаток можно грузить в укм, это понятно. Даже в "стандартном 2CSV импорте" есть "Брать остатки из свойства add1". Вопрос, чем именно выгружать эти остатки из СМ2000?
Dusha➤ То, что остаток можно грузить в укм, это понятно. Даже в "стандартном 2CSV импорте" есть "Брать остатки из свойства add1". Вопрос, чем именно выгружать эти остатки из СМ2000?
на самом деле выгрузить не проблема, особенно если пользуете "стандартный 2CSV".
всего-то и надо собрать простенький скриптик, который пробежит по карточкам и впишет остатки.
ну придется еще сделать задание в шедулере, которое будет раз в 10 (к примеру) минут проверять флажки, запускать скрипт и перекладывать файлы из каталога, куда положил супермаг без остатков, в каталог, откуда заберет укм4 уже с остатками.
вопрос в другом: когда остатки уже попали в укм4 - где их будет видно? никогда с остатками не работал.
Остатки на кассу выгрузить удалось и касса с ними работает. Остаток видно и при запросе цены товара и в подборе. Вопрос теперь только в автоматизации этого процесса, а именно в выгрузке в текстовый файлик информации вида "article", остаток и написании скрипта объединяющего файл выгрузки с этим файлом по полю article.
ничего особо не проверялось, предварительно тщательно обнюхивать!!!
рассматривать скорее как отправную точку, а не как готовое решение.
скормить в sqlplus:
sqlplus supermag/qqq@db2000 @c:\sql\remains.sql
протокол обмена проще отстроить, если все выгрузки будут полные.
имена файлов-флагов сверяйте с настройками конвертера укм4 и проверяйте, что там на самом деле падает!!! пишу по памяти, могу чего-нить попутать.
1) проверить наличие cashXX.CNG (для полной выгрузки; XX - номер кассы) и отсутствие cash.NON в каталоге, куда пишет см+
2) выложить туда cashXX.LDD
3) прогнать скрипт
4) в каталоге, откуда будет забирать укм4, проверить отсутствие cashXX.LDD
5) положить в каталог укм4 cash.NON, остальное вычистить
6) скопировать все файлы *.dat , кроме plucash.dat
7) скопировать plucash2.dat переименовать в plucash.dat
8) скопировать cashXX.CNG
9) убрать cash.NON из каталога укм4
10) убрать cashXX.LDD из каталога см+
остатки в текстовой выгрузке:
Код:
DECLARE
-- c:\sql\remains.sql
-- прописываем остатки в выгрузке из СМ+ на кассы
sm_sl NUMBER(5) := 34; -- ID места хранения
k_outF UTL_FILE.FILE_TYPE;
k_inF UTL_FILE.FILE_TYPE;
k_Dir VARCHAR2(20) := 'SM_DATA'; -- директория, созданная в базе. до версии 9.2.0 тут должен быть путь к файлу
k_inN VARCHAR2(20) := 'PLUCASH.dat'; -- имя файла входных данных
k_outN VARCHAR2(20) := 'PLUCASH2.dat'; -- имя выходного файла
tab char(1) := ','; -- разделитель полей
cn VARCHAR2(511); -- загружаемая строка
cac NUMBER(3); -- номер позиции разделителя полей
cnb VARCHAR2(255); -- начало строки до addnum1
cne VARCHAR2(255); -- конец строки после addnum1
sm_article VARCHAR2(255); -- артикул СМ+
sm_goods NUMBER(8,3); -- остаток по документам
sm_online NUMBER(8,3); -- оперативные продажи
sm_remains VARCHAR2(255); -- оперативный остаток в тексте для вставки в выгрузку
check_art NUMBER(5); -- для проверки, что артикул еще жив (всякое бывает)
BEGIN
k_inF := UTL_FILE.FOPEN(k_Dir,k_inN,'r');
k_outF := UTL_FILE.FOPEN(k_Dir,k_outN,'w');
loop
-- пробегаем циклом по файлу карточек
begin
UTL_FILE.GET_LINE(k_inF,cn);
exception
WHEN NO_DATA_FOUND THEN EXIT;
end;
cac := instr(cn,tab); -- находим первый разделитель
sm_article := replace(SUBSTR(cn,1,cac-1),'"',''); -- в первом поле в кавычках артикул. достаем его оттуда
-- addnum1 - восьмое поле. то есть поле после седьмого разделителя
cac := instr(cn,tab,1,7); -- находим 7-й разделитель
cnb := SUBSTR(cn,1,cac); -- запоминаем начало строки до поля addnum1
cne := SUBSTR(cn,cac+1); -- запоминаем конец строки
sm_remains := '0'; -- обнулим остатки на случай, если в базе про них ничего не найдем
-- если артикул в базе нашелся - достаем его остатки и оперативные продажи
SELECT count(*) INTO check_art FROM SMCard WHERE Article = sm_article;
if check_art = 1 then
begin
-- остатки
sm_goods :=0 ;
SELECT count(*) INTO check_art FROM smgoods WHERE Article = sm_article AND storeloc=sm_sl;
if check_art = 1 then
SELECT quantity INTO sm_goods FROM smgoods WHERE article=sm_article AND storeloc=sm_sl;
end if;
-- оперативные продажи
sm_online := 0 ;
SELECT count(*) INTO check_art FROM smopergoods WHERE article=sm_article AND locid=sm_sl;
if check_art > 0 then
SELECT nvl(sum(salequantity),0)-nvl(sum(returnquantity),0) INTO sm_online FROM smopergoods WHERE article=sm_article AND locid=sm_sl;
end if;
-- считаем оперативный остаток, переводим в текст, заменяем десятичный разделитель (чтобы не зависеть от региональных настроек)
sm_remains := replace(to_char(sm_goods - sm_online),',','.');
end;
end if;
-- собираем обратно строку для выгрузки
cn := cnb||sm_remains||cne;
-- пишем готовую строку в исходящий файл
UTL_FILE.PUTF(k_outF,cn||'\n');
UTL_FILE.FFLUSH(k_outF);
end loop;
UTL_FILE.FCLOSE(k_inF);
UTL_FILE.FCLOSE(k_outF);
--------------------------------------------------
EXCEPTION
WHEN UTL_FILE.INVALID_PATH THEN
RAISE_APPLICATION_ERROR(-20100, 'Invalid Path');
WHEN UTL_FILE.INVALID_MODE THEN
RAISE_APPLICATION_ERROR(-20101, 'Invalid Mode');
WHEN UTL_FILE.INVALID_OPERATION THEN
RAISE_APPLICATION_ERROR(-20101, 'Invalid Operation');
WHEN UTL_FILE.INVALID_FILEHANDLE THEN
RAISE_APPLICATION_ERROR(-20300,'Invalid File Handle');
WHEN UTL_FILE.WRITE_ERROR THEN
RAISE_APPLICATION_ERROR(-20301,'Write Error');
WHEN UTL_FILE.INTERNAL_ERROR THEN
RAISE_APPLICATION_ERROR(-20302,'Internal Error');
END;
/
возможно, пользователю supermag надо будет добавить прав через администратора супермага, не помню.
Dusha➤ Остатки на кассу выгрузить удалось и касса с ними работает. Остаток видно и при запросе цены товара и в подборе. Вопрос теперь только в автоматизации этого процесса, а именно в выгрузке в текстовый файлик информации вида "article", остаток и написании скрипта объединяющего файл выгрузки с этим файлом по полю article.
A каким образом вы выгружали остатки, каким скриптом?