Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Работа Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 Рассмотрю варианты альтернативного трудоустройства  [new]
myaucha
Member

Откуда: Москва
Сообщений: 1134
В связи с тотальным импортозамещением и сокращением, по крайней мере на данный момент времени, проектов в области внедрения SAP (в частности компонента BI(BW), которым я занимаюсь последние годы), рассматриваю альтернативные варианты трудоустройства или контрактной работы, то есть не исключаю возможности даже полной смены сферы деятельности. Хотя накопленных знаний и опыта жалко, считаю, что надо проявлять гибкость и в случае перемен на рынке труда уметь перестраиваться.

Если коротко, то последние 10 лет занимался проектированием хранилищ, ETL и формированием аналитической отчетности посредством указанного ранее компонента (ссылка на подробное резюме указана в профиле), плюс разработкой в рамках указанных задач на языке ABAP, то есть набор инструментальных средств сугубо саповский. Предметная область - финансы, управление материальными потоками, закупкой и сбытом, внутренний учет, кадровый учет и т.п. (все перечисленное на уровне, достаточном для решения задач по своему направлению - BW, то есть на роль полноценного функционального консультанта, например по FI или MM, я не претендую).

Сейчас продолжаю интересоваться вакансиями (как в штате, так и на контрактной основе) SAP-овской направленности, но также, в силу указанных выше причин, рассмотрю и другие предложения. Далее приведу несколько фрагментов кода (ничего сверхъестественного, просто культура кода), чтобы у потенциального работодателя сформировать некоторое начальное представление о себе.

SAP BW - профессионально (примеры так просто не приведешь)

ABAP - хороший уровень
+
*&---------------------------------------------------------------------*
*&      Form  prepare_except_turns
*&---------------------------------------------------------------------*
*  Подготовка к исключению внутренних оборотов
*&---------------------------------------------------------------------*
*  Инициализируются две глобальные хэш-таблицы
*    ght_acc2range[]
*    ght_char_range[]
*----------------------------------------------------------------------*
FORM prepare_except_turns.

  CLEAR:
    ght_acc2range,
    ght_char_range.

  REFRESH:
    ght_acc2range[],
    ght_char_range[].

* макросы для удобства доступа к внутренним таблицам
  DEFINE MERGE_ASSIGNING.

    INSERT TABLE &1 ASSIGNING &2.
    IF sy-subrc <> 0.
      READ TABLE &1 FROM &1 ASSIGNING &2.
    ENDIF.
  END-OF-DEFINITION.

  DEFINE MERGE_REFERENCING.

    INSERT TABLE &1 REFERENCE INTO &2.
    IF sy-subrc <> 0.
      READ TABLE &1 FROM &1 REFERENCE INTO &2.
    ENDIF.
  END-OF-DEFINITION.

  DEFINE MERGE_RECORD.
    MERGE_&2 &1 &3.
  END-OF-DEFINITION.

* получаем настроечную таблицу мэппинга
  DATA:
    st_acc2char TYPE SORTED TABLE OF ztcmr_accnt_cust
    WITH NON-UNIQUE KEY bukrs hkont chanm.

    SELECT
      *
    INTO TABLE
      st_acc2char
    FROM
      ztcmr_accnt_cust.

* просматриваем настроечную таблицу мэппинга и формируем
* звенья аналитик
  DATA:
    l_acc2char LIKE LINE OF st_acc2char[].

  LOOP AT st_acc2char INTO l_acc2char.

*   добавляем запись (получаем ссылку, если она уже есть)
*   в таблицу мэппинга БЕ и счета на звено аналитик
    FIELD-SYMBOLS:
      <acc2range> LIKE LINE OF ght_acc2range[],
      <prev_acc2range> LIKE <acc2range>.

    ght_acc2range-bukrs = l_acc2char-bukrs.
    ght_acc2range-hkont = l_acc2char-hkont.

    MERGE_RECORD ght_acc2range ASSIGNING <acc2range>.

*   новое сочетание БЕ и счета
    IF <prev_acc2range> IS ASSIGNED.
      IF NOT ( <acc2range>-bukrs = <prev_acc2range>-bukrs AND
               <acc2range>-hkont = <prev_acc2range>-hkont ).

*       добавляем запись (получаем ссылку, если она уже есть)
*       в таблицу звеньев аналитик, устанавливаем связь между строками обеих таблиц
        MERGE_RECORD ght_char_range REFERENCING <prev_acc2range>-r_char_range.
        CLEAR ght_char_range.
      ENDIF.
    ENDIF.

*   формируем список аналитик
    IF ght_char_range-chanm_list IS INITIAL.
      ght_char_range-chanm_list = l_acc2char-chanm.
    ELSE.
      CONCATENATE
        ght_char_range-chanm_list
        l_acc2char-chanm
      INTO
        ght_char_range-chanm_list
      SEPARATED BY
        space.
    ENDIF.

*   и настоящее становится прошлым (философия жизни) ;)
    ASSIGN <acc2range> TO <prev_acc2range>.
  ENDLOOP.

* последнее сочетание БЕ и счета в цикле
  IF <prev_acc2range> IS ASSIGNED.
*   добавляем запись (получаем ссылку, если она уже есть)
*   в таблицу звеньев аналитик, устанавливаем связь между строками обеих таблиц
    MERGE_RECORD ght_char_range REFERENCING <prev_acc2range>-r_char_range.
  ENDIF.

* добавляем запись с пустой строкой аналитик; это необходимо, чтобы
* правильно обрабатывать ситуации, когда невозможно по БЕ и номеру счета
* найти допаналитики в настроечной таблицы
  CLEAR ght_char_range.
  INSERT TABLE ght_char_range.

* получаем таблицу ключевых полей документа
  DATA:
    lt_doc_field TYPE TABLE OF string,

    r_struct_descr TYPE REF TO cl_abap_structdescr,
    ls_component TYPE abap_compdescr.

  r_struct_descr ?= cl_abap_typedescr=>describe_by_name( 'TDOCKEY' ).
  LOOP AT r_struct_descr->components INTO ls_component.
    APPEND ls_component-name TO lt_doc_field.
  ENDLOOP.

