Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Salut,
quelqu'un a déjà utilisé PB pour récupérer des données dans SAP ?
J'ai fait qq recherches : sur le site de SAP, il y a des drivers ODBC, JDBC à utiliser.
J'ai essayé de me connecter en ODBC sans succès.
Sinon j'avais aussi trouvé un morceau de code en VB qui utilise un objet OLE (installé avec le client SAP):
Public Function GetSAPData() As Integer Dim ctlLogon As Object Dim funcControl As Object Dim ctlTableFactory As Object Dim objConnection As Object Dim booReturn As Boolean Dim RFC_READ_TABLE As Object Dim strExport1 As Object Dim strExport2 As Object Dim tblOptions As Object Dim tblData As Object Dim tblFields As Object Dim intRow As Integer Dim iStr_Split As Variant Dim iStr_SQL As String Dim iRec As Recordset Dim iBln_Prem As Boolean Dim iBln_Data As Boolean ecritLog "Connection à SAP." Set ctlLogon = CreateObject("SAP.LogonControl.1") Set funcControl = CreateObject("SAP.Functions") Set ctlTableFactory = CreateObject("SAP.TableFactory.1") Set objConnection = ctlLogon.NewConnection objConnection.ApplicationServer = fngGetParamString("SAPLogin", "ApplicationServer") objConnection.System = fngGetParamString("SAPLogin", "System") '"DE3" objConnection.SystemNumber = fngGetParamString("SAPLogin", "SystemNumber") '"0" objConnection.Client = fngGetParamString("SAPLogin", "Client") '"100" objConnection.Language = fngGetParamString("SAPLogin", "Language") '"FR" objConnection.User = fngGetParamString("SAPLogin", "User") ' Le User SAP objConnection.Password = fngGetParamMdP("SAPLogin", "Password") 'Le pass SAP booReturn = objConnection.Logon(0, True) If booReturn <> True Then ecritLog "Impossible de se logger à SAP." GoTo Erreur Else ecritLog "Connection à SAP OK." funcControl.Connection = objConnection Set RFC_READ_TABLE = funcControl.Add("RFC_READ_TABLE") Set tblOptions = RFC_READ_TABLE.Tables("OPTIONS") Set tblData = RFC_READ_TABLE.Tables("DATA") Set strExport1 = RFC_READ_TABLE.Exports("QUERY_TABLE") Set strExport2 = RFC_READ_TABLE.Exports("DELIMITER") strExport1.Value = "VBKD" strExport2.Value = "|" iStr_SQL = "SELECT DocVente, DocVentePoste " & _ "FROM Commandes " & _ "WHERE not(InfoEnvoyee) " Set iRec = gObj_DataBase.OpenRecordset(iStr_SQL) iBln_Prem = True intRow = 2 Set tblFields = RFC_READ_TABLE.Tables("FIELDS") tblFields.AppendRow tblFields(1, "FIELDNAME") = "VBELN" tblFields.AppendRow tblFields(2, "FIELDNAME") = "POSNR" tblFields.AppendRow tblFields(3, "FIELDNAME") = "BSTKD" tblFields.AppendRow tblFields(4, "FIELDNAME") = "BSTKD_E" If Not iRec.EOF Then tblOptions.AppendRow tblOptions.AppendRow End If ecritLog "Récupération des données (Numéros de commande) dans SAP." While Not iRec.EOF tblOptions(1, "TEXT") = "VBELN EQ '" & iRec.Fields(0).Value & "'" tblOptions(2, "TEXT") = " AND POSNR EQ '" & Left("000000", 6 - Len(iRec.Fields(1).Value)) & iRec.Fields(1).Value & "'" If RFC_READ_TABLE.Call = True Then Else ecritLog "Erreur lors de la récupération des données : " & RFC_READ_TABLE.exception objConnection.Logoff GoTo Erreur End If iRec.MoveNext Wend If tblData.RowCount > 0 Then For intRow = 1 To tblData.RowCount iStr_Split = Split(tblData(intRow, "WA"), "|") iStr_SQL = "Update COMMANDES " & _ "set BSTKD = '" & Left(Trim(iStr_Split(2)), Len(Trim(iStr_Split(2))) - 3) & "', " & _ "BSTKD_E = '" & Trim(iStr_Split(3)) & "' " & _ "WHERE DocVente = '" & iStr_Split(0) & "' " & _ "AND DocVentePoste = " & iStr_Split(1) gObj_DataBase.Execute iStr_SQL, dbFailOnError ecritLog "Récupération des données OK pour la commande " & iStr_Split(0) & " - " & iStr_Split(1) Next Else ecritLog "Pas de données récupérées." ' pour la commande " ' & iStr_Split(0) & " - " & iStr_Split(1) End If iRec.Close objConnection.Logoff Set objConnection = Nothing Set ctlLogon = Nothing Set funcControl = Nothing Set ctlTableFactory = Nothing Set RFC_READ_TABLE = Nothing Set strExport1 = Nothing Set strExport2 = Nothing Set tblOptions = Nothing Set tblData = Nothing Set tblFields = Nothing
Merci d'avance pour toute info
Hors ligne
Bonjour à tous
Je suis preneur aussi et je cherche aussi de mon coté
Cordialement
Hors ligne
Excuses moi, mais je comprend pas trop ta question.
La société SAP ditribuait une base de données sous le nom "SAP DB", et en a fait don à la société "MYSQL AB" qui l'a rennomée en "MaxDB".
C'est de ça que tu parles ?
Sinon, les progiciels SAP s'installent sur n'importe quel SGBD : Oracle, Sybase, etc...
Dans ce cas, tu te connecte à Oracle, Sybase, etc...
Enfin tu as essayé de traduire le code VB en PB avec un OleObject ?
Hors ligne
A ta place j'irai directement au siège de SAP à Walldorf. Vu que c'est en forêt noire, tu pourra acheter un coucou
Hors ligne
en fait, je cherche à récupérer des valeurs de SAP via PB (p.ex stock pour une ref donnée)
voilà le code en PB : (un peu différent du VB, utilisation de SAP.BAPI.1)
OLEObject lole_bapi, lole_logon Integer li_ret // 1. création ole SAP.BAPI.1 lole_bapi = Create OLEObject li_ret = lole_bapi.ConnectToNewObject( 'SAP.BAPI.1' ) // 2. création ole SAP.LogonControl.1 lole_logon = Create OLEObject li_ret = lole_logon.ConnectToNewObject( 'SAP.LogonControl.1' ) // 3. nouvelle connexion lole_bapi.Connection = lole_logon.NewConnection() // 4. paramètres lole_bapi.Connection.ApplicationServer = 'aaa.bbb.ccc.ddd' lole_bapi.Connection.System = 'eee' lole_bapi.Connection.SystemNumber = '12' lole_bapi.Connection.Client = '011' lole_bapi.Connection.Language = 'FR' lole_bapi.Connection.User = 'user' lole_bapi.Connection.Password = 'mdp' // 5. Logon lole_bapi.Connection.Logon( 0, False ) li_ret = lole_bapi.Connection.IsConnected() MessageBox('BAPI IsConnected=', string( li_ret ))
et l'erreur :
Error Group
RFC_ERROR_COMMUNICATION
Message
Connect to SAP gateway failed
Connect_PM GWHOST=aaa.bbb.ccc.ddd, GWSERV=sapgw12, ASHOST=aaa.bbb.ccc.ddd, SYSNR=12
LOCATION CPIC (TCP/IP) on local host
ERROR partner not reached (host aaa.bbb.ccc.ddd, service 3312)
TIME Fri Mar 23 14:57:11 2007
RELEASE 640
COMPONENT NI (network interface)
VERSION 37
RC -10
MODULE nixxi_r.cpp
LINE 8679
DETAIL NiPConnect2
SYSTEM CALL SiPeekPendConn
ERRNO 10060
ERRNO TEXT WSAETIMEDOUT: Connection timed out
COUNTER 16
Hors ligne
shahin a écrit:
A ta place j'irai directement au siège de SAP à Walldorf. Vu que c'est en forêt noire, tu pourra acheter un coucou
c'est vrai c'est pas très loin de chez moi...
mais les coucou c'est en Suisse, non ?
Hors ligne
en allant voir du coté de http://codexchange.sybase.com...
il parait qu'il y traine un exemple de bapi sap...
j'y suis allé une fois dans la foret noire...ca m'a SAPpé le morale....
Hors ligne
Amha tu as la mauvaise adresse IP dans :
lole_bapi.connection.applicationserver = 'aaa.bbb.ccc.ddd'
Hors ligne
shahin a écrit:
Amha tu as la mauvaise adresse IP dans :
Code: pb
lole_bapi.connection.applicationserver = 'aaa.bbb.ccc.ddd'
j'ai mis ça pour pas dévoiler l'adresse réelle...
Hors ligne
eRaSorZ a écrit:
j'ai mis ça pour pas dévoiler l'adresse réelle...
C'est tout à ton honneur mon ami, mais vérifie quand même que tous les paramêtres soient bons, y compris le numéro de port (3312 ?)
Hors ligne
shahin a écrit:
mais vérifie quand même que tous les paramêtres soient bons, y compris le numéro de port (3312 ?)
je suis entrain de faire des verif à ce niveau...
Hors ligne
pick ouic a écrit:
en allant voir du coté de http://codexchange.sybase.com...
il parait qu'il y traine un exemple de bapi sap...
t'es sur ? j'ai rien trouvé
sinon je crois que je suis bloqué par la sécurité pour accéder à distance au port par OLE
je retenterai ma chance sur site prochainement...
Hors ligne
pas sure...
il y avait un membre du site qui proposait d'aller voir la-bas...pour le module SAP.
j'ai du voir car quelque part...sur le forum de sybase...
mais j'ai pas réussi à le trouver egalement...
pourtant, il y a pleins de tips interessants...
Hors ligne
pick ouic a écrit:
t'en es ou ?
j'en suis à :
je retenterai ma chance sur site prochainement...
Hors ligne
Hors ligne
eRaSorZ a écrit:
pick ouic a écrit:
t'en es ou ?
j'en suis à :
je retenterai ma chance sur site prochainement...
et effectivement ça marche... pas
Hors ligne
j'ai trouvé ca, tu peux voir ce que ca fait ?
http://smartsoft.bytelabs.org/assets/20 … cogen7.zip
Hors ligne
pick ouic a écrit:
j'ai trouvé ca, tu peux voir ce que ca fait ?
http://smartsoft.bytelabs.org/assets/20 … cogen7.zip
oui j'avais déjà étudié ce programme
Hors ligne
Voici un autre script. Merci à m.cimaroli@selda.net
We have used two Activex
SAP BAPI : Pb control ole_bapi
SAP RFC : Pb control ole_sap_rfc
//Instance variable oleobject loo_sap_func string is_Rfc_name= ….sap_rfc_name //1) PB Sap Logon script integer li_stato,li_ret ole_bapi.object.Connection.Client = 200 // Leggere user SAP dal DB ole_bapi.object.Connection.User = _User_name_sap //ole_bapi.object.Connection.Password = "init" ole_bapi.object.Connection.Language = "IT" //Logon ole_bapi.object.Connection.Logon(0, false ) li_stato = ole_bapi.object.Connection.IsConnected() //messagebox("SAP","BAPI connection : " + sle_stato.text) if li_stato = 1 then sle_step.text = "STEP 1: Sap Logon ok " //Assign connection object to ole_sap_rfc ole_sap_rfc.object.connection = ole_bapi.object.connection li_stato = ole_sap_rfc.object.connection.IsConnected() if li_stato = 1 then sle_step.text = "STEP 2: RFC connect ok " SetPointer(HourGlass!) //Now i call pb window function that then call a custom rfc developed in //ABAP 4 that call a standard BAPI to insert SAP planned order li_ret = wf_rfc_ppg() //see next pb script SetPointer(Arrow!) this.enabled = false sle_step.text = "STEP 3: RFC competed " ole_sap_rfc.object.Connection.Logoff() ole_bapi.object.Connection.Logoff() sle_step.text = "STEP 4: SAP LogOff “ if li_Ret=1 then Messagebox("SAP OnLine","Export data to SAP compelted.") else Messagebox("SAP OnLine","Export data to SAP fail.",StopSign!) end if tab_import.selecttab(3) else Messagebox("SAP OnLine","RFC connection failed " + string(li_stato)) end if else Messagebox("SAP OnLine","SAP logon failed " + string(li_stato)) end if //2) wf_rfc_ppg() long ll_k string ls_tipo,ls_ret integer li_Ret,li_return,li_imp_c li_return = -99 // Associa il riferimento alla function di SAP loo_sap_func = ole_sap_rfc.object.add(is_rfc_name) //loo_sap_func = ole_sap_rfc.object.add("Z_PPG") IF IsValid(loo_sap_func) = FALSE OR IsNull(loo_sap_func) = TRUE THEN MessageBox('Rfc Error',"RFC: "+is_rfc_name+" Add(RFC)-->ExceptionCodes" ) RETURN -1 END IF oleobject loo_table,loo_table2 //----------------------------------------------------- // INPUT parameters for the RFC // parm1 String Flag export type // parm2 String Production Date // // parm3 Sap table loo_table // // Return // parm4 Sap table loo_table2 //----------------------------------------------------- if ib_elab_weekly = True then ls_tipo='DAILY_WEEKLY' //Export di Daily + Weekly else ls_tipo='SAVE_WEEKLY' //Export di solo piano Daily => RFC Conserva WeeklySAP attuale end if integer li_exp li_exp = loo_sap_func.exports.count // INPUT parameters loo_sap_func.exports(1).value = ls_tipo loo_sap_func.exports(2).value = f_date_to_string(idt_max_datarif) // Parametri di LOG su SAP if tab_import.tabpage_piano.cbx_saplog.checked = true then string ls_path = "" SELECT "PPGT12_PARAMETRI"."PPGT12_VAL_PARAMETRO" INTO :ls_path FROM "PPGT12_PARAMETRI" WHERE "PPGT12_PARAMETRI"."PPGT12_COD_PARAMETRO" = 'logfile_sap' ; loo_sap_func.exports(3).value = trim(ls_path) else loo_sap_func.exports(3).value = 'NOLOG' end if //------------------------------------------------------- //we use tables(1) as an input table for the RFC //------------------------------------------------------- loo_table = loo_sap_func.tables(1) //loo_table2 = loo_sap_func.tables(2) //Loop to load sap table for ll_k=1 to dw_mixed.rowcount() loo_table.Rows.Add loo_table.value[ll_k,1] = dw_mixed.object.divisione[ll_k] loo_table.value[ll_k,2] = dw_mixed.object.materiale[ll_k] loo_table.value[ll_k,3] = f_date_to_string(dw_mixed.object.data_rif[ll_k]) loo_table.value[ll_k,4] = dw_mixed.object.versione[ll_k] loo_table.value[ll_k,5] = string(truncate(dw_mixed.object.qta[ll_k],0)) next // Call the RFC loo_sap_func.call //SAP RFC populate tables(2) to return a dataset with the results of the elaboration integer li_table_count,li_row_count,li_col,li_k string ls_work[] integer li_riga li_table_count = loo_sap_func.tables.Count if li_table_count>1 then li_row_count = loo_sap_func.tables(2).RowCount for li_k=1 to li_row_count li_riga = tab_import.tabpage_log.dw_log.insertrow(0) for li_col=1 to 9 tab_import.tabpage_log.dw_log.SetItem(li_riga,li_col,loo_sap_func.tables(2).value(li_k,li_col)) next next //Filter e Rowscopy da Filter Buffer tab_import.tabpage_log.dw_log.setfilter("right(msg_type,1)='E'") tab_import.tabpage_log.dw_log.filter() tab_import.tabpage_log.dw_log.rowsmove( 1, 9999999, Filter!, tab_import.tabpage_log.dw_log_warning,1, Primary!) end if //Testa parametro di ritorno della RFC (S=ok,N=ko) li_imp_c= loo_sap_func.imports.Count if li_imp_c>0 then ls_Ret = loo_sap_func.imports(1).value else ls_Ret='0' end if if ls_Ret='1' then li_return = 1 end if Return li_Return
Hors ligne
Bonjour,
Peux tu me dire, si finalement la dernière solution proposée t'a permis d'accéder à la base de données de SAP ?
Cela pourrait me rendre un grand service.
Merci
Hors ligne
devine...
edit : mais tu devrais tester quand même
j'avais été bloqué au niveau du réseau
et comme il n'y a pas eu de suite au niveau du projet, je n'ai pas insisté
Hors ligne