Описание исследования
Цель опроса. Выявить мотивы, побуждающие экспертов сертифицировать свои знания в области ИТ.
Задачи исследования:
- определить структуру экосистемы SAP и долю сертифицированных специалистов
- выделить факторы, влияющие на решение о сертификации собственных знаний
- определить отношение экспертов к текущему процессу сертификации
Целевая аудитория: ИТ специалисты, наемные служащие компаний- партнеров и компаний-клиентов SAP, фрилансеры.
Выборка: целевая, подписчики интернет ресурсов SAPLand, SCN, SAP Education. Итоговый объем – 582 респондента
Форма проведения: интернет опрос
Время проведения опроса: июль 2021
SAP СНГ много инвестировал в обучение консультантов, за последние 3 года мы обучили около 6 000 экспертов. Одновременно с этим опрос среди партнеров и клиентов, проведенный в 2021 году свидетельствует о снижении общего уровня профессиональных компетенций консультантов и объясняет участившиеся нарекания в адрес сервисных партнеров о качестве внедрений.
«Мы считаем своей задачей – способствовать развитию здоровой привычки нашей экосистемы сертифицировать свои знания, а также формировать устойчивый спрос на «сертифицированные навыки» со стороны клиентов. С этой целью в июле 2021 года мы провели экспресс исследование о мотивах, которые движут ИТ консультантами при сертификации собственных знаний» – говорит руководитель офиса стратегических инициатив компании SAP Андриясова Яна.
В ходе анализа выяснилось, что треть экосистемы SAP обладают как минимум одним сертификатом SAP, а 10% из них имеют 3 и более сертификатов. С 2021 года по настоящие дни SAP Education выдал более 5000 сертификатов, большая часть которых принадлежит специалистам, работающим в компаниях партнерах (на них приходится 69% всех сертифицированных ресурсов)
Уровень сертифицированных специалистов на рынке стран СНГ сопоставим с показателями развитых рынков Германии, Англии, Франции. С гордостью можно отметить, что процент успешной сдачи тестов в России выше среднеевропейских показателей. Так называемый pass rate в странах СНГ составляет 84% против 71% в странах Европы.
Говоря о причинах, которые побудили экспертов сертифицироваться, 55% людей выделили, прежде всего, личные мотивы, – повышение квалификации, желание проверить свои знания, привычка коллекционировать сертификаты и пр. 43% респондентов – признались, что пришли сертифицироваться по требованию работодателя.
Вопреки расхожему мнению о том, что компании партнеры не приветствует сертификацию своего персонала, 75% опрошенных заявили, что их работодатель положительно относится к стремлению сотрудников проходить сертификацию. Этот факт подтверждается тем, что 69% респондентов ответили, что расходы на сертификацию в полном объеме берет на себя работодатель.
Из личного бюджета оплачивают сертификацию только 20% экспертов. В опросе так же принимали участие студенты и выпускники ВУЗов (8% опрошенных), но несмотря на участие этой группы в опросе, только 16% из общей выборки заявили, что цена является стоп-фактором при принятии решения о сертификации.
Интересным, является и тот факт, что большинство специалистов, принявших участие в опросе, считают, что получение сертификата никак не повлияло на уровень их дохода. Об этом же говорят руководители SAP практик и HR директора партнеров, что сегодня наличие сертификатаявляется обязательным, но не единственным требованием при приеме на работу.
Вместе с тем, 31% опрошенных заявили о том, что с получением сертификата они связывают позитивные сдвиги в своей карьере – повышение совокупного дохода (14%), повышение в должности и переход на новую работу (17%).
Как показывает анализ, среди партнеров наибольшим количеством сертифицированных ресурсов обладают любо крупные системные интеграторы, где сертификация знаний – является стандартом для развития карьеры (45%-50%), либо нишевые партнеры с моно-специализацией – здесь доля сертифицированных специалистов достигает 80%-85% от общего размера SAP практики.
Большинство участников опроса высказывались, что для них сертификация знаний, прежде всего, носит характер дифференциации себя в профессиональном сообществе и скорее отторгали идею массового характера сертификации.
В этой связи много высказываний было посвящено обесценению сертификата – слишком простые вопросы, устаревшие тесты, маневры для списывания. «Пусть лучше экзамен будет сложнее, и контроль за списыванием жестче, тогда ценность полученного сертификата возрастет», – высказывался один из опрошенных консультантов.
Говоря о форме обучения – полезные предложения поступили о развитии дистанционной формы обучения и подготовки к экзаменам, возможность сдачи экзаменов в выходные дни, пробный тест, введение практических задач в экзамен.
Резюмируя, можно сказать, что каждый сам для себя принимает решение «сертифицироваться или не сертифицироваться», но задумайтесь и ответьте себе на вопрос, пойдете ли вы лечить зубы к доктору, о котором хорошие отзывы от нескольких пациентов, но диплома мединститута он не получил?
Sap ps transaction codes – sap stack
Here is the complete list of important SAP PS transaction codes which are mainly used in Project System.
Transaction codes in Requirements Grouping
- GRM4: Assign WBS Elements Individually
- GRM3: Assign WBS Elements Using List
- GRM1: Display Assigned WBS Elements
- GRM5: Assign Planning Groups
- GRM2: Display Assigned Planning Groups
- GRM7: Display Assigned Planning WBS Elements
Claim Management Tcodes
- CLM1, CLM2, and CLM3: Create, Change, and Display Claim respectively.
- CLM10: Claim Overview
- CLM11: Claim Hierarchy
Collaboration Tcodes
- CMWO: Configuration Management
- CEP_R3_MON: Monitoring
- CEO1: Display Folder
- CEO2: Transfer Folder
- CEO3: Check Folder
Execute Controlling Reports Transactions
- CJE0: Hierarchy Report
- CJEB: Hierarchy Report in Background
- GR55: Cost Element Report
Display Documents Transactions
- CN05: Display Project Texts
- CN04: Edit Project Texts
- CV01N, CV02N, and CV03N: Create, Change, and Display Documents respectively.
- CV04N: Find Documents
Line item Reports Transaction codes
- CJI3: Actual Costs/Revenues
- CJI5: Commitments
- CJI4: Planned Costs/Revenues
- CJIB: Budget
- CJIA: Actual Payments/Payment Commitments
- CJI9: Hierarchical Cost/Revenue Planning
- CJIC: Display Project Settlement Line Items
- CJID: Display Project Settlement Line Items
Progress Determination Transaction codes
- CNE1: Individual Processing
- CNE2: Collective Processing
CO planning Transaction codes
- CJ40, CJ41: Change, Display Overall Costs in the WBS respectively.
- CJ42, CJ43: Change. Display Revenues in the WBS respectively.
- CJ9K: Network Costing
- CJ9FS: Copy Planning
- KP04: Set Planner Profile
- CJR2, CJR3: Change, display Costs/Activity Inputs respectively.
- KSWB: Periodic Reposting
- CJ9BS: Copy Project Planning
- CJ9CS: Copy Actual to Plan
- CPUL: Template Allocation: Collective Processing
- CJ47: Overhead: Collective Processing
- CJZ5: Interest Calculation: Collective Processing
- CJC2: Results Analysis: Plan Status Changes
- CJ9G: Settlement: Collective Processing
- CJS2, CJS3: Change, Display Statistical Key Figures (WBS Element) respectively.
- CJK2, CJK3: Change, Display Statistical Key Figures (Network) respectively.
Project Year End Closing Tcodes
- CJCF: Carry Forward Commitment
- CJCO: Carry Forward Budge
Materials Transactions
- MM01, MM02, MM03: Create, Change, Display Material respectively.
- CN33: BOM Transfer
- MD51: Project Material Requirements Planning
- MD50: Sales Order Material Requirements Planning
- MD4C: Order Report
- CO46: Order Progress Report
- CO24: Backlog Processing: Missing Parts Information System
- CO06: Backlog Processing: Materials
- V_RA: Backlog Processing: Sales Orders
- MDUP: Sales Order/Material Assignment: Edit
- MDUS: Sales Order/Material Assignment: Display
- CNL1, CNL2, CNL3: Create, Change, Display Delivery Information respectively.
- CNSO: Delivery from Project
Funds Commitment Transaction codes
- FMZ1, FMZ2, FMZ3: Create, Change, Display Funds Commitment respectively.
- FMZ6: Reduce Funds Commitment
Project Period-End Closing Transaction codes
- CJB2: Settlement Rule: Individual Processing
- PSW5: Periodic Repostings
- CPTK: Template Allocation: Individual Processing
- CJN1: Revaluation at Actual Prices: Individual Processing
- CJ08: Overhead: Individual Commitment Processing
- CJ44: Actual Overhead Calculation: Individual Processing
- CJZ2: Interest Calculation: Individual Processing
- CJ9L: Cost Forecast: Individual Processing
- CJA2: Incoming Orders: Individual Processing
- CJ88: Settlement: Individual Processing
- CJIC: Settlement: Investment Project Line Items
- KKA0P: Change Cutoff Period for Planned Results Analysis
- KKA2: Execute Results Analysis: Individual Processing
- KKA2P: Execute Planned Results Analysis: Individual Processing
- CJB1: Settlement Rule: Collective Processing
- PSW5: Periodic Reposting
- CPTL: Template Allocation: Collective Processing
- CJN2: Revaluation at Actual Prices: Collective Processing
- CJ09: Commitment Overhead Calculation: Collective Processing
- CJ45: Actual Overhead Calculation: Collective Processing
- CJZ1: Interest Calculation: Collective Processing
- CJ9M: Cost Forecast: Collective Processing
- CJC1: Results Analysis: Check Status Validity Date
- CJA1: Incoming Orders: Collective Processing
- CJ8G: Settlement: Collective Processing
- KKAJ: Execute Results Analysis: Collective Processing
- KKAJP: Execute Results Analysis: Collective Processing
Planned payments Transaction codes
- CJ48, CJ49: Change, Display Payments in the WBS respectively.
Project Budgeting Transaction codes
- CJ30, CJ31: Create, Display Original Budget respectively.
- CJ37: Budget Supplement: Within Project
- CJ36: Budget Supplement: To Project
- CJ38: Budget Return: Within Project
- CJ35: Budget Return: From Project
- CJ32, CJ33: Change, Display Budget Release respectively.
- CJ3a, CJ3b: Change, Display Budget Document respectively.
- CJBV: Budget: Activate Availability Control
- CJBW: Budget: Deactivate Availability Control
- OPSX: Budget: Reset “Budgeted” Status
- CJ34: Budget Transfer
Project Structures transaction codes
- CJ20N: Project Builder
- CJ27, CJ2B, CJ2C: Create, Change, Display Project respectively (Project Planning Board)
- CJ2D, CJ20, CJ2A: Create, Change, Display Project respectively (Structure Planning)
- CJV1, CJV2, CJV3, and CJV5: Create Change, Display, and Delete Simulation respectively.
- CJV7: Simulation: Logs
- CN60: Change Documents: On Project/Network
- CJ01, CJ02, CJ03: Create, Change, Display WBS respectively.
- CN21, CN22, CN23: Create, Change, Display Network respectively.
- CJ20N: Project Builder
- CJ13: Display WBS Element
- KJH3: Display WBS Element Group
Confirmations Transaction codes
- CN25, CN28: Create, Display Network Confirmation (Individual Processing) respectively.
- CN29: Cancel Network Confirmation (Individual Processing)
- CN27: Collective Confirmation Processing
- CAT2: Timesheet: Enter Times
- CAT3: Timesheet: Display Times
Work Center Transaction codes
- CNR3: Work Center: Display Master Record
- CR13: Work Center: Display Capacity
- CMP3: Workforce Planning: Work Center View
- CMP9: Workforce Planning – Reporting
- CM01: Capacity Evaluation, Work Center View
- CNR1: Work Center: Create Master Record
- CNR2: Work Center: Change Master Record
- CR11: Work Center: Create Capacity
- CR12: Work Center: Change Capacity
- CR21: Work Center: Create Hierarchy
- CR22: Work Center: Change Hierarchy
- CR13: Work Center: Display Capacity
- CR23: Work Center: Display Hierarchy
- CR05: Evaluation – Work Center List
- CR06: Evaluation – Cost Center Assignment
- CR07: Evaluation – Work Center Capacity
- CR08: Evaluation – Work Center Hierarchy
- CR10: Evaluation – Change Documents
- CA83: Where-Used – Work Center
- CR15: Where-Used – Capacity
- OP4A: Available Capacity – Shift Program
- OP03: Available Capacity – Factory Calendar
Standard Structures Transaction codes
- CJ93: Display Standard WBS
- CN03: Display Standard Network
- CN13: Display Standard Milestones
- CJ91, CJ92, CJ93: Create, Change, Display Standard WBS respectively.
- CN01, CN02, CN03: Create, Change, Display Standard Network respectively.
- CN98: Delete Standard Network
- CU41, CU42, CU43: Create, Change, Display Standard Network Configuration Profile respectively.
- CA88: Replace Work Center
- CA78: Replace PRT
- CN11, CN12, CN13: Create, Change, Display Standard Milestone respectively.
- CN08, CN09: Edit, Display Network Parameters from Sales Order respectively.
- CA83: Where-Used Lists: Standard Networks for Work Center
- CA73: Where-Used Lists: Standard Networks for PRT
- CJCS: Change Documents: For Standard WBS
- CN61: Change Documents: For Standard Network
Dates in project Transaction codes
- CJ2B: Project Planning Board: Change Project
- CJ2C: Project Planning Board: Display Project
- CJ21, CJ22: Change, Display Basic Dates Respectively
- CJ25, CJ26: Change, Display WBS Dates respectively
- CJ23, CJ24: Change, Display Forecast Dates respectively
- CJ29: Project Scheduling
Transfer Prices Transaction codes
- CJG4: Transfer Price Allocation: Enter Using List
- CJG3, CJG5: Display, Cancel Transfer Price Allocation respectively.
- CJF1, CJF2, CJF3: Create, Change, Display Transfer Price Agreement respectively.
Also Read :
SAP PS Module Main Tutorial
->
SAP PS Tables
Transactions « sap sd complex instructions
> Tables
> SAP FAQ
Q: Как изменить/редактировать книгу источника поставок (source list)?
A: ME0M
SM04 – Список пользователей. Позволяет просмотреть с какими транзакциями работает пользователь и сколько режимов у него открыто.
AL08 – Список активных пользователей
SM50 – Обзор процессов. В частности позволяет просмотреть работает ли ваша “зависшая» транзакция
search_sap_menu – транзакция для поиска в SAP menu
s_BCE_68001399 – узнать какие люди связаны с ролью.
S_BCE_68002041 – какие транзакции в роли.
SM01 – списки транзакций как фильтр по коду, например ввести там ME8 и смотреть какие т-коды имеют отношение к отчетам по PO
CKMM – изменение Определения цены (Price determination) или Price control indicator (S/V) (Управление ценой)
(S – надо использовать для стандартных материалов, цена – 0 руб., V – для торговых изделий)
MB1B 311 или MIGO 311 – трансфер с одного склада на другой.
VL71 – напечатать форму из поставки
VF05N – список фактур, платежных документов (например, созданных в VF01)
VF11 – сторнировать фактуру
VF31 – печать документов ко счету.
VFX3 – просмотр ошибок со счетами
MBSM – по номеру документа был ли он сторнирован?
ME2N – поиск среди закупок, список закупочных агриментов
ME2M – список закупочных документов агриментов с ценами
ME2L – поиск среди документов по поставщику. Например, если есть PO, но нет приходования MIGO, то можно вывести список, указав Document Type: NB (колонка To be delivered).
ME3L – Outline agreements per vendor
ME3M – Outline agreements per material
ME3C – Outline agreements per material group
ME3B – Outline agreements per requirement tracking number
ME3N – Outline agreements by agreement no.
MSRV5 – Service list for contract
ME3K – Outline agreements by account assignment
ME5A – вывод PR’ов с возможностью выборки лишь „полностью одобренных/деблокированных“ (Processing Status = N для тех PR’ов к которым еще нет PO).
ME9F – печать документов (в ME22N можно редактировать Message, если что-то надо печатать повторно).
ME9E – печать расписания
ME9L – печать агриментов
MF41 – сторно бэкфлаш.
MF42N – то же что и MFBF, но внесение информации о нескольких материалах подряд.
ME38 – удалить Scheduling agreement
ME55 – деблокирование заявки на закупку.
ME54N – деблокирование позиции по отдельности.
ME84 – создать call-off релизы
SU2 –
BD55 Правило преобразования для User Exit. Ссылка на правила преобразования User Exit для различных систем.
WE82 Разблокирование ссылки
WE57 Присвоение Функционального Модуля сообщению и типу IDOC
VA42 изменить контракт
VA22 Изменить предложение
VF04 обработать рабочий список фактур
VL04 рабочий список заказов клиентов/заказов на поставку
VKM3, VKM4 списки торговых документов
VKM1 блокированные документы Сбыта
VKM5 список поставок
VT02N изменение транспортировки
VT70 выходные документы к транспортировкам
Customer
XD01 Create Customer (Centrally)
XD05 Block customer (centrally)
XD06 Mark customer for deletion (centr.)
XD07 Change Customer Account Group
XD99 Customer master mass maintenance
XDN1 Maintain Number Ranges (Customer)
Vendor
XEIP Number range maintenance: EXPIMP
XK05 Block Vendor (Centrally)
XK06 Mark vendor for deletion (centrally)
XK07 Change vendor account group
Sales Order
VA00 Initial Sales Menu
VA07 Compare Sales – Purchasing (Order)
VA08 Compare Sales – Purchasing (Org.Dt.)
Inquiry
VA11 Create Inquiry
VA12 Change Inquiry
VA13 Display Inquiry
VA14L Sales Documents Blocked for Delivery
VA15 Inquiries List
Quotation
VA21 Create Quotation
VA22 Change Quotation
VA23 Display Quotation
VA25 Quotations List
VA26 Collective Processing for Quotations
Contract
VA41 – Create Contract
VA42 Change Contract
VA42W Workflow for master contract
VA43 Display Contract
VA44 Actual Overhead: Sales Order
VA45 List of Contracts
VA46 Coll.Subseq.Processing f.Contracts
Item Proposal
VA51 Create Item Proposal
VA52 Change Item Proposal
VA53 Display Item Proposal
VA55 List of Item Proposals
VA88 Actual Settlement: Sales Orders
Deliveries
VL00 Shipping
VL01 Create Delivery
VL01N Create Outbound Dlv. with Order Ref.
VL01NO Create Outbound Dlv. w/o Order Ref.
VL02 Change Outbound Delivery
VL02N Change Outbound Delivery
VL03 Display Outbound Delivery
VL03N Display Outbound Delivery
VL04 Process Delivery Due List
VL06 Delivery Monitor
VL06C List Outbound Dlvs for Confirmation
VL06D Outbound Deliveries for Distribution
VL06F General delivery list – Outb.deliv.
VL06G List of Oubound Dlvs for Goods Issue
VL06I Inbound Delivery Monitor
VL06IC Confirmation of putaway inb. deliv.
VL06ID Inbound Deliveries for Distribution
VL06IF Selection inbound deliveries
VL06IG Inbound deliveries for goods receipt
VL06IP Inbound deliveries for putaway
VL06L Outbound Deliveries to be Loaded
VL06O Outbound Delivery Monitor
VL06P List of Outbound Dlvs for Picking
VL06T List Outbound Dlvs (Trans. Planning)
VL06U List of Uncheckd Outbound Deliveries
VL08 Confirmation of Picking Request
VL09 Cancel Goods Issue for Delivery Note
VL10 Edit User-specific Delivery List
VL10A Sales Orders Due for Delivery
VL10B Purchase Orders Due for Delivery
Pricing
V/03 Create Condition Table (SD Price)
V/04 Change Condition Table (Sales pr.)
V/05 Display Condition Table: (Sales Pr.)
V/06 Condition Categories: SD Pricing
V/07 Maintain Access (Sales Price)
V/08 Conditions: Procedure for A V
V/09 Condition Types: Account Determin.
V/10 Account Determination: Access Seqnc
V/11 Conditions: Account Determin.Proced.
V/12 Account Determination: Create Table
V/13 Account Determination: Change Table
V/14 Account Determination: Display Table
BOM
CS00 BOM Menu
CS01 Create Material BOM
CS02 Change Material BOM
CS03 Display Material BOM
CS05 Change Material BOM Group
CS06 Display Material BOM Group
CS07 Allocate Material BOM to Plant
CS08 Change Material BOM – Plant Alloc.
CS09 Display Allocations to Plant
CS11 Display BOM Level by Level
CS12 Multilevel BOM
CS13 Summarized BOM
CS14 BOM Comparison
CS15 Single-Level Where-Used List
CS20 Mass Change: Initial Screen
CS21 Mass Material Change: Initial Screen
CS22 Mass Document Change: Initial Screen
CS23 Mass Class Change: Initial Screen
CS25 Archiving for BOMs
CS26 BOM deletion
CS27 Retrieval of BOMs
CS28 Archiving for BOMs
CS31 Create class BOM
CS32 Change class BOM
CS33 Display class BOM
CS40 Create Link to Configurable Material
CS41 Change Material Config. Allocation
CS42 Display Material Config. Assignment
CS51 Create standard BOM
CS52 Change standard BOM
CS53 Display standard BOM
CS61 Create Order BOM
CS62 Change Order BOM
CS63 Display Order BOM
CS71 Create WBS BOM
CS72 Change WBS BOM
CS73 Display WBS BOM
CS74 Create multi-level WBS BOM
CS75 Change multi-level WBS BOM
CS76 Display multi-level WBS BOM
CS80 Change Documents for Material BOM
CS81 Change Documents for Standard BOM
CS82 Change documents for sales order BOM
CS83 Change documents for WBS BOM
CS84 Change documents for class BOM
CS90 Material BOM Number Ranges
CS91 Number Ranges for Standard BOMs
CS92 Number Ranges for Sales Order BOMs
Кто такой sap-разработчик?
Комментируют руководитель группы ABAP-разработчиков EPAM Дмитрий Сурков и главный системный аналитик EPAM Константин Семенов
Если настройка продукта не дает желаемых результатов, команда разработчиков дописывает необходимый функционал. Раньше SAP-разработчик являлся Full-stack специалистом, который отвечал за написание как серверной части, так и презентационной. В последние годы наметилось разделение по специализации на фронтенд и бэкенд: бэкенд все также работают с языком ABAP, фронтенд используют Java, JavaScript, HTML и прочие фреймворки.
ABAP предназначен для работы исключительно в экосистеме SAP-продуктов. Этот язык программирования появился достаточно давно, но продолжает активно развиваться: создаются новые конструкции, фреймворки. За практически сорокалетнюю историю существования вобрал в себя много различных парадигм программирования, таких как процедурное, ориентированное и объектно-ориентированное.
«Важно понимать, что ABAP 4 – это не универсальный язык типа Java или C#. На нем можно писать только для SAP. А разработка для SAP – это часто не создание какой-то логики с нуля, а расширение существующего функционала, дополнение его необходимыми для заказчика опциями. Чтобы делать эти расширения наиболее эффективно SAP-разработчик должен обладать не только техническими навыками, но и знаниями о конкретном бизнес-домене, понимать возможности решений SAP в этом домене и придумывать как дополнить решение, чтобы эффективно выполнить задачу клиента.».
Разработчик SAP находится где-то посередине между программистом и аналитиком. Помимо умения писать код, он должен разговаривать с представителями бизнеса на одном языке. Для работы с данными SAP-специалисты используют платформу HANA (как работать с тулом можно почитать
). Внедряет и развивает этот инструмент специальная команда. HANA-разработчики занимаются native-разработкой с HANA спецификой. Это разработка, но не такая как везде. Она более enterprise ориентирована. Основные потребители – крупные предприятия, внутренний софт которых естественно написан на SAP. Для работы с HANA обязательно нужно знать окружение SAP, тулы и стандарты.
«Если вы работаете с языком Java, то пишете все сами: как лежит база данных, авторизации. Вы привыкли так работать, но в SAP все утроено по-другому. Здесь есть определенные стандарты и их нужно придерживаться, их нельзя менять, иначе пострадает интеграция. Когда к нам приходят работать generic-разработчики, у них происходит сдвиг сознания, им сложно к этому привыкнуть».
Из-за определенных ограничений HANA-разработчик должен уметь лавировать и находить креативные решения, которые будут соответствовать требованиям заказчика и техническим параметрам системы. Это сложно и требует определенной сноровки.
«Всегда изучаем что-то новое, широко развиваемся и осваиваем смежные сферы. На рынке очень ценятся специалисты, которые знают больше, чем нужно, умеют проявлять инициативу и принимать самостоятельные решения».Каким должен быть SAP-разработчик?
Аккуратным, въедливым, думающим, гибким, креативным, обладать аналитическими способностями, быстротой и структурированностью мышления, обязательно владеть иностранными языками, умением работать в команде прислушиваться к чужому мнению и брать на себя ответственность за принятие решений.
С какой базой проще добиться успехов на позиции SAP-разработчика?
«В идеале необходимо инженерное или инженерно-экономическое образование. Узкая специализация, по которой ты просто пишешь код, сейчас встречается крайне редко. Чаще разработчик готовит решение задачи совместно с консультантом. Для этого нужно разбираться в бизнес-процессах. Большим плюсом будет знание нескольких языков программирования, основ баз данных и умение строить SQL-запросы».
О сертификации sap, о sf, о развитии – sap hr от поцелуева
Эти дни я много думал как бы емко выразить свои мысли, чтобы сказать прямо так, как я думаю. Но уже все позабывал. В мае этого года я сдавал на сертификат по HCM Ehp 7. Пришел в класс, сел за компьютер, ответил на вопросы и ушел. За мной смотрели по видеокамере, чтобы я не жульничал. За это удовольствие я отдал 550 вроде бы долларов. Вчера я проходил сертификацию по SAP SuccessFactors, онлайн. На меня также смотрела тетя по видео, я ей показал свой гостиничный номер и ноги. За эту сдачу я заплатил 535/6 = 90 долларов. Столько же вопросов, столько же времени. Математика для меня неясна.
Когда я готовился к первому экзамену, по «базе», то меня сильно напрягала необходимость запоминать множество кодов, технических имен. Какие признаки за что отвечают, какие правила, какие таблицы — все то, что в реальной жизни не нужно, ибо ты всегда можешь за минуты найти. Мне больше понравился экзамен по PMI, где спрашивают про жизненные ситуации, чтобы проверить твое поведение и логику принятия решений. В SF полный привет. Да простят меня монстры и метры SF в лице Василия, но это бздец.
Я сдал со второго раза. К первому разу я готовился примерно 3 месяца вечерами в спокойном режиме — пара часов в день. То почитаю доки, то курсы, то Learning Hub, то презентации, то курсы продавцов. Везде красиво пелось, что это современное решение, которое мега удобно, очень наглядно и красиво. Я же давно в HR, я о процессах думаю, о юзабилити, о ТСО, о сопровождении, о правильных подходах. Хрен вам, ребятушки. На сертификации 30% вопросов это штудирование XML файлов, которые вендор рекомендует открывать в XMLPad, Notepad и еще чем-то. На кой черт в 21 веке зубрить теги XML, когда сам же вендор говорит, что мы клевые, мы все почти настраиваем в веб-морде. Нынешние консультанты слово SQL не знают, а таблицу от базы данных отличить не могут, а тут надо Join, композитные ассоциации, сложные фильтры на объектах делать, а еще и теги помнить и порядок их расположения. Моня, ну нельзя так продавать партнерам свои решения, своим-же.
Более того, SuccessFactors после SAP уже не кажется таким радужным, логичным. Скорее алогичным. Набор кубиков, где на каждый модуль нужно писать свои интеграции в виде бизнес правил, синхронизаций, заданий фоновых. И все ручками, ручками. Кое-где в XML. Это что за бредятина? Я еще не дошел до отчетности, но судя по курсам там все плохо будет с печатью простых справок или приказов.
Печально еще и то, что теперь я подсел на иглу Learning Hub, которая стоит от 2200 евро в год, так как я обязан 4 раза в год проходить дельта-сертификации. Для многих фрилансеров это банально дорого. Да и мало партнеров жаждет выкидывать такие деньги. Это не на компанию, а на каждого человека = консультанта. Каждый год, пожизненно.
Сегодня я осилил 230 страниц документа по настройке заработной платы для SF. У меня все упало, честно. Я сейчас очень пессимистично скажу, но пока не вижу других предпосылок. Мы помним, что в 2025 году САП прекращает поддерживать классическую ERP6.0. Сейчас многие лицензии уже не продаются на расширенную функциональность, так как есть SF. В самом SF для кадровой части в ее российском представлении (процессы, документы, отчеты) нет ровно ничего. Это означает, что всем нынешним саповским консультантам по кадрам (PAOM) придется учиться на Employee Central и кучку приблуд к нему. Так как в стандарте нет нифига, то все это придется делать самим, ручками, настроечками в самом SF. А там объекты, связи, фильтры, критерии поиска, портлеты, XML — огромное количество гемороя, к которому САП консультанты не привыкли. САП из коробки, из копии 000 манданта разворачивается за неделю. Демка локализованная разворачивается, что-то, что можно показать как целостный процесс заказчику. В SF и рядом не валялось.
Теперь про зарплату. Классические зарплатчики будут жить, но немногие. В качестве движка для расчета зп САП оставил классическую схему, все те же правила, таблички. Но в добавок появилась куча вещей, которые PY консультанты не умеют делать, а вендор теперь вменяет это именно им. Теперь зарплатчик должен будет уметь настраивать интеграцию с кадровой частью. Делать мепинги полей XML в инфотипы с точностью до поля. Знать, что такое OData и SOAP. Неплохо бы еще SSO, IDM. Это все из руководства по настройке расчета заработной платы в SF. Дальше, тот самый, мой любимый Payroll Control Center, который является улучшенной версией PUST, стал стандартом в SF. Нам придется научиться его настраивать. Многие консультанты любят абапить и пилить Зю. Придется забыть. АБАПить можно только функции, бади. Своих табличек делать нельзя — надо топать в SF, создавать MDF объект, настраивать его синхронизацию со стандартным инфотипом, который прочитается в схеме. Либо OData вызов из функции — большие компании повесятся на производительности из-за миллионов API calls 😉
Многие компании в России начали внедрение SF. В США уже никто не внедряет классику, только поддерживают. Много переходов на HANA, SF, Workday. Та самая сервисная модель, о которой я тоже много писал, начинает приобретать черты. Модули внутри SF — сервисы — поэтому никакой нормальной интеграции, каждый сам по себе. Интеграция с внешним миром либо через официальные аддоны, которых я насчитал около 6-10 штук (все западные), либо OData/API.
Пора начинать учиться снова. Образование это тоже инвестиция.
Вывод результата на экран
Так как состав полей и их тип нам заранее неизвестны, то для получения результата и вывода его на экран нам необходимо динамически сгенерировать внутреннюю таблицу и структуру ALV-Grid на основании выбираемых в запросе полей. Для этого будем использовать метод
create_dynamic_table
класса
cl_alv_table_create
Полный листинг исходного кода программы ZSQL:
type-pools: slis.
types: begin of ty_simple_struc,
line(255) type c,
end of ty_simple_struc.
types: ty_simple_tab type standard table of ty_simple_struc.
types: ty_t_code type standard table of rssource-line.
data: g_editor type ref to cl_gui_textedit,
g_editor_container type ref to cl_gui_custom_container,
g_ok_code like sy-ucomm,
p_tech_names(1) type c.
field-symbols: <fs_data> type standard table,
<fs_wa_data> type any.
call screen 100.
module pbo output.
set pf-status `MAIN100`.
" Выводим на форму текстовый редактор для SQL-запроса"
if g_editor is initial.
create object g_editor_container
exporting
container_name = `MYEDIT`
exceptions
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5.
create object g_editor
exporting
parent = g_editor_container
wordwrap_mode = cl_gui_textedit=>wordwrap_at_fixed_position
wordwrap_to_linebreak_mode = cl_gui_textedit=>true
exceptions
others = 1.
if sy-subrc <> 0.
leave program.
endif.
endif.
endmodule.
module pai input.
case sy-ucomm.
when `EXIT`.
leave program.
when `EXEC`. " Нажатие кнопки «Выполнить»
perform exec.
endcase.
endmodule.
form exec.
" Получаем введенный запрос с формы"
data lt_sql_query type ty_simple_tab.
clear lt_sql_query.
call method g_editor->get_text_as_r3table
importing
table = lt_sql_query
exceptions
others = 1.
delete lt_sql_query where line = ''.
" Парсим запрос и получаем названия выбираемых полей и таблиц"
data: lt_fields type ty_simple_tab,
lt_tables type ty_simple_tab,
l_use_cnt(1) type c.
clear: lt_fields, lt_tables, l_use_cnt.
perform parse_sql_query
using
lt_sql_query
changing
lt_fields
lt_tables
l_use_cnt.
" Генерируем ABAP-программу из полученного SQL-запроса"
data: code type ty_t_code,
prog(8) type c,
msg(120) type c.
clear: code, prog, msg.
perform create_get_function
using
lt_sql_query
changing
code.
generate subroutine pool code name prog
message msg.
if sy-subrc <> 0.
message msg type 'I'.
return.
endif.
" Формируем структуру ALV-Grid на основе выбираемых полей и таблиц"
data: lt_fieldcatalog type slis_t_fieldcat_alv.
refresh: lt_fieldcatalog.
perform get_fieldcat
using
lt_tables
lt_fields
p_tech_names
l_use_cnt
changing
lt_fieldcatalog.
" Динамически, на основе выбираемых полей и таблиц, создаем таблицу <fs_data>,
" в которую будем помещать результат выполнения запроса"
perform create_itab_dynamically
using
lt_fieldcatalog.
" Выполняем SQL-запрос, вызывая функцию из сгенерированной программы"
perform get_data in program (prog)
using
<fs_data>.
" Выводим результат на экран"
perform show_alv
using
lt_fieldcatalog.
endform.
" Функция разбора запроса"
form parse_sql_query
using
lt_sql_query type ty_simple_tab
changing
lt_fields type ty_simple_tab
lt_tables type ty_simple_tab
l_use_cnt.
data: l_field_names_obtained(1) type c,
l_is_tabname(1) type c,
lt_parsed_sql_line type ty_simple_tab.
clear: l_field_names_obtained, l_is_tabname.
field-symbols: <fs_sql_query> type ty_simple_struc,
<fs_parsed_sql_line> type ty_simple_struc.
constants: con_tab type c value cl_abap_char_utilities=>horizontal_tab.
" Анализируем запрос построчно"
loop at lt_sql_query assigning <fs_sql_query>.
" Удаляем нечитаемые спец-символы
replace all occurrences of con_tab in <fs_sql_query>-line with space.
concatenate ` ` <fs_sql_query>-line ` ` into <fs_sql_query>-line.
" Разбиваем строку на отдельные слова"
refresh lt_parsed_sql_line.
split <fs_sql_query>-line at space into table lt_parsed_sql_line.
delete lt_parsed_sql_line where line = ''.
loop at lt_parsed_sql_line assigning <fs_parsed_sql_line>.
translate <fs_parsed_sql_line>-line to upper case.
if <fs_parsed_sql_line>-line = 'SELECT'.
continue.
endif.
" Если дошли до * - считаем, что все выбираемые поля получены"
if <fs_parsed_sql_line>-line = '*'.
l_field_names_obtained = 'X'.
continue.
endif.
" Если дошли до FROM или JOIN - считаем, что все выбираемые поля получены.
" Следующее слово будет названием таблицы"
if <fs_parsed_sql_line>-line = 'FROM' or <fs_parsed_sql_line>-line = 'JOIN'.
l_field_names_obtained = 'X'.
l_is_tabname = 'X'.
continue.
endif.
" Получаем названия полей"
if l_field_names_obtained is initial.
" Ищем конструкцию COUNT()"
find 'COUNT(' in <fs_parsed_sql_line>-line ignoring case.
if sy-subrc = 0.
l_use_cnt = 'X'.
continue.
endif.
" Название поля указано с названием таблицы через ~"
search <fs_parsed_sql_line>-line for '~'.
if sy-subrc = 0.
add 1 to sy-fdpos.
endif.
append <fs_parsed_sql_line>-line sy-fdpos to lt_fields.
endif.
" Получаем названия таблиц"
if l_is_tabname = 'X'.
append <fs_parsed_sql_line>-line to lt_tables.
clear l_is_tabname.
endif.
endloop.
endloop.
endform.
" Функция создания исходного кода ABAP-программы для последующей генерации"
form create_get_function
using
lt_sql_query type ty_simple_tab
changing
code type ty_t_code.
data: lt_parsed_sql_line type ty_simple_tab,
l_sub_order(1) type c.
clear l_sub_order.
field-symbols: <fs_sql_query> type ty_simple_struc,
<fs_parsed_sql_line> type ty_simple_struc.
append `program z_sql.` to code.
append `form get_data using fs_data type standard table.` to code.
append `try.` to code.
loop at lt_sql_query assigning <fs_sql_query>.
clear: lt_parsed_sql_line.
split <fs_sql_query>-line at space into table lt_parsed_sql_line.
delete lt_parsed_sql_line where line = ''.
loop at lt_parsed_sql_line assigning <fs_parsed_sql_line>.
concatenate ` ` <fs_parsed_sql_line>-line ` ` into <fs_parsed_sql_line>-line.
translate <fs_parsed_sql_line>-line to upper case.
" добавляем into… только 1 раз, иначе будет добавляться во все подзапросы"
if <fs_parsed_sql_line>-line = ' FROM ' and l_sub_order is initial.
append `into corresponding fields of table fs_data` to code.
l_sub_order = 'X'.
endif.
append <fs_parsed_sql_line>-line to code.
endloop.
endloop.
append `.` to code.
append `rollback work.` to code.
append `catch cx_root.` to code.
append `rollback work.` to code.
append `message ``Что-то пошло не так, проверьте запрос`` type ``i``.` to code.
append `endtry.` to code.
append `endform.` to code.
endform.
" Функция генерации структуры ALV-грида"
form get_fieldcat
using
lt_tables type ty_simple_tab
lt_fields type ty_simple_tab
p_tech_names
l_use_cnt
changing
lt_fieldcatalog type slis_t_fieldcat_alv.
data: ref_table_descr type ref to cl_abap_structdescr,
lt_tab_struct type abap_compdescr_tab,
ls_fieldcatalog type slis_fieldcat_alv.
field-symbols: <fs_tab_struct> type abap_compdescr,
<fs_tables> type ty_simple_struc,
<fs_fields> type ty_simple_struc.
loop at lt_tables assigning <fs_tables>.
refresh lt_tab_struct.
" Получаем все поля для выбираемой таблицы"
ref_table_descr ?= cl_abap_typedescr=>describe_by_name( <fs_tables>-line ).
lt_tab_struct[] = ref_table_descr->components[].
loop at lt_tab_struct assigning <fs_tab_struct>.
" если поля нет среди выбираемых в SQL-запросе - не выводим его не экран"
if lines( lt_fields ) > 0.
read table lt_fields transporting no fields with key line = <fs_tab_struct>-name.
if sy-subrc <> 0.
continue.
endif.
endif.
" если поле с таким именем уже есть, то не добавляем повторно"
read table lt_fieldcatalog transporting no fields with key fieldname = <fs_tab_struct>-name.
if sy-subrc = 0.
continue.
endif.
clear ls_fieldcatalog.
ls_fieldcatalog-fieldname = <fs_tab_struct>-name.
ls_fieldcatalog-ref_tabname = <fs_tables>-line.
append ls_fieldcatalog to lt_fieldcatalog.
endloop.
endloop.
" В запросе есть конструкция COUNT() – добавляем колонку с именем CNT и типом INT"
if l_use_cnt = 'X'.
clear ls_fieldcatalog.
ls_fieldcatalog-fieldname = 'CNT'.
ls_fieldcatalog-seltext_l = 'Кол-во'.
ls_fieldcatalog-seltext_m = 'Кол-во'.
ls_fieldcatalog-seltext_s = 'Кол-во'.
ls_fieldcatalog-datatype = 'INT4'.
if p_tech_names = 'X'.
ls_fieldcatalog-seltext_l = 'CNT'.
ls_fieldcatalog-seltext_m = 'CNT'.
ls_fieldcatalog-seltext_s = 'CNT'.
ls_fieldcatalog-reptext_ddic = 'CNT'.
endif.
append ls_fieldcatalog to lt_fieldcatalog.
endif.
endform.
" Функция создания динамической внутренней таблицы"
form create_itab_dynamically
using
lt_fieldcatalog type slis_t_fieldcat_alv.
data: dyn_table type ref to data,
dyn_line type ref to data,
lt_lvc_fieldcatalog type lvc_t_fcat,
ls_lvc_fieldcatalog type lvc_s_fcat.
field-symbols: <fs_fieldcatalog> type slis_fieldcat_alv.
" Преобразуем данные в другой тип"
loop at lt_fieldcatalog assigning <fs_fieldcatalog>.
clear ls_lvc_fieldcatalog.
move-corresponding <fs_fieldcatalog> to ls_lvc_fieldcatalog.
ls_lvc_fieldcatalog-ref_table = <fs_fieldcatalog>-ref_tabname.
append ls_lvc_fieldcatalog to lt_lvc_fieldcatalog.
endloop.
" Создаем динамически таблицу"
call method cl_alv_table_create=>create_dynamic_table
exporting
it_fieldcatalog = lt_lvc_fieldcatalog
importing
ep_table = dyn_table.
assign dyn_table->* to <fs_data>.
create data dyn_line like line of <fs_data>.
assign dyn_line->* to <fs_wa_data>.
endform.
" Функция отображения ALV-Grid на экране"
form show_alv
using
lt_fieldcatalog type slis_t_fieldcat_alv.
data: ls_event type slis_alv_event,
lt_event type slis_t_event,
ls_layout type slis_layout_alv,
l_repid like sy-repid.
ls_layout-colwidth_optimize = 'X'.
l_repid = sy-repid.
call function 'REUSE_ALV_GRID_DISPLAY'
exporting
i_callback_program = l_repid
is_layout = ls_layout
it_fieldcat = lt_fieldcatalog
i_save = 'X'
tables
t_outtab = <fs_data>
exceptions
program_error = 1
others = 2.
if sy-subrc <> 0.
leave program.
endif.
endform.
Разработанная программа позволяет выполнять Open SQL-запросы SELECT любой сложности. Только нужно соблюдать одно правило при написании запроса: если используется конструкция COUNT(), то после нее нужно дописывать «AS cnt», чтобы корректно сгенерировался ALV-Grid.
Программу, по идее, можно немного доработать и использовать не только для тестирования запросов, но и для формирования пользовательских отчетов.
В статье я не затрагивал вопросы безопасности. Входящий запрос никак не проверяется на корректность, после него можно написать любой ABAP-код и он будет выполняться. Для исключения такой возможности достаточно дописать несложные проверки.