* просматриваем таблицу звеньев аналитик и формируем динамические хэш-таблицы
  FIELD-SYMBOLS:
    <char_range> LIKE LINE OF ght_char_range[].

  LOOP AT ght_char_range ASSIGNING <char_range>.

*   получаем таблицу допаналитик
    DATA lt_add_field TYPE TABLE OF string.
    SPLIT <char_range>-chanm_list AT space INTO TABLE lt_add_field.

*   объединяем обе таблицы в таблицу ключевых полей
    DATA lt_key_field TYPE TABLE OF string.
    lt_key_field[] = lt_doc_field[].
    APPEND LINES OF lt_add_field TO lt_key_field.

*   добавляем к таблице ключевых полей показатели сумм в ВВ и ВД:
*   0DEB_CRE_LC и 0DEB_CRE_DC
    DATA lt_field TYPE TABLE OF string WITH HEADER LINE.
    lt_field[] = lt_key_field[].
    APPEND '0DEB_CRE_LC' TO lt_field.
    APPEND '0DEB_CRE_DC' TO lt_field.

*   создать динамическую хэш-таблицу
    PERFORM create_dyn_hash_table
    USING
      lt_key_field[]
      lt_field[]
    CHANGING
      <char_range>-r_ht_turn.
  ENDLOOP.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form except_turns
*&---------------------------------------------------------------------*
*  Исключение внутренних оборотов
*&---------------------------------------------------------------------*
*       <->PT_DATA       - таблица результата
*----------------------------------------------------------------------*
FORM except_turns
CHANGING
  pt_data TYPE tt_source_data.

* таблица связи записи исходного пакета с записью таблицы оборотов
  DATA:
    t_rec2turn TYPE TTRec2Turn WITH HEADER LINE.

* обрабатываемые типы документов
  FIELD-SYMBOLS:
    <rec> TYPE any.

  LOOP AT pt_data REFERENCE INTO t_rec2turn-r_rec
  WHERE
    ('MAC_DOC_T IN GR_DOC_TYPE_CLEAR[]').

*   БЕ и счет
    DATA:
      BEGIN OF ls_rec,
        mcomp_cod TYPE /bic/oimcomp_cod,
        mgl_accnt TYPE /bic/oimgl_accnt,
      END OF ls_rec.

    ASSIGN t_rec2turn-r_rec->* TO <rec>.
    MOVE-CORRESPONDING <rec> TO ls_rec.

    FIELD-SYMBOLS:
      <acc2range> LIKE LINE OF ght_acc2range[].

*   выделяем первые два символа счета (для поиска)
    DATA l_short_acc LIKE <acc2range>-hkont.
    l_short_acc = ls_rec-mgl_accnt(2).
    l_short_acc+2 = '*'.

*   быстрый поиск по БЕ и маске (сначала по первым двум символам счета)
    DATA l_found TYPE rsbool-bool.
    CLEAR l_found.

    LOOP AT ght_acc2range ASSIGNING <acc2range>
    WHERE
      bukrs = ls_rec-mcomp_cod AND
      hkont CP l_short_acc.

*     далее идем последовательно и ищем уже по реальной маске
      IF ls_rec-mgl_accnt CP <acc2range>-hkont.

        l_found = 'X'.
        EXIT.
      ENDIF.
    ENDLOOP.

    FIELD-SYMBOLS:
      <ht_turn> TYPE HASHED TABLE,
      <turn> TYPE any.

*   если поиск по БЕ и счету был успешен
    IF NOT l_found IS INITIAL.

*     получаем таблицу оборотов
      ASSIGN <acc2range>-r_char_range->*-r_ht_turn->* TO <ht_turn>.

*   если не удалось определить по БЕ и счету необходимый состав аналитик для
*   расчета оборота, то рассчитываем оборот только по ключу документа и счету,
*   то есть без допаналитик
    ELSE.

      FIELD-SYMBOLS:
        <char_range> LIKE LINE OF ght_char_range[].

      READ TABLE ght_char_range
      WITH TABLE KEY
        chanm_list = ''
      ASSIGNING
        <char_range>.

*     получаем таблицу оборотов
      ASSIGN <char_range>-r_ht_turn->* TO <ht_turn>.
    ENDIF.

*   создаем структуру типа таблицы оборотов
    ASSIGN LOCAL COPY OF INITIAL LINE OF <ht_turn>[] TO <turn>.

*   рассчитываем оборот
    MOVE-CORRESPONDING <rec> TO <turn>.
    COLLECT <turn> INTO <ht_turn> REFERENCE INTO t_rec2turn-r_turn.

*   добавляем запись в таблицу связи
    APPEND t_rec2turn.
  ENDLOOP.

* исключаем внутренние обороты
  FIELD-SYMBOLS:
    <rec2turn> LIKE LINE OF t_rec2turn[].

  LOOP AT t_rec2turn ASSIGNING <rec2turn>.

    ASSIGN <rec2turn>-r_rec->* TO <rec>.
    ASSIGN <rec2turn>-r_turn->* TO <turn>.

    DATA:
      BEGIN OF ls_turn_,
        0deb_cre_lc TYPE /bi0/oideb_cre_lc,
        0deb_cre_dc TYPE /bi0/oideb_cre_dc,
      END OF ls_turn_.

    MOVE-CORRESPONDING <turn> TO ls_turn_.

*   для записей, которые надо исключить обнуляем БЕ
    IF ls_turn_-0DEB_CRE_LC = 0 AND ls_turn_-0DEB_CRE_DC = 0.

      FIELD-SYMBOLS:
        <fs> TYPE ANY.

      ASSIGN COMPONENT 'MCOMP_COD' OF STRUCTURE <rec> TO <fs>.
      CLEAR <fs>.
    ENDIF.
  ENDLOOP.

* удаляем исключенные записи, т.е. те, у которых обнулили БЕ
  FIELD-SYMBOLS:
    <data> LIKE LINE OF pt_data[].

  LOOP AT pt_data ASSIGNING <data>.
    IF <data>-mcomp_cod IS INITIAL.
      DELETE pt_data.
    ENDIF.
  ENDLOOP.
ENDFORM.

