SAP Basis, Functional and ABAP Programming Reference Books
Persistent key

-----Original Message-----
Subject: persistent key 

Hi all,
i'm new in bapi programming, i'm trying to call GetList method from
GeneralLedgerAccount Business Object, and got this error message 'The
persistent key for an bussiness object instance of type GeneralLedgerAccount
has not been set. Cannot invoke method GetList'.
How can i set the persistent key, and what is the persistent key exactly ?
How can i check the persistent key in the BOR ?
I'm using SAP R/3 version 3.1g and VB version 6.0

-----Reply Message-----
Subject: RE: persistent key 

Although we are currently using SAP 4.0B, the GeneralLedgerAccount BAPI has not changed 
significantly (if at all). I have had this error message many times working with HR BAPI's and it 
took a lot of research to finally puzzle out what SAP actually wants in these situations. On the 
other hand, I took a look at the GetList method for this BAPI and I cannot see why you would 
be getting this error! There are three kinds of BAPI's I have encountered so far - those that 
return actual tables of data based on key fields you fill in (ie. Employee.GetList), those 
that return tables of keys that point to the actual data within SAP (think of C pointers! ie.
EmployeePersonalData.GetList), and BAPI's that have no input parameters at all but can retrieve 
extra information directly related to a particular 'instance' of a business object that you have 
previously 'instantiated' (translation - the last 'record' you 'read' from the table! ie. 
EmployeePersonalData.GetDetail). GeneralLedgerAccount is of the first type, while the error you get 
is related to BAPI's of the third type. It is usually caused by calling a GetDetail method without 
calling GetSAPObject with a complete, unique key value first. The following code fragment 
shows how I read Employee.GetList - this may shed some light on what you might be missing. The 
second fragment shows how to 'instantiate' a 'persistant' object (don't we just love this 
terminology?) before calling a GetDetail BAPI. Hope this helps you out!

===================================================
Dim oBapiControl As Object
Dim oConnection As Object
Dim oEmployee As Object
Dim oReturn As Object
Dim otabPersonalData As Object
Dim otabOrgAssignment As Object
Dim oRow As Object

oBapiControl = CreateObject("SAP.BAPI.1")
Set oConnection = oBapiControl.Connection
'SET UP ALL oConnection PARAMETERS HERE AND CALL oConnection.Logon(0, True)
Set oEmployee = oBapiControl.GetSAPObject("Employee")
oEmployee.Getlist Lastname:="*", _
                           Return:=oReturn, _
                           PersonalData:=otabPersonalData, _
                           OrgAssignment:=otabOrgAssignment
For Each oRow In otabPersonalData.Rows
    Print "Personnel Number = " + oRow.Value("PERNO")
...
Next oRow

 - Substitute the word 'GeneralLedgerAccount' for 'Employee' and this should work for you!

===================================================
Private Sub LoadFamily(sPerno As String)
  Dim cSep           As String * 1
  Dim sToday         As Date
  Dim oCol           As Object
  Dim oDelRow        As Object
  Dim oReturn        As Object
  Dim oFReturn       As Object
  Dim otabFKeyList   As Object
  Dim oFamilyKey     As Object
  Dim oFamilyMem     As Object
  Dim sFirstName     As String
  Dim sSecondName    As String
  Dim sLastName      As String
  Dim sGender        As String
  Dim sBirthdate     As Date

  cSep = Chr(9)
  sToday = Date

  ' RETRIEVE ALL FAMILY MEMBERS FOR A GIVEN PERSONNEL NUMBER.
  ' NOTE THAT THE BAPI RETURNS A TABLE OF KEYS (Familykey) AND
  ' NOT THE ACTUAL DATA!
  Set otabFKeyList = Nothing
  oFamilyMembers.Getlist EmployeeNumber:=sPerno, _
                            Subtype:="", _
                            Timeintervallow:=sToday, _
                            Timeintervalhigh:=sToday, _
                            Return:=oFReturn, _
                            Familykey:=otabFKeyList
  If oFReturn.Value("TYPE") <> "E" Then             'IF THE CALL SUCCEEDED,
    For Each oFamilyKey In otabFKeyList.Rows         THEN FOR EACH KEY IN THE TABLE... 
      On Error Resume Next
      ' INSTANTIATE A PERSISTANT LOCAL BUSINESS OBJECT HERE USING THE
      ' FULL KEY VALUE
      Set oFamilyMem = oBapiControl.GetSAPObject("EmployeeFamilyMember", _
                                                  oFamilyKey.Value("EMPLOYEENO"), _
                                                  oFamilyKey.Value("SUBTYPE"), _
                                                  oFamilyKey.Value("OBJECTID"), _
                                                  oFamilyKey.Value("LOCKINDIC"), _
                                                  oFamilyKey.Value("VALIDEND"), _
                                                  oFamilyKey.Value("VALIDBEGIN"), _
                                                  oFamilyKey.Value("RECORDNR"))
      If Err.Number = 0 Then                               ' AND IF THAT WORKED, THEN FINALLY
        ' WE CAN GET THE INFORMATION WE WANT BY CALLING GETDETAIL. THIS BAPI
        ' USES THE KEY INFORMATION IN THE FamilyMem OBJECT TO IDENTIFY THE SAP
        ' DATA THAT SHOULD BE RETURNED....VERY COMPLEX!!!
        oFamilyMem.GetDetail Return:=oReturn, _
                             Firstname:=sFirstName, _
                             Initials:=sSecondName, _
                             Lastname:=sLastName, _
                             Gender:=sGender, _
                             Dateofbirth:=sBirthdate
        If oReturn.Type <> "E" Then
          Print #2, sPerno; cSep; _
                    sFirstName; cSep; _
                    sSecondName; cSep; _
                    sLastName; cSep; _
                    sGender; cSep; _
                    sBirthdate; cSep; _
                    " "
        End If
      Else
        Err.Clear
      End If
    Next oFamilyKey
  End If
End Sub
===================================================

-----End of Message-----
 

Best regards,
SAP Basis, ABAP Programming and Other IMG Stuff
http://www.sap-img.com