Modifier des valeurs dans une requete SQL
Utilisateur WDF
Inscrit:
19/05/2004 12:10
De LYON
Post(s): 59
Bonjour,

J'ai besoin d'avoir en mémoire un ensemble de données, correspondant à peu d'enregistrements (en moyenne 20 à 30), mais résultant d'une requête avec des jointures complexes sur des fichiers HyperFile classique.
J'utilise ensuite cette requête avec "ConstruitTableFichier"

Devant la difficulté à faire fonctionner des jointures externes multiples avec HF, j'ai voulu procéder par étapes :

1) Je crée une requete avec les rubriques des premiers fichiers en jointures simples, ex :
sTexteSelect1 = " Select FICHIER1.RUB1 as COL1, FICHIER1.RUB2 as COL2 , ... , FICHIER2.RUB1 as COL5, 
FICHIER2.RUB2 as COL6, ... , FICHIER3.RUB1 as COL8, ... " 
2) Je rajoute des champs vides pour avoir des rubriques complémentaires (et des entêtes de colonnes dans ma table), ex :
sTexteSelect2 = " '' as COL11, '' as COL12, '' as COL13 , ... "
3) Je lance ma requete :
 sTexteFrom = " From FICHIER1, FICHIER2, FICHIER3 where FICHIER1.IDRUB = ' " + MonParam + " ' and 
FICHIER2.RUBAA =FICHIER1.RUBAA and FICHIER3.RUBBB=FICHIER2.RUBBB "

sTexteReq = sTexteSelect1 + sTexteSelect2 + sTexteFrom

SI PAS HExécuteRequêteSQL( MaRequete , hModifieFichier , sTexteReq ) ALORS
   Erreur(HErreurInfo())
SINON
   ConstruitTableFichier( MATABLE , MaRequete, taAvecIDAuto+taRemplirTable+taAvecBinaire)
FIN 
//// Jusque là, c'est OK : j'ai bien toutes mes valeurs, plus les colonnes vides à la fin de la table.

4) Pour les remplir, je lance ensuite une boucle sur cette requête :
POUR TOUT MaRequete
   SI MaRequete.COL5 = MonCritere	 ALORS	  
      nIndice est un entier = MaRequete.COL5
      HlitrecherchePremier(FICHIERXXX, IDXXX, nIndice)
      SI Htrouve(FICHIERXXX) ALORS 
         MaRequete.COL11 = FICHIERXXX.LaValeurQueJeVeux1 
         MaRequete.COL12 = FICHIERXXX.LaValeurQueJeVeux2
         MaRequete.COL13 = FICHIERXXX.LaValeurQueJeVeux3
       FIN
   FIN 
FIN
///////////////////
Et c'est ici que cela ne marche plus :
Je vois bien les valeurs des rubriques de FICHIERXXX sous le débogueur, mais elles ne s'affectent pas aux rubriques de ma requête, qui restent désespérément vides.

Où est-ce que je fais une bêtise ?
Cela fait 2 jours que je suis dessus et je n'ai rien trouvé dans l'aide.
Le seul post trouvé en correspondance avec mon problème est ici et il applique la méthode que j'ai utilisée : je ne vois pas la différence (ou alors je suis bigleuse, ce qui est possible...).

Merci d'avance à celui ou celle qui me donnera une piste (ou même un début de piste...).

Contribution le : 28/02/2006 18:46
Créer un fichier PDF de la contribution Imprimer


Modifier des valeurs dans une requete SQL
Utilisateur WDF
Inscrit:
19/05/2004 12:10
De LYON
Post(s): 59
Mais j'ai avancé un peu, pour ceux que cela intéresserait.

J'avais créé mes rubriques de requete "vides" avec '' (cote/cote).

Si je rajoute des espaces entre les cotes, les rubriques se remplissent avec autant de caractères que d'espaces. Ex avec 5 espaces :
sTexteSelect2 = " '     ' as COL11, '     ' as COL12, '     ' as COL13 , ... "

je récupère les 5 premiers caractères de mes rubriques de fichier :
  MaRequete.COL11 = FICHIERXXX.LaValeurQueJeVeux1 
  MaRequete.COL12 = FICHIERXXX.LaValeurQueJeVeux2
  MaRequete.COL13 = FICHIERXXX.LaValeurQueJeVeux3

Il semble donc que pour des rubriques de requête créées sans référence à des rubriques de fichier, il prend pour base de format la valeur saisie.

Je crois qu'il va falloir que je calcule à l'avance la taille de chacune des rubriques des fichiers à affecter à celles de la requête, mais cela ne va pas être coton, car j'en ai pas mal.

