Pb rapidité instructions SQL

Sniper_Vgaerr Messages postés 113 Date d'inscription jeudi 2 décembre 2004 Statut Membre Dernière intervention 14 août 2006 - 13 déc. 2005 à 23:20
Sniper_Vgaerr Messages postés 113 Date d'inscription jeudi 2 décembre 2004 Statut Membre Dernière intervention 14 août 2006 - 14 déc. 2005 à 19:26
Bonjour à tous,

Voila j'ai un problème sur mon programme. Mon programme gère plusieurs base de données simultanement tout ca sur une meme feuille (elle contient environ 450 controles).
J'utilise un tabstrip pour visualiser les différentes "pseudo-feuilles"(se sont des picturebox dans lesquelles sont stockés les controles).
J'utilise aussi Crystal Report pour l'impression, chaque base de donnée contient 2 tables, une où j'archive tous les bon de commande et l'autre que j'utilise pour imprimer, donc cette deuxieme table ne doit avoir qu'une seule ligne ou qu'un seul enregistrement afin de pouvoir imprimer qu'un seul bon de commande avec CR.
J'ai un bouton enregistrer qui me permet de copier la ligne de la table Imprimer à la table d'archivage tout en supprimant la ligne dans la table Imprimer. mais si par mégarde l'utilisateur ne l'enregistre pas et change d'onglet, alors la je fais ce code :

Set db = OpenDatabase(App.Path & "\BonCmd.mdb")
db.Execute "DELETE * FROM Imprimer"

J'ai trois fois cette instruction pour trois base de donnée différentes, le problème est que c'est extremement long, mon pc met pratiquement 10 secondes pour faire ces trois instructions, j'ai pu verifier que c'était bien ces instructions là qui me faisait ralentir la bécane.
Si quelqu'un sait comment faire pour plus que ca rame, ou si vous avez une solution plus rapide que celle ci, merci d'avance.
Je suis en VB 6.0 sous XP SP2

Merci d'avance

7 réponses

cs_funseb Messages postés 154 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 28 janvier 2010 1
14 déc. 2005 à 08:34
Salut,

Pour la rapadité d'execution des requètes, il est recommandé de travailler avec des procédures stockées !! en fait les procédures stockées sont gardées en mémoire vive par le bié de ton SGBDR et sont donc éxécutées plus rapidement ! Après je sais que sous SQL-server et Oracle ont peut en faire mais sous Access je pense pas (a verifier ) !
0
gaa179 Messages postés 361 Date d'inscription mercredi 21 mai 2003 Statut Membre Dernière intervention 12 novembre 2009 2
14 déc. 2005 à 09:51
Salut,

Le plus simple, c'est de faire pointer ton rapport Crystal report sur la table qui contient toute les données. Ensuite, lorsque tu appelles ton rapport, tu place un filtre dans CR, qui s'execute directement dans le query sur le serveur.

Voici la syntaxe pour CR 8.5
Public Sub PrintFrm(ByVal ReportFile As String, WindowTitle As String, Optional RecordSelector As String, Optional PrintReport As Boolean False, Optional ReportHeader As Boolean False, Optional ExportEnable As Boolean = False, Optional ReportLandscape As Boolean = False)
On Error GoTo Err_Print
Dim crystal As New CRAXDDRT.Application
Dim Report As New CRAXDDRT.Report
Dim MyRsSubRep As New ADODB.Recordset
Dim StrSql As String


Set Report = crystal.OpenReport(App.Path & "\Report" & ReportFile & ".rpt")
If ReportHeader Then Report.ReportTitle = WindowTitle
'Sélection de l'imprimante
If ReportLandscape Then Report.PaperOrientation = crLandscape

If RecordSelector <> "" Then Report.RecordSelectionFormula = RecordSelector
If PrintReport Then
Report.ReadRecords
Report.PrintOut
Else
'FrmPrint.Show vbModal
With FrmPrint.CRViewer1
.ReportSource = Report
.ViewReport 'SHOW REPORT
Do While .IsBusy 'ZOOM METHOD DOES NOT WORK WHILE
DoEvents 'REPORT IS LOADING, SO WE MUST PAUSE
Loop 'WHILE REPORT LOADS.

'Modification affichage
.Refresh
.Zoom 1
.Top = 0
.Left = 0
.Height = FrmPrint.ScaleHeight
.Width = FrmPrint.ScaleWidth
.DisplayTabs = False
.DisplayGroupTree = False
.EnableExportButton = ExportEnable
.EnableGroupTree = False
.DisplayBackgroundEdge = False
'.EnableSearchControl = False
.EnableNavigationControls = True
End With

With FrmPrint
.Caption = WindowTitle
.Show vbModal
.Refresh
End With
End If
Set crystal = Nothing
Set Report = Nothing


Exit Sub


Err_Print:
Set crystal = Nothing
Set Report = Nothing
MsgBox Err.Description, vbCritical + vbOKOnly, "Impression"
End Sub

Remarque:

La variable RecordSelector doit avoir la syntaxe suivante:
"{FieldName} = " & value

A+
0
aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 3
14 déc. 2005 à 10:50
salut

tu te connecte a trois base de données differentes, c'est normal que ca soit long.

ce que tu peux faire, c'est créer des tables liees dans une de tes bases qui pointent vers les tables necessaire dans les autre bases, comme ca tu ne te connecte qu'a une base qui va aller mettre a jour les autres.

je pense que ca sera plus rapide
0
Sniper_Vgaerr Messages postés 113 Date d'inscription jeudi 2 décembre 2004 Statut Membre Dernière intervention 14 août 2006
14 déc. 2005 à 11:17
Le truc c'est que pour aller chercher dans les base de donnée c'est rapide vu que je fait chercher que dans une seule base a la fois, lorsque je clique sur l'onglet bon de commande, je vais chercher dans la base de donnée BonCmd.mdb, mais c'est seulement quand je veux supprimer tous les champs d'un table qui mets un temps fou.
Merci pour tou vos commentaires .
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_funseb Messages postés 154 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 28 janvier 2010 1
14 déc. 2005 à 11:22
Dans ce cas là tu peux gérer des thread !
par exemple tu fais un count de ta table, et tu gère plusieurs requètes ( 1 pour les 30 premières lignes, 1 autre pour les lignes 31 à 60 ...) et t'execute chaque requète dans un thread différent !
0
aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 3
14 déc. 2005 à 14:21
ca ne sera pas plus rapide avec des threads, au contraire, c'est la base qui ralenti l'operation dans ce cas, donc si en plus tu lui rajoute des conditions pour ne supprimer que les n premieres, ca va etre encore plus long

par contre vu que tu supprime toutes les données de ta tables, t'as essayé en supprimant la table et en la recreant (je ne pense pas qu'ACCESS accepte le TRUNCATE TABLE qui est pourtant tres rapide pour vider une table, mais qui suppose que tu n'es pas de clef etranger de définie)
0
Sniper_Vgaerr Messages postés 113 Date d'inscription jeudi 2 décembre 2004 Statut Membre Dernière intervention 14 août 2006
14 déc. 2005 à 19:26
Re,

J'ai trouvé, en fait j'utilise la librairie DAO 3.6 et c'est celle la qui me fait ramer, alors qu'avant j'étais sous DAO 3.51. Voila d'ou venait ce problème de rapidité.
En tout cas merci à tous pour vos solutions.
Merci
0
Rejoignez-nous