понедельник, 27 августа 2012 г.

Разбиение строк на лексемы



CREATE OR REPLACE
  PACKAGE CONVERT_PKG
    IS
      TYPE STRING_TBL_TYPE
        IS
          TABLE OF VARCHAR2(4000);
      FUNCTION LIST_TO_TABLE(
                             p_LIST                 IN VARCHAR2,
                             p_DELIMITER            IN VARCHAR2 DEFAULT ','
                            )
        RETURN STRING_TBL_TYPE;
      FUNCTION TABLE_TO_LIST(
                             p_TBL                  IN STRING_TBL_TYPE,
                             p_DELIMITER            IN VARCHAR2 DEFAULT ','
                            )
        RETURN VARCHAR2;
END;
/

CREATE OR REPLACE
  PACKAGE BODY CONVERT_PKG
    IS
      FUNCTION LIST_TO_TABLE(
                             p_LIST                 IN VARCHAR2,
                             p_DELIMITER            IN VARCHAR2 DEFAULT ','
                            )
        RETURN STRING_TBL_TYPE
        IS
            v_STRING_TBL       STRING_TBL_TYPE := STRING_TBL_TYPE();
            v_START_POSITION   NUMBER;
            v_END_POSTION      NUMBER;
            v_DELIMITER_LENGTH NUMBER;
            v_EXPANDED_LIST    VARCHAR2(32767);
        BEGIN
            IF p_DELIMITER IS NULL
              THEN
                RAISE_APPLICATION_ERROR(
                                        -20500,
                                        'Invalid Delimiter'
                                       );
            END IF;
            v_EXPANDED_LIST    := p_LIST || p_DELIMITER;
            v_DELIMITER_LENGTH := LENGTH(
                                         p_DELIMITER
                                        );
            v_END_POSTION      := 1 - v_DELIMITER_LENGTH;
            LOOP
              v_START_POSITION := v_END_POSTION + v_DELIMITER_LENGTH;
              v_END_POSTION    := INSTR(
                                        v_EXPANDED_LIST,
                                        p_DELIMITER,
                                        v_START_POSITION
                                       );
              EXIT WHEN v_END_POSTION = 0;
              v_STRING_TBL.EXTEND;
              v_STRING_TBL(v_STRING_TBL.LAST) := SUBSTR(
                                                        v_EXPANDED_LIST,
                                                        v_START_POSITION,
                                                        v_END_POSTION - v_START_POSITION
                                                       );
            END LOOP;
            RETURN v_STRING_TBL;
      END;
      FUNCTION TABLE_TO_LIST(
                             p_TBL                  IN STRING_TBL_TYPE,
                             p_DELIMITER            IN VARCHAR2 DEFAULT ','
                            )
        RETURN VARCHAR2
        IS
            v_LIST   VARCHAR2(32767);
        BEGIN
            IF p_DELIMITER IS NULL
              THEN
                RAISE_APPLICATION_ERROR(
                                        -20500,
                                        'Invalid Delimiter'
                                       );
            END IF;
            FOR v_I IN 1..p_TBL.LAST LOOP
              IF INSTR(
                       p_TBL(v_I),
                       p_DELIMITER
                      ) != 0
                THEN
                  RAISE_APPLICATION_ERROR(
                                          -20500,
                                          'Invalid Delimiter'
                                         );
              END IF;
              IF v_I > 1
                THEN
                  v_LIST := v_LIST || p_DELIMITER || p_TBL(v_I);
                ELSE
                  v_LIST := v_LIST || p_TBL(v_I);
              END IF;
            END LOOP;
            RETURN v_LIST;
      END;
END;
/


Или





SELECT SUBSTR(txt,instr(sp
||txt
||sp,sp,1,level),instr(sp
||txt
||sp,sp,2,level) - instr(sp
||txt
||sp,sp,1,level) - 1) pol,
rownum nn
FROM
(SELECT 'qq,ww,ee' AS txt, ',' AS sp FROM dual
)
CONNECT BY level <= LENGTH(regexp_replace(sp
||txt,'[^'
||sp
||']',''))

четверг, 23 августа 2012 г.

EAM: Ремонт активов, ЗВР, графики




Здесь я опишу основную логику ремонта оборудования в модуле EAM (ТОиР - техническое обслуживание и ремонты), а именно речь будет идти о графиках и ЗВР-ах (заказах на выполнение работ).
Это все было описано мне на проекте одним из бизнес-консультантов. Не претендую на полноту описания, и надеюсь, что основную суть я уловила верно. Ну и особенности каждого предприятия, конечно.Итак.

