26.05.2016 13:57
Вкратце что требуется - есть файлик (предположим, csv), там артикул, и некий код.
Как бы этот код записать в карточки, предположим, в поле "комментарий" ?
Или, если не скриптом, то, может быть, есть какие программки для этого ?
Или может как то можно почтовик для этой цели поиспользовать ? (база без ЦО, одиночный магазин).
26.05.2016 14:33
Почтовик вряд ли можно для одиночного, да и с бубнами там слишком много приседаний придется сделать, если речь идет о простой замене.
Вариантов много, например, список затащить в Excel и модифицировать до пачки update. Надо понимать длину этого списка и насколько разовое это будет задание. Теоретически, если не горит особо, могу в июне это сделать в оптимизаторе. Будешь кидать файлик ему, он будет менять комментарии.
26.05.2016 14:42
Длина списка - до 3-5 тыс. карточек. Задание - не совсем разовое, но и не поточное/каждодневное.
Интересно, а можно ли через SQL+ нечто подобное сделать - открыть файл, оттуда вытащить пары артикул-код и сделать update ?
26.05.2016 14:57
Цитата:
Starter Вкратце что требуется - есть файлик (предположим, csv), там артикул, и некий код.
Как бы этот код записать в карточки, предположим, в поле "комментарий" ?
Или, если не скриптом, то, может быть, есть какие программки для этого ?
Или может как то можно почтовик для этой цели поиспользовать ? (база без ЦО, одиночный магазин).
В exсel'e собрать скрипт 5 мин работы. Потом копирую в текстовик(нотепад + и т.п. ) и вырезаю табуляции. Всегда так со списочным апдейтом делаю. Отдельную софтину смысла нет писать, больше времени потратишь.
26.05.2016 14:58
Может чего не понял -

для массовой замены двойных кавычек делал
Цитата:
update smcard set smcard.shortname = translate(smcard.shortname, '"', '-')
where smcard.shortname like '%"%' and smcard.accepted = 2
если хочется через файл, то командная строка, как пример, можно переделать под себя что то из такого (читает адрес из файла, коннект, скрипт, результат в файл)
Цитата:
for /F "eol=; tokens=1-12,*" %%a in (%USERPROFILE%\Desktop\RunSQL\azs_host.txt) do sqlplus /nolog @%USERPROFILE%\Desktop\RunSQL\script.sql %%a %db% %USERPROFILE%\Desktop\RunSQL\info\%%b.csv
26.05.2016 15:12
Вот пример запроса, меняющий тип карточки (менеджеры ошибочно завели)
Код:
ALTER TRIGGER supermag.smcardfixattr DISABLE;
UPDATE supermag.smcard a
   SET a.datatype = 0
 WHERE a.article = '0003851';
COMMIT ;
ALTER TRIGGER supermag.smcardfixattr ENABLE;
по такому же принципу можно изменить/добавить и другие параметры
откл тригер
вносим изменения
вкл тригер
НО!!! надо понимать что прямые изменения таблиц ОПАСНЫ!
и у карточек нет поля комментарий
26.05.2016 15:14
Проще всего закинуть данные в доп. характеристики.
создаем новую доп. характеристику и уже в таблицу "supermag.smcardproperties" - вносим новые данные
26.05.2016 15:31
Как нету комментария....
SMCard.CARDCOMMENT - не то ?
доп. характеристики мне тоже больше нравятся, можно и их использовать - это вторичный вопрос. первичный - как бы "автоматизировать" процесс.
26.05.2016 15:47
самый простой вариант:
переносишь свои данные в эксель
комментарий в столбец 2, артикул в 4
в столбец 1 - пишешь - UPDATE supermag.smcard a SET a.CARDCOMMENT = '
в столбец 3 - ' WHERE a.article = '
в столбец 5 - ';
должно получиться:
UPDATE supermag.smcard a SET a.CARDCOMMENT = 'данные' WHERE a.article = 'артикул';
1, 3 и 5 столбцы копируешь на весь список
далее или через буфер или сохраняешь в txt(csv) переносишь все в блокнот
проверяешь чтобы все теги были правильно прописаны, не было служебных символов, лишних пробелов и т.д. и т.п.
добавляешь в конце строку : commit;
добавляешь в начало и в конец запросы вкл откл тригеров
сохраняешь а далее как удобнее можно через SQL+ вызвать....
если есть возможность, то лучше где-нибудь попрактиковаться.
08.06.2016 13:24
Цитата:
Starter Длина списка - до 3-5 тыс. карточек. Задание - не совсем разовое, но и не поточное/каждодневное.
Интересно, а можно ли через SQL+ нечто подобное сделать - открыть файл, оттуда вытащить пары артикул-код и сделать update ?
можно. у меня много разной чепухи подтягивается вот такими скриптами.
загрузка комментария в карточку из файла на сервере:
Код:
DECLARE
-- загрузка комментария в карточку Супермага

    k_outF   UTL_FILE.FILE_TYPE;
    k_inF    UTL_FILE.FILE_TYPE;
    k_Dir    VARCHAR2(20) := 'SM_DATA';       -- каталог данных на СЕРВЕРЕ; UTL_FILE работает только с данными на самом сервере, не на клменте.
                                              -- предварительно требуется данный каталог указать в базе. 
                                              -- например (сервер на linux, поэтому пути такие)
                                              -- create or replace directory SM_DATA as '/app/sql';
                                              -- или под виндой
                                              -- create or replace directory SM_DATA as 'c:\sql\';
                                              -- имя directory лучше всегда указывать большими буквами. иначе можно долго ловить ошибку.
                                              
    k_outN   VARCHAR2(20) := 'cmnt.log';     -- имя выходного файла (журнал работы)
    k_inN    VARCHAR2(20) := 'cmnt.txt';     -- имя файла входных данных

    tab      char(1) := chr(9);  -- разделитель полей

    cn       VARCHAR2(511);      -- загружаемая строка
    cac      NUMBER(3);          -- позиция разделителя полей

    c_a      VARCHAR2(40);       -- артикул Супермага
    c_c      VARCHAR2(255);      -- комментарий
    
    chk      NUMBER(12);         -- для проверки артикула

    testonly boolean := TRUE;    -- только тест, ничего не меняем в базе данных, только пишем журнал
