Récupération de tables sap

Soyez le premier à donner votre avis sur cette source.

Vue 7 646 fois - Téléchargée 943 fois

Description

Permet de récup les données d'une table SAP dont on connait les informations de connection du serveur avec une requete type SQL (il faut avoir des droits de connection au serveur ainsi que l'authorisation sur la transaction SE16). Aucun contrôle n'est effectué sur les champs de saisie donc faites attention à ce que vous tapez ;).

Source / Exemple :


'dans le zip

Conclusion :


Impossible d'acceder a plusieurs tables a la suite, il faut relancer le prog :( car le recordset garde les tables précédentes en mémoire.
Demande un "gros" processeur avec PLEIN de memoire si vous voulez récup des grosses tables (3h+ pour récup mes 490000 lignes sur trois champs :/).
Les lignes récup sont limitées a 512octets par SAP.

Si qqn à une soluce pour faire plus ou moins la meme chose sans utiliser la SE16 qu'il me fasse vite signe :p

Ishamael.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
4
Date d'inscription
mercredi 9 mars 2005
Statut
Membre
Dernière intervention
5 avril 2011

Salut,

Depuis j'ai trouvé la solution : toto = TDATA.data !!!! 1.000.000 de lignes de 512 octets en 180 secondes qui dit mieux !
Le maximum que l'on peux récuperer est d'environ 1.200.000 lignes, au dela ça c'est aléatoire, la connection est perdu.

Sinon cette RFC est donnée par SAP uniquement comme outils pédagogique, aucun bug ne peux leur etre soumis, et sachez que certain type de champs sont tronqué,
ne soyez pas surpris si ce n'est pas exactement la meme chose que SE16.

JM
Messages postés
4
Date d'inscription
mercredi 9 mars 2005
Statut
Membre
Dernière intervention
5 avril 2011

Salut,

J'exploite à fond ce code source. Il marche bien mais c'est vrais que le problème majeur c'est la récupération de nombreuses lignes et non pas du volume de donnée.

J'ai même optimisé le chargement 10-15% plus vite :
Set rs = CurrentDb.OpenRecordset(MyLocalTable, dbOpenTable, dbAppendOnly)
i = 0
For Each champs In TFIELDS.Rows
n(i) = champs("FIELDNAME")
l(i) = champs("LENGTH")
o(i) = champs("OFFSET") + 1
x(i) = rs.Fields(n(i)).Size
i = i + 1
Next

For Each ROW In TDATA.Rows

rs.AddNew

rs.Fields("mySYSTEM") = R3.Connection.System
rs.Fields("myCLIENT") = R3.Connection.Client

For j = 0 To i - 1
rs.Fields(n(j)) = Left(Trim(Mid(ROW(1), o(j), l(j))), x(j))
Next j
rs.Update
Next

Exemple d'une table de 50.000 enregistrements :
Pour que l'objet TDATA soit plein avec toutes les données SAP en mémoire il faut compter entre 2 ou 3s secondes. Quand ensuite on transfert TDATA dans une table enregistrement par enregistrement ça va super vite pour les 10000 premiers et ça commence à ralentir puis à etre déplorable sur la fin, avec une progressbar et le code suivant on s'aperçois de la misère :

rs.Update
'Update the progressbar -----------------------
cptdata = cptdata + 1
If Rnd > 0.998 Then
Label1.Caption = cptdata & "/" & TDATA.RowCount
Progess1.Value = cptdata
DoEvents
End If
'------------------------------------------------

Alors pour voir, j'ai inversé la boucle et commencé par les dernieres lignes de TDATA (Pour i de TDATA.rowcount à 1 dans TDATA.Rows.data(i,1)). Et la surprise ça rame au debut et ça fini à fond. L'accès en mémoire de VBA doit etre misérable. La lecture de la 1ere à la 10.000ieme ligne met 2 secondes, et de la 40.000ieme à la 50.000ieme met 60 secondes... je ne parle pas des tables de 500.000 enregistrment, ça tourne au tour de 100 enregistrment par seconde.

Aux plus téméraire je propose 2 solutions :
1 - Faire une DLL en C ou ASM pour copier TDATA dans la table Access
2 - Remplir TDATA par bloc de 10.000 lignes

A+ JM
Messages postés
1
Date d'inscription
dimanche 12 octobre 2003
Statut
Membre
Dernière intervention
5 octobre 2004

Il y a les erreurs suivantes au chargement :
Ligne 10: La propriété ToolboxBitmap dans CsxProgress a une référence de fichier incorrecte.
Ligne 18: La propriété Picture dans PicBarreDroite a une référence de fichier incorrecte.
Ligne 33: La propriété Picture dans PicBarreMilieu a une référence de fichier incorrecte.
Ligne 48: La propriété Picture dans PicBarreGauche a une référence de fichier incorrecte.
Ligne 63: La propriété Picture dans PicFondDroite a une référence de fichier incorrecte.
Ligne 78: La propriété Picture dans PicFondMilieu a une référence de fichier incorrecte.
Ligne 93: La propriété Picture dans PicFondGauche a une référence de fichier incorrecte.

A la compilation il y a deux erreurs relatives à MSF2 pour MSFlexGrid et à PB1 qui n'existe pas. J'espère que ces petits oublis seront corrigés prochainement par Ishamael.
Messages postés
12
Date d'inscription
jeudi 3 juillet 2003
Statut
Membre
Dernière intervention
1 octobre 2004

P.S. merci à NoRabbit pour sa progressbar ;)
et merci à Mr Olivier Martel dont le site m'a aidé à coder cette source

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (Ishamael)