В свое время в SAP переходил с Oracle-разработки, поэтому все еще владею PL/SQL (сейчас использую только в собственных разработках для анализа данных)
+
-- получить средний коэффициент корреляции за период
function get_corrs
(
  p_dt_from date,
  p_dt_to date,
  p_time_frame number,
  p_instr_id instrument.instr_id%type,
  p_instr_ids TTInstrIDs
) return TTCorr
is
  v_t_corr TTCorr;
begin
  with
    q1 as
    (
      select
        t1.column_value instr_id,
        t2.dt_from,
        pkg_history.get_min_rates
        (
          t2.dt_from,
          t2.dt_to,
          p_time_frame,
          t1.column_value
        ) rates
      from
        table(p_instr_ids) t1,
        (
          select
            p_dt_from+level-1 dt_from,
            p_dt_to-ceil(p_dt_to-p_dt_from)+level dt_to
          from
            dual
          connect by
            level <= ceil(p_dt_to-p_dt_from)
        ) t2
    ),
    q2 as
    (
      select
        p_instr_id instr_id,
        p_dt_from+level-1 dt_from,
        pkg_history.get_min_rates
        (
          p_dt_from+level-1,
          p_dt_to-ceil(p_dt_to-p_dt_from)+level,
          p_time_frame,
          p_instr_id
        ) rates
      from
        dual
      connect by
        level <= ceil(p_dt_to-p_dt_from)
    ),
    q3 as
    (
      select
        q2.instr_id instr_id1,
        q1.instr_id instr_id2,
        (
          select
            corr(qq1.C, qq2.C)
          from
            table(q1.rates) qq1,
            table(q2.rates) qq2
          where
            qq1.dt_from = qq2.dt_from
        ) r
      from
        q1,
        q2
      where
        q1.dt_from = q2.dt_from
    )
  select
    cast
    (
      multiset
      (
        select
          instr_id1,
          instr_id2,
          avg(r) r,
          stddev(r) s,
          count(*) cnt
        from
          q3
        where
          r is not null
        group by
          instr_id1,
          instr_id2
      ) as TTCorr
    )
  into
    v_t_corr
  from
    dual;

  return v_t_corr;
end;

-- загрузка отчета брокера
procedure load_broker_data_2
(
  p_file_name varchar2
)
is
  v_xml xmltype := xmltype(read_file(p_file_name));
begin
  -- загрузка сделок
  for v_rec in
  (
    select
      t.*,
      case security_type
        when 'Облигации' then
          round((volume-nkd)/price*100)
        else
          null
      end nominal     
    from
    (
      select
        to_date
        (
          replace(extractvalue(value(p), '/item/@conclusion_time'),'T',' '),
          'yyyy-mm-dd hh24:mi:ss'
        ) deal_time,
        extractvalue(value(p), '/item/@request_no') order_number,
        extractvalue(value(p), '/item/@deal_no') deal_number,
        decode
        (
          extractvalue(value(p), '/item/@nkd'), 
          null, 'Акции',
          'Облигации'
        ) security_type,
        trim(extractvalue(value(p), '/item/@security_name')) security_name,
        to_number(replace(extractvalue(value(p), '/item/@price'),'.',',')) price,
        nvl(to_number(replace(extractvalue(value(p), '/item/@buy_qnty'),'.',',')),0)+
        nvl(to_number(replace(extractvalue(value(p), '/item/@sell_qnty'),'.',',')),0) quantity,
        to_number(replace(extractvalue(value(p), '/item/@volume_rur'),'.',',')) volume,
        extractvalue(value(p), '/item/@security_grn_code') grn_code,
        case 
          when nvl(to_number(replace(extractvalue(value(p), '/item/@buy_qnty'),'.',',')),0) > 0 then
            'B'
          when nvl(to_number(replace(extractvalue(value(p), '/item/@sell_qnty'),'.',',')),0) > 0 then
            'S'
        end deal_symbol,   
        extractvalue(value(p), '/item/@board_name') board_name,
        to_number(replace(extractvalue(value(p), '/item/@broker_commission'),'.',',')) broker_comm,
        0 is_per_trade,
        0 broker_comm_nds,
        0 stock_comm,
        0 stock_comm_nds,
        to_number(replace(extractvalue(value(p), '/item/@nkd'),'.',',')) /
        (
          nvl(to_number(replace(extractvalue(value(p), '/item/@buy_qnty'),'.',',')),0) +
          nvl(to_number(replace(extractvalue(value(p), '/item/@sell_qnty'),'.',',')),0)
        ) nkd        
      from
        table(xmlsequence(extract(v_xml,'/broker_report/spot_main_deals_conclusion/item'))) p 
    ) t         
  ) loop

    begin
      insert into quik_deal values v_rec;
    exception
      when DUP_VAL_ON_INDEX then
        delete quik_deal
        where
          deal_time = v_rec.deal_time and
          order_number = v_rec.order_number and
          deal_number = v_rec.deal_number;

        insert into quik_deal values v_rec;
    end;
  end loop;

  -- загрузка активов
  delete quik_last_rate;

  for v_rec in
  (
    select
      extractvalue(value(p), '/item/@asset_code') grn_code,
      trim(extractvalue(value(p), '/item/@asset_name')) security_name,
      to_number(replace(extractvalue(value(p), '/item/@settlement_price'),'.',',')) end_close_price,
      to_date
      (
        replace(extractvalue(v_xml, '/broker_report/@date_to'),'T',' '),
        'yyyy-mm-dd hh24:mi:ss'
      ) date_to,
      to_number(replace(extractvalue(value(p), '/item/@nkd'),'.',',')) nkd
    from
      table(xmlsequence(extract(v_xml,'/broker_report/spot_assets/item'))) p 
    where
      extractvalue(value(p), '/item/@asset_type_id') = 1         
  ) loop

    insert into quik_last_rate values v_rec;
  end loop;
end;