Предприятие оперирует понятием "Основные средства" (ОС). Они делятся условно (насколько полно такое деление? не знаю =) ) на средства, которые не ремонтируются, а отправляются в утиль в случае поломки ( калькуляторы и иже с ними), и средства, с которыми, по мнению ремонтников, еще не все кончено.Это и есть активы предприятия.
Также, основные средства могут быть не очень габаритными, простыми устройствами, и в системе они заводятся как одна единица. Сложные устройства, состоящие из более мелких, но по сути тоже вполне самостоятельных устройств, в системе не регистрируются. Регистрируются как активы составляющие их устройства.
Далее. Логически активы могут объединяться в группы активов. Насосы, измерители и т.д.
В процессе ремонта с каждой группой активов проводится определенный перечень операций. Он может изменяться, дополняться в процессе работы системы.
По каждой операции в системе заводится техкарта. Она дает описание операции: какие использованы материалы, потребовались ли услуги сторонних организаций, какой персонал привлекался, и какое оборудование пользовали.

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

Работали в полномочиях "Управление активами предприятия".

понедельник, 20 августа 2012 г.

ОГП внутри ОГП

Дополнительно, в 1 гибком поле можно добавить не более 15 полей

Сначала создаем таблицу

CREATE TABLE xxfa_segment_log_car
    (ATTRIBUTE_CATEGORY            VARCHAR2(30),
    attribute1                     VARCHAR2(150),
    attribute2                     VARCHAR2(150),
    attribute3                     VARCHAR2(150),
    attribute4                     VARCHAR2(150),
      attribute5                     VARCHAR2(150),
    attribute6                     VARCHAR2(150),
    attribute7                     VARCHAR2(150),
    attribute8                     VARCHAR2(150),
      attribute9                     VARCHAR2(150),
    attribute10                    VARCHAR2(150),
    attribute11                    VARCHAR2(150),
    attribute12                    VARCHAR2(150),
      attribute13                    VARCHAR2(150),
    attribute14                    VARCHAR2(150),
    attribute15                    VARCHAR2(150)
   )
  PCTFREE     10
  INITRANS    10
  MAXTRANS    255
  TABLESPACE  apps_ts_tx_data
  STORAGE   (
    INITIAL     4
    NEXT        4096
    PCTINCREASE 0
    MINEXTENTS  1
    MAXEXTENTS  50
  )

Потом регистрируем поля

begin
ad_dd.register_table('OFA','XXFA_SEGMENT_LOG_CAR','T',4096,10,40);
ad_dd.register_column('OFA','xxfa_segment_log_car','ATTRIBUTE_CATEGORY',1,'VARCHAR2',30,'Y','N');
ad_dd.register_column('OFA','xxfa_segment_log_car','attribute1',2,'VARCHAR2',150,'Y','N');
ad_dd.register_column('OFA','xxfa_segment_log_car','attribute2',3,'VARCHAR2',150,'Y','N');
ad_dd.register_column('OFA','xxfa_segment_log_car','attribute3',4,'VARCHAR2',150,'Y','N');
ad_dd.register_column('OFA','xxfa_segment_log_car','attribute4',5,'VARCHAR2',150,'Y','N');
ad_dd.register_column('OFA','xxfa_segment_log_car','attribute5',6,'VARCHAR2',150,'Y','N');
ad_dd.register_column('OFA','xxfa_segment_log_car','attribute6',7,'VARCHAR2',150,'Y','N');
ad_dd.register_column('OFA','xxfa_segment_log_car','attribute7',8,'VARCHAR2',150,'Y','N');
ad_dd.register_column('OFA','xxfa_segment_log_car','attribute8',9,'VARCHAR2',150,'Y','N');
ad_dd.register_column('OFA','xxfa_segment_log_car','attribute9',10,'VARCHAR2',150,'Y','N');
ad_dd.register_column('OFA','xxfa_segment_log_car','attribute10',11,'VARCHAR2',150,'Y','N');
ad_dd.register_column('OFA','xxfa_segment_log_car','attribute11',12,'VARCHAR2',150,'Y','N');
ad_dd.register_column('OFA','xxfa_segment_log_car','attribute12',13,'VARCHAR2',150,'Y','N');
ad_dd.register_column('OFA','xxfa_segment_log_car','attribute13',14,'VARCHAR2',150,'Y','N');
ad_dd.register_column('OFA','xxfa_segment_log_car','attribute14',15,'VARCHAR2',150,'Y','N');
ad_dd.register_column('OFA','xxfa_segment_log_car','attribute15',16,'VARCHAR2',150,'Y','N');
end;     

Потом мы регистрируем описательное гибкое поле в самой системе , под полномочиями «разработчика приложений»



После этого у нас в списке описательных полей появляется наше поле, его заполняем



Затем необходимо создать набор значений, к которому необходимо привязать это гибкое поле


Указать тип проверки – особый


FND POPDESC
APPL_SHORT_NAME=OFA
DESC_FLEX_NAME="PHA_BK135_SUBFLEXFIELDS"
NAVIGATE=!DIR
DESC=:!MEANING
DATA_FIELD=:!ID
ATTRIBUTE=:!VALUE
USEDBFLDS="N"
READ_ONLY="N"


И потом назначить этот набор значении в том ОГП, в котом он должен появляться

 

И вот как это выглядит в системе при работе . Я поместил его в ОГП Категория Актива. Нажимаешь на это поле – открывает новое дополнительное.