[ОТВЕТИТЬ]
Опции темы
29.05.2014 14:04  
AndreyZh
Цитата:
Сообщение от FinSoft
Андрей, спасибо, ты меня прямо ...
Скромность конечно "украшает", но даже Вы не будете возражать, что более сконцентрированно и глубоко, чем "Ваш покорный слуга" занимаетесь автоматизаций бизнес процессов...

Как Вы могли заметить, что от сайта и активного продвижения в рунет своего продукта, возможно временно решил отдохнуть... правда на загруженность работой это особо не сказалось... наверное действительно "работа дураков любит"?
 
05.10.2014 10:55  
AndreyZh
Давайте рвсскажу и покажу, как создается новый режим системы. В частности это покажет насколько это реализуется "на коленке"...

1. В принципе уже несколько месяцев операторы озвучивали задачу "пакетной печати пачки документов (счетов-фактур и ТОРГ-12)" из режима предзаказов. От задачи "отбрыкивался", т.к. не понимал, как её легко решить, но периодически задумывался о способах её реализации в системе - всё это "черкалось" на черновиках дабы "не вылетели из головы полезные мысли" в процессе текущей работы. Да и одновременно решаемых, даже программных задач в "голове" множество, например на сейчас: изменение книг продаж/покупок и etc, алкогольный журнал, транспортная накладная и т.д.

2. Наконец оперы "достучались" до босса. Он "проникся" важностью данной задачи и решил даже нечто заплатить... и хорошо, так как в "голове" созрело уже красивое решение. Дальше мозговой штурм с операторами и умным, в частности их руководителем по возможным сложностям и нюансам.

3. Ещё подумав, испортив пяток листов черновиков написал для себя ТЗ, алгоритмы решения и необходимые для учета нюансы - этот листок потом попадет в папку "черновики системы предзаказов". Пока эту разработку в натуральном виде



4. Затем по ней методом нашлепывания по клаве и копипастом был набран черновой текст режима, комментируя основные технические моменты... Во первых другой должен понимать этот текст, да и сам через пару лет легко его должен вспомнить и понять. Конечно после его компиляции и отладки начали вылазить косяки программирования и разработки. Большую часть их, надеюсь исправил, но пока есть несколько "невылизанных" моментов - продолжу в понедельник. Далее приведу данную процедуру целиком (понятен стиль языка dBase, мой стиль оформления текста программ и их структурирования):

текст программы:
Код:
* ---------------------------------------------------------------------------
*   Печать пачки накладных и счетов фактур по запросу. Повтор параметров спе-
*   циализированной печати для группы документов определяемых в запросе
PROC pPrePrDoc()
    LOCA cOldCol:=SetColor(), nRec:=RecNo(), nOrd:=zOrd()
    LOCA GetList:={}, lExit:=TRUE, nSec:=0
    LOCA nTip:=3, dBeg:=Date(), dEnd:=Date(), cBeg:=Spac(12), cEnd:=Spac(12)
    LOCA sOp:="0755"
    S_PROC

    //  Определяю справочные переменные
    cClient     := Spac(4)

    //  Из экранной формы читаем параметры режима печати документов.
    fSwopen(16,22,7,55,cOther,3)
    @ 1,1 SAY "Пожалуйста введите код покупателя (F3) или ничего"       GET cClient             VALI IF(Empty(cClient),TRUE,Eval(bClient,cClient))
    @ 2,1 SAY "Дату начала периода документов (заказов)     "           GET dBeg
    @ 3,1 SAY "и дату окончания периода для пачки заказов   "           GET dEnd                VALI lValid({||dEnd >= dBeg},"Меньше начальной - нельзя!")
    @ 4,1 SAY "Начальный номер интервала номеров заказов"               GET cBeg
    @ 5,1 SAY "конечный номер.Номера переводятся в число"               GET cEnd
    @ 6,1 SAY "Печатаем: 1-только ТТН, 2-сч.фактуры, иначе все     "    GET nTip                PICT "9"
    READ
    fDeact(cOldCol)
    AP__INPUT

    /*  Проверяю, что был произведен режим специализированной
        печати накладных и (или) счетов фактур, т.е. программу обучили,
        как печатать документы, удовлетворяющие запросам режима */
    IF (nTip = 1) .OR. (nTip > 2)   //  Проверяем накладные
        IF ValType(apFact[1]) <> "N"
            ErrMess("В начале сделайте специализированную печать, как обычно!",cError)
            RETU
        ENDI
    ENDI
    IF (nTip = 1) .OR. (nTip > 2)   //  Проверяем счета фактуры
        IF ValType(apFact[13]) <> "N"
            ErrMess("В начале сделайте специализированную печать, как обычно!",cError)
            RETU
        ENDI
    ENDI

    /*  Проверяем запущенность ХБК, если печать документов в графическом формате
        Заведомо переменная определена, т.к. режим спецпечати уже вызывался */
    IF apFact[26] > 0 .OR. apFact[13] > 0
        IF !lgCheckXbm() THEN RETU
    ENDI

    //  Сканирую список документов по ограничителям режимов. Можно прервать процесс печати
    ftxt_act("             Прерываемо. Пожалуйста подождите окончания печати...",cHelpc,TRUE)

    zSet(PR_DAT_NUMBER)
    SET SOFT ON
    DbSeek( Dtos(dBeg) )
    SET SOFT OFF
    DO WHIL !Eof() .AND. dat <= dEnd
        BR_REPORT
        @ 1,1 SAY number
        Inkey(1)

        //***   Блок отсева записей заголовков предзаказа
        SELE PRE_SELL
        IF !Empty(cClient) .AND. client <> cClient
            DbSkip(); LOOP
        ENDI
        IF !(Val(Alltrim(number)) <= Val(Alltrim(cEnd))) .AND. (Val(Alltrim(number)) >= Val(Alltrim(cBeg)))
            DbSkip(); LOOP
        ENDI

        /*  Ожидаем ограниченное время завершения предыдущей печати системы ХБК
            в графическом режиме иначе даю небольшую паузу для досовой печати  */
        IF apFact[26] > 0 .OR. apFact[13] > 0
            lExit   := FALSE
            nSec    := 0
            WHIL nSec++ < 60    //  Попытки делаем минуту... например для заправки бумаги
                IF !(File(cPathXBK+"torg.dbf") .OR. File(cPathXBK+"dtor.dbf") .OR. File(cPathXBK+"wtorg.dbf") .OR. File(cPathXBK+"wdtor.dbf"))
                    lExit   := TRUE
                    EXIT
                ENDI
                Inkey(1)
            END
        ELSE
            Inkey(0.5)
        ENDI
        IF !lExit .OR. !zPrintReady()
            ErrMess("Сбой печати, закончилась бумага, проблемы с ХБК. Завершаю попытки печати документов!",cError)
            EXIT
        ENDI

        //  По предзаказу печатаю указанный тип документа.
        @ 1,1 SAY number
        IF nTip = 1 .OR. nTip > 2   //  Накладную в указанном формате
            pVirt(6)
        ENDI

        IF nTip = 2 .OR. nTip > 2   //  Счет фактуру в указанном формате
            IF apFact[26] > 0
                nSec    := 0
                WHIL nSec++ < 20
                    IF !(File(cPathXBK+"torg.dbf") .OR. File(cPathXBK+"dtor.dbf") .OR. File(cPathXBK+"wtorg.dbf") .OR. File(cPathXBK+"wdtor.dbf"))
                        EXIT
                    ENDI
                    Inkey(1)
                END
            ELSE
                Inkey(0.5)
            ENDI
            pVirt(5)
        ENDI

        SELE PRE_SELL SKIP
    ENDD
    fDeact( cOldCol )

    //  Восстанавливаю состояние среды программы
    zSet( nOrd )
    DbGoTo( nRec )
    RETU


