Hurriyet

31 Temmuz 2013 Çarşamba

Oracle E-Business Suite: Kullanıcı Oluşturma Script'i

Bu script ile aşağıda kullanılan API sayesinde bir kullanıcı oluşturulur. Bu script'in kullanılması için uygun bir zaman ise sadece veritabanına erişimimiz varken kullanıcı yaratılmasının gerekmesi olabilir. Sonrasında da bu yazımızda bulunan scriptimiz ile bu kullanıcımıza istediğimiz sorumlulukları atabiliriz.

 DECLARE  
   l_user_name       VARCHAR2(100) := 'BERKE';  
   l_user_password     VARCHAR2(100) := 'BERKE'; --Sifre  
   l_password_date     VARCHAR2(100) := SYSDATE;  
  -- l_password_lifespan_days  NUMBER   := 90;  
  -- l_email_address     VARCHAR2(100) := 'test@default.com';  
 BEGIN  
  FND_USER_PKG.CREATEUSER  
  ( x_user_name      => l_user_name,  
    x_owner        => NULL,  
    x_unencrypted_password => l_user_password,  
    x_password_date    => l_password_date,  
    x_password_lifespan_days  => l_password_lifespan_days,  
    x_email_address    => l_email_address  
  );  
  COMMIT;  
  DBMS_OUTPUT.PUT_LINE('Apps kullanıcısı ' || l_user_name || ' yaratılmıştır.');  
 EXCEPTION  
     WHEN OTHERS THEN  
       ROLLBACK;  
       DBMS_OUTPUT.PUT_LINE(SQLERRM);  
 END;  


Oracle'ın Kullanıcı Yaratırken Kullandığı API


 procedure FND_USER_PKG.CreateUser (  
  x_user_name         in varchar2,  
  x_owner           in varchar2,  
  x_unencrypted_password    in varchar2 default null,  
  x_session_number       in number default 0,  
  x_start_date         in date default sysdate,  
  x_end_date          in date default null,  
  x_last_logon_date      in date default null,  
  x_description        in varchar2 default null,  
  x_password_date       in date default null,  
  x_password_accesses_left   in number default null,  
  x_password_lifespan_accesses in number default null,  
  x_password_lifespan_days   in number default null,  
  x_employee_id        in number default null,  
  x_email_address       in varchar2 default null,  
  x_fax            in varchar2 default null,  
  x_customer_id        in number default null,  
  x_supplier_id        in number default null)  

Oracle E-Business Suite: Dosya Versiyonlarının Bulunması

Application'da dosya versiyonlarının öğrenilmesinin amacı, dosyalara patch geçilip geçilmediğini öğrenmek için ya da patch geçilip geçilmesi gerekip gerekmediğini görmek içindir.

SELECT a.app_short_name, a.subdir, a.filename, b.version
FROM APPS.AD_FILES A,
APPS.AD_FILE_VERSIONS B
WHERE
--a.FILENAME IN ('iemsa_outbound.jsp','Agent.class') AND
A.FILE_ID = B.FILE_ID
AND A.APP_SHORT_NAME = 'IEM'
AND b.file_version_id = (SELECT MAX (file_version_id)
FROM APPS.AD_FILE_VERSIONS VER
WHERE VER.FILE_ID = A.FILE_ID
)










Oracle E-Business Suite: EBS Logları ve Çıktılarının İncelenmesi

Application'a giren kimselerin yaptığı işlemlerin, çalıştırdıklarını sorgulamanın ve incelemenin bir diğer yolu aşağıdaki dizinde bulan logların incelenmesidir. Buradaki loglarda kullanıcıların yaptığı işlemlerin çıktıları, sisteme giriş ve çıkış zamanları görülebilinir. Aynı zamanda sistemde yaşanmış sorunlar da görülebilinir. Buradaki loglara göre aksiyon da alınabilinir.

Buradaki gruplardan 2 tane bulunmaktadır. 2'si de incelenebilinir.

cd $INST_TOP/logs/ora/10.1.3/opmn/oacore_default_group_1 


Bu komutla da oacorestd.out dosyasının son 100 satırındaki satırlar incelenebilinir. Son 100 veya 200 satır incelenerekten sistemde yaklaşık olarak son durum gözden geçirilebilinir. 

tail -100f oacorestd.out

                               

                                                                (Sistemde yaşanmış hatalar)


                                












Oracle E-Business Suite: Apache Başlatılması - Apache Bounce Script - Bounce Apache Server

Oracle E-Business Suite'de Apache sunucusunun bazen tekrar başlatılması gerekebilir. Apache sunucusu E-Business Suite ortamında Web Server olarak geçmektedir. Bu Web server'ın açılıp kapatılmasıyla Application'da yapılan değişiklikler güncellenebilinir veya çalıştırılabilinir. O yüzden uygulamada yapılan değişiklikler sonrasında uygulama sunucusunun tekrar başlatılması tavsiye edilir. Bunun için de $ADMIN_SCRIPTS_HOME içerisinde bulunan aşağıdaki scriptlerin sırasıyla çalıştırılması gerekir.


---------------------------------------------

R12 versiyonu

$INST_TOP/admin/scripts/adapccctl.sh stop

$INST_TOP/admin/scripts/adoacorectl.sh stop

$INST_TOP/admin/scripts/adapccctl.sh start

$INST_TOP/admin/scripts/adoacorectl.sh start

----------------------------------------------------
11i versiyonu

$COMMON_TOP/admin/scripts//adapcctl.sh stop

$COMMON_TOP/admin/scripts//adapcctl.sh start


Bu işlemlerin sonuçlarını ve loglarını nasıl takip edebiliriz?

Bu scriptler ve genelde processlerin logları aşağıdaki gibi bir klasörde bulunur. Örneğimizde =EBSGLDEV ve =kaebsoapd1  olarak belirtilmektedir.

/orappl/EBSGLDEV/inst/apps/EBSGLDEV_kaebsoapd1/logs/ora/10.1.3

Bu dizinin kısa yolu zaten $LOG_HOME olarak belirlenmiştir. Yukarıdaki adres  yerine kurulumunuzda $LOG_HOME dizinine gidebilirsiniz.

------------------------------------------------------------------------------------------------------------
BOUNCE APACHE SERVER
After deploying OAF files to application server, you need to restart Apache server to take effect of changes done.  Below are the steps to bounce apache server in R12.

Go to $COMMON_TOP/admin/scripts

1. adapcctl.sh stop                   --        Stop Oracle HTTP Server (OHS) instance
2. adoacorectl.sh stop              --        Stop OPMN managed OACORE OC4J instance

3. adapcctl.sh start                    --       Start Oracle HTTP Server (OHS) instance
4. adoacorectl.sh start               --       Start OPMN managed OACORE OC4J instance

Note:  Any changes in your java code requires restart of apache services.

Oracle E-Business Suite: Kullanıcılara Sql Script'i ile Sorumluluk Atanması

Aşağıdakş sorguda belirtilecek kullanıcıya System_Administrator,Functional Developer ve Application Developer sorumlulukları atanır. Atanması istenen diğer sorumluluklar kırmızıyla işaretlenmiş kısmın içine eklenir.


