IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Transformer une requête SQL SERVER en requête Delphi


Sujet :

Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2010
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 192
    Points : 71
    Points
    71
    Par défaut Transformer une requête SQL SERVER en requête Delphi
    Bonjour tout le monde, je suis coincé sur un problème de requête que j'ai créer avec Sql Serveur 2008 elle marche très bien et très rapide, le problème et je voudrais la transformer pour l'utiliser avec delphi, soit ADOQuery soit FDQuery

    Declare @DateUtilis as varchar(10)
    Set @DateUtilis = '20180407'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT * FROM OpenQuery(LinkedOracle9i, 'SELECT t.Employer_Num, t.Date,
           t.Lib,
           b.Nom,
           SubStr(t.Lib, 7, 15) Lib_Nom,
           SubStr(t.Lib, 1, 6) Lib_Nom1,
           Sum(t.Credit) As Credit,
      FROM Table1 t, Table2 b
     WHERE t.Centre = 1001
       And t.Journee = ''+@DateUtilis+''		
       And t.Centre = b.Centre
       And t.Canaux = ''9''
       AND t.Employer_Num = b.Employer_Num
     Group By t.Employer_Num, t.lib, b.Nom, t.Date
     Order by SubStr(t.Libe, 1, 7), t.Employer_Num')

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    cela ressemble tellement à cette discussion que je suis tenté d'écrire qu'il s'agit d'un doublon ! Seule la notion d'ADO semble disparaitre (et encore tout juste)

    Le problème que vous posez n'est pourtant pas insoluble !
    Tout d'abord les paramètres d'un SQL avec Delphi sont toujours notés par un ":" (sauf stipulation explicite) mais votre problème c'est que vous faites est un SQL plus que particulier, passer par MSQL serveur pour accéder à une base Oracle c'est limite et là comme vous demandez vous voulez mettre des paramètres non pas dans un SQL mais dans une chaine SQL ce qui n'est pas la même chose !

    1° question que je me pose : mais pourquoi passer par MSSQL pour lire une requête sur une base Oracle je pense que la réponse se situe dans la version de Delphi que vous utilisez pro ou inférieure ne permettant pas d'accéder directement à une base Oracle sinon il serait peut-être un peu ridicule de passer par un système tiers

    Comment-faire ? Il est évident que cela ne peut pas passer, que ce soit ADO ou Firedac les paramètres ne seront pas interprétés puisque à l'intérieur d'une chaine de caractère. Il faut donc traiter cette chaine avant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    const SQLOracle = 'SELECT t.Employer_Num, t.Date,  t.Libelle,  b.Nom, SubStr(t.Lib, 7, 15) Lib_Nom, SubStr(t.Lib, 1, 6) Lib_Nom1, Sum(t.Credit) As Credit,FROM Table1 t JOIN Table2 b '+
                              '  ON t.Centre=b.Centre  AND  t.Employer_Num = b.Employer_Num '+
                              ' WHERE t.Centre = %d  And t.Journee = %s  And t.Canaux = %s '+
                              ' Group By t.Employer_Num, t.lib, b.Nom, t.Date Order by SubStr(t.Libe, 1, 7), t.Employer_Num';
     
    var SQLParam : String;
         unedate : date; 
    begin
    SQLParam:=Format(SQLOracle,[1001,FormatDateTime('yyyymmdd',unedate),quotedstr('9')]);
     
    ADOQuery1.SQL.Text:='SELECT * FROM OpenQuery(LinkedOracle9i, '+Quotedstr(SQLParam)+');
    la requête... Sql Serveur 2008 elle marche très bien et très rapide,
    Oui, alors là, je suis plus que sceptique, je ne connais pas Oracle mais je suis sûr qu'Oracle connait à la fois les CTE et les Jointures
    AMHA il y a certainement moyen de faire plus propre, cette clause group by me paraît bien longue

    [Edit] je suis en plus sceptique en ce qui concerne la clause Order By qui aurait plus sa place en dehors de la requête sur Oracle quoique je ne vois pas la colonne Libe de la table1
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Je confirme que le WITH sur ORACLE est un bon moyen d'écrire une requête lisible mais chose surprenante, pas toujours aussi bien optimisé que des requêtes imbriquées.

    Citation Envoyé par masterdash Voir le message
    ..., surtout sur les paramètres, es possible de me donnée un exemple et si possible avec la linked serveur Oracle.
    As-tu vu avec des DBA si ton application pour avoir une connexion SQL Server et une connexion ORACLE en simultané DIRECTE, tout à fait possible avec la version Delphi adéquat ou ADO+ODAC ou SDAC+ODAC
    Sinon, tu vas devoir bosser tes connaissances sur le bridge SQL Server/ORACLE qui est un cas bien particulier, j'ai failli en faire dans l'autre sens pour qu'un PACKAGE ORACLE accède à un CUBE sur MSSQL
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2010
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 192
    Points : 71
    Points
    71
    Par défaut
    Salut et merci sergio pour la réponse, voila j'ai essayé votre solution mais ça me donne une erreur : Le Format'Select t.Employer_Num, t.Lib,' est incorrect ou incompatible avec l'argument.

    Voici le code utiliser*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    procedure TForm3.Button1Click(Sender: TObject);
    const SQLOracle = 'SELECT t.Employer_Num,  t.Lib,  b.Nom, SubStr(t.Lib, 7, 15) Lib_Nom, '+
                      'SubStr(t.Lib, 1, 6) Lib_Nom1, Sum(t.Credit) Credit FROM Table1 t, Table2 b '+
                              '  Where t.Centre = b.Centre  AND  t.Employer_Num = b.Employer_Num '+
                              ' And t.Centre = %s  And t.Date= %s  And t.Canaux= %s '+
                              ' Group By t.Employer_Num, t.Lib, b.Nom Order by SubStr(t.Lib, 1, 7), t.Employer_Num';
     
    var SQLParam : String;
         unedate : TDate;
    begin
      unedate := EncodeDate(2018,12,12);
      SQLParam:=Format(SQLOracle,[1001,FormatDateTime('yyyymmdd',unedate),quotedstr('9')]);
     
      ADOQuery1.SQL.Text:='SELECT * FROM OpenQuery(SECU, '+Quotedstr(SQLParam)+')';
    end;
    La jointure utilisée à l'intérieur de la requête c'est a cause d’oracle 9i.
    EDI : DELPHI XE8
    SQL SERVER 2008
    ORACLE 9I

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Dans les paramètres de formatage, tu passes un entier et deux chaînes.
    Mais la chaîne de formatage attend trois chaînes.

    Donc ?

    Regarde mieux le code de Sergio, ça se joue à une lettre...

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut

    La jointure utilisée à l'intérieur de la requête c'est a cause d’oracle 9i.
    fausse excuse si j'en crois la doc
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2010
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 192
    Points : 71
    Points
    71
    Par défaut
    Salut à tous le monde, merci beoucoup à SERGIOMASTER, ShaiLeTroll est Andnotor pour la solution donnait ça marche très bien pour moi.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] transformer une requete sql server en sql access
    Par facteur dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 10/05/2017, 21h52
  2. Réponses: 7
    Dernier message: 02/02/2012, 18h00
  3. [CR 8] Question pour convertir une requete SQL SERVER en Requête CR
    Par nekro65 dans le forum SAP Crystal Reports
    Réponses: 11
    Dernier message: 24/06/2010, 11h37
  4. Réponses: 0
    Dernier message: 02/04/2008, 16h17
  5. Transformer une requête sql dynamique
    Par ttttnht dans le forum Sybase
    Réponses: 5
    Dernier message: 24/07/2007, 07h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo