Si encontraste la información que buscabas, o si te pareció interesante. Considera hacer una donación

Ejemplo de conexiones SAP R/3 y VB.net 2005

En este proyecto personal de ingreso de pedidos a SAP usamos vb.net  y ABAP 4 de lado del servidor. En este ejemplo solo vamos a explicar cómo hacer una simple consulta de clientes para registrar su pedido.

Herramientas a utilizar:

  • Microsoft Visual Studio .NET 2005
  • Microsoft .NET Data Provider for mySAP.
  • SAP R/3. 

 

 

Manos a la obra 

Primer paso:

Abrimos un proyecto nuevo en VB.net  y le ponemos como nombre “RFCClientes”

 

Segundo paso:

  Referenciamos a la librería del sap provider .

 

Puedes descargar gratis de aquí: http://msdn2.microsoft.com/en-us/library/ms141761.aspx el data provider my sap.

Tercer paso:

Creamos en el form los siguientes componentes:

·         2 textbox

  • TxtDescripcion 
  • TxtDireccion

·         2 maskedtextbox

  • TxtCod1 
  • TxtCod2

·         1 datagridview

  • DataGridView1

·         1 button

  • BtnPresentar

Debe quedar la pantalla más o menos así:

 

Cuarto paso:

 

Crear un paquete de funciones en SAP usando la transacción SE80, damos click derecho a Grupo funciones, Crear,  ponen como nombre “ZKNA1” y una descripción del paquete.


Y dan grabar.

Quinto paso.

Creamos una tabla física llamada. “ZBRFCKNA1” con la transacción SE11.



Grabamos y Activamos 

Sexto paso:

Creamos la función en sap que nos traiga la consulta de los clientes, usamos la transacción SE37.

Le damos un nombre “Z_FI_CLIENTE” y creamos.

Debemos poner en la pestaña de atributos la opción de “Módulo de acceso remoto”



Luego establecemos valores de entrada en “Import”.



Establecemos en la parte de Tablas una referencia llamada “TABCLIENTE”.



Por último el código fuente.



En detalle:

FUNCTION Z_FI_CLIENTE.

*"----------------------------------------------------------------------

*"*"Interfase local

*"  IMPORTING

*"     VALUE(KUNNR1) LIKE  KNA1-KUNNR DEFAULT SPACE

*"     VALUE(KUNNR2) LIKE  KNA1-KUNNR DEFAULT SPACE

*"     VALUE(NAME1) LIKE  KNA1-NAME1 DEFAULT SPACE

*"     VALUE(STRAS) LIKE  KNA1-STRAS DEFAULT SPACE

*"  TABLES

*"      TABCLIENTE STRUCTURE  ZBRFCKNA1

*"----------------------------------------------------------------------

IF KUNNR2 = ''.

  SELECT KNA1~KUNNR KNA1~STCD1 KNA1~ANRED KNA1~NAME1

  KNA1~ORT01 KNA1~STRAS

  KNA1~TELF1 KNA1~TELFX KNVI~TAXKD INTO TABLE TABCLIENTE

  FROM ( KNA1

           inner join KNB1

           on  KNB1~KUNNR = KNA1~KUNNR

           inner join KNVI

           on  KNVI~KUNNR = KNB1~KUNNR )

  WHERE KNB1~BUKRS EQ 'GRUP'

    AND KNA1~KUNNR LIKE KUNNR1

    AND KNA1~NAME1 LIKE NAME1

    AND KNA1~STRAS LIKE STRAS.

ELSE.

  SELECT KNA1~KUNNR KNA1~STCD1 KNA1~ANRED KNA1~NAME1

  KNA1~ORT01 KNA1~STRAS

  KNA1~TELF1 KNA1~TELFX KNVI~TAXKD INTO TABLE TABCLIENTE

  FROM ( KNA1

           inner join KNB1

           on  KNB1~KUNNR = KNA1~KUNNR

           inner join KNVI

           on  KNVI~KUNNR = KNB1~KUNNR )

  WHERE KNB1~BUKRS EQ 'GRUP'

    AND KNA1~KUNNR BETWEEN KUNNR1 AND KUNNR2

    AND KNA1~NAME1 LIKE NAME1

    AND KNA1~STRAS LIKE STRAS.

ENDIF.
 

ENDFUNCTION.

 

Como vez el código es muy simple, hacemos una validación cuando hay un segundo código del cliente realiza el siguiente query.

