Add on still exists eventhough SAP B1 exit (pls help..)

Dear all,
could you please help me to solve a problem relate to stop add-on in the memory whenever I close my SAP B1 ? I am still seing the application in the tab application on the windows task manager, I try to use this following :
Public Sub SBO_Application_AppEvent(ByVal EventType As SAPbouiCOM.BoAppEventTypes)
    Select Case EventType
         Case aet_ServerTerminition
              End
    End Select
End Sub
But failed. I appreciate your answer so much. TIA
Rgds,
Steve

This is how it should look like (in C#, sorry)
    private void ApplHandler(BoAppEventTypes EventType)
      switch (EventType)
        case BoAppEventTypes.aet_CompanyChanged:
          /// handle your company change here, usually redoing a SSO
          return;
        case BoAppEventTypes.aet_LanguageChanged:
          /// handle your language change here
          return;
        case BoAppEventTypes.aet_ServerTerminition:
        case BoAppEventTypes.aet_ShutDown:
          /// handle your termination here
          System.Environment.Exit( 0 );
          return;

Similar Messages

  • Just bought iPad mini 2 last week and FaceTime is missing under settings. Even under restrictions , facetime can't be found. I already reset everything but it's still the same, no facetime. Pls help me

    Just bought iPad mini 2 last week. FaceTime is missing under settings. i can't even find it under restrictions. I have reset it but it's still the same, no facetime. Pls help me...

    FaceTime is not  available on devices purchased or used in certain countries, including Saudi Arabia and the United Arab Emirates. This is by government decree. The FaceTime app can't be downloaded or installed on these iPads.
     Cheers, Tom

  • Re: Just bought iPad mini 2 last week and FaceTime is missing under settings. Even under restrictions , facetime can't be found. I already reset everything but it's still the same, no facetime. Pls help me

    I Bought it here in Kuwait. Actually my husband also bought another iPad mini here in Kuwait. And he have facetime in it. My iPad doesn't have it.

    my husband and I bought it in the viva telecom store Together. But his iPad mini have facetime while mine doesn't have. there are 3 telecom companies here in Kuwait. My friends have facetime here.   is there any way to install it if we go to other country?

  • Pls help - How can I add a typekit font to muse?

    As Muse doesn't come with all typekit fonts already included in the dropdown list of webfonts, I'd like to know how I can add a typekit font to the dropdown menu so I can use it for my website. I have Adobe creative cloud membership.
    I've searched the whole of the web and can't find anything about this at all - only about adding one of the existing muse typekit fonts which I already know how to do.
    Why doesn't Adobe include all typekit fonts with Muse when you're already a full creative cloud subscriber?

    Done!
    Date: Thu, 20 Dec 2012 03:13:17 -0700
    From: [email protected]
    To: [email protected]
    Subject: Pls help - How can I add a typekit font to muse?
        Re: Pls help - How can I add a typekit font to muse?
        created by morgan_in_london in Help with using Adobe Muse - View the full discussion
    You're very welcome - can I be cheeky and ask for a "correct answer" to be noted? :^D
         Please note that the Adobe Forums do not accept email attachments. If you want to embed a screen image in your message please visit the thread in the forum to embed the image at http://forums.adobe.com/message/4935814#4935814
         Replies to this message go to everyone subscribed to this thread, not directly to the person who posted the message. To post a reply, either reply to this email or visit the message page: http://forums.adobe.com/message/4935814#4935814
         To unsubscribe from this thread, please visit the message page at http://forums.adobe.com/message/4935814#4935814. In the Actions box on the right, click the Stop Email Notifications link.
         Start a new discussion in Help with using Adobe Muse by email or at Adobe Community
      For more information about maintaining your forum email notifications please go to http://forums.adobe.com/message/2936746#2936746.

  • I am new to SAP i dont know even basics also pls help me to learn

    I want use SAP in qlikview pls  help me
    thanks in  advance

    HI Kumar,
    This forum is specially for SAP BI application not for qlikview, for SAP BI Please refer below tutorial links
    Official Product Tutorials – SAP BI Suite
    http://scn.sap.com/docs/DOC-7725
    Official Product Tutorials – SAP BusinessObjects Web Intelligence
    http://scn.sap.com/docs/DOC-7819
    Official Product Tutorials – SAP Crystal Reports 2011 / 2013
    http://scn.sap.com/docs/DOC-8514
    Official Product Tutorials – SAP BusinessObjects Crystal Reports for Enterprise
    http://scn.sap.com/docs/DOC-8013
    Official Product Tutorials – SAP BusinessObjects Dashboards
    http://scn.sap.com/docs/DOC-7946
    Thanks,
    Daya

  • I cannot updates in my application store because the previous email add still exist even i have already new apple id

    I cannot update in my application store because the previous email add still exist even i have a new apple id

    FAQ apple id http://support.apple.com/kb/he37
    Doesn't matter if you have a new ID, all apps are tied to the apple id that was used to download it.

  • I deleted all the music on my iPhone, but all the albums still exist. How do I clear and add a fresh batch of music?

    I deleted all the music on my iPhone, but all the album artwork still exist. How do I clear and add a fresh batch of music?  Also my iTunes no longer recognizes my iPhone under the "devices" tab so I am unable to manually sync. I have disconnected it makes a beep sound when reconnected so I know my computer is finding the phone, the iPhone also appears on Explorer. Stupid question but I can't figure it out and wasting too much time.  Thank you.

    It has always been very basic to always maintain a backup copy of your computer for this very occasion.  Use your backup copy of your computer to put everything on the new one.
    If for some reason you have failed to backup, big mistake, then you can transfer itunes purchases from the iphone to the computer:  File>Transfer Purchases
    You may be able to buy a 3rd party program to get any other music off of the iphone ( not supported by Apple).
    When you sync the iphone, it will erase the current content and replace with content form the new computer.
    "Not happy with itunes right now, more then a bit of a joke"
    Not itunes fault that you did not do the very basics and maintain a backup copy.

  • The Bug about 'DB_SECONDARY_BAD' still exists in BerkeleyDB4.8!

    The Bug about 'DB_SECONDARY_BAD' still exists in BerkeleyDB4.8?
    I'm sorry for my poor English, But I just cannot find anywhere else for help.
    Thanks for your patience first!
    I'm using BDB4.8 C++ API on Ubuntu 10.04, Linux Kernel 2.6.32-24-generic
    $uname -a
    $Linux wonpc 2.6.32-24-generic #43-Ubuntu SMP Thu Sep 16 14:17:33 UTC 2010 i686 GNU/Linux
    When I update(overwrite) a record in database, I may get a DB_SECONDARY_BAD exception,
    What's worse, This case doesn't always occures, it's random. So I think it probably a bug
    of BDB, I have seen many issues about DB_SECONDARY_BAD with BDB4.5,4.6...
    To reproduce the issue, I make a simplified test program from my real program.
    The data to be stroed into database is a class called 'EntryData', It's defined in db_access.h,
    where also defines some HighLevel API functions that hide the BDB calls, such as
    store_entry_data(), which use EntryData as its argument. The EntryData have a string-type
    member-data 'name' and a vector<string>-type mem-data 'labels', So store_entry_data() will
    put the real data of EntryData to a contiguous memory block. The get_entry_data() returns
    an EntryData builed up from the contiguous memory block fetched from database.
    The comlete test program is post following this line:
    /////////db_access.h////////////
    #ifndef __DB_ACCESS_H__
    #define __DB_ACCESS_H__
    #include <string>
    #include <vector>
    #include <db_cxx.h>
    class EntryData;
    //extern Path DataDir; // default value, can be changed
    extern int database_setup();
    extern int database_close();
    extern int store_entry_data(const EntryData&, u_int32_t = DB_NOOVERWRITE);
    extern int get_entry_data(const std::string&, EntryData*, u_int32_t = 0);
    extern int rm_entry_data(const std::string&);
    class DBSetup
    // 构造时调用database_setup, 超出作用域自动调用database_close .
    // 该类没有数据成员.
    public:
    DBSetup() {
    database_setup();
    ~DBSetup() {
    database_close();
    class EntryData
    public:
    typedef std::vector<std::string> LabelContainerType;
    EntryData() {}
    EntryData(const std::string& s) : name(s) {}
    EntryData(const std::string& s, LabelContainerType& v)
    : name(s), labels(v) {}
    EntryData(const std::string&, const char*[]);
    class DataBlock;
    // 直接从内存块中构建, mem指针将会从数据库中获取,
    // 它就是EntryData转化成的DataBlock中buf_ptr->buf的内容.
    EntryData(const void* mem_blk, const int len);
    ~EntryData() {};
    const std::string& get_name () const { return name; }
    const LabelContainerType& get_labels() const { return labels; }
    void set_name (const std::string& s) { name = s; }
    void add_label(const std::string&);
    void rem_label(const std::string&);
    void show() const;
    // get contiguous memory for all:
    DataBlock get_block() const { return DataBlock(*this); }
    class DataBlock
    // contiguous memory for all.
    public:
    DataBlock(const EntryData& data);
    // 引进一块内存作为 buf_ptr->buf 的内容.
    // 例如从数据库中获取结果
    DataBlock(void* mem, int len);
    // 复制构造函数:
    DataBlock(const DataBlock& orig) :
    data_size(orig.data_size),
    capacity(orig.capacity),
    buf_ptr(orig.buf_ptr) { ++buf_ptr->use; }
    // 赋值操作符:
    DataBlock& operator=(const DataBlock& oth)
    data_size = oth.data_size;
    capacity = oth.capacity;
    if(--buf_ptr->use == 0)
    delete buf_ptr;
    buf_ptr = oth.buf_ptr;
    return *this;
    ~DataBlock() {
    if(--buf_ptr->use == 0) { delete buf_ptr; }
    // data()函数因 Dbt 构造函数不支持const char*而被迫返回 char*
    // data() 返回的指针是应该被修改的.
    const char* data() const { return buf_ptr->buf; }
    int size() const { return data_size; }
    private:
    void pack_str(const std::string& s);
    static const int init_capacity = 100;
    int data_size; // 记录数据块的长度.
    int capacity; // 已经分配到 buf 的内存大小.
    class SmartPtr; // 前向声明.
    SmartPtr* buf_ptr;
    class SmartPtr
    friend class DataBlock;
    char* buf;
    int use;
    SmartPtr(char* p) : buf(p), use(1) {}
    ~SmartPtr() { delete [] buf; }
    private:
    std::string name; // entry name
    LabelContainerType labels; // entry labels list
    }; // class EntryData
    #endif
    //////db_access.cc/////////////
    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <vector>
    #include <algorithm>
    #include "directory.h"
    #include "db_access.h"
    using namespace std;
    static Path DataDir("~/mydict_data"); // default value, can be changed
    const Path& get_datadir() { return DataDir; }
    static DbEnv myEnv(0);
    static Db db_bynam(&myEnv, 0); // using name as key
    static Db db_bylab(&myEnv, 0); // using label as key
    static int generate_keys_for_db_bylab
    (Db* sdbp, const Dbt* pkey, const Dbt* pdata, Dbt* skey)
    EntryData entry_data(pdata->get_data(), pdata->get_size());
    int lab_num = entry_data.get_labels().size();
    Dbt* tmpdbt = (Dbt*) malloc( sizeof(Dbt) * lab_num );
    memset(tmpdbt, 0, sizeof(Dbt) * lab_num);
    EntryData::LabelContainerType::const_iterator
    lab_it = entry_data.get_labels().begin(), lab_end = entry_data.get_labels().end();
    for(int i = 0; lab_it != lab_end; ++lab_it, ++i) {
    tmpdbt[ i ].set_data( (void*)lab_it->c_str() );
    tmpdbt[ i ].set_size( lab_it->size() );
    skey->set_flags(DB_DBT_MULTIPLE | DB_DBT_APPMALLOC);
    skey->set_data(tmpdbt);
    skey->set_size(lab_num);
    return 0;
    //@Return Value: return non-zero at error
    extern int database_setup()
    const string DBEnvHome (DataDir + "DBEnv");
    const string dbfile_bynam("dbfile_bynam");
    const string dbfile_bylab("dbfile_bylab");
    db_bylab.set_flags(DB_DUPSORT);
    const u_int32_t env_flags = DB_CREATE | DB_INIT_MPOOL;
    const u_int32_t db_flags = DB_CREATE;
    rmkdir(DBEnvHome);
    try
    myEnv.open(DBEnvHome.c_str(), env_flags, 0);
    db_bynam.open(NULL, dbfile_bynam.c_str(), NULL, DB_BTREE, db_flags, 0);
    db_bylab.open(NULL, dbfile_bylab.c_str(), NULL, DB_BTREE, db_flags, 0);
    db_bynam.associate(NULL, &db_bylab, generate_keys_for_db_bylab, 0);
    } catch(DbException &e) {
    cerr << "Err when open DBEnv or Db: " << e.what() << endl;
    return -1;
    } catch(std::exception& e) {
    cerr << "Err when open DBEnv or Db: " << e.what() << endl;
    return -1;
    return 0;
    int database_close()
    try {
    db_bylab.close(0);
    db_bynam.close(0);
    myEnv.close(0);
    } catch(DbException &e) {
    cerr << e.what();
    return -1;
    } catch(std::exception &e) {
    cerr << e.what();
    return -1;
    return 0;
    // 返回Dbt::put()的返回值
    int store_entry_data(const EntryData& e, u_int32_t flags)
    int res = 0;
    try {
    EntryData::DataBlock blk(e);
    // data()返回的buf中存放的第一个字符串便是 e.get_name().
    Dbt key ( (void*)blk.data(), strlen(blk.data()) + 1 );
    Dbt data( (void*)blk.data(), blk.size() );
    res = db_bynam.put(NULL, &key, &data, flags);
    } catch (DbException& e) {
    cerr << e.what() << endl;
    throw; // 重新抛出.
    return res;
    // 返回 Db::get()的返回值, 调用成功时 EntryData* e的值才有意义
    int get_entry_data
    (const std::string& entry_name, EntryData* e, u_int32_t flags)
    Dbt key( (void*)entry_name.c_str(), entry_name.size() + 1 );
    Dbt data;
    data.set_flags(DB_DBT_MALLOC);
    int res = db_bynam.get(NULL, &key, &data, flags);
    if(res == 0)
    new (e) EntryData( data.get_data(), data.get_size() );
    free( data.get_data() );
    return res;
    int rm_entry_data(const std::string& name)
    Dbt key( (void*)name.c_str(), name.size() + 1 );
    cout << "to remove: \'" << name << "\'" << endl;
    int res = db_bynam.del(NULL, &key, 0);
    return res;
    EntryData::EntryData(const std::string& s, const char* labels_arr[]) : name(s)
    {   // labels_arr 需要以 NULL 结尾.
    for(const char** i = labels_arr; *i != NULL; i++)
    labels.push_back(*i);
    EntryData::EntryData(const void* mem_blk, const int len)
    const char* buf = (const char*)mem_blk;
    int consumed = 0; // 已经消耗的mem_blk的大小.
    name = buf; // 第一串为 name
    consumed += name.size() + 1;
    for (string label = buf + consumed;
    consumed < len;
    consumed += label.size() + 1)
    label = buf + consumed;
    labels.push_back(label);
    void EntryData::add_label(const string& new_label)
    if(find(labels.begin(), labels.end(), new_label)
    == labels.end())
    labels.push_back(new_label);
    void EntryData::rem_label(const string& to_rem)
    LabelContainerType::iterator iter = find(labels.begin(), labels.end(), to_rem);
    if(iter != labels.end())
    labels.erase(iter);
    void EntryData::show() const {
    cout << "name: " << name << "; labels: ";
    LabelContainerType::const_iterator it, end = labels.end();
    for(it = labels.begin(); it != end; ++it)
    cout << *it << " ";
    cout << endl;
    EntryData::DataBlock::DataBlock(const EntryData& data) :
    data_size(0),
    capacity(init_capacity),
    buf_ptr(new SmartPtr(new char[init_capacity]))
    pack_str(data.name);
    for(EntryData::LabelContainerType::const_iterator \
    i = data.labels.begin();
    i != data.labels.end();
    ++i) { pack_str(*i); }
    void EntryData::DataBlock::pack_str(const std::string& s)
    int string_size = s.size() + 1; // to put sting in buf separately.
    if(capacity >= data_size + string_size) {
    memcpy(buf_ptr->buf + data_size, s.c_str(), string_size);
    else {
    capacity = (data_size + string_size)*2; // 分配尽可能大的空间.
    buf_ptr->buf = (char*)realloc(buf_ptr->buf, capacity);
    memcpy(buf_ptr->buf + data_size, s.c_str(), string_size);
    data_size += string_size;
    //////////// test_put.cc ///////////
    #include <iostream>
    #include <string>
    #include <cstdlib>
    #include "db_access.h"
    using namespace std;
    int main(int argc, char** argv)
    if(argc < 2) { exit(EXIT_FAILURE); }
    DBSetup setupup_mydb;
    int res = 0;
    EntryData ed(argv[1], (const char**)argv + 2);
    res = store_entry_data(ed);
    if(res != 0) {
         cerr << db_strerror(res) << endl;
         return res;
    return 0;
    // To Compile:
    // $ g++ -ldb_cxx -lboost_regex -o test_put test_put.cc db_access.cc directory.cc
    //////////// test_update.cc ///////////
    #include <iostream>
    #include <cstdlib>
    #include <string>
    #include <boost/program_options.hpp>
    #include "db_access.h"
    using namespace std;
    namespace po = boost::program_options;
    int main(int argc, char** argv)
    if(argc < 2) { exit(EXIT_SUCCESS); }
    DBSetup setupup_mydb;
    int res = 0;
    po::options_description cmdopts("Allowed options");
    po::positional_options_description pos_opts;
    cmdopts.add_options()
    ("entry", "Specify the entry that will be edited")
    ("addlabel,a", po::value< vector<string> >(),
    "add a label for specified entry")
    ("removelabel,r", po::value< vector<string> >(),
    "remove the label of specified entry")
    pos_opts.add("entry", 1);
    po::variables_map vm;
    store( po::command_line_parser(argc, argv).
    options(cmdopts).positional(pos_opts).run(), vm );
    notify(vm);
    EntryData entry_data;
    if(vm.count("entry")) {
    const string& entry_to_edit = vm["entry"].as<string>();
    res = get_entry_data( entry_to_edit, &entry_data );
    switch (res)
    case 0:
    break;
    case DB_NOTFOUND:
    cerr << "No entry named: \'"
    << entry_to_edit << "\'\n";
    return res;
    break;
    default:
    cerr << db_strerror(res) << endl;
    return res;
    } else {
    cerr << "No entry specified\n";
    exit(EXIT_FAILURE);
    EntryData new_entry_data(entry_data);
    typedef vector<string>::const_iterator VS_CI;
    if(vm.count("addlabel")) {
    const vector<string>& to_adds = vm["addlabel"].as< vector<string> >();
    VS_CI end = to_adds.end();
    for(VS_CI i = to_adds.begin(); i != end; ++i) {
    new_entry_data.add_label(*i);
    if(vm.count("removelabel")) {
    const vector<string>& to_rems = vm["removelabel"].as< vector<string> >();
    VS_CI end = to_rems.end();
    for(VS_CI i = to_rems.begin(); i != end; ++i) {
    new_entry_data.rem_label(*i);
    cout << "Old data| ";
    entry_data.show();
    cout << "New data| ";
    new_entry_data.show();
    res = store_entry_data(new_entry_data, 0); // set flags to zero permitting Over Write
    if(res != 0) {
    cerr << db_strerror(res) << endl;
    return res;
    return 0;
    // To Compile:
    // $ g++ -ldb_cxx -lboost_regex -lboost_program_options -o test_update test_update.cc db_access.cc directory.cc

    ////////directory.h//////
    #ifndef __DIRECTORY_H__
    #define __DIRECTORY_H__
    #include <string>
    #include <string>
    #include <sys/types.h>
    using std::string;
    class Path
    public:
    Path() {}
    Path(const std::string&);
    Path(const char* raw) { new (this) Path(string(raw)); }
    Path upper() const;
    void operator+= (const std::string&);
    // convert to string (char*):
    //operator std::string() const {return spath;}
    operator const char*() const {return spath.c_str();}
    const std::string& str() const {return spath;}
    private:
    std::string spath; // the real path
    inline Path operator+(const Path& L, const string& R)
    Path p(L);
    p += R;
    return p;
    int rmkdir(const string& path, const mode_t mode = 0744, const int depth = -1);
    #endif
    ///////directory.cc///////
    #ifndef __DIRECTORY_H__
    #define __DIRECTORY_H__
    #include <string>
    #include <string>
    #include <sys/types.h>
    using std::string;
    class Path
    public:
    Path() {}
    Path(const std::string&);
    Path(const char* raw) { new (this) Path(string(raw)); }
    Path upper() const;
    void operator+= (const std::string&);
    // convert to string (char*):
    //operator std::string() const {return spath;}
    operator const char*() const {return spath.c_str();}
    const std::string& str() const {return spath;}
    private:
    std::string spath; // the real path
    inline Path operator+(const Path& L, const string& R)
    Path p(L);
    p += R;
    return p;
    int rmkdir(const string& path, const mode_t mode = 0744, const int depth = -1);
    #endif
    //////////////////// All the code is above ////////////////////////////////
    Use the under command
    $ g++ -ldb_cxx -lboost_regex -o test_put test_put.cc db_access.cc directory.cc
    to get a test program that can insert a record to database.
    To insert a record, use the under command:
    $ ./test_put ubuntu linux os
    It will store an EntryData named 'ubuntu' and two labels('linux', 'os') to database.
    Use the under command
    $ g++ -ldb_cxx -lboost_regex -lboost_program_options -o test_update test_update.cc db_access.cc directory.cc
    to get a test program that can update the existing records.
    To update the record, use the under command:
    $ ./test_update ubuntu -r linux -a canonical
    It will update the with the key 'ubuntu', with the label 'linux' removed and a new
    label 'canonical'.
    Great thanks to you if you've read and understood my code!
    I've said that the DB_SECONDARY_BAD exception is random. The same operation may cause
    exception in one time and may goes well in another time.
    As I've test below:
    ## Lines not started with '$' is the stdout or stderr.
    $ ./test_put linux os linus
    $ ./test_update linux -r os
    Old data| name: linux; labels: os linus
    New data| name: linux; labels: linus
    $ ./test_update linux -r linus
    Old data| name: linux; labels: linus
    New data| name: linux; labels:
    dbfile_bynam: DB_SECONDARY_BAD: Secondary index inconsistent with primary
    Db::put: DB_SECONDARY_BAD: Secondary index inconsistent with primary
    terminate called after throwing an instance of 'DbException'
    what(): Db::put: DB_SECONDARY_BAD: Secondary index inconsistent with primary
    已放弃
    Look! I've received a DB_SECONDARY_BAD exception. But thus exception does not always
    happen even under the same operation.
    For the exception is random, you may have not the "luck" to get it during your test.
    So let's insert a record by:
    $ ./test_put t
    and then give it a great number of labels:
    $ for((i = 0; i != 100; ++i)); do ./test_update t -a "label_$i"; done
    and then:
    $ for((i = 0; i != 100; ++i)); do ./test_update t -r "label_$i"; done
    Thus, the DB_SECONDARY_BAD exception is almost certain to happen.
    I've been confused by the problem for times. I would appreciate if someone can solve
    my problem.
    Many thanks!
    Wonder

  • Can we add our own menu in sap easy access screen

    can we add our own menu in sap easy access screen
    along with the existing menu items...
    ex : can i add the new menu item as help1 on that screen
    regards
       raghu

    go  to transection se43 ...ther e  u can create   ur  own menu list.. and  ur  cusomize transection to that perticular menu list.....
    You can enter the area menu in the command field like any other transaction code, also in menu exits can be filled with a area menu.
    You might play a little with S000 and S001 - when you enter them, the menu tree of easy access changes.
    Do you search for the menu exits to append your area menu into the standard menu tree?
    Message was edited by: kishan negi

  • Bug #18104 still exists

    Hello,
    I am quite disappointed about BDB 5. One of the most nasty bugs (#18104) still
    exists. As soon as you want to use the set_thread_count() feature, BDB will not
    free the thread-control-block. If you connect/disconnect, BDB will stop working
    quite early. You can re-produce this issue with any `db_*` tool.
    The testcase:
    #include <stdlib.h>
    #include <db.h>
    #define DIRECTORY "/tmp/db"
    int main()
        /* open environment */
        DB_ENV *handle;
        int status = db_env_create( &handle, 0 );
        status = handle->set_cachesize( handle, 0, 32*1024*1024, 0 );
        status = handle->set_thread_count( handle, 0x100 );
        status = handle->open( handle, DIRECTORY, DB_CREATE, 0644 );
        if( status != 0 )
            return 1;
        /* raise error "Unable to allocate thread control block" */
        for( ;; )
            system( "db_stat -e -h " DIRECTORY " | grep process/thread | wc" );
        return 0;
    }

    Hi Sandra,
    Hi Greg,
    Our architecture is quite simple: a cron-job runs ENV->failchk() and ENV->txn_checkpoint()
    once a minute (which should be fine, shouldn't it?)
    The problem, neither ENV->close() nor ENV->failchk() removes outdated items from the
    thread-control-block. One would expect, that the PID is added to the block as soon as the
    process connects and removed when the process disconnects. But it is not.
    If the block runs out of memory, BDB requires a recovery (see the down below testcase).
    Usually ENV->failchk() cleans the thread-control-block, as soon as there are more items in
    the block than "thread_count". Today three times it did not even remove them, if there were
    more than "thread_count" items in the block - but this happend sporadic so it was difficult
    to create a testcase.
    Once ENV->failchk() cleans the thread-control-block, BDB works as expected. If a process
    connects, the PID is added to the block, and as soon as the process disconnects, the PID is
    removed from the thread-control-block. You can test this by looping the first loop 1090 times.
    The testcase:
    #include <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
    #include <db.h>
    #include <errno.h>
    #define DIRECTORY "/tmp/db"
    static int bdb_is_alive( DB_ENV *dbenv, pid_t pid, db_threadid_t tid, u_int32_t flags )
        int status;
        status = kill( pid, 0 );
        if( status != -1 )
            return 1;
        if( errno == ESRCH )
            return 0;
        exit( 1 );  /* should never happen */
    int main()
        system( "mkdir -p " DIRECTORY );
        system( "db_recover -h " DIRECTORY );
        system( "rm -rfv " DIRECTORY "/*" );
        /* open environment */
        int status, i;
        DB_ENV *handle;
        status = db_env_create( &handle, 0 );
        status = handle->set_cachesize( handle, 0, 32*1024*1024, 0 );
        status = handle->set_thread_count( handle, 1091 );
        status = handle->set_isalive( handle, bdb_is_alive );
        status = handle->open( handle, DIRECTORY, DB_CREATE, 0644 );
        if( status != 0 )
            return 1;   /* should never happen */
        status = handle->failchk( handle, 0 );
        status = handle->close( handle, 0 );
        /* Now start workers (`db_stat`) + failchks() */
        for( i=0; i < 1089; ++i )       /* thread_count - 2 */
            fprintf(stderr,"Number of items in the thread-control-block: "); fflush(stdout);
            system( "db_stat -e -h " DIRECTORY " | grep process/thread | wc -l" );
            status = db_env_create( &handle, 0 );
            status = handle->set_isalive( handle, bdb_is_alive );
            status = handle->open( handle, DIRECTORY, DB_CREATE, 0644 );
            if( status != 0 )
                return 1;   /* should never happen */
            status = handle->failchk( handle, 0 );      /* strange - does not remove the process-entries created by `db_stat` */
            if( status != 0 )
                return 1;   /* should never happen */
            status = handle->close( handle, 0 );
        /* raise error: "Unable to allocate thread control block" */
        for( i=1; i < 422; ++i )
            fprintf(stderr,"Number of items in the thread-control-block: "); fflush(stdout);
            system( "db_stat -e -h " DIRECTORY " | grep process/thread | wc -l" );
        /* You should see on stderr:
                db_stat: Unable to allocate thread control block
                db_stat: Unable to allocate thread control block
                db_stat: DB_ENV->open: /tmp/db: Cannot allocate memory
        fprintf(stderr,"BDB is dead now. Only `db_recover` helps...\n%s\n",db_version(NULL,NULL,NULL));
        return 0;
    }

  • Urgent Entries for application 11 still exist in the extraction queue

    Hi All,
    In LBWE when i am trying to mainting structure its not allowing to add fields to ExtractStrucutre.
    Following is the error iam getting.
    Entries for application 11 still exist in the extraction queue ->
    I have set the Update to inactive and trying to add fields to Extract strucutre .
    Morover,
    I have already deleted setuptable entries for this application Component 11 and i checked in rsa3, no records are there.
    Regards,
    C.V.
    Message was edited by: P.C.V.

    PCV,
    Here are the steps. Make sure you do them when there is no posting going on.
    1) Using transaction SA38, execute program RMBWV311. This will send the data from the extraction queue to delta queue for application 11.
    2) Run your 2lis_11_***** info packages to bring the delta records into BW. Make sure to run these info packages twice because the delta is cleared on R/3 only if you run them twice. It is designed this way to accomodate the delta repetition functionality.
    Just to make sure, verify that you don't see any data in RSA7, LBWQ and if you use RSA3, the system should not extract any data.
    You should be able to change the extract structure now.
    Abdul

  • SAP Standard Exits for ME51n/52n/53n

    Hi Friends,
    Please tell me is there any SAP standard Exits for Purchase requisition Me51n/me52n/me53n..
    Thanks in Advance..........
    Ravi

    hi
    this are
    following enhancements that u can use
    M06B0004  Number range and document number
    M06B0005  Changes to comm. structure for overall release of requi
    M06E0004  Changes to communication structure for release purch. d
    M06E0005  Role determination for release of purchasing documents
    ME590001  Grouping of requsitions for PO split in ME59
    MEETA001  Define schedule line type (backlog, immed. req., previe
    MEFLD004  Determine earliest delivery date f. check w. GR (only P
    MELAB001  Gen. forecast delivery schedules: Transfer schedule imp
    MEQUERY1  Enhancement to Document Overview ME21N/ME51N
    MEVME001  WE default quantity calc. and over/ underdelivery toler
    MM06E001  User exits for EDI inbound and outbound purchasing docu
    MM06E003  Number range and document number
    MM06E004  Control import data screens in purchase order
    MM06E005  Customer fields in purchasing document
    MM06E007  Change document for requisitions upon conversion into P
    MM06E008  Monitoring of contr. target value in case of release or
    MM06E009  Relevant texts for "Texts exist" indicator
    MM06E010  Field selection for vendor address
    MM06E011  Activate PReq Block
    MMAL0001  ALE source list distribution: Outbound processing
    MMAL0002  ALE source list distribution: Inbound processing
    MMAL0003  ALE purcasing info record distribution: Outbound proces
    MMAL0004  ALE purchasing info record distribution: Inbound proces
    MMDA0001  Default delivery addresses
    MMFAB001  User exit for generation of release order
    welli mstill searching for that particular enhancement for ur requirment if i found i will let u know
    this the enhancement that u can use
    MEQUERY1  Enhancement to Document Overview ME21N/ME51N
    in this
    u can use the following componets
    EXIT_SAPLMEQUERY_001
    EXIT_SAPLMEQUERY_002
    also there is one more
    MM06E005 Customer fields in purchasing document
    Cheers
    Snehi
    Edited by: snehi chouhan on Jul 31, 2008 1:32 PM

  • Can we add the standard includes inside a function exit.

    Hi,
    Can we add the standard includes inside a function exit.
    I want to add 4 to 5 standard includes. If iam adding it it says report or program already exists.
    Can anyone tell me is it possible or we can modify the only the data which is coming to that function module .
    Please help me on this.
    Thanks,
    Rose.

    hi santhosh,
      The data needed for those includes are also exist in the funtion module exit. I want to add those includes and in one include just i want to add some 10 to 15 lines of code. Is it possible.
    If i include all those includes inside the function exit it says report or program name already exists. When i double clicked on the error it takes me to a line in 1 include which has function-pool statement.
    How can i eradicate this error.
    Can u please help me on this.

  • Locks to KM files created long time ago still exist

    It was found in our portal that locks to some KM files still exist after one year has passed.
    I understand that I can unlock the file one by one. My questions are:
    1. How to unlock all of the files in one shot? I tried to just unlock the
    whole folder but it seems it does not work. The only way I found is
    either to unlock them one by one or run the resource report which can
    unlock all the locked files.
    2. What is the possible reason that those locks still exist after one
    year of the lock creation time and what is the step we can take to
    prevent this from happening again?
    Thanks!

    Hi,
    You can use the [Resource Locks Report|http://help.sap.com/saphelp_nw04/helpdata/en/14/a4d14030490b06e10000000a155106/frameset.htm] to unlock all the locked files in a given scope.
    It will be available in Content Administration -> KM Content -> Tool Box-> Reports
    I dont think locks will be removed even after 1 year without doing any thing to unlock
    The lock may remain. Also we cannot have a permission only to lock/unlock a resource.
    We can by the way remove the lock command from a specific KM Layout.
    Regards
    BP

  • Is WebClient still existing in CRM7.0?

    Experts:
    Information about CRM WebClient is only seen under CRM2007 in SMP.
    Is WebClient still existing in CRM7.0?
    Blogs and links appreciated.
    Best regards!

    Very much. Indeed going from strength to strength, got more advanced. I guess folks at SAP are taking time to keep pace with the documentation in SMP. The CRM 7 section is yet to be updated in SMP with more Webclient UI documentation. An SAP insider may throw more light on this.

Maybe you are looking for

  • The duplex issue in the Crystal report

    I am developing Purchase Order print document.  <p class="MsoNormal">I have a Crystal Reports 9 for Visual Studio .NET.</p>  <p class="MsoNormal">My program prints set of the P/Os and each of metioned P/O has its own Terms and Condition Information.(

  • Pages 5.0 update - documents not opening

    Pages has been updated to 5.0.  Previous documents had information removed and then will not open saying that a higher version of Pages is required.  New documents I have created since the update will also not open saying that I need a higher version

  • I created an extra iTunes library for my wife and now i can't find either of them

    I created an extra iTunes library for my wife by following the instructions on Apples website and everything was working perfect. So when I opened iTunes i could select whether i was using her phone or mine. Everything was perfect then today I have t

  • [Microsoft][ODBC SQL Server Driver][SQL Server]

    I have a stored procedure named windog_ReadSpecifications in a database called AssetDB and schema dbo, one of my users is getting the following errors when she try's to use a program which executes the stored procedure  "Error description:COM error m

  • Flickr integration with Front Row?

    I have what I think is the latest version of Front Row (2.2.1, 314). I've seen some conflicting hearsay on the various web forums that there is a way to view flickr photos within Front Row. But I don't see that functionality in Front Row. Anyone know