on ‎2006 Aug 22 11:02 PM
I'm learning and loving Ruby, before I move to Rails....So I got a question....I haven't install RFC for Ruby yet....But....Can I connect to SAP from Ruby??? I mean....Just from Ruby, like a terminal server??? Maybe it's a silly question...but I just wanted to know that -:)
Greetings,
Blag.
Help others by sharing your knowledge.
AnswerRequest clarification before answering.
Hi Blag,
this test script shows you the different possibilities with RFC Calls. Tables for Import and Export, Structures, ...
require 'test/unit'
require 'test/unit/assertions'
require 'rubygems'
require_gem 'saprfc'
class SAPTest < Test::Unit::TestCase
# Login Data
@@partneremployeeid = "111"
@@password = "test1"
@@newpassword = "test2"
# Product Data
@@material = 'P-100'
@@unit = ''
# Values set during Test
@@customer = ''
@@salesorg = ''
@@subtotal1 = ''
@@subtotal2 = ''
def setup
SAP::Rfc.useCache = true
@rfc = SAP::Rfc.new(
:ashost => "your.server",
:sysnr => 00,
:lang => "EN",
:client => "800",
:user => "user",
:passwd => "password",
:trace => 0
)
end
def test_CSC_00005_Login
# Check Password
pwcheck = @rfc.discover("BAPI_PAR_EMPLOYEE_CHECKPASSWOR")
pwcheck.PARTNEREMPLOYEEID.value = @@partneremployeeid
pwcheck.PASSWORD.value = @@password
@rfc.call(pwcheck)
ret = pwcheck.RETURN.value
assert(ret['TYPE'] == 'S')
# Get Customer Number
excheck = @rfc.discover("BAPI_PAR_EMPLOYEE_CHECKEXISTEN")
excheck.PARTNEREMPLOYEEID.value = @@partneremployeeid
@rfc.call(excheck)
@@customer = excheck.CUSTOMER.value
assert( @@customer != nil)
#puts "nCustomer Number: " + @@customer
# Get Sales Areas
getsalesareas = @rfc.discover("BAPI_CUSTOMER_GETSALESAREAS")
getsalesareas.CUSTOMERNO.value = @@customer
@rfc.call(getsalesareas)
ret = getsalesareas.RETURN.value
assert(ret['TYPE'] == 'S')
getsalesareas.SALESAREAS.hashRows {|x| @@salesorg = x['SALESORG'] }
assert(@@salesorg == '1000')
end
def test_CSC_00010_CustomerDetail
customerdetail = @rfc.discover("BAPI_CUSTOMER_GETDETAIL2")
customerdetail.CUSTOMERNO.value = @@customer
@rfc.call(customerdetail)
ret = customerdetail.RETURN.value
assert(ret['TYPE'] != 'E')
address = customerdetail.CUSTOMERADDRESS.value
puts "nCustomer Name: " + address['NAME']
assert( address['NAME'] != nil )
end
def test_CSC_00012_ContactDetail
contactdetail = @rfc.discover("BAPI_BUSPARTNEREMPLOYE_GETLIST")
idrange = contactdetail.IDRANGE.structure
idrange.SIGN.value = 'I'
idrange.OPTION.value = 'EQ'
idrange.LOW.value = @@partneremployeeid
contactdetail.IDRANGE.value = [ idrange.value ]
@rfc.call(contactdetail)
contactdetail.ADDRESSDATA.hashRows {
|x|
assert( x['LASTNAME'] != nil )
puts "nContact last name: " + x['LASTNAME']
}
end
def test_CSC_00015_ChangePassword
# Change Password
changepassword = @rfc.discover("BAPI_PAR_EMPLOYEE_CHANGEPASSWO")
changepassword.PARTNEREMPLOYEEID.value = @@partneremployeeid
changepassword.PASSWORD.value = @@password
changepassword.NEW_PASSWORD.value = @@newpassword
changepassword.VERIFY_PASSWORD.value = @@newpassword
@rfc.call(changepassword)
ret = changepassword.RETURN.value
assert(ret['TYPE'] == 'S')
# Back to default
changepassword.PASSWORD.value = @@newpassword
changepassword.NEW_PASSWORD.value = @@password
changepassword.VERIFY_PASSWORD.value = @@password
@rfc.call(changepassword)
ret = changepassword.RETURN.value
assert(ret['TYPE'] == 'S')
end
def test_CSC_00020_Salesorders
# Salesorder List
salesorderlist = @rfc.discover("BAPI_SALESORDER_GETLIST")
salesorderlist.CUSTOMER_NUMBER.value = @@customer
salesorderlist.SALES_ORGANIZATION.value = @@salesorg
salesorderlist.TRANSACTION_GROUP.value = 0
@rfc.call(salesorderlist)
ret = salesorderlist.RETURN.value
assert(ret['TYPE'] != 'E')
salesorderlist.SALES_ORDERS.hashRows {|x| @sddoc = x['SD_DOC'] }
assert( @sddoc != nil)
puts "nSales Document Number: " + @sddoc
# Salesorder
salesorder = @rfc.discover("BAPISDORDER_GETDETAILEDLIST")
view = salesorder.I_BAPI_VIEW.structure
view.HEADER.value = 'X'
view.ITEM.value = 'X'
salesorder.I_BAPI_VIEW.value = view.value
salesdocs = salesorder.SALES_DOCUMENTS.structure
salesdocs.VBELN.value = @sddoc
salesorder.SALES_DOCUMENTS.value = [ salesdocs.value ]
@rfc.call(salesorder)
salesorder.ORDER_ITEMS_OUT.hashRows {|x| @doc_number = x['DOC_NUMBER'] }
assert( @sddoc == @doc_number )
end
def test_CSC_00030_MaterialDetails
# Material Detail
materialdetail = @rfc.discover("BAPI_MATERIAL_GET_DETAIL")
materialdetail.MATERIAL.value = @@material
@rfc.call(materialdetail)
ret = materialdetail.RETURN.value
assert(ret['TYPE'] == 'S')
materialgeneral = materialdetail.MATERIAL_GENERAL_DATA.value
@@unit = materialgeneral['BASE_UOM']
assert( @@unit != nil)
puts "nMaterial Unit: " + @@unit
end
def test_CSC_00040_Availability
materialavailability = @rfc.discover("BAPI_MATERIAL_AVAILABILITY")
materialavailability.MATERIAL.value = @@material
materialavailability.UNIT.value = @@unit
# Read Plants of Material
materialplants = @rfc.discover("MATERIAL_READ_PLANTS")
materialplants.MATNR.value = @@material
@rfc.call(materialplants)
# Check Availability for every Plant
totalavailability = 0.0
materialplants.PLANTS.hashRows {
|x|
@plant = x['WERKS']
materialavailability.PLANT.value = x['WERKS']
@rfc.call(materialavailability)
assert( materialavailability.AV_QTY_PLT.value != nil)
totalavailability = totalavailability + materialavailability.AV_QTY_PLT.value.to_f
}
assert( totalavailability >= 0)
puts "nAvailability total: " + totalavailability.to_s
end
def test_CSC_00050_Price
salesordersimulate = @rfc.discover("BAPI_SALESORDER_SIMULATE")
# Order Header
orderheader = salesordersimulate.ORDER_HEADER_IN.structure
orderheader.DOC_TYPE.value = 'AG'
orderheader.SALES_ORG.value = @@salesorg
# This is needed because of an error in saprf-0.18
orderheader.REQ_DATE_H.value = '00000000'
orderheader.PURCH_DATE.value = '00000000'
orderheader.PRICE_DATE.value = '00000000'
orderheader.QT_VALID_F.value = '00000000'
orderheader.QT_VALID_T.value = '00000000'
orderheader.CT_VALID_F.value = '00000000'
orderheader.CT_VALID_T.value = '00000000'
salesordersimulate.ORDER_HEADER_IN.value = orderheader.value
# Order Items
orderitems = salesordersimulate.ORDER_ITEMS_IN.structure
orderitems.MATERIAL.value = @@material
orderitems.REQ_QTY.value = '0000000001000'
salesordersimulate.ORDER_ITEMS_IN.value = [ orderitems.value ]
# Order Partners
orderpartners = salesordersimulate.ORDER_PARTNERS.structure
orderpartners.PARTN_ROLE.value = 'AG'
orderpartners.PARTN_NUMB.value = @@customer
salesordersimulate.ORDER_PARTNERS.value = [ orderpartners.value ]
# Call Function
@rfc.call(salesordersimulate)
ret = salesordersimulate.RETURN.value
puts "nReturn Message: " + ret['MESSAGE']
salesordersimulate.ORDER_ITEMS_OUT.hashRows {
|x|
@@subtotal1 = x['SUBTOTAL1'].to_f
@@subtotal2 = x['SUBTOTAL2'].to_f
assert( 0 < @@subtotal1)
assert( 0 < @@subtotal2 )
assert( @@subtotal1 >= @@subtotal2 )
}
puts "nList Price: " + @@subtotal1.to_s
puts "Net Price: " + @@subtotal2.to_s
end
def teardown
@rfc.close()
end
end
Regards
Gregor
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hi - not sure that I fully understand your question -
You can write standalone scripts in Ruby to call RFC functions, such as:
require 'saprfc'
rfc = SAP::Rfc.new(...)
i = rfc.discover('RFC_READ_REPORT')
i.program.value = 'RSDBRUNT'
rfc.call(i)
i.qtab.hashRows{|r|
puts r['LINE']
}
rfc.close
If need actual control via the diag protocol of the GUI then you need to look at OLE automation for Ruby + the GUI automation controls.
Cheers.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.