Имею базовые знания в C# (использую только в собственной разработке в многопоточном консольном приложении)
+
// фрагмент 1

        #region CALLBACK таблица текущих параметров изменилась (чужой поток)
        void IXLTableReceiver.OnSecurities(string name, List<XLSecurity> changed_securities)
        {
            bool queue_changed = false;

            if (filter.Securities.Count == 0 || filter.Securities.Contains(name))
                lock (param_queue)
                {
                    foreach (XLSecurity security in changed_securities)
                    {
                        if (filter.SecCodes.Count == 0 || filter.SecCodes.Contains(security.sec_code))
                        {
                            param_queue.Enqueue(new ParamSet.OnSecurity(name, security));
                            queue_changed = true;
                        }
                    }
                }

            if (queue_changed) wait_handler.Set();
        }
        #endregion

        #region поток алгоритма
        void Run()
        {
            while (true)
            {
                while (true)
                {
                    ParamSet.ParamSetBase param_set;
                    lock (param_queue)
                    {
                        if (param_queue.Count == 0) break;
                        param_set = param_queue.Dequeue();
                    }
                    CallMethod(param_set);
                }

                wait_handler.WaitOne();
                if (is_stop) break;
            }

            OnStop();

            wait_handler.Close();
        }
        #endregion

        #region вызов метода в родном потоке
        void CallMethod(ParamSet.ParamSetBase param_set)
        {
            switch (param_set.ParamSetType)
            {

		...

                case ParamSet.ParamSetType.OnSecurity:
                    {
                        ParamSet.OnSecurity p = (ParamSet.OnSecurity)param_set;
                        OnSecurity(p.name, UpdateSecurity(p));
                        break;
                    }

		...

            }
        }
        #endregion

        #region обновить запись в таблице бумаг
        Security UpdateSecurity(ParamSet.OnSecurity p)
        {
            Security security = securities[p.security.class_code, p.security.sec_code, true];
            security.Update(p.security);
            return security;
        }
        #endregion

        #region передача параметров между потоками (маршалинг)
        static class ParamSet
        {
            #region типы обрабатываемых методов
            public enum ParamSetType
            {
		...

                OnSecurity,

		...
            }
            #endregion

            #region базовый (для методов без параметров)
            public class ParamSetBase
            {
                public ParamSetType ParamSetType;
                public ParamSetBase(ParamSetType param_set_type)
                {
                    ParamSetType = param_set_type;
                }
            }
            #endregion

	    ...

            #region OnSecurity
            public class OnSecurity: ParamSetBase
            {
                public string name;
                public XLSecurity security;
                public OnSecurity(string name, XLSecurity security): base(ParamSetType.OnSecurity)
                {
                    this.name = name;
                    this.security = security.Copy();
                }
            }
            #endregion

	    ...
        }
        #endregion


// фрагмент 2

    // прикладная блокировка
    abstract class Lock: IEquatable<Lock>
    {
        public virtual bool Equals(Lock other)
        {
            throw new NotImplementedException();
        }
    }

    // блокировка с привязкой к бумаге
    class SecLock : Lock
    {
        Security security;

        public SecLock(Security security)
        {
            this.security = security;
        }

        public override bool Equals(Lock other)
        {
            if (this.security == ((SecLock)other).security)
                return true;
            else
                return false;
        }
    }

    // управление блокировками (используется List<>, т.к. одновременно блокируется лишь несколько объектов)
    class Locks
    {
        List<Lock> locks;

        // конструктор
        public Locks()
        {
            locks = new List<Lock>();
        }

        // попытка установить блокировку
        public bool TrySetLock(Lock some_lock)
        {
            if (locks.Contains(some_lock))
                return false;
            else
            {
                locks.Add(some_lock);
                return true;
            }
        }

        // освободить блокировку
        public void ResetLock(Lock some_lock)
        {
            locks.Remove(some_lock);
        }
    }
}

Очень неплохо владею VB/VBA ;) Смех-смехом, но Excel c VBA - любимый "черновик" и калькулятор, часто использую
+
Option Explicit

Private m_objPatternLoader As IPatternLoader

' учебные образцы
Private m_objTuitionPatterns As Collection
' проверочные образцы
Private m_objCheckPatterns As Collection

' индекс текущего образца
Private m_lngIndex As Long

' количество успешных проверок
Private m_lngCheckSuccessCount As Long

' загрузка образцов
Public Sub Load(PatternLoader As IPatternLoader)
    
    Set m_objPatternLoader = PatternLoader
    
    ' учебные образцы
    Dim i As Long
    For i = 1 To m_objPatternLoader.TuitionPatternCount
        m_objTuitionPatterns.Add m_objPatternLoader.SelectTuitionPattern(i)
    Next
    
    ' проверочные образцы
    For i = 1 To m_objPatternLoader.CheckPatternCount
        m_objCheckPatterns.Add m_objPatternLoader.SelectCheckPattern(i)
    Next
End Sub

' кол-во образцов
Public Function GetCount(NetState As NetStateEnum) As Long

    Select Case NetState
    
        Case nsTuition
            GetCount = m_objTuitionPatterns.Count
            
        Case nsCheck
            GetCount = m_objCheckPatterns.Count
            
    End Select
End Function

' перейти к первому образцу
Public Sub FirstPattern(NetState As NetStateEnum)

    m_lngIndex = 1
    
    Select Case NetState
    
        ' перемешать учебные образцы
        Case nsTuition
            Mix m_objTuitionPatterns
    
        Case nsCheck
            m_lngCheckSuccessCount = 0
            
    End Select
End Sub

' следующий образец
Public Sub NextPattern()

    m_lngIndex = m_lngIndex + 1
End Sub

' присвоить группе очередной учебный образец
Public Sub AssignTuitionPatternTo(NeuronGroup As CNeuronGroup)

    AssignPatternTo NeuronGroup, m_objTuitionPatterns(m_lngIndex)
End Sub

' присвоить группе очередной проверочный образец
Public Sub AssignCheckPatternTo(NeuronGroup As CNeuronGroup)

    AssignPatternTo NeuronGroup, m_objCheckPatterns(m_lngIndex)
End Sub

' присвоить группе живой образец
Public Sub AssignLivePatternTo(NeuronGroup As CNeuronGroup)

    AssignPatternTo NeuronGroup, m_objPatternLoader.SelectLivePattern
End Sub