Grabamos y Activamos.

Séptimo Paso:

El código VB.net:

Imports Microsoft.Adapter.SAP

Public Class Form1

    Private Sub BtnPresentar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnPresentar.Click

        Me.Cursor = System.Windows.Forms.Cursors.WaitCursor

        Try

            Dim sSql As String = "EXEC Z_FI_CLIENTE " 

            If Me.TxtCod1.Text.Length > 0 Then 

                Dim Cod1 As String = Me.TxtCod1.ToString.Substring(Me.TxtCod1.ToString.Length - 10)

                If Me.TxtCod2.Text.Length > 0 Then

                    Dim Cod2 As String = Me.TxtCod2.ToString.Substring(Me.TxtCod2.ToString.Length - 10) 

                    sSql &= "@KUNNR1='" & Cod1 & "'"

                    sSql &= ",@KUNNR2='" & Cod2 & "'"

                Else

                    sSql &= "@KUNNR1='" & Cod1 & "',@KUNNR2=''"

                End If

            Else 

                sSql &= "@KUNNR1='%',@KUNNR2=''"

            End If

 

            If Me.TxtDescripcion.Text.Trim.Length > 0 Then 

                sSql &= ",@NAME1='" & Me.TxtDescripcion.Text.Trim & "'" 

            Else

                sSql &= ",@NAME1='%'"

            End If

 

            If Me.TxtDireccion.Text.Trim.Length > 0 Then

                sSql &= ",@STRAS='" & Me.TxtDireccion.Text.Trim & "'"

            Else

                sSql &= ",@STRAS='%'"

            End If 

            Dim I As SAPConnection = New SAPConnection

            Dim Cont As Long = 0

            I.ConnectionString = "ASHOST=192.168.0.180;SYSNR=0;CLIENT=200;USER=IOBREGON;PASSWORD=******;LANG=EN"

            I.Open()  

            Dim R As SAPCommand = New SAPCommand(I)

            R.CommandText = sSql

            R.CommandType = CommandType.Text

            Dim Dr As SAPDataReader = R.ExecuteReader() 

            Dim intCol As Integer

            Me.DataGridView1.Rows.Clear()

            Me.DataGridView1.Columns.Clear()

            For intCol = 0 To Dr.FieldCount - 1

                Me.DataGridView1.Columns.Add(Dr.GetName(intCol), Dr.GetName(intCol))

            Next 

            While Dr.Read

                Dim objCelulas(intCol) As Object

                Dr.GetValues(objCelulas) 

                Me.DataGridView1.Rows.Add(objCelulas)

            End While 

            Me.DataGridView1.Columns(0).HeaderText = "Código"

            Me.DataGridView1.Columns(1).HeaderText = "Identificación"

            Me.DataGridView1.Columns(2).HeaderText = "Trato"

            Me.DataGridView1.Columns(2).Width = 80

            Me.DataGridView1.Columns(3).HeaderText = "Nombre"

            Me.DataGridView1.Columns(3).Width = 220

            Me.DataGridView1.Columns(4).HeaderText = "Ciudad" 

            Me.DataGridView1.Columns(5).HeaderText = "Dirección"

            Me.DataGridView1.Columns(6).HeaderText = "Teléfono" 

            Me.DataGridView1.Columns(7).HeaderText = "Fax" 

            Me.DataGridView1.Columns(8).HeaderText = "IVA"

            Me.DataGridView1.Columns(8).Width = 80

            Dr.Close()

            I.Close()

            I.Dispose()

            If Me.DataGridView1.RowCount <= 1 Then Me.DataGridView1.Item(1, 0).Value = "No se produjo resultados"

            Me.DataGridView1.Focus()

        Catch Ex As Exception 

            System.Windows.Forms.MessageBox.Show("No pudo realizar la consulta por: " & Ex.Message, "Mensaje del Sistema", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Exclamation)

        End Try 

        Me.Cursor = System.Windows.Forms.Cursors.Default

    End Sub

End Class 

  


y listo

Se pueden descargar el proyecto completo: RFCClientes.rar (86,88 kb)

Cualquier cosa estoy para ayudarlos


Actualmente calificado con 5.0 por 3 personas

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:
Categories: .NET | Programación | SAP
Acciones: E-mail | Permalink | RSS ComentariosRSS comentarios

51 Comentarios

Publicaciones relacionadas

Comentarios

Marwing

febrero 2. 2009 11:19

