Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
Je suis sur un projet PB et je dois creer un datastore qui sera utilisé pour generer un fichier plat servant a la fusion word.
Ce datastore doit aller chercher des element dans une table d'info sur des personnes qui ne possede pas de primary key, le seul moyen de distinguer chaque ligne c'est en fonction de son identifiant ET son année d'inscription.
Vu qu'il y a de nombreuses personnes je créé des groupe de meme taille, et je fait un fusion par groupe.
J'ai donc dans mon datastore deux retrivals arguments que sont l'identifiant et l'année, seulement ils marchent par couple en fonction du N° de groupe.
Je voulais donc savoir quelle requete donner a mon Datastore pour avoir l'ensemble des elements voulus.
On m'a dit de passer a mon argment un tableau a 2 dimensions est ce possible ?
En gros je voulais faire un truc dans ce style mais c'est completement faux.
code du datastore.
SELECT NOM , PRENOM, ADRESSE, TEL, NUM_CARTE, COMMUNE, DATE_VALIDITE_CARTE FROM ALLOC, ... ... WHERE ... ... (ALLOC.IDF_ALLOC,ALLOC.ANNEE_DOSSIER) = SELECT LOT.IDF_ALLOC, LOT.ANNEE_DOSSIER FROM LOT WHERE IDF_LOT = :al_idf_lot
donc je cherche une facon de faire correcte si possible.
Merci d'avance pour vos reponses.
PS : Désolé si ca vous parait trivial mais je ne fait du PB que depuis 2 semaines.
Hors ligne
j'aurais fait ca pour la requete
mais apres, rien ne prouve qu'elle est bonne :
SELECT NOM , PRENOM, ADRESSE, TEL, NUM_CARTE, COMMUNE, DATE_VALIDITE_CARTE FROM ALLOC, ... ... WHERE ... ... (ALLOC.IDF_ALLOC,ALLOC.ANNEE_DOSSIER) in ( SELECT LOT.ANNEE_DOSSIER FROM LOT WHERE IDF_LOT = :al_idf_lot )
Hors ligne
garion a écrit:
...qui ne possede pas de primary key...
-> ERREUR grave. Toute table doit avoir une clef primaire. En l'occurence, il faudrait définir la clef primaire de la table Alloc comme (IDF_ALLOC, ANNEE_DOSSIER)
Pour répondre à ta question, tu dois avoir :
SELECT... FROM... WHERE ALLOC.IDF_ALLOC = ... AND ALLOC.ANNEE_DOSSIER =...
Hors ligne
un jointure , c'est mieux...
et, faute de primary key, tu crées des index
Hors ligne
Bonjour,
Peut-être ai-je mal compris ce que tu veux, mais il me semble qu'utiliser un sous-select
pourrait t'être utile:
SELECT NOM , PRENOM, ADRESSE, TEL, NUM_CARTE, COMMUNE, DATE_VALIDITE_CARTE FROM ALLOC, ( SELECT LOT.IDF_ALLOC IDF_ALLOC, LOT.ANNEE_DOSSIER ANNEE_DOSSIER FROM LOT WHERE IDF_LOT = :al_idf_lot ) TMP, ... WHERE ... ... ( ALLOC.IDF_ALLOC = TMP.IDF_ALLOC AND ALLOC.ANNEE_DOSSIER = TMP.ANNEE_DOSSIER )
PS: Merci d'utiliser les balises code = mssql pour vos exemples de scripts SQL.
Hors ligne
Une petite remarque pour Garion en particulier et pour toutes les demandes SQL en général : il est extrémement difficile, voire impossible, de construire une requete SQL sans avoir le modèle de données sous les yeux. (construit et maintenu sous Power AMC)
Hors ligne
@ pick ouic : je pense que ca devrait mieux marcher avec le in.
@shanin : Je sais tres bien qu'il faut obligatoirement une primary key sur une table mais je suis sur la maintenance d'un projet et je ne peut donc pas toucher aux tables de celui ci. Je suis obligé de m'adapté tant bien que mal.
en tout cas je vous félicite pour votre rapidité de reponse et la qualité de celles ci.
Je vous tiens au courant pour voir si ca marche avec la technique de pick ouic.
EDIT : pour la solution de pick ouic il me semble avoir vu sur un site quelle ne pouvait retourner qu'une seule ligne, est ce vrai ou pure fabulations?
Dernière modification par garion (24-04-2007 09:10:10)
Hors ligne
merci foon pour cette solution mais il me semble que ca va me renvoyer toutes les possibilité entres les couples année et idf_alloc.
Pour le modele de donnée je l'ai sous power designer mais il ne m'aide pas beaucoup pour trouver les requetes. Les tables ne sont pas tres bien faite ( pas de PK)
Hors ligne
Au niveau de ton modèle de données, y-a-t'il des indexes uniques sur les tables et, si oui,
lesquels?
Hors ligne
garion a écrit:
... mais je suis sur la maintenance d'un projet et je ne peut donc pas toucher aux tables de celui ci....
ça m'est arivé aussi : bon courage.
Heureusement qu'ils avaient un modèle
Hors ligne
tout depend du select .
si ton select ramenes plusieurs lignes... alors, le in ( ) fonctionnne.
select lot.annee_dossier from lot where idf_lot = :al_idf_lot
A+++
Hors ligne
Sur le modele de donnée il n'y a rien de renseigné, apparement d'apres ma maitresse de stage le modele a été fait en reverse engineering a partir de la base existante.
A partir de plsqldev j'ai pu trouver quelques trucs :
Pour ma table alloc j'ai un index ALLOC_PK qui a comme colonne ANNEE et IDF_ALLOC et pour ma table LOT j'ai un index PK_LOT pour les meme colonnes.
Par contre je ne suis pas un pro en SQL donc je risque d'avoir un peu de mal a suivre pour les index mais j'apprend vite.
Hors ligne
OK,
Avec PL/SQL Developer, tu peux regarder la description de tes indexes par clique droit dessus => "View".
Vu le nom des indexes, je pense que ce sont bien des clés primaires (PK = Primary Key),
mais pour en être sûr, vérifies que les indexes sont de type "Unique" (Colonne "Type" dans la description des indexes dans PL/SQL Developer)
Est-ce bien le cas?
Hors ligne
ouai c'est bon ils sont bien uniques.
Par contre je ne reviens pas avant 2 heure, donc ne te presse pas.
a tout' et merci pour votre aide.
Hors ligne
HS
De retour après une (longue) coupure réseau ()...
/Fin HS
Alors Garion, maintenant que tu as retouvé tes primary keys, ta requête avec jointure marche-t-elle?
Hors ligne