PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → update d'une table oracle à partir d'un fichier hyperfile
update d'une table oracle à partir d'un fichier hyperfile
Débuté par adonaim, 09 mar. 2017 12:17 - 7 réponses
Posté le 09 mars 2017 - 12:17
bonjour la famille windev, aidez moi svp.
j'ai deux tables qui ne sont pas dans la même base de données (oracle et hyperfileSQL).
je dois verifier dans la table conges(hyperfyle) les agents dont leur flag_conge=actif et faire un update dans la table utilisateurs(oracle) mettre le flag_actif=0 pour chaque enregistrement correspondant.
voila ce que j'essaie de faire :

HLitPremier(UTILISATEURS)
TANTQUE PAS HEnDehors(UTILISATEURS)
HLitRecherchePremier(Conges,NUM_MATRICULE,UTILISATEURS.NUM_MATRICULE)
SI HTrouve(Conges) ALORS
SI Conges.Flag_Conge = 1 ALORS
HExécuteRequête(REQ_UpdateUser) //requete que jai fais pour que ca mette à jour, mais ca met toute la table à jour au lieu de le faire avec les enregistrements correspondant

FIN
HLitSuivant(UTILISATEURS)
FIN
FIN
Posté le 09 mars 2017 - 12:42
Bonjour

à mon avis, ta requête est fausse...

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

A votre disposition : WXShowroom.com, WXReplication (open source) et
maintenant WXEDM (open source)

Plus d'information sur http://fabriceharari.com


Le 3/9/2017 à 6:17 AM, adonaim a écrit :
bonjour la famille windev, aidez moi svp.
j'ai deux tables qui ne sont pas dans la même base de données (oracle et
hyperfileSQL).
je dois verifier dans la table conges(hyperfyle) les agents dont leur
flag_conge=actif et faire un update dans la table utilisateurs(oracle)
mettre le flag_actif=0 pour chaque enregistrement correspondant.
voila ce que j'essaie de faire :

HLitPremier(UTILISATEURS)
TANTQUE PAS HEnDehors(UTILISATEURS)
HLitRecherchePremier(Conges,NUM_MATRICULE,UTILISATEURS.NUM_MATRICULE)
SI HTrouve(Conges) ALORS
SI Conges.Flag_Conge = 1 ALORS
HExécuteRequête(REQ_UpdateUser) //requete que jai fais pour que ca mette
à jour, mais ca met toute la table à jour au lieu de le faire avec les
enregistrements correspondant

FIN
HLitSuivant(UTILISATEURS)
FIN
FIN
Membre enregistré
945 messages
Popularité : +102 (110 votes)
Posté le 09 mars 2017 - 12:45
Bonjour
C'est impossible de vous aider sans avoir le contenu de votre requête SQL (REQ_UpdateUser)
Avez-vous bien une close WHERE dans votre requête ?
cela devrait ressembler à : WHERE <TABLE_ORACLE.CHAMP_NUM_MATRICULE> = UTILISATEUR.NUM_MATRICULE
Membre enregistré
945 messages
Popularité : +102 (110 votes)
Posté le 09 mars 2017 - 13:03
re
je viens de lire votre message sur un autre site (avec l'image de vos 3 tables). Normalement vous devriez pouvoir remplacer tout votre code en exécutant une seule requête SQL avec HExécuteRequêteSQL()
UPDATE UTILISATEURS
SET FLAG_ACTIF = 0
WHERE Conges.NUM_MATRICULE = Agents.NUM_MATRICULE
AND Conges.Conges.Flag_Conge = 1
Posté le 09 mars 2017 - 14:59
La requête de Philippe n'est pas bonne, mais c'est une piste :
update utilisateurs u
set u.flag_actif = 0
where u.num_matricule in ( select c.num_matricule from congés c where c.flag_conges = 1 )
Posté le 09 mars 2017 - 15:02
Je me réponds à moi même ... est-ce que un update avec des tables sur Oracle, et d'autres sur HFSQL, ça marche ?
Je ne sais pas , et donc, dans le doute, on va faire très simple :

HLitPremier(UTILISATEURS)
TANTQUE PAS HEnDehors(UTILISATEURS)
HLitRecherchePremier(Conges,NUM_MATRICULE,UTILISATEURS.NUM_MATRICULE)
SI HTrouve(Conges) ALORS
SI Conges.Flag_Conge = 1 ALORS
utilisateurs.flag_actif = 0
HModifie(utilisateurs)
FIN
HLitSuivant(UTILISATEURS)
FIN
FIN
Membre enregistré
945 messages
Popularité : +102 (110 votes)
Posté le 25 mars 2017 - 08:15
Bonjour,
La première chose c'est que ma requête c'est effectivement du grand n'importe quoi ! en effet elle ne fonctionne pas

Après avoir créé un accès natif "Oracle" grâce à l'accès natif "PostgreSQL" j'ai refais les tests et je dois avouer être tombé sur un fait bizarre:

conditions du test :
Windev20
Oracle Database 11g Express Edition 11.2.0.2.0 64bit Production
PostgreSQL 9.6.1, compiled by Visual C++ build 1800, 64-bit
Foreeign Data Wrapper : oracle_fdw 9.6 64-bit
Accès natif PosgreSQL

J'ai donc un accès natif sur une table Oracle : vue_ora_users
et une table hyperfile : Conges

Si j'exécute :
updRequete est une chaîne = [
UPDATE vue_ora_users
SET flag_actif = 0
WHERE num_matricule IN (SELECT Conges.NUM_MATRICULE FROM Conges WHERE Conges.Flag_conges = 1)
]

pas d'erreur mais la table n'est pas modifiée

Si j'exécute :
updRequete est une chaîne = [
UPDATE vue_ora_users
SET flag_actif = 0
WHERE num_matricule IN ('MAT-001', 'MAT-003')
]

la table est modifiée

j'ai vérifié que :
SELECT Conges.NUM_MATRICULE FROM Conges WHERE Conges.Flag_conges = 1

renvoie bien les deux valeurs MAT-001 et MAT-003
Membre enregistré
33 messages
Popularité : +1 (1 vote)
Posté le 25 mars 2017 - 16:44
Joel,
Pour revenir à ton code original, je déplacerais le HLitSuivant(UTILISATEURS) à l'extérieur de ton SI HTROUVE(Conges). Car si aucun congés n'est trouvé pour un utilisateur, tu ne sortiras jamais de ta boucle.

HLitPremier(UTILISATEURS)
TANTQUE PAS HEnDehors(UTILISATEURS)
HLitRecherchePremier(Conges,NUM_MATRICULE,UTILISATEURS.NUM_MATRICULE)
SI HTrouve(Conges) ALORS
SI Conges.Flag_Conge = 1 ALORS
utilisateurs.flag_actif = 0
HModifie(utilisateurs)
FIN
FIN
HLitSuivant(UTILISATEURS)
FIN

--
Daniel D.