Lo máximo doc, voy hacer la prueba.

Slds,
MGK

Jonathan Barrio

marzo 8. 2009 00:49

Hola,

No tiene mucho que ver con este post pero estoy investigando sobre la conexión de SAP a una base de datos Oracle. A lo mejor me puedes guiar un poco.

He visto que utilizas SQL nativo para llamar a la función ? "EXEC Z_FI_CLIENTE "

Y para abrir la conexión a R/3 utlizas una cadena con ciertos parametros ¿es así también cuando sale de R/3 a otra base de datos u otro sistema?

Dim I As SAPConnection = New SAPConnection

Dim Cont As Long = 0

I.ConnectionString = "ASHOST=192.168.0.180;SYSNR=0;CLIENT=200;USER=IOBREGON;PASSWORD=******;LANG=EN"

Supongo que lo de llamar a la ".DLL" es porque el código que creamos lo estamos introduciendo ahí, ¿pero esta esta en nuestro equipo local donde tenemos el cliente SAP o es del servidor?

Las siguientes asignaciones:

sSql &= "@KUNNR1='" & Cod1 & "'"

sSql &= ",@KUNNR2='" & Cod2 & "'"

PErtenecen a SQL DINAMICO ¿ES ASÍ? qué creo también se puede usar en R/3, por ello me imagino que la clave está en crear un pequeño programa en el servidor, que identifique estas variables y sepa dónde tiene que mandarlas o como utilizaras.

Disculpa que me haya extendido y más no siendo el tema del post.

Desde ya muchas Gracias.

Un post muy interesante... y eso que a parte de Abap no conozco nada de otros lenguajes pero creo que se ha entendido perfecto.. (y) buen trabajo.


marzo 12. 2009 11:14

En el mundo de la informática todo es posible y una de la herramientas que mas uso en mis desarrollos son los web services, que puedes crearlos o usar los de sap implementándolos con BAPIS o Librerias de funciones que interactuar con otras plataformas y lenguajes.

Jonathan Barrio

marzo 14. 2009 18:44

ok... GRACIAS por la indicación.

Desconozco que son los web services, imagino que es como BSP que te da servicios de R/3 mediante un explorador desde internet,.

En un caso que me han comentado se hace mediante ODBC y buscaban la instrucción para conectar a la otra base de datos debe ser algo así como la del ejemplo:
"Dim I As SAPConnection = New SAPConnection"

desde sap "SAPCONECT TO"...

Saludos y gracias.

abril 3. 2009 03:01

thank for the information because it helps me a lot, very nice post, very helpfull

NeutroN

abril 5. 2009 17:21

Hola

Gracias por tu ejemplo esta muy bueno, pero necesito un favor

me puedes enviar el .dll a mi correo rulloap@terra.cl

Gracias

Nestor Ramirez S

abril 18. 2009 07:01

Excelente ejemplo, muchas gracias.
El único problema que tengo es que cuando cargo el DataView1 se me está concatenando los valores de la primera columna con la segunda, presentando en la columna Código del DataView el siguiente dato: 0000000234091704, me trae el dato del Código y me concatena parte de la idenficación.

Faltará algún parámetro?

Gracias.

Luis

mayo 14. 2009 19:45

Buenas tardes....

Bueno la verdad es que estoy tratando de hacer lo que dice en las instrucciones de la parte de arriba, solo que en mi sap no aparece la transaccion se37, antes de todo esto al parecer hiba bien (segun yo), bueno pero me gustaria que me agregues ivan si es que no es mucho pedir para que me puedas aclarar algunas dudas que tengo....mi correo es fredi_aya@hotmail.com sobre todo con la parte de las transacciones de sap ...

De antemano muchas gracias....
y espero tu respuesta lo mas pronto posibles porque estoy desesperado..... :S

mayo 16. 2009 17:29

Si no tienes acceso al se37 para crear funciones, puedes probar con la se80 object navigator, por que en todas las implementaciones de sap viene incluido las herramientas para desarrollo, lo que te falta es simplemente acceso a las mismas.
Suerte…!

Luis

mayo 18. 2009 06:11