DECLARE

   CURSOR C_RESP
   IS
      SELECT fav.application_short_name,
             fav.application_name,
             frv.responsibility_key,
             frv.responsibility_name
        FROM FND_APPLICATION_VL fav, FND_RESPONSIBILITY_VL frv
       WHERE     frv.application_id = fav.application_id
             AND frv.responsibility_name IN
                    ('System Administrator',
                     'Functional Administrator',
                     'Application Developer');



   l_user_name         VARCHAR2 (15) := '&USER_NAME';
   l_appl_short_name   fnd_application_vl.application_short_name%TYPE;
   l_resp_name         FND_RESPONSIBILITY_VL.responsibility_name%TYPE;
   l_resp_key          FND_RESPONSIBILITY_VL.responsibility_key%TYPE;

   l_description       VARCHAR2 (100)
                          := 'Adding Responsibility to the user using script';
BEGIN

  FOR resp_rec IN C_RESP
  LOOP
     l_appl_short_name := resp_rec.application_short_name;
     l_resp_key := resp_rec.responsibility_key;
     l_resp_name := resp_rec.responsibility_name;

     BEGIN
        FND_USER_PKG.ADDRESP (username         => l_user_name,
                              resp_app         => l_appl_short_name,
                              resp_key         => l_resp_key,
                              security_group   => 'STANDARD',
                              description      => l_description,
                              start_date       => SYSDATE,
                              end_date         => NULL);
        COMMIT;
        DBMS_OUTPUT.put_line (
              'The responsibility '
           || l_resp_name
           || ' is added to the user '
           || l_user_name);
     EXCEPTION
        WHEN OTHERS
        THEN
           DBMS_OUTPUT.put_line (
                 'Responsibility '
              || l_resp_name
              || ' IS NOT added to the user '
              || l_user_name
              || ' due to '
              || SQLCODE
              || '; '
              || SUBSTR (SQLERRM, 1, 250));
           DBMS_OUTPUT.put_line ('');
           ROLLBACK;
     END;
  END LOOP;
END;

30 Temmuz 2013 Salı

Oracle E-Business Suite: Adadmin Tool'unun Non-Interactive Moduna Alınması

Adadmin işlemlerinin kullanıcı etkisi olmadan yapılması için bir defaultsfile gerekir. Defaultsfile olarak belirttiğimiz olay  ise programımızı başlattığımızda programımızın gereken cevapları kullanıcıdan beklemeden, direk olarak bir text dosyasından okuyup ilerlemesidir.

Bu sadece adadmin tool'u için geçerli değildir. Ayrıca opatch, adpatch gibi tool'larla da kullanılabilinir.

Yukarıda anlattığımız biçimde ilerlenebilmesi için defaultsfile yaratmamız gerekir. Var olandan ilerlenmesi tavsiye edilir. Defaultsfile örneği her application sunucusunda bulunur.  Yeri $APPL_TOP/admin// altındadır. Yaratılan bu defaultsfile bulunduktan sonra gerekli görülen parametreler değiştirilir ve uygun hale getirilir.




Resimde görülen yerlerde örneğin APPL_TOP için belirtilen yere farklı bir path verebilirsiniz. Ya da sorgular sırayla geldiği için ana menüden itibaren diğer seçeneklerde kullanılan çerçeveyi kullanarak yeni cevaplar da eklenebilinir.

Bu defaultfile kullanma ihtiyacını ise kendi açımdan APPS schemasındaki paket ve procedure'lerin otomatik olarak compile edilmesini tetiklenmesi için duydum. 

Kullandığım Sorgu:
adadmin defaultsfile=/orappl//apps/apps_st/appl/admin//adalldefaults.txt 

Oracle E-Business Suite: Schedule Tanımlanmış Request'lerin Bulunması

Oracle Applications Upgrade işlemi sırasında karşılaştığım sorunlardan biri bütün concurrent request'lerin iptal edilmesi ve sonrasında bellirli bir düzende çalışan concurrent'ların depolanması ve tekrar çalıştırılmasıydı. Bunun içinde aşağıdaki gibi bir sorguya ihtiyacım olmuştu. Bu sorguyla schedule edilmiş requestler hakkında bilgi sahibi olunabilinir.

 select r.request_id,  
 p.user_concurrent_program_name || nvl2(r.description,' ('||r.description||')',null) Conc_prog,  
 s.user_name REQUESTOR,  
 r.argument_text arguments,  
 r.requested_start_date next_run,  
 r.last_update_date LAST_RUN,  
 r.hold_flag on_hold,  
 r.increment_dates,  
 decode(c.class_type,  
 'P', 'Periodic',  
 'S', 'On Specific Days',  
 'X', 'Advanced',  
 c.class_type) schedule_type,  
 case  
 when c.class_type = 'P' then  
 'Repeat every ' ||  
 substr(c.class_info, 1, instr(c.class_info, ':') - 1) ||  
 decode(substr(c.class_info, instr(c.class_info, ':', 1, 1) + 1, 1),  
 'N', ' minutes',  
 'M', ' months',  
 'H', ' hours',  
 'D', ' days') ||  
 decode(substr(c.class_info, instr(c.class_info, ':', 1, 2) + 1, 1),  
 'S', ' from the start of the prior run',  
 'C', ' from the completion of the prior run')  
 when c.class_type = 'S' then  
 nvl2(dates.dates, 'Dates: ' || dates.dates || '. ', null) ||  
 decode(substr(c.class_info, 32, 1), '1', 'Last day of month ') ||  
 decode(sign(to_number(substr(c.class_info, 33))),  
 '1', 'Days of week: ' ||  
 decode(substr(c.class_info, 33, 1), '1', 'Su ') ||  
 decode(substr(c.class_info, 34, 1), '1', 'Mo ') ||  
 decode(substr(c.class_info, 35, 1), '1', 'Tu ') ||  
 decode(substr(c.class_info, 36, 1), '1', 'We ') ||  
 decode(substr(c.class_info, 37, 1), '1', 'Th ') ||  
 decode(substr(c.class_info, 38, 1), '1', 'Fr ') ||  
 decode(substr(c.class_info, 39, 1), '1', 'Sa '))  
 end as schedule,  
 c.date1 start_date,  
 c.date2 end_date,  
 c.class_info  
 from fnd_concurrent_requests r,  
 fnd_conc_release_classes c,  
 fnd_concurrent_programs_tl p,  
 fnd_user s,  
 (with date_schedules as (  
 select release_class_id,  
 rank() over(partition by release_class_id order by s) a, s  
 from (select c.class_info, l,  
 c.release_class_id,  
 decode(substr(c.class_info, l, 1), '1', to_char(l)) s  
 from (select level l from dual connect by level <= 31),  
 fnd_conc_release_classes c  
 where c.class_type = 'S'  
 and instr(substr(c.class_info, 1, 31), '1') > 0)  
 where s is not null)  
 SELECT release_class_id, substr(max(SYS_CONNECT_BY_PATH(s, ' ')), 2) dates  
 FROM date_schedules  
 START WITH a = 1  
 CONNECT BY nocycle PRIOR a = a - 1  
 group by release_class_id) dates  
 where r.phase_code = 'P'  
 and c.application_id = r.release_class_app_id  
 and c.release_class_id = r.release_class_id  
 and nvl(c.date2, sysdate + 1) > sysdate  
 and c.class_type is not null  
 and p.concurrent_program_id = r.concurrent_program_id  
 and p.language = 'US'  
 and dates.release_class_id(+) = r.release_class_id  
 and r.requested_by = s.user_id  
 order by conc_prog, on_hold, next_run;  

