Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Discussion fermée Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/10/2011, 20h42   #1
Nouveau Membre du Club
 
Homme
Administrateur de base de données
Inscription : mai 2011
Messages : 99
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Bâtiment

Informations forums :
Inscription : mai 2011
Messages : 99
Points : 29
Points : 29
Par défaut Comparaison 2 requêtes

Bonjour forum,

J'ai une liste des livraison a effectuer dans un server SQL.
Ensuite J'ai le détail des livraisons (Emplacement, Heure de livre, etc..) dans une BD Access.

Lorsque j'effectue une requête afin de savoir l'ensemble de mes livraisons à effectuer dans une journée (Vers un tableau excel), j'aimerais que les informations contenues dans ma BD access en lien avec ses lignes de livraison se transporte.

Les critères afin de voir si même ligne de livraison: date,Contrat, Produit, Amount, cleints, address, ville

et ensuite les données qui ont la même date de livraison mais qui n'on pas trouver de correspondance, soit supprimer de ma base de donnée.

Je procède ainsi, car je ne peux pas modifier les données dans mon server SQL, afin de contourner ce problème j'ai donc créé une 2e BD dans laquelle j'entre les informations en liens avec mes livraisons, ces informations doivent donc se transporter lorsque j'effectue ma requête dans mon server SQL.

PS: Si vous pensez à une autre façon n'hésitez pas je suis ouvert a toute suggestion.

Merci!
Beaudelicius est déconnecté   Envoyer un message privé 00
Vieux 04/10/2011, 14h26   #2
Nouveau Membre du Club
 
Homme
Administrateur de base de données
Inscription : mai 2011
Messages : 99
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Bâtiment

Informations forums :
Inscription : mai 2011
Messages : 99
Points : 29
Points : 29
Rebonjour forum,

Je vais reformulé, afin de vous donner le maximum d'information possible

J'ai une première requête:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT sch.prodstatusid, sch.prodstatusid2, Q.sonbralt, sch.prodid, sch.siteid, sch.deliveryno, sch.floorid, sch.location, SUM(sch.amount) AS amount, MAX(sch.schdate), sch.deliverydate, C.shortname, R.c_address, M.descr
                FROM Customers C
                INNER JOIN roadsheet R ON C.custid = R.custid
                    INNER JOIN rsscheduledtl sch ON R.roadsheetid = sch.roadsheetid
                        INNER JOIN QOHdr Q ON sch.qonbr = Q.qonbr
                        INNER JOIN Municipality M ON Q.municipalityId = M.Municipalityid
                WHERE sch.prodid IN (" & critereProd & ")
                AND sch.deliverydate = '" & dateLiv & "'
                AND Q.sonbralt <>''
                AND sch.isactive = 1
                AND Q.isActive = 0
                GROUP BY sch.prodstatusid, sch.prodstatusid2, Q.sonbralt, sch.prodid, sch.deliveryno, sch.floorid, sch.location, sch.deliverydate, C.shortname, R.c_address, M.descr, sch.siteid

J'aimerais lors de ma requête, qu'une seconde requête compare les données des champs ( deliverydate, sonbralt, amount ) dans mon autre base de donnée, qui est une BD Access.

Ensuite lorsqu'il a trouver les données correspondante, qu'il ajoute les nouvelles données (Notrailer, Ordre, Periode, Camionneur, Commentaire)

Pour finir tous les enregistrements dans ma BD qui n'ont pas trouver de correspondance et qui ont cette même date de livraison soient supprimer, ou peu-être supprimer toutes les données avec cette date de livraison et lorsque je ferai le prochain enregistrement les données désiré seront sauvegardé.

PS: cette requête ne présente pas énormément de données, 100 ligne maximum

Merci de votre aide
Beaudelicius est déconnecté   Envoyer un message privé 00
Vieux 04/10/2011, 17h22   #3
Nouveau Membre du Club
 
Inscription : octobre 2005
Messages : 18
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 18
Points : 36
Points : 36
J'étais parti sur un truc compliqué, mais j'ai vu qu'il y avait ça :

http://office.microsoft.com/fr-fr/ac...001034599.aspx

qui devrait suffire.

Sinon la solution compliqué partait du principe qu'on ne pourrait pas requêter les deux bases depuis sql server, et je conseillais de faire un export des données d'access vers une nouvelle table dans sql server qui permettrais ce traitement. Mais pour une centaine de lignes seulement c'est peut-être un peu excessif.
samael314 est déconnecté   Envoyer un message privé 00
Vieux 04/10/2011, 21h05   #4
Nouveau Membre du Club
 
