Sayfalar

10 Temmuz 2012 Salı

Oracle Mobile Web Applications (MWA)


Oracle Mobile Web Applications (MWA)


Oracle Mobile Web Applications uygulamalarının nasıl yapıldığını anlatmaya çalışacağım.

Öncelikle kullanıcımıza yetki vermemiz gerekiyor.

Burada kullanıcımıza “Depo Yönetimi Mobil Kullanıcısı” yetkisini veriyorum.

Mobile servisi açık değilse
Putty ile giriş yapılıp

cd $INST_TOP/admin/scripts
mwactl.sh start 10550

komutları çalıştırılır.

Servis daha önceden açık ve kapatılmak isteniyorsa

cd $INST_TOP/admin/scripts
mwactl.sh -login apps/apps stop_force 10550

komutları ile kapatılabilir.

Herşeyin hazır olduğunu kontrol etmek için mwagui dizininde (internetten bulunabilir) bulunan startMWA_GUI.bat dosyasını aşağıdakine benzer bir şekilde duzenlemek gerekiyor.

set MWA_GUI_TOP=C:\mwagui_new
set JAVA_TOP="C:\Program Files\Java\jdk1.6.0_32"
%JAVA_TOP%\bin\java -classpath %JAVA_TOP%\lib\classes.zip;%MWA_GUI_TOP%\lib\j9969932_3p.zip;%MWA_GUI_TOP%\lib\j9969932_fnd.zip;%MWA_GUI_TOP%\lib\j9969932_mwa.zip -Dfile.encoding=cp857 -Duser.language=tr_TR oracle.apps.mwa.awt.client.StartGUI