2.bir sorgumuz da yine scheduled edilmiş concurrent request'ler gösterilir.

 SELECT cr.request_id,   
 DECODE (cp.user_concurrent_program_name,   
 'Report Set', 'Report Set:' || cr.description,   
 cp.user_concurrent_program_name   
 ) NAME, argument_text, cr.resubmit_interval,   
 NVL2 (cr.resubmit_interval, 'PERIODICALLY',   
 NVL2 (cr.release_class_id, 'ON SPECIFIC DAYS', 'ONCE')   
 ) schedule_type, DECODE (NVL2 (cr.resubmit_interval,   
 'PERIODICALLY', NVL2 (cr.release_class_id, 'ON SPECIFIC DAYS', 'ONCE')   
 ), 'PERIODICALLY', 'EVERY '   
 || cr.resubmit_interval   
 || ' '   
 || cr.resubmit_interval_unit_code   
 || ' FROM '   
 || cr.resubmit_interval_type_code   
 || ' OF PREV RUN',   
 'ONCE', 'AT :'   
 || TO_CHAR (cr.requested_start_date, 'DD-MON-RR HH24:MI'),   
 'EVERY: ' || fcr.class_info   
 ) schedule, fu.user_name, requested_start_date   
 FROM apps.fnd_concurrent_programs_tl cp,   
 apps.fnd_concurrent_requests cr,   
 apps.fnd_user fu, apps.fnd_conc_release_classes fcr   
 WHERE cp.application_id = cr.program_application_id   
 AND cp.concurrent_program_id = cr.concurrent_program_id   
 AND cr.requested_by = fu.user_id   
 AND cr.phase_code = 'P'   
 AND cr.requested_start_date > SYSDATE   
 AND cp.LANGUAGE = 'US'   
 AND fcr.release_class_id(+) = cr.release_class_id   
 AND fcr.application_id(+) = cr.release_class_app_id; 






Oracle E-Business Suite: Invalid Objelerin Compile Edilmesi



Invalid Objeler ne zaman Compile Edilir?

Oracle veritabanı invalid objeleri, obje ilk çalıştırıldığında ve patch çalıştırıldığında compile eder. Bu işlem uzun bir süre alabilir. O yüzden objeler sistem kullanımı az olduğu bir zamanda compile edilmelidirler.
Invalid objeleri AD administration uygulamasıyla compile edebiliriz.  Invalid uygulamaların compile edilmesi için en uygun zamanlar:

-Apps schemasındaki paketleri alter eden bir patch uygulandığında.

-Invalid objeleri bulurken.

-Apps schema’sının altına custom bir uygulama konulduğunda  ve compile edilmesi gerektiğinde.

Bunun için ilk önce AD administration tool’unu çalıştırırız. Terminal’a “adadmin” yazılır ve enter’a basılır.



Bundan sonraki aşamada ise “Compile/Reload Database Entities” Menu’su seçilir ve “Compile Apps Schema” seçeneği girilir.






Oracle E-Business Suite: Performans için İstatistiklerin Toplanması



İstatistiklerin güncel olarak tutulması Sql’lerin verimli bir şekilde çalışması için çok önemlidir. Her kaynağın “maliyetini” inceleyerek, sistemimizi optimum performans için hazır tutabiliriz. Optimizer en uygun access path’i bulmak ve sql sorgularını çalıştırmak için güncel tablo istatistiklerini kullanırlar. Bu istatistikler “Gather Schema Statistics” concurrent programı sayesinde toplanır. 

Bu programın bir upgrade sonrasında ve devamında da günlük bazda çalıştırılması performansın düşmesini engeller. İstatistiklerin toplanması süresi, o istatistiklerin toplanmasına kadar geçen süredeki DML ifadelerine bağlıdır. Tamamen statik olan tablolar için istatistiklerin bir kere alınması yeterliyken, dinamik olan tabloların, verisi etkin bir şekilde artan veya azan tabloların istatistiklerinin birden fazla alınması gerekir. 

 Bunun için ilk önce System Administrator sorumluluğuyla bağlanmamız gerekir. Sonrasında Request>Run altına gidilir ve yeni bir istek girilir.





 Orada da “Gather Schema Statistics” seçilir ve işin gereğine göre bir program da konabilir ne zaman çalıştırılacağına dair.





23 Temmuz 2013 Salı

Linux / Unix Script Çalıştırılması ve Debug edilmesi

Shell script'imizi çalıştırmak için ilk önce script'imize gerekli hakları vermemiz gerekir. Kullanıcılara yetki verilmesini sağlayan komutumuz için chmod yazımıza bakabilirsiniz.
 chmod 777 script.sh  

Chmod ile hak verdikten sonra script'imizi çalıştırmak için:

./script.sh, bash script.sh, sh script.sh ya da script.sh komutları kullanılabilinir.

Scriptimizi çalıştırmak için en azından okuma ve çalıştırma hakları vermemiz gerekir.

Script Debug'ı

Script debug'ı yapmak için öncelikle sorgumuz aşağıdaki şekilde çalıştırmalıyız.

 bash -x script.sh  

ya da

bash -xv script.sh 
Yukarıdaki "v" argümanı satırların okunduğu gibi konsola yazılmasını sağlar.

Script direk debug modunda çalıştırmak istersek de aşağıdaki gibi #!/bin/bash -x şeklide komutumuza ekleme yaparız.

 #!/bin/bash -x   
 echo "Merhaba Dünya"  
 echo "Bugün $date"  

Set Komutlarının Kullanımı
Bash Shell de debug için yukarıda belirttiğimiz gibi opsiyonlar bulunmaktadır.
   set -x : Komutların çalıştırıldığında gösterilmesi 
   set -v : Komutların okunduğu sırada gösterilmesi
   set -n : Komutların okunması ama çalıştırılmaması. Bu mod syntax hatalarını görmek için yararlı olabilir. 

Örnek script:
---------------------------------------------
 #!/bin/bash  
 ### Debug mode açılır.###  
 set -x  
   
 echo "Hello"  
 echo "Bugün $(date)"  
   
  ### Debug mode kapatılır. ###  
 set +x  
---------------------------------------------



Oracle E-Business Suite: Concurrent Program'larda Log'lara Bildirim Yazılması