Si quelqu'un a une idée, elle sera la bienvenue.

Merci

Contribution le : 28/02/2006 21:22
Créer un fichier PDF de la contribution Imprimer


Re: Modifier des valeurs dans une requete SQL
Animateur WDF
Inscrit:
19/01/2004 13:48
De www.sigmasys.fr
Post(s): 988
Bonjour,

Vous pouvez remplacer les espaces par la fonction Repete(" ",Nombre_Espaces).
Pourquoi ne pas fixer une largeur maximale de chaine ?

Par exemple :
au lieu de :
sTexteSelect2 = " '     ' as COL11, '     ' as COL12, '     ' as COL13 , ... "


Faire :
sTexteSelect2 = " '" + repete(" ", 30) + "' as COL11, '" + repete(" ", 30) + "' as COL12, '" + repete(" ", 30) + "' as COL13 , ... "


Bon dév.,

Totof

Contribution le : 01/03/2006 09:23
_________________
[ Totof(Christophe LOGEL) réalise des développements spécifiques WinDev (Mon annonce wdforge), http://www.sigmasys.fr]
Créer un fichier PDF de la contribution Imprimer


Re: Modifier des valeurs dans une requete SQL
Stagiaire WDF
Inscrit:
04/11/2003 13:31
De Belgique
Post(s): 42
Bonjour,

Simple suggestion :

Pour une facilité de construction et de lecture, pensez au [] pour la construction de votre chaine Sql

http://old.wdforge.org/modules/smartfaq/faq.php?faqid=99

Cordialement

Albert

Contribution le : 01/03/2006 11:22
Créer un fichier PDF de la contribution Imprimer


Rafraîchir table mémoire (requete) avec rubriques calculées
Utilisateur WDF
Inscrit:
19/05/2004 12:10
De LYON
Post(s): 59
Bonjour,

Je vous remercie tous deux pour vos réponses.
J'ai réussi à contourner le problème en fixant à l'avance la taille maxi de mes colonnes par :
sChaine = " ' "+ Complète("",FICHIERXXX.RUB1..Taille) + " ' as COL_11"
et ainsi de suite, car j'ai des rubriques de tailles très variables.

Mais j'ai bien bataillé pour arriver à rafraichir la table avec ces données, car je n'arrivais pas à réaffecter dans la table les valeurs calculées.

Si cela peut aider quelqu'un dans la même situation, voici le cheminement :

Je crée une requête de toutes pièces que j'exécute par :
HExécuteRequêteSQL( MaRequete , hModifieFichier , sTexteReq )
et je crée ensuite une table mémoire (avec mes colonnes calculées "à vide") :
ConstruitTableFichier( MATABLE , MaRequete, taAvecIDAuto+taRemplirTable+taAvecBinaire)
Puis j'efface la table :
TableSupprimeTout(TABLELIENS)
Les données disparaissent, mais les colonnes créées en automatique restent en place dans la table.

Ensuite, je calcule les valeurs des colonnes vides à l'intérieur d'une boucle de parcours de la requete et je recrée les lignes de la table avec les enregistrement de la requête modifiés :
sChaine est une chaine
HLitPremier(MaRequete)
TANTQUE PAS HEnDehors()
  SI MaRequete.COL5 = MonCritere ALORS	
    nIndice est un entier = MaRequete.COL5
    HlitrecherchePremier(FICHIERXXX, IDXXX, nIndice)
    SI Htrouve(FICHIERXXX) ALORS 
       MaRequete.COL11 = FICHIERXXX.LaValeurQueJeVeux1 
       MaRequete.COL12 = FICHIERXXX.LaValeurQueJeVeux2
       MaRequete.COL13 = FICHIERXXX.LaValeurQueJeVeux3
    FIN
  FIN
  sChaine = HRécupèreEnregistrement(Marequete)
  TableAjoute(MATABLE,sChaine)
  HLitSuivant(MaRequete)
FIN

Et la table se trouve reconstituée... Ouf... Avec les bonnes valeurs... Re Ouf...

Tout cela n'était franchement pas évident à trouver dans l'aide.

Si quelqu'un à une formule plus simple, j'en veux bien, mais j'avais essayé beaucoup de choses avant sans résultat (TableAffiche, FichierVersTableMemoire, etc...)

Contribution le : 01/03/2006 20:15
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant




Enregistrer votre réponse
CompteNom   Mot de passe   Authentification
Message:


Vous ne pouvez pas débuter de nouveaux sujets.
Vous pouvez voir les sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2