' идентифицировать образец
Public Function Identify(Net As CNet, NetState As NetStateEnum) As IPattern
    
    ReDim dblErr(1 To m_objTuitionPatterns.Count) As Double
    
    ' просматриваем выходные группы
    Dim objNeuronGroup As CNeuronGroup
    For Each objNeuronGroup In Net.NeuronGroups
        
	If objNeuronGroup.GroupType = gtLastLayer Then
        
            Dim lngNeuronIndex As Long
            lngNeuronIndex = 0
        
            ' просматриваем нейроны выходной группы
            Dim objNeuron As CNeuron
            For Each objNeuron In objNeuronGroup.Neurons
            
                lngNeuronIndex = lngNeuronIndex + 1
            
                Dim lngPatternIndex As Long
                lngPatternIndex = 0
            
                ' просматриваем образцы и накапливаем ошибку
                Dim objPattern As IPattern
                For Each objPattern In m_objTuitionPatterns
                    
                    lngPatternIndex = lngPatternIndex + 1
                    dblErr(lngPatternIndex) = _
                        dblErr(lngPatternIndex) + Abs(objPattern.GetValue(objNeuronGroup.Name, lngNeuronIndex) - objNeuron.Out)
                Next
            Next
        End If
    Next
    
    ' выбираем образец с минимальной ошибкой
    Dim dblMin As Double
    dblMin = 1E+30
    lngPatternIndex = 0
    
    For Each objPattern In m_objTuitionPatterns
        lngPatternIndex = lngPatternIndex + 1
        
        If dblErr(lngPatternIndex) < dblMin Then
            
            dblMin = dblErr(lngPatternIndex)
            Set Identify = objPattern
        End If
    Next
    
    ' оценка идентичности проверочного образца
    If NetState = nsCheck Then
        
        Set objPattern = m_objCheckPatterns(m_lngIndex)
        If Identify.Key = objPattern.Key Then
            m_lngCheckSuccessCount = m_lngCheckSuccessCount + 1
        End If
    End If
End Function

' порог остановки обучения
Public Property Get StopTuitionPercent() As Double

    StopTuitionPercent = m_lngCheckSuccessCount / GetCount(nsCheck) * 100
End Property

' порог остановки обучения
Public Function CheckStopTuition(LimitCount As Long, LimitPercent As Double) As Boolean

    Static lngCount As Long

    If StopTuitionPercent >= LimitPercent Then
        lngCount = lngCount + 1
        
        If lngCount = LimitCount Then
            CheckStopTuition = True
        End If
    Else
        lngCount = 0
    End If
End Function

' инициализация
Private Sub Class_Initialize()

    Set m_objTuitionPatterns = New Collection
    Set m_objCheckPatterns = New Collection
End Sub

' присвоить группе образец
Private Sub AssignPatternTo(NeuronGroup As CNeuronGroup, Pattern As IPattern)

    Dim objNeuron As CNeuron
    For Each objNeuron In NeuronGroup.Neurons
    
        Dim lngIndex As Long
        lngIndex = lngIndex + 1
        
        If NeuronGroup.GroupType = gtFirstLayer Then
            objNeuron.Out = Pattern.GetValue(NeuronGroup.Name, lngIndex)
        Else
            objNeuron.CtrlOut = Pattern.GetValue(NeuronGroup.Name, lngIndex)
        End If
    Next
End Sub

' перемешать образцы
Private Sub Mix(Patterns As Collection)

    Dim i As Long
    For i = 1 To Patterns.Count
    
        Dim lngIndex As Long
        lngIndex = Int((Patterns.Count * Rnd) + 1)
        
        Patterns.Add Patterns(lngIndex)
        Patterns.Remove lngIndex
    Next
End Sub

Рассмотрю разные позиции, в том числе аналитика/архитектора (зависит от предметной области, требований, предъявляемых к кандидату и средств разработки). Не имею ничего против выполнения тестовых заданий, если таковые потребуются для оценки уровня кандидата (например, на позицию аналитика - написание некоторого небольшого ТЗ). Также представляют интерес межсистемные и интеграционные задачи. Имею некоторый практический опыт и знания в плане автоматизации биржевой торговли, поэтому не исключаю развития и в этом направлении (или смежном). В настоящее время изучаю вводные онлайн-курсы по SAP HANA Cloud Platform, но не уверен, что данная платформа получит широкое применение у нас в ближайшие годы (думаю, причины понятны), а потому не слишком усердствую (курс рассчитан на Java-разработчика) - вакансий и задач по ней практически нет. В Java не специалист, но считаю, что много времени на освоение базы языка не уйдет (все очень близко к C#), а более продвинутые технологии можно освоить при определенном карт-бланше со стороны работодателя.

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

По SAP-овскому направлению рассмотрю предложения от 150 т.р. net и выше (зависит от задач, заказчика, позиции, варианта и продолжительности оформления штат/контракт). Рассмотрю и удаленный вариант работы (если будет спрос). По любым другим предложениям - от 130 т.р. net (с реальной перспективой роста). Предложения ниже указанных сумм заведомо неинтересны. Скептически отнесусь к ЗП fix + bonus, если fix ниже указанных ранее сумм. Любые "левые" комментарии местных завсегдатаев и критические замечания принимать во внимание не буду, поэтому просьба особо не распыляться в данном топике. Тему создал, как альтернативный вариант резюме - при поиске работы все средства хороши.
2 апр 16, 13:54    [19008598]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
Arti
Member

Откуда: Москва
Сообщений: 834
Скажите, а что это у вас за алгоритм на VBA реализован? Можете чуть поподробнее рассказать?
3 апр 16, 16:02    [19011094]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
cdtyjv
Member

Откуда:
Сообщений: 1638
Эх, помню "САП би дабл ю" было просто волшебной фразой, сулящей инженерам золотые горы ...
3 апр 16, 17:08    [19011237]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
myaucha
Member

Откуда: Москва
Сообщений: 1134
Arti
Скажите, а что это у вас за алгоритм на VBA реализован? Можете чуть поподробнее рассказать?
Приведен один из классов, входящих в конструктор многослойной нейросетки (строится по принципу многослойного персептрона, только слоев больше и соединять их можно как угодно, для обучения используется классический алгоритм обратного распространения ошибки). Использовал для аппроксимации функций
5 апр 16, 13:05    [19018577]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
myaucha
Member

Откуда: Москва
Сообщений: 1134
Раз уж зашел, то апну потихонечку
7 апр 16, 15:42    [19028469]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
myaucha
Member

Откуда: Москва
Сообщений: 1134
Skills Картинка с другого сайта.
19 апр 16, 12:57    [19076670]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
mishaPH
Member

Откуда:
Сообщений: 392
myaucha,

переходите на 1с. Не будет слезных историй.
19 апр 16, 14:57    [19077793]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
myaucha
Member

Откуда: Москва
Сообщений: 1134
Да ну о чем вы?! Какие слезы!
1C - это не про меня ;)
19 апр 16, 15:42    [19078305]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
363
Member [заблокирован]