Concurrent Programlar da PL\SQL procedure'ın içine yazdığımız kodda loglara yazı yazılmasını istiyorsak fnd_file.put_line komutunu kullanmamız gerekir. Bu şekilde kodumuzu daha kolay debug edebilir, gelişmeleri izleyebiliriz.



 Create or Replace PROCEDURE deneme_berke2 (errbuf   OUT VARCHAR2,retcode   OUT VARCHAR2) is  
     
  BEGIN  
   
 INSERT INTO xxis_fa.xx_hello_world_tab VALUES (SYSDATE);  
   
  fnd_file.put_line (fnd_file.output,'Yedeklenen kayıt sayısı: ' || sysdate);  
   
 END;  
 /  

Kodumuzu yukardaki gibi yazdıktan sonra sonuçlarını hem ekrandan görebiliriz, hem de raporlama amaçlı olarak bu yazımızda belirttiğimiz gibi sunucudan bakıp bulabiliriz. Raporumuzun output dosyası o.out şeklinde çıkmaktadır. Bu örneğim için benim sunucumdaki dosyamın adı o21445775.out olmuştur.

22 Temmuz 2013 Pazartesi

Oracle E-Business Suite: Concurrent Program'lar için Log File ve Output File Bulunması

Oracle Applications'da bir concurrent programın neden bozulduğunu veya durduğunu görmek için bu log ve output dosyalarının bulunduğu klasöre gitmemiz lazım.

Bunun için uygulamanın kurulu olduğu sunucu tarafında Applmgr kullancısıyla bağlanıp aşağıda belirtilen dizine gidilir:


 cd $APPLCSF 

Log klasörünün altında -- Log dosyaları
Out klasörünün altında -- Out dosyaları bulunur eğer herhangi bir out dosyasına yazılmış bir bilgi varsa


Örnek:


cd $APPLCSF   
   
 echo $APPLCSF  

host/inst/apps/host_machine_name/logs/appl/conc

 cd $APPLCSF  
   
 cd $APPLCSF   
   
 echo $APPLCSF  
   
 ls -lrt  
   
 drwxr-xr-x  2 applmgr dba       256 Apr 07 20:14 outbound  
 drwxr-xr-x  2 applmgr dba       256 Apr 07 20:14 inbound  
 drwxr-xr-x  2 applmgr dba     1273856 Jul 23 09:35 log  
 drwxr-xr-x  2 applmgr dba     1302528 Jul 23 09:35 out 

Eğer Concurrent Request'in ID'si biliniyorsa direk aşağıdaki sorguda request id  verilerek direk o concurrent'ın bulunduğu request bulunabilinir.

 SELECT fcpp.concurrent_request_id req_id, fcp.node_name, fcp.logfile_name  
  FROM fnd_conc_pp_actions fcpp, fnd_concurrent_processes fcp  
  WHERE fcpp.processor_id = fcp.concurrent_process_id  
   AND fcpp.action_type = &Request_no  







Linux / Unix Komutu: Chmod - Kullanıcılara Yetki Verilmesi

Chmod komutu (change mode) anlamına gelmektedir. Dosya ve klasörlerin yetki derecelerini ve kimlerin erişebileceğini belirleyebilir. Her shell scriptinin çalıştırılma yetkisine ihtiyacı vardır.

Herkese her yetkinin verilmesine örnek olarak aşağıdaki gibi bir komut çalıştırabiliriz.

chmod 777 script.sh  

Buradaki her 7 nin anlamı r=read, w=write ve e=execute'dur. Yani dosyalara yazma,okuma ve çalıştırma yetkileri verilir. Hexadecimal olarak kodlanmıştır. rwe olarak yani 0111 olarak belirtilir. Buradan da 1*(2^2) +1*(2^1) +1*(2^0) olarak hesaplanır.

3 tane 7 olmasının sebebi ise her 7 farklı gruplara yönelik olmasıdır. İlk 7'li root kullanıcısının hakları, ikinci 7'li kullanıcının bulunduğu grubun hakları, üçüncü 7'li ise kullanıcının haklarıdır. Eğer kullanıcı dosyayı kendi yarattıysa dosyası üzerinde hak verme yetkisi vardır.


Dosyaların yetki durumlarını görmek için klasörün veya dosyaların içinde bulunduğu klasöre gidilir ve listeleme komutu çalıştırılır.

ls -l  


Linux / Unix Komutu : ln - Symbolic (Soft) ve Hard Link Oluşturulması

Symbolic link'ler bir dosyadan bir dosya bir kısaltma ifade ederler. Shortcut gibi düşünülebilinirler.

Symbolic (Soft) link'ler dosyanın veya klasörün şu anda bulunduğu dizinin yerine bağlantı yaparlar.

Hard link'ler ise dosya veya klasörün şu anda bulunduğu fiziksel lokasyonuna bağlantı yaparlar.

Symbolic Link Oluşturulması:


ln -s /home/users/applmgr/berke_deneme_calisma/dosya1 /home/users/applmgr/dosya2

Buradaki komutu çalıştırdığımız zaman dosya2 adlı bir link oluşturmuş oluruz. Bu link sayesinde dosya2 den dosya1'e direk olarak erişebiliriz. Bu durumda more komutuyla aşağıdaki gibi dosya2'yi çalıştırırsak dosya1'i okuyabiliriz ve kısayol oluşturmuş oluruz.

more dosya2 

Hard Link Oluşturulması:

Hard link'ler ise -s argumanı olmadan çalıştırılırlar. Aşağıdaki gibi bir örnek komutla çalıştırılabilinir.

 ln /root/dosya1 /root/dosya2

Hard Link vs Soft Link - Farkları: 

Hard link'ler klasörler için yaratılamazlar.

Soft linkler klasörler için yaratılabilinirler.


Soft link'lerin yeri değiştiği zaman kullanılamaz hale gelirken Hard link'ler dosyanın fiziksel konumuna bağlantı yaptığı için bağlantı yapılan dosyaların yeri değişse bile bağlantı kopmaz.

17 Temmuz 2013 Çarşamba

Oracle E-Business Suite: Sysadmin Kullanıcısının Şifresinin Sıfırlanması

EBS'te bazen sysadmin şifresinin sıfırlanması gerekebilir. Bu durumla şahsen birkaç kez karşılaştım. EBS sistemlerinde bazen karşılaştığımız bir bug yüzünden sysadmin dahil bütün şifrelerimiz kilitleniyor ve açılmıyordu. Bunun neden gerçekleştiğini öğrenemedim ancak geçici çözüm olarak EBS'in tekrardan açılıp kapatılması gerekmişti. Bununla birlikte çözüm yollarından biri de sysadmin şifresini bu şekilde elle sıfırlamaktır. Bu şekilde kilitlenen kullanıcının şifresini  0'layabiliriz. Buradaki kullanıcı sadece sysadmin olmak zorunda değil. Diğer herhangi bir kullanıcı da olabilir.

 DECLARE  
    l_ret_val BOOLEAN;  
    l_user_name  varchar2(50) := '&USER_NAME';  
    l_new_pwd   varchar2(20) := '&PASSWORD';  
 BEGIN  
    l_ret_val :=  
       fnd_user_pkg.changepassword(username=> l_user_name  
                    ,newpassword => l_new_pwd);  
    IF l_ret_val  
    THEN  
       DBMS_OUTPUT.PUT_LINE('Yeni şifreniz : '|| l_new_pwd);  
       COMMIT;  
    ELSE  
       DBMS_OUTPUT.PUT_LINE('Şifre yenileme işlemi başarısız oldu.');  
    END IF;  
 END;   