--    testonly boolean := FALSE;   -- рабочий режим, вносим изменения в базу

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;

        -- отладка. выводим в журнал считанную строку
        if testonly then
          UTL_FILE.PUTF(k_outF,cn||'\n'); -- запись строки
          -- все отладочные записи надо сразу сбросить из буфера записи на диск. 
          -- это позволяет понять, что поледнее сработало правильно. тогда будет понятно, на чем сломалось.
          UTL_FILE.FFLUSH(k_outF);        -- сбрасываем буфер файла на диск
        end if;

        cac := instr(cn,tab);      -- находим позицию разделителя
        c_a := SUBSTR(cn,1,cac-1); -- выделяем из строки артикул
        cn := SUBSTR(cn,cac + 1);  -- остаток строки без артикула

        -- если полей много, то предыдущие три строки повторяем сколько нужно

        -- отладка. выводим в журнал артикул
        if testonly then
          UTL_FILE.PUTF(k_outF,c_a||'\n');
          UTL_FILE.FFLUSH(k_outF);       
        end if;
        
        -- последнее поле равно остатку строки
        c_c := cn;                 -- в строке остался только комментарий

        -- отладка. выводим в журнал комментарий
        if testonly then
          UTL_FILE.PUTF(k_outF,c_c||'\n');
          UTL_FILE.FFLUSH(k_outF);       
        end if;

        -- если во входящем файле есть числовые поля, то тут делаем замену запятых на точки для корректной работы TO_NUMBER
        -- или наоборот; зависит от кодировок
--              b_s_novat := REPLACE(b_s_novat,',','.');
--              b_s_total := REPLACE(b_s_total,',','.');
--              b_s_quant := REPLACE(b_s_quant,',','.');


        -- считаем в базе карточки с таким ариткулом 
        SELECT count(*) 
	    	  INTO chk
		      FROM SMCard
          WHERE Article=c_a;

        -- нашли одну карточку. всё хорошо. обновляем
        if chk=1 then  
          if NOT testonly then
            update SMCard set CardComment=c_c where Article=c_a;
            commit;
          end if;            
          UTL_FILE.PUTF(k_outF,'комментарий обновлен: '||tab||c_a||tab||c_c||'\n');
          UTL_FILE.FFLUSH(k_outF);
        else
          UTL_FILE.PUTF(k_outF,'артикул в базе не найден: '||tab||c_a||tab||c_c||'---------------------------\n');
          UTL_FILE.FFLUSH(k_outF);
        end if;            

    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;

-- последние две строки скрипта раскомментировать для запуска sqlplus из командной строки с передачей имени скрипта как параметра:
-- sqlplus пользователь/пароль@база @c:\sql\cmnt.sql

--/
--exit;
Часовой пояс GMT +3, время: 15:47.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.