Muchas gracias por responder Ivan...
Ahora solo las dudas que me quedan por aclarar vienen en la parte en donde creas la tabla, lo que pasa es que en la pestaña en donde Delivery and Maintenance justo debajo viene un texto que dice Delivery Class y a su lado aparecen todos los tipos de tablas a elegir escogiendolos por letras (A,C,L,G,E,S,W) y bueno pues ahi no se cual elegir ya que soy completamente nuevo en esto de SAP y tambien en la parte de la funcion no me deja establecer en la pestaña Import en el campo Typing la palabra LIKE solo me aparecen dos palabras (TYPE Y TYPE REF TO)en el campo Associated Type no me acepta los campos como tu los pones ( KNA1-KUNNR, KNA1-KUNNR , KNA1-NAME1 , KNA1-STRAS) solo me deja poner el nombre del campo de la tabla que creé, por ejemplo: ( KUNNR, -KUNNR , NAME1 , STRAS) y lo que a ti te sale asi:

FUNCTION Z_FI_CLIENTE.

*"----------------------------------------------------------------------

*"*"Interfase local
*" IMPORTING
*" VALUE(KUNNR1) LIKE KNA1-KUNNR DEFAULT SPACE
*" VALUE(KUNNR2) LIKE KNA1-KUNNR DEFAULT SPACE
*" VALUE(NAME1) LIKE KNA1-NAME1 DEFAULT SPACE
*" VALUE(STRAS) LIKE KNA1-STRAS DEFAULT SPACE
*" TABLES
*" TABCLIENTE STRUCTURE ZBRFCKNA1

*"----------------------------------------------------------------------


A mi me sale asi:

FUNCTION Z_FI_CLIENTE.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(KUNNR1) TYPE KUNNR DEFAULT SPACE
*" VALUE(KUNNR2) TYPE KUNNR DEFAULT SPACE
*" VALUE(NAME1) TYPE NAME1 DEFAULT SPACE
*" VALUE(STRAS) TYPE STRAS DEFAULT SPACE
*" TABLES
*" TABCLIENTE STRUCTURE ZBRFCKNA1
*"----------------------------------------------------------------------

Nuevamente gracias de antemano....Disculpa las molestias y mi ignorancia.....!!

mayo 24. 2009 05:28

Bueno en lo que respecta en la clase de entrega yo uso el tipo ‘L’ pero eso depende mucho de cuanta información vas almacenar en la tabla, por otra parte en la declaraciones de los tipos de datos puedes usar el LIKE o TYPE dependiendo a que referencias con el primero a un data element, el otro al global type y type standard, preferiblemente usa el Type pero que apunte al tipo de dato del campo de esa tabla, solo te ubicas en dicho campo, presionas F1 luego datos técnicos y te presenta dicha información.

Suerte…!

Luis

mayo 25. 2009 12:58

Gracias por la ayuda IVAN, solo que ahora tengo un problema diferente....
Cuando corro el programa de Visual Basic me aparece el siguien error:
No pudo realizar la consulta por : RFC Communication link error. Error Message 'Function Module "Z_READ_FUNCTION_METADATA" not found.'. y bueno, pues la verdad no se a que se deba si es que algo le falta a mi funcion...si algo esta mal con el Microsoft .NET Data Provider for mySAP. o no se......de verdad me gustaria que me pudieras ayudar ...... ¿ si es que asi lo deseas te puedo mandar el codigo de mi funcion....para que lo cheques y tambien te puedo mandar el Microsoft .NET Data Provider for mySAP.
que descargue y me puedas decir si es el correcto por favor.....claro si es que quieres.......GRACIAS COMO SIEMPRE POR TU AYUDA Y TU PACIENCIA

mayo 26. 2009 15:33

Ok compañero, con lo expuesto revisa en la función la pestaña de atributos que este seleccionado modulo de acceso remoto y activala, asegúrate que estés accediendo al mandante correcto porque el sap provider si te está haciendo conexión con sap.

Suerte…!

elliott

mayo 29. 2009 19:33

Hola, tengo una consulta, la empresa en la que trabajo ha comprado sap/r3 con oracle, y lo que quiero es agregar algunas funciones, vistas, y tablas Z, pero lo quiero hacer directamente en el oracle, ya que los voya consumir con el Excel, es posible esto?? restringe en algo sap, que haga este tipo de operaciones??.

Saludos.

julio 4. 2009 08:15

Estoy desarrollando en java una plicacion que llama a un rfc business connector por un xml, me dicen los desarrolladores de sap, que no pueden crear un rfc que contiene parametros de entrada y de salidaso, lo una o la otra, pero no ambas (en mi caso envio algunos parametros para que puedan ejecutar una sql en oracle y que retorne las filas) ...es eso verdad?? ..les ruego ayuda!

