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

VB.NET Discussion :

Requette SELECT et UNION


Sujet :

VB.NET

  1. #1
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 190
    Points : 83
    Points
    83
    Par défaut Requette SELECT et UNION
    Bonjour.

    Je ne suis pas très doué en Vb.net, mais j'ai déjà réussi à executer des requettes de type SELECT simple dans mon application.

    Maintenant, je veux faire un SELECT avec des UNION.
    J'ai donc repris la même méthode, juste changé le texte de la requette, mais là, j'ai l'impression que le contenu de la requette sql pose problème (requette valide sous l'analyseur de requette de Sql/Serveur), ou alors il y a quelque chose d'autre que je n'ai pas vu.

    A l'execution, j'obtiens toujours le message super explicite : "SqlException" ! Je ne sais même pas comment récupérer plus d'informations sur le problème.

    Quelqu'un pourrait-il m'éclairer sur le problème ?

    Voici mon code :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
                sSql = sSql + "SELECT "
                sSql = sSql + "	NUM_MIA, dbo.F_TinyRefDeProduit3(dbo.TR_PRODUIT.PR_EPIC, dbo.TR_PRODUIT.PR_NUM_JCAE, dbo.TR_PRODUIT.PR_CLEF, 0, 1, 0, 0) AS CodeEquiMia "
                sSql = sSql + "            FROM "
                sSql = sSql + "	( "
                For iCpt = 0 To m_slScannes.Count - 1
                    ' Parcours de la liste des bobines Mia scannées.
                    If (iCpt = 0) Then
                        sSql = sSql + "SELECT '" + m_slScannes.Item(iCpt) + "' as NUM_MIA, " + CStr(iCpt) + " as ORDRE "
                    Else
                        sSql = sSql + "UNION SELECT '" + m_slScannes.Item(iCpt) + "', " + CStr(iCpt) + " "
                    End If
                Next
                sSql = sSql + "	) TOTO "
                sSql = sSql + "LEFT OUTER JOIN "
                sSql = sSql + "T_MIA ON (MI_NUM_MIA_K = TOTO.NUM_MIA) "
                sSql = sSql + "LEFT OUTER JOIN TR_CODE_PART ON MI_CP_CODE_PART_FK = CP_CODE_PART_K "
                sSql = sSql + "LEFT OUTER JOIN TR_PRODUIT ON CP_PR_ID_FK = PR_ID_K "
                sSql = sSql + "ORDER BY ORDRE "
     
                selectCMD = New SqlCommand(sSql, connection)
                selectCMD.CommandTimeout = 30
                daLeDataAdapter = New SqlDataAdapter
                daLeDataAdapter.SelectCommand = selectCMD
                connection.Open() ' Execution de la requette.
                dsLeDataSet = New DataSet
                Try
                    daLeDataAdapter.Fill(dsLeDataSet, "LesMia") ' Erreur ici !
                Catch ex As Exception
                    MonBeepKo()
                    MessageBox.Show(ex.Message)
                    result = -2
                    connection.Close()
                    Return result
                End Try
     
                ' Si la requette a réussi, alors chaque enregistrement du recordset retourné correspond à un scan de l'opérateur.
                For iCpt = 0 To dsLeDataSet.Tables("LesMia").Rows.Count - 1
                    dRow = dsLeDataSet.Tables("LesMia").Rows(iCpt)
                    iEmplacementEnCours = CType(m_slEmplacements.Item(iCpt), TObjetTrSimple).m_dIdK
                    sRefPdc = CType(m_slEmplacements.Item(iCpt), TObjetTrSimple).m_sDesignation
                    If (dRow.Item("CodeEquiMia") = String.Empty) Then
                        ' Bobine Mia non connue de Symtra.
                        aConstat = New TObjetTrSimple
                        aConstat.m_dIdK = 2
                        ' Structure du constat d'erreur n° 2 : 
                        ' Emplacement;NuméroMia;
                        aConstat.m_sDesignation = CStr(iEmplacementEnCours) + ";" + dRow.Item("NUM_MIA") + ";"
                        m_slConstatErreur.Add(CType(aConstat, Object))
                    Else
                        ' Bobine Mia connue de Symtra.
                        sRefReelle = dRow.Item("CodeEquiMia")
                        If (sRefPdc.ToUpper.Trim <> sRefReelle.ToUpper.Trim) Then
                            ' Mauvaise référence à l'emplacement concerné.
                            aConstat = New TObjetTrSimple
                            aConstat.m_dIdK = 1
                            ' Structure du constat d'erreur n° 1 : 
                            ' Emplacement;NuméroMia;RéférenceAttendue;RéférenceConstatée;
                            aConstat.m_sDesignation = CStr(iEmplacementEnCours) + ";" + dRow.Item("NUM_MIA") + ";"
                            aConstat.m_sDesignation = aConstat.m_sDesignation + sRefPdc + ";" + sRefReelle + ";"
                            m_slConstatErreur.Add(CType(aConstat, Object))
                        End If
                    End If
                Next
                connection.Close()
    Pour mes développements, j'utilise :
    WinX-64bits, Delphi Tokyo 10.2.2
    Merci, merci, merci... moi aussi je vous aime, c'est trop d'émotions...
    Key user des blagues nulles

  2. #2
    Membre habitué Avatar de guandal
    Profil pro
    Analyste programmeur
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Points : 168
    Points
    168
    Par défaut
    requette valide sous l'analyseur de requette de Sql/Serveur
    tu peux nous l'editer (la requete) ici STP. Merci

  3. #3
    Membre habitué Avatar de guandal
    Profil pro
    Analyste programmeur
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Points : 168
    Points
    168
    Par défaut
    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
    16
    17
    18
    19
     sSql = sSql + "SELECT "
                sSql = sSql + "	NUM_MIA, dbo.F_TinyRefDeProduit3(dbo.TR_PRODUIT.PR_EPIC, dbo.TR_PRODUIT.PR_NUM_JCAE, dbo.TR_PRODUIT.PR_CLEF, 0, 1, 0, 0) AS CodeEquiMia "
                sSql = sSql + "            FROM "
                sSql = sSql + "	( "
                For iCpt = 0 To m_slScannes.Count - 1
                    ' Parcours de la liste des bobines Mia scannées.
                    If (iCpt = 0) Then
                        sSql = sSql + "SELECT '" + m_slScannes.Item(iCpt) + "' as NUM_MIA, " + CStr(iCpt) + " as ORDRE "
                    Else
                        sSql = sSql + "UNION SELECT '" + m_slScannes.Item(iCpt) + "', " + CStr(iCpt) + " "
                    End If
                Next
                sSql = sSql + "	) TOTO "
                sSql = sSql + "LEFT OUTER JOIN "
                sSql = sSql + "T_MIA ON (MI_NUM_MIA_K = TOTO.NUM_MIA) "
                sSql = sSql + "LEFT OUTER JOIN TR_CODE_PART ON MI_CP_CODE_PART_FK = CP_CODE_PART_K "
                sSql = sSql + "LEFT OUTER JOIN TR_PRODUIT ON CP_PR_ID_FK = PR_ID_K "
                sSql = sSql + "ORDER BY ORDRE "
     MsgBox(sSql.toString)
    comme ça tu verifies l'expression de ta requete.

  4. #4
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 190
    Points : 83
    Points
    83
    Par défaut
    Voici un exemple de la requette qui peut être générée (Je l'ai remise en forme) :

    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 	
    	NUM_MIA, 
    	dbo.F_TinyRefDeProduit3(dbo.TR_PRODUIT.PR_EPIC, dbo.TR_PRODUIT.PR_NUM_JCAE, dbo.TR_PRODUIT.PR_CLEF, 0, 1, 0, 0) AS CodeEquiMia             
    FROM 	( 
    	SELECT 'F000000120654' as NUM_MIA, 0 as ORDRE 
    	UNION SELECT 'F000000468575', 1 
    	UNION SELECT 'F100000192390', 2 
    	UNION SELECT 'F000000038386', 3 
    	UNION SELECT 'F000000009824', 4 	
    	) TOTO 
    		LEFT OUTER JOIN T_MIA ON (MI_NUM_MIA_K = TOTO.NUM_MIA) 
    		LEFT OUTER JOIN TR_CODE_PART ON MI_CP_CODE_PART_FK = CP_CODE_PART_K 
    		LEFT OUTER JOIN TR_PRODUIT ON CP_PR_ID_FK = PR_ID_K 
    ORDER BY ORDRE
    Et voici ce que me retourne l'analyseur de requette, c'est à dire exactement ce que je voudrais récupérer dans mon application :

    NUM_MIA..........CodeEquiMia
    F000000120654 185789017
    F000000468575 178020947
    F100000192390
    F000000038386 187230968
    F000000009824 187177260
    Pour mes développements, j'utilise :
    WinX-64bits, Delphi Tokyo 10.2.2
    Merci, merci, merci... moi aussi je vous aime, c'est trop d'émotions...
    Key user des blagues nulles

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 80
    Points : 71
    Points
    71
    Par défaut
    c'est bien compliqué comme requête, pourquoi ne pas utiliser la clause WHERE pour avoir les 5 entrées, plutot que 5 UNION !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT 	
    	NUM_MIA, 
    	dbo.F_TinyRefDeProduit3(dbo.TR_PRODUIT.PR_EPIC, dbo.TR_PRODUIT.PR_NUM_JCAE, 
    		dbo.TR_PRODUIT.PR_CLEF, 0, 1, 0, 0) AS CodeEquiMia             
    FROM 	
    	T_MIA 
    	LEFT OUTER JOIN TR_CODE_PART ON MI_CP_CODE_PART_FK = CP_CODE_PART_K 
    		LEFT OUTER JOIN TR_PRODUIT ON CP_PR_ID_FK = PR_ID_K 
    WHERE NUM_MIA IN ( 'F000000120654' , 'F000000468575',  
    'F100000192390', 'F000000038386',  'F000000009824')
    ... et pour l'ordre, quelque chose qui devrait donner le même résultat en l'absence d'une colonne ordre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ORDER BY CASE NUM_MIA WHEN 'F000000120654' THEN 1 
    	WHEN 'F000000468575' THEN 2 
    	WHEN 'F100000192390' THEN 3 
    	WHEN 'F000000038386' THEN 4 
    	WHEN 'F000000009824' THEN 5 END ASC
    ça ne résoud p-e pas le probleme mais à mon avis ça vient de la complexité de construire la requete avec tout les traitement de caractères intermédiaires. genre oublier un espace entre 2 mots clés ou qqchose du genre...

  6. #6
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 190
    Points : 83
    Points
    83
    Par défaut
    Bonjour,

    Pour le contexte :
    Les "F..." sont des identifiants récupérés avec un lecteur code-barre. Je ne sais ni lesquels ni combiens ils seront à l'avance. Dans 90% des cas, il s'agit d'une information présente dans ma base de données (clé primaire d'une table), mais il peut aussi s'agir d'une information inconnue ou d'une erreur d'acquisition (humaine ou matérielle).
    Le but de ma requette est de me renseigner à la fois sur l'existance ou non dans ma base de ces identifiants, et si ils existent, récupérer du même coup d'autres informations (CodeEquiMia)
    L'utilisation de plusieurs Unions est donc nécessaire pour obtenir le résultat que je veux. En effet, un Where ne me retournerai que les lignes existantes dans ma table alors que je tiens à avoir dans mon recordset en retour une ligne par identifiant scanné.

    Pour le problème :
    J'ai bien pris soin de mettre des espaces entre chaque élément de la requette SQL, et mis à part les éventuelles tabulations, je ne vois pas ce qui pourrait déranger.
    Bien que je ne l'exclue pas complètement, je ne pense pas que le problème vienne des traitements de chaine de caractères... Si vous voyez comment je pourrait m'en assurer, pourquoi pas.

    et déjà merci pour votre aide
    Pour mes développements, j'utilise :
    WinX-64bits, Delphi Tokyo 10.2.2
    Merci, merci, merci... moi aussi je vous aime, c'est trop d'émotions...
    Key user des blagues nulles

  7. #7
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 190
    Points : 83
    Points
    83
    Par défaut
    Connaissez-vous un moyen d'en savoir un peu plus sur l'erreur rencontrée ?

    Je programme habituellement en Delphi où au moins, lorsque j'ai une erreur, j'ai un numéro d'erreur, voir un message qui me dit par exemple : "permission SELECT refusée sur l'objet TableMachin"... Ici, je n'ai que "SqlException"... Autant dire "rien" !


    Je ne sais pas s'il s'agit d'un timeout, d'une erreur de permissions, d'une erreur de syntaxe dans mon code vb, d'une erreur dans ma requette sql... ou que sais-je encore !


    Je tourne vraiment en rond.


    EDIT à 17h32 : J'ai trouvé ! Il s'agissait effectivement d'une erreur de permission sur la fonction F_TinyRefDeProduit3(...).
    Donc même si mon problème est maintenant résolu, si quelqu'un pouvait me dire s'il y avait un moyen qui m'aurait permi de trouver ça plus rapidement que par une expérimentation de type "est/n'est pas" ?
    Merci à tous ceux qui ont tenté de m'aider
    Pour mes développements, j'utilise :
    WinX-64bits, Delphi Tokyo 10.2.2
    Merci, merci, merci... moi aussi je vous aime, c'est trop d'émotions...
    Key user des blagues nulles

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

Discussions similaires

  1. SELECT TOP UNION et ORDER
    Par Hotfirenet dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/01/2009, 14h34
  2. requette select sur oracle 8i
    Par Mr.joker dans le forum Oracle
    Réponses: 2
    Dernier message: 05/11/2006, 09h08
  3. requette select like avec un caractere de moins
    Par firejocker dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/10/2005, 09h01
  4. [c#]Recuperer le resultat d'une requette SELECT @@IDENTITY
    Par MaxiMax dans le forum Windows Forms
    Réponses: 8
    Dernier message: 01/07/2005, 17h12
  5. Trie sur une requette SELECT
    Par Yali dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/08/2004, 09h56

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