Откуда: Москва
Сообщений: 22775
mishaPH
myaucha,

переходите на 1с. Не будет слезных историй.

Кстати, Транснефть вчера отменила свой МЕГА-конкурс (~300 млн руб) на внедрение 1С
19 апр 16, 18:02    [19079227]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
myaucha
Member

Откуда: Москва
Сообщений: 1134
Specific up
+
package com.home;

import java.util.*;

// Создано в процессе изучения Java SE (26.04.2016), чтобы не ограничиваться
// традиционным "Hello world!". Любые совпадения ключевых слов в коде с аналогичными
// конструкциями других языков считать случайными, а названия классов и переменных
// вымышленными.
//
// В главных ролях: 
// Java (jdk8), Eclipse (Luna)
//
// В эпизодах:
// Потоки, коллекции
//
// Трейлер: 
// Имитируется (т.к. все в одном процессе) работа клиент-серверного приложения 
// Запросы поступают от клиентов слушателю (или слушателям, если определить 
// несколько слушателей), а от него на сервер, где обрабатываются рабочими 
// потоками. Ответы возвращаются клиенту тем же маршрутом. Перед main-методом 
// приведены константы для изменение нагрузки сервера и запуска в различных
// конфигурациях.
//
// Внимание! После выполнения программы следует набрать в консоли "quit", 
// чтобы остановить серверные потоки
//
// PS: Предложения работы по-прежнему приветствуются (см. начало топика) 

interface IResponsible 
{
	void getResponse(String response);
}

interface IConnection
{
void sendRequest(String request);
	void close();
}

// сервер
class Engine 
{
	private WorkThread work_threads[];
	
	// запрос
	private class Request
	{
		IResponsible lsnr;
		String request;
		
		private Request(IResponsible lsnr, String request)
		{
			this.lsnr = lsnr;
			this.request = request;
		}
	}
	
	// рабочий поток
	private class WorkThread implements Runnable
	{
		private volatile boolean stopped;	
		private LinkedList<Request> requests;	
		
		private WorkThread()
		{
			requests = new LinkedList<Engine.Request>();
			new Thread(this).start();
		}
		
		@Override
		public void run() 
		{
			while (!stopped)
			{
				synchronized(requests)
				{
					Request request = requests.pollFirst();
					
					if (request != null) 
						process(request);
					else
						try { requests.wait(); } catch (InterruptedException e) {}
				}
			}
			
			System.out.println("Work thread " + Thread.currentThread().hashCode() + " has been stopped");
		}
		
		// обработать очередной запрос
		private void process(Request request)
		{
			request.lsnr.getResponse("Response_" + request.request.split("_")[1]);
		}	
		
		// отправить запрос
		public void sendRequest(Request request)
		{
			synchronized(requests)
			{
				requests.add(request);
				requests.notify();
			}
		}
		
		// остановить рабочий поток
		public void stop()
		{
			stopped = true;
			synchronized(requests) { requests.notify(); }
		}
	}
	
	// создать сервер и пул потоков 
	Engine(int thread_pool_size)
	{
		work_threads = new WorkThread[thread_pool_size];
		for(int i = 0; i < thread_pool_size; i++) 
			work_threads[i] = new WorkThread();
	}
	
	// поставить запрос в очередь
	public void sendRequest(IResponsible client, int client_num, String request)
	{
		WorkThread thread = work_threads[client_num % work_threads.length];
		thread.sendRequest(new Request(client, request));
	}

	// остановить сервер
	public void stop()
	{
		for(WorkThread thread : work_threads) 
			thread.stop();
	}
}

// слушатель
class Listener 
{
	private Engine engine;
	private HashSet<Connection> cnns;	
	
	// соединение
	private class Connection implements IConnection, IResponsible
	{
		IResponsible client;
		int client_num;
		
		private Connection(IResponsible client, int client_num)
		{
			this.client = client;
			this.client_num = client_num;
		}
		
		@Override 
		public void sendRequest(String request) 
		{
			engine.sendRequest(this, client_num, request);
		}
		
		@Override
		public void getResponse(String response) 
		{
			client.getResponse(response);
		}		
		@Override
		public void close() 
		{
			cnns.remove(client);
		}
	}
	
	// создать слушателя
	Listener(Engine engine) 
	{
		this.engine = engine; 
		cnns = new HashSet<Connection>();
	}
	
	// получить соединение 
	public IConnection getConnection(IResponsible client, int client_num)
	{
		Connection cnn = new Connection(client, client_num);
		
		cnns.add(cnn);
		return cnn;
	}
}

// клиент
class Client 
{
	private static int counter;
	
	private int num;
	private IConnection cnn;
	
	private class ClientImpl implements IResponsible, Runnable
	{
		private boolean all_responsed;		
		
		private ClientImpl(Listener lsnr)
		{
			cnn = lsnr.getConnection(this, num);			
			new Thread(this).start();
		}
		
		@Override
		// прием ответов 
		public void getResponse(String response) 
		{
			System.out.println("Client " + num + "\tThread " + Thread.currentThread().hashCode() + "\t\t" + response);
			
			// последний ответ получен
			if (Integer.parseInt(response.split("_")[1]) == MyFirstClass.CLIENT_REQUEST_COUNT)
				synchronized(this) 
				{ 
					all_responsed = true; 
					notify(); 
				}
		}		
		