Yine başka bir metod olarak da aşağıdaki sorgu da kullanılabilinir. Aşağıdaki sorgunundan yukarıdaki sorgu gibi "APPS" kullanıcısıyla çalıştırılması gerekir yoksa apps kullanıcısıyla çalıştırılacak bazı tabloların bulunamadığı uyarısıyla karşılaşılabilinir.

update FND_USER  
   
 set  
   
 ENCRYPTED_FOUNDATION_PASSWORD='2DF3E509EB6A33F9607959C0976E25D997166FAB694ACDDAE466414791A44411',  
   
 ENCRYPTED_USER_PASSWORD='D2FCA9810D86BCA9BE944D3E2E7A4A9E6CDF89AAD633179B701774083F907C13'  
   
 where user_name='SYSADMIN';  
   
 commit  
   
 select fnd_web_sec.validate_login('sysadmin','welcome') from dual ; 

16 Temmuz 2013 Salı

Oracle E-Business Suite: Patch Tabloları ve Scriptler ve Raporlar

Belirli Patch tabloları aşağıdakiler gibidir.

AD_APPLIED_PATCHES
AD_PATCH_DRIVERS
AD_BUGS
AD_INSTALL_PROCESSES
AD_SESSIONS
AD_APPL_TOPS


Aşağıda yazdığımız sorguyla uyguladığımız patch'lerin uygulanıp uygulanmadığını görebiliriz.

select D.PATCH_NAME, B.APPLICATIONS_SYSTEM_NAME,
B.NAME, C.DRIVER_FILE_NAME, A.PATCH_DRIVER_ID, A.PATCH_RUN_ID,
 A.SESSION_ID, A.PATCH_TOP, A.START_DATE, A.END_DATE, A.SUCCESS_FLAG,
 A.FAILURE_COMMENTS from APPS.AD_PATCH_RUNS A, APPS.AD_APPL_TOPS B, APPS.AD_PATCH_DRIVERS C,
 APPS.AD_APPLIED_PATCHES D where A.APPL_TOP_ID = B.APPL_TOP_ID
 AND A.PATCH_DRIVER_ID = C.PATCH_DRIVER_ID and
 C.APPLIED_PATCH_ID = D.APPLIED_PATCH_ID and
 A.PATCH_DRIVER_ID in (select PATCH_DRIVER_ID
 from APPS.AD_PATCH_DRIVERS where APPLIED_PATCH_ID
 in (select APPLIED_PATCH_ID from APPS.AD_APPLIED_PATCHES
 --where PATCH_NAME = ''
 )) ORDER BY 9 desc;


Bu sorguyla herhangi bir patch'in uygulandığında hangi driverları içerdiğini görebiliriz.

select A.APPLIED_PATCH_ID, A.PATCH_NAME, A.PATCH_TYPE,
 B.PATCH_DRIVER_ID,
B.DRIVER_FILE_NAME, B.ORIG_PATCH_NAME, B.CREATION_DATE, B.PLATFORM, B.SOURCE_CODE,
 B.FILE_SIZE, B.MERGED_DRIVER_FLAG, B.MERGE_DATE
  from APPS.AD_APPLIED_PATCHES A, APPS.AD_PATCH_DRIVERS B
  where A.APPLIED_PATCH_ID = B.APPLIED_PATCH_ID ;
--and A.PATCH_NAME = '';

Uygulama versiyonunu öğrenmek için de aşağıdaki sorguyu kullanabiliriz.

select ARU_RELEASE_NAME||'.'||MINOR_VERSION||'.'||TAPE_VERSION version,
START_DATE_ACTIVE updated,ROW_SOURCE_COMMENTS "how it is done",
 BASE_RELEASE_FLAG "Base version"
  FROM apps.AD_RELEASES where END_DATE_ACTIVE IS NULL;

Mümkün olan bütün uygulama versiyonlarını görmek için:

 select ARU_RELEASE_NAME||'.'||MINOR_VERSION||'.'||TAPE_VERSION version,
 START_DATE_ACTIVE  updated, END_DATE_ACTIVE "when lasted",
 CASE WHEN BASE_RELEASE_FLAG = 'Y' Then 'BASE VERSION'
 ELSE 'Upgrade' END "BASE/UPGRADE", ROW_SOURCE_COMMENTS "how it is done"
 from APPS.AD_RELEASES;

Herhangi bir patch ile  dosyası değişmiş application var mı yok mu onu aşağıdaki sorguyla bulabiliriz.

select A.FILE_ID, A.APP_SHORT_NAME,
 A.SUBDIR, A.FILENAME, max(B.VERSION)
 from APPS.AD_FILES A, APPS.AD_FILE_VERSIONS B
 where A.FILE_ID = B.FILE_ID and B.FILE_ID = 86291
 group by A.FILE_ID, A.APP_SHORT_NAME, A.SUBDIR, A.FILENAME;

Patch sırasında yapılan işlemler:

   Select J.PATCh_NAME, H.APPLICATIONS_SYSTEM_NAME Instance_Name, H.NAME,
 I.DRIVER_FILE_NAME, D.APP_SHORT_NAME appl_top, D.SUBDIR, D.FILENAME,
 max(F.VERSION) latest, E.ACTION_CODE action from AD_BUGS A,
 AD_PATCH_RUN_BUGS B, AD_PATCH_RUN_BUG_ACTIONS C, AD_FILES D,
  AD_PATCH_COMMON_ACTIONS E, AD_FILE_VERSIONS F, AD_PATCH_RUNS G,
  AD_APPL_TOPS H, AD_PATCH_DRIVERS I, AD_APPLIED_PATCHES J
  where A.BUG_ID = B.BUG_ID and B.PATCH_RUN_BUG_ID =
  C.PATCH_RUN_BUG_ID and C.FILE_ID = D.FILE_ID and E.COMMON_ACTION_ID =
   C.COMMON_ACTION_ID and D.FILE_ID = F.FILE_ID and
    G.APPL_TOP_ID = H.APPL_TOP_ID and G.PATCH_DRIVER_ID = I.PATCH_DRIVER_ID
     and I.APPLIED_PATCH_ID = J.APPLIED_PATCH_ID and
     B.PATCH_RUN_ID = G.PATCH_RUN_ID and C.EXECUTED_FLAG = 'Y'
     and G.PATCH_DRIVER_ID in (select PATCH_DRIVER_ID from
      AD_PATCH_DRIVERS where APPLIED_PATCH_ID in
      (select APPLIED_PATCH_ID from AD_APPLIED_PATCHES
      --where PATCH_NAME = ''
      )
      ) GROUP BY J.PATCH_NAME,
       H.APPLICATIONS_SYSTEM_NAME, H.NAME, I.DRIVER_FILE_NAME,
        D.APP_SHORT_NAME, D.SUBDIR, D.FILENAME, E.ACTION_CODE;

ve