Homme
Administrateur de base de données
Inscription : mai 2011
Messages : 99
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Bâtiment

Informations forums :
Inscription : mai 2011
Messages : 99
Points : 29
Points : 29
Ok merci je regarde ça et je te tiens au courant !!
Beaudelicius est déconnecté   Envoyer un message privé 00
Vieux 05/10/2011, 15h51   #5
Nouveau Membre du Club
 
Homme
Administrateur de base de données
Inscription : mai 2011
Messages : 99
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Bâtiment

Informations forums :
Inscription : mai 2011
Messages : 99
Points : 29
Points : 29
salut samael314,

J'ai regardé ça un peu et je ne sais pas si c'est cela que je recherche, car je crois que si j'utilise Access pour faire le lien avec ma base SQL, il va faloir que j'ouvre access afin d'actualiser mes tables et ensuite faire mes opérations dans Excel. Je doit faire l'ensemble de mes opération via Excel.

Ce que j'avais pensé, était de créer une table (ou un vue) avec une requête dans ma base de donnée SQL selon la date de livraison, et le même chose pour ma base de donnée Access.

Par le suite je pourrais comparer ces deux table selon quelques critère, et ensuite afficher les résultat dans excel. Je pourrais créer un clé primiare en combinant ces critères?? je pourrais donc finir par avoir une requête qui ressemble à celle la:

Code :
SELECT .... FROM SQLView SV INNER JOIN ACCESView AV ON SV.Clef = AV.Clef
Ou ma colonne "clef" est la colonne qui est créé en combinant les info de mes différents critère


Est-ce possible, sans que ça soit trop compliquer?
Beaudelicius est déconnecté   Envoyer un message privé 00
Vieux 05/10/2011, 16h36   #6
Nouveau Membre du Club
 
Inscription : octobre 2005
Messages : 18
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 18
Points : 36
Points : 36
Es-tu sûr de pouvoir interroger simultanément les deux bases avec la même requête ? Perso j'en doute.

Tu peux faire une requête sur plusieurs bases différentes mais au sein d'un même SGBD (système de gestion de base de données : oracle, sql server...). Par contre entre deux SGBD différents, je ne pense pas, et requêter une base access depuis sql server ça m'étonnerait aussi.

