cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Silly question about RFC for Ruby...

Former Member
0 Likes
452

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.

Accepted Solutions (1)

Accepted Solutions (1)

gregorw
SAP Mentor
SAP Mentor
0 Likes

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

Former Member
0 Likes

Thanx <b>Piers</b>, you got my question right -;) Thanx for the example...But...Gregor code is far more complete -:D So I must give him the 10 points...sorry -:)

Greetings,

Blag.

Answers (1)

Answers (1)

Former Member
0 Likes

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.