Ishamael
Messages postés12Date d'inscriptionjeudi 3 juillet 2003StatutMembreDernière intervention 1 octobre 2004
-
3 août 2004 à 09:25
ditleporc
Messages postés4Date d'inscriptionmercredi 9 mars 2005StatutMembreDernière intervention 5 avril 2011
-
1 juin 2010 à 21:11
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
ditleporc
Messages postés4Date d'inscriptionmercredi 9 mars 2005StatutMembreDernière intervention 5 avril 2011 1 juin 2010 à 21:11
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
ditleporc
Messages postés4Date d'inscriptionmercredi 9 mars 2005StatutMembreDernière intervention 5 avril 2011 16 avril 2008 à 13:57
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 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
cs_SENOU
Messages postés1Date d'inscriptiondimanche 12 octobre 2003StatutMembreDernière intervention 5 octobre 2004 5 oct. 2004 à 23:15
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.
Ishamael
Messages postés12Date d'inscriptionjeudi 3 juillet 2003StatutMembreDernière intervention 1 octobre 2004 3 août 2004 à 09:25
P.S. merci à NoRabbit pour sa progressbar ;)
et merci à Mr Olivier Martel dont le site m'a aidé à coder cette source
1 juin 2010 à 21:11
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
16 avril 2008 à 13:57
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
5 oct. 2004 à 23:15
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.
3 août 2004 à 09:25
et merci à Mr Olivier Martel dont le site m'a aidé à coder cette source