		@Override 
		// моделирование клиентских запросов
		public void run()  
		{
			for (int i = 0; i < MyFirstClass.CLIENT_REQUEST_COUNT; i++)
			{
				String request = "Request_" + (i+1);
				System.out.println("Client " + num + "\tThread " + Thread.currentThread().hashCode() + "\t\t" + request);
				
				cnn.sendRequest(request);
				
				try 
				{
					Thread.sleep(MyFirstClass.CLIENT_DELAY);
				}
				catch (InterruptedException e) { }
			}
			
			synchronized(this) 
			{
				if (! all_responsed)
					try	{ wait(); }	catch (InterruptedException e) { }
			}
			
			cnn.close();
			
			System.out.println("Client thread " + num + " has been stopped");
		}
	}

	// создать клиента
	Client(Listener lsnr)
	{
		num = ++counter;
		new ClientImpl(lsnr);	
	}
}

// запуск
class MyFirstClass 
{
	final static int WORK_THREAD_COUNT = 2; 		// кол-во рабочих потоков сервера (>=1)
	final static int CLIENT_COUNT = 5; 				// кол-во клиентов (>=1)
	final static int CLIENT_REQUEST_COUNT = 5;		// кол-во запросов каждого клиента (>=1)
	final static int CLIENT_DELAY = 100;			// периодичность отправки запросов в мсек (>=0)
	
	public static void main(String args[])
	{
		// сервер и кол-во рабочих потоков
		Engine engine = new Engine(WORK_THREAD_COUNT);
		
		// слушатель клиентов
		Listener lsnr = new Listener(engine);

		// клиенты
		for (int i = 0; i < CLIENT_COUNT; i++) new Client(lsnr);
		
		// для остановки сервера ввести "quit"
		Scanner scn = new Scanner(System.in);
		while (! scn.nextLine().equals("quit")) {}
		scn.close();
		
		// остановить сервер
		engine.stop();
	}
}
26 апр 16, 22:26    [19110563]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
myaucha
Member

Откуда: Москва
Сообщений: 1134
Исправленному верить! Картинка с другого сайта.
+
		@Override
		public void run() 
		{
			while (!stopped)
			{
				Request request;
				
				synchronized(requests)
				{
					request = requests.pollFirst();
					if (request == null) 
						try { requests.wait(); } catch (InterruptedException e) {}
				}
				
				if (request != null) process(request);
			}
			
			System.out.println("Work thread " + Thread.currentThread().hashCode() + " has been stopped");
		}
27 апр 16, 15:24    [19113254]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
myaucha
Member

Откуда: Москва
Сообщений: 1134
Так, все, праздники закончились. Апаем :)
17 май 16, 19:29    [19185720]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
Агенор
Member

Откуда: "Откуда вам знать, если вы ещё не попробовали?"
Сообщений: 1429
Это вы сами написали? Что getResponse делает? Почему не pushResponse или putResponse? И почему String?
17 май 16, 19:47    [19185761]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
Агенор
Member

Откуда: "Откуда вам знать, если вы ещё не попробовали?"
Сообщений: 1429
Слушатель же экспортирует метод на приём в себя, а не на выдачу от себя, значит должен быть put, а не get.
17 май 16, 19:50    [19185765]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
Злой Бобр
Member

Откуда: Украина, Кривой Рог
Сообщений: 3418
myaucha,

Посмотри вариант Европы (Германия, Австрия, ...). 3,5к+ в месяц плюс бонусы. Ну и самое важное - никакой проблемы с одеревенением деревянного. Как вариант запости резюме на джобах их регионов. С таким опытом (если это действительно опыт) найти вполне реально.
Удачи в поиске.
17 май 16, 20:27    [19185842]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
myaucha
Member

Откуда: Москва
Сообщений: 1134
Агенор
Это вы сами написали? Что getResponse делает? Почему не pushResponse или putResponse? И почему String?
getResponse - потому-что "получить ответ". Интерфейс с данным методом реализует как слушатель, так и клиент: слушатель получает ответ от сервера, а клиент - от слушателя. Предполагается, что клиент в данном примере не взаимодействует с сервером напрямую, а только опосредованно - через слушателя. Почему String?! А почему бы и нет?! Основная идея кода была проверить как работает синхронизация потоков в Java и использовать некоторые виды коллекций, а что выбрать в качестве payload было не важно. В результате в качестве простейшего payload при взаимодействии между клиентом и сервером был выбран тип String.

Агенор
Это вы сами написали?
А разве по почерку не видно?! ;)

Злой Бобр
Посмотри вариант Европы (Германия, Австрия, ...). 3,5к+ в месяц плюс бонусы. Ну и самое важное - никакой проблемы с одеревенением деревянного. Как вариант запости резюме на джобах их регионов. С таким опытом (если это действительно опыт) найти вполне реально. Удачи в поиске.
За совет и пожелания, конечно, спасибо. Но к переезду я все равно не готов (родители уже старенькие, друзья здесь, да и не было никогда ранее такого стремления или необходимости), а в удаленную долгосрочную работу на постоянной основе не особо верю (во всяком случае положительного опыта среди своих знакомых не имею). Краткосрочная же удаленная работа (несколько месяцев) не имеет особых преимуществ, так как после ее завершения не всегда удается плавно переходить с проекта на проект без простоев (в консалтинге уже сталкивался с подобным, это почти норма). В результате заработанное сверх среднего размазываешь на месяцы простоя и получается просто как средняя ЗП, которую можно получать и здесь (во всяком случае раньше так было). К тому же появляются дополнительные сложности с будущими пенсионными и страховыми отчислениями (может и не самое ужасное, но все-таки) в связи с неопределенным статусом оформления. Ну и ко всему прочему если бы я последние 10 лет развивался, например, исключительно в джавошном направлении по всей сопутствующей линейке технологий, то смысл был бы, так как за это время можно было приобрести солидный опыт, а с SAP-ом удаленная работа на зарубежного заказчика маловероятна, есть своя специфика
17 май 16, 21:38    [19186031]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
babona
Member [заблокирован]

Откуда: Батуринск
Сообщений: 1816
myaucha,