select A.BUG_NUMBER "Patch Number",
B. PATCh_RUN_BUG_ID "Run Id",
D.APP_SHORT_NAME appl_top, D.SUBDIR, D.FILENAME,
max(F.VERSION) latest, E.ACTION_CODE action from
AD_BUGS A, AD_PATCH_RUN_BUGS B, AD_PATCH_RUN_BUG_ACTIONS C,
 AD_FILES D, AD_PATCH_COMMON_ACTIONS E, AD_FILE_VERSIONS F
 where A.BUG_ID = B.BUG_ID and B.PATCH_RUN_BUG_ID = C.PATCH_RUN_BUG_ID
 and C.FILE_ID = D.FILE_ID and E.COMMON_ACTION_ID = C.COMMON_ACTION_ID
 and D.FILE_ID = F.FILE_ID
 --and A.BUG_NUMBER = '
 --and B.PATCH_RUN_BUG_ID = ' < > '
 and C.EXECUTED_FLAG = 'Y' GROUP BY A.BUG_NUMBER,
  B.PATCH_RUN_BUG_ID, D. APP_SHORT_NAME, D.SUBDIR, D.FILENAME, E.ACTION_CODE;



Ürün versiyonları ve Patch seviyeleri:

  Select product_version,patch_level from FND_PRODUCT_INSTALLATIONS where patch_level like '%&shortname%';


Burada AD - GL gibi kısaltmaları kullanırsak ürün özelliklerini görebiliriz.

Bazı Bugları düzeltmek için hangi driverların kaç kere yüklenildiğini görmek için:

select * from AD_PATCH_RUN_BUGS where BUG_ID in (select BUG_ID from AD_BUGS );


Uygulamalar için yüklenmiş en son seviye Patch'i görmemiz için aşağıdaki sorgu önemlidir.

select APP_SHORT_NAME, max(PATCH_LEVEL) from AD_PATCH_DRIVER_MINIPKS GROUP BY APP_SHORT_NAME;

Bir patch için application'in kapanması gerekip gerekmediğinin bulunması:
1. Patch indirilir.
2. İçindeki /etc/config/inventory klasörü kontrol edilir.
3. Eğer içinde aşağıdaki ifade varsa kapatılması gerekir.
(instance_shutdown) true (/instance_shutdown)

Aynısı database patch'i içinde gerekir.

Patch Kontrol Raporu:


SELECT report_headings.report_date,  
     report_headings.sid_name,  
     :DAYS report_days,  
     to_char(sysdate - :DAYS, 'DD-Mon-YY (Dy)')||' and '||  
       to_char(sysdate, 'DD-Mon-YY (Dy)')report_period,  
     substr(app.patch_name,1, 50) patch_name,  
     app.patch_type,  
     apr.patch_run_id,  
     decode(apr.success_flag, 'Y', 'SUCCESS', 'FAILED') patch_result,  
     apr.failure_comments,  
     '('||decode( apr.server_type_admin_flag, 'Y', 'A', '-')||':'||  
         decode(apr.server_type_forms_flag, 'Y', 'F', '-')||':'||  
         decode(apr.server_type_node_flag,  'Y', 'N', '-')||':'||  
         decode(apr.server_type_web_flag,  'Y', 'W', '-')||')' patch_server_type,  
     to_char(apr.start_date, 'DD-Mon-YY HH24:MI') patch_start_date,  
     to_char(apr.end_date, 'DD-Mon-YY HH24:MI') patch_end_date,  
     round(((apr.end_date - apr.start_date) *24 * 60),0) load_time_minutes  
  FROM ad_patch_runs apr,  
    ad_applied_patches app,  
    ad_patch_drivers apd,  
    ad_appl_tops aat,  
    ( SELECT to_char(sysdate, 'DD-Mon-YY HH24:MI') report_date,  
         vd.name sid_name  
      FROM gv$database vd  
     WHERE vd.inst_id = 1 ) report_headings   
  WHERE apr.patch_driver_id = apd.patch_driver_id  
   and apd.applied_patch_id = app.applied_patch_id  
   and apr.appl_top_id = aat.appl_top_id  
   and apr.end_date is not null  
   and apr.end_date > trunc(sysdate - :DAYS )  
    
  ORDER by apr.patch_run_id desc  

Referans:

1-http://www.piper-rx.com/pages/reports_free/fdba001_10.trd

Oracle E-Business Suite: Oracle Web Server Nedir?



                Oracle Web Server veya OHS olarak belirttiğimiz program Oracle Http Server kurulu bir Apache Webserver’dır. Apache webserver’ın içine eklene çeşitli bileşenlerle bu uygulama Oracle Http Server olarak sunulmuştur.

                Oracle Web Server veya OHS bütün uygulamaların giriş noktasıdır. Client’lardan gelen bütün istekleri kontrol eder. İnternetten gelen bütün bu istekleri dinleyen bir listener bulunur. Eğer istekler basit Html istekleriyse Apache Html sayfaları dönerken, istekler daha fazla işleme ihtiyaç duyarlarsa Apache gelen istekleri uygun modlara(mod_pls,mod_jserv gibi)  yönlendirir.

Apache Web Server Nasıl Açılır\Kapatılır? – Start\Stop İşlemleri

                Oracle Application R11’da bulunan bütün startup\shutdown scriptleri “$OAD_TOP/admin/script/$CONTEXT_NAME” klasöründe bulunur. Burada OAD_TOP olarak belirttiğimiz yer ise COMMON_TOP olarak belirtilir ve CONTEXT_NAME ise SID_Hostname olarak tanımlanır.

                R12’deki Oracle Application startup\shutdown scriptleri ise “ADMIN_SCRIPTS_HOME” adlı klasör de bulunur. Bu konumu bulmak için ise “env| grep ADMIN_SCRIPTS_HOME” sorgusu kullanılabilinir.

                Web Server’ı başlatacak script “adapcctl.sh” içindeki ad (application dba) , apc (apache), ctl (control) ve sh (shell) anlamında kullanılmaktadır.


        Web Server’in açık olup olmadığının kontrolü:

                Browser’dan http://hostname.domainname:port adresine giderek Web Server’ın çalışıp çalışmadığı kontrol edilir. Bunun dışında Apache Web Service ile ilgili çeşitli parametrelerin bulunduğu “$IAS_ORACLE_HOME/Apache /Apache /conf /httpd.conf” adresine gidilerek çeşitli incelemeler yapılabilinir veya hata logları “$IAS_ORACLE_HOME /Apache /Apache/ logs” konumunda kontrol edilir. 

Oracle Apps Web Server Sorun Giderilmesi


                Oracle Application dba’i olarak Web Server’da oluşabilecek sorunların nasıl çözüleceğinin bilinmesi gerekir. Bunun için de önce log dosyasına bakılması gerekir. Bütün Oracle bileşenleri kendi ilişkili klasörlerinde log dosyaları bulundururlar. Apache Web sunucusuyla ilgili bütün temel sorunlar  $PWD parametresi altında bulunurlar.  

Oracle E-Business Suite: Concurrent Manager Nedir? - What Is A Concurrent Manager?