Далее Вам решать, насколько это самописка?
 
05.10.2014 16:00  
FinSoft
Привет, Андрей.
Скорее всего сложности возникли из того, что разные документы хранятся в разных таблицах.
В Купце отгрузочная накладная является единым электронным документом, из которого можно печатать много разных форм (на память, на практике достигает до 20). Массовая печать организуется достаточно просто.
1. Имеется список наборов печатных форм документов. Его можно прицепить к разным документам. Список наборов расширяемый, для одного вида документов может быть задано несколько наборов.
2. В состав конкретного набора входят печатные формы. Список расширяемый. Для каждой печатной формы указывается шаблон. Шаблоны можно создавать/изменять прямо в программе, используя встроенный графический дизайнер. Для каждой печатной формы можно задать некоторые настройки, например, количество экземпляров, двустороннюю печать и т.п.
3. Если для вида документа определены наборы, то в экранной форме документа имеется кнопка печати наборов.
4. Для каждого контрагента можно задать набор для печати из отгрузочной накладной. Например, кому-то нужна счет-фактура, кому-то нужен товарный чек и т.п.
5. Когда формируется рейс на доставку, операторы проставляют в отгрузочных накладных экспедитора, который везет товары.
6. Имеется специальная обработка для печати документов для рейса. В ней жмется кнопка заполнить, выбирается экспедитор и формируется список отгрузочных накладных. Далее по нему печатаются различные формы - накладные на склад для затаривания товаров (в разрезе отделений склада), шахматка для отметок на складе, печать первичных документов по заданным для контрагентов наборам.
7. В наборах имеется специальный режим печати формы договоров. В отличии от другой первички, шаблоны договоров хранятся в rtf-файлах. Для их печати вызывается дефолтная программа для работы с rtf-файлами (как правило, ms word). Это используется, когда нужно для каждой накладной делать отдельный договор, чтобы обойти ограничение закупок за нал (насколько помню, не более 100 тыр на один договор).
 
"Спасибо" FinSoft от:
05.10.2014 17:15  
AndreyZh
Цитата:
Сообщение от FinSoft
Привет, Андрей. Скорее всего сложности возникли из того, что разные документы хранятся в разных таблицах...
Цитата:
Сообщение от AndreyZh
....От задачи "отбрыкивался", т.к. не понимал, как её легко решить, но периодически задумывался о способах её реализации в системе....
Учитывая постоянную работу "за тарелку супа" ещё раз выделил основную "мою" проблему, а так задача, как задача - ничего особенного
 
 


Опции темы



Часовой пояс GMT +3, время: 17:25.

Все в прочитанное - Календарь - RSS - - Карта - Вверх 👫 Яндекс.Метрика
Форум сделан на основе vBulletin®
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.