| 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
|