Ardından bu dosyayı calistirdigimizda
Gibi bir ekran çıkacaktır. Burada server bilgilerini ve portu girdikten sonra Connect denirse
Gibi bir ekran gelecektir. Default menusune tıklanarak
Kullanici giriş ekranına gelinir.
Kullanici adi ve şifre girildikten sonra
Menumuz gelir.
Bu menuye bizim hazırladığımız ekranları ekleyebiliriz.
Bunu yapmadan önce kodlarımızı hazırlayalım.
3 farklı dosyamız olacak (Bu dosyalar http://oracle.anilpassi.com/hello-world-mobile-supply-chain-application-framework-6.html adresinden alınmıştır.)
1-      CustomTestFListener.java dosyası
2-      CustomTestFunction.java dosyası
3-      CustomTestPage.java dosyası

Kodlar aşağıdadır.

CustomTestFListener.java dosyası

/* Listener Class - Handles all events */

//package xxx.custom.server;
package xxysm.oracle.apps.inv;

import oracle.apps.inv.utilities.server.UtilFns;
import oracle.apps.mwa.beans.FieldBean;
import oracle.apps.mwa.container.Session;
import oracle.apps.mwa.eventmodel.AbortHandlerException;
import oracle.apps.mwa.eventmodel.DefaultOnlyHandlerException;
import oracle.apps.mwa.eventmodel.InterruptedHandlerException;
import oracle.apps.mwa.eventmodel.MWAEvent;
import oracle.apps.mwa.eventmodel.MWAFieldListener;


public class CustomTestFListener implements MWAFieldListener
{
  public CustomTestFListener()
  {
  }

  public void fieldEntered(MWAEvent mwaevent) throws AbortHandlerException,
                                                     InterruptedHandlerException,
                                                     DefaultOnlyHandlerException
  {
    UtilFns.trace("Inside Field Entered");
    ses = mwaevent.getSession();
    String s = UtilFns.fieldEnterSource(ses);
    // Prints the Current Bean's ID
    UtilFns.trace("CustomFListener:fieldEntered:fldName = " + s);
  }

  public void fieldExited(MWAEvent mwaevent) throws AbortHandlerException,
                                                    InterruptedHandlerException,
                                                    DefaultOnlyHandlerException
  {
    String s = ((FieldBean)mwaevent.getSource()).getName();
    // Prints the Current Bean's ID
    UtilFns.trace("CustomFListener:fieldExited:fldName = " + s);

    // Get handle to session and page
    Session ses = mwaevent.getSession();
    pg = (CustomTestPage)ses.getCurrentPage();

    // when the user clicks the Submit button call the method to print
    // Hello world with the text entered in text box

     if (s.equals("TEST.SUBMIT"))
     {
       pg.print(mwaevent,pg.getHelloWorld());
       return;
      }
  }
  // Varibale declaration
  CustomTestPage pg;
  Session ses;
}


CustomTestFunction.java dosyası:

/* Function class - this links the page with FND Function in AOL */
//package xxx.custom.server;

package xxysm.oracle.apps.inv;

import oracle.apps.fnd.common.VersionInfo;
import oracle.apps.inv.utilities.server.UtilFns;
import oracle.apps.mwa.beans.MenuItemBean;
import oracle.apps.mwa.eventmodel.MWAAppListener;
import oracle.apps.mwa.eventmodel.MWAEvent;

public class CustomTestFunction extends MenuItemBean implements MWAAppListener
{

  public CustomTestFunction()
  {
    //Link the page with the function
    //setFirstPageName("xxx.custom.server.CustomTestPage");
    setFirstPageName("xxysm.oracle.apps.inv.CustomTestPage");
    addListener(this);
  }

  public void appEntered(MWAEvent mwaevent)
  {
    // Code here to initialize Application Level

    // Logging Functions
    UtilFns.trace("Application Entered");
  }

  public void appExited(MWAEvent mwaevent)
  {
    // Code to be executed when the user exits the application

    // Logging Functions
    UtilFns.trace("Application Exited");
  }

  public static final String RCS_ID = "$Header:$";
  public static final boolean RCS_ID_RECORDED =
    VersionInfo.recordClassVersion("$Header:$", "%packageheader%");

}


CustomTestPage.java dosyası:

/* Page Class - Which has the Page Layout. We create and add beans to it */

//package xxx.custom.server;

package xxysm.oracle.apps.inv;

import oracle.apps.fnd.common.VersionInfo;
import oracle.apps.inv.utilities.server.UtilFns;
import oracle.apps.mwa.beans.ButtonFieldBean;
import oracle.apps.mwa.beans.PageBean;
import oracle.apps.mwa.beans.TextFieldBean;
import oracle.apps.mwa.eventmodel.AbortHandlerException;
import oracle.apps.mwa.eventmodel.DefaultOnlyHandlerException;
import oracle.apps.mwa.eventmodel.InterruptedHandlerException;
import oracle.apps.mwa.eventmodel.MWAEvent;

//import xxx.custom.server.CustomTestFListener;
import xxysm.oracle.apps.inv.CustomTestFListener;

//Page Listener Class

public class CustomTestPage extends PageBean
{
  /**
   * Default constructor which just initialises the layout.
   */
  public CustomTestPage()
  {
    //Method to initialize the layout
    initLayout();
  }


  /**
   * Does the initialization of all the fields. Creates new instances
   * and calls the method to set the prompts which may have to be later
   * moved to the page enter event if we were using AK prompts as we
   * require the session for the same.
   */
  private void initLayout()
  {

    //Logging
    if (UtilFns.isTraceOn)
      UtilFns.trace("CustomPage initLayout");

    //Create a Text Filed and Set an ID
    mHelloWorld = new TextFieldBean();
    mHelloWorld.setName("TEST.HELLO");

    // Create a Submit Button and set an ID
    mSubmit = new ButtonFieldBean();
    mSubmit.setName("TEST.SUBMIT");

    //add the fields
    addFieldBean(mHelloWorld);
    addFieldBean(mSubmit);

    //add field listener to all necessary fields
    CustomTestFListener fieldListener = new CustomTestFListener();

    mHelloWorld.addListener(fieldListener);
    mSubmit.addListener(fieldListener);

    //call this method to initializa the prompts
    this.initPrompts();
  }


  /**
   * Method that sets all the prompts up.
   */
  private void initPrompts()
  {

    UtilFns.trace(" Custom Page - Init Prompts");

    // sets the page title
    this.setPrompt("Test Custom Page");

    // set the prompts for all the remaining fields
    mHelloWorld.setPrompt("Enter Your Name");
    mSubmit.setPrompt("Submit");

    //please note that we should not hard code page name and prompts
    //as it may cause translation problems
    //we have an different procedure to overcome this

  }

  // This method is called when the user clicks the submit button

  public void print(MWAEvent mwaevent,
                    TextFieldBean mTextBean) throws AbortHandlerException
  {
    UtilFns.trace(" Custom Page - print ");

    // Get the value from Text bean and append hello world
    // and display it to user on the same field
    String s = mTextBean.getValue();
    mTextBean.setValue(s + " Hello World");
  }

  // Method to get handle of TextBean

  public TextFieldBean getHelloWorld()
  {
    return mHelloWorld;
  }

  //Method called when the page is entered

  public void pageEntered(MWAEvent e) throws AbortHandlerException,
                                             InterruptedHandlerException,
                                             DefaultOnlyHandlerException
  {

    UtilFns.trace(" Custom Page - pageEntered ");

  }

  //Method called when the page is exited

  public void pageExited(MWAEvent e) throws AbortHandlerException,
                                            InterruptedHandlerException,
                                            DefaultOnlyHandlerException
  {
    UtilFns.trace(" Custom Page - pageExited ");
  }

  // Create the Bean Variables
  TextFieldBean mHelloWorld;
  protected ButtonFieldBean mSubmit;

}


Kodları Jdeveloper gibi bir java compiler programı ile açıp derlememiz gerekiyor.





JDeveloperda Make komutu bizim işimize yarayacaktır. Her dosyayı aynı şekilde derledikten sonra oluşan class doyalarını $JAVA_TOP dizininde kendimize ozel olarak tanımladığımız yere atabiliriz(.../xxysm/oracle/apps/inv gibi).

Şimdi hazırladığımız ekranı menuye eklemeye sıra geldi.
Yukarıda da görüldüğü gibi menumuz WMS_MOB_NAVIGATE. Bu menuye ekleme yapabilmemiz icin öncelikle fonksiyonumuzu tanımlamamız gerekiyor.
 Test fonksiyonunu tanımlayarak başlıyorum.
Özellikler tabından
 Mobil İş Yönetim Sistemi Tipi secilir.
Ekran tabını oldugu gibi bırakıyoruz.
Web HTML tabında ise
Class dosyalarımızın dizinindeki function (xxysm.oracle.apps.inv.CustomTestFunction) belirtilir.
Kaydetme işleminden sonra fonksiyonumuz tanımı tamamlanmış olacak.
Menuye fonksiyonumuz eklendikten sonra bu fonksiyon kullanılabilir durumdadır.
Görüldüğü gibi Mobil Test fonksiyonumuz menuye eklenmiş.
Menuye tıkladığımızda bizim ekranımız gelir.
İsmimizi yazıp Submit tuşuna bastığımızda,
Türkçe karakterleri desteklemeyerek sonucu verdiğini görürüz. 


Burada sistemde oluşan hataları bulabilmemiz için $INST_TOP/admin/install /mwa.cfg dosyasındaki
mwa.LogLevel = trace
Değerini yukarıdaki gibi değiştiriyoruz...

cd $INST_TOP/logs ile giriş yapılıp
tail –f  10550.system.log
ile log kontrolu yapılır...

Türkçe karakter çözümü için ise
linkindeki aşağıdaki çözümü uygulayabilirsiniz.

NLS Support

Here are some tips for implementing the mobile GUI with Multi-language (MLS/NLS). Some customers had issues with character encoding (for example Turkish characters). Here are steps followed to fix the issue:
1:- Download and apply server side Patch 11853398
2:- Set the "ICX: Language" profile at USER level to <REQUIRED LANGUAGE> for a Mobile user.
3:- Shutdown the MWA servers
4:- Download MWA GUI multilingual GUI Patch 12574324
5:- Create client folder and extract the files from the zip
unzip p12574324_11i_WINNT.zip C:\NLSMWAGUI_12574324

cd C:\NLSMWAGUI_12574324

cp 12574324_mwa.zip C:\NLSMWAGUI_12574324\lib
cp 12574324_3p.zip C:\NLSMWAGUI_12574324\lib
cp j12574324_ak.zip C:\NLSMWAGUI_12574324\lib
cp j12574324_fnd.zip C:\NLSMWAGUI_12574324\lib

6:- Create a cmd file to start the client
set MWA_GUI_TOP=C:\NLSMWAGUI_12574324
set JAVA_TOP=C:\Progra~1\Java\jre6
%JAVA_TOP%\bin\java -Dfile.encoding=UTF8 -Duser.language=TR -classpath %JAVA_TOP%\lib\classes.zip;%MWA_GUI_TOP%\j12574324_mwa.zip;%MWA_GUI_TOP%\j12574324_3p.zip;%MWA_GUI_TOP%\j12574324_ak.zip;%MWA_GUI_TOP%\j12574324_fnd.zip oracle.apps.mwa.awt.client.StartGUI













9 Temmuz 2012 Pazartesi

Custom Java kodlarının oracle formslara entegre edilmesi

Merhaba;

Oracle Forms'ta yazabilecekleriniz yeterli olmadığı durumlarda Java kodlarından destek almamız kaçınılmaz oluyor. Bu java kodlarının oturum açılırken (forms ekranı) client tarafa indirilmesi ve client ortamında çalıştırılması isteniyorsa kodun sisteme atılması ve bazı dosyalarda değişiklik yapılması gerekmektedir.

Aşağıda custom yazılan java kodlarının sisteme entegre edilmesinin aşamalarını anlatmaya çalışacağım.

  1. Oluşturulan java dosyaların class ları $OA_JAVA path in altına kopyalanır.
  2. $FND_TOP/java/make tabındaki fndjar.dep dosyasına jar ismi ile içereceği class dosyaları tanımlanır.     Örneğin :

        PortManage.jar :
        oracle/forms/fd/mypackage/TwoWaySerialComm$SerialReader
        oracle/forms/fd/mypackage/TwoWaySerialComm$SerialWriter
        oracle/forms/fd/mypackage/TwoWaySerialComm
      satırlarını ekleyerek PortManage.jar dosyasının içeriğini belirleyebiliyorsunuz.(Meraklılarına: TwoWaySerialComm.java dosyasını internette bulabilirsiniz)


   3. Tanımlanan jar file ların $OA_JAVA/oracle/apps/fnd/jar path inde oluşması için adadmin den generate product jar files işlemi yapılır.


Consolda adadmin diyerek giriş yapılır.


Default directory yeri belirlenir genelde önerilen yer doğrudur. Yes deyip geçeriz.

Yaptığınız işlemlerin logunun hangi dosyaya aktarılmasını istiyorsak onun adını yazarız.

Hata olması durumda size mail ile bildirilmesini aktif edebilirsiniz. No diyoruz.

Batchsize belirlenir. Default neyse onu verdim.

Database'i soruyor Yes deyip geçiyorum
Schema şifresi giriliyor.
APPS şifresi girilir.


JAR dosyalarinin oluşması için Menuden 1 (Generate Applications Files menu) seçilir.

Sonra çıkan menuden 4 (Generate product JAR files) seçilir.

Tüm JAR dosyalarını yeniden oluşturmasını istemediğimizden No dedik.

Bu işlem sonrasında $OA_JAVA/oracle/apps/fnd/jar dizini altına yeni tanımlanan jar ların oluşup oluşmadığı kontrol edilir.


Eğer oluşmuş ise JAVA_BEAN yapısını kullanarak formlara entegre edilebilir.