Concurrent Manager isminden de anlaşılacağı gibi concurrent request’leri yöneten programdır. Buradan tek istek veya batch işleri ya da bir seri istek girilebilinir.

Concurrent Processing:Kullanıcı arayüzde işlerini sürdürürken arkaplanda da çalışan işlerin tamamlanmasıdır.

Concurrent Request: Kullanıcı program çalıştırmak istediğinde, bu isteğe concurrent request denir.

Concurrent Manager: Concurrent manager concurrent request'leri çalıştıran programdır.

Concurrent Manager’lar Nasıl Açılır\Kapatılır? – Start\Stop İşlemleri

Concurrent Manager’ları açıp kapamak için kullanılan script Web Server açıp kapamak için kullanılan klasörün altında adcmctl.sh script’idir. Bu script’in açılımı ad(application dba), cm (Concurrent Manager) ve ctl (control) anlamına gelmektedir. Bu script çalıştırıldığında adcmctl.txt adlı dosya da bu komutun çalıştırılma kayıtları tutulur. Bu loglar da  $COMMON_TOP/admin/log/$CONTEXT_NAME aşağıdaki örnek mekana yerleştirilir. 

Açmak için:
adcmctl.sh start apps/******

Kapamak için:
adcmctl.sh stop apps/******

Kaç Tip Concurrent Manager Bulunmaktadır?

3 tip concurrent manager bulunmaktadır. 

1-ICM - Internal Concurrent Manager: ICM ile diğer concurrent manager'ların açılıp kapanması sağlanır.
2-SM - Standard Manager: SM eğer bir concurrent request için concurrent manager tanımlanmadıysa concurrent request'i alıp çalıştırır.
3-CRM - Conflict Resolution Manager Concurrent Manager'larda yaşanabilecek herhangi bir sorunun çözülmesinde rol alırlar.

ICM Nedir?

Internal Concurrent Manager diğer concurrent manager'ların açılıp kapanmasını sağlar. ICM kapansa da diğerleri çalışmaya devam eder; ancak en başta açılmazlarsa o zaman sorun oluşur.

ICM Log'u Nerededir?

$APPLCSF/$APPLLOG klasörü altındadır. Log dosyasının adı _MMDD.mgr şeklindedir. veritabanının adını gösterir. 

ICM log = .mgr
Concurrent Manager Log = w.mgr
Request Log = l.req
Request Output = o.out
Concurrent Manager'ların Açık Olduklarını Nereden Görebilirim?

"ps -ef | grep -v grep | grep FNDLIBR" komutuyla açık olan concurrent manager process'lerini görebiliriz. Eğer concurrent manager'lar çalışmıyorsa hiçbir process görülmez.

Concurrent Manager’da Sorun Giderilmesi

Eğer Oracle Apps Dba olarak bir Concurrent Manager başlatıldıysa  ve bir sorunla karşılaşılmışsa yine ilk bakılacak yer Concurrent Manager log dosyasıdır. Bu log dosyası  $APPLCSF/$APPLLOG dizininde bulunur.

Concurrent Request Akışı:

1-FND_CONCURRENT_REQUESTS tablosu request ile birlikte güncellenir.

2-Request'in incompatibility değerlerinin olup olmadığı kontrol edilir.

3-CRM eğer incompatibility varsa concurrent'ın ne zaman çalıştırılıp çalıştırılmayacağını kontrol ediyor.

4-Incompatibility yoksa bunun için tanımlanmış özel bir concurrent manager var mı diye kontrol edilir. Yoksa Standard Manager çalıştırılır.

5-İş bitince de fnd_concurrent_request tablosu güncellenir.

Concurrent Manager Nasıl Yaratılır?


Concurrent Manager yaratmak için System Administrator>Concurrent>Manager>Define yolunu inceleriz.

Manager kısmına manager adını yazarız.

Type: Concurrent manager tanımlıyorsak  concurrent manager seçeneğini yoksa ne tanımlayacaksak onu seçeriz.

Cache Size: Cache size ile queue'dan bir kere de kaç tane concurrent request alabileceğimizi belirleriz. Başka concurrent almadan önce bunların bitmesi beklenir. Workshift process'i 2  cache size'ı 4 ise 4 request okunur ama sadece 2'si aynı anda çalıştırılır. Best practise olarak cache size'ın workshift process'inin en az 2 katı olması beklenir.

Consumer Group: Consumer group ile belirlenen kullanıcılar çok kaynak tüketen ya da az kaynak tüketen gruplara atanarak sonrasında concurrent manager ile eşlenebilirler. Özetle eğer bir grup çok kaynak tüketiyorsa onlara özel bol kaynaklı belirli saatlerde çalışan concurrent manager tanımlanabilir.
Specialization Rules: Hangi tip concurrent request'lerin çalışacağı specialization rules ile belirlenir.

Concurrent Manager Performans Ayarları:

Manager'ın performans ile ilgili 3 tane ayarını inceleyebiliriz. Process sayısı,sleep süresi, cache size ayarı. Concurrent manager'ı performans için tune ederken bilmemiz gereken şey var olan belirlenmiş SQL'leri ya da çalışan process'ler ile oynamadığımızdır. Amacımız concurrent request'lerin bir an önce çalışmaya başlamasıdır. Bu yüzden concurrent'ların bekleme zamanını azaltmaya çalışırız.

Concurrent request'imiz çalışmaya başlamadan önce ilk önce incompatibility'lerle ilgili bir çakışma durumu var mı diye bekletilir. Bunu bu işe bakan CRM(Conflict Resolution Manager) yapar. Ertesinde tanımlı olan özel concurrent manager'a bakar. Sonuç olarak kendisine atanan concurrent manager tarafından çalıştırılmayı bekler.

-Process Sayısı: İşletim sistemi tarafından bir workshift içerisinde aynı anda çalıştırılacak process sayısı. Her process bir concurrent request çalıştırabilir.

-Sleep Süresi: Bu zaman aralığında belirtilen durum ICM'in çalışacak request'lere bakma aralığıdır. Eğer bu süre daha az olursa daha fazla request'ler incelenir ve request'lerin bekleme süresi azalır.

-Cache Size Ayarı: Cache size ile queue'dan ne kadar request alınacağı belirtilir. Yüksek olması önemlidir. Tavsiye edilen değer var olan process sayısının 2 katıdır. Bu değerin ayarlanmasının nedeni concurrent manager'ın sürekli fnd_concurrent_requests tablosuna bakmasıdır. Bu miktar ne kadar az olursa concurrent request'lerın çalışmaya başlaması daha erken gerçekleşir.

Concurrent Manager İçin Önemli Scriptler:

Concurrent manager ile ilgili scriptler $FND_TOP/sql altındadır.

1. afimchk.sql = ICM ve PMON'un statusunu gösterir.
2. afcmstat.sql = Manager ile ilgili aktif process'leri gösterir.
3. afrqscm.sql = Manager'ların log dosyaları listelenir.
4. afimlock.sql = ICM'ın beklediği lock'lar gösterilir.

Concurrent Manager Status Codes

Çeşitli önemli Concurrent tabloları:

FND_CONCURRENT_QUEUES 
FND_CONCURRENT_PROGRAMS 
FND_CONCURRENT_REQUESTS 
FND_CONCURRENT_PROCESSES 
FND_CONCURRENT_QUEUE_SIZE



Ayrıca FND ile ilgili aşağıdaki tablolarda kullanılabilinirler.

FND_APPL_TOPS 
FND_LOGINS 
FND_USER 
FND_DM_NODES 
FND_TNS_ALIASES 
FND_NODES 
FND_RESPONSIBILITY 
FND_DATABASES 
FND_UNSUCCESSFUL_LOGINS 
FND_LANGUAGES 
FND_APPLICATION 
FND_PROFILE_OPTION_VALUES



Referans:

Concurrent Processing (CP) / APPS Reporting Scripts [213021.1]

How to Create a Custom Concurrent Manager [170524.1]



Oracle E-Business Suite: Request Group İçeriğinin Görülmesi

Bir Concurrent program yapılırken, bu Concurrent programın eklenmesi gereken bir request group yaratılması gerekir. Bu Request Group sonrasında bir sorumluluğa aktarılarak aktive edilir. Bunları daha önceden Concurrent program yapımında da anlatmıştık. Bu yazımızda ekleyeceğimiz sorgumuzda ise Request Group'ların içinde yer alan Concurrent'ların görünmesini sağlayacağız. Bu şekilde hangi Request Group içinde hangi Concurrent var görebiliriz. Buradan da aynı zamanda aradığımız bir Concurrent'ın hangi Request Group içinde olduğunu bulan bir sorgu daha yazabiliriz. Bu sorgumuzda Application'ı direk "Application Object Library" verdim.
 
   SELECT   frg.request_group_name, fat1.application_name, frg.description,
         DECODE (frgu.request_unit_type,
                 'P', 'Program',
                 'S', 'Set',
                 'A', 'Application',
                 frgu.request_unit_type
                ) TYPE,
         DECODE (frgu.request_unit_type,
                 'P', fcpt.user_concurrent_program_name,
                 'S', frst.user_request_set_name,
                 'A', fat3.application_name,
                 frgu.request_unit_type
                ) NAME,
         fat2.application_name
    FROM fnd_request_groups frg,
         fnd_request_group_units frgu,
         fnd_concurrent_programs_tl fcpt,
         fnd_application_tl fat1,
         fnd_application_tl fat2,
         fnd_application_tl fat3,
         fnd_request_sets_tl frst
   WHERE frg.request_group_id = frgu.request_group_id
     AND frgu.request_unit_id = fcpt.concurrent_program_id(+)
     AND fcpt.LANGUAGE(+) = USERENV ('LANG')
     AND frg.application_id = fat1.application_id
     AND fat1.LANGUAGE(+) = USERENV ('LANG')
     AND frgu.unit_application_id = fat2.application_id
     AND fat2.LANGUAGE(+) = USERENV ('LANG')
     AND frgu.unit_application_id = fcpt.application_id(+)
     AND frgu.request_unit_id = frst.request_set_id(+)
     AND frst.LANGUAGE(+) = USERENV ('LANG')
     AND frgu.request_unit_id = fat3.application_id(+)
     AND fat3.LANGUAGE(+) = USERENV ('LANG')
     AND frgu.unit_application_id = frst.application_id(+)
     AND upper(fat1.application_name) = upper(:application_name)
ORDER BY request_group_name, frgu.request_unit_type, frgu.request_unit_id;


Bu sorguda ise Application ismi ve Concurrent Program ismi sorguyu giren tarafından verilir. Böylece kişi istediği programın hangi Request Group'ta olduğunu bulur. Ona göre de Request Group'un bulunduğu sorumluluk da bulunur.


   SELECT   frg.request_group_name, fat1.application_name, frg.description,
         DECODE (frgu.request_unit_type,
                 'P', 'Program',
                 'S', 'Set',
                 'A', 'Application',
                 frgu.request_unit_type
                ) TYPE,
         DECODE (frgu.request_unit_type,
                 'P', fcpt.user_concurrent_program_name,
                 'S', frst.user_request_set_name,
                 'A', fat3.application_name,
                 frgu.request_unit_type
                ) NAME,
         fat2.application_name
    FROM fnd_request_groups frg,
         fnd_request_group_units frgu,
         fnd_concurrent_programs_tl fcpt,
         fnd_application_tl fat1,
         fnd_application_tl fat2,
         fnd_application_tl fat3,
         fnd_request_sets_tl frst
   WHERE frg.request_group_id = frgu.request_group_id
     AND frgu.request_unit_id = fcpt.concurrent_program_id(+)
     AND fcpt.LANGUAGE(+) = USERENV ('LANG')
     AND frg.application_id = fat1.application_id
     AND fat1.LANGUAGE(+) = USERENV ('LANG')
     AND frgu.unit_application_id = fat2.application_id
     AND fat2.LANGUAGE(+) = USERENV ('LANG')
     AND frgu.unit_application_id = fcpt.application_id(+)
     AND frgu.request_unit_id = frst.request_set_id(+)
     AND frst.LANGUAGE(+) = USERENV ('LANG')
     AND frgu.request_unit_id = fat3.application_id(+)
     AND fat3.LANGUAGE(+) = USERENV ('LANG')
     AND frgu.unit_application_id = frst.application_id(+)
     AND upper(fat1.application_name) ='APPLICATION OBJECT LIBRARY'
    -- AND upper(fat1.application_name) =upper(:application_name)
     and  fcpt.user_concurrent_program_name=:Concurrent_Program_Adi
ORDER BY request_group_name, frgu.request_unit_type, frgu.request_unit_id;

Oracle E-Business Suite: Procedure Concurrent Programı'nın Yaratılması

Oracle E-Business Suite'de daha önce bir Merhaba Dünya uygulaması yaratmıştık. O uygulamada yarattığımız bir sql scriptini bir Concurrent programa bağlamıştık. Bu sefer de bir benzeri uygulama olarak da bir procedure'ı bir Concurrent programa bağlayacağız. Bunun için ilk olarak bir Concurrent program executable'ı tanımlayacağız.

Concurrent>Program>Executable menüsü altına gelip oradan ilk olarak Concurrent program olarak bir pl/sql  tanımlarız.


Execution File Name olarak PL/SQL procedure'larını seçeriz. Kaydedip formdan çıktıktan sonra Concurrent >Program>Define'a geçeriz ve orada bir program tanımlarız. Executable'a yukarıda girdiğimiz Executable adını gireriz. Gerekli şekilde doldurduktan sonra da yarattığımız bu programı Concurrent Request Group'a atarız.



Concurrent Request Group'a eklemek için Security>Responsibility>Request menüsüne gider ve orada programımızı belirli bir sorumluluk altına atarız. Bir sorumluluğun altına atamak demek ancak o sorumluktan Request çalıştırılırsa o Concurrent program gözükür.




Concurrent'ı ekledikten sonra Request menüsüne aşağıdaki gibi girilir ve program çalıştırılır.