julio 5. 2009 10:06

Para nada, tú puedes crear funciones de tipo rfc con parámetros de salida o entrada entre estas tablas, estructuras y elementos de datos para ser usados desde cualquier programa externo, esto sí es claro.
Por otra parte si el conector que usas soporte la extracción de estas eso ya es otra cosa, con java nunca lo echo me gustaría probar si deseas compartir manda tu ejemplo de forma entendible a mi correo iobregon@systecsa.net para chequear.

julio 5. 2009 15:54

Ivan, he persivido que el desarrollador en sap le cuesta crear la función a partir del pl/sql que le envie , esta tiene muchas tablas, sql anidados, uniones, joins, etc. Osea es un monstruo de consulta ...me he dado cuenta que por tiempo esta intentando utilizar la misca query que le envie ...es posible esto? ...creo que si, y que por eso tiene problema con los parametros de entrada y de salida. Que opinas de esto?

septiembre 6. 2009 16:01

I havent any word to appreciate this post.....Really i am impressed from this post....the person who create this post it was a great human..thanks for shared this with us.

septiembre 13. 2009 15:14

We are a group of volunteers and starting a new initiative in a community. Your blog provided us valuable information to work on.You have done a marvellous job!

Alejandro

septiembre 16. 2009 23:04

Buenas, buenas

amigo, tienes ejemplos para el manejo de los parametros de entrada y salida??? Lo que pasa es que tengo una funcion RFC, que tiene un parametro Tabla de entrada/salida.
Puedo recuperar la tabla, mas no volver a guardarla.

Gracias por cualquier ayuda.

septiembre 18. 2009 03:16

sSql = "exec Z_MM_MAQUINA"
sSql &= " @CODMAQUIN = @cod_maq OUTPUT"
cmd.CommandType = CommandType.Text
cmd.CommandText = sSql

Dim param1 As SAPParameter = New SAPParameter("@cod_maq", ParameterDirection.Output)
Dim dr As SAPDataReader = cmd.ExecuteReader()
MsgBox(cmd.Parameters("@nom_maq").Value)

Y recuerden señores:
Compartir lo que sabes es contribuir al mundo del conocimiento el no hacerlo es un pecado en contra del desarrollo.

septiembre 28. 2009 04:18

I am pretty much impressed with your post and the blog is just cropping.

Juan Camilo

septiembre 29. 2009 09:23

que tal como estas.. oye me prodrias regalar un eejemplo de como llamar una bapi a traves de un webservice en .net 2005.

Gracias

octubre 20. 2009 03:21

Thanks for taking the time to discuss this, I feel strongly about it and love learning more on this topic. If possible, as you gain expertise, would you mind updating your blog with more information? It is extremely helpful and beneficial to your readers.

David

octubre 20. 2009 10:09

Buenas tardes.

Felicitarte por tú ejemplo porque es muy bueno. Yo estoy realizando una prueba con una tabla y me encuentro el mismo problema que otros que alguno de este post el famoso mensaje Z_READ_FUNCTION_METADATA. Hemos verificado el SAP y la tabla tiene permisos para todo. ¿Tenemos que habilitar algún modulo adicional en SAP? No se que más mirar.

Espero que me puedas ayudar.

Muchas gracias y un saludo.

octubre 21. 2009 04:25

Hello admin, I must admit that today is my first time I visit here. However, I have found so many interesting thing in your blog and I really love that. Keep up the good work!

noviembre 1. 2009 17:25

Hello admin, I must admit that today is my first time I visit here. However, I have found so many interesting thing in your blog and I really love that. Keep up the good work!

Jesus

noviembre 27. 2009 06:35

Buenas tardes.

Como algunos que tienen el mismo caso me marca el siguiente error el mensaje Z_READ_FUNCTION_METADATA. Actualmente lo tengo en mi PC y esta se conecta al server con el cliente SAP GUI. ¿Necesito algo mas?

Espero que me puedas ayudar.

Muchas gracias y un saludo.

diciembre 8. 2009 19:18

Desconozco que son los web services, imagino que es como BSP que te da servicios de R/3 mediante un explorador desde internet,.

enero 15. 2010 19:19

Most people give up just when they're about to achieve success.

febrero 1. 2010 01:56

Great write up - Thank you for sharing.

Añadir comentario


 

  Country flag

[b][/b] - [i][/i] - [u][/u]- [quote][/quote]