Donc si j'ai bien compris, tu veux tout faire depuis Excel. C'est à dire interroger la base access et la base sql server. Je te le déconseille :
- déjà tu ne pourras pas faire une seule requête pour comparer directement les deux tables depuis Excel, ça serait trop facile. Tu pourras seulement ramener les données dans les feuille excel et tu devra comparer avec les fonctions excel.
- ensuite je ne sais pas si microsoft a fait un effort la dessus (c'est possible) mais les requêtes sql sont extrêmement lentes depuis excel, ensuite tu dois donner des identifiants de connection sql (user, password), et il y a qq années le mot de passe était stocké dans la feuille excel en texte : il suffisait d'ouvrir le document excel avec un éditeur de texte (bloc note par ex) pour voir le mot de passe en clair...

Quelle que soit la solution que tu choisis tu devras de toute façon synchroniser régulièrement tes données : soit de access vers sql server soit l'inverse.
C'est à dire que tu fait passer les données de access dans une table dédiée côté sql server.

Sinon tu as toujours le bon vieux copier/coller, puisque tu n'as qu'un centaines de lignes, tu copie colle les données access et sql server dans une feuille excel et utilise le fonction EXACT de excel pour comparer tes valeurs.

Je te donne la solution à laquelle j'avais pensé au départ :

Je pense que le plus simple serait d'exporter les données de la table de la bd access vers une nouvelle table (CustFromAccess dans les exemples en dessous) dans la base sql server.
Je ne connais pas d'outil qui pourrait faire de l'import/export entre access et sql server, mais il est facile de sortir un script de type "insert into", surtout si le volume est limité à une centaines de lignes. L'idéal serait un petit bouton dans access qui recréérait un script sql des données à importer dans sql server à la demande (le bouton lance une macros en vb qui crée un fichier texte contenant le script), sur ce modèle :

Code :
1
2
3
4
5
6
7
 
DELETE CustFromAccess; -- ou truncate customer pour les puristes
 
INSERT INTO CustFromAccess(field1, field2, ..., FIELD n) VALUES ('val1', 'val2', ..., 'valn');
INSERT INTO CustFromAccess(field1, field2, ..., FIELD n) VALUES ('val1', 'val2', ..., 'valn');
INSERT INTO CustFromAccess(field1, field2, ..., FIELD n) VALUES ('val1', 'val2', ..., 'valn');
--etc.
Ensuite il faut exe le script dans la base mais si tu es dba (puisque tu fais des livraison semble-t-il), ça ne devrait pas poser de pb.
Cette partie c'est pour l'extraction des données access vers sql server. Donc il faudra le refaire régulièrement pour avoir les données à jour.

Ensuite, d'après ce que j'ai compris, il y a de la mise à jour de données (update) et de la suppression de lignes (delete).

Donc comme on a les données access dans la base sql server, il suffit de requêter sur la nouvelle table.

Par exemple (attention j'ai tapé de tête, vérife la syntaxe) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
UPDATE customer
SET customer.Notrailer = CustFromAccess.Notrailer,
customer.Ordre = CustFromAccess.Ordre,
customer.Periode = CustFromAccess.Periode,
customer.Camionneur = CustFromAccess.Camionneur,
customer.Commentaire = CustFromAccess.Commentaire
FROM
customer
, CustFromAccess
WHERE 
customer.deliverydate = CustFromAccess.deliverydate
AND customer.sonbralt = CustFromAccess.sonbralt
AND customer.amount = CustFromAccess.amount
Code :
1
2
3
4
5
6
7
8
9
 
DELETE FROM customer
WHERE 1 = (
SELECT 1
FROM CustFromAccess
WHERE CustFromAccess.sonbralt = customer.sonbralt
AND CustFromAccess.amount = customer.amount
)
AND customer.deliverydate <> CustFromAccess.deliverydate
Evidemment tout ça pour une poignée de lignes, c'est un peu bourrin. Moi à ta place j'oublierais access et je ferais tout dans la même base.
samael314 est déconnecté   Envoyer un message privé 00
Vieux 05/10/2011, 16h56   #7
Nouveau Membre du Club
 
Inscription : octobre 2005
Messages : 18
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 18
Points : 36
Points : 36
N'hésites pas à détailler plus ton besoin car je ne suis pas sur de bien saisir ce que tu veux.
samael314 est déconnecté   Envoyer un message privé 00
Vieux 06/10/2011, 10h07   #8
SLE
Membre chevronné
 
Avatar de SLE
 
Homme Serge LESPAGNARD
Consultant informatique
Inscription : janvier 2004
Messages : 588
Détails du profil
Informations personnelles :
Nom : Homme Serge LESPAGNARD
Âge : 38
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : janvier 2004
Messages : 588
Points : 732
Points : 732
Citation:
Envoyé par samael314 Voir le message
Es-tu sûr de pouvoir interroger simultanément les deux bases avec la même requête ? Perso j'en doute.
Bien sûr que si ! Avez-vous pensé à utiliser un linkedserver ? ou OpenRowSet() ?
SLE est déconnecté   Envoyer un message privé 10
Vieux 06/10/2011, 12h55   #9
Nouveau Membre du Club
 
Inscription : octobre 2005
Messages : 18
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 18
Points : 36
Points : 36
Citation:
Envoyé par SLE Voir le message
Bien sûr que si ! Avez-vous pensé à utiliser un linkedserver ? ou OpenRowSet() ?
Merci pour le tuyau.

Donc Beaudelicius ça se passe là :

http://msdn.microsoft.com/fr-fr/libr...v=sql.90).aspx

et là :

http://msdn.microsoft.com/fr-fr/library/ms190312.aspx
samael314 est déconnecté   Envoyer un message privé 00
Vieux 06/10/2011, 14h26   #10
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Access dispose de mécanismes similaires en utilisant l'assistant de données externes, et en "important en tant que tables liées" les tables de la base SQL Server.

La base Access pouvant être déplacée, copiée, etc. je pense qu'il est plus pratique de faire dans ce sens, plutôt que de lire les données d'Access depuis SQL Server.
D'autant qu'Access dispose de tous les outils permettant à un utilisateur lambda de faire des requêtes et états, sans vous demander d'intervenir sur le serveur SQL Server à chaque fois.

Attention cependant, lors de l'import des tables liées, il faudra peut-être faire une liaison en lecture seule, histoire d'éviter qu'un utilisateur maladroit n'efface les données du serveur par erreur, c'est très vite arrivé avec Access
StringBuilder est déconnecté   Envoyer un message privé 10
Discussion fermée Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h28.


 
 
 
 
Partenaires

Hébergement Web