глянул ваш PL/SQL - комментарии практически отсутствуют, в трех этажных запросах разбираться другим... видимо привыкли работать в одиночку.
По сему предлагать вакансию на 150 тыс.руб. не буду
17 май 16, 21:40    [19186044]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
myaucha
Member

Откуда: Москва
Сообщений: 1134
Будем считать, что я очень расстроен ;)
17 май 16, 21:43    [19186054]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
Michael Isaev
Member

Откуда:
Сообщений: 106
babona
myaucha,

глянул ваш PL/SQL - комментарии практически отсутствуют, в трех этажных запросах разбираться другим... видимо привыкли работать в одиночку.
По сему предлагать вакансию на 150 тыс.руб. не буду


1. Он написал, что не по SAP хочет от 130 тон.

2. В PL/SQL коде он показал, что знает разные новомодные синтаксисы. Это код для примера пойдет. №-х этажных SQL ей, я кстати не увидел. Все достаточно нормально. Кроме того, комментарить или нет зависит от того, какие на проектах были стандарты. Кроме того, некоторые "светила" утверждают, что комментарии портят код, а код должен быт самодокументируемым за счет использование правильный имен переменных, методов и т.д..
Поэтому считаю, что здесь у вас присутствует предвзятость.

А вот что не очень хорошо для BI-ETL-щика, так это:
-- загрузка активов
  delete quik_last_rate;

  for v_rec in
  (
    select * from x ...          
  ) loop
    insert into quik_last_rate values v_rec;
  end loop;


Надобно делать как-то так:

truncate quik_last_rate;
insert /*+append*/ into quik_last_rate select * from x;
18 май 16, 11:28    [19187789]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
myaucha
Member

Откуда: Москва
Сообщений: 1134
2 Michael Isaev

К BI приведенный мной фрагмент не имеет никакого отношения. Это просто процедура, которая загружает ежедневный XML-брокерский отчет в домашних условиях для личных целей, то есть никакого коммерческого кода здесь нет. В таблице quik_last_rate редко бывает более сотни записей, поэтому выискивать неэффективности в потребляемых ресурсах нет необходимости - не те объемы. В остальном все верно: целью было показать степень владения синтаксисом, хотя новомодным его никак не назовешь - с 2009 года не отслеживал развитие PL/SQL, если таковое имело место.

Я не зациклен на PL/SQL или каком-либо другом языке или инструментальном средстве разработки и вообще исключительно на разработке, как таковой. Есть достаточный бэкграунд в разных направлениях (где-то больший, где-то базовый), недостающие знания приобретаются по ходу работы над задачей. Цель простая - найти интересную перспективную хорошо оплачиваемую работу в IT-сфере с технологиями, которые востребованы сегодня и не потеряют своей актуальности в ближайшие годы. А что это будет: аналитика, проектирование, разработка или что-то иное - не суть важно.
18 май 16, 12:11    [19187990]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
Vint
Member

Откуда: Москва
Сообщений: 4547
babona,
где там хотя бы два этажа в запросах?) бедненький.. как же печально тебе работать, если такие простые вещи не понимать))

myaucha
ну раз уж показали код, зачем в функции get_corrs вообще использовать sql? нет работы с данными? нет вообще ничего что заставило бы использовать sql.... в остальном вполне средненько для разработчика 2009 года)
18 май 16, 15:40    [19189308]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
myaucha
Member

Откуда: Москва
Сообщений: 1134
Vint
ну раз уж показали код, зачем в функции get_corrs вообще использовать sql? нет работы с данными? нет вообще ничего что заставило бы использовать sql....
ну раз вы во всем разобрались и решили покритиковать, то перепишите без sql, чтобы было правильно и выложите здесь, а мы все посмотрим ;)

Vint
в остальном вполне средненько для разработчика 2009 года)
А что вы ожидали увидеть?! Интерпретатор JAVA, реализованный на PL/SQL?! Не надо чрезмерно усложнять то, что имеет относительно простое решение
18 май 16, 16:04    [19189447]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
Vint
Member

Откуда: Москва
Сообщений: 4547
myaucha,
я ожидал увидеть xmltable вместо устаревшего "table(xmlsequence(extract", а в остальном я не критиковал а спросил зачем.
перепишу, как позовете работать и предложите сумму которая меня удовлетворит) прямо при Вас перепишу)
18 май 16, 16:07    [19189482]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
myaucha
Member

Откуда: Москва
Сообщений: 1134
Vint
я ожидал увидеть xmltable вместо устаревшего "table(xmlsequence(extract", а в остальном я не критиковал а спросил зачем. перепишу, как позовете работать и предложите сумму которая меня удовлетворит) прямо при Вас перепишу)
То есть я еще и должен заплатить за то, что не оправдал ваши ожидания?! Нормальный подход! :) А что касается "зачем", то когда вы работаете с данными и синтаксис SQL-языка позволяет строить гибкие конструкции, то проще оперировать наборами данных - механически код быстрее напишешь и отладишь, он будет компактнее и лаконичнее в итоге выглядеть. Задайте майкрософту вопрос "зачем" он LINQ себе внедрил. В общем вопрос довольно странный, особенно, для Oracle-специалиста
18 май 16, 16:54    [19189866]     Ответить | Цитировать Сообщить модератору
 Re: Рассмотрю варианты альтернативного трудоустройства  [new]
Vint
Member

Откуда: Москва
Сообщений: 4547
myaucha
То есть я еще и должен заплатить за то, что не оправдал ваши ожидания?! Нормальный подход! :)

нет, я всего лишь уточнил то, что хотел узнать.
myaucha
А что касается "зачем", то когда вы работаете с данными и синтаксис SQL-языка позволяет строить гибкие конструкции, то проще оперировать наборами данных - механически код быстрее напишешь и отладишь, он будет компактнее и лаконичнее в итоге выглядеть.

для меня критерием хорошего кода является его скорость и только потом красота компактность и лаконичность. для вас компактность и лаконичность на первом месте. вот как то так я вижу. и использовать sql для того что можно написать на pl\sql и посчитал странным.
18 май 16, 17:58    [19190212]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / Работа Ответить